【飞控开发实战·㉑】MAVROS2与MicroXRCE-DDS桥接:ROS2与PX4通信链路搭建与方案对比

发布时间:2026/10/24 16:09:08

【飞控开发实战·㉑】MAVROS2与MicroXRCE-DDS桥接:ROS2与PX4通信链路搭建与方案对比 21.1 MAVROS2 概述与安装21.2 MAVROS2 话题与服务映射核心话题映射表核心服务映射表21.3 通过 MAVROS2 获取飞控状态#!/usr/bin/env python3drone_state_monitor.py - 无人机状态监控节点import rclpyfrom rclpy.node import Nodefrom sensor_msgs.msg import Imu, NavSatFix, BatteryStatefrom geometry_msgs.msg import PoseStamped, TwistStampedfrom mavros_msgs.msg import State, VFR_HUDimport mathclass DroneStateMonitor(Node):def __init__(self):super().__init__(drone_state_monitor)self.state State()self.pose PoseStamped()self.velocity TwistStamped()self.gps NavSatFix()self.battery BatteryState()self.hud VFR_HUD()self.create_subscription(State, /mavros/state,lambda m: setattr(self, state, m), 10)self.create_subscription(PoseStamped, /mavros/local_position/pose,lambda m: setattr(self, pose, m), 10)self.create_subscription(TwistStamped, /mavros/local_position/velocity_local,lambda m: setattr(self, velocity, m), 10)self.create_subscription(NavSatFix, /mavros/global_position/global,lambda m: setattr(self, gps, m), 10)self.create_subscription(BatteryState, /mavros/battery,lambda m: setattr(self, battery, m), 10)self.create_subscription(VFR_HUD, /mavros/vfr_hud,lambda m: setattr(self, hud, m), 10)self.create_timer(1.0, self.print_summary)self.get_logger().info(飞控状态监控节点已启动)def quat_to_euler(self, x, y, z, w):roll math.degrees(math.atan2(2*(w*xy*z), 1-2*(x*xy*y)))pitch math.degrees(math.asin(max(-1, min(1, 2*(w*y-z*x)))))yaw math.degrees(math.atan2(2*(w*zx*y), 1-2*(y*yz*z)))return roll, pitch, yawdef print_summary(self):q self.pose.pose.orientationr, p, y self.quat_to_euler(q.x, q.y, q.z, q.w)pos self.pose.pose.positionvel self.velocity.twist.linearself.get_logger().info(f\n--- ZP_H743 状态 ---f\n 连接:{self.state.connected} 模式:{self.state.mode} 解锁:{self.state.armed}f\n 位置: ({pos.x:.2f}, {pos.y:.2f}, {pos.z:.2f}) mf\n 姿态: ({r:.1f}, {p:.1f}, {y:.1f}) degf\n 速度: ({vel.x:.2f}, {vel.y:.2f}, {vel.z:.2f}) m/sf\n GPS: {self.gps.latitude:.7f}, {self.gps.longitude:.7f}, {self.gps.altitude:.1f}mf\n 电池: {self.battery.voltage:.1f}V {self.battery.percentage*100:.0f}%)def main(argsNone):rclpy.init(argsargs)node DroneStateMonitor()try:rclpy.spin(node)except KeyboardInterrupt:passfinally:node.destroy_node()rclpy.shutdown()if __name__ __main__:main()21.4 通过 MAVROS2 发送控制指令#!/usr/bin/env python3drone_commander.py - 无人机指令控制器import rclpyfrom rclpy.node import Nodefrom mavros_msgs.srv import CommandBool, CommandTOL, SetMode, WaypointPushfrom mavros_msgs.msg import State, Waypointfrom geometry_msgs.msg import PoseStampedimport timeclass DroneCommander(Node):def __init__(self):super().__init__(drone_commander)self.current_state State()self.create_subscription(State, /mavros/state,lambda m: setattr(self, current_state, m), 10)self.setpoint_pub self.create_publisher(PoseStamped, /mavros/setpoint_position/local, 10)self.arm_client self.create_client(CommandBool, /mavros/cmd/arming)self.takeoff_client self.create_client(CommandTOL, /mavros/cmd/takeoff)self.land_client self.create_client(CommandTOL, /mavros/cmd/land)self.mode_client self.create_client(SetMode, /mavros/set_mode)self.mission_client self.create_client(WaypointPush, /mavros/mission/push)self.get_logger().info(指令控制器已启动)def wait_for_connection(self, timeout10.0):start time.time()while not self.current_state.connected:if time.time() - start timeout:return Falserclpy.spin_once(self, timeout_sec0.5)return Truedef set_mode(self, mode):req SetMode.Request()req.custom_mode modefuture self.mode_client.call_async(req)rclpy.spin_until_future_complete(self, future)ok future.result() and future.result().mode_sentself.get_logger().info(f模式切换 {成功 if ok else 失败}: {mode})return okdef arm(self):req CommandBool.Request()req.value Truefuture self.arm_client.call_async(req)rclpy.spin_until_future_complete(self, future)ok future.result() and future.result().successself.get_logger().info(f{解锁 if ok else 解锁失败})return okdef takeoff(self, altitude):req CommandTOL.Request()req.altitude altitudefuture self.takeoff_client.call_async(req)rclpy.spin_until_future_complete(self, future)ok future.result() and future.result().successself.get_logger().info(f起飞 {成功 if ok else 失败} - {altitude}m)return okdef land(self):req CommandTOL.Request()future self.land_client.call_async(req)rclpy.spin_until_future_complete(self, future)ok future.result() and future.result().successself.get_logger().info(f降落指令 {已发送 if ok else 失败})return okdef upload_mission(self, waypoints):上传航点任务, waypoints: [{lat:..,lon:..,alt:..,command:16}, ...]req WaypointPush.Request()for i, wp in enumerate(waypoints):w Waypoint()w.frame wp.get(frame, 3) # GLOBAL_REL_ALTw.command wp.get(command, 16)w.is_current (i 0)w.autocontinue Truew.param1 wp.get(param1, 0.0)w.param4 wp.get(param4, 0.0)w.x_lat wp[lat]w.y_long wp[lon]w.z_alt wp[alt]req.waypoints.append(w)future self.mission_client.call_async(req)rclpy.spin_until_future_complete(self, future)result future.result()if result and result.success:self.get_logger().info(f任务上传成功: {result.wp_transferred} 个航点)return Trueself.get_logger().error(任务上传失败)return False21.5 PX4 原生 DDS 方案——MicroXRCE-DDS Agent 桥接PX4 v1.14 提供基于 DDS 的原生通信方案通过 MicroXRCE-DDS Agent 将飞控内部 uORB 消息直接映射到 ROS2 DDS 域绕过 MAVLink 层。机载计算机: ROS2 节点 --DDS-- MicroXRCE-DDS Agent|UDP/Serial|飞控 STM32H743: PX4 模块 --uORB-- XRCE Client# 安装 MicroXRCE-DDS Agentgit clone https://github.com/eProsima/Micro-XRCE-DDS-Agent.gitcd Micro-XRCE-DDS-Agent mkdir build cd buildcmake .. make sudo make install sudo ldconfig# 启动 AgentUDP 模式MicroXRCEAgent udp4 -p 8888# 串口模式MicroXRCEAgent serial --serial /dev/ttyUSB0 --baud 921600### 21.6 MicroXRCE-DDS 配置与 uORB 话题直连uORB 话题与 ROS2 映射# 安装 PX4 消息包cd ~/ros2_ws/srcgit clone https://github.com/PX4/px4_msgs.gitgit clone https://github.com/PX4/px4_ros_com.gitcd ~/ros2_ws colcon build --packages-select px4_msgs px4_ros_com#!/usr/bin/env python3xrce_drone_monitor.py - 通过 XRCE-DDS 获取飞控数据import rclpyfrom rclpy.node import Nodefrom px4_msgs.msg import VehicleAttitude, VehicleLocalPosition, VehicleStatusclass XRCEDroneMonitor(Node):def __init__(self):super().__init__(xrce_drone_monitor)self.attitude Noneself.position Noneself.create_subscription(VehicleAttitude, /fmu/out/vehicle_attitude,lambda m: setattr(self, attitude, m), 10)self.create_subscription(VehicleLocalPosition, /fmu/out/vehicle_local_position,lambda m: setattr(self, position, m), 10)self.create_timer(1.0, self.print_status)self.get_logger().info(XRCE-DDS 监控节点已启动)def print_status(self):if self.attitude and self.position:q self.attitude.qself.get_logger().info(f\n--- XRCE-DDS 状态 ---f\n 四元数: [{q[0]:.4f}, {q[1]:.4f}, {q[2]:.4f}, {q[3]:.4f}]f\n 位置: ({self.position.x:.2f}, {self.position.y:.2f}, {self.position.z:.2f})f\n 高度有效: {self.position.z_valid})def main(argsNone):rclpy.init(argsargs)rclpy.spin(XRCEDroneMonitor())rclpy.shutdown()if __name__ __main__:main()21.7 MAVROS2 vs MicroXRCE-DDS 方案对比选型建议生产稳定环境选 MAVROS2追求最低延迟且使用 PX4 v1.14 选 XRCE-DDS需要两者优势可混合方案MAVROS2 远程 XRCE 本地高频数据。
延伸阅读

