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。嗯,那才是真正有意思的部分。

课后练习:

  1. 安装ROS2 Humble并跑通talker-listener示例
  2. 创建一个名为carla_sensor的Python包
  3. ros2 topic list查看Carla ROS2桥接后有哪些话题

公众号:蓝海资料掘金营,微信deep3321