前言
rl_sar是fan-ziqi大佬开源的四足/人形机器人强化学习算法仿真验证与实物部署框架。开源地址:https://github.com/fan-ziqi/rl_sar
由于Go2 EDU机载上层主控板为arm架构的Jetson所以无法直接在机载主控板使用,因此在Go2实机部署时需要连接一根网线使用。本教程首先会先搬运一下rl_sar ROS-noetic版本的安装和使用说明并且给出可能出现的报错解决办法,最后给出机载部署的方法(实测rl_sar v2.1 ROS-noetic
版本可行,其他版本可参考)。
目录(只需要机载免网线部署方法的可以直接跳转):
一、安装配置说明(v2.1 ROS-noetic)
后续新版的安装配置说明请参考官方开源地址,这里只提供v2.1 ROS-noetic相关内容。
1.1 拉取代码
git clone https://github.com/fan-ziqi/rl_sar.git
cd rl_sar
git tag # 查看已有的release版本
git checkout v2.1 # 切换到v2.1版本
或者直接去GitHub release里下载对应.zip
1.2 安装依赖
→ROS依赖包
sudo apt install ros-noetic-teleop-twist-keyboard ros-noetic-controller-interface ros-noetic-gazebo-ros-control ros-noetic-joint-state-controller ros-noetic-effort-controllers ros-noetic-joint-trajectory-controller ros-noetic-joy
→安装libtorch、yaml-cpp、lcm
① 安装libtorch
在任意位置(以/home/ubuntu/Tools文件夹为例)下载并部署libtorch
cd /home/ubuntu/Tools
wget https://download.pytorch.org/libtorch/cpu/libtorch-cxx11-abi-shared-with-deps-2.0.1%2Bcpu.zip
unzip libtorch-cxx11-abi-shared-with-deps-2.0.1+cpu.zip -d ./
echo 'export Torch_DIR=/home/ubuntu/Tools/libtorch' >> ~/.bashrc
source ~/.bashrc
如果是在docker中使用ros,把这个环境变量添加在docker的.bashrc中,而不是宿主机的.bashrc
② 安装yaml-cpp
git clone https://github.com/jbeder/yaml-cpp.git
cd yaml-cpp && mkdir build && cd build
cmake -DYAML_BUILD_SHARED_LIBS=on .. && make
sudo make install
sudo ldconfig
③ 安装lcm
git clone https://github.com/lcm-proj/lcm.git
cd lcm && mkdir build && cd build
cmake .. && make
sudo make install
sudo ldconfig
【可能的报错】:安装lcm时,cmake … && make命令出现报错:
ror: Python.h: No such file or directory #include <Python.h>
这个错误信息表明在编译 lcm-python 模块时,编译器找不到 Python.h 头文件。
解决方法:
Step1: 通过pkg-config --cflags python3
定位python目录
输出:-I/usr/include/python3.8 -I/usr/include/x86_64-linux-gnu/python3.8
说明Python.h 存在于该路径下: /usr/include/python3.8
或者 /usr/include/x86_64-linux-gnu/python3.8/
Step2: 修改lcm的 CMakeLists.txt,添加:
include_directories(BEFORE
/usr/include/python3.8
/usr/include/x86_64-linux-gnu/python3.8
)
【注意】:
libtorch可以下载到任意位置(Tools文件夹只是举个例子),文件解压后添加环境变量即可使用,无需安装。并且配置后相当于整个系统已经加载了libtorch,而不是只针对这个代码包,以后有其他需要无需再次配置。同样yaml-cpp、lcm也可以存放到任意位置,并且也是安装到了整个系统环境中,后续使用无需再次安装。因此yaml-cpp、lcm也可以使用包管理器进行安装:
sudo apt install liblcm-dev libyaml-cpp-dev
1.3 编译
进入工作空间根目录:
catkin build
如果 catkin build 报错: Unable to find either executable 'empy' or Python module 'em'
, 在catkin build
之前执行 catkin config -DPYTHON_EXECUTABLE=/usr/bin/python3
1.4 运行
1. 仿真
打开一个终端,启动gazebo仿真环境
source devel/setup.bash
roslaunch rl_sar gazebo_<ROBOT>_<PLATFORM>.launch
(以go2为例:roslaunch rl_sar gazebo_go2_isaacgym.launch)
打开一个新终端,启动控制程序
source devel/setup.bash
(for cpp version) rosrun rl_sar rl_sim
(for python version) rosrun rl_sar rl_sim.py
键盘控制:
按 切换仿真器运行/停止。
W/S 控制水平移动,A/D 控制转向,J/L 控制横向移动,按 将所有控制指令设置为零。
如果机器人摔倒,按 R 重置Gazebo环境。
按 0 让机器人从仿真开始的姿态运动到init_pos,按 1 让机器人从init_pos运动到仿真开始的姿态。
手柄控制:
按 LB 切换仿真器运行/停止。
LY 控制前后移动,LX 控制横向移动,RX 控制转向。
如果机器人摔倒,按 RB+X 重置Gazebo环境。
按 RB+Y 让机器人从仿真开始的姿态运动到init_pos,按 RB+A 让机器人从init_pos运动到仿真开始的姿态。
2. 实机部署-Go2
-
用网线的一端连接Go2机器人,另一端连接用户电脑,并开启电脑的 USB Ethernet 后进行配置。机器狗机载电脑的 IP 地地址为 192.168.123.161,故需将电脑 USB Ethernet 地址设置为与机器狗同一网段,如在 Address 中输入 192.168.123.222 (“222”可以改成其他)。
-
通过
ifconfig
命令查看123网段的网卡名字,如enxf8e43b808e06
,下文用 <YOUR_NETWORK_INTERFACE> 代替 -
新建终端,启动控制程序
source devel/setup.bash rosrun rl_sar rl_real_go2 <YOUR_NETWORK_INTERFACE>
Go2支持手柄与键盘控制:
- 按下遥控器的R2键让机器人切换到默认站起姿态,按下R1键切换到RL控制模式,任意状态按下L2切换到最初的趴下姿态。左摇杆上下控制x左右控制yaw,右摇杆左右控制y。
- 按下键盘上的0键让机器人切换到默认站起姿态,按下P键切换到RL控制模式,任意状态按下1键切换到最初的趴下姿态。WS控制x,AD控制yaw,JL控制y。
二、免网线机载部署配置说明
【前言】:Go2 EDU内置上层主控板NVIDIA Jetson Orin,已经预装了Ubuntu20.04,并且预装了两个版本的ROS(1&2),可以通过机身的全功能Type-C接口外接拓展坞后接显示器和鼠标键盘直接在内部开发。在安装配置rl_sar前一定要先解决好ROS的环境问题(例如python版本等等),否则会遇见各种问题。
【机载部署说明】:在Go2机载部署rl_sar主要的问题有两个:
- 正常下载的libtorch是专门为amd架构的电脑编译的,所以在arm板子上无法使用。
- 宇树的sdk默认也是为amd架构的电脑编译的,所以在arm板子上也无法使用。
1. 下载并配置rl_sar
参照上文/官方README中正常的安装配置流程下载并且安装好依赖(一模一样的步骤操作即可),但是不要编译。
2. libtorch替换为专门为Jetson编译的版本
2.1 安装专门为Jetson编译的pytorch
(也可以自行寻找相关教程进行安装)
Step1:查看jetpack版本:
使用jtop
工具查询Jetpack版本及系统信息,需要安装jetson-stats软件包,该软件包包含jtop
工具。使用以下命令进行安装:
sudo pip3 install jetson-stats
安装完成后,启动服务:
sudo systemctl restart jtop.service
运行jtop
命令:
sudo jtop
在jtop
的界面中,可以查看CPU、GPU的实时使用数据以及系统的一些其他信息,包括Jetpack的版本。
Step2:安装对应版本pytorch
-
进入NVIDIA专门为Jetson准备的pytorch安装网站:PyTorch for Jetson
-
根据对应jetpack版本点击下载whl文件,例如:
torch-2.1.0a0+41361538.nv23.06-cp38-cp38-linux_aarch64.whl
-
安装依赖:
sudo apt-get -y update sudo apt-get -y install autoconf bc build-essential g++-8 gcc-8 clang-8 lld-8 gettext-base gfortran-8 iputils-ping libbz2-dev libc++-dev libcgal-dev libffi-dev libfreetype6-dev libhdf5-dev libjpeg-dev liblzma-dev libncurses5-dev libncursesw5-dev libpng-dev libreadline-dev libssl-dev libsqlite3-dev libxml2-dev libxslt-dev locales moreutils openssl python-openssl rsync scons python3-pip libopenblas-dev
-
安装:进入你存放whl的文件夹(安装前pip没换源的建议先换个源)
pip install torch-2.1.0a0+41361538.nv23.06-cp38-cp38-linux_aarch64.whl
whl文件要换成你自己的文件名
,安装完成后在终端进入python,通过import torch验证安装是否完成,
如果没有报错说明安装成功
2.2 在pytorch安装文件夹找到libtorch所需文件并替换
Step1:查看pytorch安装目录:
命令行终端:
python
>>> import torch
>>> print(torch.__file__)
/home/unitree/.local/lib/python3.8/site-packages/torch/__init__.py
Step2:寻找并替换文件:
在torch
文件夹中找到bin
、include
、lib
、share
四个文件夹,替换原本libtorch
文件夹中的所有内容
3. unitree sdk的编译版本更换
unitree sdk针对amd和arm架构都提供了相应的编译版本,而rl_sar默认使用的是amd版本,所以需要修改src/rl_sar
中的cmakelist.txt
:
1.将下述代码中x86_64
改为aarch64
include_directories(library/unitree_sdk2/include)
link_directories(library/unitree_sdk2/lib/x86_64)
include_directories(library/unitree_sdk2/thirdparty/include)
include_directories(library/unitree_sdk2/thirdparty/include/ddscxx)
link_directories(library/unitree_sdk2/thirdparty/lib/x86_64)
set(UNITREE_GO2_LIBS -pthread unitree_sdk2 ddsc ddscxx)
2.将set(UNITREE_A1_LIBS -pthread unitree_legged_sdk_amd64 lcm)
中的amd64改为arm64
4. 编译&使用
此时正常编译即可,使用时运行rosrun rl_sar rl_real_go2 <YOUR_NETWORK_INTERFACE>
代码中的的<YOUR_NETWORK_INTERFACE>
统一为eth0
(可以通过ifconfig
查看,eth0
此时就是上层板子的IP,相当于上层板子取代你原本的电脑给下层板子发指令)。使用时手柄等操控方法不变。这时候就可以通过SSH或者远程桌面或者先接显示器跑程序然后拔下来等等一系列方法摆脱网线的束缚了。
实测是可以机载运行的,但是由于配置时间隔了挺长一段时间,并且没有新狗可以再安装一下进行测试,所以教程并不一定全面可能会遗漏一些细节,大家在机载配置的过程可能还会遇到其他的问题,但是主要的问题和解决办法已经给出,如果大家配置时遇到一些新的问题欢迎反馈和交流。
-------------------------更新-------------------------
前段时间又再新狗上测试部署了一下,把一些细节问题整理了一下供大家参考
问题1
报错:
Could NOT find Python3 (missing: Python3_LIBRARIES Python3_INCLUDE_DIRS
Development) (found version "3.9.5")
解决:ROS python版本的问题,一般是刚装的ROS会出现这种情况,把3.9卸了就行
sudo apt remove python3.9 python3.9-dev python3.9-distutils
sudo apt autoremove
问题2
报错:
Could not find a package configuration file provided by
"controller_manager" with any of the following names:
controller_managerConfig.cmake
controller_manager-config.cmake
(或者是genmsg找不到)
解决:这个问题很迷,最开始部署编译的时候没有出现过这个问题,完全一样的代码复制到另一条狗就出现了这个问题,而且cmakelist里面是有这两个包的,ROS路径也是正常的,不知道是arm板子的ROS有什么bug。尝试过很多方法后如下方法实测可以解决:
在rl_sar的Cmakelist的开头单独加入下面两个包的find_package
find_package(controller_manager REQUIRED)
find_package(genmsg REQUIRED)
问题3
报错:
接时无法找到unitree::robot::go2::RobotStateClient::ServiceSwitch函数的定义
具体的报错信息忘了存了,大体是这么个报错
解决:这个问题也很迷,最开始部署编译的时候也没有出现过这个问题,完全一样的代码复制到另一条狗就出现了这个问题,具体什么原因还不清楚,在rl_real_go2.cpp
中找到ServiceSwitch
的使用,发现是和sport_mode
有关,印象中go2的APP中原本只有一个sport_mode
,后来更新后多了一个ai_sport_mode
(好像是这个名),可能是API的名称之类的改了?(瞎分析一下,没深入研究)
解决办法是可以直接把ServiceSwitch
这一行代码注释掉,只要保证运行代码前把自带的运控关掉就不会有影响。
注意:以上问题只针对rl_sar ROS-noetic v2.1