自动驾驶—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. 如何在 动态场景 中实时绘制骨架

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

相关推荐
龙腾AI白云4 小时前
AI检索增强生成(RAG):解决大模型幻觉的核心落地技术
数据库·人工智能·机器学习·知识图谱
云票4 小时前
企业对接AI合同审查系统的工程实践
人工智能
admin and root4 小时前
「AI安全篇」实战AntiDebug自动化JS逆向加解密MCP
javascript·人工智能·网络安全·自动化·漏洞挖掘·cnvd·src赏金
智能RPA4 小时前
智能体自动化平台与主数据管理平台(MDM)对比评测
人工智能·自动化·agent·rpa
跨境小彭5 小时前
Temu拉美站点铺货实操复盘:手动复制痛点与批量自动化解决方案
服务器·人工智能·搜索引擎·自动化·temu电商运营
封印师请假去地球钓鱼5 小时前
边解边变的问题:从“决策依赖“一词出发
人工智能·算法
AI搅拌机5 小时前
ComfyUI管理大师:安全稳定升级+切换指定版本!
人工智能
浅安的邂逅5 小时前
20929-OpenAI 一天踩三脚急刹:暂停前沿训练、叫停 Astra、披露越权访问澳政府网站
人工智能·大模型·ai编程·行业动态·ai日报
Qyr995 小时前
2026-2032直接芯片液冷板市场爆发式增长:AI算力浪潮下的热管理核心赛道
大数据·人工智能
微学AI5 小时前
不让每一步都调用最贵模型:用蓝耘智能路由改造自主式研究 Agent
数据库·人工智能·蓝耘