简介本文以轮式巡检机器人为例应用场景能源设施配电房、高压变电站、电力设施场所巡检高校实验室铁路道路巡检等等场景硬件基本组成概述一下就是整个机器人是以控制单元为中心通过不同协议为桥梁连接的不同分支再由控制单元控制底盘分支自主运动的智能体。围绕控制单元大脑MCU/工控机分支包含从上到下眼睛云台-相机、雷达、红外传感器等鼻子气体、温湿度传感器等嘴巴耳朵音频控制处理单元等上肢机械臂、夹爪等下肢控制电机、驱动轮、万向轮等神经通讯模块各种网络 和 协议能量电池-供电系统自主导航技术在轮式巡检机器人上的落地要点室内变电站、配电房等场景2D 激光 IMU 轮式里程计是主力配置1、建图阶段SLAM(同时定位和构图)操作节点启动把相关节点都启动准备好一般都准备好的启动文件直接用ros2 launch slam slam.launch.py启动Rviz2打开系统的Rviz2可视化工具输入命令即可打开前提是rviz2包安装好rviz2出现当前机器人的定位和周边场景激光点云和栅格地图。扫描地图使用遥控手柄或指令控制机器人通常遥控手柄方便确保机器人状态定位初始数据显示效果都正常。姿态以imu校准好。控制机器人扫描全图完整。操作前提示‌确保机器人已停止运动地图构建稳定。确认 /map 话题中有数据发布可通过 ros2 topic echo /map 验证。保存路径需具有写入权限。保存地图Rviz2保存地图或者命令保存地图生成地图文件。Rviz2 工具保存功能打开插件1. 使用标准 nav2_map_server最通用1、保存为 YAML PGM 格式‌传统 2D 栅格地图文件输出map.pgm图片map.yaml配置文件ros2 service call /map_server/save_map nav2_msgs/srv/SaveMap {map_topic: /map, map_url: /home/user/my_map.yaml}2、保存为二进制格式‌可选某些配置下支持保存为 .bt 或其他格式具体取决于 map_server 的参数配置。2. 使用 slam_toolbox在线 SLAM 常用如果你使用 slam_toolbox 进行实时建图它提供了专门的服务来保存序列化地图或导出为标准格式。步骤‌1、保存为 SlamToolbox 专用格式.posegraph‌ros2 service call /slam_toolbox/save_map slam_toolbox/srv/SaveMap {name: my_map}2、导出为标准 YAML/PGM 地图‌slam_toolbox 通常不直接提供导出 YAML 的服务但你可以结合 map_server 使用或者使用其提供的工具节点将内部地图发布到 /map 话题再通过 map_server 保存。3. 使用特定机器人厂商工具如 PAL Robotics、Waveshare 等根据搜索结果不同硬件平台可能有专用的保存指令或脚本PAL Robotics‌在使用 pal_slam 模块建图完成后通常需要通过特定的脚本或服务保存。虽然文档未直接给出保存命令但通常遵循 ROS2 服务模式。建议检查是否有 pal_map_manager 或类似节点提供服务。Waveshare UGV Rover (Jetson Orin)‌在自动探索或手动建图结束后通常有专门的 launch 文件或脚本来保存地图。例如# 示例可能存在的保存脚本需参考具体 wiki ros2 run nav2_map_server map_saver_cli -f ~/my_map或者在 RViz 中通过插件触发保存Elephant Robotics (myAGV Pro)‌使用 point_lio 建图时停止节点后 .pcd 点云地图会自动保存到指定文件夹如 point_lio_ros2/PCD。对于 2D 栅格地图可能需要额外的转换步骤。4. 使用 map_saver_cli 工具推荐快捷方式ROS2 Navigation2 提供了一个命令行工具 map_saver_cli可以更方便地保存当前 /map 话题中的地图。命令# 安装工具如果未安装 sudo apt install ros-humble-nav2-map-server # 根据你的 ROS2 版本替换 humble # 保存地图 ros2 run nav2_map_server map_saver_cli -f ~/my_map_name-f指定保存文件的路径和前缀不含扩展名。该命令会自动生成 my_map_name.yaml 和 my_map_name.pgm。5、保存点云地图3D SLAM如果你使用的是 3D SLAM如 LIO-SAM、FAST-LIO、Point-LIO地图通常以 .pcd 或 .ply 格式保存。命令示例以 Point-LIO 为例停止建图节点后检查输出目录如 ~/agv_pro_ros2/point_lio_ros2/PCD。或者通过服务调用保存ros2 service call /save_pcd std_srvs/srv/Trigger场景推荐命令/方法说明标准 2D 栅格地图‌ros2 run nav2_map_server map_saver_cli -f ~/map最通用生成 .yaml .pgm‌slam_toolbox‌ros2 service call /slam_toolbox/save_map ...保存内部状态便于后续加载继续建图3D 点云地图‌检查 SLAM 节点输出目录或调用 save_pcd 服务生成 .pcd 或 .ply 文件‌厂商专用平台‌查阅对应 Wiki如 Waveshare、PAL可能有自动化脚本或特定服务2、运行阶段Nav2利用建好的地图实现全局定位和路径规划自主导航运动。导航和路径规划Nav2Navigation 2是 ROS2 生态中生产级的自主导航框架Nav2 不仅支持机器人从起点移动到终点还能处理复杂的任务逻辑如对象跟随、全覆盖导航等适用于各种运动学模型差分驱动、全向轮、阿克曼转向等和传感器配置的移动机器人。1. 核心架构基于行为树的服务化设计Nav2 采用模块化、服务化的架构通过‌行为树Behavior Trees, BT‌来协调各个独立的功能模块。这种设计使得导航逻辑更加灵活、可定制且易于调试。主要服务器组件Nav2 由多个独立的服务器组成它们通过 ROS2 接口Action Server 或 Service进行通信Map Server地图服务器‌1、发布静态地图数据为规划器、代价地图和定位模块提供统一的世界坐标系参考。2、支持多种地图格式如 YAML/PGM栅格地图。Planner Server全局规划服务器‌负责计算从起点到目标点的‌全局路径‌。1、使用配置的全局规划插件如 NavFn、SmacPlanner、Theta* 等。2、考虑静态障碍物生成一条无碰撞的最优或次优路径。Controller Server局部控制服务器‌1、负责跟踪全局路径生成机器人的实时速度指令线速度和角速度。2、使用局部控制器插件如 Regulated Pure Pursuit、DWB、MPPI 等。3、结合动态障碍物信息确保机器人在运动中避障。Behavior Server行为服务器‌1、执行特定的恢复行为或复杂动作如“原地旋转”、“后退”、“等待”等。2、当导航受阻时行为树会调用这些行为来尝试脱困。BT Navigator行为树导航器‌1、整个导航系统的“大脑”。它加载并执行行为树文件.bt.xml。2、根据各个服务器返回的状态成功、失败、运行中动态决定下一步执行哪个节点例如3、如果规划失败则尝试重新规划或执行恢复行为。2. 导航工作流程一个典型的 Nav2 导航任务流程如下1、初始化‌加载地图、启动定位模块如 AMCL 或 Robot Localization、初始化各服务器。加载行为树配置文件。2、接收目标‌用户通过 RViz2 或代码发送目标位姿Goal Pose。3、行为树执行‌Compute Path‌BT 调用 Planner Server 计算全局路径。Follow Path‌BT 调用 Controller Server 跟踪路径。Check Conditions‌实时监控机器人状态是否偏离路径、是否碰撞、是否到达目标。4、动态调整与恢复‌如果 Controller 发现前方有动态障碍物它会局部调整速度或轨迹。如果 Planner 发现全局路径被阻断BT 可能触发“重新规划”节点。如果机器人陷入困境如长时间无法移动BT 会触发恢复行为如 Spin 旋转清除局部代价地图或 Back Up 后退。5、完成任务‌当机器人到达目标位置且误差在允许范围内BT 返回成功导航结束。3. 关键技术与插件系统Nav2 的强大之处在于其高度可插拔的插件系统用户可以根据机器人特性选择合适的算法。全局规划器Global Planners》》NavFn‌经典的 Dijkstra/A* 算法实现计算速度快适合简单环境。》》SmacPlanner‌基于混合 A* 算法支持非全向机器人如阿克曼转向车辆的运动学约束能生成更平滑、符合车辆运动特性的路径。》》Theta*‌生成更少拐点的路径适合需要减少转向次数的场景。局部控制器Local Controllers》》Regulated Pure Pursuit (RPP)‌一种改进的纯追踪算法引入了调节机制以处理接近目标时的振荡问题稳定性好计算量小。》》DWB (Dynamic Window Approach)‌动态窗口法通过在速度空间中采样来评估轨迹擅长动态避障。》》MPPI (Model Predictive Path Integral)‌模型预测路径积分控制适用于高动态、高精度的控制需求但计算开销较大。代价地图Costmaps》》Static Layer‌静态障碍物层来自地图服务器。》》Obstacle Layer‌动态障碍物层来自激光雷达或深度相机数据。》》Inflation Layer‌膨胀层将障碍物周围区域标记为危险区确保机器人与障碍物保持安全距离。》》Voxel Layer‌用于 3D 点云数据的代价地图生成。4. 自定义导航策略通过修改行为树Behavior Tree用户可以轻松实现复杂的导航逻辑而无需重写底层代码。5. 适用场景与优势1、多场景适配‌无论是室内仓储物流机器人、室外配送机器人还是农业、矿山特种车辆Nav2 都能通过配置不同的插件和行为树来适应。2、生产级稳定性‌经过全球 300 公司的验证具备完善的错误处理、日志记录和监控工具。3、社区与生态‌作为 ROS2 官方推荐的导航框架拥有活跃的社区和丰富的教程、示例代码。1、在ros2系统启动Nav2指令启动前的必要检查在执行启动指令前请确保以下条件已满足1、环境变量已加载‌source /opt/ros/humble/setup.bash source ~/your_ws/install/setup.bash # 如果有工作空间2、TF 坐标变换正常‌确保 /tf 话题中有 map - odom - base_link 的完整变换链。如果缺少 TFNav2 无法计算路径。3、地图数据存在‌如果使用静态地图确保 map_server 已成功加载地图并发布 /map 话题。4、时钟同步‌仿真环境下务必使用 use_sim_time:true。完整Bringup启动含地图、定位与导航如果你需要从加载地图、启动 AMCL 定位到启动导航栈的一整套流程通常使用 tb3_simulation_launch.py针对 TurtleBot3或自定义的 bringup launch 文件。对于通用机器人可以组合启动# 1. 启动地图服务器 (假设已有 map.yaml) ros2 run nav2_map_server map_server --ros-args -p yaml_filename:/path/to/map.yaml # 2. 启动 Nav2 导航栈 ros2 launch nav2_bringup navigation_launch.py注意在实际项目中通常会将地图加载、AMCL 定位和 Nav2 导航封装在一个总的 launch 文件中例如 bringup_launch.py。2. 常见故障排查》》节点启动后立即退出‌检查参数文件中的插件名称是否正确以及依赖库是否安装。》》无法规划路径‌检查 global_costmap 和 local_costmap 是否正确订阅了激光雷达或深度相机话题以及 TF 变换是否连续。》》生命周期状态卡住‌使用 ros2 lifecycle get /controller_server 等命令检查各节点状态确保所有节点都进入 active 状态。单点导航1、初始化位姿2、设定目标位姿设定完毕松开左键后机器人自动化移动到目标位置以及保持对应方向单个机器人多点导航如果你希望一个机器人按照预设的顺序依次访问多个点A - B - C最标准的方法是使用 Nav2 自带的 ‌Waypoint Follower‌功能。1、初始化2、终端命令行窗口输入多点导航指令启动 Nav2 导航栈‌ros2 launch nav2_bringup navigation_launch.py use_sim_time:true启动航点跟随器‌ros2 run nav2_waypoint_follower nav2_waypoint_follower发送航点列表‌你需要编写一个简单的 Python 脚本或使用ros2 topic pub向/follow_waypoints话题发送nav2_msgs/msg/WaypointSequence消息。launchd多点导航服务后点选多点导航按钮设置每一次的目标位姿即可。提高导航精准1、加反光板、二维码、UWB 做绝对位置校正把定位精度从分米级提到厘米级2、最大坑长走廊、空旷大厅、玻璃幕墙导致特征退化匹配失准 → 需靠反光板、里程计约束兜底总结概述为由感知层的不同传感器融合感知驱动轮定位层判断决策层实现构建地图导航线路规划控制单元执行层实现自主避障导航运动定义SLAM 的全称是 Simultaneous Localization and Mapping同时定位与建图​。之所以要同时是因为单看任何一半都做不成想靠观测算出自己在地图的哪个位置 → 前提是已有地图想把观测数据拼成地图 → 前提是知道自己每一步在哪解法是退一步不把位姿和地图当成已知量而是当成两组待求的未知量用同一批观测数据一起解。用概率语言写就是求 P(机器人轨迹, 地图 | 观测序列)——这是 SLAM 的数学定义。1、感知层摄像机 imu姿态仪 2d/3d激光雷达环境感知 其他技术UWB2、定位层轮式里程计odom融合imuodom结合输出平滑位姿数据12融合感知通过行程数据设备姿态纠错消除里程偏差数据周围环境状态综合计算数据上报3、slam/导航决策层接受融合位姿数据激光点云构建地图、规划路线、控制单元下发指令给底盘实现自动化控制运动。4、执行层底盘麦克纳姆轮查分底盘接收导航指令完成运动测试项目本文简单介绍机器人 自研项目 全流程的测试内容。更详细的请看另一篇文章嵌入式测试阶段测试研发流程机器人测试涉及范畴: /通讯测试/模块测试/集成测试/整机测试从V型图可以看出实际工作时从需求立项测试都全程参与开发每一个阶段都可能需要测试介入但真正测试就是开发完成的每个部件每个子系统后测试开始执行测试。立项需求评审——————》整机测试、验收测试---》最后量产系统方案设计框架/接口定义——————》 集成测试、通讯模块测试部件实现机器人外设硬件功能——————》模块测试、功能测试仿真测试在虚拟环境中用数学模型模拟 机器人本体、传感器和运行环境 在不依赖或少依赖真机的情况下验证算法与系统。它是上轮 V 型模型中贯穿底部的那条主线核心思想是 仿真先行、真机后置。一、在环递进真实成分逐级增加阶段真实的部分仿真的部分主要验证MIL模型在环无全部控制律、算法逻辑Simulink 建模SIL软件在环实际代码C/Python环境 本体ROS 节点、导航/SLAM 算法在环运行HIL硬件在环真实控制器/ECU环境 本体实时性、接口协议、时序真机测试全部无最终功能与安全确认每升一级假的成分减少一分成本和风险增加一分——所以能在仿真里发现的问题绝不留到真机。二、仿真平台的四层组成1. 物理引擎 刚体动力学、碰撞检测、摩擦接触MuJoCo、Bullet、PhysX、ODE2. 传感器仿真 激光雷达点云、相机成像、IMU/GPS含噪声、延迟建模高端平台用 GPU 光线追踪逼真渲染3. 环境建模 真实场地的数字孪生、行人车辆等动态物、光照天气变化4. 场景与随机化 危险工况场景库、域随机化服务强化学习、接入 CI/CD 做每日回归三、常用工具- Gazebo ROS 生态标配移动机器人首选- NVIDIA Isaac Sim GPU 光追 大规模并行适合 RL 训练与合成数据- CoppeliaSim / Webots 通用多体仿真教学与原型友好- MuJoCo / PyBullet 轻量物理引擎强化学习研究主流- CARLA / AirSim 自动驾驶 / 无人机专用- MATLAB/Simulink 控制建模与 MIL 环节的标准工具四、典型用途1. 算法前期验证 SLAM、导航、控制律先在仿真跑通再上真机2. 危险与极限场景 碰撞、跌落、急停、传感器失效——真机上不敢做或做一次坏一次的3. 大规模回归 CI/CD 每晚自动跑成百上千个场景防止改代码改出新 bug4. 强化学习训练与域随机化 在仿真中百万次试错再迁移到真机5. 数字孪生与问题复现 现场出现的问题在孪生体中还原、定位、验证修复五、优势与局限优势 零风险零损耗、可大规模并行、结果可复现、能覆盖真机难以构造的极端工况、可全自动 7×24 运行。局限 - Sim2Real 差距 是核心难题——物理保真度摩擦、接触、执行器延迟和传感器真实性做不到 100%仿真通过 ≠ 真机通过- 高保真建模成本高精细数字孪生耗时耗力- 安全认证类测试急停距离、碰撞安全最终必须以真机为准总结机器人测试从测试流程上讲测试依据分析prd、通讯协议文档、设计测试用例会经历用例评审执行测试提交bug回归验证提交测试报告。从开发阶段来讲工程师完成机器人的各部件后的功能测试、模块测试再进一步组装后的集成测试、通讯测试到最后全部功能实现进行整机测试、验收测试。最后进行量产再到现场交付验证从仿真阶段来讲MIL-SIL-HIL,也就是开发之初的纯软件模型机的验证为后续开发硬件引入做铺垫验证算法、结构、力学等方面的可行性与实际功能性。再然后就是软件在环测试类似联调验证软件系统和硬件联调一步一步验证硬件的功能实现和问题修改。最后就是硬件在环测试在可控的环境内实现硬件自主可控的验证从基本功能到完善详细的功能灵活熟悉实现。最后就可以进行量产交付客户现场验证演示的过程。