R2C SDK已支持的机器人
R2C SDK通过RobotFactory统一创建和管理机器人硬件适配器,所有适配器实现IRobotHardwareAdapter接口(connect/disconnect/get_observation/send_action),通过YAML配置文件驱动。
| 适配器类型 | hardware.type | 适用硬件 | 关键依赖 | 配置样例 |
|---|---|---|---|---|
| Dummy仿真模拟器 | dummy | 无(纯软件) | 无 | |
| LeRobot驱动 | lerobot | SO101 | lerobot,draccus | |
| UR5e RTDE直驱 | ur5e_rtde | UR5e+DH夹爪+RealSense | ur-rtde,pyserial,pyrealsense2 | |
| Flexiv Rizon4 | flexiv | 非夕Flexiv Rizon4机器人 | ||
| 五八智能 天狼Q25 模拟摇杆控制 | custom | 五八智能 天狼Q25 | 无 | |
| Zenoh ROS1通用 | zenoh_ros1 | 星海图GALAXEA R1、 任何ROS1平台 | zenoh-python | |
| ROS2通用 | ros2 | Jaka Mini2、 任何ROS2平台 | rclpy | |
| 回放 | playback | 无(数据回放) | 无 |
通用环境要求
R2C SDK运行的软件环境如表2所示。
通用CLI启动方式
所有适配器都通过统一的CloudRobo client命令行入口启动:
python -m r2c_sdk.cloudroboclient --bundle config/cert_xxx.zip --robot-config config/robot_xxx_config.yaml
- cert_xxx.zip接入配置文件是在CloudRobo平台控制台上“运行管理 >机器人”页面中,创建接入机器人后,可下载该接入配置文件。
- 机器人的配置文件robot_xxx_config.yaml在R2C SDK软件包中的config目录下。
| 参数 | 说明 | 默认值 |
|---|---|---|
| --client-config | 客户端通信配置YAML | config/client_config.yaml |
| --robot-config | 机器人硬件配置YAML | config/robot_dummy_config.yaml |
| --bundle | 平台证书包(zip或目录路径) | 无 |
| --duration | 运行时长(秒),0=无限运行 | 0.0 |
| --record | 录制观测数据到指定.r2cr文件 | 无 |
| --log-level | 日志级别:DEBUG/INFO/WARNING/ERROR | INFO |
| --log-file | 日志文件路径(轮转100MB×5) | 无 |
| --hardware-class | 自定义适配器类路径(覆盖配置) | 无 |
| --translator-class | 自定义翻译器类路径(覆盖配置) | 无 |
DummyRobot:Dummy仿真模拟器
适用场景: 无真实硬件时进行端到端链路联调(cloudroboclient ↔ cloudrobo(policy server)),或CI自动化测试。
硬件要求: 无。
依赖: 无需额外安装(仅使用numpy,SDK已包含)。
请参考config/robot_dummy_config.yaml文件的配置。
下面是该配置文件中的部分配置内容:
| 参数 | 类型 | 说明 | 默认值 |
|---|---|---|---|
| joint_names | List[str] | 关节名称列表 | 6 个SO101样式的默认名 |
| initial_joint_positions | List[float] | 初始关节位置 | 全零 |
| max_joint_speed_rad_s | float | 最大关节速度 (rad/s) | 2.5 |
| image_specs | Dict | 虚拟相机规格 {name: {h, w, c}} | 1个480×640×3 的front相机 |
Dummy adapter生成数据:
- 关节位置:从initial_joint_positions开始,收到action后向目标移动(受max_joint_speed_rad_s限制)。
- 图像:根据image_specs生成随机像素的numpy数组。
# 启动 Dummy 机器人 python -m r2c_sdk.cloudroboclient --bundle config/cert_xxx.zip --robot-config config/robot_dummy_config.yaml
可用的Dummy预设配置:
- config/robot_dummy_config.yaml — SO101样式(6关节,front+wrist相机)。
- config/robot_ur5e_dummy_config.yaml — UR5e样式(7维状态:x/y/z/rx/ry/rz/gripper_position,wrist+third_person相机)。
- config/robot_jaka_dummy_config.yaml — JAKA样式(7关节,top+wrist相机)。
LeRobot(SO101)
适用场景: 使用LeRobot库驱动的SO101系列机械臂(Follower臂)等。
- SO101系列机械臂(或其他LeRobot兼容硬件)。
- 通过USB串口 (/dev/ttyACM0或类似) 连接。
- USB相机(可选,用于观测)。
| 项目 | 要求 |
|---|---|
| 操作系统 | Linux(推荐Ubuntu 22.04/24.04)/ Windows 11 |
| Python | >= 3.10 |
| LeRobot | pip install lerobot |
| draccus | pip install draccus(LeRobot依赖) |
| opencv-python | pip install opencv-python(相机采集) |
# 安装 LeRobot 核心库 pip install lerobot draccus # 如使用 USB 相机 pip install opencv-python
请参考config/robot_so101_lerobot_config.yaml文件的配置。
下面是该配置文件中的部分配置内容:
| 参数 | 类型 | 说明 |
|---|---|---|
| type | str | Robot类型,如so101_follower, koch_follower, omx_follower, bi_so_follower |
| id | str | Robot实例标识符 |
| port | str | 串口设备路径(如 /dev/ttyACM0) |
| calibration_dir | str/null | 标定数据目录,null表示不加载标定 |
| cameras | Dict | 相机配置,每项包含 {type, index_or_path, width, height, fps} |
| runtime.robot_connect | Dict | 可选,传递给robot.connect(**kwargs)的额外参数 |
| runtime.robot_calibrate | bool | 是否在连接时执行标定 |
# Step 1: 确认串口设备 ls /dev/ttyACM* /dev/ttyUSB* # Step 2: 确认相机设备 ls /dev/video* # Step 3: 修改配置中的port和相机路径 vim config/robot_so101_lerobot_config.yaml # Step 4: 启动 python -m r2c_sdk.cloudroboclient --bundle config/cert_xxx.zip --robot-config config/robot_so101_lerobot_config.yaml
UR5e RTDE(Universal Robots UR5e直驱)
适用场景: 通过RTDE(Real-Time Data Exchange)协议直接控制UR5e机械臂,无需ROS2。适用于需要低延迟、高频控制的研究与工业场景
- Universal Robots UR5e机械臂(CB3/e-Series控制器)。
- DH Robotics夹爪(AG-95或兼容型号,通过USB-RS485连接)。
- Intel RealSense D400系列相机(D435/D435I,通过USB连接)。
- 所有设备需在同一局域网。
| 项目 | 要求 |
|---|---|
| 操作系统 | Linux (Ubuntu 22.04/24.04) |
| Python | >= 3.10 |
| ur-rtde | pip install ur-rtde>=1.5 |
| pyserial | pip install pyserial>=3.5 |
| pyrealsense2 | pip install pyrealsense2>=2.56 |
# 安装 UR5e 可选依赖 pip install -e ".[ur5e]" # 或手动安装 pip install ur-rtde>=1.5 pyserial>=3.5 pyrealsense2>=2.56
- UR5e机械臂:
- UR5e控制器IP:192.168.5.152(默认,可在配置中修改)。
- RTDE端口:默认30004。
- 确认控制器已启动,示教器显示 "RUNNING" 状态。
- DH夹爪:
- 通过USB转RS485适配器连接。
- 设备路径:/dev/ttyUSBDH_(默认,可在配置中修改)。
- RealSense相机:
- D435I(腕部):序列号045322075954。
- D435(第三人称):序列号134222076113。
- 通过USB 3.0连接。
请参考config/robot_ur5e_config.yaml文件的配置。
下面是该配置文件中的部分配置内容:
| 参数 | 类型 | 说明 | 默认值 |
|---|---|---|---|
| robot_ip | str | UR5e控制器IP | "192.168.5.152" |
| frequency | int | RTDE控制循环频率 (Hz) | 500 |
| lookahead_time | float | servoL前瞻时间 (s) | 0.1 |
| gain | int | servoL增益 | 300 |
| max_pos_speed | float | 最大位置速度 (m/s) | 0.25 |
| max_rot_speed | float | 最大旋转速度 (rad/s) | 0.6 |
| tcp_offset | float | 工具中心点偏移 (m) | 0.21 |
| init_joints | List[float] | 可选初始关节位置 | 无 |
| verbose | bool | 打印状态信息 | true |
action_mode:
- "absolute" : 命令值即为目标具体值。
- "delta" : 命令值为相对于当前状态的偏移量。
| 参数 | 类型 | 说明 | 默认值 |
|---|---|---|---|
| port | str | 串口设备路径 | "/dev/ttyUSBDH_" |
| baudrate | int | 波特率 | 115200 |
| max_width | float | 最大开度 (m) | 0.08 |
| max_speed | float | 最大速度 (m/s) | 0.07273 |
| max_force | float | 最大力 (N) | 140.0 |
ur5e_config.cameras: 每项为{name, serial, width, height, fps}。serial值为RealSense相机序列号。
# Step 1: 确认 UR5e 控制器可达 ping 192.168.5.152 # Step 2: 确认串口设备 ls /dev/ttyUSBDH_* /dev/ttyUSB* # Step 3: 确认 RealSense 相机连接(可选) rs-enumerate-devices # Step 4: 修改配置中的 IP、串口、相机序列号 vim config/robot_ur5e_config.yaml # Step 5: 启动 python -m r2c_sdk.cloudroboclient --bundle config/cert_xxx.zip --robot-config config/robot_ur5e_config.yaml
- 启动前确保机械臂周围无障碍物。
- 首次运行建议设置较小的max_pos_speed和max_rot_speed。
- 随时可通过键盘e键或Ctrl+C紧急停止。
- 示教器上的急停按钮始终可用。
- 建议首次使用dry_run: true验证数据流,再切换为false执行物理动作。
非夕Flexiv Rizon4机器人
硬件设备:
- 仅在ubuntu22.04测试,使用Flexiv RDK作为底层实现。
- 使用opencv-python的VideoCapture捕获/dev/video6和/dev/video14两个相机。
- 夹爪为Flexiv-GN01。
配置:
hardware:
type: "custom"
class_path: "r2c_sdk.robots.flexiv_hardware_adapter.FlexivHardwareAdapter"
custom_config:
# Flexiv 机器人序列号
robot_sn: "Rizon4-062833"
# dry_run: true
# 夹爪配置(从配置读取,不硬编码)
gripper_name: "Flexiv-GN01" # 夹爪类型
gripper_open_width: 0.09 # 夹爪完全打开宽度 (m)
gripper_close_width: 0.012 # 夹爪完全闭合宽度 (m)
gripper_velocity: 0.10
gripper_force_limit: 20.0
# 力传感器
zero_ft_on_start: false
force_limit_n: 20.0
# 摄像头配置
cameras:
wrist:
source: 6
width: 640
height: 480
fps: 30
third:
source: 14
width: 640
height: 480
fps: 30 前置安装命令
pip install numpy spdlog flexivrdk
启动命令
python -m r2c_sdk.cloudroboclient --bundle config/cert_xxx.zip --robot-config config/robot_flexiv_config.yaml
测试命令
在开始测试前,请务必在配置中设置runtime.dry_run为true,这样只会打印action日志而不执行实际动作,在确认链路正常后再改为false。
- 机器人启动指令
python -m r2c_sdk.cloudroboclient --project-id test_project --device-id flexiv --client-id robot --robot-config config/robot_flexiv_config.yaml
- 观测订阅指令
python examples/observation_subscriber.py --project-id test_project --device-id flexiv --client-id obs_sub --target-device-id robot
- 动作发布指令
python examples/flexiv_cloud_adapter.py --project-id test_project --device-id flexiv --client-id obs_sub
五八智能 天狼Q25 模拟摇杆控制
硬件设备:
- 仅在ubuntu 22.04测试,使用UDP直接与Q25交互,基于58智能开放的SDK(C++)重写。
- 使用摄像头RTSP流捕获main_cam、front_cam和back_cam三个相机。
配置:
hardware:
type: "custom"
class_path: "r2c_sdk.robots.q25.q25_hardware_adapter.Q25HardwareAdapter"
custom_config:
# Q25 Ultra 四足机器人配置
robot_ip: "192.168.3.20" # 机器人控制指令IP
camera_ip: "192.168.1.102" # 摄像头RTSP流IP
robot_port: 43893
listen_port: 43893
# 观测数据发布频率 (Hz)
observation_rate_hz: 10.0
# 摄像头配置
camera_enabled: true
camera_locations: ["main_cam", "front_cam", "back_cam"] # 启用的摄像头列表
rtsp_port: 8554 # RTSP流端口
camera_timeout_ms: 5000 # 摄像头连接超时 (毫秒)
# 调试模式:只接受并打印action,不执行实际动作
dry_run: true 安装命令
pip install numpy
启动命令
python -m r2c_sdk.cloudroboclient --bundle config/cert_xxx.zip --robot-config config/robot_q25_config_joystick.yaml
测试命令
在开始测试前,请务必在配置中设置runtime.dry_run为true,这样只会打印action日志而不执行实际动作,在确认链路正常后再改为false。
- 机器人启动指令
python -m r2c_sdk.cloudroboclient --project-id test_project --device-id q25 --client-id robot --robot-config config/robot_q25_config_joystick.yaml
- 观测订阅指令
python examples/observation_subscriber.py --project-id test_project --device-id q25 --client-id obs_sub --target-device-id robot
- 动作发布指令
python examples/q25_cloud_adapter_joystick.py --project-id test_project --device-id q25 --client-id obs_sub
ROS2:通用ROS2机器人平台
适用场景: 任何通过ROS2(Humble/Jazzy/Rolling)运行的机器人平台,包括JAKA Mini2、SO101,仿真MetaEngine提供的仿真机器人等。
硬件要求:
- 任何运行ROS2的机器人平台。
- ROS2 topics发布关节状态和相机图像。
| 项目 | 要求 |
|---|---|
| 操作系统 | Linux (Ubuntu 22.04/24.04) |
| ROS2 | Humble (22.04), Jazzy (24.04), 或Rolling |
| Python | >= 3.10 |
| rclpy | 随ROS2一起安装 |
| message_filters | 可选,需pip install message_filters(时间同步观测) |
# ROS2 依赖由系统 ROS2 安装提供,无需额外 pip 安装
# 确认 rclpy 可用:
python3 -c "import rclpy; print('rclpy OK')"
# 可选:时间同步订阅
pip install message_filters
使用ros2 control list_controllers查看可用的控制器列表。
ros2_config.subscriptions:
| 参数 | 类型 | 说明 | 必需 |
|---|---|---|---|
| topic | str | ROS2 topic名称 | 是 |
| msg_type | str | ROS2消息类型(如sensor_msgs.msg.JointState) | 是 |
| qos | int | QoS队列深度 | 否 |
| store_as | str | 在observation dict中的存储键名 | 是 |
| max_update_hz | float | 最大更新频率 (Hz),用于降采样 | 否 |
| include_fields | list[str] | 仅提取消息中的指定字段 | 否 |
| field_aliases store_raw_message | dict[str,str] bool | 字段名重命名映射 是否存储原始ROS2消息对象 | 否 否 |
ros2_config.command_publishers:
| 参数 | 类型 | 说明 |
|---|---|---|
| topic | str | 发布的目标topic |
| msg_type | str | ROS2消息类型 |
| qos | int | QoS队列深度 |
ROS2 命令通道选择:
- Publisher(推荐):直接发布topic,延迟最低。使用default_command_publisher指定。
- Service :使用command_services和default_command_service指定。
| 配置文件 | 机器人 | 订阅Topics | 发布Topics |
|---|---|---|---|
| robot_so101_ros_config.yaml | SO101(仿真场景) | /joint_states, /top/camera_image_color, /wrist/camera_image_color | /position_controller/commands(Float64MultiArray) |
| robot_mini2_ros_config.yaml | JAKA Mini2 | /jaka_driver/joint_position, /gripper_state, /camera_top/image_raw/compressed, /camera_wrist/image_raw/compressed | /robot_command_servo_j(JointState), /motor_control(step_motor/Motor) |
Zenoh ROS1:通用ROS1机器人(Zenoh Bridge)
Zenoh ROS1适配器适用于任何通过zenoh-bridge-ros1接入网络的ROS1机器人,并无需在上位机安装rospy或任何ROS1依赖,该适配器直接通过Zenoh数据平面订阅/发布ROS1消息。
Zenoh ROS1适配器硬件要求:
- 任意运行ROS1的机器人平台,如R1 (HDAS)双臂机器人等。
- 机器人端运行zenoh-bridge-ros1实例。
- 网络可达Zenoh peer或router。
表14 上位机系统/软件要求 项
要求
操作系统
Linux(推荐Ubuntu 22.04/24.04)
Python
>= 3.10
zenoh-python
pip install zenoh
opencv-python
可选,用于解码CompressedImage(pip install opencv-python)
适配器通过zenoh-bridge-ros1与ROS1系统通信,工作流程为:
ROS1 机器人 ←→ zenoh-bridge-ros1 ←→ Zenoh 网络 ←→ ZenohRos1HardwareAdapter
需确保机器人端zenoh-bridge-ros1正常运行,且其Zenoh配置(mode、router address)与适配器一致。
| 消息类型 | 用途 |
|---|---|
| sensor_msgs/CompressedImage | 相机图像(自动解码为JPEG bytes) |
| sensor_msgs/Image | 相机图像(解码为numpy数组) |
| sensor_msgs/JointState | 关节状态 |
| std_msgs/Float32 | 单精度浮点(如夹爪位置) |
| std_msgs/Float32MultiArray | 浮点数组 |
| 消息类型 | encoder | 用途 |
|---|---|---|
| hdas_msg/motor_control | motor_control | 电机控制(含位置/速度/力矩参数) |
| std_msgs/Float32 | float32 | 浮点控制(如夹爪位置) |
| 任意自定义 | raw_bytes | 透传原始字节(非标准消息) |
自定义消息类型: 可通过ros1_type_overrides注册新的ROS1消息类型,需提供datatype和md5值。
请参考config/robot_r1_zenoh_ros1_config.yaml文件的配置。
下面是该配置文件中的配置参数说明:
| 参数 | 类型 | 说明 | 默认值 |
|---|---|---|---|
| mode | str | Zenoh连接模式:"peer"(P2P)或"client"(连接router) | "peer" |
| connect_endpoints | List[str] | client模式下的router地址列表 | [] |
| namespace | str | Zenoh key中的命名空间段(与bridge默认行为一致) | "" |
| rate | float | 控制循环目标频率(Hz) | 30.0 |
| 参数 | 类型 | 说明 | 默认值 |
|---|---|---|---|
| multicast.enabled | bool | 是否启用组播发现(client模式建议禁用) | true |
| 参数 | 类型 | 说明 | 必需 |
|---|---|---|---|
| ros_topic | str | ROS1 topic名称 | 是 |
| msg_type | str | ROS1消息类型 | 是 |
| store_as | str | 在observation dict中的存储键名 | 否(默认使用订阅名) |
| 参数 | 类型 | 说明 | 必需 |
|---|---|---|---|
| ros_topic | str | 发布的ROS1 topic名称 | 是 |
| msg_type | str | ROS1消息类型 | 是 |
| encoder | str | 序列化方式:motor_control/float32/raw_bytes | 是 |
ros1_type_overrides(可选):
用于注册内置类型表之外的ROS1消息类型。每项为:
ros1_type_overrides:
"custom_msgs/MyMessage":
datatype: "custom_msgs/MyMessage"
md5: "abc123..." 使用步骤
# Step 1: 安装依赖 pip install zenoh opencv-python # Step 2: 确保机器人端zenoh-bridge-ros1正常运行 # (在机器人端启动bridge,确认其Zenoh配置与本适配器一致) # Step 3: 修改配置文件中的connect_endpoints、subscriptions、publishers vim config/robot_r1_zenoh_ros1_config.yaml # Step 4: 启动适配器 python -m r2c_sdk.cloudroboclient --bundle config/cert_xxx.zip --robot-config config/robot_r1_zenoh_ros1_config.yaml
适配其他ROS1机器人
- 修改订阅: 将subscriptions中的ros_topic改为目标机器人实际的topic名称(如/joint_states、/camera/rgb/image_raw/compressed)。
- 修改发布: 将 publishers中的ros_topic改为目标机器人接受的控制topic。
- 自定义消息类型: 如使用了非内置类型,通过ros1_type_overrides注册。
- 调整translator映射: 修改device_to_r2c和r2c_to_device中的source_path/target以匹配新的数据字段名。
Playback:回放录制数据
Playback适配器适用于离线调试cloudroboclient ↔ cloudrobo(policy server)链路,不需要真实硬件,通过回放之前录制的观测数据来模拟机器人。
该适配器无需额外安装(使用SDK内置的safe_serialization)依赖,请参考config/robot_playback_config.yaml文件的配置。
| 参数 | 类型 | 说明 | 默认值 |
|---|---|---|---|
| recording_file | str | 录制文件的路径(.r2cr格式) | 必需 |
| loop | bool | 播完后是否循环回开头 | true |
- Playback adapter的send_action()是空操作(no-op),收到cloud的action也不会执行。
- device_to_r2c和r2c_to_device的映射配置需与被录制的真实机器人的配置保持一致。
录制与回放
R2C SDK支持将观测数据录制为.r2cr二进制文件(安全格式,JSON结构 + 原始numpy字节,无代码执行风险),用于后续离线回放和调试。
- 录制:在cloudroboclient启动时添加--record参数。
python -m r2c_sdk.cloudroboclient --client-config config/client_config.yaml --robot-config config/robot_ur5e_config.yaml --record recordings/ur5e_demo.r2cr
正常运行时按Ctrl+C停止,录制文件会自动保存。
- 回放:使用robot_playback_config.yaml配置回放已录制的数据。
python -m r2c_sdk.cloudroboclient --client-config config/client_config.yaml --robot-config config/robot_playback_config.yaml
确保配置文件中playback_config.recording_file指向正确的录制文件。