拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

PX4 倾转旋翼控制消息 TiltrotorExtraControls 深度解析:倾转角与集合推力指令的发布与消费链路

PX4 倾转旋翼控制消息 TiltrotorExtraControls 深度解析:倾转角与集合推力指令的发布与消费链路
  • 嵌入式
  • 物联网
  • 机器人
  • 自动驾驶
  • 智能硬件

【免费下载链接】PX4-Autopilot

PX4 Autopilot Software

项目地址:https://gitcode.com/gh_mirrors/px/PX4-Autopilot
点击查看免费下载

导读

本文围绕 PX4 开源飞控中的 uORB 消息tiltrotor_extra_controls(对应 uORB 主题文档 TiltrotorExtraControls)展开,剖析其字段定义、发布端(vtol_att_control模块)与订阅端(control_allocator模块)的完整数据链路。读完本文,你将掌握倾转旋翼(Tiltrotor)VTOL 在悬停、前向飞行及过渡阶段如何通过该消息把"倾转角指令"和"集合推力指令"从姿态控制器传递给控制分配器,并能使用 PX4 shell 中的 uORB 调试命令直接观测该主题的实时数据。

消息概览:一条专门为倾转旋翼设计的控制总线

tiltrotor_extra_controls是 PX4 中一条单话题(无多实例)的 uORB 消息,主题名固定为tiltrotor_extra_controls。它与vehicle_torque_setpoint、vehicle_thrust_setpoint等通用控制指令消息不同,是倾转旋翼机型(Tiltrotor VTOL)特有的附加控制消息,用于承载两个无法用标准 3D 推力向量表达的标量指令:

  • 电机/旋翼的集合倾转角指令(collective tilt),决定电机整体前倾或回倾的角度;
  • 电机的集合推力指令(collective thrust),决定全部倾转电机共享的油门大小。

从源码结构看,这条消息只存在两个角色:发布者是 src/modules/vtol_att_control/tiltrotor.cpp 中的Tiltrotor类(姿态控制模块),订阅者是 src/modules/control_allocator/VehicleActuatorEffectiveness/ActuatorEffectivenessTiltrotorVTOL.cpp 中的ActuatorEffectivenessTiltrotorVTOL类(控制分配器模块)。此外该主题还被飞行日志记录器订阅(见下文"日志记录"一节)。

消息定义源文件位于 msg/TiltrotorExtraControls.msg,并在 msg/CMakeLists.txt 中登记为 PX4 官方 uORB 主题之一。

字段详解

依据 TiltrotorExtraControls 文档 的字段表,该消息共包含 3 个字段:

名称类型取值范围说明
timestampuint64—自系统启动以来的时间(微秒),由hrt_absolute_time()填充
collective_tilt_normalized_setpointfloat32[0, 1]倾转旋翼电机的集合倾转角,0 表示垂直(悬停姿态),1 表示水平(前向飞行姿态)
collective_thrust_normalized_setpointfloat32[0, 1]归一化的集合推力指令

对应的消息定义(.msg 文件)原文如下:

uint64 timestamp # time since system start (microseconds) float32 collective_tilt_normalized_setpoint # Collective tilt angle of motors of tiltrotor, 0: vertical, 1: horizontal [0, 1] float32 collective_thrust_normalized_setpoint # Collective thrust setpoint [0, 1]

字段语义解读

  • collective_tilt_normalized_setpoint:归一化到 [0, 1] 的倾转角。0 对应电机轴线垂直(与多旋翼姿态一致,可产生垂直升力),1 对应电机轴线水平(电机推力完全用于前向推进,类似固定翼螺旋桨)。该字段在分配器侧会被映射到 [-1, 1] 的控制域(见下文订阅端解析)。
  • collective_thrust_normalized_setpoint:所有倾转电机共享的归一化集合推力,同样限制在 [0, 1]。值得注意的是,源码注释明确指出:倾转旋翼场景下不传递 3D 推力向量,而是把"推力向量模长"与"集合倾转角"分开传递。原因在于,3D 推力与倾转角无法由分配器独立分配,当前控制器架构下分配器无法直接计算集合倾转角,因此必须由姿态控制模块通过这条消息统一给出(见 tiltrotor.cpp 的注释)。

发布端源码解析:vtol_att_control 如何生成倾转与推力指令

