赛事数据
为最大程度保留原始数据中的信息,本次赛事统一采用 rosbag 包作为数据格式。参赛者可自由利用 rosbag 中提供的多源传感器数据进行模型训练。
数据集下载
数据集下载需要使用阿里云对象存储 OSS,说明如下。
ossutil 下载与安装
Linux/macOS 一键安装(推荐)
sudo -v ; curl https://gosspublic.alicdn.com/ossutil/install.sh | sudo bash备注
安装过程中需要解压工具(unzip 或 7z),请提前安装。安装完成后,
ossutil将安装到/usr/bin/目录下。下载地址
平台
地址
Linux x86_64
Linux x86_32
Linux arm_64
Windows x64
Windows x32
macOS 64
macOS arm_64
手动安装方法
# 1. 下载压缩包(以 Linux x64 为例) wget https://gosspublic.alicdn.com/ossutil/1.7.19/ossutil-v1.7.19-linux-amd64.zip # 2. 解压 unzip ossutil-v1.7.19-linux-amd64.zip # 3. 添加执行权限 chmod +x ossutil # 4. 移动到系统 PATH 目录(可选) sudo mv ossutil /usr/local/bin/验证安装
ossutil如果显示使用选项,则安装成功。若需更新版本,可执行:
ossutil updateossutil 配置
交互式配置(推荐):
ossutil config按提示输入:
配置文件路径:默认为
~/.ossutilconfig,直接回车使用默认路径语言设置:输入
CH(中文)或EN(英文)Endpoint:
https://oss-cn-hangzhou.aliyuncs.comAccessKey ID:
LTAI5tJCN2XX2sYt6wWhdvqkAccessKey Secret:
xbROt0HCaQexY2JrLl2UDScvS3qHpj遇到
systoken直接回车即可,提示出现的先后顺序可能不同。验证配置与使用
验证配置
# 输出指定桶名下的文件夹(不包含子文件) ossutil ls oss://kuavo-data-challenge-simdata/ -d若能正常显示存储空间列表,说明配置成功。
浏览存储空间内容
# 列出指定存储空间的对象(不包括子目录) ossutil ls oss://kuavo-data-challenge-simdata/ -d # 递归列出所有对象(包括子目录) ossutil ls oss://kuavo-data-challenge-simdata/ # 递归列出指定前缀的对象(包括子目录) ossutil ls oss://kuavo-data-challenge-simdata/folder-name/查看对象信息
# 查看单个对象的详细信息 ossutil stat oss://kuavo-data-challenge-simdata/file-name # 查看特定路径对象个数与空间占用 ossutil du oss://kuavo-data-challenge-simdata/file-name搜索文件
# 按文件名模式搜索 --include ossutil ls oss://kuavo-data-challenge-simdata/ --include "*.jpg" # 排除特定文件 --exclude ossutil ls oss://kuavo-data-challenge-simdata/ --exclude "*.tmp" # 组合使用包含与排除 ossutil ls oss://kuavo-data-challenge-simdata/ --include "*.log" --exclude "*debug*"下载说明
下载单个文件
# 下载文件到当前目录 ossutil cp oss://kuavo-data-challenge-simdata/<file-path>/<file-name> ./ # 下载文件并重命名 ossutil cp oss://kuavo-data-challenge-simdata/<file-path>/<file-name> <local-path>/<local-name> # 下载文件到指定目录 ossutil cp oss://kuavo-data-challenge-simdata/<file-path>/<file-name> <local-path>批量下载文件
# 下载整个目录 -r ossutil cp -r oss://kuavo-data-challenge-simdata/<file-path>/ <local-path>断点续传下载
# 启用断点续传(大文件自动启用) -u ossutil cp -u oss://kuavo-data-challenge-simdata/large-file.zip ./local-folder/ ossutil cp -u -r oss://kuavo-data-challenge-simdata/remote-folder/ ./local-folder/ # 设置分块个数 -j ossutil cp oss://kuavo-data-challenge-simdata/large-file.zip ./local-folder/ -j 5常见问题
使用
-j 10增加并行任务数以提高下载速度使用
-u参数启用断点续传视频教程
rosbag 数据
参考 HuggingFace 开源的 lerobot 项目,赛事方同时提供了将 Kuavo 机器人 rosbag 数据转换为 Lerobot 数据集格式的工具,其中包含 深度相机 等多模态数据。具体实现可参阅赛事主办方发布的 kuavo_data_challenge 仓库中的数据转换脚本。数据格式的具体细节如下:
rosbag 话题说明
/cam_x/color/image_raw/compressed 相机彩色图像数据
- 功能描述
/cam_x/color/image_raw/compressed 话题用于提供相机的原始彩色图像的压缩图像数据,其中,x 为 h、l 或 r,分别表示头部、左腕或右腕相机。
- 消息类型
类型: sensor_msgs/CompressedImage
- 消息字段
header (std_msgs/Header): 消息头信息, 包含时间戳、序列号、坐标系 ID 等信息
format (string): 图像编码格式
data (uint8[]): 图像数据
/cam_h/depth/image_raw/compressed 头部相机深度图像数据
- 功能描述
/cam_h/depth/image_raw/compressed 话题用于提供头部相机的原始深度图像经过压缩后的图像数据。
- 消息类型
类型: sensor_msgs/CompressedImage
- 消息字段
header (std_msgs/Header): 消息头信息, 包含时间戳、序列号、坐标系 ID 等信息
format (string): 图像编码格式
data (uint8[]): 图像数据
/cam_x/depth/image_rect_raw/compressed 左腕、右腕相机深度图像数据
- 功能描述
/cam_x/depth/image_rect_raw 话题用于提供左腕或右腕相机的原始深度图像经过校正、压缩后的图像数据,其中,x 为 l 或 r,分别表示左腕或右腕相机。
- 消息类型
类型: sensor_msgs/CompressedImage
- 消息字段
header (std_msgs/Header): 消息头信息, 包含时间戳、序列号、坐标系 ID 等信息
format (string): 图像编码格式
data (uint8[]): 图像数据
/kuavo_arm_traj 手臂运动控制
- 功能描述
/kuavo_arm_traj 话题用于控制机器人手臂运动,通过发布手臂目标关节位置来实现手臂的精确控制
- 消息类型
类型: sensor_msgs/JointState
- 消息字段
header (std_msgs/Header): 消息头信息, 包含时间戳、序列号、坐标系 ID 等信息
name (list of string): 关节名称列表,假设有 14 个关节,名称为 "arm_joint_1" 到 "arm_joint_14"。
position (list of float): 当前关节位置列表。数据结构跟下面 sensors_data_raw 12-25条相同
/gripper/command 夹抓控制(仅限仿真数据)
- 功能描述
/gripper/command 话题用于控制仿真中机器人双手(手指)的运动。
- 话题类型
类型: sensor_msgs/JointState
- 消息字段
header (std_msgs/Header): 消息头信息, 包含时间戳、序列号、坐标系 ID 等信息
position (list of float): 数组长度为2, 数据为左夹爪和右夹爪的目标位置, 每个元素的取值范围为[0, 255], 0 为张开,255 为闭合。
/gripper/state 夹抓状态(仅限仿真数据)
- 功能描述
/gripper/state 话题用于获取仿真中机器人双手(手指)的运动状态。
- 话题类型
类型: sensor_msgs/JointState
- 消息字段
header (std_msgs/Header): 消息头信息, 包含时间戳、序列号、坐标系 ID 等信息
position (list of float): 数组长度为2, 数据为左夹爪和右夹爪的位置, 每个元素的取值范围为[0, 0.8], 0 为张开,0.8 为闭合。
/control_robot_hand_position 灵巧手控制(仅限真机数据)
- 功能描述
/control_robot_hand_position 话题用于控制机器人双手(手指)的运动,通过发布手指目标关节位置来实现手部的精确控制。
- 话题类型
类型: kuavo_msgs/robotHandPosition
- 消息字段
left_hand_position (list of float): 左手位置,包含6个元素,每个元素的取值范围为[0, 100], 0 为张开,100 为闭合。
right_hand_position (list of float): 右手位置,包含6个元素,每个元素的取值范围为[0, 100], 0 为张开,100 为闭合。
/dexhand/state 灵巧手的状态(仅限真机数据)
- 话题描述
发布灵巧手的状态数据.
- 消息类型
类型: sensor_msgs/JointState
- 消息字段
name (list of string): 关节名称数组, 包含12个关节名称:
position (list of float): 关节位置数组, 长度为12, 前6个为左手关节位置, 后6个为右手关节位置
velocity (list of float): 关节速度数组, 长度为12, 前6个为左手关节速度, 后6个为右手关节速度
effort (list of float): 关节电流数组, 长度为12, 前6个为左手关节电流, 后6个为右手关节电流
/control_robot_leju_claw 夹抓控制(仅限真机数据)
- 功能描述
/control_robot_leju_claw 话题用于机器人夹爪(二指爪)的控制。
- 话题类型
类型: kuavo_msgs/controlLejuClaw
- 消息字段
name (list of string): 数组长度为2, 数据为"left_claw", "right_claw"
position (list of float): 数组长度为2, 数据为左夹爪和右夹爪的目标位置, 每个元素的取值范围为[0, 100], 0 为张开,100 为闭合。
velocity (list of float): 数组长度为2, 夹爪目标速度值, 0 ~ 100, 不填写时默认为50
effort (list of float): 数组长度为2, 夹爪目标电流, 单位 A, 不填写时默认为 1.0A
/leju_claw_state 获取机器人夹爪(二指爪)状态(仅限真机数据)
- 服务描述
/leju_claw_state话题用于发布机器人夹爪(二指爪)的状态,位置,速度,力矩等信息。
- 服务消息类型
kuavo_msgs/lejuClawState
- 消息字段
state: 数据类型 int8[];二指夹爪的状态, 数组长度为2, 第一个为左夹爪, 第二个为右夹爪
data: 数据类型 kuavo_msgs/endEffectorData;二指夹爪的位置, 速度, 力距等信息
state 状态值含义:
-1 : Error, 表示有执行时有错误
0 : Unknown, 初始化时默认的状态
1 : Moving, 表示夹爪正在执行, 移动中
2 : Reached, 表示夹爪已经执行到达期望的位置
3 : Grabbed, 表示夹爪抓取到物品
关于 data 字段中 kuavo_msgs/endEffectorData的消息在/control_robot_leju_claw部分有介绍。
/sensors_data_raw 传感器数据
- 话题描述
话题用于发布实物机器人或仿真器的传感器原始数据,包括关节数据、IMU数据和末端执行器数据。
- 消息类型
类型: kuavo_msgs/sensorsData
- 消息字段
sensor_time (time): 时间戳
joint_data (kuavo_msgs/jointData): 关节数据: 位置、速度、加速度、电流
imu_data (kuavo_msgs/imuData): 包含陀螺仪、加速度计、自由加速度、四元数
end_effector_data (kuavo_msgs/endEffectorData): 末端数据,暂未使用.
- 关节数据说明
数据顺序
前 12 个数据为下肢电机数据:
0~5 为左下肢数据 (l_leg_roll, l_leg_yaw, l_leg_pitch, l_knee, l_foot_pitch, l_foot_roll)
6~11 为右下肢数据 (r_leg_roll, r_leg_yaw, r_leg_pitch, r_knee, r_foot_pitch, r_foot_roll)
接着 14 个数据为手臂电机数据:
12~18 左臂电机数据 ("l_arm_pitch", "l_arm_roll", "l_arm_yaw", "l_forearm_pitch", "l_hand_yaw", "l_hand_pitch", "l_hand_roll")
19~25 为右臂电机数据 ("r_arm_pitch", "r_arm_roll", "r_arm_yaw", "r_forearm_pitch", "r_hand_yaw", "r_hand_pitch", "r_hand_roll")
最后 2 个为头部电机数据: head_yaw 和 head_pitch
单位:
位置: 弧度 (radian)
速度: 弧度每秒 (radian/s)
加速度: 弧度每平方秒 (radian/s²)
电流: 安培 (A)
- IMU 数据说明
gyro: 陀螺仪的角速度,单位弧度每秒(rad/s)
acc: 加速度计的加速度,单位米每平方秒(m/s²)
quat: IMU的姿态(orientation)
/joint_cmd 所有关节的控制指令
- 话题描述
话题用于发布全身所有关节的控制指令
- 消息类型
类型: kuavo_msgs/jointCmd
- 消息字段
header (std_msgs/Header): 消息头信息, 包含时间戳、序列号、坐标系 ID 等信息
joint_q (list of float): 关节位置, 单位(radian)
joint_v (list of float): 关节速度, 单位(radian/s)
tau (list of float): 关节扭矩, 单位(N·m)
tau_max (list of float): 最大关节扭矩, 单位(N·m)
tau_ratio (list of float): 扭矩系数
joint_kp (list of float): kp 参数
joint_kd (list of float): kd 参数
control_modes (list of int): 关节对应的控制模式,0为Torque 控制模式, 1为Velocity 控制模式, 2为Position 控制模式
/cmd_pose_world 机器人位置指令(仅限任务4)
- 话题描述
话题用于发布机器人位置指令
- 消息类型
类型: geometry_msgs/Twist
- 消息字段
linear.x (float): 基于世界坐标系的 x 方向值,单位为米 (m)。
linear.y (float): 基于世界坐标系的 y 方向值,单位为米 (m)。
linear.z (float): 基于世界坐标系的 z 方向值,单位为米 (m)。
angular.x (float): 基于世界坐标系的 x 方向旋转角度,单位为弧度 (radian)。
angular.y (float): 基于世界坐标系的 y 方向旋转角度,单位为弧度 (radian)。
angular.z (float): 基于世界坐标系的 z 方向旋转角度,单位为弧度 (radian)。
lerobot 数据
rosbag 转 Lerobot 格式
请先完成安装指南,并参考 kuavo_data_challenge 仓库的教程将 Kuavo 原生 rosbag 数据转换为 Lerobot 框架可用的 parquet 格式:
python kuavo_data/CvtRosbag2Lerobot.py \
--config-path=../configs/data/ \
--config-name=KuavoRosbag2Lerobot.yaml \
rosbag.rosbag_dir=/path/to/rosbag \
rosbag.lerobot_dir=/path/to/lerobot_data
说明:
rosbag.rosbag_dir:原始 rosbag 数据路径
rosbag.lerobot_dir:转换后的lerobot-parquet 数据保存路径,通常会在此目录下创建一个名为lerobot的子文件夹
configs/data/KuavoRosbag2Lerobot.yaml:请查看并根据需要选择启用的相机及是否使用深度图像等
lerobot数据目录结构说明
执行脚本后,会生成标准lerobot格式数据集。目录结构如下:
output_dir/
├── data/
│ └── chunk-000/
│ ├── episode_000000.parquet # 转换后的数据,包含所有指定转换的数据特征
│ ├── episode_000001.parquet
│ └── ...
├── meta/
│ ├── episodes.jsonl # 每个 episode 的时长
│ ├── info.json # data/ 下各 parquet 的特征信息
│ └── tasks.jsonl # 当前任务名称
└── images/
├── observation.images.color.head_cam_h/
│ ├── episode_000000/
│ │ ├── frame_000000.png
│ │ └── frame_000001.png
│ └── ...
├── observation.images.color.wrist_cam_l/
└── observation.images.color.wrist_cam_r/
info.json 文件中记录了当前所有可用的数据特征的格式。主要可用特征如下:
{
"features": {
"observation.state": { # 机器人状态,包括14个手臂关节状态和2个末端执行器状态,顺序如 names 中所示
"dtype": "float32",
"shape": [
16
],
"names": {
"motors": [
"zarm_l1_link",
"zarm_l2_link",
"zarm_l3_link",
"zarm_l4_link",
"zarm_l5_link",
"zarm_l6_link",
"zarm_l7_link",
"left_claw",
"zarm_r1_link",
"zarm_r2_link",
"zarm_r3_link",
"zarm_r4_link",
"zarm_r5_link",
"zarm_r6_link",
"zarm_r7_link",
"right_claw"
]
}
},
"action": { # 动作数据,包含14个手臂关节动作和2个末端执行器动作,顺序如 names 中所示
"dtype": "float32",
"shape": [
16
],
"names": {
"motors": [
"zarm_l1_link",
"zarm_l2_link",
"zarm_l3_link",
"zarm_l4_link",
"zarm_l5_link",
"zarm_l6_link",
"zarm_l7_link",
"left_claw",
"zarm_r1_link",
"zarm_r2_link",
"zarm_r3_link",
"zarm_r4_link",
"zarm_r5_link",
"zarm_r6_link",
"zarm_r7_link",
"right_claw"
]
}
},
"observation.images.head_cam_h": { # 头部相机RGB图像数据
"dtype": "image",
"shape": [
3,
480,
640
],
"names": [
"channels",
"height",
"width"
]
},
"observation.depth_h": { # 头部相机深度图像数据
"dtype": "uint16",
"shape": [
1,
480,
640
],
"names": [
"channels",
"height",
"width"
]
},
"observation.images.wrist_cam_l": { # 左腕相机RGB图像数据
"dtype": "image",
"shape": [
3,
480,
640
],
"names": [
"channels",
"height",
"width"
]
},
"observation.depth_l": { # 左腕相机深度图像数据
"dtype": "uint16",
"shape": [
1,
480,
640
],
"names": [
"channels",
"height",
"width"
]
},
"observation.images.wrist_cam_r": { # 右腕相机RGB图像数据
"dtype": "image",
"shape": [
3,
480,
640
],
"names": [
"channels",
"height",
"width"
]
}
"observation.depth_r": { # 右腕相机深度图像数据
"dtype": "uint16",
"shape": [
1,
480,
640
],
"names": [
"channels",
"height",
"width"
]
}
}
}