3、Carla与ROS2联合仿真系统搭建:ROS2 Humble 基础安装与核心概念
好,我们正式开始搭建联合仿真系统。这一章,咱们先把ROS2 Humble搞定。
说实话,ROS2的版本选型我纠结过一阵子。Galactic太老,Rolling太新不稳定。Humble是LTS版本,支持到2027年。我个人习惯是,做工程选LTS,准没错。
3.1 为什么是ROS2 Humble?
你可能要问,ROS1不也挺好吗?嗯,这里要注意——Carla 0.9.14之后,官方明确推荐ROS2。而且ROS1的通信机制在实时性上确实有点吃力。我在项目中遇到过,多车协同仿真时,ROS1的topic延迟直接飙到200ms,车都撞了消息还没到。
ROS2 Humble基于Ubuntu 22.04,底层用DDS通信。说白了,就是给自动驾驶这种实时要求高的场景量身定做的。
核心优势:
- 分布式通信,节点挂了不影响全局
- QoS策略,可以精细控制消息可靠性
- 支持多机器人协同,Carla多车场景必备
3.2 安装前的准备工作
先检查你的环境。我建议用Ubuntu 22.04 Desktop版,Server版也行,但调试时没图形界面挺痛苦的。
# 检查系统版本
lsb_release -a
# 设置语言环境
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
记得把软件源换成国内的。我曾经因为没换源,下载ros-humble-desktop花了三个小时。换成清华源后,十分钟搞定。
3.3 正式安装ROS2 Humble
安装过程其实不复杂,但有几个坑。我一步步来。
# 添加ROS2源
sudo apt install software-properties-common
sudo add-apt-repository universe
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
sudo apt update
避坑指南:我曾经在添加密钥时,直接用了curl命令没加sudo,结果密钥没写入正确位置,后面安装一直报错。记得每一步都检查权限。
# 安装桌面版(推荐)
sudo apt install ros-humble-desktop
# 或者最小安装(如果你硬盘空间紧张)
# sudo apt install ros-humble-ros-base
安装完成后,验证一下:
# 打开终端1
source /opt/ros/humble/setup.bash
ros2 run demo_nodes_cpp talker
# 打开终端2
source /opt/ros/humble/setup.bash
ros2 run demo_nodes_py listener
如果你看到talker在发"Hello World",listener在收,那就成了。我第一次看到这个输出时,还挺有成就感的。
3.4 核心概念:节点、话题、服务
ROS2的核心概念其实就三个:节点、话题、服务。你想想看,整个自动驾驶系统就是一堆节点在互相说话。
| 概念 | 类比 | Carla场景中的应用 |
|---|---|---|
| 节点 | 一个独立的工作单元 | 车辆控制节点、传感器节点 |
| 话题 | 广播频道,一对多 | 摄像头图像、激光雷达点云 |
| 服务 | 电话通话,一对一 | 请求生成车辆、设置天气 |
节点(Node):说白了就是可执行程序。每个节点只干一件事。比如Carla中的ego_vehicle节点,只管控制主车。
# 查看所有节点
ros2 node list
# 查看节点信息
ros2 node info /carla/ego_vehicle
话题(Topic):节点之间通信的通道。我习惯用ros2 topic echo来调试,看数据对不对。
# 查看话题列表
ros2 topic list
# 实时查看话题数据
ros2 topic echo /carla/ego_vehicle/velocity_status
小技巧:调试时加个--once参数,只打印一次数据,省得刷屏。比如ros2 topic echo /carla/ego_vehicle/velocity_status --once
服务(Service):请求-响应模式。比如你要在Carla中生成一辆车,就得调服务。
# 查看服务列表
ros2 service list
# 调用服务
ros2 service call /spawn_vehicle carla_msgs/srv/SpawnObject "{...}"
3.5 工作空间与包管理
工作空间就是你的项目文件夹。我习惯叫carla_ws。
# 创建工作空间
mkdir -p ~/carla_ws/src
cd ~/carla_ws
colcon build
# 每次新开终端都要source
source install/setup.bash
创建自己的包:
cd ~/carla_ws/src
ros2 pkg create carla_controller --build-type ament_python --dependencies rclpy std_msgs
cd ~/carla_ws
colcon build
嗯,这里要注意——包名不要用大写字母,ROS2的规范是全小写加下划线。我曾经因为用了大写,编译报错找了半天。
3.6 启动文件(Launch)
手动启动每个节点太麻烦了。Launch文件就是用来一键启动的。
# 创建launch文件
mkdir -p ~/carla_ws/src/carla_controller/launch
touch ~/carla_ws/src/carla_controller/launch/carla_bridge.launch.py
一个简单的launch文件示例:
from launch import LaunchDescription
from launch_ros.actions import Node
def generate_launch_description():
return LaunchDescription([
Node(
package='carla_ros_bridge',
executable='carla_ros_bridge',
name='carla_bridge',
parameters=[{'host': 'localhost', 'port': 2000}]
),
Node(
package='carla_controller',
executable='controller_node',
name='ego_controller'
)
])
启动方式:
ros2 launch carla_controller carla_bridge.launch.py
个人经验:我建议把launch文件放在包的launch目录下,不要乱放。项目大了之后,找launch文件会疯的。
3.7 调试工具速览
这几个命令我每天用,你最好也记住:
ros2 topic list- 看有哪些话题ros2 topic echo /topic_name- 看话题数据ros2 node info /node_name- 看节点详情rqt_graph- 图形化看节点关系ros2 bag record -a- 录制数据包,回放用
rqt_graph特别好用。你启动Carla和ROS2桥接后,打开rqt_graph,能看到所有节点怎么连的。我曾经靠这个图,发现有个节点订阅错了话题,数据一直没对上。
3.8 本章小结
这一章我们搞定了ROS2 Humble的安装,也聊了节点、话题、服务这些核心概念。说实话,这些概念刚开始可能有点抽象,但等你真正跑起Carla联合仿真,就会明白它们是怎么配合的。
下一章,我们就要把Carla和ROS2连起来了。到时候你会看到,传感器数据怎么从Carla流到ROS2,控制指令怎么从ROS2发回Carla。嗯,那才是真正有意思的部分。
课后练习:
- 安装ROS2 Humble并跑通talker-listener示例
- 创建一个名为
carla_sensor的Python包 - 用
ros2 topic list查看Carla ROS2桥接后有哪些话题
公众号:蓝海资料掘金营,微信deep3321