旋翼飞行器姿态控制

下图是姿态控制的高级示意图。

../_images/copter-v4-small-attitude-PIDs.png

下面将介绍每个轴的工作原理。P 控制器将角度误差(目标角度与实际角度之间的差值)转换为所需的旋转速率,然后由 PID 控制器将旋转速率误差转换为高电平电机指令。图中的 "平方根控制器 "部分显示了角度控制的 P 控制器所使用的曲线。

../_images/Copter_CodeOverview_AttitudeControlPID.png

下图显示了从先导输入到 pwm 输出的代码路径。

../_images/AC_CodeOverview_ManualFlightMode.png

每次更新时(例如,Pixhawk 为 400 赫兹,APM2.x 为 100 赫兹)都会发生以下情况:

  • 会调用 flight-mode.cpp 顶层的 "update_flight_mode() "函数。该函数会检查飞行器的飞行模式(即 "control_mode "变量),然后调用相应的 <flight mode>_run() 函数(即 "update_flight_mode "变量)。 稳定运行 用于稳定模式、 rtl_run RTL 模式等)。飞行模式 <flight mode>_run() 函数可在相应命名的 mode_<flight mode>.cpp 文件中找到(即 mode_stabilize.cpp, mode_rtl.cpp等等)。

  • 飞行模式>_run 函数负责将用户输入(在 g.rc_1.control_in、g.rc_2.control_in 等中找到)转换为适合该飞行模式的倾斜角、旋转率、爬升率等。例如 AltHold 将用户的滚转和俯仰输入转换为倾斜角(单位:度),将偏航输入转换为旋转率(单位:度/秒),将油门输入转换为爬升率(单位:厘米/秒)。

  • 最后,<飞行模式>_run 函数必须将这些所需的角度、速率等参数传递到姿态控制和/或位置控制库中(这些参数都保存在_run 函数中)。 AC_AttitudeControl 文件夹)。

  • "这款" AC_AttitudeControl 图书馆提供了 5 种控制飞行器姿态的可能方法,其中最常见的 3 种如下。

    • angle_ef_roll_pitch_rate_ef_yaw() 该功能:滚动和俯仰接受 "地球帧 "角度,偏航接受 "地球帧 "速率。例如,如果滚动 = -1000、前平移/俯仰 = -1500、偏航/航向 = 500,则表示载具向左倾斜 10 度,向前俯仰 15 度,并以 5 度/秒的速度向右旋转。

    • angle_ef_roll_pitch_yaw() 与上述类似,但如果偏航为 500,则意味着将飞行器旋转到北偏东 5 度。

    • rate_bf_roll_pitch_yaw() 滚动 = -1000:该功能接受滚动俯仰和偏航的 "车身帧 "速率(单位:度/秒)。例如,如果使用 roll =-1000、pitch = -1500、yaw = 500,则载具将以 10 度/秒的速度向左滚动,以 15 度/秒的速度向前俯仰,并以 5 度/秒的速度绕载具的 Z 轴旋转。

调用这些函数后 AC_AttitudeControl::rate_controller_run() 被调用。这将把上述方法的输出转换成滚动、俯仰和偏航输入,并发送到 AP_Motors 通过它的 roll、set_pitch、set_yaw 和 set_throttle 方法。

  • "这款" AC_PosControl 该库允许对飞行器进行三维位置控制。通常只使用较简单的 Z 轴(即高度控制)方法,因为更复杂的三维位置飞行模式(即高度控制)需要更多的时间。 位置悬停)利用 AC_WPNav 库。无论如何,该库的一些常用方法包括

如果调用了 AC_PosControl 中的任何方法,那么飞行模式代码还必须调用 AC_PosControl::update_z_controller() 方法。这将运行 Z 轴位置控制 PID 循环,并将低电平节流电平发送至 AP_Motors 库。如果调用了任何 x 轴方法,那么 AC_PosControl::update_xy_controller() 必须调用。

  • AP_Motors 库包含 "电机混合 "代码。该代码负责将从 AC_AttitudeControl 和 AC_PosControl 库接收的滚转、前平移/俯仰、偏航和油门值转换为绝对电机输出(即 PWM 值)。因此,更高级别的库将使用这些函数:

    • set_roll()、set_pitch()、set_yaw() 滚动、俯仰和偏航:接受 -4500 ~ 4500 范围内的滚动、俯仰和偏航值。这些值并不是所需的角度,甚至也不是速率,而只是一个数值。例如,set_roll(-4500) 表示以最快速度向左滚动。

    • set_throttle() :接受 0 ~ 1000 范围内的绝对节流阀值。0 = 关闭电机,1000 = 全油门。

  • 每种机架类型(四旋翼、Y6、传统旋翼飞行器)都有不同的级别,但每种级别都有一个"......"。已上膛输出"函数,该函数负责将这些翻滚、前平移/俯仰、偏航和油门值转换为 pwm 输出。这种转换通常包括执行一个 "稳定补丁",当输入请求超出框架的物理限制时,该补丁会处理一个控制轴优先于另一个控制轴的问题(例如,四轴飞行器不可能实现最大油门和最大翻滚,因为某些电机的油门必须小于其他电机才能导致翻滚)。在 "output_armed "函数的底部,需要调用 hal.rcout->write(),将所需的 pwm 值传递给 AP_HAL 层。

  • "这款" AP_HAL 库(硬件抽象层)为所有电路板提供了一致的接口。其中,hal.rc_out_write() 函数将使从 AP_Motors 类接收到的指定 PWM 显示在电路板的相应 pwm 引脚上。

伦纳德-霍尔,2018 年开发者大会