2014-02-13 138 views
1

我正在为自主机器人开发粒子滤波器,并且在生成期望的距离测量值时遇到麻烦,因此无法过滤粒子。我有一张我用作地图的图像。每个像素代表环境中的某个缩放区域。机器人占据的空间是白色的,墙壁是黑色的,环境外部的区域是灰色的。如何在图像python中测量角度距离

如果您不熟悉粒子过滤器是什么,我的python代码将创建预定数量的随机猜测,以确定它在白色空间中的位置(x,y,theta)。然后它将用多个角度的超声波传感器测量到最近的墙壁的距离。该脚本将比较这些测量结果与每个猜测位置/方向在每个角度所预期的测量结果。那些最接近实际测量值的将会存活下来,而不太可能是正确的猜测将被消除。

我的问题是在给定的角度找到最近的墙。假设传感器正在测量60°。对于每次猜测,我需要调整角度以考虑猜测的机器人方向,然后测量与该角度的墙壁距离。这是很容易找到在X方向最近的墙壁:

from PIL import Image 
#from matplotlib._png import read_png 
from matplotlib.pyplot import * 
mapp = Image.open("Map.png") 
pixels = mapp.load() 
width = mapp.size[0] 
height = mapp.size[1] 
imshow(mapp) 

pixelWidth = 5 

for x in range(width): 
    if mapp.getpixel((x, 100)) == (0,0,0,255): #Identify the first black pixel 
     distance = x*pixelWidth self.x 

的问题是,我不能告诉脚本搜索一个像素在同一时间在60°或23°打算,或任何角度。现在我能想到的最好的方法是首先在x方向上找到黑色像素,然后使用角度的正切值来确定需要向上或向下移动多少个像素,但是存在明显的问题这主要是与角落有关,我无法想象它将会采取多少措施来解决这个问题。还有其他解决方案吗?

回答

0

好的,我想我找到了一个很好的近似值,但我仍然想听听其他人是否有更好的解决方案。通过检查每个像素移动之间到目前为止我实际走过的角度的正切,我可以决定是在x方向还是y方向移动一个像素。

for i in range(len(angles)): 
    angle = self.orientation+angles[i] 
     if angle > 360: 
      angle -= 360 
     x = self.x 
     y = self.y 
     x1 = x 
     y1 = y 
     xtoy_ratio = tan(angle*math.pi/180) 
     if angle < 90: 
      xadd = 1 
      yadd = 1 
     elif 90 < angle < 180: 
      xadd = -1 
      yadd = 1 
     elif 180 < angle < 270: 
      xadd = -1 
      yadd = -1 
     else: 
      xadd = 1 
      yadd = -1 
     while mapp.getpixel(x,y) != (0,0,0,255): 
      if (y-y1)/(x-x1) < xtoy_ratio: 
       y += yadd 
      else: 
       x += xadd 
     distance = sqrt((y-y1)^2+(x-x1)^2)*pixel_width 

这种方法的准确性当然取决于每个像素代表的实际长度。只要pixel_width很小,准确性就会很好,但如果不是这样,它在修正之前通常会走得很远。

正如我所说,我欢迎其他答案。

谢谢