CARLA ROS2 原生传感器参考:Topic 命名规则、消息类型与源码级原理全指南
自动驾驶科研仿真【免费下载链接】carlaOpen-source simulator for autonomous driving research.项目地址https://gitcode.com/gh_mirrors/ca/carla点击查看免费下载CARLA 模拟器CARLA Simulator从服务端原生支持 ROS2 通信无需外部桥接进程即可将仿真中生成的传感器数据直接发布为 ROS2 Topic。本文以 Docs/ros2_native_sensors.md 为核心完整梳理 13 类传感器对应的 Topic 名称与 ROS 消息类型并结合仓库源码LibCarla/source/carla/ros2 下的发布器实现讲解数据格式、发布机制与订阅方式。读完本文你将能准确规划感知节点的 Topic 订阅方案理解/clock时间同步、enable_for_ros()启用逻辑以及sensor_msgs各消息的字段来源可直接对接目标检测、点云处理、里程计等 ROS2 下游应用。前置概念ROS2 原生接口与仿真时钟/clock在进入传感器 Topic 清单之前需要先理解两条贯穿全文的机制服务端原生发布CARLA 的 ROS2 支持内建于服务端。启动时只需在命令行追加--ros2选项详见 Docs/ros2_native.md./CarlaUnreal.sh --ros2此后任何被显式启用 ROS 的传感器都会由服务端直接向 DDS 总线广播数据不需要额外的 ros-bridge 进程。仿真时钟/clockCARLA 服务端负责基于仿真时间发布/clockTopic并且每个仿真帧都会更新一次。这是 ROS2 应用保持时间同步的关键——下游节点应将该时钟作为use_sim_time的时间源确保时间戳与仿真帧一致。从源码看该发布器位于 CarlaClockPublisher.cpp它通过BasePublisher(rt/clock)创建名为rt/clock的写者并将仿真秒数与纳秒写入rosgraph_msgs/Clock消息CarlaClockPublisher::CarlaClockPublisher() : BasePublisher(rt/clock), _impl(std::make_sharedPublisherImplCarlaClockMsgTraits()) { if (!_impl-Init(GetBaseTopicName())) { log_error(CarlaClockPublisher: failed to initialise writer for rt/clock); } } bool CarlaClockPublisher::Write(std::int32_t seconds, std::uint32_t nanoseconds) { auto *message _impl-GetMessage(); message-clock().sec(seconds); message-clock().nanosec(nanoseconds); return true; }可以看到底层通过 eProsima Fast-DDS 类型的ClockPubSubType序列化发布Topic 名以rt/前缀声明对应 ROS 的 reliable-transient-local 语义。传感器数据广播机制如何让传感器进入 ROS默认情况下仿真中 spawn 的传感器不会自动向 ROS 发布数据。必须显式调用传感器对象的enable_for_ros()方法例如在 Python 客户端中sensor world.spawn_actor(sensor_blueprint, transform) sensor.enable_for_ros()这条调用在客户端侧形成一条完整的链路ServerSideSensor.cpp 中的ServerSideSensor::EnableForROS()请求所在 Episode进而由 Simulator.cpp 的Simulator::EnableForROS()调用 Client.cpp 的Client::EnableForROS()通过该传感器的 streaming token 通知服务端开启对应流的 ROS 转发。也就是说是否发布由服务端按传感器逐一控制而非全局开关。Topic 命名规则Topic 名称由传感器 blueprint 中的ros_name属性决定需在 spawn 之前设置默认会生成随机字符串名称bp bp_lib.find(sensor.camera.rgb) bp.set_attribute(ros_name, front_camera)无父级时的 Topic 形如/carla/front_camera/image若传感器挂载在某个 actor例如自车之下Topic 会再拼接父级 actor 的 role name形如/carla/[PARENT ROLE NAME]/SENSOR ROLE NAME/image例如自车 role name 为ego、相机ros_name为front_camera时图像 Topic 为/carla/ego/front_camera/image对应 Docs/ros2_native.md 的示例。下表所有 Topic 中的PARENT ROLE NAME即为父级 actor 的 role nameSENSOR ROLE NAME即ros_name无父级时两者之间的路径段省略。相机类传感器图像与内参消息相机类传感器通常同时发布两个 Topic图像数据sensor_msgs/Image与相机内参sensor_msgs/CameraInfo。从源码看这一对写者统一实现在 CarlaCameraPublisher.cpp 中构造函数同时为base_topic /image与base_topic /camera_info各初始化一个PublisherImplPublish()时两者无条件共同发布一处失败不会压制另一处。CameraInfo消息的填充值得注意同一源文件中WriteCameraInfo()distortion_model固定为plumb_bob畸变向量D为 5 个零值内参矩阵K由ComputeIntrinsics(width, height, fov)依据分辨率与视场角实时计算fx/fy、主点 cx/cy矫正矩阵R为单位阵投影矩阵P为标准针孔形式binning_x/binning_y为 0roi区域直接回填图像的 offset、height、width 与do_rectify标志。而Image消息的step与encoding则由各传感器子类决定例如 RGB 相机发布器 CarlaRGBCameraPublisher.h 重写GetChannels()返回 4、GetEncoding()返回bgra8BGRA 四通道像素。可以推断Depth、Semantic Segmentation、Instance Segmentation、Normals、Optical Flow 等发布器CarlaDepthCameraPublisher.h、CarlaSSCameraPublisher.h、CarlaISCameraPublisher.h、CarlaNormalsCameraPublisher.h、CarlaOpticalFlowCameraPublisher.h均以同样的子类化方式定义各自的像素格式下游消费者应依据消息中的encoding字段做对应解码。RGB cameraTopic类型/carla/[PARENT ROLE NAME]/SENSOR ROLE NAME/imagesensor_msgs/Image/carla/[PARENT ROLE NAME]/SENSOR ROLE NAME/camera_infosensor_msgs/CameraInfoDepth cameraTopic类型/carla/[PARENT ROLE NAME]/SENSOR ROLE NAME/imagesensor_msgs/Image/carla/[PARENT ROLE NAME]/SENSOR ROLE NAME/camera_infosensor_msgs/CameraInfoSemantic segmentation cameraTopic类型/carla/[PARENT ROLE NAME]/SENSOR ROLE NAME/imagesensor_msgs/Image/carla/[PARENT ROLE NAME]/SENSOR ROLE NAME/camera_infosensor_msgs/CameraInfoInstance segmentation cameraTopic类型/carla/[PARENT ROLE NAME]/SENSOR ROLE NAME/imagesensor_msgs/Image/carla/[PARENT ROLE NAME]/SENSOR ROLE NAME/camera_infosensor_msgs/CameraInfoNormals cameraTopic类型/carla/[PARENT ROLE NAME]/SENSOR ROLE NAME/imagesensor_msgs/Image/carla/[PARENT ROLE NAME]/SENSOR ROLE NAME/camera_infosensor_msgs/CameraInfoOptical flow cameraTopic类型/carla/[PARENT ROLE NAME]/SENSOR ROLE NAME/imagesensor_msgs/Image/carla/[PARENT ROLE NAME]/SENSOR ROLE NAME/camera_infosensor_msgs/CameraInfo光流数据以图像形式承载在/imageTopic 中。仓库中 OpticalFlowEncoding.h 专门负责光流结果的编码转换说明仿真内部的光流计算结果在进入 ROS 消息前会经过一次编码层处理消费端需按该编码规则解码出二维光流矢量。DVS cameraDVS 事件相机是唯一同时发布事件流 图像 内参三类 Topic 的传感器Topic类型/carla/[PARENT ROLE NAME]/SENSOR ROLE NAME/eventssensor_msgs/PointCloud2/carla/[PARENT ROLE NAME]/SENSOR ROLE NAME/imagesensor_msgs/Image/carla/[PARENT ROLE NAME]/SENSOR ROLE NAME/camera_infosensor_msgs/CameraInfo其实现 CarlaDVSCameraPublisher.cpp 由两个子发布器组合而成CarlaDVSImagePublisher通过 DvsEventEncoding.h 中的EncodeDvsEventsToBgr将原始事件累加编码为 BGR 图像CarlaDVSPointCloudPublisher则通过EncodeDvsEventsToPointCloud把每个事件基于carla/sensor/data/DVSEvent结构见GetPointSize()返回的sizeof(sensor::data::DVSEvent)转换为带时间戳t字段的点云消息。源码注释特别指出事件时间戳为 int64必须在编码为 FLOAT64t槽位时转换为 double不能直接做字节拷贝否则订阅方按 double 解码会得到错误比特。这解释了为什么eventsTopic 采用PointCloud2而非自定义消息——每个点即一个 (x, y, t, polarity) 事件。点云类传感器Lidar / Semantic lidar / Radar三类三维感知传感器统一发布为sensor_msgs/PointCloud2Topic 名不带后缀直接落在基础名称上。LidarTopic类型/carla/[PARENT ROLE NAME]/SENSOR ROLE NAMEsensor_msgs/PointCloud2发布器实现在 CarlaLidarPublisher.cpp点云字段布局由 PointCloudFieldsLayout.h 统一定义保证下游如 rviz、点云滤波、目标检测可按标准PointField结构解析 x/y/z/intensity 等字段。Semantic lidarTopic类型/carla/[PARENT ROLE NAME]/SENSOR ROLE NAMEsensor_msgs/PointCloud2语义激光雷达在几何信息基础上附带对象标签信息发布器 CarlaSemanticLidarPublisher.cpp 负责将语义点数据写入PointCloud2字段。RadarTopic类型/carla/[PARENT ROLE NAME]/SENSOR ROLE NAMEsensor_msgs/PointCloud2雷达发布器 CarlaRadarPublisher.cpp 需要把雷达返回的极坐标量测转换为笛卡尔坐标系下的点云仓库中的 RadarPolarToCartesian.h 即承担这一坐标转换职责。消费雷达点云时注意其字段除位置外通常还包含径向速度、方位角与俯仰角信息字段名以PointCloud2消息内实际声明为准。位姿与导航类传感器IMU / GNSSIMUTopic类型/carla/[PARENT ROLE NAME]/SENSOR ROLE NAMEsensor_msgs/ImuIMU 发布器 CarlaIMUPublisher.cpp 输出标准sensor_msgs/Imu含线加速度、角速度与四元数姿态。实现中引用了 ImuMath.h可以推断原始惯性数据在写入消息前经过数学变换例如坐标系对齐或单位换算订阅方以消息内容为准即可。GNSSTopic类型/carla/[PARENT ROLE NAME]/SENSOR ROLE NAMEsensor_msgs/NavSatFixGNSS 发布器 CarlaGNSSPublisher.cpp 输出sensor_msgs/NavSatFix携带纬度、经度、海拔与定位状态协方差可直接对接机器人导航栈如 robot_localization、mapviz。事件类传感器Lane Invasion SensorLane Invasion SensorTopic类型/carla/[PARENT ROLE NAME]/SENSOR ROLE NAMEcarla_msgs/CarlaLaneInvasionEvent车道入侵传感器发布自定义消息CarlaLaneInvasionEvent其字段在 Docs/ros2_native_msgs.md 中有完整定义字段类型描述headerstd_msgs/Header消息发布时的时间戳与 frame IDcrossed_lane_markingsint32[]上一仿真步内被跨越的车道线集合使用常量标识LANE_MARKING_OTHER0、LANE_MARKING_BROKEN1、LANE_MARKING_SOLID2该消息属于carla_msgs自定义消息族。与sensor_msgs标准消息不同使用前需要安装对应的消息定义包CARLA 生态中的ros-carla-msgs订阅方在编译期即可获得强类型定义。实践指南如何订阅这些 Topic1. 验证数据是否在发布启动带--ros2的 CARLA 服务端、spawn 并enable_for_ros()传感器后使用 ROS2 命令行工具即可列出并检查 Topicros2 topic list ros2 topic echo /carla/ego/front_camera/camera_info --once ros2 topic hz /carla/lidar其中ros2 topic hz可用于确认点云/图像的发布频率与仿真帧率一致相机图像可借助rqt_image_view直接可视化/carla/.../image。2. 订阅相机图像Python 示例以下示例订阅 RGB 相机图像并打印其尺寸、编码与stepimport rclpy from rclpy.node import Node from sensor_msgs.msg import Image class CarlaImageSubscriber(Node): def __init__(self): super().__init__(carla_image_subscriber) self.sub self.create_subscription( Image, /carla/ego/front_camera/image, self.on_image, 10) def on_image(self, msg: Image): self.get_logger().info( fimage {msg.width}x{msg.height}, encoding{msg.encoding}, fstep{msg.step}, stamp{msg.header.stamp.sec}.{msg.header.stamp.nanosec}) def main(): rclpy.init() rclpy.spin(CarlaImageSubscriber()) rclpy.shutdown()注意三点一是相机消息encoding字段如 RGB 相机为bgra8决定了像素解码方式二是header.stamp与/clock来自同一仿真时钟建议为节点启用use_sim_time三是Image.data的长度为height * step其中step width * channels不可用裸width * height计算源码 CarlaCameraPublisher.cpp 中step(width * GetChannels())明确了这一关系。3. 订阅点云与 IMU点云与 IMU 都是标准sensor_msgs消息可直接复用通用处理管线PointCloud2使用sensor_msgs_py.point_cloud2.read_points()逐点解析或直接送入rviz2的 PointCloud2 显示插件Imu/NavSatFix可分别接入惯性导航融合与全局定位模块NavSatFix的经纬高直接对应仿真世界坐标在 WGS84 下的投影。延伸阅读传感器之外的控制链路与启用细节见 ROS2 原生接口总览含--ros2启动、ros_name设置、/carla/ego/vehicle_control_cmd控制 Topic 与CarlaEgoVehicleControl字段说明全部 CARLA 自定义消息含CarlaLaneInvasionEvent、CarlaEgoVehicleControl、CarlaStatus、CarlaWorldInfo等的逐字段参考见 CARLA 消息参考感兴趣的读者可深入 LibCarla/source/carla/ros2/publishers 目录逐一阅读各发布器实现理解每个消息的序列化类型...PubSubTypes见 LibCarla/source/carla/ros2/types与字段填充逻辑。赞分享自动驾驶科研仿真【免费下载链接】carlaOpen-source simulator for autonomous driving research.项目地址https://gitcode.com/gh_mirrors/ca/carla点击查看免费下载相关推荐Skia图形库深度解析从平面到球面的实时着色器映射技术Skia图形库深度解析从平面到球面的实时着色器映射技术 在当今的图形处理领域Skia作为Google开源的2D图形库不仅提供了基础的文本、几何和图像绘制能自动驾驶科研仿真wagmi core signMessage Action 完全指南消息签名、参数详解与源码原理wagmi core signMessage Action 完全指南消息签名、参数详解与源码原理 本文是 wagmiReactive primitives区块链Web3前端Apache DolphinScheduler 启动参数Startup Parameter完全指南工作流级参数配置、传递规则与源码原理Apache DolphinScheduler 启动参数Startup Parameter完全指南工作流级参数配置、传递规则与源码原理 导读 启动参数S任务调度数据编排工作流自动化后端大数据上一篇一招治好键盘连击免费工具 Keyboard Chatter Blocker 使用指南下一篇SR300 Python连接实战Ubuntu 22.04librealsense 深度流一次跑通创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考