关于INDI的前言:

增量型非线性控制方法是一种2010年以后才流行起来的非线性控制方法,目前主要用于设计先进飞行控制律。这种方法的典型代表是增量型动态逆(incremental nonlinear dynamic inversion)以及增量型反步法(incremental backstepping)。
目前,INDI和IBKS在多个领域(包括但不限于直升机模型,四旋翼模型/真机,固定翼UAV模型/真机,Cessna的Citation(奖状)模型/真机,倾转旋翼机模型,evtol(电动垂直起降)真机)里得到应用及验证。已被广泛证明是一种能够简单应用并具备较强鲁棒性和容错性能的控制算法。相关文献可以自行google。

虽然是非线性控制方法,但是在我看来它对模型的依赖程度与PID差不多,甚至比现代控制方法的模型依赖程度还低(因为现代控制比如LQR,MPC等一般需要工作点的线性模型)。

这种非线性控制方法在四旋翼上的实现,我已知的就TU delft有人一直在paparazzi上验证,所以我就想在PX4上实现一下,毕竟(我觉得)也不是很难实现的亚子。

这种方法的应用难度不在于关于模型的知识,而在于系统状态的获取。因为除了PID需要的状态量之外,它还需要知道两个量:被控量的导数,以及作动器的当前位置。

对于飞机的姿态控制来说,一般都需要角加速度测量值,这个值一般可以通过对陀螺仪计算出来的角速度滤波来获得。但是看文献最近也有用专门的角加速度传感器来获得的,控制效果会比前者更好。

关于作动器的位置,如果可以测的话肯定是最好,如果没有的话可以通过对作动器环节建模,然后计算出估计的 u 0 u_{\tiny 0} u0​ 来,保证 x 0 x_{\tiny 0} x0​ 和 u 0 u_{\tiny 0} u0​ 的时刻是一致的。这样增量模型的假设才能成立。

%%%%%%%%%%%%%%%%%%%%%%%%%%%

INDI简单推导

参考 ’Cascaded incremental nonlinear dynamic inversion for MAV disturbance‘ 这篇文章

例如对于下面这个一阶系统:
x ˙ = f ( x ) + g ( x ) u \dot{x}=f(x)+g(x){u} x˙=f(x)+g(x)u

写成增量模型,则为:
x ˙ = x ˙ 0 + g ( x ) Δ u + Δ f \dot{x}=\dot{x}_{\tiny 0}+g(x)\Delta{u}+\Delta{f} x˙=x˙0​+g(x)Δu+Δf
(其中, x ˙ 0 \dot{x}_{\tiny 0} x˙0​是上一采样时刻的 x ˙ \dot{x} x˙; Δ u \Delta{u} Δu是这一采样时刻与上一采样时刻的输入量之差。 Δ f \Delta{f} Δf是模型简化的误差,采样频率越高这个值就越小,在设计INDI控制器时可以忽略。)

定义跟踪误差为:
e = x − x r e=x-x_r e=x−xr​

上式左右求导,可得指令跟踪误差的动态为:
e ˙ = x ˙ 0 + g ( x ) Δ u − x ˙ r \dot{e}=\dot{x}_{\tiny 0}+g(x)\Delta{u}-\dot{x}_r e˙=x˙0​+g(x)Δu−x˙r​

根据上述方程,这样如果想要得到一个指数收敛的误差系统,则可以令 Δ u \Delta{u} Δu为:
Δ u = − g ( x ) − 1 ( x ˙ 0 − x ˙ r + K p e ) \Delta{u}=-{g(x)}^{-1}(\dot{x}_{\tiny 0}-\dot{x}_r+K_pe) Δu=−g(x)−1(x˙0​−x˙r​+Kp​e)

把上式代入上上式,则可以得到:
e ˙ = − K p e \dot{e}=-K_pe e˙=−Kp​e
即误差渐进收敛。

如果想要收敛的快一点,则可以把线性反馈改成非线性反馈,例如令 Δ u \Delta{u} Δu为:
Δ u = − g ( x ) − 1 ( x ˙ 0 − x ˙ r + K p ∣ u ∣ α s i g n ( u ) ) \Delta{u}=-{g(x)}^{-1}(\dot{x}_{\tiny 0}-\dot{x}_r+K_p|u|^{\alpha}sign(u)) Δu=−g(x)−1(x˙0​−x˙r​+Kp​∣u∣αsign(u))

最后真实的 u u u 计算方法为:
u = u 0 + Δ u u=u_{\tiny 0}+\Delta{u} u=u0​+Δu
其中 u 0 u_{\tiny 0} u0​ 是作动器的当前位置(对于电机来说就是当前的转速)

关于的四旋翼控制的一点解释说明:
基于时标分离假设,对于四旋翼的位置控制来说可以分成四环:
位置-> 速度-> (力/加速度)->姿态-> 角速度-> 电机转速(力矩)
(从力/加速度到姿态实际上只是一个换算)

