本文参考官网: htt ps://docs.px4.io/master/en/ros/ros2_comm.html
本文介绍了在x86的ubuntu机器上二进制安装的ROS2用Fast DDS中间件与同一机器上的PX4仿真环境连接,本文还介绍了在Raspberry Pi 3B+的ubuntu机器上进行ROS2的源码级安装,然后用Fast DDS中间件与x86机器的PX4仿真环境连接。本文没有介绍二进制安装ROS2的具体步骤, 因为在x86机器上按官网安装基本没有出现问题。
版本说明:
x86 + ubuntu 20.04 server
raspberry pi 3B+ + ubuntu 20.04 server
ROS2 foxy
把 ROS2 与 PX4 集成,需要
-
安装 Fast DDS -
安装 ROS2 -
建立 ROS2 工作空间 -
做一次安装检查(可选)
1. 安装 ROS2
可以安装二进制代码(参见),也可以安装源代码编译形成可执行程序(参见),在一般的 x86 ubuntu 机器上直接安装二进制的就可以了。在 Raspberry Pi 3B+ 这种 ARM 机器上安装源码然后再编译形成可执行程序会消耗一些时间,源码安装的好处是所有 ros 2 的东西都安装上了,尽管也许你并不需要那么多功能 。
把ROS2装在Raspberry Pi 3B+,花了10多个小时
sudo apt update && sudo apt install curl gnupg2 lsb-release
其中:curl是从网上获取linux工具的软件,gnupg2是从网上获取资源通讯时的加密机制,lsb-release命令获取linux的版本等信息。
然后授权获取ros资源:
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
把apt能够获取的ros资源列表增加到apt资源列表中:
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(source /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
sudo apt update && sudo apt install -y \
build-essential \
cmake \
git \
libbullet-dev \
python3-colcon-common-extensions \
python3-flake8 \
python3-pip \
python3-pytest-cov \
python3-rosdep \
python3-setuptools \
python3-vcstool \
wget
# install some pip packages needed for testing
python3 -m pip install -U \
argcomplete \
flake8-blind-except \
flake8-builtins \
flake8-class-newline \
flake8-comprehensions \
flake8-deprecated \
flake8-docstrings \
flake8-import-order \
flake8-quotes \
pytest-repeat \
pytest-rerunfailures \
pytest
# install Fast-RTPS dependencies
sudo apt install --no-install-recommends -y \
libasio-dev \
libtinyxml2-dev
# install Cyclone DDS dependencies
sudo apt install --no-install-recommends -y \
libcunit1-dev
建立一个工作空间然后下载所有资源源代码:
mkdir -p ~/ros2_foxy/src
cd ~/ros2_foxy
wget https://raw.githubusercontent.com/ros2/ros2/foxy/ros2.repos
vcs import src < ros2.repos
最后这条语句是要下载若干个项目的源代码,但是github.com根本连不上,或者下载速度极慢,所以需要把ros2.repos文件中的网址都换成快一点的网址即可,捡到一个还不错:hub.fastgit.xyz,不能保证不过期。
sudo rosdep init
rosdep update
rosdep install --from-paths src --ignore-src -y --skip-keys "fastcdr rti-connext-dds-5.3.1 urdfdom_headers"
cd ~/ros2_foxy/
colcon build --symlink-install
一共311个程序编译,其实也用不了那么多功能,编到做后实在编不动了,这小树梅派就停在那里,时间在计数,就是不前进了,记住停在哪里了,ctrl+c中断,就用touch COLCON IGNORE去掉了
system_tests/test_commnuication
rviz_default_plugin
然后重新执行上面语句,还好是增量编译,顺利,整个编译就完成了,花了 10 多个小时,当然如果是好一点的机器肯定会快。编译完, sd 卡消耗掉 10 多个 G 。所以建议 sd 卡要 32G 以上。另外为你的ubuntu的swap文件留1G的空间,如果没有设置swap,可能编译不过去。
定位setup脚本
. ~/ros2_foxy/install/local_setup.bash
打开一个终端:
. ~/ros2_foxy/install/local_setup.bash
ros2 run demo_nodes_cpp talker
打开另一个终端:
. ~/ros2_foxy/install/local_setup.bash
ros2 run demo_nodes_py listener
这个例子是要证明一个C++编写的程序发布消息,一个python语言编写的程序可以听到这个消息。
测试例子通过,没什么问题。
2. 建立工作空间
注:本人 x86 笔记本 ubuntu 中用二进制的办法安装了 ROS2, 以下建立工作空间与安装测试是在 x86 笔记本上进行。
先安装如下工具:
安装 colcon 编译工具
sudo apt install python3-colcon-common-extensions
安装C++矩阵运算库
sudo apt install ros-foxy-eigen3-cmake-module
注:二进制安装没有问题,源码级安装不需要这一步。
安装python依赖库
sudo pip3 install -U empy pyros-genmsg setuptools
sudo apt-get install python3-genmsg
建立工作空间所在目录
$mkdir -p ~/px4_ros_com_ros2/src
克隆 ROS2 与 PX4 的 microRTPS Bridge 源代码
$ git clone https://github.com/PX4/px4_ros_com.git ~/px4_ros_com_ros2/src/px4_ros_com
$ git clone https://github.com/PX4/px4_msgs.git ~/px4_ros_com_ros2/src/px4_msgs
构建工作空间,包括 microRTPS Bridge 中间件,在 PX4 的 1.13 版本中,确认以下两个文件在内容上是一致的:
PX4-Autopilot/msg/tools/urtps_bridge_topics.yaml
px4_ros_com_ros2/src/px4_ros_com/templates/urtps_bridge_topics.yaml
注意: ROS2 接受的是 PascalCase 格式的话题名。 msg/tools/uorb_to_ros_urtps_topics.py程序可以将urtps_bridge_topics.yaml文件中对话题的下划线表示法转换成PascalCase表示法。PX4接受的是下划线表示法,ROS这边接受的是Pascal表示法,所谓PascalCase如例所示:sensor_combined转换成SensorCombined。
$ cd ~/px4_ros_com_ros2/src/px4_ros_com/scripts
$ source build_ros2_workspace.bash
注:如果是二进制安装的 ROS2 (我在 x86 笔记本上就是二进制 ROS2 安装) , 执行 source build_ros2_workspace.bash 没有问题,但是如果 ROS2 是源码编译安装(我在 Raspberry Pi 上就是源码级 ROS2 安装),执行此语句会出错。
问题一 。 由于 ROS2 在树梅派上是源码级安装,执行这个 bash文件时出现如下提示:
- No ROS 2 distro installed or not installed in the default directory.
所以,在执行 build_ros2_workspace.bash 时需要加选项,由于在树梅派上安装的 ros2 是源码安装的,编译结果被安装在 ros2_foxy/install 目录中 ,这样需要执行下面语句 :
$ source build_ros2_workspace.bash --ros_distro foxy --ros_path ~/ros2_foxy/install/setup.bash
其中:
选项 --ros_distro 指定 ros2 的版本,我安装的是 foxy 版本。
选项— ros_path 是指定 ros2 的安装目录以及其中的 setup.bash 名字,我的 ros2 安装目录是 ~/ros2_foxy/install ,加上 setup.bash 名字。
问题二 。 这个 bash 在调用 generate_microRTPS_ bridge .py 生成 microRTPS_ bridge 相关源代码 时,这个 py 程序用 ros-foxy-fastrtps 判断 fastrtps 的版本号。因为我的 ros 2 是源码级安装,不需要安装 ros-foxy-fastrtps 这个软件包 ,由于找不到这个软件包 , 这个 py 程序就蹦出来了,还好 , 把错误写在 ~/px4_ros_com_ros2/build/px4_ros_com/micrortps_bridge.log 中。这与官网上报告的错误一样 build_ros2_workspace.bash failed #123 。说明这个程序在这个地方是为 ROS2 二进制安装准备的,而没有测试过源码安装。
解决办法是 ,修改 generate_fastrtps.py 这个程序,直接对变量 fastrtps_version 赋值成 2.1.1 。
语句 fastrtps_ version = ‘2.1.1’ 。再运行这个构建过程 ,正常了。
3. 安装测试
注:由于 PX4 的 1.12 与 1.13 版本对 yaml 文件处理的方式稍有变化,带来了不兼容。目前下载的 ROS2 foxy 与 PX4 1.13 是可以匹配的,但是 ROS2 foxy 与 PX4 1.12 不匹配 .
3.1 启动 gazebo 仿真环境
$ make px4_sitl_rtps gazebo
注 : gazebo 仿真环境启动后自动启动了 micrortps_client ,等待连接的micrortps_agent缺省地设置为本机:127.0.0.1。如果 micrortps_agent 是在一个有 wifi 连接的树梅派上运行,那么连接这个 agent 则需要指定这个树梅派的 ip 地址 , 假设地址是 192.168.3.18 。需要重新启动 micrortps_client, 如下:
先停止
pxh> micrortps_client stop
再启动
pxh> micrortps_client start -t UDP -i 192.168.3.18
3.2 启动 microRTPS 代理
$ source ~/px4_ros_com_ros2/install/setup.bash
$ micrortps_agent -t UDP
注 : micrortps_agent 如果运行在树梅派上,树梅派又与你的宿主机之间有 wifi 连接,那么可以试一下在宿主机中运行 PX4 的软件仿真,让 micrortps_agent 与仿真环境下的 micro rtps_client 连接,不过需要在运行micrortps_client时指定树梅派的ip地址。如:3.1节所述。
3.3. 启动接收 sensor_combined 话题数据的应用程序
$ source ~/px4_ros_com_ros2/install/setup.bash
$ ros2 launch px4_ros_com sensor_combined_listener.launch.py
如果成功,则 ROS2 就装好了。
?
|