Skip to content

2.3 系统辨识 ​

0. 前言 ​

​ 在之前的课程中,我们已经对四旋翼的各种物理参数和数学模型有了较为详细的了解。这些参数在后续控制算法设计中至关重要,其准确性直接决定了算法的稳定性。然而,对于手中的四旋翼,我们该如何较为精准地确定这些参数呢?有些参数如质量很容易精确测量,但像某些转动惯量、电机延迟、反扭系数等参数则不容易直接测得。这时,系统辨识通常是一种方便且常用的系统参数拟合方法。所谓系统辨识,就是通过对系统施加特定输入,并记录其输出或响应,从而在输入输出过程中体现系统的物理参数。我们可以采用如最小二乘等方法,从这些输入输出数据中反推并拟合出这些参数。在大多数情况下,这种方法能够达到较高的精度,完全可以直接用于后续控制算法的模型设计与仿真。

读完本文后,你将能够:

  • 理解系统辨识在整个模型依赖控制体系中的位置:它是连接"理论方程"和"真实飞机"的桥梁
  • 设计 3~4 次简单飞行实验,分别激励推力、转动惯量和扭矩系数对应的动力学
  • 使用 sysid.tools 在线平台完成从 ULog 飞行日志到完整模型参数的自动辨识
  • 理解每个辨识步骤背后的数学原理(最小二乘、EMA 延迟模型、联合优化)
  • 获得一组可直接用于后续 LQR/MPC/NMPC 控制器设计的四旋翼物理参数

目录 ​

  1. 为什么要做系统辨识
  2. 你需要准备什么
  3. 飞行实验设计
  4. 使用 sysid.tools 进行辨识
  5. 基本原理

1. 为什么要做系统辨识 ​

1.1 PID 的局限与模型依赖控制的需求 ​

​ PX4 默认使用的 PID 级联控制器有一个很大的优点:你不需要知道飞行器的质量、转动惯量、推力系数等物理参数。调参就是反复试,找到一组让飞机不抖且能跟得上指令的 P/I/D 增益。这项工作虽然门槛不高,但是流程较为繁琐。然而PID因为不清楚模型的具体参数,只能在控制系统出现偏差之后来”进行补救“,并且其补救控制量对控制模型来说可能也不是最优的,导致控制系统的跟随性能可能较差,并且十分依赖参数调节效果。相比之下,基于模型的控制算法则可以根据目标控制量来计算准确的前馈输入,并能在出现外部扰动的时候给出合理的反馈控制量。对用户来说,调节参数的过程更加简单和形象。之前PID的参数调节决定了系统是否能够保持稳定,而模型控制算法的参数调节则是直接在保证稳定的基础上,进一步实现能量和性能的权衡调节,大幅度降低了参数调节时间和对经验的要求。

  • LQR(线性二次型调节器):需要状态空间模型,即 x˙=Ax+Bu 中的 A 和 B 矩阵
  • MPC(模型预测控制):需要在每个控制周期预测未来若干步的系统响应
  • NMPC(非线性 MPC):需要完整的非线性动力学模型

​ 以上所有方法都依赖一个前提:你有一个准确描述飞行器行为的数学模型。系统辨识的任务,就是通过飞行数据反推出这个模型的各个参数。

1.2 本教程能帮你得到什么 ​

通过约 3~4 次简单飞行(每次约 40 秒),不借助推力台等额外设备或者测量方式,你可以辨识出以下参数:

参数符号作用
推力二次曲线参数a,b,c归一化油门(0~1)到实际推力(N)的二次映射
电机时间常数Tm电机响应的延迟特性
转动惯量Ixx,Iyy,Izz绕三轴的转动惯量
扭矩系数Kτ推力到反扭矩的比例系数

这些参数同一些能够轻松测量的数据例如质量和尺寸等,组成了四旋翼完整动力学模型中的所有物理参数。


2. 你需要准备什么 ​

2.1 硬件 ​

​ 你仅需准备一个电子秤用于测量飞行器总起飞质量(精度 0.1g 即可)。HumpRotor 的电机坐标、推力方向、扭矩方向等几何参数已由提供的模型文件给出,你无需手动测量。

