更新时间:2026-08-05 GMT+08:00
分享

交互式数据采集

在接入并激活机器人后,用户需要部署首次模型训练作业产生的模型,修改DAgger配置后开始智能体调试,通过发送任务技能给机器人,同时使用DAGGER数据采集工具采集机械臂轨迹数据,两者协同使用直至交互式数据采集完成。

步骤1:部署模型服务

  1. 登录CloudRobo控制台
  2. 在左侧导航栏选择“运行管理 > 模型部署”,进入“模型部署”页面。
  3. 单击“部署模型服务”,进入“部署模型服务”界面。
  4. 请参考以下内容配置参数,其余参数保持默认或者按照实际自行调整。

    基础信息

    • 服务名称:输入“SO101抓笔进笔筒”。
    • 描述:输入“SO101抓笔进笔筒”。

    模型配置

    环境配置

    • 启动命令:在选择模型后会自动生成,无特殊情况不需要修改。

    资源配置

    • 运行时长:请按照预计采集轨迹时间选择运行时长,正常一小时可以采集约30条轨迹数据。
    • 资源池:选择“公共资源池”或“专属资源池”。
    • 实例规格:选择1 * SNT9B2 | 24 vCPUs | 192 GiB,或者根据实际资源选择规格。

  5. 完成后单击“立即部署”,即可开始部署模型。

    在模型部署页面,查看已部署的模型服务,模型部署成功后,该模型服务状态为“运行中”。

步骤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:智能体调试

  1. 登录CloudRobo控制台
  2. 在左侧导航栏选择“运行管理 > 机器人”,进入“机器人”页面。
  3. 找到接入并激活机器人中的在线机器人,单击对应“操作”列的“智能体调试”。
  4. 在“智能体调试”页面,首次进入请选择步骤1:部署模型服务的“SO101抓笔进笔筒”模型服务与泛化技能。
  5. 在对话框输入“put pen in the cup”技能,单击,即开始模型云端推理。
  6. 在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
    }
}

相关文档