更多相关文章

2026/10/22 21:47:24

fanqienovel-downloader 完整上手指南:把整本番茄小说存到本地

fanqienovel-downloader 完整上手指南:把整本番茄小说存到本地 【免费下载链接】fanqienovel-downloader 下载番茄小说 项目地址: https://gitcode.com/gh_mirrors/fa/fanqienovel-downloader 追更到一半的小说突然下架,或者地铁里信号差得刷不出…

2026/10/22 20:21:24

OpenDocMan上手指南:带版本追踪和权限控制的文档管理系统

OpenDocMan上手指南:带版本追踪和权限控制的文档管理系统 【免费下载链接】opendocman OpenDocMan - Free PHP Document Management System DMS 项目地址: https://gitcode.com/gh_mirrors/op/opendocman 共享盘里的文件总是乱糟糟。谁改过,哪个版…

2026/10/24 16:05:19

网络分析仪校准的本质:系统误差建模与Smart Cal避坑

简介:《Keysight 网络分析仪基本校准操作指导》是一份面向射频微波测试工程师、计量与研发调试人员的PDF操作文档,针对ENA E5080B及PNA、P50xx、P937x、PXI板卡式等统一界面的网络分析仪,梳理基本校准流程与关键配置要点。压缩包内仅含1个PDF…

