PX4模块设计之六:PX4-Fast RTPS(DDS)简介

Posted lida2003

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PX4模块设计之六:PX4-Fast RTPS(DDS)简介相关的知识,希望对你有一定的参考价值。

@[TOC](PX4模块设计之六:PX4-Fast RTPS(DDS)简介)

基于PX4开源软件框架简明简介的框架设计,逐步分析内部模块功能设计。

PX4-Fast RTPS(DDS)具有实时发布/订阅uORB消息接口,用于AutoPilot内部组件或者offboard实时应用。其针对的主要应用是计算机视觉和传感器应用实时控制。Fast DDS的应用目标并非是替换MAVLink,目前,MAVLink仍然是地面站、平衡架、摄像头、offboard应用的主要通信接口;但是Fast DDS主要应用在搞通信带宽,高频率数据更新的场景。

1. DDS & Fast RTPS(DDS) 简介

DDS全称是Data Distribution Service,这是一套通信协议和API标准,它提供了以数据为中心的连接服务,基于发布者-订阅者模型。Fast-RTPS(DDS)是DDS的开源实现,借助它可以方便的开发出高效,可靠的分布式系统。

  • (第一代)点对点的CS(Client-Server)结构,这是大家最为熟悉的:一个服务器角色被许多的客户端使用,每次通信时,通信双方必须建立一条连接。当通信节点增多时,通信的连接数也会增多。并且,每个客户端都必须知道服务器的具体地址和所提供的服务。一旦服务器地址发生变化,所有客户端都会受到影响。
  • (第二代)Broker模型:存在一个中间人,它负责初步处理大家的请求,并进一步找到真正能响应服务的角色,这就好像存在一个经纪人。这为客户端提供了一层抽象,使得服务器的具体地址变得不重要了。服务端地址如果发生变化,只需要告诉Broker就可以了。但这个模型的问题在于,Broker变成了模型的中心,它的处理速度会影响所有人的效率,这就好像城市中心的路口,当系统规则增长到一定程度,Broker终究会成为瓶颈。更糟糕的是,如果Broker瘫痪了,可能整个系统都将无法运转。
  • (第三代)广播模型:所有人都可以在通道上广播消息,并且所有人都可以收到消息。这个模型解决了服务器地址的问题,且通信双方不用单独建立连接,但它存在的问题是:广播通道上的消息太多,太嘈杂,所有人都必须关心每条消息是否与自己有关。这就好像全公司一千号人坐在同一个房间里面办公一样。
  • (第四代)DDS模型:这种模型与广播模型有些类似,所有人都可以在DataBus上发布和读取消息。但它更进一步的是,通信中包含了很多并行的通路,每个人可以只关心自己感兴趣的消息,自动忽略自己不需要的消息。

2. PX4-Fast RTPS(DDS) 架构

Fast-RTPS(DDS)是eprosima对于RTPS的C++实现,这是一个免费开源软件,遵循Apache License 2.0。
Fast-RTPS(DDS)支持平台包括:Windows, Linux, Mac OS, QNX, VxWorks, ios, android, Raspbian。
Fast-RTPS(DDS)具有以下优点:

  • 对于实时应用程序来说,可以在Best-Effort和可靠通信两种策略上进行配置。
  • 即插即用的连接性,使得网络的所有成员自动发现其他新的成员。
  • 模块化和可扩展性允许网络中设备不断增长。
  • 可配置的网络行为和可互换的传输层:为每个部署选择最佳协议和系统输入/输出通道组合。
  • 两个API层:一个简单易用的发布者-订阅者层和一个提供对RTPS协议内部更好控制的Writer-Reader层。

注1:Publisher-Subscriber层:RTPS上的简化抽象。
注2:Writer-Reader层:对于RTPS端点的直接控制。

2.1 microRTPS Bridge

microRTPS桥接器在PX4和DDS参与应用程序之间交换消息,在每个系统使用的uORB和RTPS/DDS消息之间无缝转换。

架构主要通过其客户端和代理组成。

2.2 microRTPS Client

microRTPS客户端是在飞行控制器上运行的PX4自动驾驶仪中间件守护进程。该客户端订阅由其他PX4自动驾驶仪组件发布的uORB主题,并向代理发送任何更新(通过UART或UDP端口),还从代理接收消息,并将其作为uORB消息发布到PX4自动驾驶仪。

2.3 microRTPS Agent

microRTPS代理作为后台进程在伴飞计算机(飞行控制器外部)上运行。该代理监视来自客户端的uORB更新消息,并(重新)通过RTP发布这些消息,还订阅来自其他DDS参与者应用程序的“uORB”RTP/DDS消息,并将其转发给客户端。