其实这四环分别对应了两个二阶动态。也就是力到位移的二阶动态,以及力矩到姿态的二阶动态。这两个二阶动态又分别由一个动力学方程和一个运动学方程组成。。。不过这些概念只是帮助理解,就不细说了

根据位置误差会计算出三个加速度指令,一方面可以计算出两个 tilt 角度的指令,也就是 θ \theta θ 和 ϕ \phi ϕ 的指令。另一方面可以计算出总的加速度指令来计算推力指令。最后再指定 ψ \psi ψ的角度,就正好是四个指令,由四个电机来控制。总的来看其实就是四个电机(输入)控制 x , y , z , ψ x,y,z,\psi x,y,z,ψ 这四个量

由于涉及模型知识的只是力方程和力矩方程里的动力学方程,外环的运动方程不涉及建模偏差问题(只有测量偏差问题),所以在外环只用普通的NDI就够了,不需要INDI。

事实上,我打算只在姿态控制上用INDI,在推力控制上不用INDI,因为PX4里姿态控制和推力控制也是分开的,如果推力控制也改的话,工作量有点大。。。所以INDI这里只是算一个力矩,然后跟推力结合在一起,再由mixer去分配

另外,本着由简单入手的原则,在角度环我也打算保留原来的,毕竟px4本来的角度环控制也只有一个P。因为四旋翼这个东西,如果tilt角度不大的话,外环到内环的线化程度就是比较高的。

从方法论的角度来说,这种工程就应该是从简单到复杂去做,先用简单的例子去验证关键技术,然后再慢慢增加复杂度。再说INDI本来就是在动力学这环和其他控制方法的差别比较大,所以在角速度环进行修改是非常合适的。

OK,要做的工作总结来说就是,把PX4的角速度环改成INDI,其他基本不变。

%%%%%%%%%%%%%%%%%%%%%%%%%%%

在PX4中修改的部分

首先用于四旋翼的INDI需要简单推导一下:

首先给出四旋翼角速度环动力学方程:
J Ω ˙ + Ω × J Ω = M c + M a + M r J\dot{\Omega}+\Omega{\times}J{\Omega}=M_c+M_a+M_r JΩ˙+Ω×JΩ=Mc​+Ma​+Mr​
其中 Ω \Omega Ω为角速度(p, q, r), J J J 是惯量矩阵, M c = G M ω 2 M_c=G_M{\omega}^2 Mc​=GM​ω2为控制力矩, M a M_a Ma​为气动力矩, M r M_r Mr​为陀螺力矩。 G M G_M GM​ 是操纵效率矩阵, ω \omega ω为电机转速

也就是:
Ω ˙ = J − 1 G M Ω 2 + J − 1 ( − Ω × J Ω + M a + M r ) \dot{\Omega}=J^{-1}G_M{\Omega}^2+J^{-1}(-\Omega{\times}J{\Omega}+M_a+M_r) Ω˙=J−1GM​Ω2+J−1(−Ω×JΩ+Ma​+Mr​)
简化之后就是: Ω ˙ = g ( x s t a t e s ) ω 2 + f ( s t a t e s ) \dot{\Omega}=g(x_{states}){\omega}^2+f(states) Ω˙=g(xstates​)ω2+f(states)
其中 g ( x s t a t e s ) = J − 1 G M g(x_{states})=J^{-1}G_M g(xstates​)=J−1GM​

对于角速度控制环来说,令指令跟踪误差为 e Ω = Ω − Ω r e_{\tiny \Omega}=\Omega-\Omega_r eΩ​=Ω−Ωr​
则角速度跟踪误差的动态方程可以写成
e ˙ Ω = Ω ˙ 0 − Ω ˙ r + g ( x s t a t e s ) Δ ω 2 \dot{e}_{\Omega}=\dot{\Omega}_{\tiny 0}-\dot{\Omega}_r+g(x_{states})\Delta{\omega^2} e˙Ω​=Ω˙0​−Ω˙r​+g(xstates​)Δω2

那么可以得到(电机引起的)力矩的增量
G M Δ ω 2 = − J ( Ω ˙ 0 − Ω ˙ r + K p e Ω ) G_M\Delta{\omega^2}=-J(\dot{\Omega}_{\tiny 0}-\dot{\Omega}_r+K_pe_{\tiny \Omega}) GM​Δω2=−J(Ω˙0​−Ω˙r​+Kp​eΩ​)

然后可以得到力矩的指令:
M c = G M ⋅ ω 0 2 + G M ⋅ Δ ω 2 M_c=G_M\cdot{\omega_{\tiny 0}^2}+G_M\cdot\Delta{\omega^2} Mc​=GM​⋅ω02​+GM​⋅Δω2
其中 ω 0 2 \omega_{\tiny 0}^2 ω02​是估计出来的或者测量回来的转速。

这个 M c M_c Mc​算出来之后就可以用来分配了

也就是 ω r 2 = G M − 1 M c \omega_r^2=G_M^{-1}M_c ωr2​=GM−1​Mc​
其中 ω r \omega_r ωr​是电机转速指令,即我们希望电机到达的转速

