返回列表 发布新帖

异构机器人数据采集落盘格式的统一

498 3
发表于 2024-11-27 17:26:18 | 查看全部 阅读模式
本帖最后由 jujubond 于 2024-11-27 17:26 编辑

1. 传感器介绍
  机器人传感器类型和作用简介:


  数采场景下,机器人传感器分为本体传感器+外部传感器。
本体传感器分布:
外部传感器分布:

2. 数据采集范围
具身数据采集,包括采集本体的关节数据+各传感器数据,各模块采集频率不一,落盘时单独录制,再基于时间戳对齐进行处理。

2.1 视觉感知数据
RGBD相机,相机的内参和外参信息如下表所示:

  • 数据采集前需要进行外参标定
  • 相机的内外参需要保存在每个episode的meta_info中;

雷达数据
数采机器人某些场景会用到激光雷达数据(雷达点云数据质量高于RGBD点云质量)。


2.2 力觉感知数据


其中,


3 数据采集流程


  • 按照 task_id->job_id->collector_id->episode_id 的目录结构管理数据:
    1. {
    2.     "task_id": "xxx", // 任务模板的唯一id
    3.     "task_name": "烤面包", // 任务名
    4.     "task_usage": "试采", // 任务用途:正式任务,试采任务,测试任务,仿真评测
    5.     "task_state": "运营中", // 任务状态:未发布、运营中、已归档
    6.     "robot_type":  "humanoid", //采集设备类型,               
    7.                 # bimanual:双臂
    8.                 # single_arm:单臂
    9.                 # AGV:自动导引车
    10.                 # quadrupedal:四足的
    11.                 # wheeled:轮式的
    12.                 # humanoid:人形机器人
    13.     "ee_type": "omnipicker", // 采集末端类型
    14.     "telecontrol_type": "VR", // 遥操类型:动捕、VR
    15.     "scene_label": "工业场景", // 任务所属场景,如工业、家居、超市等
    16.     "collect_mode": "双臂", // 任务采集模式,如单臂、双臂、全身等
    17.     "task_instance_list":[ // 单个任务下的实例任务列表
    18.         {
    19.             "job_id": "xxx", // 动作的唯一id
    20.             "initial_state_desp":"初始场景文本描述", // 描述初始场景布局,包括机器人位姿、操作物体位姿等
    21.             "action_config":[ // 动作过程配置:起止时间 + 文本 + 原子能力
    22.                 {
    23.                     "start_time": "0.0",
    24.                     "end_time": "8.0",
    25.                     "action_text":"使用右臂打开 @微波炉1",
    26.                     "skill": "open"
    27.                 },
    28.                 {
    29.                     "start_time": "8.0",
    30.                     "end_time": "15.0",
    31.                     "action_text":"使用右臂抓起 @面包2 放进 @微波炉1",
    32.                     "skill": "pick_place"
    33.                 },
    34.                 {
    35.                     "start_time": "15.0",
    36.                     "end_time": "20.0",
    37.                     "action_text":"关闭 @微波炉1",
    38.                     "skill": "close"
    39.                 },
    40.             ],
    41.             "max_collectors": 50, // 单个动作的最多领取/参与采集员数
    42.             "num_per_collector": 20, // 单个采集员的重复采集次数
    43.             "collector_list":[ // 采集员列表
    44.                 {
    45.                     "user_id":"xxx", // 采集员唯一id
    46.                     "user_name":"xxx", // 采集员姓名
    47.                 },
    48.                 ....
    49.             ],
    50.             ...
    51.         },
    52.         ...
    53.     ],
    54.     ...
    55. }
    复制代码

  • 数采设备管理(云端)

  • 云端维护设备列表,设备需要完成注册准入平台后才能进行采集工作;
  • 云端维护不同本体+末端的URDF;

  1. {
  2.     "device_SN": // 采集设备的SN号
  3.     {
  4.          "robot_name": "青龙01", // 机器人名称
  5.          "robot_type": "humanoid", //设备类型
  6.          "ee_type": "omnipicker", // 采集末端类型
  7.          "robot_urdf": "tos://", // urdf存储地址
  8.          "device_status": "已注册", // 设备状态:未注册、已注册
  9.          "register_time": "2024-08-12 12:00:00",
  10.          "update_time": "2024-08-12 12:00:00"
  11.     },
  12.     ...
  13. }
