自动驾驶—CARLA仿真(14)draw_skeleton demo

📌 测试用例

PythonAPI/examples/draw_skeleton.py

行人骨骼(Skeleton)可视化示例,用于:

  1. 在仿真中生成一个行人(Pedestrian)
  2. 实时获取其骨骼关节点的 3D 世界坐标
  3. 将骨骼投影到 RGB 摄像头图像上,绘制骨架连线与关键点
  4. 摄像机围绕行人做环绕运动,展示动态效果

适用于 人体姿态估计、动作捕捉、行人行为分析 等研究。

carla_draw_skeleton

🔑 主要模块解析

1. CarlaSyncMode:同步模式上下文管理器
  • 功能:封装 CARLA 同步模式的开启/关闭逻辑

  • 优势 :

    • 自动管理 world.tick() 与传感器数据对齐
    • 确保每帧只处理同一仿真时刻的摄像头图像和行人状态
  • 使用方式 :

    python 复制代码
    with 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. 动态场景控制
  • 行人动画 :

    python 复制代码
    ped.blend_pose(math.sin(blending))  # 混合行走/站立姿态
    controller.go_to_location(...)      # AI 控制器导航
  • 环绕摄像机 :

    python 复制代码
    x = 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 将虚拟服装绑定到骨骼节点

⚠️ 技术点

  1. 完整的骨骼拓扑定义

    • 手动编码了 60+ 条骨骼连接(从手指到脚趾)
    • 覆盖全身细节,支持高精度姿态可视化
  2. 坐标系无缝转换

    • 正确处理 CARLA 特有的 (x,y,z) → (y,-z,x) 转换
    • 避免常见投影错误(如左右颠倒、上下翻转)
  3. 纯客户端渲染

    • 所有绘制在 Python/NumPy 完成,不依赖 CARLA 渲染管线
    • 可轻松修改为保存标注文件(JSON/PNG)

✅ 总结

该脚本是 CARLA 行人骨骼可视化的标杆示例,展示了:

  1. 如何获取 高精度行人骨骼数据
  2. 如何实现 鲁棒的 3D→2D 投影
  3. 如何在 动态场景 中实时绘制骨架

它是构建 人体姿态估计数据集 或 行人交互系统 的理想起点,尤其适合需要 精确关节标注 的计算机视觉任务。

相关推荐
Navicat中国5 小时前
Navicat 18 内置 AI 助手让数据库开发从繁琐操作迈向智能协作
大数据·人工智能·数据库开发
4SAPI5 小时前
多模型请求路由怎么设计?成本、速度和能力如何平衡
人工智能·python·gateway·php
魔乐社区5 小时前
翼芯・智算测试与适配优化专区,让国产算力“选得准、跑得通、用得好“
人工智能·开源·大模型
XCDoris7 小时前
郴州logo设计机构
大数据·人工智能·python
Goboy8 小时前
一个人带三个Agent,我用全新TRAE从0到1搭了个资讯周刊站
人工智能·trae
俊哥V8 小时前
每日 AI 研究简报 · 2026-10-19
人工智能·ai
AI_AGENT_DEV_AI8 小时前
AI英语教培智能体的开发
人工智能
物联网软硬件开发-轨物科技8 小时前
【技术白皮书】光伏清检一体化机器人系统解决方案技术白皮书
大数据·运维·网络·人工智能·机器人
海宇数据8 小时前
零信任架构实战:基于海宇网上踪迹欺诈行为识别构建自动化信贷资信评估网关
运维·人工智能·架构·自动化
冬奇Lab8 小时前
开源项目第242期:HyperFrames —— 写 HTML 就能渲染视频,专为 AI Agent 设计的确定性视频框架
人工智能·开源·音视频开发