📌测试用例
PythonAPI/examples/client_bounding_boxes.py
客户端侧 3D 边界框(Client-Side Bounding Boxes)可视化示例,用于:
- 手动驾驶一辆主车(WASD 控制)
- 实时计算并绘制周围车辆的 3D 边界框
- 所有边界框计算在 客户端(Python)完成,不依赖 CARLA 服务端

🔑 主要模块解析
1. ClientSideBoundingBoxes 类:3D 边界框核心引擎
这是脚本的核心技术模块,完全在客户端实现 3D→2D 投影。
核心方法:
-
get_bounding_box(vehicle, camera)- 获取车辆 8 个 3D 顶点的世界坐标
- 通过 世界→相机坐标变换 → 相机内参投影 → 归一化设备坐标
- 返回 8 个 2D 像素点 + 深度值
-
_create_bb_points(vehicle)- 根据
vehicle.bounding_box.extent生成局部坐标系下的 8 个顶点 - 顺序:底面 4 点(顺时针)+ 顶面 4 点(对应底面)
- 根据
-
坐标变换链 :
车辆局部坐标→世界坐标→相机坐标→2D 像素 -
draw_bounding_boxes()- 使用
pygame.draw.line绘制 12 条边(底面 4 + 顶面 4 + 竖边 4) - 颜色固定为
BB_COLOR = (248, 64, 24)(橙红色)
- 使用
✅ 关键优势 :
不依赖 CARLA 的实例分割传感器,仅需 RGB 摄像头 + 车辆列表即可生成 3D 框。
2. BasicSynchronousClient 类:主控制循环
管理仿真、渲染和用户输入。
核心组件:
-
同步模式:
pythonself.set_synchronous_mode(True)- 确保每帧精确控制,避免传感器数据错位
-
自定义摄像头:
- 分辨率:
960x540(1920/2 x 1080/2) - FOV:90°
- 位置:车后方 5.5 米,高度 2.8 米,俯角 -15°(第三人称视角)
- 分辨率:
-
手动控制逻辑:
按键 功能 W前进(throttle=1, reverse=False) S倒车(throttle=1, reverse=True) A/D左/右转向(±0.05 增量) Space手刹 -
图像同步机制:
pythonself.capture = True # 请求下一帧 # 回调中: if self.capture: self.image = img; self.capture = False- 避免多线程竞争,确保渲染与控制同步
3. **坐标系处理
脚本完整实现了 CARLA 坐标系到标准计算机视觉坐标系的转换:
| 步骤 | 变换 |
|---|---|
| 1. 车辆局部坐标 | (x,y,z) (CARLA 标准) |
| 2. 世界坐标 | 通过 vehicle.get_transform() |
| 3. 相机坐标 | 通过 camera.get_transform().get_inverse_matrix() |
| 4. CV 坐标系 | (x,y,z) → (y, -z, x)(关键!) |
| 5. 2D 投影 | K * [y, -z, x]^T |
💡 注释中的
cords_y_minus_z_x正是这一步转换。
4. 相机内参校准
python
calibration = np.identity(3)
calibration[0, 2] = VIEW_WIDTH / 2.0 # cx
calibration[1, 2] = VIEW_HEIGHT / 2.0 # cy
calibration[0, 0] = calibration[1, 1] = VIEW_WIDTH / (2.0 * tan(FOV/2)) # fx=fy
self.camera.calibration = calibration
- 手动构建 3x3 相机内参矩阵 K
- 用于
get_bounding_box()中的 3D→2D 投影
🎯 与服务端方案对比
| 特性 | 客户端方案(本脚本) | 服务端方案(instance_segmentation) |
|---|---|---|
| 依赖 | 仅需 RGB 摄像头 + 车辆列表 | 需要 instance_segmentation 传感器 |
| 精度 | 基于车辆真实 bounding_box | 基于像素分割,可能有锯齿 |
| 性能 | CPU 计算投影(Python) | GPU 渲染分割图 |
⚠️ 注意事项
-
仅显示其他车辆
vehicles = self.world.get_actors().filter('vehicle.*')包含所有车- 但未过滤主车,主车自身也会显示边界框 (可通过
if vehicle.id != self.car.id过滤)
-
深度过滤
pythonbounding_boxes = [bb for bb in bounding_boxes if all(bb[:, 2] > 0)]- 移除相机后方的物体(深度 ≤ 0)
-
坐标系假设
- 假设车辆 bounding_box 中心在
(0,0,0)(CARLA 默认) - 若车辆模型偏移,需调整
_vehicle_to_world
- 假设车辆 bounding_box 中心在
✅ 总结
该脚本是 CARLA 客户端 3D 感知的经典实现,展示了:
- 如何从 车辆物理属性(bounding_box)生成 3D 顶点
- 如何实现 完整的 3D→2D 投影管线
- 如何在 纯 Python 客户端 实现 3D 边界框可视化
它是学习 自动驾驶 3D 目标检测基础 的绝佳起点,尤其适合理解 坐标变换、相机模型、投影几何 等核心概念。