为PX4建立ROS2环境,x86与树梅派

2023-05-16

本文参考官网:https://docs.px4.io/master/en/ros/ros2_comm.html

本文介绍了ROS2的应用程序通过Fast DDS中间件与PX4的仿真环境连接,有两种构型,一种是将ROS2安装在x86的Ubuntu机器上,Fast DDS以及仿真环境也安装在这台机器上,在同一台机器上,ROS2的应用程序通过Fast DDS中间件与PX4的仿真环境连接。第二种构型是将ROS2安装在Raspberry Pi 3B+的Ubuntu机器上,同时将Fast DDS中间件也安装在Raspberry Pi 3B+中,PX4的仿真环境则在一台x86机器上,在Raspbeery Pi上,OS2应用程序通过Fast DDS中间件与x86机器上的PX4的仿真环境连接。

对于第一种构型,我采用二进制的办法安装ROS2,本文没有介绍这种安装的具体步骤,可参考官网安装即可,基本没有出现问题。对于第二种构型,我采用源码级安装ROS2,本文介绍了具体的安装步骤。

注:本文没有介绍如何安装Fast DDS,在这里介绍。

版本说明:

x86 + ubuntu 20.04 server

raspberry pi 3B+ + ubuntu 20.04 server,32G

ROS2 foxy,2020发布

ROS2PX4集成,需要

  • 安装Fast DDS

  • 安装ROS2

  • 建立ROS2工作空间

  • 做一次安装检查(可选)

1.安装ROS2

可以安装二进制代码(参见),也可以安装源代码编译形成可执行程序(参见),在一般的x86 ubuntu机器上直接安装二进制的就可以了。在Raspberry Pi 3B+这种ARM机器上安装源码然后再编译形成可执行程序会消耗一些时间,源码安装的好处是所有ros2的东西都安装上了,尽管也许你并不需要那么多功能

把ROS2装在Raspberry Pi 3B+,花了10多个小时

  • 增加ROS2的apt资源

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
  • 安装开发工具和ros工具:

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
  • 获取ROS2源代码

建立一个工作空间然后下载所有资源源代码:

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,不能保证不过期。

  • 用rosdep安装系统依赖资源

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
  • 运行例子程序“talker-listener”

打开一个终端:

. ~/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

克隆ROS2PX4microRTPS 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中间件,在PX41.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的版本号。因为我的ros2是源码级安装,不需要安装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. 安装测试