2026/10/24 16:05:19

64GFC光物理层:PAM4、OMAouter与FEC误码门限解析

简介:面向光通信、存储网络及高速接口协议研发测试人员,这份美国国家标准学会发布的FC-PI-7 Rev 0.04规范聚焦64GFC光纤链路物理层,可用于理解高速Fibre Channel对信号编码、电气与光学接口、测试方法及互操作性的要求。压缩包仅含1个PDF文件…

2026/10/24 16:05:19

Grübler公式算错自由度?从球面四连杆看约束流形与机构自由度

简介:这份PDF版课后习题答案专为学习《现代机器人学》的本科生、研究生及机器人方向工程师准备,覆盖第2章至第13章全部习题解答,内容涉及运动学、动力学、路径规划与控制策略等核心模块。文件从运动学基础切入,如第2章通过多点定位…

2026/10/24 16:05:19

内容管理系统源码解析:从本地跑通到二次开发实战

简介:这是一套免费开源的CMS内容管理系统源码,面向希望快速搭建网站或进行二次开发的个人开发者与中小企业技术团队。系统基于Java技术构建,采用前后台分离的代码结构,后台涵盖内容发布、用户管理与权限控制等核心逻辑&#xff0c…

2026/10/24 16:05:19

Delphi Excel引擎源码解析:从渲染卡顿修复到自定义公式开发

简介:本资源为DevExpress ExpressSpreadSheet v1.38版本的完整Delphi与C Builder(BCB)源代码包,面向中高级桌面应用开发者,解决电子表格功能深度集成、性能调优及UI样式定制等核心开发需求。包内共382个文件&#xff0…

2026/10/24 16:00:18

6G网络架构白皮书解读:从40个网元到4个单元的极简重构

简介:这份PDF白皮书由中国电信研究院与中兴通讯于2023年联合发布,面向通信行业研究者、网络架构师及高校师生,系统探讨6G网络的设计理念、总体架构与创新特征,为理解下一代通信网络提供前瞻性参考。资源包共1个PDF文件&#xff0c…

2026/10/23 22:56:35

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/24 0:02:40

MATLAB缩进快捷键与批量格式化实战指南

1. 被自动缩进折磨的那些年如果你写过MATLAB代码,大概率经历过这种场景:从某个文档、网页或者聊天记录里复制了一段代码,粘贴进编辑器之后,每一行前面都带着莫名其妙的空格,有的行首是四个空格,有的是一个T…

2026/10/24 0:02:40

用Poco实现Qt风格信号与槽的跨平台C++方案

简介:本资源是一份面向C中级开发者的技术实践工程,聚焦于在非Qt框架环境下模拟实现Qt核心通信机制——信号与槽,借助Poco网络库的事件系统完成解耦式对象通信。适用于需在跨平台C项目中引入松耦合回调机制、但受限于无法集成Qt依赖的开发场景…

2026/10/24 0:02:40

ESXi裸机虚拟化安装指南:从硬件兼容到虚拟机部署

1. 为什么还要折腾ESXi:从一台闲置机器说起手里攒了几台淘汰下来的迷你主机,配置不算差,i5加16G内存,扔了可惜,装个桌面系统又觉得浪费。这种场景下,ESXi就成了一个绕不开的选择。它是一套裸机虚拟化平台&a…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