Soma Zero Tutorials
🔍 搜索功能尚未开启,敬请期待。

2.5 双臂遥操系统校准、测试

下面的流程、代码、工具等只适用于双臂遥操作系统,单臂遥操作系统请查看上一篇。

1. 遥操作系统校准

1.1 环境配置

  • Ubuntu 电脑:我的版本是 20.04.6 LTS,其他版本,尤其是更高版本,可能有些驱动装不了

  • 使用 Anaconda 创建虚拟环境:conda create -y -n lerobot python=3.10

  • 激活环境:conda activate lerobot

  • 下载修改后的 lerobot 代码:git clone https://github.com/enpeizhao/lerobot_two_student.git

    不要使用 lerobot 官方代码,因为有代码改动(官方的代码不支持我的机械臂)

  • 解压,进入目录 cd lerobot

  • 安装 lerobot,使用:pip install -e . -i https://mirrors.huaweicloud.com/repository/pypi/simple

    注意:如果之前在环境中装过单臂的 lerobot,这里需要覆盖安装。

  • 安装飞特舵机支持,使用:pip install 'lerobot[feetech]'

  • 我的环境依赖参考在根目录的 lerobot_env_two.txt

1.2 中位校准遥操主臂

1.2.1 右侧遥操主臂

右侧遥操主臂的配置过程,与上一篇单臂遥操一模一样

  • 将右侧遥操主臂的电源和数据线插上,数据线另一头连接电脑

  • 运行指令:ls /dev/ttyACM* ,检查驱动板在 Ubuntu 下的端口,比如我的是:/dev/ttyACM0

  • 运行:python -m lerobot.set_middle --port=/dev/ttyACM0,进入校准程序,应该会输出这样的界面:

    INFO 2025-09-10 17:19:06 t_middle.py:117 {'motor_range': (1, 7), 'port': '/dev/ttyACM0'} Connected to Feetech motors on port /dev/ttyACM0 已解锁所有电机(扭矩禁用) 开始持续监控位置。电机范围: 1-7。按 Ctrl+C 停止。 您可以在监控时手动移动机械臂。 按 'r' 重置中位位置。 按 'l' 切换电机锁定状态(启用/禁用扭矩)。 原始位置: 电机 1: [2911], 电机 2: [1678], 电机 3: [3691], 电机 4: [2200], 电机 5: [1357], 电机 6: [1903], 电机 7: [2062]
  • 转动遥操主臂各个关节,你会看到电机位置数值变化

    飞特总线舵机编码器的分辨率是 4096,即你会看到位置在(0~4096)范围内

  • 切换英文输入法,按 r ,会提示:请手动移动机械臂到新的中位位置,然后按回车...

    如果没有响应,可以先按一下回车键

  • 将右遥操主臂各个关节转到它的中间位置(编码器 2048 的位置),大概如下:

    • 不必要求特别精准,大概在中位就行了
    • 需要注意夹爪支架的方向,不然校准后不顺手
    • 需要注意夹爪手指环的要尽量在中位,不然可能遥操作的执行的主臂夹爪抓不紧
    • 当然,校准不是一次性的,如果不满意,随时可以重新校准
    侧视图 后视图 正视图
  • 保持遥操主臂静止,按回车键,你会看到输出的电机角度全部校准为了 2048

  • 退出中位校准程序,保持遥操主臂通电、数据线连接电脑。

1.2.2 左侧遥操主臂

  • 类似的,将左侧遥操主臂的电源和数据线插上,数据线另一头连接电脑

  • 我们运行指令:ls /dev/ttyACM* ,检查驱动板在 Ubuntu 下的端口,这时应该有两个端口,比如我的:

    /dev/ttyACM0 /dev/ttyACM1
  • /dev/ttyACM0 是右侧的端口,那么另一个就是左侧的端口。运行:python -m lerobot.set_middle --port=/dev/ttyACM1,进入校准程序

  • 将左侧遥操主臂各个关节转到它的中间位置(编码器 2048 的位置),如下:

    • 如下图“左手——正视图” 前 6 个关节与右手一致
    • 区别是左手夹爪与右手夹爪差 180 度(这样更方便握住)。具体对比,请查看下图
    左手——正视图 左手夹爪——正视图 右手夹爪——正视图
  • 保持遥操主臂静止,按回车键,你会看到输出的电机角度全部校准为了 2048

  • 退出中位校准程序,保持遥操主臂通电、数据线连接电脑。