OK,以上即是关于INDI如何应用到四旋翼的第一部分,理论部分,关于代码修改部分在part2给出

先进非线性控制方法 INDI 快速部署到PX4用于四旋翼控制(part1)相关推荐

  1. Optitrack视觉定位下基于ROS及PX4搭建四旋翼多机飞行平台

    Optitrack视觉定位下基于ROS及PX4搭建四旋翼多机飞行平台搭建 1 单机平台 1.1 四旋翼硬件组装 a)注意 1.2 机载板环境配置 1.3 飞控参数配置 a)注意 1.4 实飞全流程 2 ...

  2. 使用FIT2CLOUD在青云QingCloud快速部署和管理Kubernetes集群

    一.Kubernetes概述 Kubernetes是Google一直在推进的容器调度和管理系统,是Google内部使用的容器管理系统Borg的开源版本.它可以实现对Docker容器的部署,配置,伸缩和 ...

  3. 网秦通过亚马逊云科技进行全球应用的快速部署

    "AWS为我们提供全球多个位置的快速部署,帮我们节省了大量的时间,同时它能让我们灵活改变不同的租用方式和规模,最大程度地保护了我们的投资.从时间上来看,AWS使网秦的全球软件应用部署时间,从 ...

  4. 3分钟内快速部署MySQL5.6.35数据库实践

    3分钟内快速部署MySQL5.6.35数据库实践 1.下载软件 wget -q http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.35-linux-g ...

  5. 杨强教授力荐,快速部署落地深度学习应用的实践手册

    香港科技大学计算机科学与工程学系讲座教授.国际人工智能联合会(IJCAI)理事会主席(2017-2019).深圳前海微众银行首席AI 官 杨强为<深度学习模型及应用详解>一书撰序,他提到现 ...

  6. 2、使用 kubeadm 方式快速部署K8S集群

    文章目录 一.kubernetes 官方提供的三种部署方式 二.使用kubeadm搭建k8s集群 2.1 基础环境设置 2.2 安装Docker 2.3 添加kubernetes软件源 2.4 安装k ...

  7. 如何快速部署国人开源的 Java 博客系统 Tale

    喜欢我们的文章?!欢迎大家关注腾讯云技术社区-简书主页哦~ 文末有彩蛋,不要错过! 除了闷头专研技术之外,程序员还需要不断地写作进行技术积累,写博客是其中最重要的方式之一.商业博客平台不少,但是更符合 ...

  8. 华为4G路由器成软银快速部署宽带业务新利器

    随着全球4G网络的快速部署和发展,华为4G无线路由器凭借即插即用.卓越的无线性能.良好的Wi-Fi覆盖等优点,已经成为各大运营商大力推进优质宽带业务的新利器,有效地帮助运营商在竞争和用户体验上获得先机 ...

  9. Cloud Foundry 登录 Azure,一键快速部署 PaaS

    微软宣布在Azure云端平台上,推出Cloud Foundry的公共预览版,可提供快速部署机制,让开发者一键就能用Cloud Foundry打造出自家PaaS环境.微软预计未来数周内释出公共测试版,几 ...

最新文章

  1. jquery之行自加自减
  2. mysql索引详解_MySQL索引详解
  3. Probability, Matringale,Markov Chain, MCMC
  4. 华为畅享8plus停产了吗_牢记华为手机“三不买”原则,不花冤枉钱,选错要吃亏!...
  5. JSP实例-彩色验证码
  6. 【华为云技术分享】【测试微课堂】 有的放矢制定测试计划
  7. python的常用语句_python常用语句
  8. 动态规划(四)--最长公共子序列
  9. web服务器与web框架
  10. shell脚本学习笔记(二)myplayer添加播放列表的源码
  11. 使用腾讯云文字识别提取图片中的文字内容
  12. 深夜扒一扒Android的发展史
  13. 学并发编程,透彻理解这三个核心是关键
  14. Elasticsearch之快速入门篇(个人笔记)
  15. 高等数学上学习总结(集合,邻域,函数)
  16. 两道非常容易理解错的OSPF问题. 加深理解LSA的概念和ABR/ASBR的概念.
  17. 关于SV的一些知识1
  18. MySQL数据库——MySQL数据表添加字段(三种方式)
  19. MSRA的2022秋招各大厂SSP+ offer
  20. Solar-Putty如何修改显示字体大小

热门文章

  1. Python量化数据仓库搭建系列1:数据库安装与操作
  2. 2019Android 网络编程总结篇,你想要的三次握手和四次握手
  3. 基于STM32单片机的函数信号发生器原理图PCB
  4. Mybatisplus配置类中配置分页、乐观锁
  5. Zephyr - 架构移植指导
  6. 快速获取安卓手机界面元素的坐标
  7. 从零开始单排学设计模式「开发-封闭原则」青铜 - 白银 晋级赛
  8. 计算机控制技术试题a卷,2011年下广陵学院《计算机控制技术》考试卷(A)
  9. PyQt5的日期和时间
  10. 完美攻略之风之继承者(风の继承者)中日文双语攻略