python - 如何更新机器人和物体的位置而不重复它的值

标签 python lego-mindstorms nxt

我想知道如何解决值被重复传递到 activate(valueList) 方法的问题。该程序的工作方式是有一个机器人和一个球,主循环传递值列表方法不断地。我的目标是将机器人转向球的方向并向球移动。问题是,假设球仍在移动,则值保持不变,直到它停止,这会导致机器人转向之前的角度传承下来。有没有具体的方法来解决这个问题?请注意,即使机器人和球处于静止状态,向下传递的 valueList 中的值也会区分 +2 或 -2。附言。我正在使用乐高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

激活方法: ps 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)

这个主循环不断将值传递给 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)

最佳答案

所以听起来你只是想继续改变。在这种情况下,您可能只想保留以前的值并进行比较。然后,仅在检测到更改时调用 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

关于python - 如何更新机器人和物体的位置而不重复它的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12594312/

相关文章:

Python调试,在特定输出处停止

python - Lego Mindstorm 是否有任何 Ruby 或 Python 解释器?

objective-c - Lego Mindstorm NXT、Cocoa 和 HiTechnic 传感器

c - NXT-G可视化编程与乐高积木NXC类C编程的区别

python - 用于对抗 "Not Responding"阻塞的多处理 GUI 模式

python - 为什么我的服务的其他部分不能轻松使用 tastypie?我在 tastypie 资源和我的核心服务中有重复的代码

结合陀螺仪和加速度计数据

python - 如何在 python Flask 中为日志文件创建配置文件

Lego Mindstorm NXT 的 C# 库