2、ROS2环境搭建:ROS2的安装、工作空间创建、依赖管理与编译测试
好,咱们正式开始动手。这一章,说白了就是给你的机器人开发环境“铺路”。路铺不好,后面跑起来全是坑。我见过太多新手卡在环境上,一卡就是半天,其实真没必要。
ROS2的安装,我推荐用二进制包的方式。别自己从源码编译,除非你有特殊需求。二进制安装快、稳、省心。我个人习惯用Humble Hawksbill版本,长期支持,社区活跃,坑少。
2.1 安装ROS2
先确认你的Ubuntu版本。ROS2 Humble对应的是Ubuntu 22.04。如果你用的是20.04,那就装Galactic或者Foxy。版本不对应,装不上,别问我怎么知道的——我当年就吃过这个亏。
安装步骤其实就几条命令,我帮你拆开讲:
- 设置语言环境:确保系统支持UTF-8。
- 添加ROS2软件源:把官方源加到apt列表里。
- 安装ROS2基础包:我建议装
ros-humble-desktop,包含了常用工具和模拟器。 - 安装编译工具:
colcon是ROS2的标配,后面编译全靠它。
核心命令示例:
sudo apt update
sudo apt install ros-humble-desktop
sudo apt install python3-colcon-common-extensions
小技巧:安装完成后,记得把ROS2的环境变量加到.bashrc里。这样每次打开终端就不用手动source了。命令是:echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
2.2 工作空间创建
工作空间,就是你写代码、放包的地方。ROS2里叫colcon workspace。结构很简单,就几个文件夹:
src:放你的功能包源码build:编译中间文件,不用管install:编译后的可执行文件和库log:编译日志
创建命令就三行:
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws
colcon build
嗯,这里要注意。第一次编译可能会报错,说缺依赖。别慌,这是正常的。ROS2的依赖管理机制比较严格,缺什么它会告诉你。
避坑指南:我曾经在创建工作空间时,把src目录名字写成了source,结果编译一直找不到包。折腾了半小时才发现。所以,目录名一定要严格按规范来。
2.3 依赖管理
ROS2的依赖管理,靠的是package.xml和rosdep。每个功能包都有一个package.xml,里面写明了这个包依赖哪些其他包。
你想想看,如果你写了一个传感器驱动包,它依赖rclcpp和sensor_msgs。那你在package.xml里就要声明:
<depend>rclcpp</depend>
<depend>sensor_msgs</depend>
然后运行rosdep install,它会自动帮你把依赖装好。我习惯在每次编译前都跑一遍:
rosdep install --from-paths src --ignore-src -r -y
个人经验:我在做多传感器融合项目时,依赖关系特别复杂。一个包依赖五六个其他包,层层嵌套。这时候rosdep就显神威了。手动装?那得装到天荒地老。
2.4 编译测试
编译用colcon build。但别急着直接敲,有几个参数你得知道:
| 参数 | 作用 | 我什么时候用 |
|---|---|---|
--symlink-install |
使用符号链接,修改代码后不用重新编译 | 开发调试阶段,省时间 |
--packages-select |
只编译指定包 | 只改了一个包,不想全量编译 |
--cmake-args -DCMAKE_BUILD_TYPE=Release |
Release模式编译,性能更好 | 准备部署到机器人上时 |
举个例子,我只想编译sensor_driver这个包:
colcon build --packages-select sensor_driver --symlink-install
编译完成后,别忘了source一下:
source install/setup.bash
然后你就可以运行你的节点了。比如:
ros2 run sensor_driver sensor_node
测试小技巧:我每次编译完,都会先跑一个ros2 topic list看看节点有没有正常发布话题。如果话题列表是空的,说明节点没跑起来,或者名字写错了。这招排查问题特别快。
知识体系总览
下面这张图,帮你把本章的核心逻辑串起来。从安装到编译,每一步都是环环相扣的:
说白了,环境搭建就这四步。每一步都不难,但顺序不能乱。我见过有人先建工作空间再装ROS2,结果编译时找不到头文件。嗯,这就是顺序搞反了。
最后提醒一句:每次打开新终端,记得先source一下环境。如果你忘了,节点会报找不到包的错误。别问我怎么知道的——我调试时至少被坑过十次。
好,环境搭好了,下一章咱们就开始写真正的传感器驱动代码了。