LeRobot的机器人控制系统(上)
目的和范围
机器人控制系统是 LeRobot 框架的核心组件,提供用于操作、标定和记录物理机器人数据的接口。该系统支持远程操作、记录演示数据集、重放动作以及在真实机器人上运行已训练的策略。它充当用户、物理机器人硬件和训练流程之间的桥梁。本文介绍机器人控制系统的架构和使用方法。
架构概述
机器人控制系统以 control_robot.py 脚本为中心,该脚本支持多种控制模式,包括远程操作、记录、重放、标定和远程控制。该系统可与各种类型的机器人(机械手和移动机器人)和设备接口(电机和摄像头)进行交互。
控制模式
机器人控制系统提供多种由 control_robot.py 脚本管理的操作模式:
每种控制模式都有各自的配置类和相应的函数来实现其行为:
标定模式
用于标定机器人电机并确保正确定位。这通常是设置新机器人或移动机器人时的第一步。
python lerobot/scripts/control_robot.py \
–robot.type=<robot_type> \
–control.type=calibrate \
–control.arms=‘[“main_follower”]’
遥控模式
允许手动控制机器人。在机械臂机器人中,这通常涉及通过移动引导(leader)臂来控制从动(follower)臂。
python lerobot/scripts/control_robot.py \
–robot.type=<robot_type> \
–control.type=teleoperate
记录模式
记录远程操作或策略执行过程中的数据集。此模式可捕捉机器人状态、动作和摄像头图像,用于训练策略。
python lerobot/scripts/control_robot.py \
–robot.type=<robot_type> \
–control.type=record \
–control.repo_id=/<dataset_name> \
–control.single_task=“Task description”
重播模式
在机器人上重播录制的 episodes,以便验证录制的数据。
python lerobot/scripts/control_robot.py \
–robot.type=<robot_type> \
–control.type=replay \
–control.repo_id=/<dataset_name> \
–control.episode=0
远程机器人模式
用于在边缘设备上运行的远程控制机器人(例如 LeKiwi)。
On robot:
python lerobot/scripts/control_robot.py \
–robot.type=lekiwi \
–control.type=remote_robot
On control computer:
python lerobot/scripts/control_robot.py \
–robot.type=lekiwi \
–control.type=teleoperate
控制配置
每种控制模式都通过特定的配置类进行配置:
机器人类型和硬件集成
机器人控制系统通过通用接口支持各种类型的机器人。每种类型的机器人都有特定的配置和硬件要求:
机械臂机器人
机械臂机器人(Koch、Aloha、SO-100、Moss)通常采用主从式架构:
主臂:用于远程操作,通常具有较低的摩擦力
从臂:执行实际任务,由主臂或策略控制
移动机器人
移动机器人(LeKiwi、Stretch)将移动性与操控性相结合:
LeKiwi:带有 SO-100 机械臂的移动基座,可远程操作
Stretch:集成移动机械臂,带有机械臂和夹持器
电机控制接口
机器人控制系统通过专用总线类与不同类型的电机连接:
DynamixelMotorsBus
与 Dynamixel 电机(Koch、Aloha 使用)的接口:
from lerobot.common.robot_devices.motors.configs import DynamixelMotorsBusConfig
from lerobot.common.robot_devices.motors.dynamixel import DynamixelMotorsBus
config = DynamixelMotorsBusConfig(
port=“/dev/ttyACM0”,
motors={
# name: (index, model)
“shoulder_pan”: (1, “xl330-m077”),
“shoulder_lift”: (2, “xl330-m077”),
# …more motors…
},
)
motor_bus = DynamixelMotorsBus(config)
motor_bus.connect()
FeetechMotorsBus
与 Feetech 电机接口(SO-100、Moss、LeKiwi 使用):
from lerobot.common.robot_devices.motors.configs import FeetechMotorsBusConfig
from lerobot.common.robot_devices.motors.feetech import FeetechMotorsBus
config = FeetechMotorsBusConfig(
port=“/dev/ttyACM0”,
motors={
# name: (index, model)
“shoulder_pan”: [1, “sts3215”],
“shoulder_lift”: [2, “sts3215”],
# …more motors…
},
)
motor_bus = FeetechMotorsBus(config)
motor_bus.connect()
相机集成
机器人控制系统支持多种相机类型:
OpenCVCamera
可与大多数 USB 相机接口:
from lerobot.common.robot_devices.cameras.configs import OpenCVCameraConfig
from lerobot.common.robot_devices.cameras.opencv import OpenCVCamera
config = OpenCVCameraConfig(camera_index=0, fps=30, width=640, height=480)
camera = OpenCVCamera(config)
camera.connect()
color_image = camera.read()
RealSenseCamera
与英特尔 RealSense 摄像头接口(用于深度感知):
from lerobot.common.robot_devices.cameras.configs import RealSenseCameraConfig
from lerobot.common.robot_devices.cameras.realsense import RealSenseCamera
config = RealSenseCameraConfig(device_id=“123456789”)
camera = RealSenseCamera(config)
camera.connect()
color_image, depth_image = camera.read()
控制循环
核心控制逻辑在 control_loop 函数中实现,该函数处理不同的控制模式:
控制循环:
1.捕获观测值(机器人状态、摄像头图像)
2.以下操作之一:
- 处理远程操作输入以生成动作
- 使用基于观测值的策略预测动作
3.将动作发送给机器人
4.(可选)将数据记录到数据集
5.显示数据并记录信息
录制和数据集集成
录制模式与 LeRobotDataset 系统集成:
录制过程中:
1.系统初始化数据集并(可选)加载策略
2.预热录制过程,以便设备同步
3.对于每个场景:
- 使用控制循环记录数据
- 留出时间在场景之间重置环境
4.最后,根据请求将数据集推送至 Hugging Face Hub
使用示例
标定机器人
Calibrate both arms of a Koch robot
python lerobot/scripts/control_robot.py \
–robot.type=koch \
–control.type=calibrate
Calibrate only the follower arm
python lerobot/scripts/control_robot.py \
–robot.type=so100 \
–robot.cameras=‘{}’ \
–control.type=calibrate \
–control.arms=‘[“main_follower”]’
遥操作机器人
Teleoperate a Koch robot with camera display
python lerobot/scripts/control_robot.py \
–robot.type=koch \
–control.type=teleoperate \
–control.display_data=true
Teleoperate with safety limit on movement
python lerobot/scripts/control_robot.py \
–robot.type=aloha \
–robot.max_relative_target=5 \
–control.type=teleoperate
录取数据集
Record 10 episodes of a task
python lerobot/scripts/control_robot.py \
–robot.type=so100 \
–control.type=record \
–control.fps=30 \
–control.single_task=“Grasp a lego block and put it in the bin.” \
–control.repo_id=username/so100_dataset \
–control.tags=‘[“so100”,“tutorial”]’ \
–control.warmup_time_s=5 \
–control.episode_time_s=30 \
–control.reset_time_s=30 \
–control.num_episodes=10 \
–control.push_to_hub=true
在机器人上运行策略
Run a trained policy and record evaluation data
python lerobot/scripts/control_robot.py \
–robot.type=moss \
–control.type=record \
–control.fps=30 \
–control.single_task=“Grasp a lego block and put it in the bin.” \
–control.repo_id=username/eval_act_moss_test \
–control.tags=‘[“tutorial”]’ \
–control.num_episodes=10 \
–control.push_to_hub=true \
–control.policy.path=outputs/train/act_moss_test/checkpoints/last/pretrained_model
操作一个远程机器人
On the robot device (e.g., Raspberry Pi on LeKiwi)
python lerobot/scripts/control_robot.py \
–robot.type=lekiwi \
–control.type=remote_robot
On the controlling computerpython lerobot/scripts/control_robot.py \
–robot.type=lekiwi \
–control.type=teleoperate \
–control.fps=30
记录期间的键盘控制
机器人控制系统支持在数据集记录期间使用键盘控制:
这些键盘控制可以灵活地控制录取过程。
使用 Rerun 进行可视化
机器人控制系统可以使用 Rerun 可视化工具包实时可视化数据:
Enable visualization during teleoperation
python lerobot/scripts/control_robot.py \
–robot.type=koch \
–control.type=teleoperate \
–control.display_data=true
将显示以下内容:
- 摄像头信息
- 机器人状态值
- 动作值
对于远程机器人,还可以指定远程观察器(viewer):
On the robot with remote visualization
python lerobot/scripts/control_robot.py \
–robot.type=lekiwi \
–control.type=remote_robot \
–control.display_data=true \
–control.viewer_ip=192.168.1.100 \
–control.viewer_port=8080
在此介绍 LeRobot 支持的机器人类型及其配置方法。它涵盖了基础机器人架构、具体的机器人实现及其配置细节。
机器人架构概述
LeRobot 通过统一的架构支持各种机器人类型,该架构支持控制、遥控操作、记录和策略执行。每种机器人类型都有一个特定的配置类,该类使用 @RobotConfig.register_subclass() 这个 decorator 注册。
机械臂机器人
LeRobot 中最常见的机器人类型是机械臂机器人 (ManipulatorRobot),它是机械臂实现的基础。该类提供了统一的接口,用于连接硬件、校准电机、遥操作机器人以及记录数据。
ManipulatorRobot 的主要特点
主-从架构:大多数机械手机器人采用主臂进行远程操作,并配备一个从臂,用于复制主臂的运动
标定:自动进行标定,确保机器人关节位置一致
遥操作:提供读取主臂位置和控制从臂的方法
数据记录:可捕捉遥操作过程中的观察结果(关节状态、摄像头图像)和动作
安全特性:可配置位置限制,防止快速移动
支持的机器人类型
LeRobot 支持多种机器人类型,每种类型都有独特的功能和配置:
Koch v1.1
Koch v1.1 是一款采用 Dynamixel 电机的 6 自由度低成本机械臂。它由一个用于遥操作的主导臂和一个用于执行指令的跟从臂组成。
关键配置点:
- 主导臂使用 Dynamixel XL330-M077 电机
- 跟从臂使用 Dynamixel XL430-W250 和 XL330-M288电机
- 主导臂和跟从臂采用独立的 USB 接口
- 可配置的夹持器位置,用作触发器
Aloha
Aloha 是一款双手机器人,配备两个使用 Dynamixel 电机的 7 自由度机械臂。它具有两个主臂和从臂,可同时远程操作两个机械臂。
关键配置点:
- 机械臂对(左主/从臂和右主/从臂)
- 双电机驱动的肩关节和肘关节的辅助/影子 ID
- 提供默认标定文件(无需手动标定)
- 可选相对运动的安全限制
SO100
SO100 是一款采用 Feetech 电机的 6 自由度机械臂。与 Koch 类似,它拥有一个用于远程操作的主导臂和一个用于跟随主导臂运动的跟从臂。
关键配置点:
- 主导臂和跟从臂均采用 Feetech STS3215 电机
- 主导臂和跟从臂采用独立的 USB 连接
- 为了实现顺畅的远程操作,需要拆除主导臂电机的齿轮
Moss v1
Moss v1 是一款与 SO100 类似的 6 自由度机械臂,同样采用 Feetech 电机。
关键配置点:
- 主臂和从臂均采用 Feetech STS3215 电机
- 主臂和从臂采用独立的 USB 连接
- 为了实现顺畅的远程操作,需要拆除主臂电机的齿轮
LeKiwi
LeKiwi 是一款基于 SO100 机械臂的移动机器人,该机械臂安装在具有全向运动能力的轮式平台上。
主要配置点:
- 机械臂和轮子采用 Feetech STS3215 电机
- 基于 TCP/IP 通信的网络架构
- 三个全向轮子配备附加电机(ID 7-9)
- 移动底座采用键盘控制
- 可配置为有线或无线操作
Stretch 3
Stretch 3 是 Hello Robot 推出的一款商用移动机械臂,配备高度可调的机械臂。
关键配置点:
- 采用专有电机控制器和基于 ROS2 的架构
- 操作前需要标定/寻位 内置摄像头,用于感知
- 基于游戏手柄的遥操作
使用机器人类型
机器人实例化
通过创建适当的配置对象并将其传递给机器人类来实例化机器人:
from lerobot.common.robot_devices.robots.configs import KochRobotConfig
from lerobot.common.robot_devices.robots.manipulator import ManipulatorRobot
Create a Koch robot with default configuration
robot = ManipulatorRobot(KochRobotConfig())
Connect to the robot hardware (will trigger calibration if needed)
robot.connect()
对于基于脚本的使用,机器人类型被指定为命令行参数:
python lerobot/scripts/control_robot.py --robot.type=koch --control.type=teleoperate
机器人配置
每种机器人类型都有可自定义的特定配置参数。常用配置选项包括:
- 端口:用于电机控制器的 USB 端口
- 电机 ID 和型号:机器人使用的具体电机
- 摄像头:摄像头配置(类型、索引、分辨率)
标定目录:校准文件的存储位置
安全限制:每步允许的最大移动距离
可以通过修改代码或命令行参数来更新配置:
python lerobot/scripts/control_robot.py \
–robot.type=so100 \
–robot.max_relative_target=5 \
–robot.cameras=‘{}’ \
–control.type=teleoperate
机器人标定
标定是确保电机在同一类型的不同机器人上以一致的角度参考运行的关键步骤。标定过程因机器人类型而异:
- Koch/SO100/Moss/LeKiwi:手动标定,需要将机械臂移动到特定的参考位置
- Aloha:使用预定义的标定文件,无需手动标定
- Stretch:操作前需要执行寻位程序
如果标定文件不存在,则标定程序会在首次连接时自动启动:
python lerobot/scripts/control_robot.py \
–robot.type=so100 \
–robot.cameras=‘{}’ \
–control.type=calibrate \
–control.arms=‘[“main_follower”]’
常见的机器人操作
所有类型的机器人都支持以下常见操作:
1.遥操作:通过操纵主导臂来控制从动臂
python lerobot/scripts/control_robot.py --robot.type=koch --control.type=teleoperate
2. 录制:录制用于策略训练的遥操作数据
python lerobot/scripts/control_robot.py --robot.type=koch --control.type=record --control.repo_id=user/dataset
3.回放:回放之前录制的episode
python lerobot/scripts/control_robot.py --robot.type=koch --control.type=replay --control.repo_id=user/dataset
4.策略执行:在机器人上运行已训练好的策略
python lerobot/scripts/control_robot.py --robot.type=koch --control.type=record --con
机器人选择指南
为您的项目选择机器人类型时,请考虑以下因素:
1.电机类型:
Dynamixel 电机(Koch、Aloha):精度更高,成本更高
Feetech 电机(SO100、Moss、LeKiwi):成本更低,适用于多种任务
2.机械臂配置:
单臂(Koch、SO100、Moss):设置更简单,成本更低
双臂(Aloha):更复杂,支持双手操作
移动臂(LeKiwi、Stretch):支持更大的工作空间,控制更复杂
3.移动性要求:
固定式(Koch、Aloha、SO100、Moss):工作空间固定
移动式(LeKiwi、Stretch):可导航至不同的工作空间
4.摄像头集成:
可选外置摄像头(Koch、SO100、Moss):位置灵活
内置摄像头(Aloha、Stretch):位置预标定
5.成本限制条件:
DIY(Koch、SO100、Moss、LeKiwi):成本较低,需要组装
商用(Aloha、Stretch):成本较高,需要专业支持
高级机器人配置
对于高级用户,可以通过编程进一步定制机器人配置: