当前位置: 首页 > news >正文

基于Huggingface的lerobot项目在so-arm100机械臂上的复现笔记

tip:将项目复现分为如下的步骤

 笔者自己复现之后的效果(点击链接即可https://www.bilibili.com/video/BV1vkQzYuEVc/?spm_id_from=333.1387.homepage.video_card.click

一.单臂复现

1.部件的采购

所需零件以及价目表 链接:https://github.com/TheRobotStudio/SO-ARM100

2.环境的配置

1)根据官方提供的readme.md进行安装

git clone https://github.com/huggingface/lerobot.git
conda create -y -n lerobot python=3.10
pip install -e .
conda install -y -c conda-forge ffmpeg
pip uninstall -y opencv-python
conda install -y -c conda-forge "opencv>=4.10.0"

2)但是环境的安装会遇到如下问题

ImportError: /home/username/anaconda3/envs/lerobot/lib/python3.10/site-packages/cv2/python-3.10/../../../.././libtiff.so.6: 
undefined symbol: jpeg12_write_raw_data, version LIBJPEG_8.0

3)解决方案

conda install -c conda-forge jpeg libtiff

 但执行后可能会引发新的问题

ImportError: /lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.29' not found 
(required by /home/username/anaconda3/envs/lerobot/lib/python3.10/site-packages/cv2.cpython-310-x86_64-linux-gnu.so)

尝试再次进行解决: 

检查系统中的 libstdc++ 版本

strings /lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX

 检查 Conda 环境中的 libstdc++ 版本

strings $CONDA_PREFIX/lib/libstdc++.so.6 | grep GLIBCXX

优先加载 Conda 环境中的 libstdc++

运行以下命令,将 Conda 环境的库路径添加到 LD_LIBRARY_PATH 变量,使其优先被系统加载(之后我是写到了bashrc文件里:

export LD_LIBRARY_PATH=$CONDA_PREFIX/lib:$LD_LIBRARY_PATH

4)问题总结

在 Conda 环境中安装 OpenCV 时,由于 libtiff 依赖的 jpeg12_write_raw_data 符号找不到(LIBJPEG 版本问题),以及 cv2 由于 libstdc++.so.6 版本不兼容(缺少 GLIBCXX_3.4.29)导致的 ImportError 问题。确保 Conda 环境中的 libstdc++ 版本正确,并使 Conda 的库路径优先于系统库路径,以避免 GLIBCXX_3.4.29 版本缺失问题。

3.配置舵机控制板以及舵机

串口查询以及串口的权限赋予

python lerobot/scripts/find_motors_bus_port.py
sudo chmod 666 /dev/ttyACM*

舵机编号

python lerobot/scripts/configure_motor.py \
  --port /dev/ttyACM... \
  --brand feetech \
  --model sts3215 \
  --baudrate 1000000 \
  --ID 1

 此图为改配置文件

4.机械臂的安装与校准

1)安装

 2)主从臂的校准

python lerobot/scripts/control_robot.py \
  --robot.type=so100 \
  --robot.cameras='{}' \
  --control.type=calibrate \
  --control.arms='["main_follower"]'

5.遥操作

1)不打开摄像头的遥操作

python lerobot/scripts/control_robot.py \
  --robot.type=so100 \
  --robot.cameras='{}' \
  --control.type=teleoperate

 2)打开摄像头的遥操作

python lerobot/scripts/control_robot.py \
  --robot.type=so100 \
  --control.type=teleoperate

这里打开摄像头的这一步我是遇到了些问题

官方提供的代码中只是用opencv对摄像头的index索引值进行调用

我在实验的过程中先是用了奥比中光相机来进行数据的录制

但是这个非常不好用,在终端单独打开是没有什么问题的,带到代码中运行时会出现不少奇奇怪怪的问题

因为如果我遥操作的时候无法记录下数据就没办法继续后续的任务

之后我就索性换了实验室的两个realsense相机D435i以及D455 

 

 在进行configs文件修改以及一系列代码的修改之后也最终能够正常在遥操作的时候摄像头实时捕捉场景动作

6.记录数据集

 这边进行数据集录制时有点坑,因为这个数据集的制作需要你在huggingface上建仓库以及数据集的上传,才能正常录制,由于huggingface是在外网所以对本地的网络以及代理vpn的要求也比较高,所以也是要对代码进行修改进行离线录制才行

 官方指令

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=${HF_USER}/so100_test \
  --control.tags='["so100","tutorial"]' \
  --control.warmup_time_s=5 \
  --control.episode_time_s=30 \
  --control.reset_time_s=30 \
  --control.num_episodes=2 \
  --control.push_to_hub=true

 修改后

python lerobot/scripts/control_robot.py \
     --robot.type=so100 \
     --control.type=record \
     --control.fps=30 \
     --control.root=/home/kk/lerobot/outputs/38 \
     --control.num_episodes=30 \
     --control.warmup_time_s=5 \
     --control.episode_time_s=30 \
     --control.reset_time_s=10 \
     --control.repo_id=namespace/my_dataset \
     --control.single_task=False

