第2章:ROS2基础与环境搭建
各位同学,欢迎来到第二章。上一章我们聊了整体架构,这一章咱们得先把家伙事儿备齐了。
ROS2 Humble,这是咱们整个系统的地基。我见过太多人一上来就急着写代码,结果环境没配好,折腾半天全白费。别急,咱们一步步来。
2.1 为什么选ROS2 Humble?
ROS2版本不少,Foxy、Galactic、Humble、Iron...为什么我推荐Humble?
说白了,Humble是目前最稳的长期支持版(LTS),2024年5月才发布,支持到2029年。你想想看,咱们这个课程涉及MoveIt和Nav2,这两个大项目对ROS2版本的依赖很敏感。我去年帮一个客户调试抓取系统,他用的是Rolling版本,结果MoveIt2的某个API突然变了,折腾了两天才找到原因。
所以,听我的,用Humble,省心。
2.2 安装ROS2 Humble
安装过程其实不复杂,但有几个坑我得提前告诉你。
2.2.1 设置语言环境
先确保你的Ubuntu 22.04语言环境是UTF-8。我习惯这样检查:
locale # 看看有没有zh_CN.UTF-8或en_US.UTF-8
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
export LANG=en_US.UTF-8
嗯,这里要注意,如果你用的是中文系统,后面编译时有些日志会乱码。我个人建议用英文环境,省得后面排查问题还要猜日文。
2.2.2 添加ROS2源
sudo apt install software-properties-common
sudo add-apt-repository universe
sudo apt update && sudo apt install curl -y
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
sudo apt update
我曾经遇到过一个问题:curl下载ros.key时网络超时。如果你也遇到,试试挂个代理,或者直接手动下载放到对应目录。
2.2.3 安装桌面版(推荐)
sudo apt install ros-humble-desktop
这个包包含了Rviz2、Gazebo、各种常用工具。大概2-3GB,喝杯咖啡等一会儿。
ros-humble-ros-base,但后面做可视化调试会缺工具。我建议一步到位。
2.2.4 配置环境变量
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc
验证一下:
ros2 --version
如果看到类似 ros2 humble 的版本信息,恭喜你,装好了。
2.3 工作空间创建与Colcon编译
环境装好了,接下来咱们得建个工地——工作空间。
2.3.1 创建工作空间
mkdir -p ~/robot_ws/src
cd ~/robot_ws
这个 robot_ws 就是咱们整个项目的大本营。src目录放源码,build和install目录由编译工具自动生成。
2.3.2 安装Colcon
ROS2的编译工具是Colcon,取代了ROS1的Catkin。说实话,Colcon比Catkin快多了,尤其是增量编译时。
sudo apt install python3-colcon-common-extensions
2.3.3 第一个测试包
咱们先建一个最简单的包,验证整个流程:
cd ~/robot_ws/src
ros2 pkg create test_pkg --build-type ament_cmake
cd ~/robot_ws
colcon build
编译完成后,你会看到build、install、log三个目录。记得source一下:
source install/setup.bash
source ~/robot_ws/install/setup.bash,省得每次手动敲。
2.4 话题与服务基础
ROS2的核心通信机制就两个:话题(Topic)和服务(Service)。
你可以把话题想象成「广播电台」——发布者一直发,订阅者想听就听,双方不需要认识。服务则是「打电话」——你打过去,对方接,你问一句他答一句,一次性的。
2.4.1 话题实战
咱们用命令行感受一下:
# 终端1:启动一个发布者,每秒发一次"hello"
ros2 topic pub /chatter std_msgs/msg/String "data: 'Hello from robot'" --rate 1
# 终端2:订阅这个话题
ros2 topic echo /chatter
你会看到终端2不断收到消息。这就是话题通信。
我在项目中常用 ros2 topic list 查看所有话题,用 ros2 topic info /chatter 看发布者和订阅者数量。调试时特别好用。
2.4.2 服务实战
服务是一问一答的模式。ROS2内置了一个例子:
# 终端1:启动服务端
ros2 run examples_rclcpp_minimal_service service_main
# 终端2:调用服务
ros2 service call /add_two_ints example_interfaces/srv/AddTwoInts "{a: 5, b: 3}"
你会收到返回结果 sum: 8。
2.5 本章知识体系
下面这张图总结了咱们这一章的核心内容:
2.6 常见问题与避坑
| 问题 | 原因 | 解决方法 |
|---|---|---|
| colcon build报错找不到包 | 依赖没装全 | rosdep install --from-paths src --ignore-src -r -y |
| ros2 topic echo没反应 | 话题名拼写错误 | 用ros2 topic list确认准确名称 |
| source后还是找不到命令 | bashrc没生效 | 手动执行source ~/.bashrc或重启终端 |
| 编译速度慢 | 没开并行编译 | colcon build --parallel-workers 4 |
source install/setup.bash。
2.7 本章小结
这一章咱们干了三件事:
- 装好了ROS2 Humble,配好了环境
- 建了工作空间,学会了Colcon编译
- 动手试了话题和服务,感受了ROS2的通信方式
这些东西看着基础,但后面所有章节都建立在它们之上。尤其是话题和服务,你后面写MoveIt的规划请求、Nav2的导航指令,本质上都是在操作这些通信机制。
嗯,环境搭好了,下一章咱们开始让机器人动起来。