1. 项目概述:让机器人自己“看”世界
如果你玩过一些策略游戏,比如《星际争霸》或者《文明》,开局时地图一片漆黑,你需要派侦察兵去探索未知区域,才能获取资源、发现敌人。在机器人领域,尤其是服务机器人、仓储机器人或者灾难救援场景中,我们面临一个类似的核心问题:如何让一个机器人(或者一群机器人)在完全陌生的环境中,自主、高效地完成地图构建(SLAM)并探索完整个区域?这就是“自主探索”要解决的事。
今天要聊的explore_lite,就是一个在ROS(机器人操作系统)生态中,专门为解决这个问题而生的经典开源工具包。它实现了一种称为“前沿探索”的算法。简单来说,机器人会实时分析自己已构建的地图,找出“已知”与“未知”区域的边界线,这些边界线就是“前沿”。然后,算法会评估这些前沿点,选择一个最优目标点发送给机器人的导航系统,驱动机器人前往,从而不断扩大已知地图的范围,直到整个可探索区域都被覆盖。
你可能会问,这听起来不就是自动导航吗?区别在于,传统的导航需要你事先给定一个明确的目标点坐标,而自主探索的“目标点”是算法根据当前环境信息动态计算出来的。机器人自己决定“下一步该去哪儿”,这赋予了它真正的环境认知和决策能力。explore_lite作为 ROS1 时代的成熟方案,现在也有了官方的 ROS2 移植版本m-explore-ros2,这让它在现代机器人开发中依然保持着强大的生命力。
无论是想用一台TurtleBot3在Gazebo仿真里验证算法,还是打算在真实的JetBot小车加上RealSense深度相机做实机测试,亦或是想搞多机器人协同探索,explore_lite都提供了一个清晰、可用的起点。接下来,我就结合自己的踩坑经验,带你从零开始,深入这个项目的核心,并完成一个完整的仿真演示。
2. 探索算法核心:前沿探索究竟在做什么?
在深入配置和运行之前,我们有必要花点时间弄明白explore_lite的核心——前沿探索算法。这能帮你更好地理解后续的参数调整和问题排查。
2.1 从游戏视角理解“前沿”
想象一下,你控制着一个游戏单位在一片战争迷雾中移动。你的视野范围有限,只能照亮周围一圈。已照亮的地块是“已知可通行区域”,紧挨着这些已知地块的、仍被黑暗笼罩的地块边缘,就是“前沿”。你的策略通常是让单位沿着这些边缘移动,一步步揭开地图。
explore_lite做的是一模一样的事,只不过它的“视野”是机器人的传感器(如激光雷达)。“已知区域”是已经通过SLAM构建好的占据栅格地图(Occupancy Grid Map)。在这张地图上,每个栅格有三种状态:占用(如墙壁)、空闲(可通行区域)、未知(尚未探测)。算法会扫描整个地图,找出所有“空闲”栅格与“未知”栅格相邻的位置,这些位置就构成了“前沿点”的集合。
2.2 算法工作流程拆解
算法在每个运行周期内,大致遵循以下步骤:
前沿检测:基于当前最新的占据栅格地图,使用图像处理中的边缘检测类似方法,找出所有前沿点。这些点通常不是单个栅格,而是会聚类成一片片的“前沿区域”。
前沿筛选:不是所有前沿都值得去。算法会根据一系列参数进行筛选:
- 最小前沿尺寸:太小的前沿区域(比如只是一个门缝)可能不值得专门跑一趟,或者可能是传感器噪声,会被过滤掉。
- 代价地图检查:机器人导航使用的局部/全局代价地图会标记出障碍物、膨胀区域等。前沿点如果落在代价过高的区域(如太靠近障碍物),会被舍弃。
- 机器人可达性:算法会检查从机器人当前位置到前沿点是否存在一条无碰撞的路径(通过调用全局规划器)。无法到达的点会被剔除。
目标点选择:在剩下的候选前沿中,选择一个作为当前探索目标。
explore_lite采用的是一种综合评分策略。评分通常考虑两个主要因素:- 信息增益:前往这个前沿,预计能探索到多少新的未知区域?增益越大,分数越高。
- 路径成本:机器人到达这个前沿需要移动的距离。成本越低,分数越高。 最终的得分可能是
信息增益 / (路径成本 + ε)之类的形式。算法会选择得分最高的前沿区域,并将其中心或某个特定点作为目标发送给导航栈。
循环与终止:机器人朝目标点移动。在移动过程中,传感器不断获取新数据,SLAM更新地图,新的前沿又会产生。当机器人到达目标点或中途发现更优的前沿时,会重新进行上述计算,更新目标。当算法再也找不到符合条件的前沿点时,就认为探索完成,机器人停止。
注意:
explore_lite的“探索完成”判断相对简单,就是没有前沿了。在实际复杂环境中(如动态障碍物、玻璃门等),可能需要结合其他传感器或逻辑来判断是否真的已探索完全。
2.3 与SLAM的紧密耦合
这里必须强调一个关键点:探索的质量极度依赖于SLAM建图的质量。explore_lite本身不负责建图,它订阅/map话题来获取实时地图。如果SLAM建图出现漂移、重影或者更新不及时,那么基于错误地图计算出的前沿也将是错误的,可能导致机器人撞墙或者在一个地方来回打转。
因此,在调试探索算法之前,务必确保你的SLAM(无论是slam_toolbox还是cartographer)在静态环境下已经能稳定输出高质量的地图。这是一个典型的“垃圾进,垃圾出”的环节。
3. 环境搭建与仿真演示实操
理论清楚了,我们动手在仿真环境中跑起来。这里以最流行的 TurtleBot3 Waffle 机器人在 Gazebo 中的仿真为例,使用 ROS2 Humble 版本。这个组合资料丰富,社区支持好,非常适合学习和原型验证。
3.1 基础环境准备
首先,确保你的ROS2环境已经安装妥当。然后,我们需要安装必要的仿真和导航包。
# 1. 安装 TurtleBot3 相关包 sudo apt install ros-humble-turtlebot3-gazebo ros-humble-turtlebot3-navigation2 ros-humble-turtlebot3-description # 2. 安装 Nav2(如果上一步没装全的话) sudo apt install ros-humble-navigation2 ros-humble-nav2-bringup # 3. 从源码构建 m-explore-ros2 (explore_lite的ROS2端口) mkdir -p ~/explore_ws/src cd ~/explore_ws/src git clone https://github.com/robo-friends/m-explore-ros2.git cd ~/explore_ws # 安装依赖 rosdep install -i --from-path src --rosdistro humble -y # 编译 colcon build --symlink-install # 激活工作空间 source ~/explore_ws/install/setup.bash实操心得:编译时使用
--symlink-install参数非常有用。它创建的是符号链接而非直接拷贝,这样你在源码目录 (src/m-explore-ros2) 里修改了配置文件(比如后面要讲的params.yaml)后,无需重新编译,直接重启节点就能生效,极大提升了调试效率。
3.2 启动仿真世界与导航栈
我们需要一个让机器人运行的环境,以及让机器人能够自主移动的“大脑”——Nav2导航系统。
# 1. 设置机器人模型(每次打开新终端都需要) export TURTLEBOT3_MODEL=waffle # 2. 设置Gazebo模型路径(避免找不到机器人模型) export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:/opt/ros/${ROS_DISTRO}/share/turtlebot3_gazebo/models # 3. 启动Gazebo仿真环境和Nav2导航栈,并开启SLAM ros2 launch nav2_bringup tb3_simulation_launch.py slam:=True这条命令会做以下几件事:
- 打开一个Gazebo窗口,里面有一个空的“世界”和一台TurtleBot3 Waffle机器人。
- 启动RViz2,显示机器人的传感器数据、地图等。
- 启动完整的Nav2导航系统,包括代价地图、行为树、规划器、控制器等。
- 由于
slam:=True,它会同时启动一个SLAM节点(默认是slam_toolbox)来实时构建地图。
等待所有节点启动完毕,Gazebo和RViz窗口都正常显示。此时,地图是空的,因为机器人还没动,传感器没数据。
3.3 启动 explore_lite 节点
现在,让探索大脑上线。
# 在新终端中,同样先设置环境和激活工作空间 export TURTLEBOT3_MODEL=waffle source ~/explore_ws/install/setup.bash # 启动 explore_lite 节点 ros2 launch explore_lite explore.launch.py如果一切顺利,你应该会立刻看到RViz2中的机器人开始移动!它开始自主探索这个空的Gazebo世界。同时,在RViz中,你可以添加一个显示项来观察算法的工作状态:
- 在RViz左侧的“Displays”面板,点击底部的“Add”。
- 选择“Marker”类型,点击“OK”。
- 在新出现的“Marker”显示项中,将“Topic”设置为
/explore/frontiers。 - 你可能会看到一些彩色的点或方块出现在地图边界,这些就是算法识别出的“前沿”。机器人正朝着其中一个前进。
3.4 在RViz中实时观察探索过程
光看机器人动还不够,我们需要一些可视化工具来理解它的决策。除了前沿标记,我强烈建议在RViz中配置好以下话题:
| RViz显示类型 | 话题 (Topic) | 作用与观察点 |
|---|---|---|
| Map | /map | 核心。观察SLAM实时构建的占据栅格地图如何从无到有,从局部到全局。注意地图边缘(前沿)的扩展是否平滑。 |
| Marker | /explore/frontiers | 关键。查看算法识别出的所有前沿区域(通常显示为点云或方块)。颜色可能代表不同聚类或评分。 |
| Marker | /explore/next_goal(可能存在) | 直接。显示当前选定的下一个目标点在哪里。 |
| Path | /plan(或/global_plan) | 观察。显示机器人规划的全局路径,看它如何绕开障碍物(仿真中可能没有)前往前沿。 |
| LaserScan | /scan | 基础。确认激光雷达数据是否正常,这是SLAM和代价地图的基础。 |
通过同时观察地图的构建和前沿的更新,你能直观感受到算法是如何工作的:机器人移动到一处,激光扫描更新地图,新的前沿在更远处出现,机器人规划路径前往,循环往复。
4. 核心参数解析与调优指南
explore_lite的行为很大程度上由参数文件控制。默认参数通常适用于简单环境,但一旦环境复杂或机器人性能不同,就需要调整。参数文件通常位于~/explore_ws/src/m-explore-ros2/explore/config/params.yaml。我们来拆解几个最关键的部分。
4.1 机器人物理与传感器参数
这部分参数需要根据你的真实机器人或仿真模型进行匹配,否则探索行为会异常。
# params.yaml 片段 robot_base_frame: "base_footprint" # 机器人基座坐标系,通常与里程计和激光雷达的父帧一致。 robot_radius: 0.2 # 机器人的半径(米),用于前沿点可达性检查和代价地图膨胀。必须设置准确! # 对于TurtleBot3 Waffle,这个值大约是0.14-0.15,但0.2提供了一个安全裕度。 min_frontier_size: 0.5 # 最小前沿尺寸(米)。小于此面积的前沿区域将被忽略。 # 调大此值可以让机器人忽略小缝隙,专注于大空间;调小则更“细致”,但可能去探索一些死角。为什么robot_radius如此重要?这个值直接用于两个地方:1) 在筛选前沿时,算法会检查目标点周围robot_radius范围内是否全是可通行区域(非障碍物)。2) Nav2的代价地图会根据这个值进行障碍物膨胀。如果这个值设小了,机器人可能会尝试穿过实际无法通过的狭窄通道;设大了,则可能把一些本可通过的区域误判为不可达,导致探索不完全。
4.2 探索行为控制参数
这些参数控制探索的策略和“性格”。
# params.yaml 片段 potential_scale: 3.0e-3 # 信息增益项的权重系数。增大它,算法会更倾向于选择能探索更多新区域的目标,即使它很远。 gain_scale: 1.0 # 路径成本项的权重系数。增大它,算法会更倾向于选择距离近的目标。 # 目标综合得分 = gain_scale * (信息增益) - potential_scale * (路径成本)。通过调整这两个值,你可以让机器人是“冒险家”(爱跑远)还是“保守派”(爱就近)。 min_frontier_dist: 0.5 # 机器人当前位置与前沿之间的最小距离(米)。小于此距离的前沿被认为“已到达”或“不值得去”。 # 防止机器人在一个前沿点附近微小震荡。 max_frontier_dist: 10.0 # 考虑的最大前沿距离(米)。超过此距离的前沿将被忽略。 # 在超大环境中,限制单次探索范围,避免规划超长路径。可以结合导航的全局规划器限制一起考虑。 update_frequency: 0.5 # 探索循环的频率(Hz)。即每秒重新计算前沿和目标几次。 # 频率太高增加计算负担,太低则反应迟钝。0.5到2.0是常见范围。调优建议:初期保持potential_scale和gain_scale的默认比例。如果你发现机器人总是舍近求远,去探索很远但收益不大的区域,可以适当增大gain_scale或减小potential_scale。观察update_frequency,如果机器人移动卡顿,可以调低;如果发现它频繁更换目标(“朝三暮四”),也可以适当调低。
4.3 与导航栈的接口参数
探索节点需要与Nav2交互,以发送目标点和检查路径。
# params.yaml 片段 planner_frequency: 0.5 # 调用全局规划器检查路径可行性的频率(Hz)。通常与update_frequency一致或略低。 # 规划是计算密集型操作,太频繁会影响性能。 nav_goal_tolerance: 0.5 # 导航目标容差(米)。当机器人距离目标点小于此值时,认为导航成功。 # 这个值需要略大于你机器人定位的精度和控制器精度。 use_sim_time: true # 在仿真中必须设为true,使用Gazebo发布的仿真时间。 # 在实体机器人上运行时,必须设为false。常见坑点:nav_goal_tolerance设置不当会导致机器人“永远到不了”目标。例如,目标点紧贴墙壁,但由于代价地图的膨胀,机器人的轮廓无法到达距离墙壁小于robot_radius的位置。如果nav_goal_tolerance小于这个距离差,导航会一直尝试微调,无法成功,进而导致探索停滞。解决方案:适当增大nav_goal_tolerance(例如0.8),或者确保前沿目标点生成在更开阔的位置(这需要调整前沿检测或代价地图参数,更复杂)。
5. 进阶功能与多机器人探索
explore_lite和其ROS2端口m-explore-ros2不仅仅支持单机器人。它的一个强大特性是支持多机器人协同探索与地图合并,这对于需要快速探索大面积的场景(如搜索救援)至关重要。
5.1 单机器人的进阶控制
在探索过程中,你可能有暂停、继续或让机器人返回起点的需求。
暂停/继续探索:算法提供了一个服务或话题(ROS1是服务,ROS2端口可能沿用或改为话题)来控制探索开关。你可以通过命令行发布消息来暂停探索,机器人会停在当前位置。
# 假设控制话题是 /explore/resume (类型 std_msgs/Bool) ros2 topic pub /explore/resume std_msgs/msg/Bool "{data: false}" --once # 暂停 ros2 topic pub /explore/resume std_msgs/msg/Bool "{data: true}" --once # 继续这在实机测试中非常有用,比如当机器人遇到意外情况(如卡住)时,可以暂停探索,手动干预后再继续。
返回初始位置:在启动节点时,可以设置参数
return_to_init: true。当探索完成(无前沿可寻)后,机器人会自动规划路径回到它开始探索时的初始位置。这对于需要“回家”充电或交付数据的场景很实用。
5.2 多机器人地图合并原理
多机器人探索的核心挑战在于:每个机器人独立构建自己的局部地图,如何将这些地图无缝拼接成一张全局一致的大地图?m-explore-ros2中的map_merge节点负责此事。
它支持两种模式:
- 已知初始位姿:每个机器人的起始位置相对于一个共同的坐标系(如
map)是事先已知的。这是最简单的情况,地图合并只是简单的坐标变换和叠加。合并质量最高。 - 未知初始位姿:机器人从各自未知的位置开始。合并算法需要通过对齐各自地图中重叠区域的特征,来推算它们之间的相对位姿变换。这要求机器人在探索初期,其感知范围有一定程度的重叠,否则算法无法找到匹配点。
5.3 运行多机器人仿真演示
根据m-explore-ros2的README,运行多机器人演示的步骤如下:
# 1. 启动多机器人仿真环境、Nav2栈和SLAM(每个机器人独立运行一个SLAM实例) export TURTLEBOT3_MODEL=waffle export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:/opt/ros/${ROS_DISTRO}/share/turtlebot3_gazebo/models ros2 launch multirobot_map_merge multi_tb3_simulation_launch.py slam_gmapping:=True # 注意:这里使用了 slam_gmapping,因为原版合并逻辑对其支持最好。slam_toolbox需要实验性分支。 # 2. 在新终端,启动地图合并节点 ros2 launch multirobot_map_merge map_merge.launch.py # 默认是已知初始位姿模式。如果想测试未知位姿,需要在第一步的launch命令中加上 `known_init_poses:=False`。 # 3. 启动RViz查看合并后的地图 rviz2 -d ~/explore_ws/src/m-explore-ros2/map_merge/launch/map_merge.rviz实操心得与避坑:
- SLAM选择:多机器人地图合并对SLAM输出的地图质量一致性要求极高。
slam_gmapping在ROS1时代是标准,但其ROS2版本非官方,可能存在稳定性问题。slam_toolbox是ROS2的推荐选择,但需要用到m-explore-ros2仓库提到的实验性分支,并设置slam_toolbox:=True参数。建议新手先从单机器人和slam_toolbox开始,稳定后再尝试多机。 - 网络配置:多机器人系统通常涉及多台物理机或复杂的网络命名空间。仿真中所有节点跑在一台机器上,通过ROS的命名空间(
/robot1/*,/robot2/*)来区分。在实机部署时,你需要确保机器人之间的时钟同步(使用NTP)和网络通信畅通,并且正确配置了ROS_DOMAIN_ID以避免干扰。 - 未知位姿的挑战:未知初始位姿模式非常依赖初期地图重叠。如果两个机器人起步离得太远,各自地图没有共同特征,合并就会失败。官方建议起步距离小于3米。在实际应用中,这通常意味着需要先让机器人在一个小范围内“碰个头”,建立初步的地图关联,然后再分开探索。
6. 从仿真到实机:关键差异与部署要点
在Gazebo里跑通只是第一步,真正的考验在实体机器人上。仿真环境是理想的、确定性的,而现实世界充满噪声、不确定性和意外。
6.1 传感器带来的根本差异
仿真中的激光雷达是完美的,没有噪声,没有镜面反射,没有阳光干扰。现实中,你需要处理:
- 激光雷达噪声:在
params.yaml中,你可能需要调整与地图更新相关的参数,或者对激光数据做滤波处理,防止噪声点被误建为障碍物。 - 深度相机 vs 激光雷达:如果你像JetBot示例一样使用RealSense等深度相机,你需要将深度点云转换为激光扫描数据(使用
depthimage_to_laserscan节点)。这个过程会引入视角、精度和噪声模式的变化。你需要仔细校准相机,并可能调整SLAM和探索算法中关于障碍物检测的阈值。 - 里程计精度:仿真里程计几乎无漂移。实机轮式里程计误差会累积,导致SLAM建图出现弯曲或漂移。务必使用激光雷达(或视觉)进行闭环检测的SLAM算法,如
cartographer或slam_toolbox,它们能有效校正里程计误差。纯激光扫描匹配的gmapping在长走廊或特征少的环境中很容易失效。
6.2 参数调整重心转移
实机部署时,参数调整的优先级会发生变化:
- 安全第一:大幅增加
robot_radius的安全裕度。仿真中撞墙无所谓,实机撞一次可能就报废了。同时,确保Nav2的代价地图膨胀半径设置合理。 - 响应速度:实机计算资源有限。适当降低
update_frequency和planner_frequency,避免CPU过载导致控制指令延迟,引发事故。 - 环境适应性:增大
min_frontier_size,避免机器人去探索那些由于传感器噪声或动态物体(如晃动的窗帘、行人腿部)产生的、不稳定的“假前沿”。 - 定位可靠性:密切关注
/amcl_pose(如果使用AMCL)或SLAM输出的位姿话题。如果定位突然跳变,探索算法给出的目标点会在错误的位置,导致机器人乱跑。此时需要设置一个监视节点,当定位协方差超过阈值时,自动暂停探索。
6.3 实机部署检查清单
在实体机器人上启动explore_lite前,请逐一核对:
- [ ]传感器数据:
/scan或/depth话题数据是否正常发布?在RViz中查看是否与物理环境匹配。 - [ ]坐标变换树:运行
ros2 run tf2_tools view_frames生成TF树图,检查base_footprint、laser(或camera_depth_frame)、odom、map之间的变换关系是否完整、连续。 - [ ]SLAM地图:在不开启探索的情况下,手动遥控机器人走一圈,确认SLAM能构建出准确、一致的地图。地图不应有严重的重影、扭曲或跳动。
- [ ]导航基础:在已知地图上,通过RViz给Nav2发送一个2D导航目标,确认机器人能正常规划路径并安全移动到目标点。这是探索功能正常工作的底层保障。
- [ ]探索参数:将仿真中的
use_sim_time参数改为false。根据机器人实际尺寸调整robot_radius。 - [ ]紧急停止:确保你有可靠的远程紧急停止方式,无论是物理急停开关、遥控器信号,还是通过ROS话题发送停止命令。
7. 常见问题排查与调试技巧
即使按照步骤操作,你也难免会遇到问题。这里记录了一些典型问题及其解决思路。
7.1 机器人不移动或原地旋转
这是最常见的问题。请按以下顺序排查:
- 检查目标话题:首先确认
explore_lite是否在发布目标。ros2 topic echo /explore/goal查看是否有geometry_msgs/PoseStamped消息发出。如果没有,说明探索算法本身出了问题。 - 检查前沿:在RViz中查看
/explore/frontiers标记。如果根本没有前沿显示,可能的原因有:- 地图话题不对:检查
explore_lite订阅的地图话题是否与你的SLAM节点发布的话题一致。默认是/map,但如果你的SLAM发布了/slam_map,就需要在参数文件中修改map_topic。 - 地图数据问题:确保
/map话题上的数据是有效的nav_msgs/OccupancyGrid,并且info.resolution(分辨率)是合理的值(如0.05米/像素)。 - 参数过于严格:
min_frontier_size设得太大,或max_frontier_dist设得太小,导致所有前沿都被过滤掉了。尝试调小min_frontier_size。
- 地图话题不对:检查
- 检查导航状态:如果目标点正常发出,但机器人不动,问题可能出在Nav2。使用
ros2 topic echo /navigate_to_pose/_action/feedback或查看RViz中Nav2的插件,看导航是否接收到了目标,以及规划状态是什么。常见原因是全局/局部代价地图没有障碍物信息,导致规划器认为前方是禁区。
7.2 探索行为“短视”或“绕圈”
机器人只在起始点附近打转,不去探索远处。
- 原因一:
max_frontier_dist太小。这个参数限制了算法只考虑机器人附近的前沿。根据你的环境大小,适当调大此值。 - 原因二:路径规划失败。机器人“看到”了远处的前沿,但规划器无法找到一条无碰撞的路径过去(可能因为地图中间有未探索的未知区域,被代价地图视为障碍)。可以尝试调整Nav2全局规划器(如
NavFn或Smac)的参数,允许其穿过未知区域(allow_unknown: true),但这会带来碰撞风险,需谨慎。 - 原因三:
potential_scale与gain_scale比例失衡。路径成本权重过高,导致机器人总是选择最近、而非信息增益最大的目标。尝试增大potential_scale。
7.3 地图合并失败或错位
在多机器人演示中,合并后的地图出现重影、错位或无法合并。
- 已知位姿模式:检查每个机器人的
map到odom的TF变换是否正确发布,并且它们的map帧在初始时刻是否对应于同一个世界坐标系下的不同位置。这通常需要在启动每个机器人的SLAM时,通过初始位姿参数来设定。 - 未知位姿模式:
- 初期无重叠:确保机器人起步位置足够近,让它们的激光扫描范围有交集。
- SLAM地图不一致:不同机器人使用的SLAM算法或参数不一致,导致地图风格(如障碍物宽度、噪声水平)差异太大,特征匹配失败。尽量使用相同配置的SLAM。
- 合并算法参数:
map_merge节点有自己的一套参数(如特征匹配阈值、迭代次数等),可能需要针对你的环境进行微调。参考其源码中的参数说明。
7.4 性能优化技巧
当环境很大或机器人数量多时,算法可能变慢。
- 降低频率:如前所述,调低
update_frequency和planner_frequency。 - 降低地图分辨率:SLAM构建地图时使用更低的分辨率(如0.1米/像素代替0.05米/像素)。这会降低地图精度,但能大幅减少前沿检测和路径规划的计算量。对于大范围探索,有时是可以接受的折衷。
- 限制探索区域:如果环境有明确的边界(如一个矩形仓库),可以在
explore_lite中设置一个边界框,让机器人只在这个区域内探索,避免计算无用区域的前沿。
调试自主探索系统,耐心和细致的观察是关键。养成同时观察传感器原始数据、实时地图、前沿标记、机器人位姿和导航状态的习惯,大部分问题都能被定位。从简单的空仿真环境开始,逐步增加复杂度(加入障碍物、多个房间),再到实机测试,每一步都确保基础稳固,这样才能构建出鲁棒的自主探索机器人。