注:由于PX41.121.13版本对yaml文件处理的方式稍有变化,带来了不兼容。目前下载的ROS2 foxyPX4 1.13是可以匹配的,但是ROS2 foxyPX4 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与仿真环境下的micrortps_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就装好了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为PX4建立ROS2环境,x86与树梅派 的相关文章

  • 算术恒等式和 EFLAGS

    因为 x not x 1 意味着 a b a not b 1 那么 sub rax rcx 相当于 mov temp rcx not temp add rax temp add rax 1 其中 temp 是一些被认为是易失性的寄存器 换句
  • 如何将 IA32 'cmp' 指令转换为 Y86?

    IA32 to Y86 ATT组装 我有以下 IA32 汇编代码 Bubble LFB0 pushl esi pushl ebx movl 16 esp esi movl 12 esp edx subl 1 esi andl esi esi
  • 如何在 GCC x86 中使用 RDTSC 计算时钟周期? [复制]

    这个问题在这里已经有答案了 使用 Visual Studio 我可以从处理器读取时钟周期计数 如下所示 我如何对 GCC 做同样的事情 ifdef MSC VER Compiler Microsoft Visual Studio ifdef
  • SSE加载和添加

    假设我有两个由两个类型数组表示的向量double 每个尺寸为2 我想添加相应的位置 所以假设向量i0 and i1 我想补充一下i0 0 i1 0 and i0 1 i1 1 一起 由于类型是double 我需要两个寄存器 诀窍是把i0 0
  • 字大小及其指示

    请参阅下面关于各种指令集架构中的字长以及它与汇编语言的关系的问题 感谢您提供的所有帮助 先说几个事实 如有错误 请指正 处理器架构的字长表示 编辑 其中一些是错误的 请参阅下面 Seva 的帖子 每个寄存器的最大尺寸 每个内存地址的最大尺寸
  • FASM 是否使用 Intel 语法?

    我尝试在 FASM 中编译以下代码 mov DWORD PTR ebp 4 1234567 它给了我一个 无效表达式 错误 但是以下代码有效 mov DWORD ebp 4 1234567 那么 FASM 是否使用 Intel 语法 我假设
  • 链接描述文件未按预期跳过字节

    因此 我有这个汇编文件 我使用 GNU as 进行汇编 并使用链接器脚本与 GNU ld 进行链接 链接描述文件 boot ld INPUT boot o OUTPUT boot out ENTRY boot start SECTIONS
  • 早期的BIOS怎么能使用CALL呢?

    我纯粹是出于爱好原因 试图理解 PC 中的一些低级代码 我为随机的旧千兆字节 MB 下载了一个过时的 BIOS ROM 映像 https www gigabyte com Motherboard GA 8I845GE775 G rev 10
  • x86 实模式下的段大小

    我对实模式下段的大小有一个疑问 因为它们不能超过 64K 但可以小于那个 http support microsoft com kb 120069 我的问题是这些段大小和基地址是如何初始化的 就像保护模式下有 GDT 和 LDT 一样 实模
  • 如何获取 VESA BIOS 信息

    我正在跟踪Phil Opp 教程 https os phil opp com 关于用 Rust 编写一个操作系统 在稍微尝试了一下之后 我想在屏幕上显示真实的图形 我发现我应该从使用带有 VESA 的线性帧缓冲区开始 我在 osdev or
  • 使用 gdb 调试反汇编库

    在Linux和Mac OS X中可以使用strapi和next来调试应用程序而无需调试信息 在 Mac OS X 上 gdb 显示在库内部调用的函数 尽管有时会在每个 stepi 指令中推进多个汇编程序指令 在 Linux 上 当我进入动态
  • 编写 AMD64 SysV 程序集时使用哪些寄存器作为临时寄存器?

    我正在使用实现一个功能cpuid根据 AMD64 SysV ABI 进行组装 我需要在函数本身中使用 2 个临时寄存器 第一个用于累积返回值 第二个用作计数器 我的功能目前如下所示 zero argument function some c
  • 为什么 SSE 对齐读取 + 随机播放在某些 CPU 上比未对齐读取慢,而在其他 CPU 上则不然?

    在尝试优化有限差分代码所需的未对齐读取时 我更改了未对齐的负载 如下所示 m128 pm1 mm loadu ps H k 1 进入这个对齐的读取 随机播放代码 m128 p0 mm load ps H k m128 pm4 mm load
  • CALL指令是否总是将EIP指向的地址压入堆栈?

    x86架构中函数调用时是否存在返回地址不入栈的情况 No CALL根据定义 将在跳转到目标地址之前将返回地址压入堆栈 该返回地址是EIP or RIP sizeof call instruction 通常为 5 个字节 英特尔 64 和 I
  • 如何知道寄存器是否是“通用寄存器”?

    我试图了解寄存器必须具备什么标准才能被称为 通用寄存器 我相信通用寄存器是一个可以用于任何用途的寄存器 用于计算 将数据移入 移出等 并且是一个没有特殊用途的寄存器 现在我读到了ESP寄存器是通用寄存器 我猜是ESP寄存器可以用于任何事情
  • AVX-512 指令编码 - {er} 含义

    在 Intel x86 指令集参考中 有许多 AVX 512 指令在指令中具有可选的 er 例如 VADDPD 的一种形式定义为 EVEX NDS 512 66 0F W1 58 r VADDPD zmm1 k1 z zmm2 zmm3 m
  • 为什么 FMA _mm256_fmadd_pd() 内在函数有 3 个 asm 助记符:“vfmadd132pd”、“231”和“213”?

    有人可以向我解释一下为什么融合乘法累加指令有 3 种变体 vfmadd132pd vfmadd231pd and vfmadd213pd 而只有一个 C 内在函数 mm256 fmadd pd 为了简单起见 在 AT T 语法中 有什么区别
  • Visual Studio 2012 本机 C++ DLL x86 编译

    我最近将我的工具集从 Win 7 x86 Visual Studio 2010 升级到 Win 8 x64 Visual Studio 2012 但是 现在我的本机 C dll 编译为 x64 而不是 x86 除了将代码移至新操作系统并将其
  • 在 x86 汇编中将 64 位常量移至内存

    我正在使用 Intel x64 程序集 NASM 编译器 尝试将 0x4000000000000000 常量移至内存 该常量在 ieee 754 标准双精度中应等于 2 0 我正在使用的代码是 define two 0x4000000000
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c