2.2 软件 ​

系统辨识使用在线工具完成,无需安装任何软件:

sysid.tools:https://sysid.tools/

这是一个基于浏览器的交互式系统辨识平台(由原论文作者团队开发并开源)。你只需上传 PX4 的 ULog 飞行日志,选择数据区间,即可自动完成辨识。其源代码托管在 GitHub:

https://github.com/arplaboratory/data-driven-system-identification

2.3 飞控日志配置 ​

系统辨识需要飞控记录以下数据项(在 PX4 的 SDLOG_PROFILE 参数中启用高速率 + 系统辨识主题即可):

ULog 字段含义
actuator_motors_mux_control[0~3]四个电机的归一化输出(0~1)
vehicle_angular_velocity_xyz[0~2]三轴角速度
vehicle_angular_velocity_xyz_derivative[0~2]三轴角加速度
vehicle_acceleration_xyz[0~2]三轴加速度(机体坐标系)

3. 飞行实验设计 ​

辨识需要 3~4 次飞行,分别激励不同的动力学特性。每次飞行约 40 秒。

3.1 飞行一:上下飞行(激励线加速度) ​

目的:辨识推力曲线参数 a,b,c 和电机延迟时间常数 Tm。

操作:让飞行器在垂直方向上来回运动,油门从接近零推到最大,再拉回零。关键是 覆盖尽可能宽的油门范围,因为推力曲线需要在整个工作区间上拟合。

激励的物理量:z 轴加速度(机体坐标系)。

3.2 飞行二:Roll 大角度摇摆(激励横滚转动) ​

目的:辨识 Ixx(绕 x 轴的转动惯量)。

操作:在遥控器上快速、大幅度地推拉 Roll 摇杆,让飞行器绕 x 轴做明显的角加速运动。不需要飞得很远,重点是角度变化的剧烈程度(要有较多的角加速度过程)。

激励的物理量:x 轴角加速度。

3.3 飞行三:Pitch 大角度摇摆(激励俯仰转动) ​

目的:辨识 Iyy(绕 y 轴的转动惯量)。

操作:与 Roll 飞行类似,但改为快速、大幅度地推拉 Pitch 摇杆,让飞行器绕 y 轴做明显的角加速运动。

激励的物理量:y 轴角加速度。

说明:如果 Roll 和 Pitch 的激励在一次飞行中均足够充分,可以将飞行二与飞行三合并为一次飞行。分开飞行的好处在于每轴的数据更"干净",辨识结果更稳定。

3.4 飞行四:Yaw 旋转(激励偏航转动) ​

目的:辨识扭矩系数 Kτ。

操作:让飞行器原地来回旋转,快速改变偏航方向。Yaw 的动力学通常较慢,因此需要足够的激励强度才能获得有效数据。

激励的物理量:z 轴角加速度。

3.5 操作要点 ​

  • 所有飞行在手动/自稳模式下进行,不需要 GPS 或自主飞行
  • 飞行中尽量让单个轴的运动幅度大一些,避免所有轴同时小幅晃动
  • 确保日志中没有大的数据缺口
  • 只有飞机完全处于空中的数据才是有效的,要严格排除飞机未起飞时或者碰撞地面时的数据

4. 使用 sysid.tools 进行辨识 ​

本教程使用 FLU 坐标系(与 PX4 飞控内部一致):x 轴指向前方(Front),y 轴指向左方(Left),z 轴指向上方(Up)。

4.1 模型文件准备 ​

在开始辨识前,你需要准备一个描述飞行器基本几何的 JSON 模型文件。HumpRotor160 的参数如下:

电机位置(以下为 HumpRotor160 的数值,仅供参考,请以你自己飞行器的实际尺寸为准):

电机x (m)y (m)位置扭矩方向
M10.0525-0.0525右前+
M2-0.0525-0.0525左前−
M3-0.05250.0525左后+
M40.05250.0525右后−