发布端位于vtol_att_control模块的Tiltrotor类。头文件 tiltrotor.h 中声明了发布句柄:

uORB::Publication<tiltrotor_extra_controls_s> _tiltrotor_extra_controls_pub{ORB_ID(tiltrotor_extra_controls)};

实际发布动作发生在fill_actuator_outputs()函数末尾(tiltrotor.cpp):

// publish tiltrotor extra controls tiltrotor_extra_controls_s tiltrotor_extra_controls = {}; tiltrotor_extra_controls.collective_tilt_normalized_setpoint = _tilt_control; tiltrotor_extra_controls.collective_thrust_normalized_setpoint = collective_thrust_normalized_setpoint; tiltrotor_extra_controls.timestamp = hrt_absolute_time(); _tiltrotor_extra_controls_pub.publish(tiltrotor_extra_controls);

倾转角_tilt_control的产生逻辑

_tilt_control是Tiltrotor类内部维护的倾转舵机执行值,随 VTOL 飞行状态机(vtol_mode)而变化:

  • 多旋翼模式(MC_MODE):_tilt_control = pusher_assist() + VT_TILT_MC(tiltrotor.cpp),即默认停在悬停倾转角,可叠加推杆辅助量;
  • 固定翼模式(FW_MODE):_tilt_control = VT_TILT_FW(tiltrotor.cpp),电机完全倾转至水平;
  • 前向过渡(TRANSITION_FRONT_P1 / P2):按VT_TRANS_P2_DUR等参数以时间斜坡将倾角从VT_TILT_TRANS抬升至VT_TILT_FW(tiltrotor.cpp);
  • 回退过渡(TRANSITION_BACK):先保持电机怠速,经过BACKTRANS_THROTTLE_DOWNRAMP_DUR_S后再按VT_BT_TILT_DUR将倾角从VT_TILT_FW线性回摆到VT_TILT_MC(tiltrotor.cpp)。

相关参数定义在 tiltrotor_params.yaml 中,默认值如下:

参数默认值范围含义
VT_TILT_MC0.0[0, 1]悬停(MC)时的归一化倾角
VT_TILT_TRANS0.4[0, 1]前向过渡第 1 阶段结束时(进入 P2 前)的归一化倾角
VT_TILT_FW1.0[0, 1]固定翼(FW)飞行时的归一化倾角
VT_TRANS_P2_DUR0.5 s[0.1, 5]前向过渡第 2 阶段从VT_TILT_TRANS倾至VT_TILT_FW所需时间
VT_BT_TILT_DUR1.0 s[0.1, 10]回退过渡中电机从VT_TILT_FW回倾至VT_TILT_MC所需时间

集合推力collective_thrust_normalized_setpoint的产生逻辑

同一个函数中,集合推力按飞行模式分别取值(tiltrotor.cpp):

  • 固定翼模式(FW_MODE):直接取固定翼虚拟推力设定点的 x 分量(即前向推力)_vehicle_thrust_setpoint_virtual_fw->xyz[0],同时把该值放到多旋翼推力通道的 z 轴反向输出上;
  • 其他模式(MC / 过渡):取多旋翼虚拟推力设定点的 z 分量并乘以多旋翼油门权重_mc_throttle_weight,即-_vehicle_thrust_setpoint_virtual_mc->xyz[2] * _mc_throttle_weight。

这样,无论处于哪个飞行阶段,订阅端都只需消费这条消息中的两个标量即可完成电机与倾转舵机的驱动,无需关心 3D 向量分配问题。

订阅端源码解析:control_allocator 如何消费倾转指令

订阅端是control_allocator模块的ActuatorEffectivenessTiltrotorVTOL。头文件 ActuatorEffectivenessTiltrotorVTOL.hpp 中声明了订阅句柄:

uORB::Subscription _tiltrotor_extra_controls_sub{ORB_ID(tiltrotor_extra_controls)};

