使用连接到相机的服务器来检测球和机器人的位置。当客户请求球和机器人的坐标时,由于图像的噪声,传递的坐标值在+ 2 / -2变化。无论如何要解决它,因为我想要一个绝对值,因为我会根据更改的值调用一个方法,并且如果每次运行时它会导致程序中的错误值继续变化
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('59.191.193.42',5555))
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
def activate():
new_x = 413 #updateBallx(valueList)
print new_x
new_y = 351 #updateBally(valueList)
print new_y
old_x = 309 #updateRobotx(valueList)
print old_x
old_y = 261 #updateRoboty(valueList)
print old_y
angle = 360 #updateRobota(valueList)
print angle
turn_to(brick,new_x, new_y, old_x, old_y, angle)
move_to(brick,new_x, new_y, old_x, old_y)
screenw = 0
screenh = 0
old_valueList = []
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])
if valueList != old_valueList:
activate(valueList)
old_valueList = valueList[:]
答案 0 :(得分:0)
所以重新解释一下你的问题:你有一个动态系统,你只有嘈杂的观测值,你想在使用状态信息进行进一步处理之前,从嘈杂的观测中推断出系统的真实状态?我理解你了吗?
如果我这样做,那么你想要的是某种时间过滤。您可以在服务器端或客户端上执行此操作。
最简单的方法是在多个连续帧中运行移动平均值(如果不采样等距帧,则为一些短时间窗口)。但是,只有当您进行平均的时间窗口比系统的动态(例如机器人和球的运动速度)短得多时,这才有效。如果没有,你会模糊一些实际的动作,这可能是一个坏主意。
你可以尝试的更复杂的是卡尔曼滤波器。如果你谷歌,你可以找到很多教程。 Scipy为它提供了库http://www.scipy.org/Cookbook/KalmanFiltering
更复杂的是粒子滤波器。考虑到你的简单2D问题我不建议使用它,因为它只有太多的参数来调整。