【ArduPilot之旅#1】多旋翼油门控制数据流程解析
ArduPilot 多旋翼油门控制数据流程解析摘要本文基于 ArduCopter 源码梳理从遥控器油门通道输入到 ESC/PWM 输出的完整数据链路涵盖 RC 读取、飞行模式、姿态控制器与AP_Motors混控输出便于二次开发或排障时快速定位模块。关键词ArduPilotArduCopter油门RC_ChannelAC_AttitudeControlAP_Motors一、前言多旋翼上“油门”在飞控内部经历多次坐标变换与权限叠加原始 PWM → 归一化杆量 → 模式相关期望推力01→ 姿态速率环与混控 → 每路电机 PWM。理解这一路径有助于分析手飞发软、自动模式高度波动、低油门姿态饱和等问题。下文默认讨论ArduCopter 多旋翼直升机以集体螺距为主路径类似但语义不同。二、总体流程概览可概括为以下阶段硬件 / HAL接收机解码后各通道进入hal.rcinPWM、串口协议等由板级实现。RC 层RC_Channels::read_input()与RC_Channel::update()读取并校准油门常用RANGE模式得到control_in约 01000。机型层read_radio()失控检测、throttle_zero等安全状态。飞行模式Mode::run()手飞时get_pilot_desired_throttle()自动模式常由高度/位置环给出。姿态控制AC_AttitudeControlset_throttle_out()设总推力基准rate_controller_run()写横滚/俯仰/偏航至电机对象。电机库AP_MotorsMulticopteroutput()中滤波、螺旋状态机、混控、output_to_motors()。输出hal.rcoutpush到 ESC或 DShot 等。三、分阶段说明3.1 RC 输入read_input与RC_Channel::update调度任务调用Copter::read_radio()。其中首先执行rc().read_input()若hal.rcin-new_input()有新帧或存在 override则对每个通道调用RC_Channel::update()。update()中radio_in hal.rcin-read(ch_in)或 mavlink 等覆盖值。油门通道为ControlType::RANGE时control_in pwm_to_range()得到带死区、按radio_min/radio_max映射后的逻辑量。涉及文件libraries/RC_Channel/RC_Channels.cpp、libraries/RC_Channel/RC_Channel.cpp3.2read_radio()失控与“油门为零”标志在Copter::read_radio()ArduCopter/radio.cpp中典型顺序包括set_throttle_and_failsafe(channel_throttle-get_radio_in())与油门失控阈值相关。set_throttle_zero_flag(channel_throttle-get_control_in())判断飞手是否收油门影响怠速、上锁逻辑等。可对油门control_in做低通如rc_throttle_control_in_filter。至此物理 PWM →radio_in→control_in 安全相关状态。3.3 飞行模式杆量 → 01 期望推力以自稳 Stabilize为例ArduCopter/mode_stabilize.cpp调用get_pilot_desired_throttle()定义在ArduCopter/mode.cpp的Mode基类。内部读取channel_throttle-get_control_in()结合中位杆量、悬停推力曲线expo等映射为01的pilot_desired_throttle。根据motors-get_spool_state()关机 / 地面怠速 / 满油门等可能将飞行员油门钳为 0。调用attitude_control-set_throttle_out(pilot_desired_throttle, true, g.throttle_filt)。自动模式定高、定点、航线等同一接口set_throttle_out通常由位置/高度控制器给出而非get_pilot_desired_throttle()但后续进入电机库的路径一致。3.4set_throttle_out姿态层对油门的处理多旋翼实现见libraries/AC_AttitudeControl/AC_AttitudeControl_Multi.cpp的AC_AttitudeControl_Multi::set_throttle_out保存_throttle_in等内部状态。可选倾角补偿get_throttle_boosted()大倾角时抬高等效垂直推力需求。调用_motors.set_throttle(...)把01 总推力基准交给电机库。通过set_throttle_avg_max(get_throttle_avg_max(...))与Throttle MixATC_THR_MIX_*配合影响姿态修正时可用油门空间。3.5 速率环rate_controller_runCopter::run_rate_controller_main()ArduCopter/Attitude.cpp中调用attitude_control-rate_controller_run()横滚/俯仰/偏航角速率 PID输出写入_motors.set_roll / set_pitch / set_yaw及前馈。油门基准已在set_throttle_out中设定此处是在同一套混控里叠加姿态通道。3.6motors_output()→AP_MotorsMulticopter::output()Copter::motors_output()ArduCopter/motors.cpp中默认flightmode-output_to_motors()→motors-output()。AP_MotorsMulticopter::output()libraries/AP_Motors/AP_MotorsMulticopter.cpp典型顺序update_throttle_filter()output_logic()螺旋状态机等output_armed_stabilizing()油门 RPY 混成各电机推力thrust_compensation()等output_to_motors()执行量 → 每路 PWM或数字协议hal.rcout-push()/ 与SRV_Channels协同推送至硬件四、数据流图Mermaid下列示意图便于对照源码阅读:接收机hal.rcinRC_Channels::read_inputRC_Channel::update 油门radio_in / control_inCopter::read_radio 失配与 throttle_zeroMode::runget_pilot_desired_throttle 或自动高度环attitude_control::set_throttle_outAP_Motors::set_throttlerate_controller_runAP_Motors set RPYmotors-outputhal.rcout / ESC五、分支与注意点场景说明定高 / 定点 / Autoset_throttle_out多来自位置或高度环非手控get_pilot_desired_throttle()RC 失控 / override仍走RC_Channel但数据源或标志不同ESC 校准、直通如set_throttle_passthrough_for_esc_calibration可绕过正常混控直升机集体螺距与多旋翼“油门”语义不同骨架仍是 模式 → attitude → motors → 输出与油门混控权重相关的调参为ATC_THR_MIX_MIN/ATC_THR_MIX_MAN/ATC_THR_MIX_MAX用于在“保总油门”与“保姿态”之间折中详见飞控文档与update_throttle_mix()逻辑。六、主要源文件索引便于检索路径作用ArduCopter/radio.cppread_radio()、失控与 throttle_zeroArduCopter/mode_stabilize.cpp等模式run()、手飞油门与set_throttle_outArduCopter/mode.cppget_pilot_desired_throttle()、output_to_motors()默认实现ArduCopter/Attitude.cpprun_rate_controller_main()ArduCopter/motors.cppmotors_output()libraries/RC_Channel/RC_Channels.cppread_input()libraries/RC_Channel/RC_Channel.cppupdate()、pwm_to_range()libraries/AC_AttitudeControl/AC_AttitudeControl_Multi.cppset_throttle_out、rate_controller_runlibraries/AP_Motors/AP_MotorsMulticopter.cppoutput()全链路七、结语ArduPilot 中油门并非“单点赋值”而是RC → 模式 → 姿态层滤波与补偿 → 电机混控 → 硬件的链条。排障时建议先确认control_in与模式再查set_throttle_out调用者最后查AP_Motors的output_armed_stabilizing与 PWM 限制。版权声明本文基于开源 ArduPilot 代码路径整理仅供学习交流转载请注明出处与 ArduPilot 许可证要求。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2495591.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!