最近在给AcmeGCS添加ROS2的接口支持,使AcmeGCS可以直接与ROS2节点通信,显示控制ROS2机器人。
为了开发AcmeGCS ROS2Bridge功能研究了一下PX4的ROS2Bridge模块,与同学们分享一下PX4的ROS2桥接功能。
不知道同学们是否开始使用ROS2进行机器人应用的开发,或者使用ROS2进行PX4记载任务的开发。
ROS2在2015年发布首个测试版本,目前也已经发展了很多年,功能和稳定性都已经比较不错。最近开始全面拥抱ROS2,很多开发逐渐由ROS转到ROS2中。
PX4在2017年即开发了ROS2的bridge模块,在src/modules/micrortps_bridge路径下,它的文档可以参考
https://docs.px4.io/master/en/middleware/micrortps.html
默认的编译配置没有编译这个模块,可以使用rtps的编译对象:
# 编译px4_fmu-v4硬件
make px4_fmu-v4_rtps
# 编译sitl
make px4_sitl_rtps
编译完成后在build目录中会自动生成microRTPS_agent 和 microRTPS_client代码,microRTPS_client运行在PX4中,microRTPS_agent运行在ROS2中,用于ROS2与PX4的microRTPS_client进行Bridge通信。
不过在编译microRTPS_agent出现一个错误,
46:10: fatal error: Timesync_Publisher.h: 没有那个文件或目录
我的编译环境为:ubuntu20.04,ROS2-foxy,java-11.0.14,gradle-6.3,配置和文档中是一致的,依然有这样的错误,如果有了解的朋友能帮忙解答一下,感谢。
不过这个问题并不影响我们使用PX4的ROS2Bridge功能,microRTPS_agent是一个由PX4自动生成的ROS2 agent应用,PX4也提供了一个独立的ROS2包实现这个功能,为 px4_ros_com https://github.com/PX4/px4_ros_com。
px4_ros_com与PX4的ROS2Bridge的结构框图如图所示:
PX4使用MicroCDR进行消息的序列化,并实现microRTPS协议。
这里涉及一些在ROS2中常见的消息中间件名词,如:CDR、DDS、RTPS、XRCE-DDS等,这些在 AcmeIot-3-在嵌入式设备中运行ROS2 分享中也描述,感兴趣的可以看看,也有关于ROS2框架的描述。
PX4的这个micrortps_bridge模块只能转发指定的uORB消息到ROS2,转发msg定义在 msg/tools/urtps_bridge_topics.yaml文件中,不能自动转发所有的uORB消息。
–
我的微信公众号,文章同步更新,欢迎关注。