1. 从github中克隆lerobot项目
# 版本为0.1.0
git clone https://github.com/huggingface/lerobot.git
2. 环境配置
cd lerobot
conda create -y -n lerobot python=3.10
conda activate lerobot
pip install -e .
pip install -e ".[aloha, pusht]"
pip install -e ".[dynamixel]"
conda install -c conda-forge ffmpeg
如果pip install -e . 报错pyav安装不上,属于版本不兼容问题。直接执行下面的命令
pip install lerobot==0.1.0
3. 机器人硬件设备及组装
硬件:
- WOWROBO机械臂套件(主动臂和从动臂)
- 两个摄像头
- 一个拍摄支架
组装过程略过(详细请看自身产品的组装说明书)
4.机器人初步部署及测试
安装好机械臂套件并搭建好lerobot环境后,需要统一USB端口,此步骤的目的在于后续不会再重复调整设备的端口号,一次性绑定后,下次断开重连时,系统自动将设备挂载到预设的端口上面,省去后续修改的麻烦。
首先查看USB设备
# 这里已经知道机械臂的前缀信息,如果新设备不知道任何信息,只需要在断开和插上后分别查看/dev目录对比新增的设备端口号即可。
ls /dev/ttyACM*
如上图所示,
ttyACM0
和ttyACM1
分别是主臂和从臂的设备端口 (通过拔插实验得到设备及对应端口号),现在需要将这两个接口进行统一固定,具体思路是
leader_port = "/dev/ttyACM10" # 主臂端口
follower_port = "/dev/ttyACM11" # 从臂端口
使用 udev 规则绑定自定义端口号:Linux 的 udev 系统允许我们根据设备的属性(例如 idVendor、idProduct、serial 等)创建符号链接,并将设备映射到我们希望的端口号(例如 /dev/ttyACM10 和 /dev/ttyACM11)。
步骤:
查找设备信息:
插上主臂和从臂设备后,运行以下命令分别获取主臂、从臂的设备信息:
udevadm info -a -n /dev/ttyACM0 | grep idVendor # 替换实际插上设备后 主、从臂的 /dev/ttyACM0 端口号,可以加上管道筛选
udevadm info -a -n /dev/ttyACM0 | grep idProduct # 可以加上管道筛选
udevadm info -a -n /dev/ttyACM0 | grep serial # 建议使用管道筛选,不用再去里面寻找
从输出信息中,提取关键设备属性(获取第一个数据):
1. 主臂设备信息:
ATTRS{idVendor}=="1a86"
ATTRS{idProduct}=="55d3"
ATTRS{serial}=="5970073336"
2. 从臂设备信息:略过(步骤同上所示)
创建udev规则文件
sudo vim /etc/udev/rules.d/99-usb-serial.rules
创建一个规则文件,并添加以下内容:
# 主臂设备绑定到 ttyACM10
SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="55d3", ATTRS{serial}=="5970073336", SYMLINK+="ttyACM10"
# 从臂绑定到 ttyACM11
SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="55d3", ATTRS{serial}=="58FA101430", SYMLINK+="ttyACM11"
SUBSYSTEM=="tty"
:规则仅适用于串口设备。
ATTRS{idVendor}
和 ATTRS{idProduct}
:匹配设备的供应商和产品 ID。
ATTRS{serial}
:区分同型号设备。
SYMLINK+="ttyACM10"
:创建符号链接 /dev/ttyACM10
指向主臂设备。
最后,将主臂设备设置为 /dev/ttyACM10
,从臂设备设置为 /dev/ttyACM11
重启udev服务
保存文件后,运行以下命令使规则生效:
sudo udevadm control --reload-rules
sudo udevadm trigger
验证结果
插入设备后,应该能够通过 /dev/ttyACM10
和 /dev/ttyACM11
访问设备。
ls -l /dev/ttyACM10 /dev/ttyACM11
如果配置成功,应该可以看到 /dev/ttyACM10
和 /dev/ttyACM11
映射到相应的设备。
自动给端口开权限
sudo vim ~/.bashrc
添加以下内容,并保存
sudo chmod 777 /dev/ttyACM10 # leader
sudo chmod 777 /dev/ttyACM11 # follower
列出并配置电机
将上面的端口修改到下面的代码中,并在交互式式终端中执行代码:
cd lerobot/
python
from lerobot.common.robot_devices.motors.dynamixel import DynamixelMotorsBus
leader_port = "/dev/ttyACM10"
follower_port = "/dev/ttyACM11"
leader_arm = DynamixelMotorsBus(
port=leader_port,
motors={
# name: (index, model)
"shoulder_pan": (1, "xl330-m077"),
"shoulder_lift": (2, "xl330-m077"),
"elbow_flex": (3, "xl330-m077"),
"wrist_flex": (4, "xl330-m077"),
"wrist_roll": (5, "xl330-m077"),
"gripper": (6, "xl330-m077"),
},
)
follower_arm = DynamixelMotorsBus(
port=follower_port,
motors={
# name: (index, model)
"shoulder_pan": (1, "xl430-w250"),
"shoulder_lift": (2, "xl430-w250"),
"elbow_flex": (3, "xl330-m288"),
"wrist_flex": (4, "xl330-m288"),
"wrist_roll": (5, "xl330-m288"),
"gripper": (6, "xl330-m288"),
},
)
leader_arm.connect()
follower_arm.connect()
leader_pos = leader_arm.read("Present_Position")
print(leader_pos)
follower_pos = follower_arm.read("Present_Position")
print(follower_pos)
预期输出:
array([2253, 523, 371, 281, 5549, 2451], dtype=int32)
array([2203, 601, 156, 2153, 2011, 2453], dtype=int32)