我正在研究一种用于自动机器人的粒子滤波器,并且无法产生用于过滤粒子的预期距离测量值。我有一张我用作地图的图片。每个像素代表环境中的某个缩放区域。机器人可以占据的空间是白色,墙壁是黑色的,环境外部的区域是灰色的。
如果您不熟悉粒子滤波器的内容,我的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方向,找到一个黑色像素,然后使用角度的正切来确定我需要向上或向下移动多少像素,但是有明显的问题这一点,主要与角落有关,我无法想象它将采取多少if语句来解决它。还有其他解决方案吗?
答案 0 :(得分: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很小,准确性就会很好,但如果没有,它通常会在纠正之前走得很远。
正如我所说,我欢迎其他答案。
由于