Подписка и отмена подписки на ALVideoDevice в Python Script Box в Choregraphe не работает - PullRequest
0 голосов
/ 13 июня 2018

Мы некоторые студенты в области ИТ, и мы работаем над NAO (поэтому мы очень новички).Мы хотим реализовать поиск путём обнаружения линий на земле с помощью камер NAO.С этой целью мы работали над Python Script Box в Choregraphe, но мы не можем правильно подписывать и отписываться на " ALVideoDevice "

Вот кодокно скрипта Python:

import sys
import numpy as np
import cv2
from naoqi import ALProxy
import PIL
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
import vision_definitions as vd

def avg_lines_angles(lines):
    angle_sum = 0
    for line in lines:
        angle_sum = angle_sum + get_angle(line[0])
    return angle_sum/len(lines)

def get_angle(tupl):
    x1,y1,x2,y2 = tupl
    dy = (y2-y1)
    dx = (x2-x1)
    angle = np.arctan2(dy,dx)
    if angle < 0:
        angle = angle + np.pi
    return angle

class MyClass(GeneratedClass):
    def __init__(self):
        GeneratedClass.__init__(self)

    def onLoad(self):
        self.nameID = "test_subscribe"
        self.videoDevice = ALProxy('ALVideoDevice')
        self.captureDevice = self.videoDevice.subscribe(self.nameID, vd.k4VGA, vd.kRGBColorSpace, 20)

    def onUnload(self):
        #put clean-up code here
        self.videoDevice.unsubscribe(self.nameID)

    def onInput_onStart(self):
        index = None
        # get image
        result = self.videoDevice.getImageRemote(self.captureDevice);
        if result == None:
            print 'cannot capture.'
            #self.onUnload()
            self.onError()
        # show image
        else:
            basewidth = 600
            img = Image.fromstring("RGB",(result[0],result[1]),result[6])
            self.videoDevice.releaseImage(self.nameID)
            img = img.crop((img.size[0]/4,3*img.size[1]/5,3*img.size[0]/4,img.size[1]))
            wpercent = (basewidth/float(img.size[0]))
            hsize = int((float(img.size[1])*float(wpercent)))
            img = img.resize((basewidth,hsize), Image.ANTIALIAS)
            gray = img.convert("L")
            gray = np.array(gray)
            edges = cv2.Canny(gray,50,150,apertureSize = 3)
            cv2.imwrite("/home/nao/Pictures/debug.jpg",edges)
            lines = cv2.HoughLinesP(edges,1,np.pi/180,60,minLineLength=50,maxLineGap=30)
            try:
                angle = avg_lines_angles(lines)
                self.onStopped(angle)
            except:
                self.onError()
            #self.onUnload()


    def onInput_onStop(self):
        #self.onUnload() #it is recommended to reuse the clean-up as the box is stopped
        self.onStopped(-1) #activate the output of the box

Мы подписываемся на сервис по загрузке класса и отписываемся, когда класс выгружается.Что действительно странно, так это ошибка при отказе от подписки:

[ERROR] vision.videodevice :unsubscribe:0 Can't unsubscribe "test_subscribe", subscriber is unknown.

Наш ящик находится в цикле, количество подписчиков ограничивает то, что мы можем сделать.Мы можем получить изображения от ALVideoDevice, поэтому мы подписаны.Но использование того же имени для отписки не работает вообще.Мы не нашли ничего в Python SDK API, только некоторые учебники, которые точно описывают то, что мы делаем (Подписаться -> Код, который использует ALVideoDevice -> Отписаться)

1 Ответ

0 голосов
/ 13 июня 2018

Ваша проблема в том, что вы отказываетесь от подписки, используя имя подписчика, в то время как вы должны отписаться от подписки, используя дескриптор, который выдается при подписке - так что в вашем случае вы должны делать

self.videoDevice.unsubscribe(self.captureDevice)
...