六自由度四旋翼悬停恢复¶
背景¶
小型四旋翼偏离悬停状态后,需要在转速和转速变化能力均受限时,同时 消除平移和转动。由于推力方向随姿态变化,即使不考虑空气动力,这仍是 一个平移与转动耦合的非线性最优控制问题。
本例在固定的 5 秒时域内,把一架 Crazyflie 量级的飞行器恢复到原点 悬停。姿态采用三个修正罗德里格斯参数(MRP),而不是四维四元数, 因此不需要冗余状态和单位范数等式约束。
问题定义¶
令 \(\boldsymbol r,\boldsymbol v\in\mathbb R^3\) 为惯性系位置和速度, \(\boldsymbol p\in\mathbb R^3\) 为 MRP 向量, \(\boldsymbol\omega\in\mathbb R^3\) 为机体系角速度。第 \(i\) 个转子的 执行器状态定义为无量纲转速平方比
其中 \(\Omega_i\) 是转速,\(\Omega_h\) 是水平悬停转速;控制量为其变化率 \(\nu_i=\dot c_i\)。对应的机体系推力为
模型采用以下四个力臂和机体反作用偏航力矩符号:
这里 \(d_i\) 表示转子作用在机体上、绕 \(+\boldsymbol e_3\) 轴的反作用 偏航力矩符号,并不是桨叶自转方向本身的符号。机体系合力与合力矩为
机体系到惯性系的旋转矩阵 \(R(\boldsymbol p)\) 由非冗余 MRP 映射得到:
系统动力学为
这里 \([\boldsymbol p]_\times\) 是叉乘矩阵。固定终端时间为 \(T=5\ \mathrm s\),初始状态为
四个转子在首尾均取平衡悬停命令:
因此终端执行器状态产生的总推力为 \(mg\),机体系合力矩为零。终端刚体 状态自由,但受到较强惩罚。
目标函数中的每一项都先作无量纲化。定义
其中 \(r_s=1\ \mathrm m\)、\(v_s=1\ \mathrm{m/s}\)、 \(\theta_s=1\ \mathrm{rad}\)、\(\omega_s=1\ \mathrm{rad/s}\), \(\nu_s=4\ \mathrm{s^{-1}}\)。光滑的局部姿态误差代理 \(4\boldsymbol p\) 在悬停邻域与主旋转向量一阶一致。无量纲目标函数为
转子和姿态局部参数域的路径约束为
最后一个不等式把主旋转角限制在 \(150^\circ\) 内。
变量、参数与单位¶
| 符号 | 含义 | 数值或单位 |
|---|---|---|
| \(\boldsymbol r,\boldsymbol v\) | 惯性系位置和速度 | m、m/s |
| \(\boldsymbol p\) | 修正罗德里格斯姿态向量 | 无量纲 |
| \(\boldsymbol\omega\) | 机体系角速度 | rad/s |
| \(c_i\) | 转速平方比;执行器状态 | 无量纲 |
| \(\nu_i=\dot c_i\) | 转速平方比变化率;控制量 | 1/s |
| \(\Omega_i\) | 转子物理转速 | rad/s |
| \(m\) | 飞行器质量 | \(0.033\ \mathrm{kg}\) |
| \(I_b\) | 机体惯量对角线 | \((1.395,1.395,2.173)\times10^{-5}\ \mathrm{kg\,m^2}\) |
| \(k_f\) | 推力系数 | \(2.3\times10^{-8}\ \mathrm{N/(rad/s)^2}\) |
| \(k_m\) | 阻力矩系数 | \(7.8\times10^{-10}\ \mathrm{N\,m/(rad/s)^2}\) |
| \(l\) | 转子力臂半跨距 | \(0.028\ \mathrm m\) |
| \(d_i\) | 机体反作用偏航力矩符号 | \(+1,-1,+1,-1\) |
| \(r_s,v_s,\theta_s,\omega_s,\nu_s\) | 目标函数参考尺度 | \(1\ \mathrm m,\ 1\ \mathrm{m/s},\ 1\ \mathrm{rad},\ 1\ \mathrm{rad/s},\ 4\ \mathrm{s^{-1}}\) |
建模选择与适用边界¶
MRP 是最小维、光滑的局部姿态坐标,能够避免额外的四元数单位范数 约束;但它不是全局姿态表示,在整周 \(360^\circ\) 旋转处存在奇异性。 本例也没有实现影子集切换,因此显式加入 \(150^\circ\) 路径边界,只适合 局部恢复机动,不适合任意翻滚轨迹。
模型包含刚体平移、陀螺转动、力臂力矩、转子阻力矩和连续且受变化率
约束的执行器命令。状态 \(c_i\) 是命令整形模型,而不是电气或机电电机
模型:变化率上限约束的是转速平方比,并不直接等同于转轴角加速度。
模型还省略了气动阻力、地面效应、传感器噪声和外部扰动。默认离散为
\(44\times2\) Lobatto 网格;--quick 只用于粗网格冒烟测试。
运行示例¶
在仓库根目录运行:
使用统一绘图风格保存图片且不打开窗口:
验证结果¶
求解后,脚本在 4,001 个物理时刻重构全部状态与控制,把无量纲转子状态 换算为物理转速,检查密集网格上的转速、变化率和 MRP 参数域边界,并 核对优化终端状态与阶段端点。脚本还分别要求终端位置、速度、姿态和角 速度误差足够小,四个命令均等于 1,而且终端线加速度与角加速度足够小。 最后两项检查能够区分真正的平衡悬停与“状态恰好经过零附近、但终端力矩 仍不平衡”的轨迹。
| 指标 | 默认求解值 |
|---|---|
| 目标函数 \(J\) | \(8.54936175\) |
| 终端位置误差 | \(0.000001\ \mathrm m\) |
| 终端速度误差 | \(0.000002\ \mathrm{m/s}\) |
| 终端主姿态角误差 | \(0.000089^\circ\) |
| 终端角速度误差 | \(0.000000\ \mathrm{rad/s}\) |
| 最大终端转子命令误差 | 按表中精度为 \(0\) |
| 终端线加速度范数 | \(1.532\times10^{-5}\ \mathrm{m/s^2}\) |
| 终端角加速度范数 | \(3.843\times10^{-19}\ \mathrm{rad/s^2}\) |
| 密集转速范围 | \(1400.89\) 至 \(2164.74\ \mathrm{rad/s}\) |
| 转速平方比变化率峰值 | \(4.0000\ \mathrm{s^{-1}}\) |
| 总推力峰值 | \(0.4258\ \mathrm N\) |
| MRP 参数域最小径向余量 | \(0.569544\) |
结果不仅把飞行器恢复到接近静止,还使终端转子状态产生平衡悬停力和 力矩,而不只是减小运动学状态误差。密集重构后的转速和变化率均满足 边界。这些数值对应离散问题的一个局部最优解,并不构成全局最优性证明。

源代码¶
完整可运行示例见:
examples/drone_stabilization.py。