使用rosbags提取Carla ROSBAG控制指令话题报Key Error问题
rosbags读取Carla控制话题反序列化失败解决方案
核心问题判断
你可以正常读取图像、车速类话题,是因为这类话题使用的sensor_msgs、geometry_msgs、nav_msgs属于ROS通用标准消息,rosbags可以直接从运行环境中匹配到对应的消息结构定义。
读取/carla/ego_vehicle/vehicle_control_cmd_manual失败的核心原因是:rosbags无法获取该话题对应自定义消息的正确结构定义,CDR反序列化流程无法匹配二进制数据格式,直接抛出错误。
具体排查&修复方案
按优先级从高到低排查:
- 问题1:运行环境未加载Carla自定义消息
/carla/ego_vehicle/vehicle_control_cmd_manual使用的是carla_msgs包下的自定义消息,不属于ROS原生标准消息。如果你运行脚本前没有在当前终端source Carla ROS桥的工作空间环境(比如未执行source 你的carla-ros-bridge工作空间/devel/setup.bash),或是使用独立Python虚拟环境运行脚本、没有继承ROS环境变量,rosbags就搜索不到该消息的结构定义,直接报错。
修复方式:- 运行脚本前,在同一终端先执行source命令加载Carla ROS工作空间环境,再运行Python脚本
- 最稳妥的方式是直接在代码中注册rosbag包内自带的消息定义,彻底绕开本地环境的消息依赖,修改后的代码如下:
from rosbags.rosbag2 import Reader from rosbags.serde import deserialize_cdr from rosbags.typesys import get_types_from_msg, register_types def print_data(topic): with Reader('carla_data') as reader: # 预注册bag包内所有连接的消息定义 for conn in reader.connections: if conn.msgtype not in deserialize_cdr.typestore.FIELDDEFS: register_types(get_types_from_msg(conn.msgdef, conn.msgtype)) # 正常读取消息 for i, (connection, timestamp, rawdata) in enumerate(reader.messages()): if connection.topic == topic: msg = deserialize_cdr(rawdata, connection.msgtype) print(i, msg) break - 问题2:消息版本不匹配
如果你录包时使用的Carla版本(对应carla_msgs版本)和当前环境安装的carla_msgs版本不一致,比如录包用Carla 0.9.13,当前环境装的是0.9.15版本的carla_msgs,两个版本的CarlaEgoVehicleControl消息存在字段增删、顺序调整,反序列化时会出现字段错位、类型不匹配的错误。
修复方式:- 安装和录包时版本完全一致的Carla ROS桥及对应carla_msgs包
- 直接使用上面给出的预注册bag内自带消息定义的代码,不需要依赖本地安装的carla_msgs,从根源避免版本问题。
- 问题3:包内数据损坏
这个场景概率极低,可先在录包的原环境下执行ros2 bag play carla_data,同时用ros2 topic echo /carla/ego_vehicle/vehicle_control_cmd_manual查看是否能正常输出消息,如果可以正常输出,直接按前两个问题排查即可。
内容的提问来源于stack exchange,提问作者Jerry
相关产品推荐
相关产品推荐

