一、前言
(一)版本信息
操作系统:Ubuntu20.04
PX4:v1.14
ROS2:foxy
镜像版本:latest
(二)参考文档
官网文档和知乎网友的经验分享
ROS 2 User Guide | PX4 User Guide
PX4 Docker Containers | PX4 User Guide
踩坑总结(4)——基于Docker的ROS2+PX4开发
https://zhuanlan.zhihu.com/p/520752548
(三)实现结果
px4_ros2_in_docker_0801
(四)预备知识
1、Docker基本操作指令、概念
2、ROS2基本概念、指令
3、PX4与ROS2架构(了解即可)
4、一个较为良好的网络环境,git指令正常运行,科学上网
这点很重要,不然过程中会出现千奇百怪的问题,大部分的原因是git clone 下载源码期间没有下载完全,导致出现缺少依赖的情况
二、步骤
(一)安装下载
1、Docker安装,及镜像下载
Docker相当于一个简单地虚拟机,之后的操作都在docker容器里进行,故先进行Docker的安装以及镜像的下载。
(1)Docker安装
安装:
推荐使用小鱼的一键安装,或者官方给的安装教程:
#小鱼的一键安装,跟随指引安装即可
wget http://fishros.com/install -O fishros && . fishros
#----------------------------------------------
#官网脚本教程
curl -fsSL get.docker.com -o get-docker.sh
sudo sh get-docker.sh
测试:
可以使用简单的hello指令进行测试,命令为:
docker run hello-world
(2)镜像拉取
安装
docker pull px4io/px4-dev-ros2-foxy
这里选择的版本是ros2-foxy的版本,执行之后会进行下载。
没有网络问题的话即可下载完成。
进入容器
最简单的是直接通过 run 命令进入,但是有许多后边需要设置的内容,可以先按照这个进入
# enable access to xhost from the container
#上边这句话是官网给的注释,我不太懂
xhost +
# Run docker and open bash shell
#run里边的一些具体参数可暂时不管,需要用到的时候会讲
docker run -it --privileged \
--env=LOCAL_USER_ID="$(id -u)" \
-v /tmp/.X11-unix:/tmp/.X11-unix:ro \
-e DISPLAY=:0 \
--name=px4-ros px4io/px4-dev-ros2-foxy:latest bash
至此完成Docker部分的安装下载,第一步较为简单,网络问题正常的话一般不会出错。
如果出现下载较慢的情况可以用科学上网的方法。
2、PX4源码下载
没有网络问题的话情况较为简单
mkdir src
cd src
git clone https://github.com/PX4/PX4-Autopilot.git
cd PX4-Autopilot
3、ROS2 示例代码下载
官网给了几个示例代码,方便测试使用下载如下
下载一个msg文件夹,一个ros_com文件夹,后续会用到
mkdir -p ~/ws_sensor_combined/src/
cd ~/ws_sensor_combined/src/
git clone https://github.com/PX4/px4_msgs.git
git clone https://github.com/PX4/px4_ros_com.git
(二)编译执行
使用指令进入到docker容器内部进行后续操作
dcoker exec -it px4_foxy bash
1、拷贝源文件
上述下载内容均为本地下载,没有传到docker容器里(采用这种方法的原因是因为在docker内部下载总是会出现各种各样的问题)
故需要通过指令将源文件拷贝到容器内。
docker cp 主机路径 容器id:目的容器内路径
根据自己下载的路径实现即可。
2、编译px4
这一步非常容易出现错误尽量跟着教程走。
注意以下步骤是在容器内部进行的
docker exec -it px4_foxy bash
cd /src/PX4-Autopilot/
make px4_sitl gazebo-classic
一般等待时间较久,出现问题的话建议重新下载PX4的源码重新进行编译,一般大家都是卡在这一步!!
3、编译ros2
# 新开一个Terminal
docker exec -it px4_foxy bash
# 以下为docker内的bash操作
cd ~/ws_sensor_combined/src/
source /opt/ros/foxy/setup.bash
colcon build
一般这步问题不大。
4、Micro XRCE-DDS 代理和客户端
要使 ROS 2 与 PX4 通信,uXRCE-DDS 客户端必须在 PX4 上运行,并连接到在配套计算机上运行的微型DDS代理。所以需要设置
git clone https://github.com/eProsima/Micro-XRCE-DDS-Agent.git
cd Micro-XRCE-DDS-Agent
mkdir build
cd build
cmake ..
make
sudo make install
sudo ldconfig /usr/local/lib/
编译完成之后即可打卡端口,用于连接到模拟器上运行的uXRCE-DDS客户端的设置启动代理
MicroXRCEAgent udp4 -p 8888
至此,源码都已经下载编译完成。之后进行测试。
(三)测试实现
打开三个终端,进入容器内部。
终端一
进入PX4源码文件夹,进行编译
make px4_sitl gazbo-classic
编译正常则会出现gazebo界面
终端二
设置DDS代理服务
进入DDS源码文件夹,进行设置
MicroXRCEAgent udp4 -p 8888
终端三
进入ros文件夹,运行示例
ros2 launch px4_ros_com sensor_combined_listener.launch.py
三、结语
经过自己一个月的学习,对Docker、PX4、以及ROS 2有一点点自己的理解,但才疏学浅难免会出现各种错误,欢迎大家批评指正!