Question

I would like to know how could i solve the issues of values being repeatedly passed down to my activate(valueList) method.The program works in a way that there's a robot and a ball and the main loop passed the values list method continuously. My goal is to turn the robot the the direction of the ball and move toward it.The problem is that let's say if the ball is still moving the values stays the same until it stops which cause the robot to turn to the angle that is previously passed down. Is there a specific way to go around this? Take note that the values in the valueList that are passed down differentiate between +2 or -2 even if the robot and ball are in stationary. PS. i am using lego nxt (nxt-python) that is connected over a network to a camera that pass down the values

For example:

Methods that returns the values:

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

An activate method: Ps the turn_to and move_to method shows the turning and moving toward the object

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)

and this main loop that keep on passing values to the valueList

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)
Was it helpful?

Solution

So it sounds like your trying to only move on change. In that case, you might just want to hold the previous values and compare. Then, only call activate() when a change is detected.

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
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top