Как обновить положение робота и объекта, не повторяя его значения

Я хотел бы знать, как я могу решить проблемы многократной передачи значений моему методу активации (valueList). Программа работает таким образом, что есть робот и мяч, а основной цикл непрерывно передает метод списка значений. Моя цель - повернуть робота в направлении мяча и двигаться к нему. Проблема в том, что, скажем, если мяч все еще движется, значения остаются неизменными до тех пор, пока он не остановится, что заставит робота повернуться на угол, который был ранее прошло вниз. Есть ли какой-то особый способ обойти это? Обратите внимание, что значения в списке значений, которые передаются вниз, различаются между +2 и -2, даже если робот и мяч находятся в стационарном состоянии. PS. я использую lego nxt (nxt-python), который подключен по сети к камере, которая передает значения

Например:

Методы, возвращающие значения:

def updateBallx(valueList):
# updates red ball x-axis position
ballx = int(valueList[8])
return ballx

def updateBally(valueList):
    # updates red ball y-axis position
    bally = int(valueList[9])
    return bally

def updateRobotx(valueList):
    # updates robot x-axis position
    robotx = int(valueList[12])
    return robotx

def updateRoboty(valueList):
    # updates robot x-axis position
    roboty = int(valueList[13])
    return roboty

def updateRobota(valueList):
    # updates robot angle position
    robota = int(valueList[14])
    return robota

Метод активации: метод turn_to и move_to показывает поворот и движение к объекту.

def activate():

new_x = updateBallx(valueList)
print 'Ball x',new_x
new_y = updateBally(valueList)
print 'Ball y',new_y
old_x = updateRobotx(valueList)
print 'Robot x',old_x 
old_y = updateRoboty(valueList)
print 'Robot y',old_y
angle = updateRobota(valueList)
print 'Robot angle',angle

turn_to(brick,new_x, new_y, old_x, old_y, angle)
#time.sleep(2)
#move_to(brick,new_x, new_y, old_x, old_y)
#time.sleep(3)
#kickBall(brick,new_y, old_y)
#time.sleep(3)

и этот основной цикл, который продолжает передавать значения в список значений

screenw = 0
screenh = 0
while 1:
    client_socket.send("loc\n")
    data = client_socket.recv(8192)
    valueList = data.split()

    if (not(valueList[-1] == "eom" and valueList[0] == "start")):
        #print "continuing.."
            continue

        if(screenw != int(valueList[2])):
            screenw = int(valueList[2])
            screenh = int(valueList[3])

    activate(valueList)

person Edward    schedule 26.09.2012    source источник
comment
Камера действительно должна давать непрерывную обратную связь по положению. (Например, наша система слежения за глазами будет фиксировать положение глаз с частотой 500 Гц). А роботу нужно предвидеть движение цели и прокладывать курс перехвата :)   -  person swang    schedule 26.09.2012


Ответы (1)


Так что это звучит так, как будто вы пытаетесь двигаться только на переменах. В этом случае вы можете просто сохранить предыдущие значения и сравнить их. Затем вызывайте activate() только при обнаружении изменения.

last_valueList = []
while True:
    client_socket.send("loc\n")
    data = client_socket.recv(8192)
    valueList = data.split()

    if (not(valueList[-1] == "eom" and valueList[0] == "start")):
        #print "continuing.."
            continue

        if(screenw != int(valueList[2])):
            screenw = int(valueList[2])
            screenh = int(valueList[3])
    if valueList != last_valueList
        activate(valueList)
    last_valueList = valueList[:] # copy list
person monkut    schedule 26.09.2012
comment
что, если передаваемые значения изменяются между +2 или -2, даже если объект находится в стационарном состоянии из-за обнаружения объекта с помощью используемой камеры - person Edward; 26.09.2012
comment
Я не знаком с интерфейсом nxt. Почему вы получили разницу +2/-2? - person monkut; 26.09.2012
comment
ааа может это проблема с камерой. не беспокойтесь об этом. Спасибо, в любом случае (: - person Edward; 26.09.2012
comment
я обнаружил, что разница +2/-2 связана с шумом камеры во время захвата изображения. означает ли это, что мне нужно усреднить значение списка, прежде чем я смогу их использовать? как бы я это сделал? - person Edward; 26.09.2012