发布时间:2026/8/21 20:33:06
【飞控开发实战·㉑】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/8/21 20:28:06

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

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

2026/8/21 20:28:06

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

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

2026/8/21 21:53:14

BEVFusion模型本地部署实战:从PyTorch到TensorRT的完整流程

这次我们来看一个实战项目:如何在本地环境中,使用 CUDA 和 TensorRT 来部署一个名为 BEVFusion 的模型。BEVFusion 是一个典型的感知模型,常用于自动驾驶等场景,它融合了相机和激光雷达的数据,在鸟瞰图(BEV…

2026/8/21 21:53:14

Iwara4A 上手 3 步:Iwara 安卓客户端安装配置完整教程

Iwara4A 上手 3 步:Iwara 安卓客户端安装配置完整教程 【免费下载链接】iwara4a 基于Jetpack Compose开发的iwara安卓app (Unofficial Iwara Android Application) 项目地址: https://gitcode.com/gh_mirrors/iw/iwara4a Iwara4A 是一个基于 Jetpack Compose…

2026/8/21 21:53:14

连锁企业扩张,如何开展高效的招聘工作

连锁企业扩张期最头疼的,是几百家门店各招各的,总部看不到数据、简历无法共享、离职员工二次入职还要重新建档。传统分散式招聘已无法支撑规模化扩张,一套能打通总部与终端、沉淀人才资产的统一招聘管理系统成为刚需。 2026年主流连锁招聘系…

2026/8/21 21:48:14

构建高可用机场服务系统:Spring Cloud微服务架构与韧性设计实践

在机场技术系统的设计与开发中,我们常常面临一个核心挑战:如何在用户处于时间紧迫、环境陌生、流程复杂的“压力情境”下,依然提供稳定、流畅、可靠的数字化服务体验。这里的“压力”并非指强制,而是指在航班延误、安检排队、转机…

2026/8/21 13:13:49

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/21 20:14:07

工业传感器与变送器详解:序章 从物理世界到工业数据

序章 从物理世界到工业数据 ——重新认识工业传感器与变送器 工业自动化系统正变得日益复杂。今天的工业现场早已不是简单的控制回路,而是由多层技术共同构成的立体体系:PLC、DCS、SCADA、MES、工业互联网、边缘计算与人工智能。控制系统可以执行复杂算法,工业网络可以实现…

2026/8/21 0:03:13

Linux命令-uucico(UUCP传输程序)

Linux命令-uucico(UUCP传输程序) 🔰简介UUCP 体系简介 📖语法⚙️选项配置文件 💡示例示例 1:基本传输操作示例 2:主模式与从模式示例 3:调试与故障排查示例 4:UUCP 配置…

2026/8/21 0:03:13

Linux命令-uupick(UUCP文件接收工具)

Linux命令-uupick(UUCP文件接收工具)🔰简介uupick 在 UUCP 传输链中的位置📖语法⚙️选项交互命令💡示例示例 1:基本接收操作示例 2:仅处理来自特定系统的文件示例 3:完整 UUCP 文件…

2026/8/21 15:40:01

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/21 15:40:01

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/21 0:31:27

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…