一种增加时间维的搜索算法来处理动态障碍物。

space-time-astar的Python项目详细描述


时空A*

一种处理动态障碍物的时空A*(STA*)搜索算法。在

安装

包名为space-time-astar,列在PyPI上。您可以使用pip安装:

pip3 install space-time-astar

{{a2}你可能对这个包{a2}感兴趣,在这个包^-a2}上使用多个代理。在

使用

导入计划器

^{pr2}$

构造函数参数

Planner(grid_size:int,robot_radius:int,static_obstacles:List[Tuple[int,int]])
  • grid_size:int-每个网格都是边长为grid_size的正方形。在
  • robot_radius:int-代理被假定为半径为robot\uradius。在
  • static_障碍物:List[Tuple[int,int]]—指定地图中静态障碍物的坐标列表。在

重要的是grid\'u size不要太小,static_障碍不包含太多坐标,否则性能将严重恶化。你可能会问什么是“太多”?这取决于你的要求。在

查找路径

使用Plannerplan()方法:

plan(start: Tuple[int, int],
     goal: Tuple[int, int],
     dynamic_obstacles: Dict[int, Set[Tuple[int, int]]],
     semi_dynamic_obstacles:Dict[int, Set[Tuple[int, int]]] = dict(),
     max_iter:int = 500,
     debug:bool = False) -> np.ndarray:

参数:

  • start:Tuple[int,int]-起始坐标。在
  • goal:元组[int,int]-目标坐标。在
  • dynamic_障碍物:Dict[int,Set[Tuple[int,int]]]-动态障碍物实际上是时空中的其他代理保留,详细信息如下。在
  • 半动态障碍物:Dict[int,Set[Tuple[int,int]]],optional——这个参数的存在是因为我们必须考虑到已经到达目的地的代理,它们本质上是特定时间的静态障碍。在
  • max}iter:int,可选-搜索的最大迭代次数。默认为500。在
  • debug:bool,可选-打印一些调试消息。默认为False。在

dynamic_barriends的键是表示时间的整数,值是坐标集。它告诉计划者我们在每个时间步需要避免什么样的坐标。目前,假设动态障碍物是其他智能体(具有相同的robot_半径),并且与静态障碍物的处理方式不同。在

返回:

一个numpy.ndaarray,形状(L, 2),其中L是路径的长度。在

理论背景

Here是大卫·西尔弗(davidsilver)写的一篇关于时空a*(STA*)的好文件。在

简言之,STA*是普通的a*加上时间维度。参见下图。在

在左边的块中,第一个代理规划它的路径并保留它的路径穿越时间(与第二个代理无关)。在

在右边的块上,第二个代理计划其路径,同时避免第一个代理保留的路径(即dynamic_bulleries参数)。在

space-time-astar

中的实现决策
  • 曼哈顿距离(Manhattan distance)是一种可接受的、一致的启发式算法,在这个实现中被使用。您可以通过更改planner.py中的h()函数来更改它。在

  • 代理可以比网格大。在

  • 假设动态障碍物是相同大小的其他因素。这可以在plan()中的safe_dynamic()内部函数中更改。在

贡献

欢迎拉取请求。对于重大变化,请先打开一个问题,讨论您希望更改的内容。在

许可证

MIT

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
空字符串检查在java中未按预期工作   JavaSpringWebClient:自动计算主体的HMAC签名并将其作为头传递   foreach是否有一个Java等效的foreach循环和一个引用变量?   java如何在Eclipse中导入jar   使用特定第三方或java时lombok触发错误。*方法或构造函数   安卓 java将对象数组转换为int数组   java使一定百分比的JUnit测试通过   java Android:将Seekbar的一个值与另一个值进行比较   java将int数组(图像数据)写入文件的最佳方式是什么   java取代了系统。yml的构造函数内的getProperty   sqlite Java将公钥和私钥转换为字符串,然后再转换回字符串   安卓获取白色像素并将其保存到java opencv中的数组中   java为什么是ServerSocket。setSocketFactory静态?   Java数组似乎在不直接修改的情况下更改值