第二章:ROS2与开发环境搭建

说实话,每次带新人入行,最头疼的就是环境搭建这一步。我自己当年也在这上面栽过不少跟头——装了半天发现版本不对,或者编译到一半报个莫名其妙的错。嗯,这一章咱们就把这事彻底捋清楚。

2.1 为什么选择ROS2 Humble?

你可能要问:ROS2版本那么多,为啥偏偏选Humble?

我个人习惯是看长期支持版。Humble是2022年的LTS版本,支持到2027年。说白了,你学完这套东西,未来三五年内都不会过时。我在项目里踩过Foxy的坑——刚把项目做完,官方就停止维护了,那叫一个尴尬。

另外,Humble对Gazebo Fortress的支持最成熟。你想想看,如果选个太新的版本,很多第三方库还没适配,光是解决依赖就能耗掉你半天时间。

核心结论:ROS2 Humble + Ubuntu 22.04 是目前最稳的组合,没有之一。

2.2 安装ROS2 Humble

咱们直接上干货。我建议你用一个干净的Ubuntu 22.04系统,虚拟机或者双系统都行。WSL2也能用,但Gazebo的图形界面会有点麻烦。

2.2.1 设置软件源

sudo apt update && sudo apt install curl gnupg lsb-release
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 $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

这里有个坑:国内网络有时候连不上raw.githubusercontent.com。我曾经在客户现场折腾了一下午,最后发现是DNS解析的问题。你可以试试把上面的地址换成镜像源,比如清华或者中科大的。

2.2.2 安装桌面版

sudo apt update
sudo apt install ros-humble-desktop

这个包包含了Rviz2、TF2、各种常用工具。如果你硬盘空间紧张,可以装ros-humble-ros-base,但我不建议——少了可视化工具,调试起来真的很痛苦。

2.2.3 配置环境变量

echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc

验证一下:

ros2 run demo_nodes_cpp talker

如果能看到"Hello World"不断输出,恭喜你,ROS2装好了。

小技巧:我习惯在.bashrc里加一行export ROS_DOMAIN_ID=30。这样在多机器人场景下不会跟别人的节点冲突。你想想看,实验室里十几台电脑都用默认ID,那画面太美我不敢看。

2.3 安装Gazebo:Fortress还是Classic?

这个问题我经常被问到。直接说结论:

特性 Gazebo Classic (11) Gazebo Fortress
与ROS2集成 通过ros_ign_bridge 原生支持
性能 一般 更好,多核优化
学习资源 多,老项目多 少,但官方推荐
我的建议 维护老项目用 新项目首选

咱们这门课主要用Fortress。但我会在附录里讲一下Classic的迁移方法,毕竟很多开源项目还在用老版本。

2.3.1 安装Gazebo Fortress

sudo apt install ros-humble-ros-gz
sudo apt install gz-fortress

装完跑一下:

gz sim -v 4 -r shapes.sdf

如果看到一个窗口弹出,里面有各种几何体在动,那就对了。

注意:Fortress默认用OpenGL渲染。如果你在虚拟机里跑,记得开启3D加速。我曾经在VMware里没开这个选项,Gazebo直接黑屏,排查了半天才发现是这个问题。

2.3.2 安装Gazebo Classic(可选)

sudo apt install ros-humble-gazebo-ros-pkgs
sudo apt install gazebo11

如果你手头有老项目,装一个备用也行。但别两个同时跑,端口会冲突。

2.4 Nav2源码编译与依赖配置

终于到重头戏了。Nav2官方推荐用二进制安装,但我个人强烈建议你源码编译。为什么?

  • 你可以随时修改源码,调试行为树节点
  • 能拿到最新的bug修复
  • 编译过程本身就能帮你理解依赖关系

2.4.1 创建工作空间

mkdir -p ~/nav2_ws/src
cd ~/nav2_ws
colcon build

第一次编译会生成build、install、log三个目录。别慌,这是正常的。

2.4.2 克隆Nav2源码

cd ~/nav2_ws/src
git clone https://github.com/ros-planning/navigation2.git --branch humble

注意分支名一定要是humble。我见过有人直接clone master分支,结果编译到一半发现API对不上。

2.4.3 安装依赖

cd ~/nav2_ws
rosdep install -y -r -q --from-paths src --ignore-src

rosdep会自动解析所有依赖。如果遇到找不到的包,多半是源没配好。检查一下/etc/ros/rosdep/sources.list.d/20-default.list这个文件。

2.4.4 编译Nav2

colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release

这里我解释一下参数:

  • --symlink-install:用符号链接代替拷贝,改Python文件不用重新编译
  • -DCMAKE_BUILD_TYPE=Release:优化性能,Debug模式太慢了

第一次编译大概要20-30分钟,取决于你的CPU。去泡杯咖啡吧。

常见编译错误:

  • 找不到xxx.h: 多半是某个依赖没装全。运行rosdep install再试一次。
  • 链接错误: 试试colcon build --packages-select nav2_util单独编译出问题的包。
  • 内存不足: 加--parallel-workers 2限制并行任务数。

2.4.5 配置环境变量

echo "source ~/nav2_ws/install/setup.bash" >> ~/.bashrc
source ~/.bashrc

验证一下:

ros2 run nav2_util lifecycle_bringup --help

如果能看到帮助信息,说明Nav2已经成功加载了。

2.5 验证整个环境

咱们来个快速测试,确保所有组件能协同工作:

# 终端1:启动Gazebo
gz sim -v 4 -r empty.sdf

# 终端2:启动Nav2
ros2 launch nav2_bringup bringup_launch.py use_sim_time:=True

# 终端3:查看话题
ros2 topic list

你应该能看到/cmd_vel、/odom、/tf等话题。如果都有,恭喜你,环境搭建成功了!

我的经验:第一次跑通这个流程,我兴奋得差点把咖啡洒在键盘上。但别高兴太早——真正的挑战在后面的导航参数调优。不过那是后面章节的事了,咱们先把地基打牢。

2.6 本章知识体系

下面这张图帮你理清各组件之间的关系:

ROS2导航系统环境架构 Ubuntu 22.04 LTS ROS2 Humble Gazebo Fortress Nav2 (源码) Rviz2 + TF2 机器人自主导航应用

这张图展示了咱们搭建的完整技术栈。从底层的Ubuntu系统,到中间的ROS2通信层,再到上层的仿真、导航、可视化工具,最后汇聚到机器人导航应用。每一层都依赖下一层,缺一不可。

2.7 常见问题与排错

最后,分享几个我实际遇到过的问题:

  • Gazebo启动黑屏: 检查显卡驱动,或者试试export LIBGL_ALWAYS_SOFTWARE=1强制软件渲染
  • colcon build卡住: 看看是不是内存不够,free -h检查一下,少于4GB建议加swap
  • rosdep update失败: 手动下载https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list放到对应目录

环境搭建这事,说白了就是耐心活。我第一次配Nav2的时候,从下午两点搞到晚上十点,中间重装了三次系统。但当你看到机器人真的在Gazebo里动起来的那一刻,一切都值了。

可可精品资料库