多机器人路径规划(Multi-Agent Path Finding, MAPF)

多智能体路径规划

多智能体路径规划 (Multi-Agent Path Finding, MAPF) 研究多智能体的路径规划算法,为多机系统规划无冲突的最优路径.

本项目将多机路径规划算法(Multi-Agent Path Finding, MAPF)源码转换为ros实现.算法接口采用ros插件形式编写,利于扩展自己的多机规划方法.

本项目仓库:https://github.com/speedzjy/mapf_ros (如果对您有帮助的话给仓库留下一个 ⭐ 吧 🤗, 您的 ⭐ 是我前进的动力😃)

源算法库:https://github.com/whoenig/libMultiRobotPlanning

本项目已经实现的多机规划方法有:

  • Conflict-Based Search (CBS)
  • Enhanced Conflict-Based Search (ECBS)
  • Prioritized Planning using SIPP (样例代码, swap情况的判断还未实现)

Example

Conflict-Based Search (CBS)

CBS 是一族方法.算法的思想主要将多机规划分为两层底层执行带有约束的单机规划,例如用传统 A* 算法,顶层遍历底层的规划路径,解决路径之间的冲突并施加约束.CBS 算法给出 MAPF 问题的全局最优结果.

CBS算法的详细介绍可以参考笔者的CBS(Conflict-Based Search)多机器人路径规划这篇文章

在这里插入图片描述
参考文献:

Enhanced Conflict-Based Search (ECBS)

ECBS 基于 CBS, 在给定次优条件下给出比 CBS 更快的次优结果.

ECBS算法的详细介绍可以参考笔者的ECBS多机器人路径规划这篇文章

在这里插入图片描述
参考文献:

Prioritized Planning using SIPP

SIPP 算法不属于 CBS 类算法,这个算法提出了一个安全间隔(safe intervals)的概念,将时空A*(space-time A*)和CBS类多机路径规划算法的时间维度显著压缩.

实际上,SIPP 是一个考虑动态障碍物轨迹的单机规划算法. 通过将多机系统中的机器人按优先级排列,先进行规划的机器人的轨迹在后进行规划的机器人 SIPP 算法中会被当作动态障碍物轨迹来处理.

源码的作者没有写 swap 情况的处理办法,后续有空研究一下,看看能不能补全.

No swap (Success)
在这里插入图片描述
Swap (Failure)
在这里插入图片描述
参考文献:

Build

参照普通ros包编译方式:

catkin_make

Launch

建议先看看下方的 代码架构 部分, 再来看看 launch.

example launch

<launch>

  <!-- 1. 加载低分辨率地图 -->
  <arg name="map" default="mymap_low_resolution.yaml" />
  <group ns="mapf_base">
    <node name="map_server" pkg="map_server" type="map_server" args="$(find ros_package_name)/maps/$(arg map)" />
  </group>

  <!-- 2. launch mapf_base node -->
  <node pkg="mapf_base" type="mapf_base" name="mapf_base" output="screen" respawn="true">
    <rosparam file="$(find mapf_base)/params/costmap_params.yaml" command="load" ns="global_costmap" />
    <rosparam file="$(find mapf_base)/params/mapf_params.yaml" command="load" />

    <!-- 规划器名称参数; possible values: {
    mapf_planner/CBSROS, 
    mapf_planner/ECBSROS,
    mapf_planner/SIPPROS
    } -->
    <param name="mapf_planner" value="mapf_planner/SIPPROS" />
    <!-- <rosparam file="$(find mapf_base)/params/ecbs_params.yaml" command="load" /> -->
  </node>

  <!-- 3. launch goal_transformer and plan_executor -->
  <group ns="mapf_base">
    <node pkg="mapf_base" type="goal_transformer" name="goal_transformer" output="screen"> </node>
    <node pkg="mapf_base" type="plan_executor" name="plan_executor" output="screen"> </node>
  </group>

</launch>

有三个参数文件需要配置: mapf_params.yaml, costmap_params , ecbs_params.yaml(ecbs planner).

Notes:

强烈建议采用低分辨率地图用于 mapf 多机规划,高分辨率地图用于单机器人局部规划.原因如下:

  • CBS 和 ECBS 都是时空搜索算法, 如果地图维数过大,搜索非常耗时.MAPF 的最优解法是 NP-Complete 问题.
  • 由于 mapf 规划的路径是有时间步的,为了保证机器人不发生碰撞,每个时间步之间的最小距离必须大于机器人的直径。

代码架构

Nodes

1 mapf_base
1.1 节点结构

mapf_base 节点参照 ros navigation 包中 move_base 的功能,作为 mapf 算法的中央控制器,调度核心算法运行.

Notes: mapf_base节点只生成 global plan,不下发速度控制命令。 可以按照 plan 的每个 time step 发送给move_base,按照时间步执行控制命令.

