You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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']

错误原因

  1. 参数类型解析错误:class_name是字符串类型的参数数组,但代码中使用integer_array_value获取,导致解析失败,可能返回空数组或长度异常的数组。
  2. 数组长度不匹配:即使参数类型正确,若配置文件中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 23:35:20