2.4 microRTPS Agent/Client Communication

代理和客户端通过串行链路(UART)或UDP网络连接,uORB信息通过CDR序列化机制,提供了在不同平台之间交换串行数据的通用格式。在典型配置中,它们将位于连接到客户端的同一系统(例如,开发计算机、Linux配套计算机或计算板)上,硬件上可以通过Wifi链接或USB进行。

3. Fast RTPS(DDS)安装

eProsima Fast DDS是对象管理组(OMG)数据分发服务(DDS)规范和实时发布订阅(RTPS)协议的C++实现。
Fast DDS支持RTPS/DDS接口,允许PX4 uORB主题与参与同一DDS域的非车载组件共享,包括机器人和模拟器工具。特别是,快速DDS是机器人操作系统2(ROS 2)的默认中间件。

3.1 安装前提条件

3.1.1 基础环境

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.4 LTS
Release:        20.04
Codename:       focal
$ java --version
openjdk 11.0.15 2022-04-19
OpenJDK Runtime Environment (build 11.0.15+10-Ubuntu-0ubuntu0.20.04.1)
OpenJDK 64-Bit Server VM (build 11.0.15+10-Ubuntu-0ubuntu0.20.04.1, mixed mode, sharing)

使用ubuntu下的gradle组件

$ sudo apt-get install gradle
$ gradle --version
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.codehaus.groovy.reflection.CachedClass (file:/usr/share/java/groovy-all.jar) to method java.lang.Object.finalize()
WARNING: Please consider reporting this to the maintainers of org.codehaus.groovy.reflection.CachedClass
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release

------------------------------------------------------------
Gradle 4.4.1
------------------------------------------------------------

Build time:   2012-12-21 00:00:00 UTC
Revision:     none

Groovy:       2.4.17
Ant:          Apache Ant(TM) version 1.10.7 compiled on October 24 2019
JVM:          11.0.15 (Private Build 11.0.15+10-Ubuntu-0ubuntu0.20.04.1)
OS:           Linux 5.13.0-52-generic amd64

安装Foonathan memory

$ git clone https://github.com/eProsima/foonathan_memory_vendor.git
$ cd foonathan_memory_vendor
$ mkdir build && cd build
$ cmake ..
$ sudo cmake --build . --target install

3.1.2 eProsima Fast DDS版本

  • Ubuntu 18.04: Fast RTPS 1.8.4 (or later) and Fast-RTPS-Gen 1.0.4 (not later!).
  • Ubuntu 20.04: Fast DDS 2.0.2 (or later) and Fast-RTPS-Gen 1.0.4 (not later!).

TIP
Remember (again) you only need to install Fast DDS if you are not using ROS 2 and just want to leverage non-ROS2 DDS networks and applications.

3.2 二进制安装eProsima Fast DDS v2.7.0版本

注:推荐采用二进制安装,一般发布的二进制版本都会进行比较完善的测试。除非您对这个源代码非常熟悉,那么可以忽略我们的担忧。

3.2.1 官网下载最新eProsima_Fast-DDS版本

鉴于我们采用ubuntu20.04,以及官网最新二进制发布件为2.7.0,满足前提条件>=2.0.2要求。

3.2.2 安装eProsima_Fast-DDS

使用下面命令进行安装

注:建议使用迅雷,速度快点,且文件名比较标准,wget下来的文件名需要重命名。如果链接出现问题,请直接从官网下载链接进去。

$ mkdir eProsima_Fast-DDS-v2.7.0-Linux
$ wget https://www.eprosima.com/index.php/component/ars/repository/eprosima-fast-dds/eprosima-fast-dds-2-7-0/eprosima_fast-dds-v2-7-0-linux-tgz?format=raw 
$ tar zxvf eProsima_Fast-DDS-v2.7.0-Linux.tgz  //解压二进制
$ sudo ./install.sh  //需要一段时间,请耐心等待

安装完成可以简单测试下以下命令是否已经在系统中。

$ fastdds -h
usage: fastdds <command> [<command-args>]

    Commands:

        discovery     Server-Client discovery auxiliary generator

        shm           Shared-memory commands

    fastdds <command> [-h] shows command usage


positional arguments:
  command     Command to run

optional arguments:
  -h, --help  show this help message and exit