但到这里还没有结束每一组数据录制完之后视频的保存就遇到了问题

报错:[vost#0:0 @ 0x3448bb00] Unknown encoder 'libx264' [vost#0:0 @ 0x3448bb00] Error selecting an encoder Error opening output file /home/kk/.cache/huggingface/lerobot/Jwjyt/eval_act_so100_test/videos/chunk-000/observation.images.D435i/episode_000000.mp4. Error opening output files: Encoder not found Traceback (most recent call last):

 解决方法

# 安装libx264,但仍然遇到问题,配置环境使得ffmpeg正确链接到libx264编解码器
export PATH=/usr/bin:$PATH

 之后就可以正常连续的录制自定义组数的数据了

7.训练

由于前文提到的数据集的制作需要在huggingface上建仓库以及数据集的上传,所以训练的时候也需要你本地终端链接到你的huggingface仓库,由于网络的限制,所以需要去修改代码进行本地的训练

我搜寻了很多的不同的方法,也可能是怪我的代码能力差,但是这个问题还是没有解决,这个项目的更新很频繁,我现在在用的lerobot的库已经是V2.1的版本所以估计也修复了些断网离线训练的问题,之后这个事情也很困扰

后来我就想到了去用ailab的算力

 之后我特地去把我的数据进行上传了

 

 

 快速的对一些环境配置的问题进行搭建修正之后,我又遇到了一个很奇怪的问题,我发现从云仓库download下来的数据集不知道为什么不能进行训练,我就很疑惑,因为录制的数据集应该都是对的,于是我又和其他的同样上传到huggingface仓库的数据集进行比对,但是发现还是一模一样的格式,然后我思考了很久,我突然想到了我当时录制文件的路径以及我上传的文件

 

 

 解决完这个问题之后也成功训练

8.策略评估

按道理来说训练完之后执行已经训练完的模型不需要花时间了,直接执行命令行就应该能实现了,但是还没结束

官方

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=${HF_USER}/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.policy.path=outputs/train/act_so100_test/checkpoints/last/pretrained_model

 先是push_to_hub=false之后还是没办法执行

 

后来也是想了很多不知道为什么不能用

慢慢调整命令行之后开始出现模型文件中config.json的报错

需要删除这两行

 修改后的命令行

python lerobot/scripts/control_robot.py   
--robot.type=so100   
--control.type=record   
--control.fps=30   
--control.single_task="Grasp an orange."   
--control.repo_id=Jwjyt/eval_act_so100_test   
--control.tags='["tutorial"]'   
--control.warmup_time_s=5   
--control.episode_time_s=60   
--control.reset_time_s=30   
--control.num_episodes=30   
--control.push_to_hub=false   
--control.policy.path=/home/kk/outputs/train/test/checkpoint/last/pretrained_model 
--control.device=cuda

之后也是成功了

这边有笔者自己运行成功后的视频:https://www.bilibili.com/video/BV1vkQzYuEVc/?spm_id_from=333.1387.homepage.video_card.click

http://www.dtcms.com/a/99463.html

相关文章:

  • 创建SpringBoot项目报错
  • Java创建对象有几种方式?
  • 吴恩达深度学习复盘(1)神经网络与深度学习的发展
  • 什么是UI自动化测试?什么项目适合做UI自动化测试?
  • 编程考古-Borland JBuilder:一场关于Java灵魂的战争与救赎
  • Android 设计模式之适配器模式
  • 智能路由系统-信息泄露漏洞挖掘
  • 简单使用LlamaIndex实现RAG
  • (四)GTM_TOM模块定时器中断应用
  • 基于Python深度学习的鲨鱼识别分类系统
  • 垃圾回收机制的几种实现机制简介
  • 【差分】详解一维前缀和和差分问题
  • Java高级JVM知识点记录,内存结构,垃圾回收,类文件结构,类加载器
  • 无人机进行航空数据收集对于分析道路状况非常有用-使用无人机勘测高速公路而不阻碍交通-
  • BurpSuit抓包失败-基础配置
  • 用war解压缩.7zip文件解压缩正在进行但是结束后文件消失了
  • 计算机二级考前急救(Word篇)
  • python:将mp4视频快进播放,并保存新的视频
  • OpenHarmony子系统开发 - 安全(二)
  • Redisson分布式锁深度解析:原理与实现机制
  • STM32F4单片机SDIO驱动SD卡
  • NLP语言模型训练里的特殊向量
  • Spring Boot整合Kafka详细指南(JDK 1.8)
  • Flutter环境搭建
  • JDK1.8和Maven、Git安装教程自用成功
  • 【MySQL基础】函数之字符串函数详解
  • JVM Java类加载 isInstance instanceof 的区别
  • 洛谷题单1-P5703 【深基2.例5】苹果采购-python-流程图重构
  • JDBC的详细使用
  • 【零基础入门unity游戏开发——2D篇】2D物理关节 —— Joint2D相关组件