随机推荐

  • PHP面试题

    PHP知识 php反转字符串的三种方法 1 把分割字符串到一个数组中 xff0c 然后遍历拼接 xff1a lt php function joinStrrev str if strlen str lt 61 1 return str ne
  • tp6实现商城后台登录功能

    后台登录逻辑 1 没有登录状态 xff0c 访问后台页面都应该跳转到登录页 已经登录状态 xff1a 1 访问登录页面 xff0c 应该跳转到后台首页 解决方案 xff1a 后台登录拦截 xff1a 1 传统common base php控
  • Jenkins环境部署

    简介 Jenkins是一款开源 CI amp CD 软件 xff0c 用于自动化各种任务 xff0c 包括构建 测试和部署软件 Jenkins 支持各种运行方式 xff0c 可通过系统包 Docker 或者通过一个独立的 Java 程序 J
  • Nginx中Return指令使用

    Return指令使用 1 返回状态码 return 404 location test set name 39 user123 39 return 404 name curl i http 192 168 56 10 test 2 返回字符
  • MySQL触发器

    介绍 触发器是与表有关的数据库对象 xff0c 指在 insert update delete 之前或之后 xff0c 触发并执行触发器中定义的SQL语句集合 触发器的这种特性可以协助应用在数据库端确保数据的完整性 日志记录 数据校验等操作
  • 制作composer包提供sdk扩展

    目录 1 初始化包 2 将代码推送到github远程仓库 3 为写好扩展包打上tag标签标记当前代码版本 4 将包发布到包管理平台 初始化包 xff0c 生成 Creates a basic composer json file in cu
  • Go环境搭建与IDE开发工具配置

    安装Go语言编译器 Go语言编译器 61 编译器 61 将源代码编译为可执行程序 61 源代码 61 程序员使用高级语言所书写的代码文件 61 高级语言 61 c c 43 43 go 61 机器语言 61 0和1构成 xff0c 机器能直
  • 计算机中的速率、带宽、时延、利用率解读

    计算机网络的性能一般是指它的几个重要的性能指标 但除了这些重要的性能指标外 xff0c 还有一些非性能特征 xff08 nonperformance characteristics xff09 也对计算机网络的性能有很大的影响 那么 xff
  • 无人机原理

    文章目录 1基本运动2为何无人机螺旋桨多为偶数3机器人的运动控制4加速度计5陀螺仪6姿态角解算欧拉角的平面换算 1基本运动 为了平衡扭矩 xff0c 上图中1 3逆时针转动 xff0c 电机2 4顺时针转动进行反扭矩对消 上升 F1 61
  • 新浪微博PC端模拟登陆

    点击上方 程序人生 xff0c 选择 置顶公众号 第一时间关注程序猿 xff08 媛 xff09 身边的故事 图 xff1a Fantastic Beasts and Where to Find Them 投稿 星星在线 简介 一个从妹子图
  • win10下 docker build 报错 “Failed to fetch xxxxxxxx Temporary failure resolving 'archive.ubuntu.com'”

    错误信息 在docker中搭建禅道的时候执行docker build t zentao 命令后执行到apt get update amp amp apt get install指令的时候报错 xff0c 错误如下 xff1a W Faile
  • docker-ros-gui

    主机环境 系统 Ubuntu 16 04 1 安装docker 1 1 在线安装 物理机 默认使用当前最新版本 1 更新apt包索引 xff1a sudo apt get update 2 安装以下包以使apt可以通过HTTPS使用存储库
  • halcon opencv 图像处理面试指南

    珠海某上市公司算法总监 xff1a 1 相机标定的原理与坐标系之间的转换 xff0c 如何转换 2 激光三角原理 xff0c 如何搭建 3 测量拟合的过程中有哪些算子 xff0c 原理什么 xff0c 接着问5 xff0c 跌代多少次 xf
  • 【3D计算机视觉】从PointNet到PointNet++理论及pytorch代码

    从PointNet到PointNet 43 43 理论及代码详解 1 点云是什么1 1 三维数据的表现形式1 2 为什么使用点云1 3 点云上以往的相关工作 2 PointNet2 1 基于点云的置换不变性2 1 1 由对称函数到Point
  • 在ubuntu上安装mavlink-router

    版本说明 xff1a ubuntu 20 0 04 mavlink router 2 为了安装mavlink router 需要预先安装一些依赖库 xff1a autoconf libtool python future python3 f
  • PX4多机仿真(gazebo)

    版本说明 xff1a 操作系统 宿主机 xff08 或开发机 xff09 xff1a ubuntu server 20 0 04 thinkpad 目标机 xff08 机载计算机 xff09 xff1a ubuntu server 20 0
  • 为PX4建立J-Link Eclipse交叉调试环境

    版本说明 1 自驾仪 xff1a Holybro的Pixhawk 4 2 PX4版本 xff1a 1 12 3 宿主机 xff1a Thinkpad笔记本 43 Ubuntu 20 04 2 LTS 4 Eclipse xff1a 2022
  • 为Ubuntu增加swap空间并调整性能

    版本说明 xff1a Raspberry Pi 3B 43 Ubuntu 20 04 server 本文参考翻译自这篇文章 SWAP文件的设置 Swap是硬盘存储的一部分 xff0c 它被预留给操作系统 当RAM中不再有足够的空间来保存正在
  • PX4的中间件Fast DDS

    本文参考官网 xff1a RTPS DDS Interface PX4 Fast RTPS DDS Bridge PX4 User Guide 版本说明 xff1a PX4固件版本 xff1a 1 13 0d 自驾仪 xff1a PIXHA
  • 为PX4建立ROS2环境,x86与树梅派

    本文参考官网 xff1a a href https docs px4 io master en ros ros2 comm html title htt htt a ps docs px4 io master en ros ros2 com