我正在研究模拟机器人程序(使用莫尔斯机器人模拟器),该程序涉及控制机器人在房间内(使用口语)与各种盒子,其他物体和其他机器人一起移动。我想机器人: 1.避开障碍物(箱子,其他机器人) 2.找到最短路径
目前,我忽略了动态障碍的问题,例如其他机器人不断改变位置,但最终肯定会发挥作用。
我知道A *搜索和Dijkstra的算法,并且过去已经实现了类似的图搜索算法;但是,这些程序涉及图形/网格搜索。目前,机器人的世界模型由世界范围内的对象字典表示,而不是基于图块的网格,其指示某些图块是否被填充。 E.g:
{Box = {position:(3,4)...},Robot = {position:(0,0)...}}
如果有必要,我可以完成将世界模型更改为网格/图形表示的过程,但在我看来,这似乎不是必需的。对于最短路径,莫尔斯模拟器将把“乌鸦的距离”从A点移动到B点 - 直接穿过任何障碍物。
因此,我想添加的是一个控制功能,用于检查机器人与其目的地之间的当前路径中是否有任何障碍物,如果是,则建议另一种N部分路线。
到目前为止,我在Python中实现的只是检查一个对象是否落在A点和B点之间的斜率范围内:
def check_for_obstacles(origin, destination):
slope = get_slope(origin, destination)
obstacles = []
initialX = origin[0]
for obj in world:
worldObj = getattr(world, obj)
pos = [worldObj.pos.x, worldObj.pos.y]
yInt = slope * pos[0] + origin[1]
diff = abs(pos[1] - yInt)
if diff < 2: # Hard-coded footprint of object, for now
obstacles.append(obj)
return obstacles
在一些测试案例中,这似乎有效。据推测,一旦我得到路径中的障碍列表,我会找到一条新路径的三角测量,然后在我走的时候不断检查障碍物。这看起来像是一个合理的解决方案,还是我忽视了一些明显的东西?