尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

多机器人未知环境目标搜索与潜在最优导航实现解析

多机器人未知环境目标搜索与潜在最优导航实现解析 当多个机器人被投放到一栋从未建过图的建筑里任务是在未知环境中搜索指定目标并把机器人引导到目标附近这时你会发现真正难的并不是“路径规划”。路径规划的前提是有一张地图而未知环境里根本没有地图。真正难的是四件事如何在探索中不断更新地图如何决定下一个搜索点去哪里多个机器人如何分工不重复占坑以及目标点一旦确认导航算法能否在计算力有限的前提下快速给出近似最优的可行路径。近两年多机器人协同搜索在救灾搜救、仓库盘点、安防巡检、农业巡检和空间探索等场景里被反复提起。很多人会误以为“多机器人把单机算法复制好几份”实际落地时却会发现地图怎么合并、通信断了怎么办、避碰和任务分配冲突怎么处理、全局最优和实时性如何权衡每一个问题都比单机版本棘手得多。这篇文章想围绕一个关键技术主线展开多机器人在未知环境下的目标搜索以及如何把“目标已找到”转化成“潜在最优导航任务”并可靠执行。这篇文章面向的读者是正在做机器人导航、多智能体系统、SLAM 或路径规划相关项目的工程师和研究生。读完你会得到一套完整的思考框架一个能够直接运行的 Python 最小实现一个 ROS 2 场景下的目标发布节点示例以及我从工程实践中总结的常见坑和排查顺序。内容会尽量少说空话多给判断和可以跑起来的代码。1. 这篇文章真正要解决的问题先给结论未知环境中的多机器人目标搜索本质上是一个“信息收集”问题而目标确认之后的导航才是一个“路径优化”问题。两者必须放在同一个系统里考虑不能拆成两个独立的模块。在单机器人场景里流程通常是建图 - 规划 - 导航。多机器人场景里每个机器人都在用自己的传感器感知局部环境然后试图拼出一个共享的环境模型。这个过程中存在几个绕不开的矛盾搜索效率与地图精度的矛盾。机器人跑得越快、探索范围越大地图更新频率和精度就可能下降。全局最优与实时计算的矛盾。环境未知地图一直在变所谓“最优路径”只能是一个随时间更新的近似解。自主性与安全性的矛盾。机器人越自主决策越快但碰撞和卡死的风险也越高。我来举一个非常具体的场景假设有三台轮式机器人进入一个仓库仓库里有货物堆、通道、门和停放的托盘目标是找到某个特定标签的箱子。三台机器人同时开始搜索它们各自发回激光数据和相机图像。很快机器人 A 找到了疑似目标但它离目标还有一段距离中间有货物堆挡路。这时系统要做两件事一是把“疑似目标位置”广播给其他机器人二是对机器人 A 下达一条“尽快到达目标点但不要撞车”的指令。问题来了谁来决定这条路径地图上还有未知区域机器人 A 应不应该先绕开未知区域选择一条信息完备但更长的路还是先冲进未知区域期望走捷径这种权衡就是多机器人目标搜索与导航问题的核心。这里没有一个永远正确的答案只能根据环境状态、任务优先级和计算预算设计一个合理的决策机制。文章后续讲的“潜在最优导航”就是在这个背景下展开的。2. 核心概念地图、搜索策略与潜在最优导航在深入实操前先把几个关键概念讲清楚。它们之间不是并列关系而是层层依赖的关系。2.1 未知环境如何表示机器人无法直接理解“世界”它需要先把传感器数据转换成一种便于规划任务使用的模型。最常见的表示方法是占据栅格地图Occupancy Grid Map把空间划分成均匀的小格子每个格子记录三种状态占据、空闲、未知。搜索任务开始后地图会随着机器人运动不断更新这本质上是一个增量式的感知与制图过程。占据栅格地图的优点是实现简单、合并方便。缺点是当区域很大时格子数量会爆炸且均匀网格对计算资源不友好。因此也有团队改用拓扑地图或基于语义的区域图把房间、走廊、门等区域抽象成节点和边。对于初学者从占据栅格开始学习是最稳妥的。2.2 目标搜索策略不是简单撞运气目标搜索有几种典型策略。全覆盖搜索Coverage Search机器人按规划路径遍历整个区域适合目标位置完全未知、区域面积较小的场景。前沿探索Frontier-based Exploration机器人寻找地图中“已知区域”与“未知区域”的边界frontier优先去边界处探索。这是目前最经典的策略搜索效率比全覆盖高很多。信息增益最大化Information Gain Maximization每个候选点不仅考虑路程远近还要估算“到达该点后能获得多少新信息”。这个策略更接近理论最优但计算量更大。多机器人场景下任务分配还需要考虑重复覆盖的问题。几个机器人同时冲向同一个前沿点只会浪费时间。比较工程化的做法是给每个前沿点打一个得分综合考虑距离、信息增益、风险然后做一次分配assignment让总成本最小。2.3 潜在最优导航关键是谁来做最优决策“潜在最优导航”这个词在不同论文里有不同含义。这里我给出一个适合工程落地的解读在信息不完备、地图动态更新的前提下导航系统无法保证全局数学最优但可以通过优化目标函数在每一轮决策周期里找出一条“当前已知信息下的近似最优路径”。换句话说这个“最优”不是数学意义上的全局最优而是“潜在”的最优。它包含两层结构全局层面当一个目标点被确认后先基于当前地图计算一条全局路径比如使用 A* 或 RRT 系列算法。局部层面跟踪全局路径时再叠加局部避障比如动态窗口法DWA或人工势场法APF。这里的难点在于全局地图每更新一次之前计算的全局路径就可能失效。因此系统需要设计成“周期性重规划”而不是一次性算完。用什么频率重规划、覆盖多大范围的重规划这本身就是一个需要反复调参的工程问题。2.4 多机器人协同地图共享与任务分配多机器人协同至少包含三个层级。底层是通信层负责机器人之间以及机器人与中心节点之间的状态同步。中间是地图与信息融合层负责把每个机器人的局部地图合并到全局地图并做冲突处理。上层是任务分配层决定哪个机器人去哪个搜索点或目标点。传统方案是集中式协调中心节点收集所有信息后统一分配。好处是容易得到全局较优解坏处是中心节点挂了全盘瘫痪。分布式方案更健壮但一致性和冲突消解更难。实际系统里很多项目会采用“分布式感知 集中式/半集中式决策”的混合架构。2.5 核心概念对比表概念解决什么问题常见方法典型风险环境建模把传感器数据变成可规划的地图占据栅格、TSDF、拓扑地图地图漂移与坐标系不一致目标搜索在未知区域找到目标位置前沿探索、全覆盖搜索、信息增益重复探索计算量过大潜在最优导航目标已知后生成本轮近似最优路径A*、RRT、DWA、APF未知区域导致路径失效多机协同分配任务、避免冲突、合并地图任务分配算法、分布式地图融合通信延迟、死锁3. 系统架构从传感器到执行器的数据流在设计一个多机器人搜索导航系统时我建议先按数据流方向把架构理清楚而不是一上来就写代码。下面是一个比较通用的分层架构。感知层负责接收激光雷达、深度相机、里程计、IMU 等传感器数据。感知层输出的结果是当前机器人的局部位姿和局部环境信息比如此刻我在哪、我周围哪些是障碍物、哪些区域还没有被观测过。建图与定位层解决“全局坐标统一”的问题。每个机器人都有自己的局部位姿如果不做全局坐标对齐后面的地图合并就是一句空话。这一步通常使用 SLAM 算法比如 cartographer、ORB-SLAM、LIO-SAM 等但在多机器人场景里还要额外处理多个机器人的轨迹图合并。决策层负责回答两个问题下一步去哪里搜索目标被确认后优先去哪个目标决策层需要读取全局地图、各机器人模型库和任务清单输出一系列“期望目标点”。规划控制层负责把决策层的目标点变成机器人实际能执行的角速度与线速度指令。它包含全局规划器、局部规划器和底层控制器。这一步就是前文所说的导航执行层。执行层就是机器人底盘和电机驱动。理想情况下规划控制层输出的是速度指令执行层只需要响应指令不需要处理复杂决策。这五层之间是典型的上下游关系感知层的输出质量直接限制决策层的信息充分度决策层分配的路线决定规划控制层需要处理避障难度。真正做系统集成时常见的错误是孤立地调某一个模块。比如只调局部避障模块却忘了地图更新频率慢导致局部规划器面对一张过时的地图做出了错误判断。4. 环境准备与前置条件接下来进入可落地部分。即使你的目标是最终在真机上跑我也强烈建议先在仿真环境里验证整个搜索导航流程。下面是环境准备的最小清单。Python 3用于快速原型验证和算法演练。后文的示例代码依赖numpy和matplotlib安装命令为pip install numpy matplotlib。ROS 2用于构建真实机器人软件系统版本请以实际环境为准。如果你只有一台普通电脑建议先跑模拟器而不是直接接硬件。仿真器Gazebo、Stage、Webots 等都是比较常见的选择。仿真器的作用是提供传感器数据和物理碰撞反馈让你不需要真实机器人也能验证代码逻辑。RVIZ2ROS 2 的可视化工具可以显示地图、机器人位置、目标点和规划路径。它是调试时最重要的工具之一。硬件方面一个能跑 Ubuntu 和 ROS 2 的主机是基础如果想做真机实验还需要搭配激光雷达、或深度相机等传感器。这里我不建议初学者一上来就买昂贵的硬件先用仿真把系统跑通比在真机上反复调试节省大量时间。如果你的环境里还没有 ROS 2先安装一个普通桌面版本即可。后续步骤里我们需要用到geometry_msgs消息类型和rclpy客户端库这两个都属于 ROS 2 的基础依赖。如果是在仿真环境里直接在终端启动模拟器再启动你的机器人节点即可。5. 核心流程拆解从地图到执行这一节把多机器人未知环境目标搜索与潜在最优导航的实现流程拆成五个步骤。每个步骤我都会说明目的、关键逻辑和容易犯的错误。5.1 第一步建立并维护全局地图多机器人系统启动后首先要做的事是坐标对齐。除非所有机器人都在同一个已知起始点否则每个机器人的局部坐标系可能不同。常见做法是让机器人先在起点附近做短距离探索使用轮式里程计或视觉里程计建立轨迹再通过特征匹配将多个局部地图合并到同一个全局坐标系。地图更新需要一个统一的数据结构。在基于占据栅格的实现中你可以维护一个OccupancyGrid每个格子有三个状态unknown、free、occupied。机器人每收到一次 sensor scan就更新这些格子状态。这个环节最常见的错误是地图坐标系没有对齐导致多个机器人的地图叠加后出现重影。因此在工程上我会专门把“坐标系管理”优先级提到最高。5.2 第二步选择目标搜索策略地图建立之后系统需要决定“去哪里搜索”。最简单的实现是随机生成候选点然后选择最近的候选点走去。但随机策略在前沿探索面前效率很低因为机器人很可能反复探索已经扫描过的区域。一个较实用的接口设计是维护一个frontier列表每当地图更新时重新检测“空闲区域”与“未知区域”的边界然后把边界点作为候选搜索目标。每个候选目标会有一个分值分值可以这样设计score w1 / distance - w2 * risk w3 * information_gain其中distance是当前机器人到候选点的路径距离risk表示该区域是否靠近障碍物或通信薄弱区information_gain表示预计能获得的新信息量。多机器人场景下还需要给每个机器人分配不同的候选点避免重复。5.3 第三步确认目标后执行导航当某个机器人通过传感器发现疑似目标时它需要把目标点广播给其他机器人。导航模块的任务是基于当前全局地图计算从机器人当前位置到目标点的路径并输出速度指令。这一步中全局规划与局部规划的分工值得注意。全局规划器使用 A* 或 RRT 生成路径。局部规划器则负责实时避障因为全局地图不一定是完整的随时可能出现新障碍。传统方案里全局路径每隔一段时间重新规划一次局部路径则每帧更新。这种双规划器结构就是“潜在最优导航”最常见的工程实现方式。5.4 第四步多机器人任务分配与冲突消解多机器人同时工作最大的问题是“重复劳动”。如果两个机器人同时选择同一个搜索点另一个点却没人去搜索效率就会下降。解决这个问题通常采用两种思路集中式所有机器人将自身状态发送到中心节点中心节点统一做全局分配。分布式每个机器人通过共享地图和其他机器人的位置信息独立计算“我应该去哪个点”。分布式实现更健壮但需要一套冲突避免机制。比如搜索点被某个机器人锁定后其他机器人在一段时间内不再考虑该点。5.5 第五步避碰与死锁恢复避碰分两个层面。一层是路径规划时避开地图上的静态障碍物另一层是运行时避开动态障碍物和其他机器人。在示例实现里我们最简单的做法是把其他机器人的当前位置视为临时障碍物在局部地图上做膨胀然后重新规划路径。死锁问题更隐蔽。多机器人在窄通道相遇时可能出现“你让我、我也让你”的局面谁都无法前进。解决死锁的经典做法是加一个随机的等待时间或者用优先级规则编号小的机器人优先通过编号大的机器人后退等待。6. 完整示例代码实现下面进入代码部分。为了避免让示例变成只能看的伪代码我准备了三段可以运行的实现第一段是单机器人人工势场法导航第二段是多机器人前沿任务分配的简化示例第三段是 ROS 2 里发布目标点的节点。这三段代码不包含全部工程细节但足够你把核心逻辑跑通。6.1 示例 1基于人工势场法的单机器人目标导航人工势场法的核心思想是目标点产生“引力”障碍物产生“斥力”机器人顺着合力方向移动。这个方法计算量小适合演示“潜在最优导航”中的局部避障功能但它也有著名的“局部极小值问题”后面我会专门讲。# 文件路径potential_field_nav.py import numpy as np import matplotlib.pyplot as plt GOAL np.array([8.0, 8.0]) OBS np.array([3.0, 4.0]) K_ATT 1.0 K_REP 3.0 Q_STAR 2.0 STEP 0.1 MAX_ITER 500 def attractive_potential(pos): d np.linalg.norm(pos - GOAL) return 0.5 * K_ATT * d * d def repulsive_potential(pos): d np.linalg.norm(pos - OBS) if d Q_STAR: return 0.5 * K_REP * (1.0 / d - 1.0 / Q_STAR) ** 2 return 0.0 def total_potential(pos): return attractive_potential(pos) repulsive_potential(pos) def gradient(pos, delta1e-3): grad np.zeros_like(pos) for i in range(len(pos)): dx np.zeros_like(pos) dx[i] delta grad[i] (total_potential(pos dx) - total_potential(pos - dx)) / (2 * delta) return grad pos np.array([0.5, 0.5]) path [pos.copy()] for _ in range(MAX_ITER): g gradient(pos) if np.linalg.norm(pos - GOAL) 0.1: break pos pos - STEP * g / (np.linalg.norm(g) 1e-6) path.append(pos.copy()) path np.array(path) print(路径点数:, len(path)) print(终点:, path[-1]) print(到达目标:, np.linalg.norm(path[-1] - GOAL) 0.2) plt.figure() plt.plot(path[:, 0], path[:, 1], markero, labelrobot path) plt.scatter(*GOAL, cg, marker*, s200, labelgoal) plt.scatter(*OBS, cr, markers, s100, labelobstacle) plt.legend() plt.savefig(potential_field_path.png)这段代码的关键点有三个力场如何定义、梯度如何计算、以及如何控制机器人移动。我用了数值梯度来近似解析梯度这样修改势能函数时不需要重新推导求导公式适合做原型验证。运行成功后你会看到一张保存为potential_field_path.png的路径图机器人会从起点绕过障碍物逼近目标点。但要注意这个示例只验证了“目标已知且障碍物静态”的情况。真实场景中目标点可能已知、障碍物却一直在变化人工势场法的局部极小值问题会让机器人卡在某个位置反复震荡。工程上更推荐把它作为局部避障模块的一部分而不是整个导航的全部。6.2 示例 2多机器人前沿任务分配的简化实现多机器人搜索里前沿点分配是核心。下面这个简化的框架演示了如何用“就近分配”的策略把若干前沿点分配给不同的机器人。# 文件路径frontier_search_alloc.py import math class Robot: def __init__(self, robot_id, pos): self.id robot_id self.pos pos self.target None def distance(a, b): return math.hypot(a[0] - b[0], a[1] - b[1]) frontiers [ (2, 3), (4, 5), (7, 2), (6, 6), (1, 8), (3, 4), (8, 3) ] robots [ Robot(1, (0, 0)), Robot(2, (5, 5)), Robot(3, (9, 0)), ] unassigned list(frontiers) assignments {} while unassigned: best_pair None best_dist float(inf) for robot in robots: if robot.target is not None: continue for frontier in unassigned: d distance(robot.pos, frontier) if d best_dist: best_dist d best_pair (robot, frontier) if best_pair is None: break robot, frontier best_pair robot.target frontier assignments[robot.id] frontier unassigned.remove(frontier) for robot_id, target in assignments.items(): print(fRobot {robot_id} - frontier {target})这段代码的逻辑很简单每一轮挑选当前“尚未分配任务的机器人”与“尚未分配的候选点”中距离最近的一对完成绑定。它虽然不考虑信息增益和多段路径但已经能看出多机器人搜索分配的一个基本形态。用这段代码做扩展也很方便你可以把distance函数改成实际的路径规划距离把frontier列表换成带权重的候选点。真实系统中计算距离时不应使用欧氏距离而应该使用避障后的真实路径长度因为两个点隔着墙时欧氏距离会低估真实成本。6.3 示例 3ROS 2 节点发布目标点当搜索系统确认了目标位置后需要一个方式把目标点发送给导航系统。在 ROS 2 中最常见的方法是发布一个PoseStamped话题。下面的节点每隔 2 秒向/goal话题发布一次目标点导航模块收到后就会重新规划路径。# 文件路径goal_publisher.py import rclpy from rclpy.node import Node from geometry_msgs.msg import PoseStamped class GoalPublisher(Node): def __init__(self): super().__init__(goal_publisher) self.publisher self.create_publisher(PoseStamped, /goal, 10) self.timer self.create_timer(2.0, self.publish_goal) def publish_goal(self): msg PoseStamped() msg.header.frame_id map msg.header.stamp self.get_clock().now().to_msg() msg.pose.position.x 8.0 msg.pose.position.y 8.0 msg.pose.orientation.w 1.0 self.publisher.publish(msg) self.get_logger().info(发布目标点: (8.0, 8.0)) def main(argsNone): rclpy.init(argsargs) node GoalPublisher() rclpy.spin(node) node.destroy_node() rclpy.shutdown() if __name__ __main__: main()运行方式很简单先启动一个 ROS 2 工作空间并编译好依赖然后在终端执行ros2 run your_package goal_publisher在另一个终端执行ros2 topic echo /goal只要能看到PoseStamped消息不断打印出来就说明节点工作正常。这里特别提醒初学者注意frame_id。目标点必须发布在map坐标系下而不是base_link坐标系下否则导航模块会把一个“机器人自身坐标系里的目标点”当成世界坐标下的目标点导致完全错误的路径。7. 运行结果与效果验证示例 1 运行后如果看到类似下面的输出说明基本逻辑已跑通路径点数: 87 终点: [7.96 7.94] 到达目标: True同时会在当前目录生成potential_field_path.png。打开图片后你应该能看到一条从(0.5, 0.5)出发绕过(3, 4)处障碍物最终逼近绿色五角星目标点的路径。如果路径在某个位置停止不动或者反复震荡大概率是遇到了人工势场法的局部极小值问题这时可以适当增大K_REP、减小STEP或者给机器人增加一个随机扰动。示例 2 运行后标准输出里会显示哪台机器人被分配到了哪个前沿点。这个阶段只要能看到三台机器人各自分配到不同的候选点且没有重复分配就算是初步成功。进一步验证的方法是增加更多前沿点观察分配算法是否能保持“每个点只被分配一次”的状态。示例 3 是 ROS 2 节点验证方法是通过ros2 topic echo /goal观察消息。如果消息能持续发布再配合一个订阅端或 RVIZ2 可视化就能确认目标点已经进入导航系统的输入链路。从整体系统的角度看一个更完整的验证方式是设计一组数值指标在仿真中反复运行搜索覆盖率已探索面积占总可探索面积的比例。平均目标发现时间从系统启动到至少一台机器人确认目标的时间。平均路径长度机器人从起点到目标点的实际移动距离。碰撞次数机器人与障碍物或其他机器人的碰撞次数。重复探索率多个机器人访问同一区域的比例。这些指标中最容易骗人的是“覆盖率”。如果你只看覆盖率系统很可能一直在原地打转因为只要地图更新频率低覆盖率也会缓慢增长。真正有效的评价必须把“覆盖率增长速率”和“目标发现时间”放在一起看。8. 常见问题与排查思路问题现象可能原因排查方式解决方案机器人无法到达目标路径逐渐漂移坐标系不一致或里程计漂移打印机器人当前位姿与地图目标点确认是否在同一个frame_id下统一坐标系增加局部定位校正多机器人重复探索同一区域候选点分配未生效或共享地图更新不及时查看每台机器人的任务列表和共享地图时间戳使用带锁定的任务分配机制提高地图同步频率路径规划频繁失败显示无可达路径全局地图中目标点被标记为占据检查目标点附近栅格状态将目标点向空闲区域做膨胀修正避障模块频繁急停局部规划器参数过保守观察速度指令是否突变检查膨胀半径调低膨胀系数平滑速度输出多机器人在窄道互堵缺失优先级或死锁恢复机制查看多机轨迹确认是否在相向而行增加等待随机时间或优先级放行规则地图更新后路径失效全局路径未周期性重规划检查全局路径时间戳与地图时间戳增加周期性全局重规划逻辑这些坑里最典型的工程问题是第一个坐标系漂移。很多团队把单机 SLAM 跑得很好一进入多机联合建图就发现地图错位。这里不仅是坐标系转换的问题还涉及多机位姿初始化的误差传播。我的建议是在多机联合建图流程里每一次起始阶段的坐标对齐都做严密的记录和审计不要等运行几分钟后才发现漂移。9. 最佳实践与工程建议如果看完代码后你想往真实项目推进下面这些实践建议会帮你少走弯路。第一先跑通“单机闭环”再上多机。多机器人系统排错难度是单机的指数倍。如果单机导航都不能稳定运行直接上多机只会得到一堆无法定位的错误。第二地图订阅与发布的频率要设计得合理。全局地图不必每个机器人每帧都合并一次高频合并会导致计算压力和通信拥塞。常见的做法是低频全局合并比如 1Hz高频局部更新比如 10Hz 以上。这样既保证决策层能看到大致全局态势又保证规划层能快速反应。第三消息设计要包含时间戳和来源信息。在多机系统里一条地图更新或目标点消息如果没有来源标识当数据冲突时根本不知道是谁发的、什么时间发的。给每条消息打上robot_id和时间戳排查问题时能省很多时间。第四路径规划不要用纯欧氏距离做代价。我见过不少项目先在前沿分配阶段用欧氏距离打分结果两点的直线距离很近实际路径要绕过整面墙导致任务分配效果非常差。代价函数至少要基于“从当前位置到目标点的规划路径长度”或者使用“潜在可行路径长度”作为近似。第五安全优先。如果你要接真实硬件一定先在地图上把其他机器人、静态障碍物、动态障碍物分开管理。导航避碰时应把其他机器人视为“半动态障碍物”因为它们会移动但又不像随机行人那样完全不可预测。多机的避碰可以在局部规划层做速度互让也可以在上层做轨迹协议协调。对初学者先实现“把其他机器人位置膨胀成障碍物”这一简单做法再逐步优化。第六保持重规划能力。未知环境最有价值的能力不是一次算出一条完美路径而是每当地图更新时迅速修正路线。“潜在最优导航”本质上是多次近似最优决策的迭加而不是一次性的全局最优解。所以在系统设计里一定要给全局重规划留出接口不要让规划器只调一次就结束。第七做好日志记录与回放。多机器人系统的失败通常是偶发性的。没有日志偶发问题时你很难复现。建议从第一天开始就记录关键话题比如地图更新、机器人位姿、目标点、速度指令用 ROS 2 的 bag 工具或自定义日志统一保存。10. 总结与后续学习方向这篇文章从多机器人在未知环境中的目标搜索任务切入把“搜索”和“导航”两条线拆开又合起来讲清楚了。你可能已经注意到真正决定系统上限的不是某一套算法而是搜索策略与导航策略之间的信息交互方式。搜索发现目标后导航模块需要马上接手导航模块执行的同时搜索模块又要继续更新地图。这个耦合关系是多机器人系统区别于单机系统的关键。代码部分给你提供了三段可以直接运行的实现人工势场法单机导航、多机器人前沿分配框架、ROS 2 目标点发布节点。把这三段代码串起来你已经可以得到一个“搜索分配 目标导航”的最小闭环原型。下一步我建议你按这个顺序继续深入先给示例 2 换成基于真实路径距离的代价函数再给示例 1 换成 A* 或 DWA 等更适合工程实现的导航方法最后把示例 3 接到仿真器里跑通整个链路。想继续深入的话值得关注的方向包括基于信息增益的多机器人主动探索、分布式地图合并中的一致性维护、以及带运动学约束的多机器人轨迹规划。每一块都可以单独深入研究但请一定记住在未知环境里系统能持续创建新信息并快速响应变化比在静止地图上算出那条“唯一最优路径”重要得多。多机器人的价值不是让那一小段已知区域走得更顺而是让整个未知区域被更快地变成已知区域。
返回列表