ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

LeRobot 物理机器人端到端实操指南:OMX Follower 立方体抓取放置(数据采集 → ACT 训练 → 自主部署)

LeRobot 物理机器人端到端实操指南:OMX Follower 立方体抓取放置(数据采集 → ACT 训练 → 自主部署) LeRobot 物理机器人端到端实操指南OMX Follower 立方体抓取放置数据采集 → ACT 训练 → 自主部署【免费下载链接】lerobot LeRobot: Making AI for Robotics more accessible with end-to-end learning项目地址: https://gitcode.com/GitHub_Trending/le/lerobot本指南基于 LeRobot 仓库中的examples/omx示例README完整复现一条真实硬件上跑通模仿学习的闭环链路用 OMX Follower 机械臂执行把立方体抓起来放进蓝色方块这一单任务先采集 50 个演示回合构成数据集再用 ACT 策略训练 2 万步最后通过lerobot-rollout让机械臂自主运行。读完本文你将掌握 LeRobot 的lerobot-record/lerobot-train/lerobot-rollout三大 CLI 在物理机器人上的组合用法以及两个配套自动化脚本环境重置与免遥操作自动采集的源码级实现原理可直接套用到你自己的单臂抓取场景。示例概览一次完整的端到端流程该示例是 LeRobot 团队在自有物理平台上验证 API 与 CLI 的实战参考。它针对OMX Follower单臂机器人演示了四条相互衔接的步骤采集通过lerobot-record以 OMX Leader 遥操作采集演示数据或运行record_grab.py全自动采集训练用lerobot-train在采集到的数据集上训练 ACT 策略部署用lerobot-rollout让训练好的策略自主执行任务重置用reset_environment.py把工作区恢复原状为采集与评估提供统一起点。原 README 明确强调该示例是WIP进行中且针对 LeRobot 内部特定物理装置编写并非通用数据采集脚本。因此本文在讲解时会同步标注哪些命令具有通用性、哪些是本次实验环境特有的方便你在自己的设备上做对应调整。硬件配置组件配置机器人OMX Follower跟随臂相机2× OpenCV 相机腕部 顶部俯视从源码看OmxFollower的关节配置omx_follower.py由 6 个 Dynamixel 总线电机组成shoulder_pan、shoulder_lift、elbow_flex使用 XL430-W250wrist_flex、wrist_roll、gripper使用 XL330-M288遥操作侧的OmxLeaderomx_leader.py则使用 5 个 XL330-M288 加 1 个 XL330-M077 夹爪电机。OMX 系列出厂即预配置电机 ID、通信参数、关节偏移均已设定无需手动校准即可使用详细硬件准备见 docs/source/omx.mdx。环境准备安装 LeRobot确保当前 Python 环境已安装 LeRobot。仓库内安装说明见 docs/source/installation.mdxOMX 依赖 Dynamixel 电机总线需额外安装 Dynamixel 驱动组件pip install -e .[dynamixel]连接双臂前建议先用lerobot-find-port确认各机械臂对应的串口设备详见 docs/source/omx.mdx其中也包含 Linux 下用 udev 规则固定ttyACM0/ttyACM1设备名的建议可避免拔插或重启后串口号漂移。声明环境变量按你的系统配置调整相机索引和机器人串口然后导出以下变量export ROBOT_PORT/dev/ttyACM0 export TELEOP_PORT/dev/ttyACM1 export HF_USERNAMEyour_hf_username export ROBOT_CAMERAS{ wrist: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30, fourcc: MJPG}, top: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30, fourcc: MJPG} }其中ROBOT_PORT/TELEOP_PORT分别对应 Follower 与 Leader 臂的串口设备路径HF_USERNAME你的 Hugging Face 用户名用于构造数据集与模型的repo_idROBOT_CAMERAS以 YAML 内联语法声明的相机配置声明了两路 OpenCV 相机——wrist腕部索引 0与top顶部俯视索引 2分辨率 640×480、30 FPS、MJPG 编码。index_or_path需要根据你机器上实际的相机编号调整。相机配置最终会落到OmxFollowerConfig.camerasconfig_omx_follower.py由make_cameras_from_configs实例化并在OmxFollower.get_observation中随关节状态一并读取见下文源码剖析。Step 1 — 采集数据遥操作运行lerobot-record进行人工遥操作演示采集lerobot-record \ --robot.typeomx_follower \ --robot.port$ROBOT_PORT \ --robot.idomx_follower \ --robot.cameras$ROBOT_CAMERAS \ --teleop.typeomx_leader \ --teleop.port$TELEOP_PORT \ --teleop.idomx_leader \ --dataset.repo_id$HF_USERNAME/omx_pickandplace \ --dataset.rootdata/omx_pickandplace \ --dataset.num_episodes50 \ --dataset.single_taskPick the cube and place it in the blue square \ --dataset.streaming_encodingtrue \ --dataset.push_to_hubtrue各参数说明参数含义--robot.typeomx_follower/--robot.id机器人注册名与总线实例标识对应OmxFollowerConfig注册名见 config_omx_follower.py--robot.portFollower 臂串口即$ROBOT_PORT--robot.cameras上文声明的双相机配置--teleop.typeomx_leader/--teleop.port遥操作 Leader 臂注册名与串口对应OmxLeaderConfigconfig_omx_leader.py--dataset.repo_id数据集在 Hub 上的标识本示例为$HF_USERNAME/omx_pickandplace--dataset.root数据集本地存储根目录data/omx_pickandplace--dataset.num_episodes50计划采集的回合数DatasetRecordConfig默认值即为 50见 configs/dataset.py--dataset.single_task本数据集对应的语言任务描述训练与部署阶段会保持一致--dataset.streaming_encodingtrue边采集边流式编码视频避免回合结束时一次性编码阻塞--dataset.push_to_hubtrue采集完成后将数据集上传到 Hugging Face HubBonus免遥操作全自动采集脚本原 README 特别提醒该脚本针对本实验装置与抓取放置立方体这一具体任务编写不是通用采集脚本且无需遥操作设备。命令如下python -m examples.omx.record_grab \ --robot.typeomx_follower \ --robot.port$ROBOT_PORT \ --robot.idomx_follower \ --robot.cameras$ROBOT_CAMERAS \ --dataset.repo_id$HF_USERNAME/omx_pickandplace \ --dataset.rootdata/omx_pickandplace \ --dataset.num_episodes50 \ --dataset.single_taskPick the cube and place it in the blue square \ --dataset.streaming_encodingtrue \ --dataset.push_to_hubtrue每个回合的自动流程与 record_grab.py 主循环一致机械臂从工作区中心抓起立方体放到一个随机位置grab_cubeplace_cube机械臂回到 HOME 位姿录制一次定点抓取演示HOME → 抬高接近 → 下降到立方体上方 → 闭合夹爪 → 提起 → 搬运 → 放下 → HOME。脚本还额外支持两个可选参数来自OmxRecordGrabConfig见 record_grab.py--resumetrue在已有数据集上续录内部走LeRobotDataset.resume--recovery_prob0.5每回合以 50% 概率从随机卡死姿态夹爪闭合、抓取失败的物理合理姿态由_random_stuck_pose生成开始录制从而产生失败恢复数据提升策略鲁棒性设为 0.0 可关闭。另外README 提到 Hub 上已有可直接复用的公开数据集与预训练模型omx_pickandplace数据集与omx_pickandplace_actACT 策略如果你只想体验训练与部署环节可以跳过采集直接用这些现成资源。Step 2 — 训练ACT 策略在采集到的数据集上训练一个轻量 ACT 策略lerobot-train \ --dataset.repo_id$HF_USERNAME/omx_pickandplace \ --policy.typeact \ --output_diroutputs/train/omx_pickandplace_act \ --policy.devicecuda \ --policy.repo_id$HF_USERNAME/omx_pickandplace_act \ --steps20000 \ --wandb.enabletrue参数说明--policy.typeact选用 ACTAction Chunking with Transformers策略与examples/tutorial/act/及 docs/source/act.mdx 中的方案一致--output_dir训练 checkpoint 的本地输出目录--policy.devicecuda使用 GPU 训练无 GPU 时按机器情况调整--policy.repo_id训练完成后把模型权重推送到 Hub 的目标 repo_id--steps20000训练总步数本示例约 2 万步即可获得可部署的抓取策略--wandb.enabletrue开启 Weights Biases 训练日志。Step 3 — 自主部署Rollout训练完成后用lerobot-rollout让机械臂自主执行任务。策略从--policy.path加载内部通过PreTrainedConfig.from_pretrained从 Hub 拉取并做配置校验见 rollout/configs.py。基础自主运行lerobot-rollout \ --strategy.typebase \ --robot.typeomx_follower \ --robot.port$ROBOT_PORT \ --robot.idomx_follower \ --robot.cameras$ROBOT_CAMERAS \ --policy.path$HF_USERNAME/omx_pickandplace_actbase策略BaseStrategyConfig见 rollout/configs.py是纯自主运行、不录制数据的最简模式策略持续推理并把动作发往机器人dataset_mode为none因此命令中不能携带任何--dataset.*参数否则会被配置校验直接拒绝。持续录制 自动上传Sentry 模式lerobot-rollout \ --strategy.typesentry \ --strategy.upload_every_n_episodes10 \ --robot.typeomx_follower \ --robot.port$ROBOT_PORT \ --robot.idomx_follower \ --robot.cameras$ROBOT_CAMERAS \ --policy.path$HF_USERNAME/omx_pickandplace_act \ --dataset.repo_id$HF_USERNAME/rollout_omx_pickandplace_act \sentry策略SentryStrategyConfig见 rollout/configs.py适合 7×24 无人值守运行所有 rollout 帧持续写入数据集每运行upload_every_n_episodes个回合自动把新增数据推送到 Hub本示例设为 10。它还有几个值得注意的实现细节dataset_moderequired必须提供--dataset.repo_id否则校验失败requires_streaming_encoding()返回True即使你没显式开启streaming_encoding引擎也会强制开启rollout/configs.py因为帧写入发生在实时控制循环内部阻塞式编码会压垮控制频率回合时长会依据相机分辨率、FPS 与target_video_file_size_mb默认对齐DEFAULT_VIDEO_FILE_SIZE_IN_MB自动推导使每个回合产生的视频文件恰好跨过数据集视频分块阈值从而保证每次push_to_hub上传的都是完整视频文件不会反复重传仍在增长的半成品文件。环境重置工具reset_environment.pyreset_environment.pyexamples/omx/reset_environment.py与record_grab.py一样属于针对该物理装置的特化脚本它把一串硬编码的动作序列下发到机器人用于把工作区恢复为可复现的初始状态供数据采集与评估使用并非通用工具。独立运行# 抓取立方体并放到左侧随机位置 python -m examples.omx.reset_environment --port $ROBOT_PORT --mode grab_and_place命令行参数见 reset_environment.py--port机械臂串口默认/dev/ttyACM1--robot_id默认omx_follower--modegrab只抓取归位或grab_and_place抓取并随机放置默认。可复用的核心函数脚本同时导出了grab_cube(robot)与place_cube(robot)两个函数可被自定义脚本直接调用grab_cube(robot)执行左扫 → 右扫 → 手臂平行地面伸展 → 闭合夹爪的抓取序列reset_environment.py。其中左/右两次扫掠sweep分别从SWEEP_LEFT_PAN-60/SWEEP_RIGHT_PAN60向中心GRAB_PAN0聚拢且提前SWEEP_END_OFFSET5°停止避免把立方体推过头随后手臂沿推扫轨迹把立方体顶入夹爪再闭合到GRIPPER_CLOSE_POS50。place_cube(robot)夹持立方体移动到左侧随机位置后释放并返回(pan, t)二元组——pan是放置角度PLACE_LEFT_PAN_RANGE(5.0, 30.0)内随机t是伸展比例PLACE_REACH_RANGE(0.1, 0.7)0 代表手臂缩回、1 代表完全伸展见 reset_environment.py。这两个返回值正是record_grab.py每回合定点抓取的目标坐标record_grab_episode根据t在PUSH_START_*与PUSH_END_*两组关节参数之间做线性插值得到立方体实际所在的shoulder_lift/elbow_flex目标值record_grab.py从而保证录制轨迹始终精确对准被随机放置的立方体。源码中的关键运动学细节关节约定臂关节范围 -100 到 100夹爪gripper.pos中 50 代表闭合、80 代表张开_push_pose放置时张开到 80见 reset_environment.py。平行地面约束为保证夹爪始终水平与地面平行使用wrist_flex WRIST_HORIZONTAL_OFFSET - shoulder_lift - elbow_flexhorizontal_wrist_flex见 reset_environment.py且在任意满足该约束的两个位姿间做线性插值时该约束自动保持。运动插值move_to_pose以CONTROL_HZ30的频率对当前观测与目标位姿做线性插值段时长由最大关节增量 ÷ 速度决定reset_environment.py。源码级剖析record_grab 的录制原理为了让你理解为什么自动采集能产出高质量演示数据这里拆解record_grab.py的录制内核record_grab.py数据集构建通过LeRobotDataset.create或resume创建数据集特征由动作处理器与观测处理器的输出合并而来aggregate_pipeline_dataset_featurescombine_feature_dicts并在VideoEncodingManager上下文内逐帧写入保证视频流式编码record_grab.py。样条轨迹录制record_episode_spline用Catmull-Rom 样条Hermite 三次插值连接一系列路点——相邻路点间时长由最大关节增量 ÷ 段速度决定内部速度切向取相邻段速度的平均端点速度为 0从而让机械臂在每一个路点都获得 C1 连续的速度过渡启停平滑record_grab.py。逐帧同步每个插值步内执行robot.send_action(action)→robot.get_observation()→ 组装 obs/action 帧 →dataset.add_frame()→precise_sleep(1/fps)即动作下发与观测采集严格同帧这是模仿学习数据时序对齐的关键record_grab.py。人为多样性除下降接近立方体闭合夹爪搬运目标位姿等需要精度的关键路点外其余过路点都会叠加每关节独立的随机抖动_jitter_pose幅值 2°~5° 不等夹爪不抖动让演示数据具备类人的自然变体有助于提升策略泛化性record_grab.py。硬件抽象层OmxFollower 与 OmxLeader最后从源码确认 OMX 设备在 LeRobot 中的实现方式便于你排查连接与部署问题OmxFolloweromx_follower.py通过DynamixelMotorsBus管理 6 个电机get_observation用sync_read(Present_Position)同步读取全部关节位置并采集各相机图像omx_follower.pysend_action用sync_write(Goal_Position)下发目标位姿并支持max_relative_target对单步动作幅度做安全限幅omx_follower.py。configure中手臂电机使用扩展位置模式、夹爪使用基于电流的位置控制以限制夹持力并为elbow_flex设定了专门的 PID 增益以缩小录制的状态-动作差距omx_follower.py。OmxLeaderomx_leader.py遥操作侧通过get_action同步读取 6 个电机位置作为动作信号夹爪以CURRENT_POSITION模式 gripper_open_pos默认 60见 config_omx_leader.py构成物理触发器——可用手指按压夹爪产生动作松手后自动弹回张开位力反馈send_feedback尚未实现源码中为raise NotImplementedError。局限性提醒本示例的命令行参数相机索引、串口、任务描述、回合数等需要按你的设备环境调整reset_environment.py与record_grab.py中硬编码的关节位姿仅对该特定物理装置有效自动采集脚本的抓取成功率受工作台、立方体材质与夹爪磨损影响recovery_prob提供的失败恢复数据正是为了缓解这类真实环境中的抓取失败若跳过采集与训练直接使用 README 中提到的现成公开数据集与预训练模型请确认其任务描述与你的部署场景一致。整体而言examples/omx是一个高度聚焦的参考实现它把 LeRobot 的机器人注册、数据集协议、策略训练与 rollout 策略体系串联在一条真实链路上既有可直接运行的 CLI 命令也有值得借鉴的自动化数据采集与样条轨迹录制工程化写法适合作为从零到自主部署的端到端模板。【免费下载链接】lerobot LeRobot: Making AI for Robotics more accessible with end-to-end learning项目地址: https://gitcode.com/GitHub_Trending/le/lerobot创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表