📌 测试用例
PythonAPI/examples/draw_skeleton.py
行人骨骼(Skeleton)可视化示例,用于:
- 在仿真中生成一个行人(Pedestrian)
- 实时获取其骨骼关节点的 3D 世界坐标
- 将骨骼投影到 RGB 摄像头图像上,绘制骨架连线与关键点
- 摄像机围绕行人做环绕运动,展示动态效果
适用于 人体姿态估计、动作捕捉、行人行为分析 等研究。
carla_draw_skeleton
🔑 主要模块解析
1. CarlaSyncMode:同步模式上下文管理器
-
功能:封装 CARLA 同步模式的开启/关闭逻辑
-
优势 :
- 自动管理
world.tick()与传感器数据对齐 - 确保每帧只处理同一仿真时刻的摄像头图像和行人状态
- 自动管理
-
使用方式 :
pythonwith CarlaSyncMode(world, camera, fps=30) as sync_mode: snapshot, image_rgb = sync_mode.tick(timeout=5.0)
✅ 这是 CARLA 多传感器同步的最佳实践。
2. 行人骨骼获取与处理
python
bones = ped.get_bones() # 获取骨骼结构
for i, bone in enumerate(bones.bone_transforms):
boneIndex[bone.name] = i
points.append(bone.world.location) # 3D 世界坐标
get_bones()返回包含 68 个骨骼节点 的层级结构(含名称、局部/世界坐标)- 常见节点命名如:
crl_hips__C(臀部中心)crl_spine__C(脊柱)crl_hand__L(左手)crl_Head__C(头部)
💡 这些名称对应 CARLA 内置行人模型的骨骼绑定。
3. 3D→2D 投影管线
python
def get_screen_points(camera, K, image_w, image_h, points3d):
# 1. 构建世界→相机变换矩阵
world_2_camera = np.array(camera.get_transform().get_inverse_matrix())
# 2. 将 3D 点转为齐次坐标 (x,y,z,1)
points = np.array([...]).reshape(-1, 4).T
# 3. 变换到相机坐标系
points_camera = np.dot(world_2_camera, points)
# 4. CARLA 坐标系 → 标准 CV 坐标系: (x,y,z) → (y, -z, x)
points = np.array([points_camera[1], -points_camera[2], points_camera[0]])
# 5. 相机内参投影 + 归一化
points_2d = np.dot(K, points)
points_2d = [x/z, y/z, z]
- 完整实现 从世界坐标到像素坐标的转换
- 正确处理 CARLA 左手坐标系 与 计算机视觉右手坐标系 的差异
4. 骨骼可视化绘制
draw_skeleton():
根据预定义的骨骼连接关系(如hips → spine,spine → neck),调用draw_line_on_buffer绘制 绿色骨架线draw_points_on_buffer():
在关节点位置绘制 红色圆点(除根节点外)- 自定义光栅化 :
未使用 Pygame 高级绘图,而是直接操作 NumPy 图像缓冲区,确保与原始图像融合
✅ 支持 任意骨骼拓扑 ,只需修改
boneIndex映射关系。
5. 动态场景控制
-
行人动画 :
pythonped.blend_pose(math.sin(blending)) # 混合行走/站立姿态 controller.go_to_location(...) # AI 控制器导航 -
环绕摄像机 :
pythonx = math.cos(turning) * -3 y = math.sin(turning) * 3 trans.location = ped.location + (x, y, 2) trans.rotation.yaw = -360 * (turning/(2π)) # 保持面向行人 camera.set_transform(trans) -
效果:摄像机以 3 米半径绕行人旋转,同时俯视 16°
6. 图像处理与显示
-
get_image_as_array():
将 CARLA 图像转为可写的 NumPy 数组(BGR → RGB) -
draw_image():
使用 Pygame 显示叠加骨骼的图像 -
多进程保存(注释掉) :
python# pool.apply_async(write_image, (snapshot.frame, "ped", buffer))可扩展为 实时保存带骨骼标注的视频帧
🎯 核心应用场景
| 应用 | 如何利用本脚本 |
|---|---|
| 2D 人体姿态估计 | 生成带精确 2D 关键点标注的图像数据集 |
| 3D 人体重建 | 结合深度图 + 3D 骨骼坐标训练模型 |
| 行人行为分析 | 分析 blend_pose 参数与动作的关系 |
| 虚拟试衣/AR | 将虚拟服装绑定到骨骼节点 |
⚠️ 技术点
-
完整的骨骼拓扑定义
- 手动编码了 60+ 条骨骼连接(从手指到脚趾)
- 覆盖全身细节,支持高精度姿态可视化
-
坐标系无缝转换
- 正确处理 CARLA 特有的
(x,y,z) → (y,-z,x)转换 - 避免常见投影错误(如左右颠倒、上下翻转)
- 正确处理 CARLA 特有的
-
纯客户端渲染
- 所有绘制在 Python/NumPy 完成,不依赖 CARLA 渲染管线
- 可轻松修改为保存标注文件(JSON/PNG)
✅ 总结
该脚本是 CARLA 行人骨骼可视化的标杆示例,展示了:
- 如何获取 高精度行人骨骼数据
- 如何实现 鲁棒的 3D→2D 投影
- 如何在 动态场景 中实时绘制骨架
它是构建 人体姿态估计数据集 或 行人交互系统 的理想起点,尤其适合需要 精确关节标注 的计算机视觉任务。