栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

PX4的中间件Fast DDS

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

PX4的中间件Fast DDS

本文参考官网:RTPS/DDS Interface: PX4-Fast RTPS(DDS) Bridge | PX4 User Guide

1. 什么是Fast DDS中间件 ?

Fast DDS是eProsima公司的一个开源的中间件产品,是OMG组织制定的数据分发服务规范(DDS)和实时发布订阅(RTPS)协议的C++实现。

Fast DDS以前叫Fast RTPS,RTPS是Realtime Publish Subscribe的缩写 。

在PX4系统中,Fast DDS为自动驾驶仪建立了实时的发布订阅接口,可以使各种自动驾驶仪内部组件与offboard计算机(或者与offboard计算机有连接的计算机)中的 Fast DDS应用程序之间实时交换PX4中的uORB消息。

2. MicroRPTS Bridge (桥)

micrortps_bridge在PX4与DDS应用程序之间交换信息。如图所示,uORB消息在PX4这一端,DDS消息在offboard计算机这一端,他们之间在做交换,交换时需要转换和传输。

在PX4系统中,micrortps_bridge由micrortps_client、micrortps_agent以及一组代码生成工具组成;桥的两端,一端是自驾仪中的PX4,另一端是offboard计算机中的DDS应用程序。

2.1 MicroRTPS Client(客户端)

micrortps_client作为一个后台进程驻留在PX4系统中。它订阅PX4组件发布的uORB话题,通过串口或者UDP口将由此话题更新而产生的信息发送给micrortps_agent,另外它也接收micrortps_agent发送给它的消息,并作为uORB消息发布给PX4系统。

2.2 MicroRTPS Agent(代理)

micrortps_agent作为一个后台进程运行在offboard计算机中。micrortps_agent监视来自micrortps_client的uORB更新消息,然后把这些消息通过RTPS协议再发布给DDS应用程序,另外,micrortps_agent订阅来自其他DDS应用程序的DDS消息,并且转送给micrortps_client。

2.3 MicroRTPS代理/客户端之间的通讯

micrortps_agent和micrortps_client之间通过串行线或者UDP网络相连,uORB消息在被传输之前被CDR序列化编码(CDR serialization提供了一种在不同平台之间传送数据的通用格式)。

micrortps_agent与任何DDS应用之间通过UDP连接,有可能在一台机器上,也有可能在不同机器之间。典型的配置是micrortps_agent与DDS应用在同一个系统中(比如:一个开发计算机,Linux协同计算机,或者是一个计算机单板机),这个系统与micrortps_client相连,可以通过Wifi或者USB串口。

2.4 代码生成工具

这节请参考官网文章。

建立、构建并且使用Fast DDS中间件的所有代码都是在编译PX4目标代码时自动生成的。

源码级安装两种代码生成工具:fastdds和fastrtpsgen。在安装这两个工具之前,需要安装:

  • Gradle,是一个构建工具,官网说不要安装7.0以上版本,最好是6.3,用sdkman安装最方便。sdkman是java开发工具的管理软件,安装sdkman时,要保证计算机联网。

  • jdk 11

  • Foonathan memory,这是一个C++基于对象的内存管理软件。

然后,

克隆Fast DDS-2.0.2源代码,然后编译并安装到/usr/local/bin中,程序名:fastdds。

克隆Fast-RTPS-Gen 1.04,然后编译并安装到/usr/local/bin中,程序名:fastrtpsgen。

Fast-RTPS-Gen(程序名:fastrtpsgen)是Fast DDS IDL代码生成工具。

3. 构建并运行一个Fast DDS应用程序 3.1 构建micrortps_bridge

在构建具备Fast DDS中间件的PX4的目标程序时,如果是真实硬件Pixhawk 4,则构建命令是make px4_fmu-v5_rtps,如果是仿真环境,构建命令是make px4_sitl_rtps。

在构建PX4的目标程序的过程中生成了micrortps_client以及micrortps_agent的源程序。源程序分别放在build//src/modules/micrortps_bridge目录下的micrortps_client和micrortps_agent子目录下。

3.1.1. micrortps_client