完整模型 JSON(以下为 HumpRotor160 GPS版本 的示例,请根据你的飞机实际情况来修改数值):

json
{
  "gravity": 9.81,
  "mass": 0.2436,
  "rotor_positions": [
    [ 0.05657, -0.05657, 0],
    [-0.05657, -0.05657, 0],
    [-0.05657,  0.05657, 0],
    [ 0.05657,  0.05657, 0]
  ],
  "rotor_thrust_directions": [
    [0, 0, 1],
    [0, 0, 1],
    [0, 0, 1],
    [0, 0, 1]
  ],
  "rotor_torque_directions": [
    [0, 0,  1],
    [0, 0, -1],
    [0, 0,  1],
    [0, 0, -1]
  ]
}

​ 请将 mass、rotor_positions 替换为你自己的实测值。gravity、rotor_thrust_directions、rotor_torque_directions 通常无需修改。

4.2 上传日志与选取数据区间 ​

  1. 打开 https://sysid.tools/
  2. 上传所有飞行的 ULog 文件(3~4 个)
  3. 为每个辨识目标选取有效数据区间:
    • Thrust(推力辨识):选取上下飞行的区间
    • Roll/Pitch Inertia(转动惯量):选取大角度摇摆的区间
    • Yaw(偏航):选取旋转飞行的区间

选取区间时注意:只保留有明显激励的段落,去掉起飞前和着陆后的无效数据。

4.3 辨识结果解读 ​

电机推力曲线 ​

​ 电机模型使用二次多项式,将归一化油门 ω∈[0,1] 映射为实际推力(N)。sysid.tools 输出的格式为 a+bx+cx2,输出值按 [a, b, c] 顺序排列。在控制器代码中对应参数名 motor_a, motor_b, motor_c。

f(ω)=a+b⋅ω+c⋅ω2

​ 其中 ω 是飞控输出的归一化电机控制量(actuator_motors_mux_control,范围 0~1),f 是该电机产生的推力(单位:牛顿)。三个系数的物理含义:

符号含义
a(零次项)截距修正,理想情况下应为 0(零油门 → 零推力),拟合值通常为很小的负数
b(一次项)推力的线性分量,低油门区域主要由该项贡献
c(二次项)推力的二次分量,高油门区域主导推力增长(空气动力学中推力近似与转速平方成正比)
推力 ↔ 油门双向转换公式 ​

​ 在实际控制器中,因为很多控制算法直接在推力上进行控制,所以需要频繁地进行推力和归一化油门之间的相互转换。

油门 → 推力(直接代入二次式):

f(ω)=a+b⋅ω+c⋅ω2

推力 → 油门(反解二次方程,取正根):

c⋅ω2+b⋅ω+(a−f)=0ω(f)=−b+b2−4ac+4c⋅f2c

电机时间常数 ​

​ 一阶电机延迟模型:ωm(t+Δt)=α⋅ωm(t)+(1−α)⋅ωsp(t),其中 α=e−Δt/Tm。这个延迟如果不考虑,推力预测会有明显偏差。

转动惯量 ​

​ 惯性比值(经验公式,仅供参考):Cxy→z≈1.832 是基于多机型统计数据的回归值(见原论文图 1 及表 II)。该值对常见 X 型四旋翼具有较好的普适性,但对于异形机架或特殊质量分布的飞行器可能有较大偏差。由此推算的 Izz 和 Kτ 应视为近似估计。

扭矩系数 ​

​ 扭矩系数的估计通常噪声较大(偏航动力学慢,信噪比低),但其精度对整体控制效果影响有限。


5. 基本原理 ​

本节在保持可读性的前提下,给出每个辨识步骤的核心公式与推导逻辑。想深入了解完整推导的读者请参阅原论文 Data-Driven System Identification of Quadrotors Subject to Motor Delays 第 III 节。

5.1 总体辨识流程 ​

整个辨识过程是顺序依赖的:前一步的结果是后一步的输入。流程图如下:

mermaid
flowchart TD
    A[输入: ULog 飞行日志 + 基本模型 JSON] --> B[步骤一: 辨识 T_m 与推力曲线]
    B --> C[步骤二: 辨识 Ixx, Iyy]
    C --> D[步骤三: 估计 Izz]
    D --> E[步骤四: 辨识 Kτ]
    E --> F[输出: 完整动力学模型]

各步骤的输入/输出关系:

步骤输入数据待求参数所依赖的前序结果
步骤一上下飞行日志Tm, a,b,c无(但 Tm 和 a,b,c 需联合优化)
步骤二Roll/Pitch 飞行日志Ixx,IyyTm, a,b,c
步骤三(经验公式计算得出)IzzIxx,Iyy
步骤四Yaw 飞行日志KτTm, a,b,c, Izz

下面逐一展开每步的数学细节。

5.2 步骤一:推力曲线与电机时间常数 ​

5.2.1 不考虑延迟时的线性方程组 ​

四旋翼的线运动方程(机体坐标系下,FLU 约定):

m⋅aacc=∑i=14rfi⋅fi

其中 rfi 是第 i 个电机的推力方向(垂直机架配置下均为 (0,0,1)),fi 是该电机产生的推力,aacc 是加速度计读数。质量 m 已由电子秤实测得到。

假设推力 fi 是电机转速 ωmi 的二次函数:

fi=ai+biωmi+ciωmi2

代入线运动方程并写成矩阵形式。对于第 k 个采样时刻,z 轴方向(推力主方向):

m⋅aacc,k(z)=∑i=14(ai+biωmi,k+ciωmi,k2)

将所有 N 个采样时刻堆叠,得到超定线性方程组:

Ax=b

其中各矩阵/向量的构造为:

b=[m⋅aacc,1(z)m⋅aacc,2(z)⋮m⋅aacc,N(z)]N×1,x=[a1b1c1⋮a4b4c4]12×1A=[1ωm1,1ωm1,12⋯1ωm4,1ωm4,121ωm1,2ωm1,22⋯1ωm4,2ωm4,22⋮⋮⋮⋱⋮⋮⋮1ωm1,Nωm1,N2⋯1ωm4,Nωm4,N2]N×12

通过最小二乘直接求解:

x∗=arg⁡minx∥Ax−b∥22=(ATA)−1ATb

实际中四个电机的推力曲线通常取均值 a¯=14∑i=14ai(b,c 同理),因为同型号电机和电调的推力特性几乎一致,取均值可以提高鲁棒性。

5.2.2 电机延迟的 EMA 模型 ​

上述推导要求已知各时刻的电机转速 ωmi,对于很多无法获取电机转速数据的飞控来说,其日志中只有电机设定值 ωspi(归一化到 0~1 的油门指令)。而电机又无法瞬时响应设定值变化,二者之间存在一阶动态关系:

ω˙mi(t)=1Tm(ωspi(t)−ωmi(t))

其中 Tm 是一阶时间常数(单位:秒)。该微分方程在离散时间下的解为指数移动平均(EMA)递推式:

ωmi[k+1]=α⋅ωmi[k]+(1−α)⋅ωspi[k]

其中 α=e−Δt/Tm,Δt 为采样间隔。初始条件 ωmi[0]=ωspi[0](假设初始时刻电机已达到设定值)。

5.2.3 Tm 与推力曲线的联合优化 ​

Tm 本身也是未知的。辨识策略是在合理范围内(小型四旋翼通常 20ms~100ms,一般不会超过 100ms,具体范围应根据所用电机-电调组合的特性合理设定)做一维扫描 + 嵌套最小二乘:

对于每个候选 Tm 值:

  1. 用 EMA 递推式从 ωspi 估计 ωmi
  2. 用 ωmi 构造 A 矩阵
  3. 求解 x∗=(ATA)−1ATb
  4. 计算拟合均方根误差:RMSE(Tm)=1N∥Ax∗−b∥22

最优 Tm 为使 RMSE 最小的值:

Tm∗=arg⁡minTm∈[Tmin,Tmax]RMSE(Tm)

这等价于在均匀先验下的最大后验估计(MAP):