在updateSetpoint()中(ActuatorEffectivenessTiltrotorVTOL.cpp),分配器对消息做了以下处理:

  1. 归一化域映射:把 [0, 1] 的倾角指令映射为分配器内部的 [-1, 1] 控制域:control_collective_tilt = collective_tilt_normalized_setpoint * 2.f - 1.f,并做端点钳位(< -0.99 置为 -1,> 0.99 置为 1);
  2. 变化检测:与上一次倾角指令比较,差值超过 0.01 时置_collective_tilt_updated标志,触发效率矩阵(effectiveness matrix)重算(见getEffectivenessMatrix());
  3. 飞行阶段约束:
    • 前向过渡(HF→FF)期间把倾角指令限制在 [-1, 0],防止高倾角下 z 轴推力效率趋零导致电机输出爆表;
    • 回退过渡(FF→HF)期间强制假设电机垂直(倾角 = -1),避免过渡启动瞬间的推力尖峰;
  4. 油门加转保护:悬停阶段若电机尚未完成加转(受COM_SPOOLUP_TIME控制),倾转执行器输出置为NAN(即保持怠速/未武装位置);
  5. 固定翼直通:FORWARD_FLIGHT阶段直接用消息中的collective_thrust_normalized_setpoint作为全部电机(矩阵 0 中前_first_tilt_idx个执行器)的油门指令(ActuatorEffectivenessTiltrotorVTOL.cpp)。

此外,allocateAuxilaryControls()还会在矩阵 1(舵面)上应用襟翼与扰流板指令,与倾转通道相互独立。

日志记录:飞行数据回放中的可用性

tiltrotor_extra_controls被列为可选日志主题,在 src/modules/logger/logged_topics.cpp 中以 100 Hz 的采样率登记:

add_optional_topic("tiltrotor_extra_controls", 100);

这意味着在.ulg飞行日志中,可以回放倾转角指令与集合推力指令的完整时间历程,便于调试倾转旋翼的过渡过程是否平滑、倾转速率是否合理。

实战观测:在 PX4 shell 中监视该主题

PX4 的 uORB 调试工具(位于 src/systemcmds/uorb)可直接观测该主题的实时数据:

  • 使用listener tiltrotor_extra_controls持续打印主题内容,观察timestamp、collective_tilt_normalized_setpoint、collective_thrust_normalized_setpoint三个字段随飞行模式切换(MC → 前向过渡 → FW → 回退过渡)的变化;
  • 使用uorb top查看该主题的发布频率与订阅者数量,验证发布端与订阅端均已正常连接。

结合 tiltrotor_params.yaml 中的VT_TILT_MC/VT_TILT_TRANS/VT_TILT_FW参数调整倾角包线,可以在不重新编译固件的情况下(通过 MAVLink 参数协议在线修改)重塑倾转旋翼的过渡行为,并以本消息的日志数据作为调参依据。

与相关消息的关系

在倾转旋翼控制链路中,本消息与以下 uORB 主题协同工作:

  • vehicle_torque_setpoint_virtual_mc/vehicle_thrust_setpoint_virtual_mc:多旋翼虚拟力矩与推力设定点,是collective_thrust_normalized_setpoint在非 FW 阶段的输入来源;
  • vehicle_torque_setpoint_virtual_fw/vehicle_thrust_setpoint_virtual_fw:固定翼虚拟力矩与推力设定点,是 FW 阶段集合推力的输入来源;
  • vehicle_attitude_setpoint:过渡阶段的姿态设定点来源(MC/FW 虚拟姿态设定点);
  • vehicle_status:用于分配器侧的武装状态与加转判断。

可以这样理解整条链路:姿态控制器(vtol_att_control)根据 VTOL 状态机与飞控参数决定"倾多少、推多少",通过tiltrotor_extra_controls把两个标量指令交给控制分配器(control_allocator),分配器据此解算电机转速指令与倾转舵机位置指令,最终驱动执行器输出。这条消息是倾转旋翼机型区别于其他 VTOL(如尾座式、倾转机翼式)的核心数据接口,其字段设计体现了 PX4 将"推力方向"与"推力大小"解耦控制的整体思路。

  • 嵌入式
  • 物联网
  • 机器人
  • 自动驾驶
  • 智能硬件

【免费下载链接】PX4-Autopilot

PX4 Autopilot Software

项目地址:https://gitcode.com/gh_mirrors/px/PX4-Autopilot
点击查看免费下载

相关推荐

上一篇:schedule 后台执行实战:用 Python 线程把定时调度搬离主线程
下一篇:Comprehensive Rust 迭代器实战指南:从 `Iterator` Trait 到方法链与自定义集合遍历

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

返回列表