前言:
笔者近日研读了MIT Cheetah 3 论文,对上层控制算法结构有了自己的理解。贴一张思维导图:
不码不工,真知无望。在理论学习后自然需要学习代码。知乎大神YY硕在2022年开源的工作A1-QP-MPC-Controller,依照MIT的具体实现思路,将高层控制指令和控制器的状态数据通过ROS消息发送,使各环节输入输出更加明晰;同时控制器运行在Docker容器当中,使后续在实体机上的移植也更加便捷。
考虑到以上,笔者决定复现该工作后,通过此进行代码的学习研究。
贴一个YY硕本人知乎的帖子:又一个开源的四足机器人控制器 - 知乎
github项目地址:ShuoYangRobotics/A1-QP-MPC-Controller:MIT Cheetah 3 控制器的开源实现
一、硬件准备
- Intel NUC12(无独显)
- Xbox one手柄
二、排雷总结
1. 控制器安装
在执行以下步骤时:
ssh root@localhost -p2233
# then input passward "password" when prompted to do so
cd /root/A1_ctrl_ws/
catkin build
注意:
- 主机的身份验证密钥发生了变化:如果第一遍安装未成功,想删除重新构建镜像时,可能会出现如下报错:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:hnHl+MyVxwb/7T6daM586X/6rnZrd5rktmBwF7FuLi0.
Please contact your system administrator.
解决方法:使用提供的命令删除 /你的目录/.ssh/known_hosts
文件中与 [localhost]:2233
相关的旧密钥条目
ssh-keygen -f "/你的目录/.ssh/known_hosts" -R "[localhost]:2233"
然后再重复使用ssh连接docker容器即可。
- 进入/root/A1_ctrl_ws/编译报错:
Errors << a1_cpp:make /root/A1_ctrl_ws/logs/a1_cpp/build.make.002.log
In file included from /usr/local/include/OsqpEigen/Solver.hpp:312:0,
from /usr/local/include/OsqpEigen/OsqpEigen.h:13,
from /root/A1_ctrl_ws/src/A1_Ctrl/src/a1_cpp/src/test/test_rotation.cpp:8:
/usr/local/include/OsqpEigen/Solver.tpp:10:10: fatal error: auxil.h: No such file or directory
#include <auxil.h>
^~~~~~~~~
具体原因是,在编译Osqp-Eigen库时,找不到一些头文件而报错。这些头文件都是osqp库里的文件。
笔者先尝试去查看osqp库是否安装成功,使用指令:
sudo find / -name osqp
在/usr/local/include中找到了osqp。说明install环节没有问题。但是打开osqp文件时,发现里边确实没有auxil.h这个文件。实际上还会报错scaling.h等别的依赖库找不到。也就是说,安装了,但没完全安装。
以上头文件都可以在/usr/include/osqp/include/private中找到,可以选择将文件中的auxil.h scaling.h以及其他需要的文件都转移到/usr/local/include/osqp中,这样就不会报错找不到auxil.h等。
cp auxil.h /usr/local/include/osqp
OK,解决了这个问题之后,你将会看到一片红。。。。
大概看了一眼,基本都是"… has not been declared"这种报错。要不就是哪个包整个没有被安装,要不就是版本匹配问题。
通过查询csdn,发现是Osqp-Eigen库和osqp库的版本匹配问题。挂两个解决的帖子在这:
Linux系统下eigen、osqp、osqp-eigen具体安装步骤(测试报错的人必看!)_linux 安装eigen-CSDN博客
【osqp-eigen安装】编译报错问题-CSDN博客
截止到2023年07月19日,osqp-eigen的最新版本为v0.8.0,其能够适配osqp的版本为v0.6.3。
但是,我试图在原docker环境中uninstall osqp重新安装v0.6.3,发现好像还是不行。可能是哪个地方没有卸载干净。
我的解决方案是:在dockerfile中找到 git clone --recursive https://github.com/oxfordcontrol/osqp.git, 加上版本,改为:
git clone --recursive -b release-0.6.3 https://github.com/oxfordcontrol/osqp.git
所以知道为啥开头要写那个重新构建镜像时主机的身份验证密钥问题的解决方案了吧。。。。。。
构建成功后,再将将/usr/include/osqp/include/private路径中的auxil.h scaling.h以及其他需要的文件都转移到/usr/local/include/osqp中,这样就不会报错找不到auxil.h等。
最后catkin build,应该就没有问题了。
2. Gazebo仿真image构建
因为笔者的Intel Nuc12没有独显,所以在运行 脚本run_gazebo_docker.bash 时,删除脚本中的
–runtime=nvidia \整行。
完整脚本为:
XAUTH=/tmp/.docker.xauth
if [ ! -f $XAUTH ]
then
xauth_list=$(xauth nlist :0 | sed -e 's/^..../ffff/')
if [ ! -z "$xauth_list" ]
then
echo $xauth_list | xauth -f $XAUTH nmerge -
else
touch $XAUTH
fi
chmod a+r $XAUTH
fi
docker run -it \
--env="DISPLAY=$DISPLAY" \
--env="QT_X11_NO_MITSHM=1" \
--volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
--env="XAUTHORITY=$XAUTH" \
--volume="$XAUTH:$XAUTH" \
--runtime=nvidia \
--privileged \
--network host \
--name a1_unitree_gazebo_docker \
a1_unitree_gazebo_image
到此,笔者的项目全部编译构建完成,可以运行。
后边准备研究具体代码实现,边学边更新。。。