MATLAB Simmechanics/Simscape四旋翼无人机控制仿真(3)无人机控制器设计

2023-05-16

MATLAB Simmechanics/Simscape四旋翼无人机控制仿真(3) 无人机控制器设计

  • MATLAB Simmechanics/Simscape四旋翼无人机控制仿真(3) 无人机控制器设计
    • 1 前言
    • 2 非线性约束
    • 3 控制器设计
    • 4 控制效果

MATLAB Simmechanics/Simscape四旋翼无人机控制仿真(3) 无人机控制器设计

如果您是非控制专业,那么PID控制足够控制前文所搭建的无人机了:
MATLAB Simmechanics/Simscape四旋翼无人机控制仿真(1) SolidWorks模型的导入.
MATLAB Simmechanics/Simscape四旋翼无人机控制仿真(2) Simulink模型调节.
本博客需要一些现代控制理论中Lyapunov稳定性的一些理论知识。
模型详见:
https://github.com/mkb9559/Simscape-Quadrotor
MATLAB Simmechanics/Simscape四旋翼无人机控制仿真(4) 串级姿态控制.
Demo视频.
最近更新了第二代模型,可以参考:
MATLAB Simmechanics/Simscape四旋翼无人机控制仿真(5) F250旋翼仿真搭建.

1 前言

关于无人机的控制原理这里将不再赘述,控制信息流可以用下面这个图说明:
在这里插入图片描述
关于无人机动力学模型推导,这里也不再赘述,不过根据欧拉角旋转顺序,模型会有一些sin和cos上的细微差别,下面直接引用一种动力学模型:
在这里插入图片描述
其中 ϕ \phi ϕ θ \theta θ ψ \psi ψ分别为滚转角,俯仰角和偏航角
原文:
Bouabdallah, S. , P. Murrieri , and R. Siegwart . “Design and control of an indoor micro quadrotor.” IEEE International Conference on Robotics and Automation, 2004. Proceedings. ICRA '04. 2004 IEEE, 2004.

2 非线性约束

从前面的控制信息流里面可以看到,无人机只有4个控制输入,其期望的俯仰和滚转角是根据水平控制求解的,而不是给定参考的因此,考虑 u x {{u}_{x}} ux u y {{u}_{y}} uy
在这里插入图片描述
反解上式,得到期望俯仰和滚转角:
在这里插入图片描述

3 控制器设计

