PX4 RaptorInput uORB 消息详解:Raptor 基础策略的精确输入接口与调试指南
嵌入式物联网机器人自动驾驶智能硬件【免费下载链接】PX4-AutopilotPX4 Autopilot Software项目地址https://gitcode.com/gh_mirrors/px/PX4-Autopilot点击查看免费下载RaptorInput 是 PX4 自动驾驶仪中专门为 Raptor 基础策略Raptor foundation policy一种基于强化学习的多旋翼飞行控制策略设计的 uORB 消息用于记录并对外发布策略执行时所需的全部观测输入。本文以 docs/en/msg_docs/RaptorInput.md 为主干结合mc_raptor模块源码src/modules/mc_raptor与配套的 RaptorStatus 状态消息逐字段讲解 RaptorInput 的数据含义、坐标系约定、发布链路以及基于日志的调试方法帮助开发者理解并利用这一消息进行离线分析与策略调优。消息概览策略的观测快照Raptor 是一个以神经网络策略直接输出电机指令的端到端飞行控制模块位于 src/modules/mc_raptor/mc_raptor.cpp它不像传统控制器那样依赖中间状态估计器输出而是将姿态、位置、速度等原始观测直接送入策略网络。RaptorInput 消息承载的正是输入给策略网络的精确观测值其注释明确写道The exact inputs to the Raptor foundation policy. Having access to the exact inputs helps with debugging and post-hoc analysis.也就是说该消息的设计初衷就是为了让开发者能够在事后精确还原策略每一次决策所依据的输入从而支持调试debugging与事后分析post-hoc analysis。Topic 名称raptor_input对应源消息末尾的# TOPICS raptor_input声明消息版本MESSAGE_VERSION 0发布模块mc_raptorsrc/modules/mc_raptor/mc_raptor.cpp源消息定义msg/versioned/RaptorInput.msg字段全表NameTypeUnit [Frame]Range/EnumDescriptiontimestampuint64usTime since system starttimestamp_sampleuint64usSampling timestamp of the data this control response is based onactiveboolSignals if the policy is active (aka publishing actuator_motors)positionfloat32[3]m [FLU]Position of the vehicle_local_position frameorientationfloat32[4]Orientation in the vehicle_attitude frame but using the FLU convention as a unit quaternion (w, x, y, z)linear_velocityfloat32[3]m/s [FLU]Linear velocity in the vehicle_local_position frameangular_velocityfloat32[3]rad/s [FLU]Angular velocity in the body frameprevious_actionfloat32[4][-1 : 1]Previous action. Motor commands normalized to [-1, 1]常量全表NameTypeValueDescriptionMESSAGE_VERSIONuint320消息版本号ACTION_DIMuint84Policy output dimensionality (for quadrotors)逐字段深度解析timestamp 与 timestamp_sample时间戳双轨timestamp单位 us消息发布时刻距系统启动的时间即hrt_absolute_time()返回值用于标识这条观测消息是什么时候生成的。timestamp_sample单位 us该控制响应所依据数据的采样时刻。它不是发布时刻而是底层传感器观测如角速度的采样时间。在 mc_raptor.cpp 中发布逻辑为input_msg.timestamp current_time; input_msg.timestamp_sample _vehicle_angular_velocity.timestamp_sample;可以看到timestamp_sample直接取自vehicle_angular_velocity消息的采样时间戳。由于 Raptor 的控制节拍与角速度观测同步详见下文发布链路用采样时间而非发布时间来对齐其他数据源可以更准确地评估端到端延迟。需要精确对齐各输入来源时应优先使用timestamp_sample。active策略是否在真正输出active表示策略是否激活即正在发布 actuator_motors。在源码中其取值逻辑为bool next_active timestamp_last_vehicle_status_set _vehicle_status.nav_state ext_component_mode_id; ... status.active next_active; ... input_msg.active status.active;即当飞行器当前导航状态vehicle_status.nav_state等于 Raptor 注册的外部模式 IDext_component_mode_id时active为true。它的意义在于区分两种情形active trueRaptor 策略真正在控制飞机电机指令已被发布到actuator_motorsactive falseRaptor 模式虽然被选中或策略已运行但并未接管执行机构。在分析日志时只有active true的样本才是策略实际生效的数据而active false期间的观测数据可用于检查策略进入激活状态前的输入形态例如previous_action是否被重置。position、linear_velocity、angular_velocity三维观测组这三个float32[3]数组构成了策略对飞行器运动状态的观测主体字段单位 [Frame]数据来源 uORB 主题语义positionm [FLU]vehicle_local_position飞行器位置机体系 FLU 约定下的误差linear_velocitym/s [FLU]vehicle_local_position线速度FLU 约定angular_velocityrad/s [FLU]vehicle_angular_velocity机体角速度需要注意坐标系约定Raptor 策略以 FLUForward-Left-Up前-左-上为观测坐标系而 PX4 内部诸多状态量如vehicle_local_position遵循 NED/FRDNorth-East-Down / Forward-Right-Down约定。因此发布前必须做坐标转换源码Raptor::observe()mc_raptor.cpp 中的observe函数中// converting from FRD to FLU ... p[0] (position[0] - _trajectory_setpoint.position[0]); p[1] -(position[1] - _trajectory_setpoint.position[1]); p[2] -(position[2] - _trajectory_setpoint.position[2]); rotate_vector(Rt_inv, p, pt); // The position and velocity error are in the target frame三个要点值得展开位置与线速度是误差而非绝对状态position与linear_velocity存入的是相对trajectory_setpoint轨迹设定点的偏差而非绝对位置/速度。这也是 Raptor 策略在多种飞行场景下泛化能力的关键设计——观测的是偏离目标的程度。FRD → FLU 转换p[1]、p[2]取了负号将 NED 的东、下轴映射为 FLU 的左、上轴角速度同理_vehicle_angular_velocity.xyz[1]、xyz[2]取负。旋转到目标坐标系位置与速度误差再经Rt_inv由设定点偏航四元数的共轭构造的旋转矩阵旋转转到目标航向坐标系保证观测与目标航向解耦。此外观测还会做误差限幅源码常量T max_position_error 0.5; T max_velocity_error 1.0;对应observe()中的clip(pt[0], max_position_error, -max_position_error)等调用位置误差被限制在 ±0.5 m、速度误差在 ±1.0 m/s防止训练分布外的异常值冲击策略网络。因此在日志中看到position/linear_velocity的幅值被削顶属于正常现象不代表原始误差被丢弃。orientationFLU 约定的单位四元数orientation为float32[4]表示姿态但注意两个约束使用vehicle_attitude帧的数据但改用 FLU 约定存储形式为单位四元数顺序为 (w, x, y, z)。PX4 的vehicle_attitude.q遵循四元数 (w, x, y, z) 布局但其姿态通常对应 FRD 体轴约定Raptor 需要的是 FLU 约定源码在observe()中构造相对设定点的姿态误差四元数qr[0] _vehicle_attitude.q[0]; qr[1] _vehicle_attitude.q[1]; qr[2] -_vehicle_attitude.q[2]; qr[3] -_vehicle_attitude.q[3]; // qr qt * qd // qd qt * qr quaternion_multiplication(qtc, qr, qd);与位置/速度观测一致orientation也是相对于轨迹设定点偏航_trajectory_setpoint.yaw的姿态误差而非绝对姿态。消费该字段时若需还原绝对姿态需要结合同周期的trajectory_setpoint数据若只做相对分析如判断策略的姿态跟踪误差可直接使用。previous_action上一时刻的动作反馈previous_action为float32[4]范围[-1 : 1]表示上一控制周期的电机指令归一化到 [-1, 1]。它的存在是因为 Raptor 策略是带反馈的序列决策模型涉及循环层如 GRU见 mc_raptor.hpp 中引入的rl_tools/nn/layers/gru/operations_generic.h上一动作会作为当前时刻的观测之一。其长度由常量ACTION_DIM 4决定四旋翼策略输出维度为 4即四个电机。源码中复位时this-previous_action[action_i] RESET_PREVIOUS_ACTION_VALUE;RESET_PREVIOUS_ACTION_VALUE 0见 mc_raptor.hpp每个控制周期将策略输出action.action[action_i]写入previous_action同时映射为电机指令发布T value action.action[action_i]; this-previous_action[action_i] value; value (value 1) / 2; // [-1, 1] - [0, 1] actuator_motors.control[action_i] scaled_value;因此previous_action与actuator_motors.control之间存在确定的映射关系线性缩放(x1)/2只是坐标系/约定不同前者为策略原始动作[-1, 1]后者为执行器归一化输出[0, 1]。分析策略动作平滑性时可对previous_action做差分。消息发布链路从观测到电机指令理解 RaptorInput 的产生位置有助于判断其数据可信度。在 mc_raptor.cpp 的Raptor::Run()中控制周期流程为订阅并同步vehicle_angular_velocity、vehicle_local_position、vehicle_attitude、vehicle_status、trajectory_setpoint检查各观测的时效性超时则按raptor_status的exit_reason退出不执行策略调用observe()构造观测向量调用rl_tools::control(...)执行策略推理详见 mc_raptor.hpp 中EXECUTOR_CONFIG的CONTROL_INTERVAL_INTERMEDIATE_NS 2.5ms、CONTROL_INTERVAL_NATIVE_NS 10ms即 500 Hz 过采样 / 100 Hz 原生策略频率发布raptor_input观测与raptor_status状态若active将动作映射后发布actuator_motors。关键代码段截取自Run()raptor_input_s input_msg; input_msg.active status.active; static_assert(raptor_input_s::ACTION_DIM EXECUTOR_CONFIG::OUTPUT_DIM); input_msg.timestamp current_time; input_msg.timestamp_sample _vehicle_angular_velocity.timestamp_sample; for (TI dim_i 0; dim_i 3; dim_i) { input_msg.position[dim_i] observation.position[dim_i]; input_msg.orientation[dim_i] observation.orientation[dim_i]; input_msg.linear_velocity[dim_i] observation.linear_velocity[dim_i]; input_msg.angular_velocity[dim_i] observation.angular_velocity[dim_i]; } input_msg.orientation[3] observation.orientation[3]; for (TI dim_i 0; dim_i EXECUTOR_CONFIG::OUTPUT_DIM; dim_i) { input_msg.previous_action[dim_i] observation.previous_action[dim_i]; } _raptor_input_pub.publish(input_msg); _raptor_status_pub.publish(status);由代码可见raptor_input与raptor_status在同一控制周期成对发布actuator_motors紧随其后仅在active true时发布。因此将raptor_input.active与raptor_status.exit_reason联合阅读可以判断策略每次推理是否被真正执行、以及未执行的具体原因。与相邻 uORB 主题的关系RaptorInput 位于一条完整的数据链中其上下游主题如下主题角色说明vehicle_angular_velocity观测源角速度FRD 体轴Raptor 以它作为控制同步的最高频观测vehicle_local_position观测源位置与线速度NED 局部坐标系vehicle_attitude观测源姿态四元数trajectory_setpoint参考源轨迹设定点位置/速度/偏航用于计算误差观测raptor_input本文主题策略精确输入FLU 约定、误差形式raptor_status诊断输出策略执行状态、各观测时效性与 exit_reason见 docs/en/msg_docs/RaptorStatus.mdactuator_motors控制输出归一化电机指令[0, 1]由策略动作缩放而来配套的 RaptorStatus 消息docs/en/msg_docs/RaptorStatus.md记录了策略未执行的退出原因枚举EXIT_REASON_NONE0、EXIT_REASON_NO_ANGULAR_VELOCITY_UPDATE1、EXIT_REASON_NOT_ALL_OBSERVATIONS_SET2、EXIT_REASON_ANGULAR_VELOCITY_STALE3、EXIT_REASON_LOCAL_POSITION_STALE4、EXIT_REASON_ATTITUDE_STALE5、EXIT_REASON_EXECUTOR_STATUS_SOURCE_NOT_CONTROL6以及各观测的最近接收时间戳。结合两者可以快速定位输入缺失类问题例如角速度超时 10 ms、位置超时 100 ms、姿态超时 50 ms对应 mc_raptor.hpp 中的OBSERVATION_TIMEOUT_*常量。实际应用订阅与日志记录在代码中订阅 raptor_input任何 PX4 模块或外部程序经 uORB 桥接都可以订阅该主题。模块内典型的订阅方式与mc_raptor自身一致uORB::Subscription _raptor_input_sub{ORB_ID(raptor_input)}; raptor_input_s input_msg; if (_raptor_input_sub.update(input_msg)) { // 处理观测快照input_msg.position / orientation / linear_velocity / angular_velocity / previous_action }通过日志记录进行事后分析Raptor 模块的 READMEsrc/modules/mc_raptor/README.md提供了专门的调试日志配置。将下列主题加入logger_topics.txt即可在飞行日志中同时记录策略输入、状态与关键参考/观测源cat logger_topics.txt EOF raptor_status 0 raptor_input 0 trajectory_setpoint 0 vehicle_local_position 0 vehicle_angular_velocity 0 vehicle_attitude 0 vehicle_status 0 actuator_motors 0 EOF上传到飞控以真实 FMU 为例ftp mkdir /fs/microsd/etc ftp mkdir /fs/microsd/etc/logging ftp put logger_topics.txt /fs/microsd/etc/logging/logger_topics.txtSITL 仿真环境则上传到工作目录下的etc/logging/即可ftp mkdir etc ftp mkdir logging ftp put logger_topics.txt etc/logging/logger_topics.txt典型分析流程打开飞行日志筛选raptor_input.active true的时段确认策略接管交叉核对raptor_status.exit_reason若active为 false 且exit_reason ! 0根据枚举定位缺失/过期的观测源分析position/linear_velocity/orientation的幅值与变化率验证误差观测是否在训练分布范围内注意 ±0.5 m、±1.0 m/s 的限幅检查previous_action的连续性评估策略动作平滑度结合trajectory_setpoint与timestamp_sample计算链路延迟设定点到观测的时间差。消息版本与迁移RaptorInput 属于 PX4 的版本化消息其源定义位于 msg/versioned/RaptorInput.msg而非msg/根目录并通过MESSAGE_VERSION 0参与 uORB 消息格式协商。这意味着一方修改消息定义后通信双方会通过版本号检测不兼容避免静默解析错误。当前版本为 0字段布局与常量定义以本文与源消息为准后续版本迭代时应关注MESSAGE_VERSION的变化以及消息格式校验机制参见 Tools/msg/px_generate_uorb_topic_files.py 等消息代码生成脚本。小结RaptorInputraptor_input是 PX4 Raptor 基础策略的可观测性接口承载了策略每一步决策所需的精确输入FLU 约定下的姿态误差四元数、位置/速度误差、体轴角速度以及上一时刻的归一化动作。其字段设计误差形式、FLU 约定、timestamp_sample采样时刻、active标记直接映射 mc_raptor 模块的观测构建与发布逻辑mc_raptor.cpp。对于策略调试者而言将raptor_input与raptor_status、trajectory_setpoint、actuator_motors等主题配对记录并分析即可完整还原 Raptor 策略的每一次决策上下文是进行事后分析与参数调优的第一手数据来源。赞分享嵌入式物联网机器人自动驾驶智能硬件【免费下载链接】PX4-AutopilotPX4 Autopilot Software项目地址https://gitcode.com/gh_mirrors/px/PX4-Autopilot点击查看免费下载相关推荐PX4 DebugKeyValue uORB 消息详解基于键值对的命名调试数据通道PX4 DebugKeyValue uORB 消息详解基于键值对的命名调试数据通道 DebugKeyValue 是 PX4 飞控中一个轻量的 uORB 调试消嵌入式物联网机器人自动驾驶智能硬件PX4 InternalCombustionEngineStatus 消息详解内燃机状态反馈的 uORB 数据接口PX4 InternalCombustionEngineStatus 消息详解内燃机状态反馈的 uORB 数据接口 本指南聚焦 PX4 Autopilot 中嵌入式物联网机器人自动驾驶智能硬件PX4-Autopilot UORB 消息详解GpioOutGPIO 掩码与状态输出PX4 Autopilot UORB 消息详解GpioOutGPIO 掩码与状态输出 导读 GpioOut 是 PX4 Autopilot 中用于对外发布嵌入式物联网机器人自动驾驶智能硬件上一篇CRACO 端到端测试指南理解单元测试与集成测试的架构与实战下一篇不买Steam版游戏照样能下创意工坊模组聊聊WorkshopDL这个免费小工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考