复制代码
数据落盘格式
  1. // 落盘数据举例
  2. ├── meta_info.json // 基础信息汇总
  3. ├── camera  // camera rgbd数据
  4. │   ├── cam_left_wrist
  5. │   │   ├── color // 以时间戳命名
  6. │   │   │   └── png or jpeg
  7. │   │   └── depth // 以时间戳命名
  8. │   │       └── png
  9. │   ├── cam_right_wrist
  10. │   │   ├── color
  11. │   │   │   └── png or jpeg
  12. │   │   └── depth
  13. │   │       └── png
  14. │   ├── cam_head
  15. │   │   ├── color
  16. │   │   │   └── png or jpeg
  17. │   │   └── depth
  18. │   │       └── png
  19. │   ├── cam_head_front_fisheye
  20. │   │   ├── head_front_fisheye.h265
  21. │   │   └── head_front_fisheye.txt  // 帧对齐信息
  22. │   ├── cam_head_left_fisheye
  23. │   │   ├── head_left_fisheye.h265
  24. │   │   └── head_left_fisheye.txt
  25. │   ├── ...
  26. ├── lidar // 雷达数据
  27. ├── record  // ros消息, *.bag,记录遥操数据、控制指令数据(h5)、本体执行数据(臂、手、底盘等, h5)
  28. │   ├── .bag
  29. │   ├── raw_joints.h5
  30. ├── logs   // 各模块log数据
  31. ├── parameters  // 传感器外参,软硬件参数等
  32. │   ├── hardware  // 硬件版本号和软件版本号
  33. │   ├── camera //相机的内参外参怎么体现
  34. │   │   ├── cam_head
  35. │   │   ├── ...
  36. │   │   └── back_left_fisheye
  37. ├── config   // 各个算法模型的配置文件
  38. │   ├── wbc
  39. │   ├── hal
  40. │   ├── remote_hal
  41. │   ├── hmi
  42. │   ├── feature_manager
  43. │   └── algorithm
  44. └── others  // 其他文件,除meta_info外,其他文件不放在根目录



  45. // meta_info.json
  46. {
  47.     "version": "v0.0.1", //落盘meta_info的版本号,由采集端决定,需向前兼容
  48.     "author": "青龙01",
  49.     "robot_type": "humanoid", // 本体类型
  50.     "camera_list":["cam_left_wrist", "cam_right_wrist",...],
  51.     "camera_type":["d405", "d435",...],
  52.     "camera_fps": "30", // 相机fps
  53.     "fisheye_fps": "30", // 鱼眼fps
  54.     "ee_type": "30", // 末端类型
  55.     "task_id": "1234", // 云端任务模板id
  56.     "job_id":  "",// 云端实例任务id
  57.     "episode_id": 10032, // 数据id
  58.     "duration": "18.02s",
  59.     "file_size": "500.12 MB",
  60.     "create_time": "2024-09-23 09:42:50",
  61. }

  62. // raw_joints.h5
  63. {   
  64.     "state": {
  65.         "timestamp": [] // 精确到纳秒,Unix时间戳
  66.         "joint":{
  67.             "effort": [], // 力矩
  68.             "velocity": [], // 速度
  69.             "position": [], // 关节数据
  70.             "attribute":{ // joint 的 attribute,这里不是key,只是展示说明附在joint上
  71.                 "name":[], // 关节名称,与落盘数据顺序对应
  72.             }
  73.         },
  74.         "robot":{
  75.             "velocity": [], // 机体速度 {odom}系
  76.             "angular ": [], // 机体角速度 {odom}系
  77.             "position": [], // 机体位置 {odom}系
  78.             "orientation": [], // 机体姿态 {odom}系 四元数
  79.             "position_drift": [], // odom->map dirft
  80.             "orientation_drift": [], // odom->map dirft 四元数
  81.             
  82.             "end_velocity": [], // 末端速度 {B}系
  83.             "end_angular ": [], // 末端角速度 {B}系
  84.             "end_position": [], // 末端位置 {B}系
  85.             "end_orientation": [], // 末端姿态XYZ+臂形角 {B}系
  86.             "end_arrival": true, // 可不填
  87.             
  88.             "attribute":{ // robot 的 attribute,这里不是key,只是展示说明附在robot上
  89.                 "name":[], // base_link 名称,end_link名称(从左到右)
  90.             }
  91.         },
  92.         "effector":{
  93.             "force": [], // 末端夹具/五指手力数据
  94.             "position": [], // 末端夹具/五指手关节角度
  95.             "clamped": true, // 可不填
  96.             "attribute":{ // effector的attribute,这里不是key,只是展示说明附在effector上
  97.                 "name":[], // 末端名称,与落盘数据顺序对应
  98.             }
  99.         },
  100.     },

  101.     "action": { // 关节期望指令 国际单位
  102.         "timestamp": [] // 精确到纳秒,Unix时间戳
  103.         "joint":{
  104.             "effort": [], // 力矩
  105.             "velocity": [], // 速度
  106.             "position": [], // 关节数据
  107.             "attribute":{ // joint 的 attribute,这里不是key,只是展示说明附在joint上
  108.                 "name":"", // 关节名称,与落盘数据顺序对应
  109.             }
  110.         },
  111.         "robot":{
  112.             "velocity": [], // 机体速度 {odom}系
  113.             "orientation": [], // 机体姿态 {odom}系 四元数
  114.             // 或者是"angular": [], // 机体角速度 {odom}系?
  115.             "end_position": [], // 末端位置 {B}系
  116.             "end_orientation": [], // 末端姿态XYZ+臂形角 {B}系
  117.             "attribute":{ // robot 的 attribute,这里不是key,只是展示说明附在robot上
  118.                 "name":[], // base_link 名称,end_link名称(从左到右)
  119.             }
  120.         },
  121.         "effector":{
  122.             "force": [], // 末端夹具/五指手力数据
  123.             "position": [], // 末端夹具/五指手关节角度
  124.              "attribute":{ // effector的attribute,这里不是key,只是展示说明附在effector上
  125.                 "name":[], // 末端名称,与落盘数据顺序对应
  126.             }
  127.         }
  128.     }

  129. }