micrortps client不需要用手工构建,PX4在编译生成目标程序时就已经生成了它的二进制程序px4_micrortps_client,并保存在build/bin中,这个程序可以在PX4的真实硬件环境中的Nuttx Shell中运行,也可以在仿真环境中的pxh Shell中运行。比如:

pxh>micrortps_client start -t UDP。

注意:运行gazebo或者jmavsim仿真程序时(比如:make px4_sitl_rtps gazebo),micrortps_client在PX4 1.13版固件下是自动启动,1.12版固件下则需要手工启动。

3.1.2 micrortps_agent

micrortps_agent的源代码虽然在构建PX4的目标程序时是自动生成出来的,但是没有生成它的二进制,因为micrortps_agent通常是运行在offboard计算机中的,需要把源程序拿到offboard计算机中编译。

micrortps_agent与仿真环境运行在同一台计算机(宿主机)时,编译命令如下:

cd build//src/modules/micrortps_bridge/micrortps_agent

mkdir build && cd build

cmake ..

make

运行命令:

$micrortps_agent -t UDP

3.1.3 关于yaml文件

micrortps_client和micrortps_agent,一个是客户端一个是服务器端,两边交换的信息是依据PX4的uorb话题而定义的,在编译PX4的RTPS目标程序时,RTPS能处理的uorb话题将根据文件PX4-Autopilot/msg/tools/uorb_rtps_message_ids.yaml的定义产生一组对应的IDL接口文件(被保存在目录build/px4_sitl_rtps/src/modules/micrortps_bridge/micrortps_agent/idl下),然后编译过程再根据这组IDL接口文件生成micrortps_client以及micrortps_agent的源代码。

在micrortps环境下,哪些话题可以交换?是接收还是发送?在uorb_rtps_message_ids.yaml(PX4的1.12版本)中定义

比如(1.12版本格式,1.13版本没有id):

msg: sensor_combined

id: 65

send: true

代表sensor_combined这个话题需要有一个idl定义,另外需要生成Publish这个话题的代码。

比如:

msg: telemetry_status

id: 76

receive: true

代表telemetry_status这个话题需要一个idl定义,另外需要生成Subscribe这个话题的代码。

PX4能处理的uORB话题有200多个,而1.12版本RTPS处理的话题是31个。

注:1.13.0d的yaml文件格式已经与1.12.0d不一样了,取消了id这个域,yaml的文件名改成了urtps_bridge_topics.yaml,yaml只存放RTPS中间件处理的uORB消息,没有需要接收或发送的uORB话题就不放在这个yaml文件中了。id在程序内部还是有的,但是由uorb_rtps_classifier.py根据msg在yaml中的顺序产生。

3.2 构建并运行Fast DDS应用程序

一旦micrortps_client和micrortps_agent运行起来,并连接正常,Fast DDS的应用程序就可以通过RTPS协议订阅和发布PX4的uorb话题相关的数据。Fast DDS应用程序的一个例子可以用fastrtpsgen生成,这个例子的功能是打印输出sensor_combined话题:

cd /path/to/PX4/PX4-Autopilot

cd build/px4_sitl_rtps/src/modules/micrortps_bridge

mkdir micrortps_listener

cd micrortps_listener

fastrtpsgen -example x64Linux2.6gcc ../micrortps_agent/idl/sensor_combined.idl

生成出的例子代码可以用以下命令编译,执行:

make -f makefile_x64Linux2.6gcc

binsensor_combined_PublisherSubscriber subscriber,名字不对了,应该是bin/*/sensor_combinedPublisherSubscriber subscriber。

  • 官网上贴出的源程序,init()函数中订阅话题名字是“fmu/sensor_combined/out”,但是1.12.0d版,生成程序中init()函数中订阅话题名字是“sensor_combinedPubSubTopic“。
  • 官网上贴出的源程序

void sensor_combinedSubscriber::SubListener::onNewDataMessage(Subscriber* sub)

函数打印话题sensor_combined中的内容,但是这个话题与实际1.12.0d版本固件中提供的话题不太一样了,1.12中的sensor_combined只有gyro(罗盘)和accelerometer(加速度)计的内容,但不包括:magnetometer(地磁计)和baro(气压计)相关内容。参见文件PX4-Autopilot/msg/sensor_combined.msg对话题的定义。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/891226.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号