克服了不少困难 ,所以记录一下从0开始的全流程,力求让不懂AI的小白,只有有手就能完成,希望对大家有帮助,欢迎留言提问探讨
我买的SO-ARM100机械臂是 seeedstudio 的,机械臂淘宝链接
因为它配了官方教程: 如何从0搭建具身智能Lerobot SO-ARM100和SO-ARM101机械臂并完成自定义抓取任务 ,全套下来一千多
感谢
七月 π0的微调——如何基于各种开源数据集、以及私有数据集微调通用VLA π0(含我司七月的微调实践及在机械臂上的部署)
小圆脸宝宝 LeRobot(Windows)脚本参考大全
小圆脸宝宝 LeRobot ALOHA ACT(Windows) 算法复现 避坑指南
黑狗木 lerobot so_arm_100教程
石臻臻的杂货铺 从零开始,手把手教你搭建Lerobot机械臂
先下展示成果
任务:夹起装有蓝色圆柱体物体的白色塑料碗,把蓝色圆柱体物体倒入肉色塑料碗里
双rgb摄像头,录制了30组数据。视频录制位置如下:

顺序总览
1 软件安装:在windows11和Ubuntu上安装lerobot项目
2 SO-ARM100 机械臂和摄像头安装 :购买必要材料
3 在本地笔记本 windows11 3060 6G 上录制私有数据集,自定义抓取任务
(为什么不在linux上做?因为机械臂在本地,usb链接本地windows后,我无法远程共享USB到租借的linux服务器上。摸索到一些经验,想继续尝试的请看 本地windows使用USB/IP向linux服务器远程共享USB设备(未解决)
4 训练:在本地笔记本 windows11 3060 6G 上基于lerobot,利用aloha act算法在私有数据集上微调; 在linux服务器4090(32G或48G)或A100,Ubuntu22.04 cuda12.4 python3.10上基于lerobot,利用π0算法在私有数据集上微调
5 测试:基于上述训练后得到的checkpoint,在本地测试机械臂能否完成自定义抓取任务
1 在windows11和Ubuntu上安装lerobot项目
什么是lerobot?什么是π0?什么aloha act?
lerobot是:机器人领域的Transformer架构,LeRobot之于机器人就像Transformer架构之于NLP,详情看:LeRobot——Hugging Face打造的机器人开源库:包含对顶层script、与dataset的源码分析(含在简易机械臂SO-ARM100上的部署)
π0和aloha act是:机械臂的算法框架
软硬件环境
cuda只要是12+就行。
linux我用的是:
Ubuntu 22.04 ,cuda 12.4
显卡是NVIDIA A100-SXM4-80GB,用4090(32G或48G)应该也没问题,但要注意显存会不会爆
windows我用的是
windows11(10也可以),cuda 12.6
显卡是3060 6G
训练时长估计
在3060的8G笔记本上训练ACT的50组数据的时间大概为6小时,在4090和A100的电脑上训练50组数据时间大概为2~3小时。
我是录了25组数据,3060 6g大概三小时多一点,A100忘记了,跑到哪算哪。
有相关的讨论,在视频中训练的那一节:LeRobot ALOHA ACT(Windows) 算法复现 避坑指南
1.1 linux ubuntu 22.04 cuda12 上安装lerobot项目+π0(pi0)
显卡不够好的,有租借平台,conda\cuda\cudnn等环境都会配好
我用的是智星云,喜欢用别的也行。
(可以加网速,虽然说是24小时才能调整,但只要保存磁盘后,关闭,然后再重启,开一台新机子,就能把网速降回来。)
1.1.1 安装命令
直接复制就行:(mirrors.aliyun阿里源应该不会挂,试过清华源有的库没有)
git clone https://github.com/ZhuYaoHui1998/lerobot.git ~/lerobot
conda create -y -n lerobot python=3.10
conda activate lerobot
conda install ffmpeg=7.1.1 -c conda-forge
pip install -e ".[pi0]" -i https://mirrors.aliyun.com/pypi/simple
pip install pytest -i https://mirrors.aliyun.com/pypi/simple
pip install -U huggingface_hub -i https://mirrors.aliyun.com/pypi/simple
pip install transformers==4.48.1 -i https://mirrors.aliyun.com/pypi/simple
pip install transformers==4.48.1
用于后面训练时train.py报错:
AttributeError: ‘PaliGemmaForConditionalGeneration’ object has no attribute ‘get_image_features’
https://github.com/huggingface/lerobot/issues/1153
使用 HF-Mirror 和 huggingface-cli 镜像加速下载 pi0 要的 paligemma 模型
记忆中train的时候是要下一个pi0要的paligemma模型,但是下载前要登录一下。
利用HF-Mirror来加速下载。打开网页,拉到最底下有很多下载方法,可以挑自己喜欢的方法。下面介绍其中之一。
paligemma的下载要输入huggingface账号的token(hf_开头的那个),方法看下一小节
你可以选择直接填hf_开头的token来下载:
export HF_ENDPOINT=https://hf-mirror.com
huggingface-cli download --token hf_***(你的token) --resume-download google/paligemma-3b-pt-224 --local-dir-use-symlinks False
也可以墨迹一下,先登录再下载:
输入python,然后输入:
from huggingface_hub import login
login()
这里输入你hf_开头的huggingface的token,成功后,ctrl+z还是ctrl+d退出
如果有红字提示说要执行git config --global credential.helper store,就执行一下
token 登录后,输入:
export HF_ENDPOINT=https://hf-mirror.com
huggingface-cli download --resume-download google/paligemma-3b-pt-224 --local-dir-use-symlinks False
申请 huggingface 下载模型所需要的token
自己先注册下huggingface账号。
注册完后点右上角自己的账号头像:
随便填:
填好后,拉到最底下,点击:
点击copy
如果忘记token也没关系,点击右边三个点,然后点Invalidate and refresh后弹框点确定,就重新出现上图
1.2 windows11 cuda12 上安装lerobot项目+aloha act
笔记本windows11 3060 6G (windows10也行) ,默认已装conda、cuda、cudnn,不会的话参考【保姆级】Windows 安装 CUDA 和 cuDNN
下面用powershell跑,cmd(command prompt)可能也行,cmd中命令报错就换powershell跑试试
直接复制就行:(mirrors.aliyun阿里源应该不会挂。。,试过清华源有的库没有))
git clone https://github.com/ZhuYaoHui1998/lerobot.git ~/lerobot
conda create -y -n lerobot python=3.10
conda activate lerobot
conda install ffmpeg=7.1.1 -c conda-forge
pip install -e ".[act]" -i https://mirrors.aliyun.com/pypi/simple
pip install pytest -i https://mirrors.aliyun.com/pypi/simple
pip install -U huggingface_hub -i https://mirrors.aliyun.com/pypi/simple
(由于aloha act(act) 好像不用下太多东西,所以windows这边不用export HF_ENDPOINT=https://hf-mirror.com 来镜像加速huggingface,要用镜像加速的,看linux的教程)
2 SO-ARM100机械臂、摄像头安装
2.1 材料准备与购买
全套下来,大概一千多:
1 买的机械臂是Lerobot SO-ARM 100,是seeedstudio的,机械臂淘宝链接。推荐选有3D打印物件的100,不选的话还是得自己找别的商家打印,但也要好几天,所以推荐一起买了。(另一个型号叫101,101比较新,感觉100教程可能多一点,所以没买101)
2 买两个摄像头(只用单个也行),广角摄像头(免驱高分辨率即可),我买了2个黑色2K。seeedstudio 教程里头有个奥比中光Orbbec Gemini2深度相机,有点贵,不强求买
3 买两个支架,撑起摄像头,或者拿盒子砌一下
4 螺丝刀,要能拧小号的螺丝
6 电脑接口少的要买usb拓展坞,2个摄像头要2个usb接口,两个机械臂也要2个usb接口
7 力气小的,可能需要锉刀把3D打印的物件锉一锉,比较好安装
8 可能需要双面胶,粘住摄像头
环境布置如下。也有摄像头粘爪子头上的,但由于这样有点妨碍夹东西了,所以弄两个支架
2.2 机械臂安装教程,及各种问题的解决方法
参考的是:
seeedstudio 官方教程: 如何从0搭建具身智能Lerobot SO-ARM100和SO-ARM101机械臂并完成自定义抓取任务 里头的
《手把手复刻HuggingFace开源神作之舵机校准,资料已整理》
一共四集(从后往前数4集)都要看,视频有点快,需要慢速仔细看看
下面列出遇到的各种问题及其解决方法
2.2.1 windows连接舵机驱动板的步骤,及各种问题的解决方法
为什么不在linux上做?因为机械臂在本地,usb链接本地windows后,我无法远程共享USB到租借的linux服务器上。摸索到一些经验,想继续尝试的请看 本地windows使用USB/IP向linux服务器远程共享USB设备(未解决)
对应4:11时长的第一个教程:《手把手复刻HuggingFace开源神作之舵机校准,资料已整理》
注意红黑接线的步骤很重要,后面步骤如果舵机驱动板检测不到,会跟这个接线有关:
1 首先不要接反红黑线,红色正极,黑色负极,板子背面也有写+和-。
2 然后是这个绿色的东西,拧螺丝,让一个小板子降下来,然后把线头塞到上面的口子,然后反方向拧螺丝,让小板子升上去夹住线头。(之前线头塞下面口子了,导致检测不到)
舵机驱动板接好红黑线、三色数据线、typeC电源线、舵机后,注意这里,windows不用执行seeedstudio 教程中的:
python lerobot/scripts/find_motors_bus_port.py
sudo chmod 666 /dev/ttyACM0
sudo chmod 666 /dev/ttyACM1
因为上述不是windows的路径,是linux。执行上面的python lerobot/scripts/configure_motor.py
会看不到端口:
lerobot/scripts/find_motors_bus_port.py
Finding all available ports for the MotorsBus.
Ports before disconnecting: []
解决方法:装个uspid-win,在release那下载usbipd-win_5.1.0_x64.msi,安装完毕后,cmd里头输入uspid list
查看是COM几,会有如下显示:
Connected:
BUSID VID:PID DEVICE STATE
xxxx xxxxx USB-xxxxxxx (COM6) Not shared
比如是COM6,那就ID从1到6,轮两遍,输入命令:
python lerobot/scripts/configure_motor.py --port COM6 --brand feetech --model sts3215 --baudrate 1000000 --ID 1
如果实在检测不到舵机驱动板的USB:
就电脑重启一下;然后红黑线松开,重新接线;或者试试usbipd unbind --busid=4-3(这里4-3填上面的BUSID)
如果uspid list有COM端口,但configure_motor.py后报错
serial.serialutil.SerialException: could not open port ‘COM7’: PermissionError(13, ‘拒绝访问。’, None, 5):
这种是下一小节的舵机固件升级软件FD.exe占用了,选择“打开”,占用了COM端口,点击“关闭”即可找到COM端口
当然,这个步骤可以顺手进行舵机的固件升级,看下一小节:
2.2.2 不要忘了:舵机厂家固件升级
记得升级舵机固件!记得升级舵机固件!记得升级舵机固件!
不一定要装机械臂前弄,装完机械臂后也能升级,因为都串起来了,所以可以一次更新好几个,下图是装到第5个舵机时升级的情况
点击"打开"后,没反应? :第一:看端口号有没有写对,第二:看波特率有没有填对,如果都不行,就是舵机驱动板链接有问题,cmd输入usbipd list
参考上一小节:“windows连接舵机驱动板的步骤,及各种问题的解决方法”
点了"升级固件"好像没升级?:按“升级固件”后,要重新点“搜索”,再点“在线检测”,这个时候就能看到固件版本变成3.10->3.10了,表示升级完成。
由于官方代码和舵机厂家固件升级,2025年6月30日之前的用户请先下载飞特官方上位机(Windows系统下),上电连接所有舵机,选择对应的端口号->波特率1000000->打开->搜索,搜索到所有的舵机后点击升级->在线检测->升级固件,确保固件版本从3.9升级到3.10版本,避免出现后续问题。
2.2.3 白色Follower从臂step9和黑色leader主臂step11视频中可能装反了
第二个机械臂安装视频
leader机械臂组装步骤
Follower机械臂组装步骤
我买的 SO-ARM100 ,装的时候,因为我的零件有个凸起的在下边,爪子的凸起也在下边,会挡着爪子,看官方是凸起在上边,这样爪子转动才合理,不会被卡住。(如果买的零件没有凸起,那就开口向左向右好像没啥关系,因为舵机的舵盘都是在正中间的。)
下图为视频截图,底座两只脚朝自己时,开口向左
下图为我装的,底座两只脚朝自己时,开口向右,圈起的地方是凸起的地方:
2.3 校准机械臂时报错:draccus.utils.DecodingError: robot.cameras: Failed when parsing value=‘’{}‘’ into field “<class ‘lerobot.common.robot_devices.robots.configs.So100RobotConfig’>.cameras” of type dict[str, lerobot.common.robot_devices.cameras.configs.CameraConfig].Underlying error is “AttributeError: ‘str’ object has no attribute ‘items’”
参考issues:https://github.com/huggingface/lerobot/issues/973
这是一个语法错误,在 Windows 中“和’的解释与 Linux 不同。在 Windows 中正确的命令如下:
python lerobot/scripts/control_robot.py --robot.type=so100 --robot.cameras="{}" --control.type=calibrate --control.arms="[\"main_follower\"]"
2.4 添加摄像头opencv.py报错 Camera index out of range
执行python lerobot/common/robot_devices/cameras/opencv.py --images-dir ./outputs/images_from_opencv_cameras
后显示:
Mac or Windows detected. Finding available camera indices through scanning all indices from 0 to 20
Camera found at index 0
Camera found at index 1
Camera found at index 2
[ERROR:0@3.132] global obsensor_uvc_stream_channel.cpp:158 cv::obsensor::getStreamChannelGroup Camera index out of range
[ERROR:0@3.244] global obsensor_uvc_stream_channel.cpp:158 cv::obsensor::getStreamChannelGroup Camera index out of range
[ERROR:0@3.351] global obsensor_uvc_stream_channel.cpp:158 cv::obsensor::getStreamChannelGroup Camera index out of range
[ERROR:0@3.464] global obsensor_uvc_stream_channel.cpp:158 cv::obsensor::getStreamChannelGroup Camera index out of range
[ERROR:0@3.571] global obsensor_uvc_stream_channel.cpp:158 cv::obsensor::getStreamChannelGroup Camera index out of range
[ERROR:0@3.683] global obsensor_uvc_stream_channel.cpp:158 cv::obsensor::getStreamChannelGroup Camera index out of range
修改opencv.py,有几个摄像头就填几,我有2个就填2
MAX_OPENCV_INDEX = 2
3 录制私有数据集数据集
前面第一、二章,机械臂、摄像头、lerobot等等这些都安装好了后,开始录制自己的私有数据集和定义自己喜欢的任务。
强烈建议强烈建议强烈建议:
先耐心看一遍数据集录制要注意的地方:LeRobot ALOHA ACT(Windows) 算法复现 避坑指南,以免数据集录的质量不好,费时费力训练了半天,最后发现效果不好,又得重新录制
录数据集的重点:如何提高成功率:
1 记得光线要尽量保持一致:比如晚上录视频的时候没有太阳光,而在白天有太阳光的情况下进行测试,则成功率下降很多
2 摄像头不要动:录好数据集后,测试的时候摄像头不要动了
3 录像的时候不要拍到多余的东西:比如leader主臂、人、手臂、衣服等任务无关的物品(因为算法还不够鲁棒,容易被干扰),测试的时候物体尽量保持和数据集一样(比如不要新增点花纹,或者换个颜色啥的)
4 录的时候,点位录多几个:宁愿“多个点位只录一次”,也不要“一个点位录多次,但录很少点位”。
3.1 写在前头:录制流程
输入3.2的录制命令后,任务栏会有这个图标,记得要点开,这就是两个摄像机的程序。
点开摄像头软件后(注:不需要点回pycharm的命令行。这个软件也不像linux一样有一个标题栏,但也能用)
- 直接点键盘右键→,表示录制下一个数据(episodes);
- 如果录得不好,点左键←,表示重新录这个数据
- 每次启动录制,它还会有个中文播报的,就是女声最后几个词会说录制到第几个数据
录完后,发现数据集某个数据录错了/录得不好怎么办?
没找到方法,我是重新录的。
我第一个数据录错了,后面删了第一个数据,然后改了配置文件也不行。不知道有没有方法。所以还是要认真录。
3.2 录制命令
注意我是在windows上录制的,命令如下:
python lerobot/scripts/control_robot.py --robot.type=so100 --control.type=record --control.fps=30 --control.single_task="Pour the blue cylindrical object from the white plastic bowl into the beige plastic bowl." --control.repo_id="E:\\xxx\\lerobot-main\\my_dataset\\pour1" --control.tags="[\"so100","tutorial\"]" --control.warmup_time_s=5 --control.episode_time_s=60 --control.reset_time_s=5 --control.num_episodes=30 --control.display_cameras=true --control.push_to_hub=false
记得repo_id里替换你自己的lerobot-main路径
这里control.single_task
写的是任务的描述(提示词),我的任务是:夹起装有蓝色圆柱体物体的白色塑料碗,把蓝色圆柱体物体倒入肉色塑料碗里,想不出来做什么任务,可以参考下(记得实物颜色要一致)
录完或录制断开,想继续录制,命令如下:
python lerobot/scripts/control_robot.py --robot.type=so100 --control.type=record --control.fps=30 --control.single_task="Pour the blue cylindrical object from the white plastic bowl into the beige plastic bowl." --control.repo_id="E:\\xxx\\lerobot-main\\my_dataset\\pour1" --control.tags="[\"so100","tutorial\"]" --control.warmup_time_s=5 --control.episode_time_s=60 --control.reset_time_s=5 --control.num_episodes=30 --control.display_cameras=true --control.push_to_hub=false --control.resume=true
也就是最后加一句--control.resume=true
没有数据集或数据集路径填不对的情况下,会报错:
huggingface_hub.errors.HFValidationError:
Repo id must use alphanumeric chars or '-', '_', '.', '--' and '..' are forbidden, '-' and '.' cannot start or end the name, max length is 96
3.3 参数说明
control.warmup_time_s
: 指初始化时间。
control.episode_time_s
: 表示每次收集数据的时间。建议填很长时间,来给自己调整摄像机,调整完毕后,按左键←重录就行。后续录完就按右键,保存并开始下一个数据录制就行
control.reset_time_s
: 是每次数据收集之间的准备时间。
control.num_episodes
: 表示预期收集多少组数据。
control.display_cameras
:记得设true,能打开摄像头看到拍摄情况
control.push_to_hub
: 决定是否将数据上传到 HuggingFace Hub,填false
没有数据集时:不要加--control.resume=true
,不然报错:huggingface_hub.errors.HFValidationError: Repo id must use alphanumeric chars or ‘-’, ‘_’, ‘.’, ‘–’ and ‘…’ are forbidden, ‘-’ and ‘.’ cannot start or end the name, max length is …
不上传数据集到huggingface的关键 1:
control.repo_id
写的是你自己lerobot-main路径,记得要写完整路径,不然huggingface会自动去找/root/.cache/huggingface/
这个路径
control.tags="[\"so100","tutorial\"]"
这里,要记得加\
,因为是windows
想上传的,填 --control.repo_id=${HF_USER}/so100_test
3.4 重播一个回合(非必须)
重播一个回合就是重放一遍你的follower从臂的动作,用来看看你的数据集录得咋样。
发现某个数据录得不好的话,我没找到方法,我是重新录的。
python lerobot/scripts/control_robot.py --robot.type=so100 --control.type=replay --control.fps=30 --control.repo_id="E:\\xxx\\lerobot-main\\my_dataset\\pour1" --control.episode=0
记得repo_id里替换你自己的lerobot-main路径,
control.episode改成你想看的某个数据的编号
3.5 可视化数据集(非必须)
好像是报错了?然后没理
python lerobot/scripts/visualize_dataset_html.py --repo-id="E:\\xxx\\lerobot-main\\my_dataset\\pour1" --control.resume=true
4 训练
4.1 不上传数据集到huggingface的关键 2
-
windows里,powershell输入
$env:HF_HUB_OFFLINE = "1"
,linux里,命令行输入export HF_HUB_OFFLINE=1
解决requests.exceptions.ConnectTimeout: (MaxRetryError(“HTTPSConnectionPool(host=‘huggingface.co’, port=443): Max retries exceeded with url: /api/models/google/paligemma-3b-pt-224/tree/main/additional_chat_templates?recursive=False&expand=False (Caused by ConnectTimeoutError(<urllib3.connection.HTTPSConnection object at 0x0000023B59F5E4A0>, ‘Connection to huggingface.co timed out. (connect timeout=None)’))”), ‘(Request ID: 32a501ae-3320-46cb-af78-f4952f7d9c4d)’)的问题
-
修改
lerobot_dataset.py
读取数据集的代码:
498行注释了:assert all((self.root / fpath).is_file() for fpath in self.get_episodes_file_paths())
-
local_files_only都改成true了,超参数里没有,但全局搜索,把能改的都改了
这样就能成功读取本地数据集了
4.2 windows训练命令(用aloha act)
记得powershell里先输入$env:HF_HUB_OFFLINE = "1"
然后:
python lerobot/scripts/train.py --dataset.repo_id="E:\\xxx\\lerobot-main\\my_dataset\\pour1" --policy.type=act --output_dir=./outputs/train/act_so100_test --job_name=act_so100_test --policy.device=cuda --wandb.enable=false
记得repo_id里替换你自己的lerobot-main路径
wandb.enable
用来记录训练实验数据,非必须,自己看看log打印的loss也大概知道loss曲线啥样。这里不知道为啥连不上,就设false了。设true的话,还得注册一下账号。
超参数参考
为了不OOM(out of memory),要调一下超参数,关键是在batch_size上
windows 3060 6G 参考参数:
修改文件lerobot-main\lerobot\configs\train.py的TrainPipelineConfig:
num_workers: int = 4 # Number of workers for the dataloader
batch_size: int = 8 # 批大小
steps: int = 40_000 # 训练的步数
eval_freq: int = 5_000 # 每x步验证一次
log_freq: int = 200 # 日志每x步输出一次
save_checkpoint: bool = True # 一定要保存checkpoint
save_freq: int = 5_000 # 每x步保存一次checkpoint
断点续训
训练一遍过,没试过,不过参考linux命令的断点续训就行
4.3 linux训练命令(用pi0)
记得命令行先输入export HF_HUB_OFFLINE=1
python lerobot/scripts/train.py
--dataset.repo_id=/root/lerobot/my_dataset/pour1
--policy.type=pi0
--output_dir=./outputs/train/pi0_so100_test
--job_name=pi0_so100_test
--policy.device=cuda
--wandb.enable=false
记得dataset.repo_id
要写完整路径,不然会报错:
FileNotFoundError: [Errno 2] No such file or directory: ‘/root/.cache/huggingface/lerobot/my_dataset/pour1_2/meta/info.json’
huggingface_hub.errors.HFValidationError: Repo id must be in the form ‘repo_name’ or ‘namespace/repo_name’: ‘./my_dataset/pour1_2’. Userepo_type
argument if needed.
因为它找去了/root/.cache/huggingface/lerobot的my_dataset/pour1_2,要定位回github项目的路径 (/root/lerobot/)
超参数参考
为了不OOM(out of memory),要调一下超参数,关键是在batch_size上
NVIDIA A100-SXM4-80GB*1 参考参数:
修改文件lerobot-main\lerobot\configs\train.py的TrainPipelineConfig:
num_workers: int = 8
batch_size: int = 16
steps: int = 50000
eval_freq: int = 1000
log_freq: int = 500
save_checkpoint: bool = True
save_freq: int = 1000
练到16K个step的loss大概是0.012
step:16K smpl:264K ep:1K epch:51.35 loss:0.012 grdn:1.122 lr:1.2e-05 updt_s:0.884 data_s:0.014
checkpoints存放路径是~/lerobot/outputs/train/pi0_so100_test/checkpoints
租的服务器磁盘空间有点不够,所以需要定时删除(注意不要删多了,rm -rf没有回头路:(
断点续训
要加上config_path
和resume
python lerobot/scripts/train.py
--dataset.repo_id=/root/lerobot/my_dataset/pour1
--policy.type=pi0
--output_dir=/root/lerobot/outputs/train/pi0_so100_test
--job_name=pi0_so100_test
--policy.device=cuda
--wandb.enable=false
--config_path=/root/lerobot/outputs/train/pi0_so100_test/checkpoints/last/pretrained_model/train_config.json
--resume=true
保存ckpt的时候:ts/train.py:241 Checkpoint policy after step 150,会莫名遇到killed,把batch_size降低就行,估计是OOM了?
4.4 发现还没有pi0fast,只有 ‘act’, ‘diffusion’, ‘pi0’, ‘tdmpc’, 'vqbet’这些模型可选
上述的 --policy.type=pi0fast ,会报:
pi0fast : train.py: error: argument --policy.type: invalid choice: ‘pi0fast’ (choose from ‘act’, ‘diffusion’, ‘pi0’, ‘tdmpc’, ‘vqbet’)
5 评估
机械臂在本地连着windows,那linux服务器训练好的checkpoint下载到本地就行
按照5.1 本地评估遇到的各种报错修改好代码后:执行:
python lerobot/scripts/control_robot.py --robot.type=so100 --control.type="record" --control.fps=30 --control.single_task="Pour the blue cylindrical object from the white plastic bowl into the beige plastic bowl." --control.repo_id="E:\\xxx\\lerobot-main\\outputs\\eval\\pour1_eval1" --control.tags ="tutorial" --control.warmup_time_s=5 --control.episode_time_s=60 --control.reset_time_s=30 --control.num_episodes=10 --control.push_to_hub=false --control.policy.path=./outputs/train/act_so100_test/checkpoints/last/pretrained_model
记得repo_id里替换你自己的lerobot-main路径
记得policy.path里替换你自己的checkpoints路径
5.1 本地评估遇到的各种报错
5.1.1 报错 list[str]: The given value=‘[\tutorial]’ is not of a valid input for a list type这种
输入命令:
python lerobot/scripts/control_robot.py --robot.type=so100 --control.type="record" --control.fps=30 --control.single_task="Pour the blue cylindrical object from the white plastic bowl into the beige plastic bowl." --control.repo_id="E:\\xxx\\lerobot-main\\my_dataset\\pour1" --control.tags="[\"tutorial\"]" --control.warmup_time_s=5 --control.episode_time_s=60 --control.reset_time_s=30 --control.num_episodes=10 --control.push_to_hub=false --control.policy.path=./outputs/train/act_so100_test/checkpoints/last/pretrained_model
报错:list[str]: The given value=‘[\tutorial]’ is not of a valid input for a list type这种,修改你自己的Anaconda3的decoding.py,我的路径是: E:\Anaconda3\envs\lerobot\Lib\site-packages\draccus\parsers\decoding.py:
def _decode_list(raw_value: List[Any], path: Sequence[str]) -> List[T]:
path = tuple(path)
# assert type(val) == list
if not isinstance(raw_value, list):
# print(raw_value,type(raw_value))
if isinstance(raw_value,str):
raw_value = [raw_value]
print(raw_value, type(raw_value))
else: raise Exception(f"The given value='{raw_value}' is not of a valid input for a list type")
return [decode_item(v, (*path, str(i))) for i, v in enumerate(raw_value)]
原理是:传一个[“raw_value”]进去。代码中windows总把list读成str,就特判一下。
5.1.2 报错 draccus.utils.ParsingError: Expected a dict with a ‘type’ key for <class ‘lerobot.configs.policies.PreTrainedConfig’>
报错:
draccus.utils.ParsingError: Expected a dict with a 'type' key for <class 'lerobot.configs.policies.PreTrainedConfig'>, got {'n_obs_steps': 1, 'normalization_mapping': {'VISUAL
': 'MEAN_STD', 'STATE': 'MEAN_STD', 'ACTION': 'MEAN_STD'}, 'input_features': {'observation.state': {'type': 'STATE', 'shape': [6]}, 'observation.images.desk': {'type': 'VISUAL
', 'shape': [3, 480, 640]}, 'observation.images.head': {'type': 'VISUAL', 'shape': [3, 480, 640]}}, 'output_features': {'action': {'type': 'ACTION', 'shape': [6]}}, 'device':
'cuda', 'use_amp': False, 'chunk_size': 100, 'n_action_steps': 100, 'vision_backbone': 'resnet18', 'pretrained_backbone_weights': 'ResNet18_Weights.IMAGENET1K_V1', 'replace_fi
nal_stride_with_dilation': False, 'pre_norm': False, 'dim_model': 512, 'n_heads': 8, 'dim_feedforward': 3200, 'feedforward_activation': 'relu', 'n_encoder_layers': 4, 'n_decod
er_layers': 1, 'use_vae': True, 'latent_dim': 32, 'n_vae_encoder_layers': 4, 'temporal_ensemble_coeff': None, 'dropout': 0.1, 'kl_weight': 10.0, 'optimizer_lr': 1e-05, 'optimizer_weight_decay': 0.0001, 'optimizer_lr_backbone': 1e-05}
参考 https://github.com/huggingface/lerobot/issues/674
解决方法:在last checkpoint的config.json里头(路径为:E:\xxxx\lerobot-main\outputs\train\act_so100_test\checkpoints\xxxxx\pretrained_model\config.json)
的最开头加入: "type": "act"
,即:
"type": "act",
"n_obs_steps": 1,
"normalization_mapping": {
"VISUAL": "MEAN_STD",
"STATE": "MEAN_STD",
"ACTION": "MEAN_STD"
},
5.1.3 报错 ValueError: Your dataset name does not begin with ‘eval_’ (E:\\xxx\\lerobot-main\\my_dataset\\pour1), but a policy is provided (act).
解决方法:把超参数control.repo_id中的E:\\xxx\\lerobot-main\\my_dataset\\pour1 改成 E:\\xxx\\lerobot-main\\outputs\\eval\\pour1_eval1
意思是要找一个地方放评估的结果
6 评估效果展示
任务:夹起装有蓝色圆柱体物体的白色塑料碗,把蓝色圆柱体物体倒入肉色塑料碗里
成功案例:正常执行任务
成功案例:白碗没有蓝色物体,则不夹起白碗,直到白碗里头有蓝色物体:
失败案例:两个碗放太近,突然不会夹了。最后手动把白色碗挪远一点,就能夹起来(最后夹爪张开时,感觉它有种恍然大悟的感觉):
猜测原因:没录这个数据集,模型不够鲁棒
失败案例:肉色碗和白色碗互换后,倒反天罡,夹了肉色碗倒入白色碗
猜测原因:没录这个数据集,模型不够鲁棒