本次实验中主要关注的是对无人机的动态控制进行建模并仿真,即探究计算主板输出PWM波到整个无人机系统,该系统输出变量的变化(例如:位置、速度、位姿、角速度等)。为什么要选择对平衡态的无人机进行建模呢?因为当俯仰角和滚转角过大时,计算主板对俯仰角和滚转角的控制模型从线性控制器变为非线性控制,控制难度增大,解析计算难度增大。当然并不是无法对无人机的高速高机动建模,比如SE(3)微分平坦算法就可以解决该类问题。但非线性控制不是本文主题(我太菜,所以只能在平衡态建模)。
贴个图说明一下当姿态角幅度过大时,线性控制器已经无法良好跟踪信号。
这部分内容参考了北航可靠飞行组的实验代码,我从头梳理一遍之后,自己按照物理模型一步一步画simulink框图。这样自己走一遍代码更有体会。
贴一下资料网站
代码与实验课件:
http://rfly.buaa.edu.cn/course.html#ZhCourse
控制平台FlightGear与PX4工具包:https://rflysim.com/zh/3_Using/ControllerDesignAndSimulationPlatform.html#id2
首先我们打开动力系统模拟网站http://flyeval.com/paper/,选择无人机的元器件型号,随后计算生成该系统的物理参数
根据悬停时力平衡的关系
m g = 4 c T ω 2 mg = 4c_T\omega^2 mg=4cTω2
可以解出悬停时电机的转速,我们将它作为电机的初始转速。
将这些物理参数作为初始化值,写成Matlab脚本:
clear;
%电机相关参数
% 油门——电机稳定转速关系式:wss = Cr * σ + wb
MotorInit_RPM = 557.1420; % 给定电机初始转速
Motor_Cr = 737.24; % 油门——电机稳定转速曲线斜率
Motor_wb = 161.87; % 油门——电机稳定转速曲线截距
Motor_Tm = 0.0895; % 电机惯性时间常数
Motor_Jm = 2.13e-4; % 电机螺旋桨转动惯量
%螺旋桨相关参数
Rotor_CT = 1.051e-5; % 螺旋桨推力系数
Rotor_CM = 1.789e-7; % 螺旋桨力矩系数
%机体气动参数
uav_Cd = 0.228; % 阻力系数
uav_mass = 1.5; % 多旋翼总体质量
uav_R = 0.225; % 多旋翼机架半径
uav_Jxx = 1.663e-2; % x轴转动惯量(单位: kg.m^2)
uav_Jyy = 1.663e-2 ; % y轴转动惯量(单位: kg.m^2)
uav_Jzz = 3.033e-2; % z轴转动惯量(单位: kg.m^2)
uav_J = [uav_Jxx,0,0;0,uav_Jyy,0;0,0,uav_Jzz];
uav_GravityAcc = 9.8; % 机体在重力场所受加速度
%计算悬停时所需油门
%公式: mg = 4*CT*ωss^2
% ωss = CR*σ + ωb
THR = (sqrt(uav_mass*uav_GravityAcc/4/Rotor_CT)-Motor_wb)/Motor_Cr;
得到机体自身的物理参数后,我们打开Simulink环境,开始搭建动态控制模型。按照如下的控制流程框图,我更偏向于按照从底层到顶层的顺序来搭建模型。
首先我们先搭建动力单元模型。主板输出的PWM波范围为[1000,2000],我们需要提前对PWM波进行归一化处理,转换成油门值。
接下来我们对动力单元进行建模,根据动力单元公式:
ω s s = C r σ + ω b \omega_{ss} = C_r \sigma +\omega_b ωss=Crσ+ωb
ω i = 1 T m s + 1 ω s s \omega_i = \frac{1}{T_ms+1} \omega_{ss} ωi=Tms+11ωss
先对第一条公式进行建模,输入为油门 输出为目标稳定转速
我们可以很明显的发现第二个公式实际上是一个一阶动态系统,为了控制的方便,我们将其化为状态空间方程式的形式。
x ′ = A x + B u x \prime = A x +Bu x′=Ax+Bu
y = C x + D y = Cx +D y=Cx+D
设ωi作为输出变量,Tmω为状态变量,套进表达形式里推一推可以得到
x = T m ω s s x = T_m \omega_{ss} x=Tmωss
x ′ = T m T m s + 1 ω s s ′ = T m s T m s + 1 ω s s x \prime = \frac{T_m}{T_ms+1} \omega_{ss} \prime = \frac{T_ms}{T_ms+1} \omega_{ss} x′=Tms+1Tmωss′=Tms+1Tmsωss
T m s T m s + 1 ω s s = ( A T m T m s + 1 + B ) ω s s \frac{T_ms}{T_ms+1} \omega_{ss} =( \frac{AT_m}{T_ms+1} +B)\omega_{ss} Tms+1Tmsωss=(Tms+1ATm+B)ωss
A T m + B ( T m s + 1 ) = T m s AT_m + B(T_ms+1) = T_ms ATm+B(Tms+1)=Tms
解得
{ A = − 1 T m B = 1 C = 1 T m D = 0 \left\{ \begin{array}{c}A = -\frac{1}{T_m} \\ B = 1 \\ C = \frac{1}{T_m} \\ D = 0 \end{array} \right. ⎩⎪⎪⎨⎪⎪⎧A=−Tm1B=1C=Tm1D=0
在Simulink上对稳定转速与当前转速的传递函数进行建模,并结合之前建立的油门与稳定转速的模型,由此我们就可以得到以油门为输入,以螺旋桨转速为输出动力单元的整体模型。
接着我们根据X字型四旋翼无人机的控制效率公式搭建模型
[ F 拉 力 τ x τ y τ z ] = [ c T c T c T c T 2 2 d c T − 2 2 d c T − 2 2 d c T 2 2 d c T 2 2 d c T 2 2 d c T − 2 2 d c T − 2 2 d c T c M − c M c M − c M ] [ ω 1 2 ω 2 2 ω 3 2 ω 4 2 ] \begin{bmatrix} F_{拉力} \\ \tau_x \\ \tau_y \\ \tau_z \end{bmatrix} = \begin{bmatrix} c_T & c_T & c_T & c_T \\ \frac{\sqrt{2}}{2}dc_T & -\frac{\sqrt{2}}{2}dc_T & -\frac{\sqrt{2}}{2}dc_T & \frac{\sqrt{2}}{2}dc_T \\ \frac{\sqrt{2}}{2}dc_T & \frac{\sqrt{2}}{2}dc_T& -\frac{\sqrt{2}}{2}dc_T & -\frac{\sqrt{2}}{2}dc_T \\ c_M & -c_M &c_M & -c_M \end{bmatrix} \begin{bmatrix} \omega^2_1 \\ \omega^2_2 \\ \omega^2_3 \\ \omega^2_4 \end{bmatrix} ⎣⎢⎢⎡F拉力τxτyτz⎦⎥⎥⎤=⎣⎢⎢⎡cT22dcT22dcTcMcT−22dcT22dcT−cMcT−22dcT−22dcTcMcT22dcT−22dcT−cM⎦⎥⎥⎤⎣⎢⎢⎡ω12ω22ω32ω42⎦⎥⎥⎤
一开始我打算直接在模型里插入一个矩阵相乘的模块,但这样不好把4*1矩阵中的拉力和力矩分离出来以供刚体控制模型使用。可以在simulink中插入“Matlab Function函数”来自己编写函数脚本,自动生成函数自变量为输入、因变量为输出的模块。
%自定义函数模块
function [Fb,Mb] = efficiency_control(w,R,Cm,Ct)
%%叉字型
%3 1
%2 4
M_rctcm = [-sin(pi/4)*R*Ct,sin(pi/4)*R*Ct,sin(pi/4)*R*Ct,-sin(pi/4)*R*Ct;
sin(pi/4)*R*Ct,-sin(pi/4)*R*Ct,sin(pi/4)*R*Ct,-sin(pi/4)*R*Ct;
Cm,Cm,-Cm,-Cm];
Mb = M_rctcm*(w.^2);%式(6.24),力矩
Fb = [0; 0; -sum(Ct*(w.^2))]; %(6.23),螺旋桨拉力
end
接下来,我们搭建气动阻力模型。根据阻力公式
f 阻 = − C d v b , 其 中 C d 为 阻 力 系 数 ( 常 数 ) , v b 为 机 体 坐 标 系 下 的 速 度 f_阻 = -C_dv_b , 其中C_d为阻力系数(常数),v_b为机体坐标系下的速度 f阻=−Cdvb,其中Cd为阻力系数(常数),vb为机体坐标系下的速度
我们可以把气动模型在simulink里封装为函数
function f_r = resistance_model(Vb,Cd)
f_r = Cd*Vb.*abs(Vb)*0.5;
end
最后我们建立最上层的刚体控制模型,这部分要分为动力学和运动学两个部分。根据刚体动力学的两个公式:
{ b v ′ = − [ b ω ] × b v + g R T e 3 − f m e 3 J ⋅ b ω ′ = − b ω × ( J ⋅ b ω ) + G a + τ \left\{ \begin{array}{c} {^b}v \prime = -[{^b}\omega ] \times {^b}v +g R^T e_3 - \frac{f}{m} e_3 \\ J \cdot {^b} \omega \prime = - {^b} \omega \times (J \cdot {^b} \omega) +G_a + \tau \end{array} \right. {bv′=−[bω]×bv+gRTe3−mfe3J⋅bω′=−bω×(J⋅bω)+Ga+τ
将机体速度、机体角速度、受力f、陀螺力矩、力矩作为输入,可以解得机体速度微分和角速度微分输出,再经过一个积分环节便可以得到速度、角速度。很明显前验速度的微分需要后验速度的参与才可以计算出来,因此还需要将输出量再返回给输入量。
先对第一条公式进行建模将地球固联坐标系的重力加速度变换到机体坐标系后再加上拉力与阻力的影响并减去速度与角速度的叉乘便可以的到机体速度的微分
(注意vb的反馈)
再对第二条公式进行建模,根据公式将力矩、陀螺力矩与一大坨矩阵叉乘点乘加起来后再除以转动惯量便得到了机体角速度的微分
。
计算陀螺力矩并封装为函数
function Ga = fcn(Jrp,MotorRads,pqr)
Ga=zeros(3,1);
Ga(1)=Jrp*pqr(2)*(-MotorRads(1)-MotorRads(2)+MotorRads(3)+MotorRads(4));
Ga(2)=Jrp*pqr(1)*( MotorRads(1)+MotorRads(2)-MotorRads(3)-MotorRads(4));
得到了机体速度的微分
与机体角速度的微分
,我们通过积分环节便可以得到机体速度
与机体角速度
,机体速度
经过坐标变换便可以的到地球固联坐标系的速度
,机体角速度
则可以通过一下公式转换为四元数、旋转矩阵和欧拉角的导数。
{ R ′ = R [ b ω ] x Θ ′ = W ⋅ b ω q v ′ = 1 2 ( q 0 I 3 + [ q v ] x ) b ω \left\{ \begin{array}{c} R \prime = R [{^b}\omega]_x \\ \Theta \prime = W \cdot {^b} \omega \\ q_v \prime = \frac{1}{2}(q_0 I_3 + [q_v]_x) {^b}\omega \end{array} \right. ⎩⎨⎧R′=R[bω]xΘ′=W⋅bωqv′=21(q0I3+[qv]x)bω
在进行姿态表示的转换时,我们要注意旋转矩阵和欧拉角存在解的奇异性问题,因此选用四元数表示和计算才是最佳方法,先将机体角速度转换成四元数
function qdot = fcn(pqr,q)
qdot=0.5*[0,-pqr(1),-pqr(2),-pqr(3);pqr(1),0,pqr(3),-pqr(2);pqr(2),-pqr(3),0,pqr(1);pqr(3),pqr(2),-pqr(1),0]*q;
得到四元数导数后再进行积分得到四元数,当然不能忘记对四元数进行归一化处理,得到四元数后便可以转成欧拉角和旋转矩阵了。
对机体速度
和地球固联坐标系下的速度
进行积分处理便得到了机体坐标系下的位移
和地球固联坐标系下的位移
最后的最后,我们完成了对无人机的动态建模,最终模型如下(麻了)
仿真联合了FlightGear软件进行,因此需要提前下载该软件并在Matlab中安装相关工具包。仿真前先进行配置,编写myownUAV-set.xml配置文件和myownUAV.xml文件
myownUAV-set.xml配置文件如下:
myownUAV
network
Aircraft/myownUAV/Models/myownUAV.xml
-40
2
myownUAV.xml配置文件如下:
myownUAV.ac
spin
propeller1
/engines/engine[0]/rpm
-1
0
7.5
1
0.0
0.0
1.0
spin
propeller2
/engines/engine[1]/rpm
1
7.5
0
1
0.0
0.0
1.0
spin
propeller3
/engines/engine[2]/rpm
-1
0
-7.5
1
0.0
0.0
1.0
spin
propeller4
/engines/engine[3]/rpm
1
-7.5
0
1
0.0
0.0
1.0
在运行FlightGear之前,要先双击GEN FG RUN模块,打开后设置脚本名称、FlightGear位置、模型名称、端口、飞行机场背景等以后,点Generate Script在MATLAB工作目录下生成一个脚本。
使用文本编辑器打开脚本,做如下修改:
运行FlightGear。运行生成的.bat文件,然后对
Matlab进行仿真即可实现Matlab动力学模
型驱动FlightGear 3D模型飞行。最终仿真时的模型框图为:
先令油门值为0.7,经过3s后再令油门值为0.5,观察FlightGear中无人机的运动,示波器中显示高度的变化值
Simulink建模是研究机器人控制模型的有利工具,应当系统认真学习。在建模中要注意以下几点: