ROS2仿真到自主导航:SLAM建图与Nav2全链路实战

ROS2仿真到自主导航:SLAM建图与Nav2全链路实战 如果你想学 ROS2 机器人开发最容易卡住的往往不是写代码而是代码写完之后机器人根本跑不起来。鼠标点出小乌龟不算入门真正的入门是启动一个和自己小车行为一致的仿真环境让机器人通过激光雷达扫描周围环境建出地图再在地图上给定目标点自主导航过去。这一整条链路才是机器人底层开发真正要反复用的主路径。这篇内容要带大家走通的正是ROS2 仿真 → SLAM 建图 → Nav2 导航这条全链路。仿真部分不是只讲一个环境而是覆盖两个方案一个是轻量级的 2D 仿真器 Stage适合快速验证算法另一个是带物理渲染的 Ignition也就是现在的 Gazebo 模拟器适合做接近真机的 3D 仿真。建图使用激光 SLAM 方案导航使用 Nav2 整套框架从里程计、TF 树、地图服务到行为树规划一次走完。先说结论这套学习路线的门槛并不高。只要你有一台能跑 Ubuntu 22.04 的电脑CPU 性能正常Stage 仿真基本不挑显卡Ignition 3D 仿真对渲染有一定压力建议有独立显卡但也不是必须顶级卡。如果你的目标是以后做机器人开发这篇文章可以直接对照操作把环境、启动方式、建图、导航、调试和排错完整理顺。1. 核心能力速览能力项说明项目类型ROS2 机器人仿真、SLAM 建图、Nav2 自主导航全链路教程目标读者ROS2 零基础入门者、准备转做机器人开发的学生和工程师仿真环境Stage 2D 轻量仿真、Ignition / Gazebo 3D 物理仿真双实战核心功能机器人运动控制、激光雷达话题、SLAM 增量建图、地图服务、Nav2 全局/局部路径规划依赖框架ROS2 Humble、rclpy/rclcpp、slam_toolbox 或 Cartographer、Nav2、Robot Localization推荐系统Ubuntu 22.04 ROS2 Humble硬件门槛Stage 仿真对显卡要求极低Ignition 仿真建议有独立显卡显存占用需按实际场景测试启动方式命令行 launch 启动仿真器、SLAM 节点、Nav2 导航栈接口能力ROS2 话题、服务、动作TF 坐标树可通过命令行工具和 Python 脚本调用批量任务可通过 ros2 bag 批量录制数据用脚本批量保存地图或循环测试导航目标点适合场景本地学习、算法验证、教学实验、真机部署前的行为验证这套链路里面最值得关注的点是“仿真环境一致”。你在 Stage 和 Ignition 中分别跑通建图和导航再去操作真实小车会发现核心思路完全一样只是需要额外处理硬件驱动、IMU 标定和里程计精度问题。2. 适用场景与使用边界先说适合做什么。如果你是刚装完 ROS2还不知道建图导航怎么串联的初学者这套路线能帮你绕过“环境装完就迷茫”的阶段。你会在仿真里看到一个真实的建图过程机器人旋转、发射激光、生成栅格地图然后你再用这张地图去设置目标点看机器人规划路径、避障、到达目标。如果你是准备做毕设或者比赛也可以用这个方法在仿真中先验证 SLAM 和导航效果再决定是否购买硬件或者在仿真中复现真机导航问题避免反复烧坏底盘驱动。那不适合什么场景呢这套教程的定位是“全链路入门”不适合做高精度建图研究比如视觉 SLAM、IMU 融合、多传感器标定需要另开专题。Stage 仿真不能替代真机传感器特性无法模拟车轮打滑、激光噪声等复杂情况Ignition 虽然物理效果更强但仍然和真实传感器有差距。使用边界这一点要特别强调仿真里跑通过不代表真机就能直接上。真实机器人落地前必须做安全测试包括刹车检查、速度上限限制、急停按钮验证。如果你后续把仿真代码部署到实际无人车或机器人平台必须确保控制指令经过安全校验并在有人监管的封闭场地内测试。涉及地图数据的采集和保存也要注意测试场所的地理信息安全不要在未授权区域采集、存储或发布敏感环境数据。3. 环境准备与前置条件开始之前先把基础环境准备好。最稳妥的组合是 Ubuntu 22.04 加 ROS2 Humble因为 Humble 是 LTS 版本教程覆盖最广遇到问题最容易搜到解决方案。3.1 基础系统检查先确认系统版本和磁盘空间lsb_release -a df -h free -h如果当前系统不是 Ubuntu 22.04建议直接用虚拟机或者新分区安装。ROS2 Humble 也可以在 Ubuntu 24.04 上部分运行但很多依赖包和仿真器版本会有差异新手不建议在非官方支持版本上折腾。3.2 添加 ROS2 软件源ROS2 需要先添加官方软件源否则执行apt install ros-humble-desktop会提示找不到包。这里给出 Humble 版本的标准安装过程sudo apt update sudo apt install software-properties-common curl sudo add-apt-repository universe sudo apt update sudo apt install curl -y sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg echo deb [arch$(dpkg --print-architecture) signed-by/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release echo $UBUNTU_CODENAME) main | sudo tee /etc/apt/sources.list.d/ros2.list /dev/null sudo apt update sudo apt upgrade sudo apt install ros-humble-desktop安装完成后把 ROS2 环境加载写进~/.bashrc避免每次打开终端手动 sourceecho source /opt/ros/humble/setup.bash ~/.bashrc source ~/.bashrc验证是否成功ros2 --help ros2 topic list如果能看到 ROS2 的帮助信息和一组默认话题说明基础环境已经正常。注意如果你的源下载慢可以换国内镜像源但不要混用不同发行版源。3.3 创建 ROS2 工作空间仿真和导航过程中需要自己编写少量启动脚本和配置文件建议单独建一个工作空间。mkdir -p ~/ros2_ws/src cd ~/ros2_ws colcon build --symlink-install echo source ~/ros2_ws/install/setup.bash ~/.bashrc source ~/.bashrc如果没有安装 colcon先补上sudo apt install python3-colcon-common-extensions3.4 Python 和开发工具后续写 rclpy 脚本需要 Python3ROS2 Humble 自带依赖这里确认一下即可sudo apt install python3-pip python3-rosdep2 -y如果你准备以后深入学习 C 节点可以顺手安装 g、cmake、tf2 工具链sudo apt install g cmake -y4. 安装部署与启动方式这一节是全文的关键。我会按“仿真器安装 → SLAM 工具安装 → Nav2 安装”的顺序把所需包补齐然后分别启动 Stage 和 Ignition 两套仿真环境。4.1 安装 Stage 2D 仿真器Stage 是一个轻量级 2D 仿真器它模拟机器人底盘运动、激光雷达和简单的环境地图CPU 占用很低非常适合在教学机上跑。ROS2 版本对应的包名通常为stage_ros2具体安装方式要看你的发行版是否直接提供了二进制包。尝试安装sudo apt install ros-humble-stage-ros2如果提示找不到包不要急直接从源码编译。首先安装依赖然后把仓库克隆到工作空间cd ~/ros2_ws/src git clone https://github.com/ros-simulation/stage_ros2.git cd ~/ros2_ws sudo apt install ros-humble-ros2-control ros-humble-geometry2 -y colcon build --packages-select stage_ros2Stage 的启动并不像 Gazebo 那样有一个固定的 roslaunch 命令而是需要在.world文件里定义机器人模型、激光雷达参数和环境地图。最常见的做法是先用 TurtleBot3 模型组合turtlebot3_gazebo包里的世界文件或者在stage_ros2示例世界文件中加入你的机器人模型。一个最小启动思路是export TURTLEBOT3_MODELburger ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py不过这是 Gazebo 的启动方式。如果你要跑 Stage通常需要自己写一个 launch 文件加载.world文件并启动机器人状态发布节点。这一段对新手来说是最容易卡住的建议直接先跑通下面 Ignition 的路线再回来对比 Stage 会更清晰。4.2 安装 Ignition / Gazebo 3D 仿真器Ignition 现在已经并入 Gazebo 体系版本命名比较乱。ROS2 Humble 搭配最多的是 Gazebo 11 经典版和 Ignition Fortress。如果你的系统是 Ubuntu 22.04安装经典 Gazebosudo apt install ros-humble-gazebo-ros-pkgs sudo apt install ros-humble-turtlebot3-gazebo如果你想用较新的 Ignition需要确认版本和 ROS2 的桥接包是否匹配。注意版本号Ignition Fortress 对应 v6Gazebo Harmonic 对应 v8热词里提到的ignition v8实际上是 Harmonic。Harmonic 在较新的 ROS2 版本上支持更好Humble 下如果要用需要确认ros_gz桥接包能正常工作。安装ros_gz桥接包的通用方式sudo apt install ros-humble-ros-gz如果发行版仓库没有就源码编译。启动 TurtleBot3 在 Gazebo 空地图中的典型命令export TURTLEBOT3_MODELburger ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py这个命令会同时启动 Gazebo 仿真环境和机器人的传感器、驱动节点。启动后你可以在 Gazebo 窗口里看到一台 TurtleBot3 机器人旁边有一些障碍物和墙壁。4.3 安装 SLAM 和 Nav2建图导航需要以下功能包sudo apt install ros-humble-slam-toolbox sudo apt install ros-humble-nav2-bringup sudo apt install ros-humble-cartographer cartographer-ros sudo apt install ros-humble-nav2-map-server sudo apt install ros-humble-robot-localization如果部分包名在软件源中找不到去对应的 GitHub 源码仓库编译安装。4.4 环境变量统一配置每次启动仿真前确保 TurtleBot3 模型变量已经设置export TURTLEBOT3_MODELburger也可以写进~/.bashrc中避免反复配置。如果你以后换用 waffle 或其他模型记得同步修改。5. 仿真环境启动Stage 与 Ignition 双实战仿真环境是整个全链路的基础。这一节要解决的问题是“机器人如何出现在仿真世界中并持续发布激光雷达、里程计和 TF”。5.1 Stage 仿真快速启动Stage 适合先做“最小闭环”验证。由于 Stage 的配置文件需要把机器人的传感器、运动模型和世界地图绑定在一起新手可以先用一个已经配置好的 2D 世界文件测试。假设你已经完成了stage_ros2的源码编译先查看自带示例cd ~/ros2_ws/src/stage_ros2 find . -name *.world -o -name *.launch.py找到示例后用如下方式启动ros2 launch stage_ros2 stage_ros2.launch.py启动成功后你会看到一个 2D 俯视窗口机器人是一个小矩形或圆圈。此时验证激光雷达话题ros2 topic list | grep scan ros2 topic echo /scan --once如果能看到ranges数组说明仿真雷达已经工作。Stage 的 CPU 占用非常低在普通笔记本上跑完全没压力适合反复测试 SLAM 参数和 Nav2 参数而不心疼性能。5.2 Ignition 3D 仿真启动如果 Stage 是“快速验证”Ignition/Gazebo 就是“接近真机验证”。启动 TurtleBot3 示例世界export TURTLEBOT3_MODELburger ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py启动后观察窗口机器人周围有圆柱、墙壁和箱子这些是给 SLAM 建图和 Nav2 避障用的典型障碍物。此时在 Rviz2 中查看机器人模型和传感器ros2 run rviz2 rviz2在 Rviz2 中添加RobotModel、LaserScan、TF显示模块你可以直观看到激光射线打在障碍物上形成的点云轮廓。这一步很关键因为后续 SLAM 建图效果好不好先看激光话题是否稳定。用工具检查话题频率ros2 topic hz /scan正常情况下激光话题频率应该在 5Hz 以上如果频率太低要么是仿真环境性能不足要么是 CPU 调度问题。5.3 手动控制机器人运动在建图之前先手动控制机器人转一圈感受运动模型是否正常。打开键盘控制节点ros2 run turtlebot3_teleop turtlebot3_teleop_key按下对应的方向键机器人前进、后退、旋转。如果你想让机器人持续走一个方形轨迹也可以不依赖键盘通过命令行直接发布速度指令ros2 topic pub /cmd_vel geometry_msgs/msg/Twist {linear: {x: 0.1, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.0}} --rate 10注意这里发布的速度指令会持续输出终端不要重复执行太多按CtrlC停止。这个命令可以用于批量测试机器人的运动响应例如在一个脚本里循环发送“前进 1 秒→旋转 1 秒→停止”模拟固定轨迹。6. SLAM 建图实战当仿真环境启动、话题正常时就可以开始建图了。本节先用 SLAM Toolbox 完成增量建图再介绍 Cartographer 方案最后把地图保存下来等待导航使用。6.1 SLAM Toolbox 建图SLAM Toolbox 是当前 Nav2 生态中最常用的激光 SLAM 方案尤其适合单线激光雷达和差速底盘。启动建图节点ros2 launch slam_toolbox online_async_launch.py这个命令会启动一个异步 SLAM 节点接收/scan激光数据、/odom 里程计数据和 TF 变换实时更新栅格地图。启动后打开 Rviz2添加Map显示模块选择map话题你会看到地图随着机器人移动逐渐扩展。接下来通过键盘控制机器人缓慢移动让机器人扫描整个环境。建图时注意机器人旋转速度不要过快激光容易产生畸变。经过回环位置时放慢速度让 SLAM 算法有足够数据完成闭环。如果地图里出现错位、重影先检查激光话题频率和 /odom 精度。6.2 使用 Cartographer 建图如果你需要更复杂的建图能力比如多楼层、不同传感器组合可以试 Cartographer。启动方式ros2 launch cartographer_ros cartographer.launch.py use_sim_time:trueCartographer 的配置文件比较繁琐新手建议先用 SLAM Toolbox 跑通全链路再回来研究 Cartographer 的参数调整。6.3 保存地图建图完成后保存地图供 Nav2 使用mkdir -p ~/robot_map ros2 run nav2_map_server map_saver_cli -f ~/robot_map/test_map保存成功后会在目录下生成test_map.pgm和test_map.yaml两个文件。test_map.pgm是图片格式的栅格地图test_map.yaml是元数据包含分辨率、原点坐标和占据阈值。打开test_map.yaml确认内容image: test_map.pgm mode: trinary resolution: 0.05 origin: [-10.0, -10.0, 0.0] negate: 0 occupied_thresh: 0.65 free_thresh: 0.25如果你要批量建图可以写一个简单的 Shell 脚本循环执行键盘控制、测量并保存多张地图。不过实际更常见的是用ros2 bag录制多段激光数据然后离线回放反复调整 SLAM 参数。这个思路放到后面的批量任务部分展开。7. Nav2 自主导航实战地图建好之后进入 Nav2 导航环节。Nav2 是一整套导航框架包含地图服务、定位、全局路径规划、局部路径规划、行为树恢复等模块。7.1 启动地图服务和 AMCL 定位导航需要一个静态地图服务和一个定位算法。启动 Nav2 完整导航栈export TURTLEBOT3_MODELburger ros2 launch nav2_bringup navigation_launch.py map:~/robot_map/test_map.yaml这个命令会启动 AMCL 自适应蒙特卡洛定位、Nav2 规划器、控制器和 Recovery 行为树。启动后打开 Rviz2添加Map显示模块选择map话题地图应该正常显示。如果第一次启动时地图显示全黑或偏移大概率是 TF 树不完整或定位初始姿态不对。此时点击 Rviz2 顶部工具栏的2D Pose Estimate在地图上给机器人一个初始位置和朝向。这个步骤非常重要AMCL 会在初始位置附近撒粒子如果初始姿态错得太多后面导航必然失败。7.2 设置导航目标点点击 Rviz2 的Nav2 Goal按钮在地图上选择一个目标点设置朝向。Nav2 会立刻规划一条从当前位置到目标点的路径并控制机器人沿路径移动。观察移动过程要注意几个指标全局路径是否平滑。机器人是否出现反复横摆或原地旋转。遇到障碍物时局部规划器是否成功避障。到达目标点后是否停止。如果机器人绕路或卡住优先检查地图是否有空洞或错误障碍物。代价地图参数是否合理比如机器人半径是否比实际偏大。速度控制器的最大线速度和角速度是否限制过小。局部代价地图的滚动窗口是否太小。7.3 使用命令行发布导航目标如果你不想每次手点 Rviz2可以写一个 Python 脚本通过 Nav2 的 Action 接口批量发送多个导航目标点。Nav2 使用的是 ROS2 Action类型为NavigateToPose。下面是一个最小 Python 示例import rclpy from rclpy.node import Node from geometry_msgs.msg import PoseStamped from nav2_msgs.action import NavigateToPose from rclpy.action import ActionClient class NavClient(Node): def __init__(self): super().__init__(nav_client) self.client ActionClient(self, NavigateToPose, navigate_to_pose) def send_goal(self, x, y, yaw): self.get_logger().info(fsend goal: ({x}, {y}, {yaw})) while not self.client.wait_for_server(timeout_sec1.0): self.get_logger().info(waiting for nav2 server...) goal NavigateToPose.Goal() goal.pose.header.frame_id map goal.pose.header.stamp self.get_clock().now().to_msg() goal.pose.pose.position.x x goal.pose.pose.position.y y goal.pose.pose.orientation.z float(yaw) self.client.send_goal_async(goal) def main(argsNone): rclpy.init(argsargs) node NavClient() node.send_goal(0.5, -0.3, 0.0) rclpy.spin(node) node.destroy_node() rclpy.shutdown() if __name__ __main__: main()把这个脚本放到~/ros2_ws/src/nav_test/nav_test/nav_client.py在setup.py中注册入口点后编译就可以用命令行批量测试多个目标点。更简单的做法是直接用下面的命令运行python3 nav_client.py注意这个脚本只是发送一个目标点如果你要连续巡检多个点位可以把目标点列表放进循环里并在每个目标之间等待result回调。7.4 Nav2 行为树和恢复机制Nav2 默认使用行为树来组织导航任务。当机器人遇到障碍物无法规划时行为树会尝试旋转、清除代价地图、重新规划等恢复动作。如果你发现机器人“卡住”后不恢复可以检查行为树 XML 中配置的恢复插件是否齐全。8. 接口调用与批量任务实践很多机器人学习者会忽略ROS2 的“接口”不只是话题订阅还包括服务、Action、参数服务器和 rosbag 数据回放。自动化测试时这些能力比鼠标点击高效得多。8.1 话题和服务接口检查运行中的节点、话题、服务列表可以直接用命令查看ros2 node list ros2 topic list ros2 service list ros2 action list在 SLAM 建图时保存地图就是一个服务调用ros2 service list | grep map查看某一个服务是否正常响应可以发起一次临时调用。例如触发 Nav2 的全局定位初始化这在需要批量测试不同初始位置时很有用。8.2 ros2 bag 录制与批量回放如果你需要调整 SLAM 参数而不想每次都让机器人重跑一遍最有效的方式是录制 rosbagmkdir -p ~/ros2_bag ros2 bag record -a -o ~/ros2_bag/test_scan录制完成后回放数据给 SLAM 节点ros2 bag play ~/ros2_bag/test_scan --loop用 rosbag 回放可以随意修改 SLAM 参数反复验证建图效果不用再控制机器人走一遍。这在“批量建图参数调优”场景下非常实用。8.3 批量保存地图脚本如果你想对比不同参数下保存的地图可以写一个循环脚本。例如每运行 30 秒自动保存一张地图并打上时间戳#!/bin/bash for i in {1..5} do sleep 30 ros2 run nav2_map_server map_saver_cli -f ~/robot_map/map_$i done这种方式适合批量测试不同 SLAM 参数的地图输出质量文件命名清晰不会互相覆盖。8.4 批量导航巡检示例对于 Nav2 导航最常见的批量任务是“多点巡检”。你可以用一个 Python 脚本维护目标点列表依次发送导航目标并在每个目标完成后记录是否到达goals [ (0.5, -0.3, 0.0), (1.0, 0.5, 1.57), (-0.8, 0.6, 3.14), (-0.5, -0.8, -1.57), ] for x, y, yaw in goals: node.send_goal(x, y, yaw) time.sleep(20)实际工程中还要增加反馈回调、超时判断和失败重试这里只是演示基本结构。9. 资源占用与性能观察很多初学者在仿真中跑 SLAM电脑风扇狂转以为是自己电脑不行。其实多数情况是同时开了太多重量级模块或者激光话题频率配置过高。9.1 观察系统负载系统负载用htop观察sudo apt install htop -y htop如果有独立显卡可以用nvidia-smi或nvtop查看 GPU 占用。如果只有核显Ignition 渲染压力全部在 CPU 上出现掉帧、画面卡顿都是正常现象。9.2 不同仿真环境的性能差异从定位上看Stage 是 2D 仿真只模拟激光雷达的距离测量和机器人运动学CPU 占用通常很低Ignition/Gazebo 是 3D 物理仿真要计算碰撞、刚体运动、渲染画面和激光传感器占用明显更高。具体数字和你的世界复杂度、机器人数量、障碍物数量强相关需以本机实际观察为准。9.3 降低负载的通用手段使用ros2 topic hz /scan检查传感器频率如果 SLAM 不需要过高频率可以在仿真 launch 中降低雷达发布频率。关闭 Gazebo 窗口后如果确认仿真进程已经退出再启动下一次仿真。残留进程会持续占用 CPU。用ros2 daemon stop清理 ROS2 守护进程避免话题发现缓慢。在笔记本上跑 Ignition 时把 Gazebo 图形界面分辨率调低或者使用无渲染模式启动。一次只启动一个 SLAM 方案不要同时跑 SLAM Toolbox 和 Cartographer。9.4 检查话题和 TF导航问题很多时候不在算法而在数据链路。用 tf2 工具查看 TF 树ros2 run tf2_tools view_frames这会生成frames.pdf里面记录了从map、odom、base_footprint到base_scan的坐标变换关系。如果某一帧变换缺失或跳变Nav2 会直接报错或规划失败。10. 常见问题与排查方法实测中比较容易遇到的问题基本集中在安装、依赖、TF 和地图这几个环节。10.1 安装阶段问题问题现象可能原因排查方式解决方案安装 ros-humble-desktop 时提示 E: Unable to locate package没有添加 ROS2 软件源或源地址错误检查/etc/apt/sources.list.d/ros2.list按第 3 节重新添加源再sudo apt update找不到 ros-humble-stage-ros2 包发行版仓库未收录该包apt search stage-ros2从源码 clone 编译colcon build 失败缺少依赖工作空间缺少依赖包运行rosdep install --from-paths src --ignore-src安装提示的依赖包启动 turtlebot3_gazebo 后模型不显示环境变量未设置echo $TURTLEBOT3_MODELexport TURTLEBOT3_MODELburger10.2 建图导航阶段问题问题现象可能原因排查方式解决方案SLAM 地图错位重影旋转太快、里程计不准、雷达频率不足检查 /odom 话题频率、激光频率放慢建图速度调整雷达话题频率检查 TFRviz2 中看不到地图Map 话题未选择或未启动 SLAMros2 topic list确认 map 话题选择正确话题确认 SLAM 节点正常Nav2 无法设置目标点地图坐标系、map 话题或定位未初始化检查 TF 树、AMCL 粒子分布使用 2D Pose Estimate 初始化定位机器人导航绕远路全局代价地图膨胀半径偏小查看全局代价地图参数增大机器人半径或膨胀层参数机器人卡住不移动局部规划器参数问题、行为树恢复失败观察行为树状态、检查 cmd_vel调整最大速度检查局部代价地图窗口报错 No transform from map to base_linkTF 树断裂ros2 run tf2_tools echo map base_link确认 nav2 和 robot_state_publisher 启动正常10.3 仿真性能问题如果整车仿真卡顿严重先关闭不必要的终端和显示窗口再用ros2 topic hz /scan确认雷达话题是否正常。如果雷达话题发布频率低于预期需要考虑降低激光采样数或在 launch 文件中调节 sensor 更新率。11. 最佳实践与使用建议整套链路跑通之后真正拉开差距的是工程化习惯。以下几件事是我认为值得提前养成的。第一第一次先小参数测试。不要一上来就调高激光频率、加很多障碍物。先用 Stage 或 Gazebo 默认世界跑通全链路再逐步增加复杂度。小参数意味着快速迭代能更快找到问题。第二保留一套最小可运行配置。把能成功建图导航的 launch 文件、参数文件、地图文件单独放一个目录做好备份。以后改坏了任何参数可以立刻回到这个稳定版本。第三模型文件、输入数据、输出结果分目录管理。建议以项目为单位建目录robot_project/ ├── maps/ ├── params/ ├── scripts/ ├── bags/ └── logs/这样批量建图保存的地图不会堆满 home 目录rosbag 回放、参数调优也不会互相干扰。第四批量任务要加日志和失败重试。如果你用脚本批量发送导航目标点必须在脚本里记录每个目标点是否成功到达、耗时多少、失败原因。批量测试最常见的坑是一个目标点失败后脚本继续发下一个目标最终所有目标点都失败。第五接口服务要控制访问范围。如果你把 Nav2 的 Action 接口开放到局域网要注意局域网内其他设备也有可能给机器人发送导航指令。测试时尽量让机器人的/cmd_vel只接受自己节点的指令不要在未授权环境下暴露控制接口。第六代码部署到真机前必须做安全确认。仿真里机器人撞墙没有成本真机撞墙就可能损坏硬件。真机测试前至少完成急停功能验证、速度上限检查、激光防撞层测试、运行区域人员清场。第七涉及地图数据和环境信息采集时要遵守平台与当地规定。不要用设备采集并发布敏感区域、未授权区域的地图数据也不要将包含地理特征的建图结果随意公开。12. 总结与下一步这条全链路最值得上手的地方是它把 ROS2 学习中的三块硬骨头一次串起来了仿真环境、SLAM 建图、Nav2 导航。单独跑通任何一个模块都不难难的是让它们在同一套 TF 树、同一个/scan话题、同一张地图下协同工作。建议你先在 Stage 里做最小闭环确认地图和导航能跑通再切换到 Ignition 做更接近真机的验证最后用 rosbag 录制一条固定路线反复调 SlAM 参数对比不同配置下的地图质量。最容易踩的坑是忽略 TF 树和定位初始化直接给 Nav2 发目标点结果机器人原地不动或者反向乱跑。后续可以继续扩展的方向也很多把slam_toolbox换成Cartographer对比效果加入 Realsense 或其他深度相机做视觉 SLAM把 Nav2 的全局路径规划器换成不同插件或者把仿真跑通的同一套接口接到micro-ROS单片机上控制真实差速小车底盘。到那个阶段你的工具箱里已经有完整的自主移动机器人全链路能力了。