其实6个通道的控制器设计过程都很相似,下面只以滚转角 ϕ \phi ϕ为例。
使用的方法是经典的反步法,如果笔者把书上关于反步法介绍搬过来,那么笔者自己也不能理解书上在说啥哈哈,因此这里将用一种很通俗的方法叙述并设计:
首先滚转角状态方程,令 x 1 = ϕ {{x}_{1}}=\phi x1=ϕ x 2 = ϕ ˙ {{x}_{2}}=\dot{\phi } x2=ϕ˙
{ x ˙ 1 = x 2 x ˙ 2 = l u 2 + θ ˙ ψ ˙ ( I y − I z ) I x \left\{ \begin{matrix} {{{\dot{x}}}_{1}}={{x}_{2}} \\ {{{\dot{x}}}_{2}}=\frac{l{{u}_{2}}+\dot{\theta }\dot{\psi }\left( {{I}_{y}}-{{I}_{z}} \right)}{{{I}_{x}}} \\ \end{matrix} \right. {x˙1=x2x˙2=Ixlu2+θ˙ψ˙(IyIz)
定义误差:
e 1 = x 1 d − x 1 {{e}_{1}}=x_{1}^{d}-{{x}_{1}} e1=x1dx1
首先考虑 x 2 {{x}_{2}} x2作为系统独立输入,要找到一个能使得 e 1 → 0 {{e}_{1}}\to 0 e10的状态反馈控制律 x 2 = φ ( x 1 ) {{x}_{2}}=\varphi \left( {{x}_{1}} \right) x2=φ(x1),因此定义误差:
e 2 = φ ( x 1 ) − x 2 {{e}_{2}}=\varphi \left( {{x}_{1}} \right)-{{x}_{2}} e2=φ(x1)x2
考虑:
V 1 = 1 2 e 1 2 {{V}_{1}}=\frac{1}{2}e_{1}^{2} V1=21e12
求导:
V ˙ 1 = e ˙ 1 e 1 = e 1 ( x ˙ 1 d − x ˙ 1 ) = e 1 ( x ˙ 1 d − x 2 ) = e 1 ( x ˙ 1 d − e 2 + φ ( x 1 ) ) \begin{aligned} & {{{\dot{V}}}_{1}}={{{\dot{e}}}_{1}}{{e}_{1}} \\ & ={{e}_{1}}\left( \dot{x}_{1}^{d}-{{{\dot{x}}}_{1}} \right) \\ & ={{e}_{1}}\left( \dot{x}_{1}^{d}-{{x}_{2}} \right) \\ & ={{e}_{1}}\left( \dot{x}_{1}^{d}-{{e}_{2}}+\varphi \left( {{x}_{1}} \right) \right) \\ \end{aligned} V˙1=e˙1e1=e1(x˙1dx˙1)=e1(x˙1dx2)=e1(x˙1de2+φ(x1))
φ ( x 1 ) \varphi \left( {{x}_{1}} \right) φ(x1)中不含 x 2 {{x}_{2}} x2相关项,因此这里交叉项 e 1 e 2 {{e}_{1}{e}_{2}} e1e2会保留,令 φ ( x 1 ) = − x ˙ 1 d + c 1 e 1 \varphi \left( {{x}_{1}} \right)=-\dot{x}_{1}^{d}+{{c}_{1}}{{e}_{1}} φ(x1)=x˙1d+c1e1 c 1 > 0 {{c}_{1}}>0 c1>0,则:
V ˙ 1 = − e 1 e 2 − c 1 e 1 2 {{\dot{V}}_{1}}=-{{e}_{1}}{{e}_{2}}-{{c}_{1}}e_{1}^{2} V˙1=e1e2c1e12
由上式可知:
e ˙ 1 = − e 2 − c 1 e 1 {{\dot{e}}_{1}}=-{{e}_{2}}-{{c}_{1}}{{e}_{1}} e˙1=e2c1e1
因此,上式求导得:
e ˙ 2 = − e ¨ 1 − c 1 e ˙ 1 {{\dot{e}}_{2}}=-{{\ddot{e}}_{1}}-{{c}_{1}}{{\dot{e}}_{1}} e˙2=e¨1c1e˙1
考虑:
V 2 = V 1 + 1 2 e 2 2 {{V}_{2}}={{V}_{1}}+\frac{1}{2}e_{2}^{2} V2=V1+21e22
求导:
V ˙ 2 = V ˙ 1 + e ˙ 2 e 2 = − c 1 e 1 2 + e 2 ( e ˙ 2 − e 1 ) = − c 1 e 1 2 + e 2 ( − e ¨ 1 − c 1 e ˙ 1 − e 1 ) = − c 1 e 1 2 + e 2 ( − x ¨ 1 d + x ˙ 2 − c 1 e ˙ 1 − e 1 ) \begin{aligned} & {{{\dot{V}}}_{2}}={{{\dot{V}}}_{1}}+{{{\dot{e}}}_{2}}{{e}_{2}} \\ & =-{{c}_{1}}e_{1}^{2}+{{e}_{2}}\left( {{{\dot{e}}}_{2}}-{{e}_{1}} \right) \\ & =-{{c}_{1}}e_{1}^{2}+{{e}_{2}}\left( -{{{\ddot{e}}}_{1}}-{{c}_{1}}{{{\dot{e}}}_{1}}-{{e}_{1}} \right) \\ & =-{{c}_{1}}e_{1}^{2}+{{e}_{2}}\left( -\ddot{x}_{1}^{d}+{{{\dot{x}}}_{2}}-{{c}_{1}}{{{\dot{e}}}_{1}}-{{e}_{1}} \right) \\ \end{aligned} V˙2=V˙1+e˙2e2=c1e12+e2(e˙2e1)=c1e12+e2(e¨1c1e˙1e1)=c1e12+e2(x¨1d+x˙2c1e˙1e1)
为了上式稳定,令 − x ¨ 1 d + x ˙ 2 − c 1 e ˙ 1 − e 1 = − c 2 e 2 -\ddot{x}_{1}^{d}+{{\dot{x}}_{2}}-{{c}_{1}}{{\dot{e}}_{1}}-{{e}_{1}}=-{{c}_{2}}{{e}_{2}} x¨1d+x˙2c1e˙1e1=c2e2 c 2 > 0 {{c}_{2}}>0 c2>0,得:
x ¨ 2 = x ¨ 1 d + c 1 e ˙ 1 + e 1 − c 2 e 2 = x ¨ 1 d + c 1 e ˙ 1 + e 1 − c 2 ( − e ˙ 1 − c 1 e 1 ) = x ¨ 1 d + ( c 1 + c 2 ) e ˙ 1 + ( 1 + c 1 c 2 ) e 1 \begin{aligned} & {{{\ddot{x}}}_{2}}=\ddot{x}_{1}^{d}+{{c}_{1}}{{{\dot{e}}}_{1}}+{{e}_{1}}-{{c}_{2}}{{e}_{2}} \\ & =\ddot{x}_{1}^{d}+{{c}_{1}}{{{\dot{e}}}_{1}}+{{e}_{1}}-{{c}_{2}}\left( -{{{\dot{e}}}_{1}}-{{c}_{1}}{{e}_{1}} \right) \\ & =\ddot{x}_{1}^{d}+\left( {{c}_{1}}+{{c}_{2}} \right){{{\dot{e}}}_{1}}+\left( 1+{{c}_{1}}{{c}_{2}} \right){{e}_{1}} \\ \end{aligned} x¨2=x¨1d+c1e˙1+e1c2e2=x¨1d+c1e˙1+e1c2(e˙1c1e1)=x¨1d+(c1+c2)e˙1+(1+c1c2)e1
求解 u 2 {{u}_{2}} u2
l u 2 + θ ˙ ψ ˙ ( I y − I z ) I x = x ¨ 1 d + ( c 1 + c 2 ) e ˙ 1 + ( 1 + c 1 c 2 ) e 1 u 2 = [ x ¨ 1 d + ( c 1 + c 2 ) e ˙ 1 + ( 1 + c 1 c 2 ) e 1 ] I x − θ ˙ ψ ˙ ( I y − I z ) l \begin{aligned} & {\frac{l{{u}_{2}}+\dot{\theta }\dot{\psi }\left( {{I}_{y}}-{{I}_{z}} \right)}{{{I}_{x}}}=\ddot{x}_{1}^{d}+\left( {{c}_{1}}+{{c}_{2}} \right){{\dot{e}}_{1}}+\left( 1+{{c}_{1}}{{c}_{2}} \right){{e}_{1}}} \\ & {{{u}_{2}}=\frac{\left[ \ddot{x}_{1}^{d}+\left( {{c}_{1}}+{{c}_{2}} \right){{{\dot{e}}}_{1}}+\left( 1+{{c}_{1}}{{c}_{2}} \right){{e}_{1}} \right]{{I}_{x}}-\dot{\theta }\dot{\psi }\left( {{I}_{y}}-{{I}_{z}} \right)}{l}} \end{aligned} Ixlu2+θ˙ψ˙(IyIz)=x¨1d+(c1+c2)e˙1+(1+c1c2)e1u2=l[x¨1d+(c1+c2)e˙1+(1+c1c2)e1]Ixθ˙ψ˙(IyIz)
调节系数的时候可以用下式:
u 2 = [ x ¨ 1 d + k 1 e ˙ 1 + k 2 e 1 ] I x − θ ˙ ψ ˙ ( I y − I z ) l {{{u}_{2}}=\frac{\left[ \ddot{x}_{1}^{d}+{{k}_{1}}{{{\dot{e}}}_{1}}+{{k}_{2}}{{e}_{1}} \right]{{I}_{x}}-\dot{\theta }\dot{\psi }\left( {{I}_{y}}-{{I}_{z}} \right)}{l}} u2=l[x¨1d+k1e˙1+k2e1]Ixθ˙ψ˙(IyIz)
其中:
{ k 1 > 0 k 2 > 1 \left\{ \begin{matrix} {{k}_{1}}>0 \\ {{k}_{2}}>1 \\ \end{matrix} \right. {k1>0k2>1
上式总能解出 c 1 {{c}_{1}} c1 c 2 {{c}_{2}} c2

4 控制效果

这里简单放一下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MATLAB Simmechanics/Simscape四旋翼无人机控制仿真(3)无人机控制器设计 的相关文章

  • ROS雷达包出现:ERROR: cannot launch node of type: rplidar_ros

    ROS雷达包出现 xff1a ERROR cannot launch node of type rplidar ros 问题分析详情 问题分析 仅安装了基础ROS xff0c rplidar ros包没有安装 详情 下载包并解压缩 1 使用
  • nvidia-smi出现的比较慢

    一个比较老的问题 xff0c 一般四卡以上的机器可能会出现 以前我都是 nvidia span class hljs attribute smi span span class hljs attribute pm span span cla
  • 【tensorflow】tensorflow的安装及应用

    安装tensorflow的三种方法 1 在cmd命令行中输入pip install tensorflow xff0c 默认安装最新版 2 其他旧版本的安装 xff0c 去pypi org官网 可以点击release history选择想要的
  • 汇编:stmdb和ldmia指令

    参考了网上一些文章 xff0c 简单说一下stmdb和ldmia指令的作用 xff0c 如有错误欢迎指正 首先一句话说一下stmdb和ldmia指令 的作用 xff1a stmdb和ldmia指令一般配对使用 xff0c stmdb用于将寄
  • ARM 内联汇编 加速 算法

    首推移动端arm cpu优化学习笔记第4弹 内联汇编入门 xff0c 但是其只给出了代码 xff0c 很多人还不知道怎么在手机上跑起来 xff0c 其实只需要一个CMakeLists txt就可以了 cmake minimum requir
  • centos7.3环境编译安装pktgen-dpdk,dpdk工具

    概述编译环境编译DPDK编译Pktgen dpdkDebug 概述 DPDK xff08 Date Plane Development Kit xff09 主要基于Linux系统运行 xff0c 用于快速数据包处理的函数库与驱动集合 xff
  • 捷联惯导算法心得

    1 四个概念 xff1a 地理 坐标系 机体 坐标系 他们之间换算公式 换算公式用的系数 地理坐标系 xff1a 东 北 天 xff0c 以下简称 地理 在这个坐标系里有重力永远是 xff08 0 0 1g xff09 xff0c 地磁永远
  • Java中的域,静态域,实例域

    域 所谓的域 xff0c 是field的翻译 xff0c 也就是我们常说的字段 xff0c 或者属性 比如类的字段 xff08 属性 xff09 xff0c 局部的 xff0c 全局的 静态域 也就是静态属性 xff0c 我们可以单独为它设
  • 【线程篇】线程间同步之信号量、互斥锁

    线程 xff1a 进程内部的一条执行路径 xff08 序列 xff09 什么是线程什么是进程 xff0c 进程和线程的区别 xff1f 进程是一个正在运行的程序 xff0c 是系统进程资源分配的基本单位 线程是进程内部的一条执行路径 xff
  • PL/SQL报错:无法解析指定的连接标识符

    在安装oracle的时候PL SQL报错 xff1a ORA 12154 TNS 无法解析指定的连接标识符 xff0c 在网上找了很多资料 xff0c 然后问题解决 其中下面的文章分析的过程很值得学习 xff0c 特地转载过来时刻告诫自己全
  • 【idm】idm突破cookie封锁 (解决http:1.1 403 forbidden)(附charles使用教程)

    文章目录 一 问题二 解决方法 xff08 1 xff09 在chrome中获得cookies xff08 2 xff09 安装配置charles 三 另外的方法参考 idm的使用教程参考 xff1a 一 问题 使用idm下载文件出现如下问
  • 四旋翼飞行器数学建模+轨迹跟踪控制

    数学模型 xff08 状态空间方程 xff09 xff1a 控制算法 有限时间 xff08 finite time control xff09 控制 xff0c 文献 1 xff1b 比例 微分 xff08 PD xff09 控制 xff0
  • 卡尔曼滤波算法总结

    自己学习整理卡尔曼滤波算法 xff0c 从放弃到精通 kaerman 滤波算法 卡尔曼滤波是非常经典的预测追踪算法 xff0c 是结合线性系统动态方程的维纳滤波 xff0c 其实质是线性最小均方差估计器 xff0c 能够在系统存在噪声和干扰
  • 做嵌入式驱动的前途何在

    做嵌入式驱动的前途何在 做嵌入式linux驱动的前途何在 xff1f 或者说 xff0c 怎么才能做好这一行 xff1f 我做嵌入式驱动开发已经一年多了 xff0c 感觉没学到多少东西 从网络驱动到CAN驱动 从dataflash驱动到NA
  • 串口通信的调试01

    在开发中 xff0c 我们经常遇到这种情况 xff0c 供应商给了一台仪器 xff0c 然后仪器配套有软件 我们通过点击按钮往仪器发送命令 xff0c 仪器返回数据 有些时候 xff0c 我们希望可以通过自己编写的软件来操作仪器 xff0c
  • Linux驱动程序开发之三----按键驱动(Tiny6410)

    在Linux驱动程序开发之三 按键驱动 xff08 Tiny6410 xff09 博文中讨论了使用中断来实现按键驱动 xff0c 毫无疑问 xff0c 中断方式效率相当高 xff0c 但是在此之前 xff0c CPU要想获知按键的状态都是通
  • 飞控信号SBUS信号解析为PWM信号输出

    飞控信号SBUS信号解析为PWM信号输出 1 修改STM32时钟频率 xff1a static void SetSysClockTo72 void IO uint32 t StartUpCounter 61 0 HSEStatus 61 0
  • GTSAM 的使用

    GTSAM 的使用 GTSAM 是一个在机器人领域和计算机视觉领域用于平滑 xff08 smoothing xff09 和建图 xff08 mapping xff09 的C 43 43 库 它与 g 2 o 不同的是 xff0c g 2 o
  • ROS智能车实现darknet_ros检测物体

    文章目录 一 搭建智能车环境1 下载包以及编译1 1 下载源码包1 2 编译1 3 错误解决 xff08 1 xff09 controllers相关 xff08 2 xff09 driver base相关 xff08 3 xff09 ack
  • 使用Vant完成DatetimePicker 日期的选择器

    效果展示 xff1a 代码展示 xff1a lt template gt lt div id 61 34 date time picker 34 gt lt van button plain type 61 34 primary 34 64

随机推荐