1.3 机械臂遥操作测试

操作时,注意安全!!!

操作时,注意安全!!!

操作时,注意安全!!!

第一次最好找一个助手协助,如果执行的从臂异常运动,可以及时断电(注意用手托住关节)

  • 摆放机械臂:

    • 机械臂先别装相机和夹爪(忽略下图)
    • 两台执行从臂相对摆放(插线槽相互远离,方便走线),通电、数据线连接电脑
    • 两台遥操主臂同样相对摆放(插线槽相互远离,方便走线),通电、数据线连接电脑
    俯拍 正视 遥操作
  • 修改左右 2 台 Episode1 机械臂(注意,不是遥操主臂)六个驱动板的参数,将 Response 改为 None,如果不会修改,请查看这里

  • 都插上夹爪控制盒,夹爪先不用装在机械臂末端(还没有安装相机)

  • 下载最新版上位机(V0.9.8 以上)

  • 左侧 Episode1 机械臂上电

    • 打开上位机,选择对应的 USB_ID,设置一个端口
    • 启用服务器,进行归零、回到默认位置
  • 右侧 Episode1 机械臂上电

    • 再打开一个上位机窗口,选择对应的 USB_ID,设置一个端口
    • 进行归零、回到默认位置

    注意:两个上位机的 USB_ID、端口不可能一致,否则另一台无法启动,比如我配置:

  • 2 个上位机关闭”启用日志“、”启用状态刷新“ 复选框

  • 运行下面代码,机械臂会运行到准备位置

    python -m lerobot.episode_default_position --ip_left=localhost --port_left=12346 --ip_right=localhost --port_right=12345

  • 双手握住各自遥操主臂,初始位置与从臂接近

  • 运行指令:

    操作时,注意安全!!!

    python -m lerobot.teleoperate \ --robot.ip_address_left="localhost" \ --robot.port_left=12346 \ --robot.ip_address_right="localhost" \ --robot.port_right=12345 \ --robot.type=enpei_follower \ --robot.id=enpei_follower \ --robot.cameras="{ }" \ --teleop.type=enpei_leader \ --teleop.port_left=/dev/ttyACM1 \ --teleop.port_right=/dev/ttyACM0 \ --teleop.id=enpei_leader \ --fps=30\ --display_data=false \ --enpei_speed_mode=record

    robot 表示从臂执行臂相关参数,telep 表示遥操主臂相关参数,在测试时,你只需要修改下列标 “✅ ”的项:

    参数 是否需要修改 解释
    robot.ip_address_left="localhost" ✅ 是 左侧从臂上位机 API 的 IP 地址
    robot.port_left=12346 ✅ 是 左侧从臂上位机 API 的端口
    robot.ip_address_right="localhost" ✅ 是 右侧从臂上位机 API 的 IP 地址
    robot.port_right=12345 ✅ 是 右侧从臂上位机 API 的端口
    robot.type=enpei_follower 从臂类别,方便框架识别
    robot.id=enpei_follower 从臂 ID,方便框架识别
    robot.cameras="{ }" 相机参数,测试时暂不需要填写,实际采集数据的时候需要
    teleop.type=enpei_leader 主臂类别,方便框架识别
    teleop.port_left=/dev/ttyACM1 ✅ 是 左侧主臂驱动板端口
    teleop.port_right=/dev/ttyACM0 ✅ 是 右侧主臂驱动板端口
    teleop.id=enpei_leader 主臂 ID,方便框架识别
    fps=30 控制频率,范围 0~100,越大,遥操作响应越快
    display_data=false rerun.io 可视化
    enpei_speed_mode=record 速度模式
  • 一切正常的话,程序启动后,便可以用遥操主臂操作从臂了,请检查:

    • 分别转动左侧主臂前 6 个关节,看看从臂能否跟着转动

    • 看看左侧夹爪能否控制

    • 再检查右侧

    • 终端应该有类似如下输出:

  • 自己遥操作熟练一下,如果需要退出,在终端按 Ctrl+C 退出程序

  • 高速模式:

    操作时,注意安全!!!

    操作时,注意安全!!!

    操作时,注意安全!!!

    python -m lerobot.teleoperate \ --robot.ip_address_left="localhost" \ --robot.port_left=12346 \ --robot.ip_address_right="localhost" \ --robot.port_right=12345 \ --robot.type=enpei_follower \ --robot.id=enpei_follower \ --robot.cameras="{ }" \ --teleop.type=enpei_leader \ --teleop.port_left=/dev/ttyACM1 \ --teleop.port_right=/dev/ttyACM0 \ --teleop.id=enpei_leader \ --fps=100\ --display_data=false \ --enpei_speed_mode=teleop

