在Carla 0.9.13+ROS2 Foxy运行目标追踪代码遇IndexError求助
问题排查:IndexError: array index out of range(Carla+ROS2目标追踪代码)
环境与问题简述
在Python 3.8、Carla 0.9.13、ROS2 Foxy环境下实现目标追踪功能时,运行代码触发IndexError: array index out of range错误,报错位置为object_tracking.py文件的nodeParams函数中self.class_dict[int(id_)] = class_name[i]行,进程终止。
相关代码
def __init__(self): super().__init__('object_tracking') # Declare ROS parameters self.declare_parameters(namespace='', parameters=[('qos_length',0), ('topic.untracked_obj',''), ('topic.rgb_image',''), ('topic.tracked_obj',''), ('obj_class.id',[]), ('obj_class.name',[]), ('display',True), ('frame_id.tracked_obj','')]) self.nodeParams() qos_length = self.get_parameter('qos_length').get_parameter_value().integer_value qos_profile = QoSProfile(depth=qos_length, history=QoSHistoryPolicy.KEEP_LAST, reliability=QoSReliabilityPolicy.RELIABLE) # Load cv_bridge self.bridge = CvBridge() # Create instance of SORT self.mot_tracker = Sort() # Create Subscribers obj_topic = self.get_parameter('topic.untracked_obj').get_parameter_value().string_value self.obj_sub = mf.Subscriber(self,ObjectArray,obj_topic,qos_profile=qos_profile) rgb_topic = self.get_parameter('topic.rgb_image').get_parameter_value().string_value self.rgb_sub = mf.Subscriber(self,Image,rgb_topic,qos_profile=qos_profile) # Apply message filter self.timestamp_sync = mf.TimeSynchronizer([self.obj_sub,self.rgb_sub],queue_size=qos_length) self.timestamp_sync.registerCallback(self.objCallback) # Create Publishers obj_topic = self.get_parameter('topic.tracked_obj').get_parameter_value().string_value self.obj_pub = self.create_publisher(ObjectArray,obj_topic,qos_profile) def nodeParams(self): #print('1') self.display = self.get_parameter('display').get_parameter_value().bool_value class_id = self.get_parameter('obj_class.id').get_parameter_value().integer_array_value #print(class_id) class_name = self.get_parameter('obj_class.name').get_parameter_value().integer_array_value #print(class_name) self.class_dict = {} #for name in class_name: '''#for i,id_ in enumerate(class_id): #print('2') #self.class_dict = class_name [name] #print('3')''' for i,id_ in enumerate(class_id): self.class_dict[int(id_)] = class_name[i]
报错信息
[object_tracking.py-3] self.nodeParams() [object_tracking.py-3] File "/home/smit/ros2_ws/install/carla_simulation/lib/carla_simulation/object_tracking.py", line 64, in nodeParams [object_tracking.py-3] self.class_dict[int(id_)] = class_name[i] [object_tracking.py-3] IndexError: array index out of range [ERROR] [object_tracking.py-3]: process has died [pid 623526, exit code 1, cmd '/home/smit/ros2_ws/install/carla_simulation/lib/carla_simulation/object_tracking.py --ros-args --params-file /home/smit/ros2_ws/install/carla_simulation/share/carla_simulation/config/params.yaml']
错误原因
- 参数类型解析错误:
class_name是字符串类型的参数数组,但代码中使用integer_array_value获取,导致解析失败,可能返回空数组或长度异常的数组。 - 数组长度不匹配:即使参数类型正确,若配置文件中
obj_class.id和obj_class.name的元素数量不一致,遍历class_id时索引i会超出class_name的长度范围,触发索引越界错误。
解决方案
1. 修正参数获取类型
在nodeParams函数中,将class_name的获取方式改为string_array_value(因为类名是字符串):
class_name = self.get_parameter('obj_class.name').get_parameter_value().string_array_value
2. 确保配置文件参数长度一致
检查params.yaml中obj_class下的两个数组元素数量必须一一对应,示例配置:
obj_class: id: [1, 2, 3] name: ["pedestrian", "car", "truck"]
3. 添加长度校验(可选但推荐)
在遍历前加入长度检查,提前发现不匹配问题并输出日志:
def nodeParams(self): self.display = self.get_parameter('display').get_parameter_value().bool_value class_id = self.get_parameter('obj_class.id').get_parameter_value().integer_array_value class_name = self.get_parameter('obj_class.name').get_parameter_value().string_array_value self.class_dict = {} # 校验两个数组长度一致 if len(class_id) != len(class_name): self.get_logger().error(f"obj_class.id and obj_class.name length mismatch: {len(class_id)} vs {len(class_name)}") return for i, id_ in enumerate(class_id): self.class_dict[int(id_)] = class_name[i]
内容的提问来源于stack exchange,提问作者SMIT PATEL
相关产品推荐
相关产品推荐