复制代码


云端进行数据标注审核,现阶段包括关键帧标注和质量打标。


  1. "label_info":{ //标注信息
  2.     "is_valid": "false", //动作是否有效
  3.     "is_completed": "true", //动作是否完成
  4.     "error_label":"动作不流畅", //错因标签
  5.     "action_config":[ // 动作过程配置:起止时间 + 文本 + 原子能力
  6.         {
  7.             "start_time": "0.0",
  8.             "end_time": "7.5",
  9.             "action_text":"使用右臂打开 @微波炉",
  10.             "skill": "open"
  11.         },
  12.         {
  13.             "start_time": "7.5",
  14.             "end_time": "16.0",
  15.             "action_text":"使用右臂抓起 @面包2 放进 @微波炉1",
  16.             "skill": "pick_place"
  17.         },
  18.         {
  19.             "start_time": "16.0",
  20.             "end_time": "22.0",
  21.             "action_text":"关闭 @微波炉1",
  22.             "skill": "close"
  23.         },
  24.     ],
  25.    
  26.     "key_frame":[ //关键帧标注
  27.         "frame_id":{
  28.             "start_index": "100",
  29.             "end_index": "120",
  30.             "content":"这是一段文本描述"
  31.         },
  32.         ...
  33.     ]
  34. }
复制代码








本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

评论3

lijiansenLv.7 发表于 2024-11-28 09:08:24 | 查看全部
用户83e34a809511Lv.1 发表于 2024-11-28 13:13:06 | 查看全部
数据原始采集的数据量很大,比如用 ros record 录制下来的多视角相机的图像数据,20s 就有 7G 左右,这个如何做压缩呢
jujubond楼主Lv.2 发表于 2024-12-6 09:20:55 | 查看全部
用户83e34a809511 发表于 2024-11-28 13:13
数据原始采集的数据量很大,比如用 ros record 录制下来的多视角相机的图像数据,20s 就有 7G 左右,这个如 ...

这个我们也考虑到了,会选择不同的压缩模式压缩比例来压缩图像数据,20s约7GB的数据,压缩后大约200MB

回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2025 OPENLOONG. All Rights Reserved. Powered by Discuz!
  • 关注B站
  • 关注抖音
  • 关注微信公众号
Copyright © 2025 开发者论坛 - OpenLoong 版权所有 All Rights Reserved.
关灯 在本版发帖 返回顶部
快速回复 返回顶部 返回列表