🍎 使用 J501 Mini 和 StarAI Viola 机械臂进行水果分拣
🚀 简介
本 wiki 演示如何使用 J501 Mini(Jetson AGX Orin) 与 StarAI Viola 机械臂 通过 LeRobot 框架 执行水果分拣任务。该项目展示了从数据收集到部署的端到端工作流程,使机器人能够智能地抓取和整理水果。

您将学到:
- 🔧 J501 Mini 和 StarAI Viola 机械臂 的硬件设置
- 💻 在 Jetson AGX Orin 上配置 LeRobot 软件环境
- 🎯 水果分拣任务的数据收集和远程操作
- 🤖 训练 ACT 策略模型
- 🚀 部署训练好的模型进行自主水果分拣

📚 本教程提供分步说明,帮助您从零开始构建智能水果分拣系统。
本 wiki 基于 JetPack 6.2.1,使用 Jetson AGX Orin 模块。
🛠️ 硬件要求
所需组件
- 配备 Jetson AGX Orin 模块的 J501 Mini
- StarAI Viola 从动机械臂(6+1 自由度)
- StarAI Violin 主动机械臂(6+1 自由度)用于远程操作
- 2x USB 摄像头(推荐 640x480 @ 30fps)
- 一个腕部安装摄像头
- 一个第三人称视角摄像头
- UC-01 调试板(x2,机械臂附带)
- 12V 电源 用于机械臂
- USB 线缆 用于机械臂通信
- 水果 用于分拣演示
硬件规格
| 组件 | 规格 |
|---|---|
| J501 Mini | Jetson AGX Orin,JetPack 6.2.1 |
| Viola 从动臂 | 6+1 自由度,470mm 臂展,300g 负载 |
| Violin 主动臂 | 6+1 自由度,470mm 臂展,远程操作 |
| 摄像头 | USB,640x480 @ 30fps,MJPG 格式 |
| 电源 | 每个机械臂 12V 10A |
💻 软件环境设置
前提条件
- Ubuntu 22.04(在配备 JetPack 6.2.1 的 J501 Mini 上)
- Python 3.10
- CUDA 12+
- PyTorch 2.6+(GPU 版本)
安装 Miniconda
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-aarch64.sh
chmod +x Miniconda3-latest-Linux-aarch64.sh
./Miniconda3-latest-Linux-aarch64.sh
source ~/.bashrc
创建 LeRobot 环境
# Create conda environment
conda create -y -n lerobot python=3.10 && conda activate lerobot
# Clone LeRobot repository
git clone https://github.com/Seeed-Projects/lerobot.git ~/lerobot
cd ~/lerobot
# Install ffmpeg
conda install ffmpeg -c conda-forge
安装 PyTorch 和依赖项
对于 Jetson 设备,首先安装 PyTorch 和 Torchvision:
# Install PyTorch for Jetson (refer to official Jetson PyTorch installation guide)
# Example:
pip3 install torch torchvision torchaudio
# Install LeRobot
cd ~/lerobot && pip install -e .
# Install additional dependencies for Jetson
conda install -y -c conda-forge "opencv>=4.10.0.84"
conda remove opencv
pip3 install opencv-python==4.10.0.84
pip3 install numpy==1.26.0
# Remove brltty if it causes USB port conflicts
sudo apt remove brltty
安装 StarAI 电机依赖项
pip install lerobot_teleoperator_bimanual_leader
pip install lerobot_robot_bimanual_follower
验证安装
import torch
print(torch.cuda.is_available()) # Should print True
🔧 硬件设置和校准
配置 USB 端口
连接机械臂并识别其 USB 端口:
cd ~/lerobot
lerobot-find-port
您应该看到类似以下的输出:
- 主动臂:
/dev/ttyUSB0 - 从动臂:
/dev/ttyUSB1
授予 USB 端口访问权限:
sudo chmod 666 /dev/ttyUSB*
初始机械臂位置
在校准之前,将两个机械臂移动到初始位置:
| Violin 主动臂 | Viola 从动臂 |
|---|---|
![]() | ![]() |
校准主动臂
lerobot-calibrate \
--teleop.type=lerobot_teleoperator_violin \
--teleop.port=/dev/ttyUSB0 \
--teleop.id=my_violin_leader
手动将每个关节移动到其最大和最小位置。校准完所有关节后按 Enter 键保存。
校准从动臂
lerobot-calibrate \
--robot.type=lerobot_robot_viola \
--robot.port=/dev/ttyUSB1 \
--robot.id=my_viola_follower
校准文件保存到 ~/.cache/huggingface/lerobot/calibration/
设置摄像头
查找您的摄像头端口:
lerobot-find-cameras opencv
示例输出:
Camera #0: /dev/video2 (wrist camera)
Camera #1: /dev/video4 (front camera)
安装摄像头:
- 腕部摄像头:安装到夹爪上用于近距离视角
- 前置摄像头:放置在桌面上用于第三人称视角
🎮 远程操作测试
在数据收集之前,通过远程操作测试设置:
lerobot-teleoperate \
--robot.type=lerobot_robot_viola \
--robot.port=/dev/ttyUSB1 \
--robot.id=my_viola_follower \
--robot.cameras="{ wrist: {type: opencv, index_or_path: /dev/video2, width: 640, height: 480, fps: 30, fourcc: 'MJPG'}, front: {type: opencv, index_or_path: /dev/video4, width: 640, height: 480, fps: 30, fourcc: 'MJPG'}}" \
--teleop.type=lerobot_teleoperator_violin \
--teleop.port=/dev/ttyUSB0 \
--teleop.id=my_violin_leader \
--display_data=true
对于 ACT 模型训练,摄像头名称必须是 wrist 和 front。使用不同名称需要修改源代码。
📊 水果分拣数据收集
登录 Hugging Face(可选)
如果您想将数据集上传到 Hugging Face Hub:
huggingface-cli login --token ${HUGGINGFACE_TOKEN} --add-to-git-credential
HF_USER=$(huggingface-cli whoami | head -n 1)
echo $HF_USER
记录训练数据集
收集 50 个水果分拣演示片段:
lerobot-record \
--robot.type=lerobot_robot_viola \
--robot.port=/dev/ttyUSB1 \
--robot.id=my_viola_follower \
--robot.cameras="{ wrist: {type: opencv, index_or_path: /dev/video2, width: 640, height: 480, fps: 30, fourcc: 'MJPG'}, front: {type: opencv, index_or_path: /dev/video4, width: 640, height: 480, fps: 30, fourcc: 'MJPG'}}" \
--teleop.type=lerobot_teleoperator_violin \
--teleop.port=/dev/ttyUSB0 \
--teleop.id=my_violin_leader \
--display_data=true \
--dataset.repo_id=${HF_USER}/fruit_sorting \
--dataset.episode_time_s=30 \
--dataset.reset_time_s=30 \
--dataset.num_episodes=50 \
--dataset.push_to_hub=true \
--dataset.single_task="Sort fruits into containers"
记录参数
| 参数 | 描述 |
|---|---|
--dataset.episode_time_s | 每个片段的持续时间(30 秒) |
--dataset.reset_time_s | 片段间重置时间(30 秒) |
--dataset.num_episodes | 要记录的片段数量(50) |
--dataset.push_to_hub | 上传到 Hugging Face Hub(true/false) |
--dataset.single_task | 任务描述 |
记录期间的键盘控制
- 右箭头(→):跳到下一个片段
- 左箭头(←):重新记录当前片段
- ESC:停止记录并保存数据集
如果键盘控制不起作用,请尝试:pip install pynput==1.6.8
回放片段
通过回放片段测试记录的数据:
lerobot-replay \
--robot.type=lerobot_robot_viola \
--robot.port=/dev/ttyUSB1 \
--robot.id=my_viola_follower \
--dataset.repo_id=${HF_USER}/fruit_sorting \
--dataset.episode=0
🎓 训练 ACT 策略
训练配置
在您收集的数据集上训练 ACT 模型:
lerobot-train \
--dataset.repo_id=${HF_USER}/fruit_sorting \
--policy.type=act \
--output_dir=outputs/train/fruit_sorting_act \
--job_name=fruit_sorting_act \
--policy.device=cuda \
--wandb.enable=false \
--policy.repo_id=${HF_USER}/fruit_sorting_policy \
--steps=100000 \
--batch_size=8 \
--eval.batch_size=8 \
--eval.n_episodes=10 \
--eval_freq=5000
训练参数
| 参数 | 描述 |
|---|---|
--policy.type | 模型类型(act) |
--steps | 总训练步数(100,000) |
--batch_size | 训练批次大小(8) |
--eval_freq | 评估频率(每 5000 步) |
--wandb.enable | 启用 Weights & Biases 日志记录 |
训练时间
在 J501 Mini (AGX Orin) 上:
- 50 个回合:约 8-10 小时
- 100 个回合:约 16-20 小时
您可以启用 --wandb.enable=true 来使用 Weights & Biases 监控训练进度。请确保先运行 wandb login。
恢复训练
如果训练被中断,可以从最后一个检查点恢复:
lerobot-train \
--config_path=outputs/train/fruit_sorting_act/checkpoints/last/pretrained_model/train_config.json \
--resume=true \
--steps=200000
🚀 部署和评估
评估训练好的模型
运行评估回合来测试训练好的策略:
lerobot-record \
--robot.type=lerobot_robot_viola \
--robot.port=/dev/ttyUSB1 \
--robot.id=my_viola_follower \
--robot.cameras="{ wrist: {type: opencv, index_or_path: /dev/video2, width: 640, height: 480, fps: 30, fourcc: 'MJPG'}, front: {type: opencv, index_or_path: /dev/video4, width: 640, height: 480, fps: 30, fourcc: 'MJPG'}}" \
--display_data=false \
--dataset.repo_id=${HF_USER}/eval_fruit_sorting \
--dataset.single_task="Sort fruits into containers" \
--dataset.num_episodes=10 \
--policy.path=outputs/train/fruit_sorting_act/checkpoints/last/pretrained_model
自主操作
训练完成后,机器人可以自主分拣水果。下面的视频演示了在 J501 Mini 配合 StarAI Viola 机械臂上使用训练好的 ACT 策略完成水果分拣的完整工作流程:
演示亮点:
- 机器人自主识别并抓取不同的水果
- 从远程操作演示中学习到的流畅精确动作
- 成功将水果分拣到指定容器中
- 展示了在 J501 Mini 上训练的 ACT 策略的有效性
运行自主水果分拣:
- 将水果放置在工作区域
- 运行上面显示的评估命令
- 机器人将执行学习到的行为来抓取和分拣水果
🎯 提升性能的技巧
数据收集最佳实践
-
一致的环境
- 保持光照条件稳定
- 最小化背景变化
- 使用一致的水果摆放
-
质量胜过数量
- 收集流畅、有意识的演示
- 避免急促的动作
- 确保训练数据中的抓取成功
-
相机定位
- 保持相机角度一致
- 确保水果和夹爪的良好可见性
- 避免录制过程中相机移动
训练优化
-
数据集大小
- 从 50 个回合开始
- 如果性能不足则添加更多数据
- 100-200 个回合通常足以应对简单任务
-
超参数调优
- 根据 GPU 内存调整批次大小
- 增加训练步数以获得更好的收敛
- 监控评估指标
-
环境一致性
- 在与训练相似的条件下部署
- 保持一致的光照
- 使用相似的水果类型和容器
🔧 故障排除
常见问题
USB 端口未检测到
# Remove brltty
sudo apt remove brltty
# Check USB devices
lsusb
sudo dmesg | grep ttyUSB
# Grant permissions
sudo chmod 777 /dev/ttyUSB*
相机无法工作
- 不要通过 USB 集线器连接相机
- 使用直接 USB 连接
- 使用
lerobot-find-cameras opencv检查相机索引
训练内存不足
- 减少批次大小:
--batch_size=4 - 降低图像分辨率
- 关闭其他应用程序
推理性能差
- 收集更多训练数据
- 确保环境一致
- 检查相机定位
- 验证校准精度
📚 参考资料
- 🔗 LeRobot 文档
- 🔗 StarAI 机械臂 Wiki
- 🔗 J501 Mini 文档
- 🔗 ACT 论文
- 🔗 JetPack SDK
🤝 技术支持与产品讨论
感谢您选择我们的产品!我们在这里为您提供不同的支持,以确保您使用我们产品的体验尽可能顺畅。我们提供多种沟通渠道,以满足不同的偏好和需求。



