2、ROS2基础与环境搭建:ROS2 Humble安装、工作空间创建、节点与话题通信机制、launch文件编写
好,咱们直接进入正题。这一章是整门课的基石,说白了就是先把“厨房”搭好,后面才能炒菜。ROS2 Humble是目前最稳定的长期支持版本,我个人建议新手直接选它,别折腾其他版本。
2.1 ROS2 Humble 安装:别踩我踩过的坑
安装其实不复杂,但有几个细节容易翻车。我当年第一次装ROS2的时候,就因为源没选对,折腾了一下午。
⚠️ 重要提醒: 请确保你的Ubuntu版本是22.04(Jammy)。Humble只支持这个版本,装错了系统会报依赖错误。
安装步骤其实就四步,我帮你梳理清楚:
- 设置语言环境:确保系统支持UTF-8
- 添加ROS2源:用官方源或者国内镜像源(推荐中科大或清华源)
- 安装桌面版:
sudo apt install ros-humble-desktop - 配置环境变量:把source命令加到.bashrc里
# 设置语言环境
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 -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 $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
# 安装桌面版(包含所有常用工具)
sudo apt update
sudo apt install ros-humble-desktop
# 配置环境变量(每次打开终端自动加载)
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc
💡 我的小技巧: 安装完成后,先跑一个
ros2 run demo_nodes_cpp talker 测试一下。如果能看到“Publishing: 'Hello World'”字样,说明安装成功了。
2.2 工作空间创建:你的代码仓库
工作空间(Workspace)说白了就是你的项目文件夹。ROS2里最常用的是colcon工作空间。我习惯把它建在~/ros2_ws下面,好找。
# 创建工作空间
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws
colcon build
# 每次编译后记得source一下
source install/setup.bash
这里有个坑——每次修改代码后都要重新编译。我曾经忘了编译,调试了半天才发现代码根本没更新。嗯,这种低级错误犯一次就够了。
📌 核心概念: 工作空间的结构是
src/(源码)→ build/(编译中间文件)→ install/(可执行文件)。你只需要关心 src/ 目录。
2.3 节点与话题通信机制:ROS2的灵魂
ROS2的核心思想就是“节点”和“话题”。你可以把节点想象成一个独立的小程序,话题就是它们之间传递消息的“管道”。
举个例子:一个摄像头节点发布图像数据到/camera/image话题,一个显示节点订阅这个话题,就能看到画面了。节点之间完全解耦,互不依赖。
2.3.1 创建一个简单的发布者节点
咱们用Python写一个最简单的发布者,每秒发一次“Hello ROS2”。
# talker.py
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
class TalkerNode(Node):
def __init__(self):
super().__init__('talker')
self.publisher = self.create_publisher(String, 'chatter', 10)
self.timer = self.create_timer(1.0, self.timer_callback)
self.get_logger().info('Talker节点已启动')
def timer_callback(self):
msg = String()
msg.data = 'Hello ROS2'
self.publisher.publish(msg)
self.get_logger().info(f'发布: {msg.data}')
def main(args=None):
rclpy.init(args=args)
node = TalkerNode()
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
2.3.2 创建订阅者节点
# listener.py
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
class ListenerNode(Node):
def __init__(self):
super().__init__('listener')
self.subscription = self.create_subscription(
String, 'chatter', self.listener_callback, 10)
self.get_logger().info('Listener节点已启动')
def listener_callback(self, msg):
self.get_logger().info(f'收到: {msg.data}')
def main(args=None):
rclpy.init(args=args)
node = ListenerNode()
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
💡 调试技巧: 用
ros2 topic list 查看所有话题,用 ros2 topic echo /chatter 实时查看消息内容。这两个命令我几乎天天用。
2.4 Launch文件编写:一键启动所有节点
手动启动每个节点太麻烦了。Launch文件就是帮你一键启动所有相关节点,还能配置参数。ROS2的Launch文件用Python写,比ROS1的XML灵活多了。
# talker_listener.launch.py
from launch import LaunchDescription
from launch_ros.actions import Node
def generate_launch_description():
return LaunchDescription([
Node(
package='my_package',
executable='talker',
name='talker_node',
output='screen'
),
Node(
package='my_package',
executable='listener',
name='listener_node',
output='screen'
),
])
启动方式很简单:
ros2 launch my_package talker_listener.launch.py
⚠️ 注意: Launch文件必须放在
launch/ 目录下,并且在 setup.py 或 setup.cfg 中配置好。否则ros2 launch找不到它。
2.5 知识体系总览
下面这张图帮你理清本章的核心逻辑。从安装到实战,每一步都是环环相扣的。
这张图把本章的知识点串起来了。你从安装开始,一步步走到Launch文件,就掌握了ROS2开发的基本流程。我在实际项目中,这套流程用了不下百次,非常稳定。
🎯 本章核心要点:
- ROS2 Humble 只支持 Ubuntu 22.04,别搞错版本
- 工作空间用
colcon build编译,别忘了 source - 节点是独立进程,话题是通信管道,两者解耦
- Launch文件用Python写,比ROS1更灵活
- 调试用
ros2 topic list/echo,效率翻倍
好了,这一章的内容就到这里。环境搭好了,下一章咱们就可以开始写真正的传感器驱动了。记住,基础打牢了,后面才飞得起来。