文章目录
背景项目简介:整体流程材料清单复刻步骤1 . 配置Lerobot环境步骤1.1:安装Miniconda管理Python环境步骤1.2:创建并激活conda环境步骤1.3:克隆Lerobot仓库步骤1.4:安装飞特舵机的驱动步骤1.5:如果你是Linux用户,还需要安装一些额外的依赖:
2.配置舵机驱动步骤2.1:查找电机驱动板子端口步骤2.2:更改配置文件中的驱动端口步骤2.3:配置电机ID
3:组装机械臂步骤3.1:组装从臂步骤3.2:组装主臂步骤3.3:插好数据线并固定
4.校准机械臂5. 测试遥操作6.带摄像头遥操作7.记录数据集8.本地训练9.云端训练步骤9.1:租个云算力服务器步骤9.2:配置环境,和本地的环境配置一样步骤9.3:上传数据集步骤9.4:训练步骤9.4:下载数据到本地
10.测试评估模型
总结
本篇文章作者:郝密
背景
过年这段时间,终于有空了,复刻了一个挺有挑战的开源项目——Lerobot SO-ARM100机械臂。这是一个huggingface开源的项目,可能是目前成本最低、最容易上手的机器人项目了,还挺适合带小朋友一起玩的。大概两周时间,完成了拼装、训练和测试评估,过程中也踩了不少坑,看看效果吧(视频中的抖动这两天已经解决,非常丝滑了,请不要在意)。
成品视频展示
感觉家用机器人离我们越来越近了!特斯拉、宇树科技、figure的机器人进步神速,也看到有蚂蚁成立了具身智能的团队,值得期待。再不学点新东西,真的要被时代甩在后面了! 复刻过程中,接触到很多新的概念,借助AI解决了很多问题,其中cursor&deepseek帮了很大的忙,快速帮我看懂源码,修改代码治好了抖动的问题,还做了个可交互界面让儿子去控制机械臂。 我是看着B站一个博主的视频一步一个坑的搞定的,很多细节缺失导致返工,至少浪费了一星期的时间。所以决定写篇教程带小白从零开始,少踩坑,一步步搭建属于自己的机械臂,并让它完成写简单训练任务。
项目简介:
SO-ARM100是一款具备 6 自由度、支持 3D 打印、极具性价比的开源机械臂。 Lerobot是个开源机器人的解决方案,可基于act的强化学习框架训练SO-ARM100模仿人的操作,当然也可以是其他机械臂。
整体流程
附官方示例教程: https://github.com/huggingface/lerobot/blob/main/examples/10_use_so100.md
友情提示:若不是高手请按照流程操作!!!儿子负责拼搭,上来就对着视频组装机械臂,最后全部返工,让我通宵多拧了上百次螺丝😭。
材料清单
淘宝上有人卖(或联系wx:hgm159951),全套组装好的成品,差不多1900元,不嫌麻烦可以自行打印购置配件,成本1500左右。
必买配件
部件数量购买链接价格3D打印材料1主臂STL/3MF文件 从臂STL/3MF文件没3D打印机的可以淘宝代打印,应该几十块飞特的STS3215伺服电机12链接12*100=1200左右电机控制板2链接24*2=48元主臂电源适配器2A1链接12从臂电源适配器10A1链接23桌面夹具2链接5*2=10元广角摄像头(免驱高分辨率即可)2链接80*2=160元
以下按需购买
部件数量USB-C线缆(电脑连舵机)2usb扩展坞1十字螺丝刀1锉刀用于打磨3d打印件1
复刻步骤
1 . 配置Lerobot环境
本人用的是mac电脑,也可以是linux环境
步骤1.1:安装Miniconda管理Python环境
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-aarch64.sh
sh ./Miniconda3-latest-Linux-aarch64.sh
source ~/.bashrc
步骤1.2:创建并激活conda环境
conda create -y -n lerobot python=3.10 && conda activate lerobot
步骤1.3:克隆Lerobot仓库
git clone https://github.com/huggingface/lerobot.git ~/lerobot
步骤1.4:安装飞特舵机的驱动
cd ~/lerobot && pip install -e ".[feetech]"
步骤1.5:如果你是Linux用户,还需要安装一些额外的依赖:
conda install -y -c conda-forge ffmpeg
pip uninstall -y opencv-python
conda install -y -c conda-forge "opencv>=4.10.0"
2.配置舵机驱动
结合UP主视频操作:B站视频
步骤2.1:查找电机驱动板子端口
找到购买的电机驱动板,一块给主臂,另一块给从臂,并做好标记把驱动板插到电脑usb口,执行下面命令,再拔出来,会返回端口编号,记录下来,大概长这样的(/dev/tty.usbmodem58760431091)python lerobot/scripts/find_motors_bus_port.py
步骤2.2:更改配置文件中的驱动端口
编辑lerobot/common/robot_devices/robots/configs.py文件,搜索FeetechMotorsBusConfig,修改对应主臂和从臂的端口号
leader_arms: dict[str, MotorsBusConfig] = field(
default_factory=lambda: {
"main": FeetechMotorsBusConfig(
port="/dev/tty.usbmodem58760431091",
motors={
# name: (index, model)
"shoulder_pan": [1, "sts3215"],
"shoulder_lift": [2, "sts3215"],
"elbow_flex": [3, "sts3215"],
"wrist_flex": [4, "sts3215"],
"wrist_roll": [5, "sts3215"],
"gripper": [6, "sts3215"],
},
),
}
)
follower_arms: dict[str, MotorsBusConfig] = field(
default_factory=lambda: {
"main": FeetechMotorsBusConfig(
port="/dev/tty.usbmodem585A0076891",
motors={
# name: (index, model)
"shoulder_pan": [1, "sts3215"],
"shoulder_lift": [2, "sts3215"],
"elbow_flex": [3, "sts3215"],
"wrist_flex": [4, "sts3215"],
"wrist_roll": [5, "sts3215"],
"gripper": [6, "sts3215"],
},
),
}
)
步骤2.3:配置电机ID
接下来,配置每个电机的ID。插入第一个电机并运行以下命令:
python lerobot/scripts/configure_motor.py \
--port /dev/tty.usbmodem58760431091 \
--brand feetech \
--model sts3215 \
--baudrate 1000000 \
--ID 1
依次配置主臂的6个电机,ID从1到6。 再改为从臂的端口号,插入6个舵机依次执行,编号也是1~6。
命令执行后, 齿轮会转动一下,让舵机回到中心点,接下去不要去转动齿轮,特别是在装机械臂的过程中。
3:组装机械臂
步骤3.1:组装从臂
从下往上安装,最下面的舵机编号是1,最上面的是6
https://www.bilibili.com/video/BV1GJmRYvENG?spm_id_from=333.788.videopod.sections&vd_source=93bcce22c41b926b20936f3d1338110d
重要的事情说三遍: 1. 安装过程中不要去转动齿轮! 安装过程中不要去转动齿轮! 安装过程中不要去转动齿轮! 2. 3D打印件精度不高,如果塞不进去的话 ,用打火机烧一下,锉刀磨一磨。 3. 圆形的电源插头很不牢固,采集的时候经常掉链子,开始以为程序问题查好几天,最后用胶带捆一下彻底解>决。看我这教程真是少走十年弯路。
步骤3.2:组装主臂
https://www.bilibili.com/video/BV1dZmoYjEFW
和主臂安装顺序一致,但千万注意,从臂和主臂安装最大的不同,把主臂6个舵机打开,把图中这个齿轮卸下来。这时候舵盘很松,在安装过程,千万千万不要去转舵盘。 ps:这是导致我大返工的重要原因,我写了些python脚本去观察当前度数才解决问题。
步骤3.3:插好数据线并固定
最底部1号舵机的数据线一头驱动板上,剩余的数据线互联即可。 再拿个夹具固定在桌子上。
4.校准机械臂
为了确保主臂和从臂完全同步,运行以下命令,进行校准:
python lerobot/scripts/control_robot.py \
--robot.type=so100 \
--robot.cameras='{}' \
--control.type=calibrate \
--control.arms='["main_follower"]'
执行命令后根据语音提示,先操作从臂校准,再操作主臂校准。 PS:让AI解释了下源码,发现校准时主臂和从臂每个舵机角度的偏差不能超过10%,之前的安装过程中,若舵盘转动,会造成校准不成功,不得不返工,从臂舵机还能重复步骤2.3回到初始位,主臂舵机则很难搞,我写了些python脚本去观察当前度数,手动拨到初始位置才解决。
Zero position 零位置 Rotated position 2. 旋转位置 Rest position 3. 静止位置
5. 测试遥操作
运行以下命令,如果顺利的话,从臂就跟着主臂摆动起来了,可以看下视频。
python lerobot/scripts/control_robot.py \
--robot.type=so100 \
--robot.cameras='{}' \
--control.type=teleoperate
首次测试,你就会发现机械臂抖动非常厉害,我看了B站、抖音上很多lerobot的视频,发现大家的机械臂都是抖动的,还以为是舵机本身问题,在lerobot社区没有见到有人解决,困扰了我十几天后,尝试着用cursor+deepseek分析下问题,只用了1分钟,AI让我调小了PID参数,没想到真的能用,感兴趣的点击视频看看效果。
lerobot-main/lerobot/common/robot_devices/robots/manipulator.py下,找到set_so100_robot_preset方法,把PID三个值调整下,再测试下,效果非常惊艳。
# Set P_Coefficient to lower value to avoid shakiness (Default is 32)
self.follower_arms[name].write("P_Coefficient", 12)
# Set I_Coefficient and D_Coefficient to default value 0 and 32
self.follower_arms[name].write("I_Coefficient", 0)
self.follower_arms[name].write("D_Coefficient", 0)
6.带摄像头遥操作
插入多个USB摄像头后,运行以下命令检查摄像头端口:
python lerobot/scripts/control_robot.py \
--robot.type=so100 \
--control.type=teleoperate
再outputs/images_from_opencv_cameras目录下看到很多图片文件,上面就有每个摄像头的编号,如
camera_00_frame_000000.png
camera_00_frame_000047.png
camera_01_frame_000000.png
camera_01_frame_000047.png
打开lerobot/common/robot_devices/robots/configs.py文件,找到So100RobotConfig,把camera_index改正确。
cameras: dict[str, CameraConfig] = field(
default_factory=lambda: {
"laptop": OpenCVCameraConfig(
camera_index=0,
fps=30,
width=640,
height=480,
),
"phone": OpenCVCameraConfig(
camera_index=1,
fps=30,
width=640,
height=480,
),
}
)
最后再测试带摄像摇操作的命令,不报错的话会再界面上看到两个视频窗口。
python lerobot/scripts/control_robot.py \
--robot.type=so100 \
--control.type=teleoperate
7.记录数据集
调整好摄像头机位,可以参考下图
划重点 ● 多个摄像头要全部对着从臂拍, ● 一个从上方拍摄,一个正面/侧面拍摄。 ● 尽可能背景干净,我看有网友是用绿幕做背景,效果很好。 ● 拍的时候,不要拍到机械臂以外的移动物体。
接着运行以下采集命令,开始记录你的第一个数据集,先测试一下简单的抓取任务,录制个几集(num_episodes)感受下,录制的数据放在~/.cache/huggingface/lerobot/mytest/目录下。
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=mytest/so100_test \
--control.tags='["so100","tutorial"]' \
--control.warmup_time_s=5 \
--control.episode_time_s=20 \
--control.reset_time_s=20 \
--control.num_episodes=5 \
--control.push_to_hub=false
注意:这个命令和官方/B站博主的示例都不一样,他们的命令是依赖huggingfase数据集的,要翻墙,大大增加复杂度。我用cursor研究了下源码,有个control.push_to_hub配置,设置成false就不上传huggingfase。
8.本地训练
要是本地有显卡,少走20年弯路,运行以下命令即可开始训练,默认100000步,用4090训练2个多小时。训练好的模型存在outputs/train/act_so100目录下。
nohup python lerobot/scripts/train.py \
--dataset.repo_id=mytest/so100_test \
--policy.type=act \
--output_dir=outputs/train/act_so100 \
--job_name=act_so100 \
--device=cuda \
--wandb.enable=false \
--dataset.local_files_only=true&
9.云端训练
猜你大概率走到这个分支,其中上传下载数据和模型有点麻烦,我写了个脚本,用oss转储。
步骤9.1:租个云算力服务器
各种平台的4090显卡差不多都是一两块多一小时,3小时训练完的话,一次成本不到6块钱。 https://autodl.com/ https://www.9gpu.com/
步骤9.2:配置环境,和本地的环境配置一样
conda create -y -n lerobot python=3.10
conda activate lerobot
git clone https://github.com/huggingface/lerobot.git ~/lerobot
cd ~/lerobot && pip install -e ".[feetech]"
步骤9.3:上传数据集
数据集存放在~/.cache/huggingface/lerobot/mytest/目录下,tar打包下,想办法传到服务器上,办法有很多。
通过FTP工具直接把文件上传到GPU服务器上,并解压到~/.cache/huggingface/lerobot/mytest/目录下先花点小钱申请阿里云oss资源,数据集上传到oss上,再到服务器上把文件下载下来,写个脚本,操作效率会高一些。
步骤9.4:训练
nohup python lerobot/scripts/train.py \
--dataset.repo_id=mytest/so100_test \
--policy.type=act \
--output_dir=outputs/train/act_so100 \
--job_name=act_so100 \
--device=cuda \
--wandb.enable=false \
--dataset.local_files_only=true&
步骤9.4:下载数据到本地
最终的模型在outputs/train/act_so100,tar打包下,通过ftp或oss等方案,把模型下载到本地,解压到outputs/train/act_so100目录下。
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=stevenbobo/eval_act_so100_test \
--control.tags='["tutorial"]' \
--control.warmup_time_s=5 \
--control.episode_time_s=30 \
--control.reset_time_s=30 \
--control.num_episodes=10 \
--control.push_to_hub=true \
--control.local_files_only=true \
--control.policy.path=outputs/train/act_so100_test/checkpoints/last/pretrained_model
总结
如果没人指导,还是有点麻烦的,好在AI还能帮点忙,不然要退货了。 目前简单抓取动作的成功率还行,看看能不能训个叠衣服的机械臂! 还有做了些好玩的视频,分享在小红书账号上,感兴趣的可以看看。 希望这篇教程对你有所帮助,快去动手试试吧!说不定还能给蚂蚁机器人助个力,哈哈。