交互式数据采集
在接入并激活机器人后,用户需要部署首次模型训练作业产生的模型,修改DAgger配置后开始智能体调试,通过发送任务技能给机器人,同时使用DAGGER数据采集工具采集机械臂轨迹数据,两者协同使用直至交互式数据采集完成。
步骤1:部署模型服务
- 登录CloudRobo控制台。
- 在左侧导航栏选择“运行管理 > 模型部署”,进入“模型部署”页面。
- 单击“部署模型服务”,进入“部署模型服务”界面。
- 请参考以下内容配置参数,其余参数保持默认或者按照实际自行调整。
基础信息
- 服务名称:输入“SO101抓笔进笔筒”。
- 描述:输入“SO101抓笔进笔筒”。
模型配置
- 模型:空间资产-模型,选择创建模型训练作业(首次)中保存的模型,模型版本为v0.0.1。
- r2c协议配置:单击“本地上传”,上传本地准备的r2c.json文件。
环境配置
- 启动命令:在选择模型后会自动生成,无特殊情况不需要修改。
资源配置
- 运行时长:请按照预计采集轨迹时间选择运行时长,正常一小时可以采集约30条轨迹数据。
- 资源池:选择“公共资源池”或“专属资源池”。
- 实例规格:选择1 * SNT9B2 | 24 vCPUs | 192 GiB,或者根据实际资源选择规格。
- 完成后单击“立即部署”,即可开始部署模型。
在模型部署页面,查看已部署的模型服务,模型部署成功后,该模型服务状态为“运行中”。
步骤2:修改DAgger配置
修改/lerobot_dagger/config/dagger_cloud.yaml的num_episodes,即自定义测试次数,修改后请启动DAgger后端脚本。
用户可通过修改num_episodes自定义测试次数。
dataset: ···· num_episodes: 10 #自定义测试次数 ·······
num_episodes是一次数据采集需要采集的轨迹条数,当达到目标轨迹条数时,DAgger后端数据采集脚本会自动终止。按照实际可以重复多次数据采集,最终数据采集完成后需要汇总所有采集的轨迹数据。
每一轮DAgger训练所需的轨迹条数总数需要根据任务难度确定,简单抓放任务一轮大概需要采集100条轨迹数据,因此num_episodes定义为100,用户可以一次性采集所需的轨迹数据,或者num_episodes定义为30,用户可以分3~4次采集所需的轨迹数据。
步骤3:智能体调试
- 登录CloudRobo控制台。
- 在左侧导航栏选择“运行管理 > 机器人”,进入“机器人”页面。
- 找到接入并激活机器人中的在线机器人,单击对应“操作”列的“智能体调试”。
- 在“智能体调试”页面,首次进入请选择步骤1:部署模型服务的“SO101抓笔进笔筒”模型服务与泛化技能。
- 在对话框输入“put pen in the cup”技能,单击
,即开始模型云端推理。 - 在DAGGER数据采集工具的前端页面单击“开始策略控制”,会将端侧的观测数据通过r2c协议上传到云端,云端会下发推理的动作到机器人。
在DAGGER数据采集工具的前端页面会可视化展示机械臂运行实况。
图1 实时展示机械臂
智能体调试对话框会展示云端接收的观测结果。
图2 智能体调试示例
如果要了解完整的DAGGER数据采集控制界面与CloudRobo平台使用,请参见协同使用DAGGER数据采集控制界面与CloudRobo平台。
r2c.json文件
下面为一个r2c.json文件内容示例,该json文件中input_features的key根据需要可以修改,比如第三视角相机的名字可能是“observation.images.external”而不是“observation.images.front”,需要与lerobot_dagger/config/dagger_cloud.yaml的相机名字保持一致。
{
"model_feature_mapping": {
"input_features": {
"observation.state": {
"shape": [6],
"dtype": "float32",
"values": [
"observation.joint_states.position@{joint_1}",
"observation.joint_states.position@{joint_2}",
"observation.joint_states.position@{joint_3}",
"observation.joint_states.position@{joint_4}",
"observation.joint_states.position@{joint_5}",
"observation.joint_states.position@{joint_6}"
]
},
"observation.images.front": {
"dtype": "float32",
"value": "observations.images.color.front"
},
"observation.images.wrist": {
"dtype": "float32",
"value": "observations.images.color.wrist"
},
"task":{
"type": "PROMPT"
}
},
"output_features": {
"action": {
"chunk_size": 50,
"shape": [6],
"values": [
"actions.joint_states.position@{joint_1}",
"actions.joint_states.position@{joint_2}",
"actions.joint_states.position@{joint_3}",
"actions.joint_states.position@{joint_4}",
"actions.joint_states.position@{joint_5}",
"actions.joint_states.position@{joint_6}"
]
}
}
},
"stop_condition": {
"max_iter_num": 60,
"max_run_time": 5
}
}