LeRobot的机器人控制系统(下)
目的和范围
机器人控制系统是 LeRobot 框架的核心组件,提供用于操作、标定和记录物理机器人数据的接口。该系统支持远程操作、记录演示数据集、重放动作以及在真实机器人上运行已训练的策略。它充当用户、物理机器人硬件和训练流程之间的桥梁。本文介绍机器人控制系统的架构和使用方法。
。。。。。。继续。。。。。。
在此详细介绍 LeRobot 框架中的硬件接口,重点介绍系统如何与摄像头、电机等物理组件进行通信。这些接口提供了抽象层,用于标准化机器人控制系统与各种硬件设备之间的交互,从而确保在不同硬件配置下实现一致的操作。
架构概述
LeRobot 中的硬件接口遵循一致的模式:
- 配置对象定义设备参数
- 设备类处理与硬件的通信
- 连接管理通过 connect() 和 disconnect() 方法确保安全操作
- 标准化的读/写方法提供对设备数据的一致访问
- 使用专用异常类进行错误处理
硬件接口的架构
相机接口
LeRobot 提供两种主要的相机接口:
- OpenCVCamera:适用于标准网络摄像头和 USB 摄像头
- IntelRealSenseCamera:适用于 Intel RealSense 深度摄像头
两种类型的相机都实现了由 Camera 协议定义的通用接口,该接口提供了连接、断开连接和读取帧的方法。
相机接口类层次结构
OpenCVCamera
OpenCVCamera 类为使用 OpenCV VideoCapture 功能的 USB 摄像头提供了一个标准接口。它负责处理摄像头的发现、连接和帧读取。
主要功能:
- 通过索引(例如 0、1、2)识别摄像头
- 平台专属检测(Linux 与 macOS/Windows 平台有所不同)
- 可配置分辨率、帧率和色彩模式
- 适用于性能关键型应用程序的异步帧读取
- 图像旋转功能
Example of OpenCVCamera usage
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()
image = camera.read() # Synchronous read
or
image = camera.async_read() # Asynchronous read
camera.disconnect()
IntelRealSenseCamera
IntelRealSenseCamera 类提供对 Intel RealSense 深度摄像头的专用访问。与 OpenCVCamera 不同,它通过序列号而非索引进行标识,从而确保跨会话的一致性识别。
主要功能:
- 通过序列号或名称识别摄像头
- 深度感知功能
- 用于故障排除的硬件复位选项
- 线程-安全异步读取
- 支持多种摄像头型号(D400 系列等)
Example of IntelRealSenseCamera usage
from lerobot.common.robot_devices.cameras.configs import IntelRealSenseCameraConfig
from lerobot.common.robot_devices.cameras.intelrealsense import IntelRealSenseCamera
config = IntelRealSenseCameraConfig(serial_number=128422271347, use_depth=True)
camera = IntelRealSenseCamera(config)
camera.connect()
color_image, depth_map = camera.read() # Returns both color and depth
camera.disconnect()
相机比较
电机接口
LeRobot 提供多种电机接口,主要支持机器人领域常用的 Dynamixel 伺服电机。
DynamixelMotorsBus
DynamixelMotorsBus 类用于管理连接到单总线的 Dynamixel 伺服电机的通信。它提供读写电机参数的方法,以及完善的标定系统。
主要特性:
- 通过串口通信
- 关节角度标定和安全限制
- 多电机同步读写 位置、速度和电流控制
- 自动错误检测和恢复
- 电机接口架构
标定系统
标定系统负责将原始电机值转换为人类可理解的单位:
- 对于旋转关节:角度范围 [-180, 180]
- 对于线性关节(如夹爪):百分比范围 [0, 100]
系统处理:
- 方向规范化(反转电机与正转电机)
- 寻位偏移计算
- 范围检查和自动校正
- 不同单位制之间的转换
Example of DynamixelMotorsBus usage
from lerobot.common.robot_devices.motors.configs import DynamixelMotorsBusConfig
from lerobot.common.robot_devices.motors.dynamixel import DynamixelMotorsBus
config = DynamixelMotorsBusConfig(
port=“/dev/ttyUSB0”,
motors={“shoulder”: (1, “xl330-m077”), “elbow”: (2, “xl330-m077”)}
)
motors_bus = DynamixelMotorsBus(config)
motors_bus.connect()
Read current positions in degrees/percentage after calibration
positions = motors_bus.read(“Present_Position”)
Move motors to new positions
motors_bus.write(“Goal_Position”, positions + 10)
motors_bus.disconnect()
电机参数控制
机器人控制集成
硬件接口集成到 ManipulatorRobot 类中,该类提供用于控制带摄像头的机械臂的高级接口。
集成架构
关键集成点:
- 初始化:根据配置创建电机总线和摄像头
- 连接管理:所有设备连接/断开连接
- 遥操作:主臂控制从臂
- 观察捕获:读取电机状态和摄像头图像
- 动作执行:向电机发送命令
Example of ManipulatorRobot integration
from lerobot.common.robot_devices.cameras.configs import OpenCVCameraConfig
from lerobot.common.robot_devices.motors.configs import DynamixelMotorsBusConfig
from lerobot.common.robot_devices.robots.configs import ManipulatorRobotConfig
from lerobot.common.robot_devices.robots.manipulator import ManipulatorRobot
Create robot with cameras and motors
robot_config = ManipulatorRobotConfig(
type=“koch”,
cameras={
“main”: OpenCVCameraConfig(camera_index=0)
},
leader_arms={
“main”: DynamixelMotorsBusConfig(
port=“/dev/ttyUSB0”,
motors={“shoulder”: (1, “xl330-m077”), “elbow”: (2, “xl330-m077”)} ) },
follower_arms={
“main”: DynamixelMotorsBusConfig(
port=“/dev/ttyUSB1”,
motors={“shoulder”: (1, “xl330-m077”), “elbow”: (2, “xl330-m077”)}
)
}
)
robot = ManipulatorRobot(robot_config)
robot.connect()
Teleoperation or policy control
observation = robot.capture_observation() robot.send_action(action)
or
observation, action = robot.teleop_step(record_data=True)
robot.disconnect()
常用实用程序和错误处理
硬件接口包含多个实用程序函数和错误处理机制:
实用程序函数
busy_wait(seconds):精确的时间控制,尤其是在 macOS 上,因为 time.sleep 可能不准确
safe_disconnect(func):装饰器,用于确保即使发生异常也能断开设备连接
find_cameras():通过索引或序列号发现可用的相机
find_motor_indices():扫描总线上已连接的电机
错误类别
RobotDeviceNotConnectedError:尝试使用未连接的设备时引发
RobotDeviceAlreadyConnectedError:尝试连接已连接的设备时引发
JointOutOfRangeError:关节位置超出其有效范围时引发
常用错误模式
小节
LeRobot 中的硬件接口提供了一种灵活统一的方式,可以与不同类型的摄像头和电机进行交互。通过抽象硬件特定的细节,这些接口允许开发能够在无需进行大量代码修改的情况下兼容各种硬件配置的机器人控制系统。
主要特性:
- 跨不同硬件类型的通用接口模式
- 全面的错误处理和恢复功能
- 线程安全的异步操作
- 用于一致单元的标定系统
- 与高级机器人控制集成
这些接口构成了 LeRobot 框架中机器人远程操作、数据收集和策略执行的基础。
在此讲解如何在 LeRobot 框架中远程操控机器人并记录用于策略训练的数据集。远程操控可以直接控制机器人进行测试或数据收集,而记录则将机器人的运动、观察结果和动作捕获到结构化数据集中,用于策略训练或评估。
系统架构
远程操作和记录功能围绕 control_robot.py 脚本构建,该脚本通过统一的界面提供不同的控制模式。
遥控操作模式
遥控操作模式允许直接手动控制机器人。此模式适用于测试机器人硬件、进行动作实验或准备录制会话。
遥控操作进程
远程操作配置
远程操作可以通过 TeleoperateControlConfig 类进行配置,该类提供以下选项:
远程操作命令示例
无限频率下的基本远程操作:
python lerobot/scripts/control_robot.py \
–robot.type=so100 \
–control.type=teleoperate
有限频率下的远程操作模拟录制:
python lerobot/scripts/control_robot.py \
–robot.type=so100 \
–control.type=teleoperate \
–control.fps=30
录制模式
录制模式将机器人的观察结果和动作捕获到结构化数据集中。此模式对于收集机器人学习策略的训练数据至关重要。
录制过程
使用策略录制
可以使用预训练的策略来控制机器人进行录制,这对于评估策略性能非常有用。使用策略录制时,远程操作将被禁用,策略将根据观察结果生成动作。
录制配置
录制通过 RecordControlConfig 类进行配置,关键参数如下:
录制命令示例
录制单个测试片段:
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/test_dataset \
–control.num_episodes=1 \
–control.push_to_hub=True
录制完整数据集用于训练:
python lerobot/scripts/control_robot.py \
–robot.type=so100 \
–control.type=record \
–control.fps=30 \
–control.repo_id=username/training_dataset \
–control.num_episodes=50 \
–control.warmup_time_s=2 \
–control.episode_time_s=30 \
–control.reset_time_s=10
录制预训练策略用于评估:
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/eval_dataset \
–control.num_episodes=10 \
–control.warmup_time_s=2 \
–control.episode_time_s=30 \
–control.reset_time_s=10 \
–control.policy.path=outputs/train/policy_checkpoint/pretrained_model
回放模式
回放模式允许在实体机器人上回放之前录制的 episodes,这对于验证数据质量或演示录制的行为非常有用。
回放过程
例子回放命令
python lerobot/scripts/control_robot.py \
–robot.type=so100 \
–control.type=replay \
–control.fps=30 \
–control.repo_id=username/test_dataset \
–control.episode=0
键盘控制
录制过程中,键盘控制提供便捷的录制流程管理方式:
这些控制是使用 pynput 库实现的,并且可能需要 sudo 权限才能在某些环境中监视键盘事件。
录制过程中的数据流
如图展示录制过程中数据在系统中的流动方式:
特殊注意事项
图像处理
录制时,使用 AsyncImageWriter 类异步保存图像,以保持稳定的录制帧率。这对于确保机器人在处理高吞吐量图像数据的同时保持平稳运行至关重要。
用于写入图像的最佳进程数和线程数取决于系统功能:
- 默认配置:每个摄像头 0 个进程和 4 个线程
- 如果录制不稳定,调整这些值可能会有所帮助。
恢复录制
可以使用 --control.resume=true 标志恢复录制会话。这对于在多个会话中继续收集数据或从中断中恢复非常有用。
遥控机器人
对于像 LeKiwi 这样使用遥控器操作的机器人,该脚本提供一个特殊的 remote_robot 模式,该模式在机器人的边缘设备上运行:
python lerobot/scripts/control_robot.py \
–robot.type=lekiwi \
–control.type=remote_robot
与 LeRobotDataset 集成
记录过程会创建 LeRobotDataset 格式的数据集,可直接用于训练策略。这些数据集包括:
- 来自摄像头的图像观测值
- 机器人状态信息
- 机器人或策略执行的操作
- 任务描述
记录的数据集可以使用可视化工具进行可视化:
python lerobot/scripts/visualize_dataset.py \
–repo-id username/dataset_name \
–episode-index0
结论
LeRobot 的远程操作和记录系统提供一个全面的框架,用于控制机器人和收集高质量的数据集。无论是手动操作机器人、录制演示以进行策略训练,还是评估已训练的策略,该系统都能提供灵活的配置选项和高效的数据收集流程。