Tm∗=arg⁡maxTmp(Tm∣D)=arg⁡minTm∑k=1N∥bk−Akx∥22

RMSE-Tm 曲线通常在最优值处呈现清晰的最小值(参考原论文图 2)。找到 Tm∗ 后,对应的 x∗ 即为最终推力曲线参数。

5.3 步骤二:转动惯量 Ixx,Iyy 的辨识 ​

有了 Tm 和推力曲线,就可以计算每个采样时刻每个电机的实际推力 fi(t)。现在转向角运动方程。

5.3.1 x 轴转动惯量 ​

绕 x 轴的角动力学(考虑纯垂直推力配置):

ω˙bxIxx=τx

其中 ω˙bx 是 x 轴角加速度(由 vehicle_angular_velocity_xyz_derivative[0] 直接提供,或对角速度做数值差分得到),τx 是绕 x 轴的总力矩。

在小角速度假设下忽略陀螺进动项,τx 仅由四个电机的推力对质心的力矩贡献:

τx=∑i=14(rpi×rfi)x⋅fi

其中 rpi 是电机位置向量(由模型 JSON 提供),rfi 是推力方向 (0,0,1),叉积的 x 分量即为力矩臂。

将所有采样时刻堆叠为最小二乘形式:

[ω˙bx[1]ω˙bx[2]⋮ω˙bx[N]]⏟Ax[Ixx]⏟xx=[τx[1]τx[2]⋮τx[N]]⏟bx

求解得到:

Ixx=∑k=1Nω˙bx[k]⋅τx[k]∑k=1Nω˙bx[k]2

5.3.2 y 轴转动惯量 ​

完全对称地:

Iyy=∑k=1Nω˙by[k]⋅τy[k]∑k=1Nω˙by[k]2

其中 τy=∑i=14(rpi×rfi)y⋅fi。

5.4 步骤三:Izz 的估计 ​

对于纯垂直推力(推力方向均为 (0,0,1))的四旋翼,z 轴的力矩来源与 x、y 轴不同。x、y 轴力矩由推力对质心的几何叉积 rpi×rfi 产生,但由于推力方向平行于 z 轴,该叉积的 z 分量恒为零。z 轴力矩完全来自螺旋桨的反扭矩(rotor torque),由模型 JSON 中的 rotor_torque_directions 定义(rτi,z 分量为 ±1):

τz=∑i=14rτi,z⋅Kτ⋅fi

因此 z 轴角动力学为:

ω˙bzIzz=Kτ∑i=14rτi,z⋅fi

观察上式可以发现,只能辨识出比值 Izz/Kτ,而非各自的绝对值。为解决这个歧义性,利用了以下统计规律:

对大量四旋翼平台的实测数据(原论文表 II 及图 1)进行线性回归后发现,(Ixx+Iyy)/2 与 Izz 之间存在稳定的比例关系:

Izz=Ixx+Iyy2⋅Cxy→z,Cxy→z≈1.832

其物理直观:对于近似扁平对称的四旋翼,绕 z 轴的转动惯量约是绕水平轴平均值的 1.8 倍(质量分布在外围电机位置,离 z 轴较远)。

5.5 步骤四:扭矩系数 Kτ 的辨识 ​

有了 Izz,即可从偏航飞行数据中辨识 Kτ。定义 z 轴力矩输入:

τz(input)=∑i=14rτi,z⋅fi

z 轴角动力学:

ω˙bzIzz=Kτ⋅τz(input)

构造最小二乘问题:

Az=[τz(input)[1]⋮τz(input)[N]],bz=[ω˙bz[1]⋅Izz⋮ω˙bz[N]⋅Izz]Kτ=∑k=1Nτz(input)[k]⋅(ω˙bz[k]⋅Izz)∑k=1N(τz(input)[k])2

实践中 Kτ 的估计噪声通常较大(偏航动力学慢,信噪比低),但其精度对整体控制效果影响有限。若辨识结果偏差过大,可近似取同量级数值,不会显著影响最终控制效果。

本章参考资料与引申阅读已汇总至 参考资料。