失败:RDK S100有关LeRobot的ACT Policy模型推理

根据你提供的信息和社区已有文档,机械臂在固定位置反复震荡是 LeRobot ACT Policy 部署中的典型问题。结合官方文档的排查指南,以下是系统性解决方案:

问题诊断

从你的截图和描述看,问题可能来自以下几个方面:

1. 模型训练不充分 最可能

  • 6万步训练对于 ACT Policy 可能不够
  • 官方建议:至少 50 组数据 × 60秒/组,训练 50k 步以上
  • 检查训练 loss 曲线是否已收敛

2. 摄像头索引配置错误

  • 多摄像头场景下,camera_index 配置错误会导致输入图像错位
  • 验证方法:
python lerobot/common/robot_devices/cameras/opencv.py --images-dir outputs/images_from_opencv_cameras

3. 舵机 PID 参数问题

  • 官方文档明确指出需要将 D 系数设为 0 来减少抖动

:hammer_and_wrench: 解决步骤

步骤 1:检查模型训练状态

# 查看训练日志中的 loss 曲线
# 如果 loss 还在下降,说明模型未收敛,需要继续训练
# 建议训练步数:50k-100k steps

关键指标检查:

  • loss 是否已稳定在较低值(< 0.1)
  • l1_loss 是否趋于平稳
  • 如果曲线还在明显下降,继续训练

步骤 2:修正舵机 PID 参数

修改 lerobot/common/robot_devices/robots/manipulator.py

def set_so100_robot_preset(self):
    for name in self.follower_arms:
        self.follower_arms[name].write("Mode", 0)
        self.follower_arms[name].write("P_Coefficient", 16)
        self.follower_arms[name].write("I_Coefficient", 0)
        self.follower_arms[name].write("D_Coefficient", 0)  # ← 关键:D=0
        self.follower_arms[name].write("Lock", 0)
        self.follower_arms[name].write("Maximum_Acceleration", 254)
        self.follower_arms[name].write("Acceleration", 254)

步骤 3:验证摄像头配置

# 1. 检查摄像头索引
python lerobot/common/robot_devices/cameras/opencv.py --images-dir test_cameras

# 2. 确认 configs.py 中的配置
# 修改 lerobot/common/robot_devices/robots/configs.py
cameras: dict[str, CameraConfig] = field(
    default_factory=lambda: {
        "laptop": OpenCVCameraConfig(
            camera_index=0,  # ← 根据实际检测结果修改
            fps=30,
            width=640,
            height=480,
        ),
        "phone": OpenCVCameraConfig(
            camera_index=2,  # ← 根据实际检测结果修改
            fps=30,
            width=640,
            height=480,
        ),
    }
)

步骤 4:检查推理脚本配置

确认你使用的推理脚本正确加载了模型:

# 如果使用 cpu_act_control_robot.py 或 bpu_act_control_robot.py
# 检查模型路径是否正确指向训练完成的 pretrained_model 目录
model_path = "outputs/train/act_test_1epoch/pretrained_model"  # ← 确认路径

步骤 5:增加训练数据量(如需要)

如果模型确实未收敛:

# 重新采集数据,建议至少 50 组
python lerobot/scripts/control_robot.py \
  --robot.type=so100 \
  --control.type=record \
  --control.fps=30 \
  --control.single_task="Pick and Place" \
  --control.num_episodes=50 \
  --control.episode_time_s=60 \
  --control.root=datasets/so100_v2

# 重新训练
python lerobot/scripts/train.py \
  --dataset.repo_id=YOUR_USERNAME/so100_v2 \
  --policy.type=act \
  --output_dir=outputs/train/act_v2 \
  --policy.device=cuda \
  --wandb.enable=true

:bar_chart: 快速验证清单

  • 训练 loss 是否已收敛(查看 wandb 或训练日志)
  • 舵机 D_Coefficient 是否设为 0
  • 摄像头索引是否正确(运行 opencv.py 验证)
  • 推理脚本是否加载了正确的模型权重
  • 机械臂标定文件是否存在(.cache/calibration/so100/

:books: 参考资源

强烈建议参考社区精华帖:

特别是文档中的附录四 - 机械臂在一个位置反复震荡章节,与你的问题完全匹配。

:light_bulb: 下一步建议

请先执行步骤 1 和步骤 2,这两个是最常见的根因。如果问题依旧,请提供:

  1. 训练 loss 曲线截图
  2. 使用的推理命令
  3. 摄像头检测结果

这样我可以帮你进一步定位问题。