简介
本文以轮式巡检机器人为例:
应用场景
能源设施配电房、高压变电站、电力设施场所巡检
高校实验室
铁路道路巡检等等场景
硬件基本组成
概述一下就是整个机器人是以控制单元为中心,通过不同协议为桥梁连接的不同分支,再由控制单元控制底盘分支自主运动的智能体。
围绕控制单元(大脑: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利用建好的地图实现全局定位和路径规划,自主导航运动。
导航和路径规划
Nav2(Navigation 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 的完整变换链。如果缺少 TF,Nav2 无法计算路径。
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激光雷达(环境感知)+ 其他技术UWB
2、定位层:轮式里程计odom+融合(imu+odom结合输出平滑位姿数据)
1+2:融合感知,通过行程数据+设备姿态纠错,消除里程偏差数据+周围环境状态:综合计算数据上报
3、slam/导航决策层:接受融合位姿数据+激光点云,构建地图、规划路线、控制单元下发指令给底盘实现自动化控制运动。
4、执行层:底盘:麦克纳姆轮+查分底盘(接收导航指令完成运动)
测试项目
本文简单介绍机器人 自研项目 全流程的测试内容。更详细的请看另一篇文章:嵌入式测试
阶段测试
研发流程
机器人测试涉及范畴: /通讯测试/模块测试/集成测试/整机测试
从V型图可以看出,实际工作时从需求立项测试都全程参与,开发每一个阶段都可能需要测试介入,但真正测试就是开发完成的每个部件,每个子系统后测试开始执行测试。
立项需求评审——————》整机测试、验收测试---》最后量产
系统方案设计:框架/接口定义——————》 集成测试、通讯模块测试
部件实现:机器人外设硬件功能——————》模块测试、功能测试
仿真测试
在虚拟环境中用数学模型模拟 机器人本体、传感器和运行环境 ,在不依赖或少依赖真机的情况下验证算法与系统。它是上轮 V 型模型中贯穿底部的那条主线,核心思想是: 仿真先行、真机后置。
一、在环递进:真实成分逐级增加
| 阶段 | 真实的部分 | 仿真的部分 | 主要验证 |
| MIL模型在环 | 无 | 全部 | 控制律、算法逻辑(Simulink 建模) |
| SIL软件在环 | 实际代码(C++/Python | 环境 + 本体 | ROS 节点、导航/SLAM 算法在环运行 |
| HIL硬件在环 | 真实控制器/ECU | 环境 + 本体 | 实时性、接口协议、时序 |
| 真机测试 | 全部 | 无 | 最终功能与安全确认 |
每升一级,"假"的成分减少一分,成本和风险增加一分——所以能在仿真里发现的问题,绝不留到真机。
二、仿真平台的四层组成
1. 物理引擎 :刚体动力学、碰撞检测、摩擦接触(MuJoCo、Bullet、PhysX、ODE)
2. 传感器仿真 :激光雷达点云、相机成像、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 :每晚自动跑成百上千个场景,防止改代码改出新 bug
4. 强化学习训练与域随机化 :在仿真中百万次试错,再迁移到真机
5. 数字孪生与问题复现 :现场出现的问题在孪生体中还原、定位、验证修复
五、优势与局限
优势 :零风险零损耗、可大规模并行、结果可复现、能覆盖真机难以构造的极端工况、可全自动 7×24 运行。
局限 :
- Sim2Real 差距 是核心难题——物理保真度(摩擦、接触、执行器延迟)和传感器真实性做不到 100%,仿真通过 ≠ 真机通过
- 高保真建模成本高(精细数字孪生耗时耗力)
- 安全认证类测试(急停距离、碰撞安全)最终必须以真机为准
总结
机器人测试:
从测试流程上讲:测试依据分析prd、通讯协议文档、设计测试用例,会经历用例评审,执行测试,提交bug,回归验证,提交测试报告。
从开发阶段来讲:工程师完成机器人的各部件后的功能测试、模块测试,再进一步组装后的集成测试、通讯测试,到最后全部功能实现,进行整机测试、验收测试。最后进行量产,再到现场交付验证
从仿真阶段来讲:MIL->SIL->HIL,也就是开发之初的纯软件模型机的验证,为后续开发硬件引入做铺垫,验证算法、结构、力学等方面的可行性与实际功能性。再然后就是软件在环测试,类似联调验证,软件系统和硬件联调,一步一步验证硬件的功能实现和问题修改。最后就是硬件在环测试,在可控的环境内实现硬件自主可控的验证从基本功能到完善详细的功能灵活熟悉实现。最后就可以进行量产,交付,客户现场验证演示的过程。