嵌入式物联网机器人自动驾驶智能硬件【免费下载链接】PX4-AutopilotPX4 Autopilot Software项目地址https://gitcode.com/gh_mirrors/px/PX4-Autopilot点击查看免费下载导读SetpointConfigReply是 PX4 飞控中一组 uORB 消息setpoint_config/setpoint_config_reply的应答消息用于外部模式external mode向 PX4 提出设定点类型setpoint type配置请求后由 PX4 返回校验结果与模式需求标志。本文基于 SetpointConfigReply 文档 及仓库源码完整讲解该消息的字段语义、RESULT枚举、模式需求标志mode_req_*的生成规则并结合 commander 模块 的实现揭示 PX4 底层应答链路帮助你在开发外部模式如 Offboard 自定义模式、DDS/ROS 2 集成时正确解析应答并完成武装检查。消息定位一对请求-应答的 uORB 主题SetpointConfigReply不是孤立存在的消息它与SetpointConfig构成一对请求-应答关系外部模式发布SetpointConfig主题setpoint_configPX4 侧订阅路径为/fmu/in/setpoint_config声明自己希望使用的设定点类型、来源模式source_id、是否生效should_apply以及超时timeout_msPX4 的 commander 模块校验请求后发布SetpointConfigReply主题setpoint_config_reply外部订阅路径为/fmu/out/setpoint_config_reply携带校验结果result与使用该设定点类型所需的控制模式标志mode_req_*。主题桥接关系可以在 uxrce_dds_client 的 dds_topics.yaml 与 zenoh 的 dds_topics.yaml 中找到印证两条消息分别映射为/fmu/in/setpoint_config与/fmu/out/setpoint_config_reply意味着 DDSROS 2与 Zenoh 外部节点都可以通过这套接口与 PX4 完成设定点配置协商。字段定义与语义SetpointConfigReply定义于 msg/versioned/SetpointConfigReply.msg完整字段如下单位、枚举约束见下表名称类型单位 [Frame]范围/枚举说明timestampuint64us自系统启动以来的时间微秒由 PX4 在发布时填充typeuint16设定点类型取值对应SetpointConfig::TYPE_*见下文 TYPE 枚举source_iduint8发送SetpointConfig请求的模式对应的nav_stateresultuint8RESULT校验结果成功/失败/不支持/未知类型mode_req_angular_velocitybool是否要求角速度rates控制mode_req_attitudebool是否要求姿态控制mode_req_local_altbool是否要求本地高度控制mode_req_local_positionbool是否要求本地位置控制其中type与source_id由 PX4 从收到的SetpointConfig请求中原样回填见 ModeManagement.cpp保证外部模式能把应答与自己的请求一一对应起来。type字段的取值即SetpointConfig消息中定义的TYPE_*枚举定义于 msg/versioned/SetpointConfig.msg本文消息原样引用不再重复定义枚举值数值对应设定点消息TYPE_INVALID0无效类型TYPE_DIRECT_ACTUATORS1ActuatorMotors与ActuatorServosTYPE_MULTICOPTER_GOTO2GotoSetpointTYPE_FIXEDWING_LATERAL_LONGITUDINAL3FixedWingLateralSetpoint与FixedWingLongitudinalSetpointTYPE_TRAJECTORY4TrajectorySetpointTYPE_RATES5VehicleRatesSetpointTYPE_ATTITUDE6VehicleAttitudeSetpointTYPE_ROVER_POSITION7RoverPositionSetpointTYPE_ROVER_SPEED_ATTITUDE8RoverSpeedSetpoint与RoverAttitudeSetpointTYPE_ROVER_SPEED_RATE9RoverSpeedSetpoint与RoverRateSetpointTYPE_ROVER_SPEED_STEERING10RoverSpeedSetpoint与RoverSteeringSetpointTYPE_ROVER_THROTTLE_ATTITUDE11RoverThrottleSetpoint与RoverAttitudeSetpointTYPE_ROVER_THROTTLE_RATE12RoverThrottleSetpoint与RoverRateSetpointTYPE_ROVER_THROTTLE_STEERING13RoverThrottleSetpoint与RoverSteeringSetpointTYPE_TRAJECTORY_6DOF14TrajectorySetpoint6dofTYPE_THRUST_AND_TORQUE15VehicleThrustSetpoint与VehicleTorqueSetpointTYPE_POSITION_TRIPLET16PositionSetpointTripletRESULT 枚举校验结果的四种取值result字段使用RESULT枚举定义于SetpointConfigReply.msg本文消息的 Enums 小节 完整列出枚举名类型值说明RESULT_SUCCESSuint80校验通过设定点类型可用于当前飞控/机型RESULT_FAILURE_OTHERuint81其他失败例如请求中携带的source_id不是有效模式RESULT_UNSUPPORTEDuint82当前机型不支持该设定点类型例如多旋翼上请求固定翼横向-纵向设定点RESULT_UNKNOWN_SETPOINT_TYPEuint83设定点类型未知例如类型值超出TYPE_*枚举范围常量 MESSAGE_VERSION消息定义了一个版本常量用于 uORB 消息格式的版本校验名称类型值MESSAGE_VERSIONuint320当前版本为 0对应 PX4 对setpoint_config/setpoint_config_reply接口的初始定义。源码级实现PX4 如何生成 SetpointConfigReply在 PX4 内部应答逻辑位于 commander 模块的ModeManagement::checkConfigControlSetpointUpdates()见 ModeManagement.cpp。该函数订阅setpoint_config主题循环取出请求并发布对应应答核心流程如下回填标识字段从请求拷贝source_id与type到应答消息供外部模式匹配请求与应答校验模式有效性若source_id对应的模式不存在打印一次错误日志Setpoint config request for invalid mode: %i并返回RESULT_FAILURE_OTHER校验设定点类型调用mode_util::isSetpointTypeValid()结合当前机型vehicle_type与是否 VTOLis_vtol判断类型是否受支持结果映射为RESULT_SUCCESS/RESULT_UNSUPPORTED/RESULT_UNKNOWN_SETPOINT_TYPE填充模式需求标志仅当结果为RESULT_SUCCESS时调用mode_util::getControlMode()得到对应的vehicle_control_mode标志并按如下规则映射为四个mode_req_*布尔字段reply.mode_req_angular_velocity config_control_setpoint.flag_control_rates_enabled; reply.mode_req_attitude config_control_setpoint.flag_control_attitude_enabled; reply.mode_req_local_alt config_control_setpoint.flag_control_altitude_enabled || config_control_setpoint.flag_control_climb_rate_enabled; reply.mode_req_local_position config_control_setpoint.flag_control_position_enabled || config_control_setpoint.flag_control_velocity_enabled;应用请求若请求中should_apply true则将mode.current_setpoint_type更新为该校验通过的设定点类型函数返回had_update true触发 commander 后续的模式状态刷新should_apply false时仅作预检用途——不改变当前配置仅让外部模式确认该设定点类型在当前机型的可用性发布应答填充timestamp后通过_setpoint_config_reply_pub.publish(reply)发布setpoint_config_reply订阅/发布句柄定义见 ModeManagement.hpp。需要特别说明的是mode_req_*标志只是 PX4 对使用该设定点类型需要开启哪些控制回路的声明PX4 本身不会据此执行武装检查而是由外部模式自行把这些标志应用到它的武装检查应答arming check reply中——这一点在原消息注释中已明确A mode will use these and apply them to the arming check reply (PX4 does not do that itself).模式需求标志的生成依据setpoint_types 实现mode_req_*四个字段并非独立配置而是从mode_util::getControlMode()产出的控制模式标志推导而来。对应实现位于 src/modules/commander/ModeUtil/setpoint_types.cpp枚举与接口声明见 setpoint_types.hpp每种设定点类型映射到一组vehicle_control_mode标志例如设定点类型触发的控制标志节选推导出的 mode_reqTYPE_TRAJECTORYrates attitude altitude climb_rate velocity position四个mode_req_*全为 trueTYPE_RATESrates仅mode_req_angular_velocity为 trueTYPE_ATTITUDErates attitudemode_req_angular_velocity与mode_req_attitude为 trueTYPE_DIRECT_ACTUATORS无控制标志四个mode_req_*全为 falseTYPE_POSITION_TRIPLETrates attitude altitude climb_rate velocity position auto四个mode_req_*全为 true注意一个细节mode_req_local_alt由flag_control_altitude_enabled || flag_control_climb_rate_enabled推导mode_req_local_position由flag_control_position_enabled || flag_control_velocity_enabled推导因此仅提供速度/爬升率的设定点类型也会被标记为需要本地位置/高度。正如原消息注释所提示的某些设定点类型可以被降级使用例如不带位置控制的TrajectorySetpoint此时 PX4 仍然会置位全部需求标志由外部模式自行忽略mode_req_local_position。机型适配isSetpointTypeValid 的过滤规则应答中的result直接取决于mode_util::isSetpointTypeValid()setpoint_types.cpp的判定规则如下通用类型TYPE_TRAJECTORY、TYPE_RATES、TYPE_ATTITUDE、TYPE_THRUST_AND_TORQUE、TYPE_POSITION_TRIPLET以及TYPE_DIRECT_ACTUATORS对所有机型返回RESULT_SUCCESS多旋翼专用TYPE_MULTICOPTER_GOTO仅当vehicle_type VEHICLE_TYPE_ROTARY_WING时成功否则RESULT_UNSUPPORTED固定翼/VTOL 专用TYPE_FIXEDWING_LATERAL_LONGITUDINAL仅当机型为固定翼或 VTOL 时成功地面车专用TYPE_ROVER_*系列仅当vehicle_type VEHICLE_TYPE_ROVER时成功航天器场景TYPE_TRAJECTORY_6DOF在机型未指定VEHICLE_TYPE_UNSPECIFIED时成功——源码注释指出该类型供 spacecraft 使用而这类载体通常不设置vehicle_type兜底TYPE_INVALID或超出枚举范围的值返回RESULT_UNKNOWN_SETPOINT_TYPE。这正是RESULT_UNSUPPORTED当前机型不支持该设定点类型与RESULT_UNKNOWN_SETPOINT_TYPE类型本身未知两种错误码在代码层面的区分依据前者是类型合法但不适用于本机后者是类型值根本无法识别。典型使用流程与实战建议结合以上实现外部模式例如通过 ROS 2 / DDS 或 Zenoh 连接的外部控制节点使用这套接口的推荐流程为预检不生效发布SetpointConfigshould_apply false订阅setpoint_config_reply检查result RESULT_SUCCESS确认当前机型支持目标设定点类型此阶段不会改动 PX4 内部配置激活生效预检通过后重新发布请求should_apply true且source_id指向自身模式的nav_state让 PX4 将该设定点类型设为当前模式的配置若result ! RESULT_SUCCESS应根据RESULT_UNSUPPORTED/RESULT_UNKNOWN_SETPOINT_TYPE/RESULT_FAILURE_OTHER做差异化处理武装检查读取应答中的mode_req_angular_velocity、mode_req_attitude、mode_req_local_alt、mode_req_local_position将其合并到自己的武装检查应答中PX4 不会代劳超时设置通过请求消息的timeout_ms配置设定点超时0 表示禁用当超时时间内未收到设定点时 PX4 触发 failsafe——该字段不在应答中出现但应答的成功与否决定了该配置是否被采纳。需要留意应答的处理边界commander 单次最多处理 5 个排队请求max_updates 5因此高频率重复请求时外部模式应按source_idtype匹配应答而不是假设每次发布都会得到一条应答。小结SetpointConfigReply是 PX4 外部模式设定点协商机制中的应答侧消息type/source_id回显请求身份result表达机型适配性校验结果四个mode_req_*标志向外部模式声明使用该设定点类型所需的控制回路最终由外部模式自行用于武装检查。理解该消息后你可以在开发自定义外部模式时正确完成预检 → 激活 → 武装检查三步协商通过RESULT枚举精确区分不支持与未知类型两种失败原因借助 setpoint_types.cpp 与 ModeManagement.cpp 的源码进一步定制或调试设定点类型与机型适配逻辑。消息的规范定义文件为 msg/versioned/SetpointConfigReply.msg请求侧消息见 SetpointConfig应答生成的完整实现见 commander 模式管理模块。赞分享嵌入式物联网机器人自动驾驶智能硬件【免费下载链接】PX4-AutopilotPX4 Autopilot Software项目地址https://gitcode.com/gh_mirrors/px/PX4-Autopilot点击查看免费下载相关推荐PX4 UORB 消息 ArmingCheckRequestV0 详解外部组件解锁检查的请求机制PX4 UORB 消息 ArmingCheckRequestV0 详解外部组件解锁检查的请求机制 导读 ArmingCheckRequestV0 是 PX嵌入式物联网机器人自动驾驶智能硬件PX4-Autopilot uORB 消息深度解析ConfigOverrides 外部模式配置覆盖机制PX4 Autopilot uORB 消息深度解析ConfigOverrides 外部模式配置覆盖机制 ConfigOverrides 是 PX4 Autop嵌入式物联网机器人自动驾驶智能硬件PX4-Autopilot RegisterExtComponentReply 消息详解外部组件注册的应答协议PX4 Autopilot RegisterExtComponentReply 消息详解外部组件注册的应答协议 导读 RegisterExtComponent嵌入式物联网机器人自动驾驶智能硬件上一篇DS4Windows 快速上手把 PS4/PS5 手柄变成 PC 游戏认得的 Xbox 手柄下一篇ncmdumpGUI实测手记把打不开的网易云ncm音乐转成通用MP3全程只点了三次鼠标创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考