最近有小白反映上一道菜内容过于丰富,吃撑了,本菜鸡今天给大家做一道开胃小菜,下面开始表演。

主料 -- 无人机动力学模型,NMPC模型

辅料 -- Quadrotor场景文件

炊具 -- V-REP,CasADi,MATLAB

1. 无人机动力学模型

直接上图,就是这么简单粗暴

惯性系,机体系,姿态角,力与力矩方向定义

可能有些小白还是一脸懵逼。简而言之就是,我们把无人机(确切滴说是四旋翼类型的)看做一个刚体,有四个旋翼提供力和力矩,控制无人机的位姿和速度。回顾刚体的运动学与动力学,我们知道描述刚体运动一种方式就是在刚体上任意点(可以是刚体所占据空间内的,也可以是刚体以外空间的)固联一个坐标系

 [公式] (一般放在质心,本菜在这里也放在质心,有些情形放在其他位置更好,比如多刚体系统放在刚体连接处),描述这个坐标系相对于某参考坐标系 

[公式] 的位姿(位置和姿态),速度(线速度,角速度以及姿态参数变化)。

平动部分运动学很简单,没啥说的。

转动部分运动学的推导需要先弄清楚以下几个东东:

  • [公式] 

 [公式] 的关系

先引入一个符号 [·] X表示把一个三维向量变成反对称阵的形式,也就是叉乘映射的矩阵表示。根据旋转矩阵求导的定义有, 

[公式] ,即

 [公式]

这个式子的意义其实就是同一线性映射(这里是叉乘)在不同基的变换。直观一点看,把这个等式左右两边右乘一个向量在

 [公式] 坐标系的坐标,那么左边得到叉乘后的向量在

[公式] 坐标系的坐标;右边的话,先是一个

 [公式] 作用得到在

 [公式] 坐标系的坐标,然后得到叉乘后向量在 

[公式] 坐标系的坐标,最后再用

 [公式] 拉回到

[公式] 坐标系。同时,我们也得到

 [公式]

  • 关于绕坐标轴旋转矩阵的导数

进一步滴,我们得到,当角速度和 R 矩阵的等效转轴共线,那么这两个角速度的表示是一样的。也就是说,对于绕坐标轴的基本旋转,我们可以有如下一组等式(记转角为 α ,三阶单位矩阵 I3X3 的三列分别为

 [公式] ):

[公式]

  • 一个有用等式

其实这个等式不需要什么高深的知识,就是同一个向量在不同坐标系的变换而已。考虑 

[公式] 

 [公式] 是 坐标系

[公式] 相对于

 [公式] 坐标系转动的角速度向量在不同坐标系的表示而已,直接有

 [公式] 

 [公式] ,然后把这俩式子同时写成反对称矩阵形式,有

 [公式] 

 [公式] ,再联系前面,我们有:

[公式]

现在可以开始推导了。

  • 用欧拉角参数化旋转矩阵

[公式]

  • 将参数化的旋转矩阵及其导数带入旋转矩阵定义式

[公式]

乘进去,有

[公式]

带入绕坐标轴旋转矩阵的导数,有

[公式]

带入一个有用等式,有

[公式]

两边一起脱贫摘帽,即得到角速度与欧拉角参数变化率之间的关系

[公式]

简记为 [公式]

话说,有些小白是不是纳闷为啥用 

[公式] 而不用

 [公式] 。那是因为我们要用Lagrangian 方法推导动力学,而转动惯量在机体坐标系是常数矩阵,便于转动动能的表示。

  • 动力学推导

系统广义坐标与广义速度分别为

[公式] [公式]

系统状态变量为12维向量

[公式]

控制输入为4维向量,分量为各个旋翼的角速度平方

[公式]

旋翼的推进力和力矩系数分别为 k,b ,旋翼转轴距离机体坐标系原点距离为,则机体所受到的合力和合力矩在坐标系

[公式]内表示为

[公式]

[公式]

系统的Lagrangian

[公式]

将如下各式带入 L

[公式]

[公式]

[公式]

[公式]

[公式]

[公式]

根据

 [公式] 即可得动力学方程

[公式]

2. NMPC模型

这个例程套用标准形式(二次型损失函数,动力学约束,控制与状态约束)。在编写代码时,用CasADi帮助实现符号计算与自动微分,得到1中动力学模型与损失函数的符号表示,然后用CasADi做好的非线性优化器调用ipopt进行NLP求解,具体的可以看NMPC_problem_formulation.m文件。

CasADi链接

这里要说一说CasADi求jacobian的一个坑。

首先记 [公式]

如果你去求解1中的动力学方程,你会遇到求

 [公式] 的问题。如果你用MATLAB的符号计算,可以在定义符号变量的直接采用如下定义:

syms phi(t) theta(t) psi(t)

这样接着构建

[公式] 之后,可直接对t求导数,一步到位。然而CasADi不支持这样定义,所以你只能用链式法则求,在此过程中你得特别注意矩阵对于向量求导的结果排列顺序,这一点上MATLAB和CasADi是相同的,即把矩阵按照列的顺序扯成一个列向量,然后结果矩阵的每一行就是这个大向量的每个元素对于自变量的每一个分量的偏导数。

我们的控制目标是实现轨迹跟踪,系统的输出就是状态变量的前六个。目标轨迹我们给的是位置走8字形,欧拉角一直为零,详见QuadrotorReferenceTrajectory.m文件。如果想在V-REP中显示期望路径点以便于实际运行的结果对比,可以利用QuadrotorReferenceTrajectory.m文件产生对应时间序列的期望点,然后抽取出位置值部分,保存成CSV文件,通过V-REP中的File->Import->Path from CSV加载显示。

3. 制作场景文件

菜鸡不知道怎么在V-REP实现流体仿真,所以这里只能调用sim.addForceAndTorque函数直接给无人机施加力和力矩了。无人机模型的构造极其简单,添加一个圆盘作为机身,然后添加四个力传感器(与旋翼转轴重合),与机身固联,接着再添加四个圆盘作为旋翼,与力传感器固联。把这五个圆盘的动力学参数设定好(这里需要等效质量与惯量的计算)之后,隐藏。最后添加可视化模型(可以从V-REP的模型库中拷贝),成品大概这样:

4. 运行

做初始欧拉角为零和不为零的仿真。

初始姿态无误差
初始姿态有误差

----------------------------------------------------

本例程源文件链接(切记只可用于学习,科研等非商业用途)

-----------------------------------------------------

做人呐,最重要的就是开心喽。能帮到别人是最大的快乐,希望本菜鸡能对小白们有所帮助,希望大佬们的批评能帮助本菜鸡成长!