在这里插入图片描述

1.2 订阅话题
  • /mapf_base/mapf_goal [mapf_msgs/Goal] mapf格式的 goal 信息,包括系统中所有机器人的目标位置
  • /tf [tf/tfMessage] 得到 map 到每个机器人的 base_link 的 tf 变换
1.3 发布话题
  • /mapf_base/parameter: plan_topic [nav_msgs/Path] | 不含时间步的 path, 在 rviz 上可视化使用
  • /mapf_base/global_plan [mapf_msgs/GlobalPlan] | 全局规划,是每个机器人的单独规划的集合,每个单独规划都包含时间步
  • /mapf_base/global_costmap/costmap [nav_msgs/OccupancyGrid] | 用于 mapf 的 costmap
1.4 节点参数
  • ~mapf_planner: (string, default: “mapf_planner/CBSROS”) | mapf规划器名称

  • ~agent_num: (int, default: 2) | 多机系统机器人数量

  • ~global_frame_id: map (string, default: map) | 地图和 /tf 的全局 frame

  • ~planner_time_tolerance: 5.0 (double, default: DBL_MAX) | mapf 算法非常耗时,设置时间阈值,超时则算法退出

  • ~goal_tolerance: 1.0 (double, default: 1.0) | mapf 算法到目标点的允差阈值,一旦机器人与目标点距离小于阈值,mapf 算法将停止规划,最好设成与用于 mapf 的地图分辨率相同

  • ~base_frame_id: (string, default: “base_link”) | 每个机器人的 base_link frame_id, example:

    • base_frame_id:
      • agent_0: rb_0/base_link
      • agent_1: rb_1/base_link
  • ~plan_topic: (string, default: “plan”) | 在 rviz 上可视化的不含时间步的 path 会发布在这个话题上, example:

    • plan_topic:
      • agent_0: rb_0/plan
      • agent_1: rb_1/plan

以下两个节点用于mapf算法的测试.你也可以编写自己的节点,只需要处理好 mapf_base 节点的输入输出.

2 goal_transformer
2.1 节点结构

goal_transformer 节点用于将每个节点的目标信息整合为 mapf 格式的目标信息发布

在这里插入图片描述

2.2 订阅话题
  • parameter: goal_topic [geometry_msgs/PoseStamped] | 订阅每个机器人的目标信息
  • /mapf_base/goal_init_flag [std_msgs/Bool] | 值如果为 true, 将接收到的每个 goal 信息整合为 mapf 格式的 goal发布
2.3 发布话题
  • /mapf_base/mapf_goal [mapf_msgs/Goal] | 发布 mapf 格式的 goal 给 mapf_base 节点处理
2.4 节点参数
  • ~goal_topic: (string, default: “rb_0/goal”) | 本节点将从这个话题接收每个机器人的 goal, example:
    • goal_topic:
      • agent_0: rb_0/goal
      • agent_1: rb_1/goal
3 plan_executor
3.1 节点结构

plan_executor 节点根据 mapf_base 生成的 plan,按照时间步顺序发送给 move_base 执行局部规划

在这里插入图片描述

3.2 订阅话题
  • /mapf_base/global_plan [mapf_msgs/GlobalPlan] | mapf_base 发布的全局规划
3.3 发布话题
  • /agent_name/move_base/goal [move_base_msgs/MoveBaseActionGoal] | 发给每个机器人的 move_base
3.4 节点参数
  • ~agent_name: (string, default: “rb_0”) | 机器人名称 (话题 “(arg agent_name)/move_base/goal” 将被发给 move_base), example:
    • agent_name:
      • agent_0: rb_0
      • agent_1: rb_1
4 全局节点结构

在这里插入图片描述

ROS 插件结构

在这里插入图片描述

  • 33
    点赞
  • 151
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 23
    评论
