本文参考官网: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/
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_agentmicrortps_agent的源代码虽然在构建PX4的目标程序时是自动生成出来的,但是没有生成它的二进制,因为micrortps_agent通常是运行在offboard计算机中的,需要把源程序拿到offboard计算机中编译。
micrortps_agent与仿真环境运行在同一台计算机(宿主机)时,编译命令如下:
cd build/
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对话题的定义。



