04 ROS2 接口与话题

CARLA 本身不发 ROS 话题,需桥接。0.9.16 有两种方式:

方式 说明 是否重编 CARLA 性能
Native ROS2 接口(本教程用) 内建在服务端 是(--ros2 最好、延迟最低(官方推荐)
ROS Bridge(独立库) 单独的包,连服务端转话题 有额外延迟

本教程用 native 接口(性能最好,且示例已在源码里)。

4.1 前提

  • 第 02 章已把 CARLA 编译成功(不带 –ros2)。
  • ROS2 humble 已装(/opt/ros/humble,含 rclcpp)。

4.2 ⚠️ 带 --ros2 重新编译

native ROS2 需 WITH_ROS2,但 make launch --ros2 增量编译不会重编 LibCarla/Carla 插件,必须强制重编。而且 make rebuild 不可用(它不把 --ros2 传给 BuildLibCarla)。要分步:

修复 5:foonathan_memory 版本号

Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Carla.Build.cs 里写死了 libfoonathan_memory-0.7.3.a,但实际 FastDDS 构建的是 0.7.4。改成 0.7.4,否则链接报 cannot open libfoonathan_memory-0.7.3.a

1
2
- PublicAdditionalLibraries.Add(Path.Combine(LibCarlaInstallPath, "lib", "libfoonathan_memory-0.7.3.a"));
+ PublicAdditionalLibraries.Add(Path.Combine(LibCarlaInstallPath, "lib", "libfoonathan_memory-0.7.4.a"));

分步强制重编

1
2
3
4
5
6
7
8
9
source /opt/ros/humble/setup.zsh
export UE4_ROOT=~/carla_project/UnrealEngine_4.26
cd ~/carla_project/carla

# 1. 编 LibCarla 的 ros2 变体(装到 CarlaDependencies)
./Util/BuildTools/BuildLibCarla.sh --server --release --ros2

# 2. 强制重编 Carla 插件带 WITH_ROS2(--rebuild 只清 UE4 中间文件,不动依赖)
./Util/BuildTools/BuildCarlaUE4.sh --rebuild --ros2 --no-simready --editor-flags='--ros2'

⚠️ make rebuild 不可用:Linux.mk 的 rebuild 目标没把 $(ARGS) 传给 BuildLibCarla.sh,ros2 变体编不到;还会清坏 PythonAPI 依赖。必须用上面的分步命令。

4.3 ⚠️ DDS 配置(解决发现失败)

FastDDS 默认用共享内存(SHM)传输,常导致节点互相发现不了(话题列表为空)。0.9.16 自带一个禁用 SHM、强制 UDP 的 profile:

PythonAPI/examples/ros2/config/fastrtps-profile.xml

把它设到环境变量(加到 ~/.bashrc / ~/.zshrc):

1
export FASTRTPS_DEFAULT_PROFILES_FILE=~/carla_project/carla/PythonAPI/examples/ros2/config/fastrtps-profile.xml

4.4 启动 native ROS2 + 读话题

1
2
3
4
5
6
# 终端 1: 启动 CARLA(带 --ros2)
source /opt/ros/humble/setup.zsh
export UE4_ROOT=~/carla_project/UnrealEngine_4.26
cd ~/carla_project/carla
make launch ARGS="--ros2 --no-simready --editor-flags='--ros2'"
# 编辑器里按 Play
1
2
3
4
5
# 终端 2: 跑 native 示例,生成 ego 车 + 传感器(发布话题)
# ⚠️ 用系统 python + ROS2,不要用 conda
source /opt/ros/humble/setup.zsh
python3 ~/carla_project/carla/PythonAPI/examples/ros2/ros2_native.py \
--file ~/carla_project/carla/PythonAPI/examples/ros2/stack.json
1
2
3
4
# 终端 3: 读话题
source /opt/ros/humble/setup.zsh
ros2 topic list
ros2 topic echo /carla/hero/rgb/image --field width # 相机图像

应看到话题:

  • /carla/hero/rgb/image(RGB 相机)
  • /carla/hero/rgb/camera_info
  • /carla/hero/lidar/point_cloud
  • /carla/hero/gnss/carla/hero/imu
  • /carla/hero/vehicle_control_cmd

4.5 ⚠️ 关键:系统 python vs conda

这是最容易踩的坑:

操作 用哪个 python 原因
ros2 命令、ros2_native.py、检测节点 系统 python3/usr/bin/python3 + ROS2) rclpy/ros2cli 装在系统 python;conda 的 python 找不到
generate_traffic.py conda carla 环境 import carla,装在 conda

混用会报 PackageNotFoundError: ros2cliNo module named 'carla'

zsh 用 source /opt/ros/humble/setup.zsh(别用 setup.bashBASH_SOURCE 在 zsh 失效会报 setup.sh not found)。