### 回答1: 基于Dijkstra算法自动驾驶汽车路径规划的参考文献相对较多,以下列举了其中几篇: 1. 贺道辉, 周国亮, 于树青, & 纪其伟. (2018). 基于Dijkstra 算法的最佳路径规划及仿真研究. 计算机技术与发展, 28(2), 185-188. 这篇论文介绍了基于Dijkstra算法的最佳路径规划的基本原理,重点讨论了在自动驾驶汽车中应用该算法进行路径规划的可行性,并通过仿真研究验证了算法的有效性。 2. 郭宇明, 唐炎辉, & 雷林. (2019). 基于Dijkstra算法自动驾驶汽车路径规划研究. 智能计算机与应用, (9), 237-239. 这篇论文探讨了基于Dijkstra算法自动驾驶汽车路径规划,在考虑到实时交通情况和车辆行驶特性的基础上,提出了一种改进的Dijkstra算法,以提高路径规划的效率。 3. 王伟峰, 龙腾飞, & 黄翔. (2019). 基于改进Dijkstra算法自动驾驶路径规划. 机械与电子, (24), 66. 这篇论文在基于Dijkstra算法的路径规划的基础上,针对自动驾驶汽车路径规划中存在的问题,提出了一种改进的Dijkstra算法。通过引入权重和约束条件,优化路径规划结果,并提高了规划速度。 4. 张敏, 张长宁, & 彭云. (2017). 基于Dijkstra算法自动驾驶路径规划研究. 机械设计与制造, (10), 27-28. 这篇论文研究了基于Dijkstra算法自动驾驶路径规划,通过对路网进行建模,并利用Dijkstra算法寻找最短路径,实现了自动驾驶汽车的高效路径规划。 以上是其中几篇关于基于Dijkstra算法自动驾驶汽车路径规划的参考文献。这些研究为自动驾驶汽车的路径规划提供了理论支持和实践指导,为实现安全、高效的自动驾驶出行做出了贡献。 ### 回答2: Dijkstra算法是一种用于在加权中寻找最短路径的经典算法。它的应用非常广泛,其中之一就是自动驾驶汽车路径规划。 在自动驾驶汽车路径规划中,Dijkstra算法可以用于确定汽车从起点到终点的最短路径。该算法基于的搜索和权重计算,通过不断更新节点之间的最短距离和路径来找到最佳路径。 有许多文献可以作为基于Dijkstra算法自动驾驶汽车路径规划的参考。以下是其中一些重要的文献: 1. Dijkstra, E.W. (1959). A note on two problems in connection with graphs. In Numerische Mathematik (pp. 269–271). Springer Berlin Heidelberg. 这是Dijkstra算法最初提出的经典文献之一,介绍了该算法的基本原理和应用。 2. Celebi, M.E., Alhajj, R. (2008). An efficient algorithm for finding the shortest path in transportation networks. Journal of Advanced Transportation, 42(4), 411-430. 这篇文章介绍了一种高效的改进Dijkstra算法,特别适用于自动驾驶汽车路径规划中的大规模交通网络。 3. Han, Z., Tang, T., Bai, X., Chen, Y., Huang, H., & Deng, Z. (2017). A Modified Dijkstra Algorithm for Shortest Path Computation in Large-Scale Networks. IEEE Transactions on Intelligent Transportation Systems, 18(5), 1124-1134. 该文献提出了一种改进的Dijkstra算法,以应对自动驾驶汽车路径规划中的大规模网络。 4. Bhatia, M., & Jain, R. (2018). Improved Dijkstra Algorithm for Vehicle Navigation Systems. International Journal of Scientific Research in Computer Science, Engineering, and Information Technology, 4(1), 115-120. 这篇文章提出了一种改进的Dijkstra算法,以加速自动驾驶汽车的导航系统。 以上是一些基于Dijkstra算法自动驾驶汽车路径规划的参考文献,它们对于理解和应用该算法于车辆路径规划具有重要意义。 ### 回答3: 基于Dijkstra算法自动驾驶汽车路径规划在近年来得到了广泛的研究和应用。下面是几篇相关的参考文献。 1. “A Dijkstra-based Approach for Path Planning of Self-driving Cars” - 这篇文献提出了一种基于Dijkstra算法自动驾驶汽车路径规划方法。作者通过改进Dijkstra算法,将交通状态和车辆动态考虑进去,并利用实时的交通数据来更新路径规划,以确保行驶的安全和效率。 2. “Improved Dijkstra Algorithm for Autonomous Vehicle Path Planning” - 这篇文献在Dijkstra算法的基础上进行了改进,以适应自动驾驶汽车路径规划的需要。作者提出了一种优化的数据结构和算法,通过减少计算时间和空间复杂度,提高了路径规划的效率和准确性。 3. “Dijkstra-based Path Planning for Autonomous Vehicles in Dynamic Environments” - 这篇文献针对自动驾驶汽车在动态环境中的路径规划问题,提出了一种基于Dijkstra算法的解决方案。作者通过引入时空扩展和权重函数,使得路径规划可以考虑交通状况和车辆运动的变化,从而实现安全和高效的驾驶。 4. “Traffic-aware Dijkstra Algorithm for Real-time Path Planning of Autonomous Vehicles” - 这篇文献中,作者提出了一种针对实时的自动驾驶汽车路径规划问题的Dijkstra算法版本。通过分析交通流量和路况信息,设计了一种基于交通感知的加权函数,使路径规划更加适应实际道路情况,并提高了系统的响应速度和准确性。 这些参考文献提供了关于基于Dijkstra算法自动驾驶汽车路径规划的理论基础和实际应用方法。研究者们通过改进算法和引入新的因素,不断提高路径规划的效率和安全性,使得自动驾驶技术在道路上更有吸引力和可行性。
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zjyspeed

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值