自动驾驶—CARLA仿真(12)client_bounding_boxes demo

📌测试用例

PythonAPI/examples/client_bounding_boxes.py

客户端侧 3D 边界框(Client-Side Bounding Boxes)可视化示例,用于:

  1. 手动驾驶一辆主车(WASD 控制)
  2. 实时计算并绘制周围车辆的 3D 边界框
  3. 所有边界框计算在 客户端(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 类:主控制循环

管理仿真、渲染和用户输入。

核心组件:
  • 同步模式:

    python 复制代码
    self.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 手刹
  • 图像同步机制:

    python 复制代码
    self.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 渲染分割图

⚠️ 注意事项

  1. 仅显示其他车辆

    • vehicles = self.world.get_actors().filter('vehicle.*') 包含所有车
    • 但未过滤主车,主车自身也会显示边界框 (可通过 if vehicle.id != self.car.id 过滤)
  2. 深度过滤

    python 复制代码
    bounding_boxes = [bb for bb in bounding_boxes if all(bb[:, 2] > 0)]
    • 移除相机后方的物体(深度 ≤ 0)
  3. 坐标系假设

    • 假设车辆 bounding_box 中心在 (0,0,0)(CARLA 默认)
    • 若车辆模型偏移,需调整 _vehicle_to_world

✅ 总结

该脚本是 CARLA 客户端 3D 感知的经典实现,展示了:

  1. 如何从 车辆物理属性(bounding_box)生成 3D 顶点
  2. 如何实现 完整的 3D→2D 投影管线
  3. 如何在 纯 Python 客户端 实现 3D 边界框可视化

它是学习 自动驾驶 3D 目标检测基础 的绝佳起点,尤其适合理解 坐标变换、相机模型、投影几何 等核心概念。

相关推荐
sell-cloud3 小时前
Prompt Engineering要凉了?Fable 5.5能“猜“意图,但银行正在封杀AI Agent——企业AI的真正护城河是什么
人工智能·prompt
Navicat中国4 小时前
Navicat 18 内置 AI 助手让数据库开发从繁琐操作迈向智能协作
大数据·人工智能·数据库开发
4SAPI4 小时前
多模型请求路由怎么设计?成本、速度和能力如何平衡
人工智能·python·gateway·php
魔乐社区5 小时前
翼芯・智算测试与适配优化专区,让国产算力“选得准、跑得通、用得好“
人工智能·开源·大模型
XCDoris6 小时前
郴州logo设计机构
大数据·人工智能·python
Goboy7 小时前
一个人带三个Agent,我用全新TRAE从0到1搭了个资讯周刊站
人工智能·trae
俊哥V7 小时前
每日 AI 研究简报 · 2026-10-19
人工智能·ai
AI_AGENT_DEV_AI7 小时前
AI英语教培智能体的开发
人工智能
物联网软硬件开发-轨物科技7 小时前
【技术白皮书】光伏清检一体化机器人系统解决方案技术白皮书
大数据·运维·网络·人工智能·机器人
海宇数据7 小时前
零信任架构实战:基于海宇网上踪迹欺诈行为识别构建自动化信贷资信评估网关
运维·人工智能·架构·自动化