$ fastddsgen -help
openjdk version "11.0.15" 2022-04-19
OpenJDK Runtime Environment (build 11.0.15+10-Ubuntu-0ubuntu0.20.04.1)
OpenJDK 64-Bit Server VM (build 11.0.15+10-Ubuntu-0ubuntu0.20.04.1, mixed mode, sharing)
fastddsgen usage:
        fastddsgen [options] <file> [<file> ...]
        where the options are:
                -help: shows this help
                -version: shows the current version of eProsima Fast DDS gen.
                -example <platform>: Generates a solution for a specific platform (example: x64Win64VS2015)
                        Supported platforms:
                         * i86Win32VS2013
                         * x64Win64VS2013
                         * i86Win32VS2015
                         * x64Win64VS2015
                         * i86Linux2.6gcc
                         * x64Linux2.6gcc
                         * armLinux2.6gcc
                         * CMake
                -replace: replaces existing generated files.
                -ppDisable: disables the preprocessor.
                -ppPath: specifies the preprocessor path.
                -typeros2: generates type naming compatible with ROS2.
                -I <path>: add directory to preprocessor include paths.
                -d <path>: sets an output directory for generated files.
                -t <temp dir>: sets a specific directory as a temporary directory.
                -typeobject: generates TypeObject files to automatically register the types as dynamic.
                -cs: IDL grammar apply case sensitive matching.
                -test: executes FastDDSGen tests.
                -python: generates python bindings for the generated types.
        and the supported input files are:
        * IDL files.

3.2.3 配合Debug下载 Fast DDS Monitor

有windows/linux等版本可供下载,这个安装使用相对简单,请自行研究(详见eprosima官网)。

3.3 源代码安装eProsima Fast DDS Gen v1.0.4版本