2. 安装测试相机

  • 再次运行指令,让从臂运行到遥操默认位置,方便安装相机和夹爪:

    python -m lerobot.episode_default_position --ip_left=localhost --port_left=12346 --ip_right=localhost --port_right=12345
  • 先安装腕部相机,再安装夹爪

    • 相机尽量在正前方,这样可以拍到夹爪
    • 可以用魔术贴扎带将线固定好
    位置 1 位置 2
  • 将固定位相机也摆好:

  • 3 个相机的 USB 线插入电脑 USB 口,最好是 USB3 口

    • 如果线不够长,需要自购一根 USB3 延长线
    • 如果电脑没有多余的 USB3 接口,需要自购 USB3 扩展坞
  • 运行:python -m lerobot.find_cameras opencv ,应该输出类似信息:

    --- Detected Cameras --- Camera #0: Name: OpenCV Camera @ /dev/video0 Type: OpenCV Id: /dev/video0 Backend api: V4L2 Default stream profile: Format: 0.0 Width: 640 Height: 480 Fps: 30.0 -------------------- Camera #1: Name: OpenCV Camera @ /dev/video2 Type: OpenCV Id: /dev/video2 Backend api: V4L2 Default stream profile: Format: 0.0 Width: 640 Height: 480 Fps: 30.0 -------------------- Camera #2: Name: OpenCV Camera @ /dev/video4 Type: OpenCV Id: /dev/video4 Backend api: V4L2 Default stream profile: Format: 0.0 Width: 640 Height: 480 Fps: 30.0 -------------------- Finalizing image saving... Image capture finished. Images saved to outputs/captured_images
    • 必须有 3 个相机(分割线分割),如果数量不对,请检查连线

    • FPS 必须都要达到 30

    • 确定 ID,去 outputs/captured_images 下保存的图片查看

      • 结合文件名和拍摄内容,可以看到各自相机的索引:

        • 左侧相机:4
        • 右侧相机:0
        • 俯拍:2
      • 腕部相机必须要能看到柔性夹爪的手指(下方蓝色、红色手指),否则需要调整你的相机位置

      opencv__dev_video0.png opencv__dev_video2.png opencv__dev_video4.png
  • 结合相机,再次遥操作:

    • 左侧相机:handeye_left,4
    • 右侧相机:handeye_right,0
    • 俯拍:fixed,2
    • display_data=true 表示打开 rerun.io 可视化(要在 Ubuntu 本机,不能是 SSH 远程)
    python -m lerobot.teleoperate \ --robot.ip_address_left="localhost" \ --robot.port_left=12346 \ --robot.ip_address_right="localhost" \ --robot.port_right=12345 \ --robot.type=enpei_follower \ --robot.id=enpei_follower \ --robot.cameras="{ handeye_left: {type: opencv, index_or_path: 4, width: 320, height: 240, fps: 30}, handeye_right: {type: opencv, index_or_path: 0, width: 320, height: 240, fps: 30}, fixed: {type: opencv, index_or_path: 2, width: 320, height: 240, fps: 30}}" \ --teleop.type=enpei_leader \ --teleop.port_left=/dev/ttyACM1 \ --teleop.port_right=/dev/ttyACM0 \ --teleop.id=enpei_leader \ --fps=30\ --display_data=true \ --enpei_speed_mode=record

    一切正常的话,理应打开下图窗口: