一、ROS2与导航系统概述
各位同学,欢迎来到这门实战课。我是你们的讲师,一个在机器人导航领域摸爬滚打多年的工程师。今天咱们聊聊ROS2和导航系统的基础。
说实话,我刚接触机器人时,最头疼的就是导航。小车动不动就撞墙,定位飘得离谱。后来我才明白——不是算法不行,是基础没打牢。所以这一章,咱们把地基夯实。
1.1 ROS2核心概念
ROS2不是简单的版本升级。它是一次重构。为什么要有ROS2?因为ROS1的设计初衷是科研原型验证,到了工业场景,实时性、安全性、多机通信全成了短板。
ROS2的核心,我总结为四个关键词:
- 节点(Node):每个节点是一个独立进程。我习惯把节点想象成「一个人」,各司其职。
- 话题(Topic):节点间的异步通信管道。说白了就是「广播」,谁想听谁听。
- 服务(Service):同步的请求-响应模式。像打电话,你问一句,对方答一句。
- 动作(Action):带反馈的长时间任务。比如导航到目标点,中途能告诉你「走到哪了」。
我的经验之谈:刚学ROS2时,别纠结于底层DDS实现。先把节点、话题、服务、动作这四个概念玩熟。我在项目里见过太多人一上来就研究DDS配置,结果连个话题都发不出去。
还有一个重要概念——QoS(服务质量)。这是ROS2对比ROS1最大的改进。你可以控制消息的可靠性、历史记录深度等。举个例子:
# 设置可靠传输,保留最近10条消息
from rclpy.qos import QoSProfile, ReliabilityPolicy, HistoryPolicy
qos = QoSProfile(
reliability=ReliabilityPolicy.RELIABLE,
history=HistoryPolicy.KEEP_LAST,
depth=10
)
嗯,这里要注意:激光雷达数据通常用BEST_EFFORT(尽力传输),因为丢几帧没关系,但延迟不能高。而/cmd_vel这种控制指令,必须用RELIABLE,丢包了车就乱跑了。
1.2 导航系统架构
一个完整的导航系统,说白了就是回答三个问题:
- 我在哪? —— 定位(Localization)
- 我要去哪? —— 路径规划(Path Planning)
- 我怎么去? —— 控制执行(Control)
这三者环环相扣。定位不准,规划出来的路径就是错的;规划不合理,控制再精准也没用。
下面这张图是我自己画的导航系统架构,你看一眼就明白了:
你看,传感器数据进来后,定位模块先告诉你「我在哪」。然后全局规划器算出一条大路,局部规划器再根据实时障碍物微调路径。最后输出速度指令给底盘。
避坑指南:我曾经在一个项目中,全局规划器跑得飞快,但局部规划器参数没调好,小车在门口来回摇摆就是出不去。后来发现是局部规划器的「前瞻距离」设得太短。这种问题,光看代码是看不出来的,得跑起来看可视化。
1.3 Nav2框架介绍
Nav2是ROS2官方推荐的导航框架。它不是一个单一功能包,而是一整套「导航解决方案」。我把它比作一个乐高套装——你需要什么模块,就拼什么模块。
Nav2的核心组件包括:
| 组件 | 功能 | 我常用的配置 |
|---|---|---|
| planner_server | 全局路径规划 | NavFn(轻量)或 Smac Hybrid-A*(精准) |
| controller_server | 局部路径跟踪 | DWB(参数多但灵活) |
| bt_navigator | 行为树导航 | 默认行为树,复杂场景自定义 |
| amcl | 自适应蒙特卡洛定位 | 粒子数500,更新频率10Hz |
| map_server | 地图加载与发布 | YAML配置文件指定地图路径 |
Nav2最大的亮点是引入了行为树(Behavior Tree)。你想想看,传统导航是写死的状态机——「先定位,再规划,再控制」。但实际场景中,你可能需要「定位失败就重试」「遇到动态障碍就绕行」「到达目标点后执行动作」。行为树让这些逻辑变得可配置、可复用。
个人习惯:我一般不会直接修改Nav2的C++源码。而是通过YAML参数文件和自定义行为树节点来适配我的机器人。这样升级Nav2版本时,我的改动不会丢失。
1.4 环境搭建与验证
好了,理论说完了,咱们动手。环境搭建这一步,我建议你严格按照以下步骤来,别跳步。我在培训新人时发现,90%的问题出在环境不一致。
第一步:安装ROS2 Humble
# 设置locale
sudo apt update && sudo apt install locales
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
# 添加ROS2源
sudo apt install software-properties-common
sudo add-apt-repository universe
sudo apt update && sudo apt install curl
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
# 安装ROS2 Humble桌面版
sudo apt update
sudo apt install ros-humble-desktop
第二步:安装Nav2
sudo apt install ros-humble-navigation2
sudo apt install ros-humble-nav2-bringup
第三步:验证安装
我个人习惯用一个小测试来验证环境是否正常。启动一个简单的仿真:
# 终端1:启动Gazebo仿真环境
ros2 launch nav2_bringup tb3_simulation_launch.py
# 终端2:打开RViz查看
ros2 run rviz2 rviz2 -d $(ros2 pkg prefix nav2_bringup)/share/nav2_bringup/rviz/nav2_default_view.rviz
如果一切正常,你会看到一个小车在仿真环境中,RViz里显示激光雷达数据和地图。
注意:如果你用的是虚拟机,Gazebo可能会很卡。我建议直接装双系统或者用Docker。我曾经在虚拟机上折腾了一整天,最后发现是3D加速没开。嗯,这种坑踩过一次就够了。
验证完成后,你可以用RViz的「2D Nav Goal」按钮,点击地图上的任意位置,小车就会自己导航过去。如果成功了,恭喜你——你的ROS2导航环境已经搭建完毕。
小技巧:第一次运行Nav2时,记得检查终端输出有没有「Map received」和「Initial pose received」这两条日志。缺一条,导航都跑不起来。这是我最常用的排障方法。