直接从源代码下载,但是安装命令做了调整(可能是ubuntu的默认gradle的版本太高了(不兼容)

git clone --recursive https://github.com/eProsima/Fast-DDS-Gen.git -b v1.0.4 Fast-RTPS-Gen \\
    && cd Fast-RTPS-Gen \\
    && ./gradlew assemble \\
    && sudo env "PATH=$PATH" ./gradlew install
$ git log -n 1
commit 56044ae7c493834f4789893a360c6df28642691e (HEAD, tag: v1.0.4)
Author: Miguel Company <miguelcompany@eprosima.com>
Date:   Wed Apr 1 09:52:58 2020 +0200

    Bump version to 1.0.4

$ /usr/local/bin/fastrtpsgen -version
openjdk version "11.0.15" 2022-04-19
OpenJDK Runtime Environment (build 11.0.15+10-Ubuntu-0ubuntu0.20.04.1)
OpenJDK 64-Bit Server VM (build 11.0.15+10-Ubuntu-0ubuntu0.20.04.1, mixed mode, sharing)
fastrtpsgen version 1.0.4

4. Fast RTPS(DDS)应用

4.1 Fast RTPS(DDS) ROS 2应用

ROS 2应用涉及广泛,这里不展开讨论,后续有时间再做进一步研究 TBD。

For information about how to use this interface within the ROS 2 applications and development workflows, see PX4-ROS 2 bridge.

4.2 Fast RTPS(DDS) 非ROS应用

4.2.1 配置uORB消息

生成的Fast RTPS(DDS) 代码将允许通过RTPS发布/订阅uORB主题的指定子集,无论是否部署ROS应用程序。

对于自动代码生成,PX4在PX4-Autopilot/msg/tools/uorb_rtps_message_ids.yaml定义了要与RTPS一起使用的uORB消息集,消息是要发送、接收还是两者都要发送,以及要在DDS/RTPS中间件中使用的消息的RTPS ID。

Note
It’s essential to note that every RTPS message needs an ID to be set in this file.

4.2.2 构建Client (PX4/PX4-Autopilot)

编译命令

$ make px4_sitl_rtps

启动环境

$ make px4_sitl_rtps jmavsim

模拟环境下,micrortps_client命令参数

pxh> micrortps_client 
Usage: micrortps_client <command> [arguments...]
 Commands:

   start
     [-t <val>]  Transport protocol
                 values: UART|UDP, default: UART
     [-d <val>]  Select Serial Device
                 values: <file:dev>, default: /dev/ttyACM0
     [-b <val>]  Baudrate (can also be p:<param_name>)
                 default: 460800
     [-m <val>]  Maximum sending data rate in B/s (0=not limited)
                 default: 0
     [-p <val>]  Poll timeout for UART in milliseconds
                 default: 1
     [-l <val>]  Limit number of iterations until the program exits (-1=infinite)
     [-w <val>]  Iteration time for data publishing to the uORB side, in microseconds
                 default: 1000
     [-r <val>]  Select UDP Network Port for receiving (local)
                 default: 2019
     [-s <val>]  Select UDP Network Port for sending (remote)
                 default: 2020
     [-i <val>]  Select IP address (remote)
                 values: <x.x.x.x>, default: 127.0.0.1
     [-f]        Activate UART link SW flow control
     [-h]        Activate UART link HW flow control
     [-v]        Add more verbosity

   stop

   status

4.2.3 构建Agent (Offboard)

编译命令

$ cd build/px4_sitl_rtps/src/modules/micrortps_bridge/micrortps_agent
$ mkdir -p build && cd build
$ cmake ..
$ make

Offboard环境(PC),micrortps_agent命令参数

$ ./micrortps_agent -h
--- MicroRTPS Agent ---
usage: ./micrortps_agent [options]

  -b <baudrate>           UART device baudrate. Defaults to 460800
  -d <device>             UART device. Defaults to /dev/ttyACM0
  -f <sw-flow-control>    Activates UART link SW flow control
  -g <hw-flow-control>    Activates UART link HW flow control
  -i <ip-address>         Target remote IP address for UDP. Defaults to 127.0.0.1
  -n <namespace>          Topics namespace. Identifies the vehicle in a multi-agent network
  -o <poll-ms>            UART polling timeout in milliseconds. Defaults to 1ms
  -r <reception-port>     UDP port for receiving (local). Defaults to 2020
  -s <sending-port>       UDP port for sending (remote). Defaults to 2019
  -t <transport>          [UART|UDP] Defaults to UART
  -v <increase-verbosity> Add more verbosity
  -w <sleep-time-us>      Iteration time for data publishing to the DDS world, in microseconds.
                           Defaults to 1us
     <ros-args>           (ROS2 only) Allows to pass arguments to the timesync ROS2 node.
                           Currently used for setting the usage of simulation time by the node using
                           '--ros-args -p use_sim_time:=true'

注:如果发现有so没有找到,请看下LD_LIBRARY_PATH是否正确。尝试使用“export LD_LIBRARY_PATH=/usr/local/lib/”解决问题。

4.2.4 构建Application (Offboard)

构建示例监听应用

$ cd build/px4_sitl_rtps/src/modules/micrortps_bridge
$ mkdir -p micrortps_listener
$ cd micrortps_listener
$ fastrtpsgen -example x64Linux2.6gcc ../micrortps_agent/idl/debug_vect.idl
$ make -f makefile_x64Linux2.6gcc

注:如果发现有so没有找到,请看下LD_LIBRARY_PATH是否正确。尝试使用“export LD_LIBRARY_PATH=/usr/local/lib/”解决问题。

4.2.5 测试验证(PX4 --> Offboard)

4.2.5.1 配置从PX4飞控板向Offboard发出uORB消息:

msg\\tools\\urtps_bridge_topics.yaml
39   - msg:     debug_vect
40     send:    true
build\\px4_sitl_rtps\\src\\modules\\micrortps_bridge\\micrortps_listener\\debug_vectSubscriber.cxx
59     Rparam.topic.topicName = "fmu/debug_vect/out";

4.2.5.2 重新编译Client和Agent

略,参考章节4.2.4和4.2.3.

4.2.5.3 验证结果

4.2.6 测试验证(Offboard --> PX4)

4.2.6.1 配置从Offboard向PX4飞控板发出uORB消息:

msg\\tools\\urtps_bridge_topics.yaml
39   - msg:     debug_vect
40     receive: true
build\\px4_sitl_rtps\\src\\modules\\micrortps_bridge\\micrortps_listener\\debug_vectPublisher.cxx
63     Wparam.topic.topicName = "fmu/debug_vect/in";

4.2.6.2 修改debug_vectPublisher.cxx文件

为了便于调试辨识,修改文件build\\px4_sitl_rtps\\src\\modules\\micrortps_bridge\\micrortps_listener\\debug_vectPublisher.cxx。新增三行代码,是的xyz值,跟随发送次数增加而增加。

111			st.x_( 7.0f * msgsent);
112			st.y_( 6.0f * msgsent);
113			st.z_( 5.0f * msgsent);

4.2.6.3 重新编译Client和Agent

略,参考章节4.2.4和4.2.3.

4.2.6.4 验证结果

这里通过一个Offboard–>PX4–>MAVLink–>QGroundControl来证明,消息已经从Offboard发送到PX4.

5.参考资料

【1】Fast-DDS-Installation
【2】PX4-Fast RTPS(DDS) Bridge
【3】Fast-DDS Github

以上是关于PX4模块设计之六:PX4-Fast RTPS(DDS)简介的主要内容,如果未能解决你的问题,请参考以下文章

PX4模块设计之二十:PX4应用平台初始化

PX4模块设计之二:uORB消息代理

PX4模块设计之十:PX4启动过程

PX4模块设计之九:PX4飞行模式简介

PX4模块设计之三:自定义uORB消息

PX4模块设计之四十五:param模块