11. ACT数据采集#
11.1 环境配置#
- 创建conda环境
conda create -n airbot_data python=3.10
default_action: [
# arms will not move when demonstrating
-0.233,-0.73, 1.088, 1.774, -1.1475, -0.1606, # left_arm (6 joints)
1.0, # left_arm_eef (1 joint)
0.2258, -0.6518, 0.9543, -1.777, 1.0615, 0.3588, # right_arm (6 joints)
1.0, # right_arm_eef (1 joint)
0.0, -0.0, # head (2 joints)
0.0, # spine (1 joint)
0.0, -0.0, # head (2 joints)
]
进入airbot_data虚拟环境:
注意:后续命令要在
airbot_data环境下执行!
11.2 数据采集#
11.2.1 配置环境#
下载data-collection并进入根目录中执行安装脚本:
git clone https://git.qiuzhi.tech/airbot-data-loop/data-collection.git
cd data-collection
bash install.sh
11.2.2 采集数据#
11.2.2.1 启动MMK2#
- 开启底盘电源
- 开启本体电源
- 开启机械臂电源
- 进入遥控模式:待自检通过(白灯)后,按手柄
Start键进入遥控模式(绿灯) - 进入背包示教模式:按手柄
X键进入背包示教模式(身体浅蓝灯,头白灯) - 开始示教同步:
- 打开示教背包电源
- 穿戴背包
- 等待30秒后按手柄
LB + RB开始示教同步(头灯由白变浅蓝)
11.2.2.2 连接MMK2#
11.2.2.3 mmk2配置文件#
打开data-collection文件夹,配置文件路径如下:airbot_data_collection/airbot/configs/robots/airbot_mmk.yaml
_target_: airbot_data_collection.airbot.robots.airbot_mmk.AIRBOTMMK
ip: 192.168.11.200
components: [left_arm, left_arm_eef, right_arm, right_arm_eef, head, spine]
cameras:
head_camera:
camera_type: REALSENSE
rgb_camera.color_profile: 640,480,30
enable_depth: "false"
align_depth.enable: "false"
# serial_no: "'123456'" # multiple rs-cameras case
left_camera:
camera_type: USB
video_device: /dev/left_camera
image_width: "640"
image_height: "480"
framerate: "25"
right_camera:
camera_type: "USB"
video_device: /dev/right_camera
image_width: "640"
image_height: "480"
framerate: "25"
default_action:
[
# arms will not move when demonstrating
-0.233, -0.73, 1.088, 1.774, -1.1475, -0.1606, # left_arm (6 joints)
1.0, # left_arm_eef (1 joint)
0.2258, -0.6518, 0.9543, -1.777, 1.0615, 0.3588, # right_arm (6 joints)
1.0, # right_arm_eef (1 joint)
0.0, -0.0, # head (2 joints)
0.0, # spine (1 joint)
]
参数解释:
- ip:机器人的ip地址,建议使用有线连接以提高数据采集频率,保证数据质量
- components:需要使用的机器人的部件
- cameras: 需要使用的相机的配置参数
- default_action:机器人的初始关节角,注意顺序与components保持对齐!
11.2.3 数据采集主配置文件#
数据采集主配置文件位于:airbot_data_collection/airbot/configs/mains/mmk.yaml,通常需进行如下修改:
- 任务信息(task_info)。如果训练 pi0 等VLA模型,对文本描述有要求,需要尽量准确,示例如下:
task_info:
operator: hanyang
station: mmk-MK11QWZ025170023
task_name: pick wooden blocks and place and stack
task_description: pick the wooden blocks from the bowl with the gripper, and place all wooden blocks on the desktop,and stack the wooden blocks one by one
task_description_zh: 用夹爪从碗中拾取木制积木,将木制积木放置在桌面上,将木制积木逐个堆叠
task_id: 120
# 单个技能配置
# skill: grasp
# 多个技能配置示例 (取消注释并注释上面的单行配置):
skill:
- grasp
- place
object:
- wooden blocks
- bowl
scene: desktop
subtasks:
- skill: grasp
description: "pick the wooden blocks from the bowl with the gripper"
description_zh: "用夹爪从碗中拾取木制积木"
- skill: "place {A} on {B}"
description: "place the wooden blocks on the desktop"
description_zh: "将木制积木放置在桌面上"
- skill: "stack {A} on {B}"
description: "stack the wooden blocks one by one"
description_zh: "将木制积木逐个堆叠"
- 数据保存目录(dataset.directory)。数据将默认保存在airbot_data_collection/data/
路径下 - 数据采集频率(update_rate)。所有数据更新的频率,单位为Hz
- 数据大小上限(sample_limit.size)。数据采集的最大长度,即最多采集多少数据点,在到达该上限之前若未手动保存,则在到达时默认将自动保存
11.2.4 mcap数据集格式定义#
采集话题如下:
# Topic configurations
# 状态数据
MCAP_STATE_TOPICS = [
"/mmk/observation/left_arm/joint_state/position",
"/mmk/observation/left_arm_eef/joint_state/position",
"/mmk/observation/right_arm/joint_state/position",
"/mmk/observation/right_arm_eef/joint_state/position",
"/mmk/observation/head/joint_state/position",
"/mmk/observation/spine/joint_state/position",
]
# 动作数据话题
MCAP_ACTION_TOPICS = [
"/mmk/action/left_arm/joint_state/position",
"/mmk/action/left_arm_eef/joint_state/position",
"/mmk/action/right_arm/joint_state/position",
"/mmk/action/right_arm_eef/joint_state/position",
"/mmk/action/head/joint_state/position",
"/mmk/action/spine/joint_state/position",
]
# 相机数据话题
MCAP_CAMERA_NAMES = [
"/mmk/head_camera/color/image_raw",
"/mmk/left_camera/color/image_raw",
"/mmk/right_camera/color/image_raw",
]
11.2.5 开始采集#
11.2.5.1 指令#
重要提醒
- 必须进入背包示教模式后才能运行数据采集! 否则会报错
- 数据将保存为 MCAP 格式
11.2.5.2 按键#
注意
避免连续按键以防止重复行为
执行上述命令后,您可以使用键盘来控制操作。键盘按键的功能说明如下:
| 按键 | 功能说明 |
|---|---|
| 空格键 | 开始录制一段数据。录制完所有帧后,数据将自动保存。 |
| s键 | 在当前录制尚未完成所有帧时停止录制并保存数据。这会导致录制的数据长度不同。 |
| q键 | 放弃当前录制或重新录制上一段数据。 |
| p键 | 在终端打印当前机器人的状态信息。 |
| i键 | 再次显示这些操作说明。 |
| z/ESC键 | 退出采集程序。 |
11.2.5.3 操作步骤#
- 启动程序:每个摄像头的实时窗口将会出现。
- 开始录制:按下空格键开始录制数据并遥操MMK2完成目标任务。
- 放弃录制:如果示教操作不可接受,请按
q键以放弃当前录制过程。 - 任务完成:
- 等待收集到指定数量的帧或按
s键立即保存数据(实际任务所花费的帧数应尽可能接近最大收集帧数) - 收集完所有帧后,数据将自动保存。保存后,MMK2将自动返回到初始位置。
- 等待收集到指定数量的帧或按
- 数据保存:数据将默认保存到当前目录下的
./data/<task_name>文件夹中。每个收集的场景数据包括:index.mcap:摄像头的视频,机器人的状态,帧数及采集帧率,每帧(低维数据和图像)的时间戳
11.2.5.4 附加建议#
- 任务时长:尽量确保在达到最大帧数限制之前完成任务,即不要过早结束动作。
- 移动速度:机械臂的移动速度不应过快,否则收集到的信息将会变得稀疏,且图像质量也会不高。
- 数据备份:建议将收集到的任务数据文件夹
<task_name>保存在便携式硬盘上的相同目录结构中,以作为备份。
11.2.6 数据检查(可选)#
- 图像质量:图像数据不能存在破损
- 话题格式:话题格式需要满足要求
在 airbot_data_collection 运行如下脚本:
- dir参数:mcap 数据文件夹,存放多个数据集文件
- print_details:每个mcap文件的详细信息 ,可以省略
程序输出示例如下:
=== Summary Report ===
INFO:__main__:Total files: 55
INFO:__main__:Normal files: 53
INFO:__main__:Abnormal files: 2
INFO:__main__:Abnormal files and issues:
INFO:__main__: data/mcap/mmk2_pick_and_place_wooden_blocks_0731/13.mcap:
INFO:__main__: - Mismatch: Message len=492 > Min video frames=491
INFO:__main__: data/mcap/mmk2_pick_and_place_wooden_blocks_0731/44.mcap:
INFO:__main__: - Mismatch: Message len=507 > Min video frames=506
注意:
该检查默认会检查3个相机(左右手和头部),并将缺少相机的数据列为不正常数据。如果实际仅使用了部分相机,请忽略该提示。
如果需要继续采集数据,请先删除status文件避免采集数据序号不连续:
11.2.7 数据可视化检查#
11.3 真机数据回放#
注意:
回放前请将退出背包示教模式(建议在绿灯的Start模式)
mcap格式的真机数据回放(replay)功能位于airbot_data_collection/tests/replay_mcap_mmk.py,在data-collection目录下打开终端,然后执行如下命令:
conda activate airbot_data
cd airbot_data_collection
#使用示例,建议使用绝对路径索引需要回放的mcap文件位置
python3 tests/replay_mcap_mmk.py data/0606/0.mcap -f 20 -ip 172.25.11.188
参数解释:
- f:数据回放的频率,一般可设置与原始数据频率一致
- ip:需要replay的mmk2 ip地址