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)
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