四旋翼双环PID控制

2023-05-16

在我上篇博客《四旋翼无人机Matlab建模》中,我建立了四旋翼的模型,并在simulink中搭建了仿真,但并没有设计控制器。本章便针对四旋翼设计最常见的串级PID控制器,本篇文章主要从两个部分讲述控制器设计,一是理论部分,二是实践部分,阅读本文需要了解PID算法,推荐阅读https://blog.csdn.net/nemol1990/article/details/45131603

一、理论部分

在四旋翼的控制中,最常见也是最方便使用的控制便是PID控制。主要是因为PID算法简单,适应性强,不依赖模型。而四旋翼无人机是一个四输入六输出的系统,系统模型参见我上篇博客《四旋翼无人机Matlab建模》,对于该模型,我们设计串级PID,下面我先给出四旋翼模型:
{ x ¨ = u 1 m ( s ψ s ϕ + c ψ c ϕ s θ ) − k 1 m x ˙ + d 1 y ¨ = u 1 m ( s ψ s θ c ϕ − c ψ s ϕ ) − k 2 m y ˙ + d 2 z ¨ = u 1 m c θ c ϕ − g − k 3 m z ˙ + d 3 ϕ ¨ = θ ˙ ψ ˙ ( I y y − I z z I x x ) + u 2 I x x + d 4 θ ¨ = ϕ ˙ ψ ˙ ( I z z − I x x I y y ) + u 3 I y y + d 5 ψ ¨ = ϕ ˙ θ ˙ ( I x x − I y y I z z ) + u 4 I z z + d 6 ( 1 ) \left\{\begin{matrix} \ddot{x}=\frac{ u_{1}}{m}(s\psi s\phi +c\psi c\phi s\theta )-\frac{k_{1}}{m}\dot{x}+d_{1}\\ \ddot{y}=\frac{ u_{1}}{m}(s\psi s\theta c\phi - c\psi s\phi)-\frac{k_{2}}{m}\dot{y}+d_{2}\\ \ddot{z}=\frac{ u_{1}}{m}c\theta c\phi -g-\frac{k_{3}}{m}\dot{z}+d_{3}\\ \ddot{\phi }=\dot{\theta }\dot{\psi }(\frac{I_{yy}-I_{zz}}{I_{xx}})+\frac{u_{2}}{I_{xx}}+d_{4}\\ \ddot{\theta }=\dot{\phi }\dot{\psi }(\frac{I_{zz}-I_{xx}}{I_{yy}})+\frac{u_{3}}{I_{yy}}+d_{5}\\ \ddot{\psi }=\dot{\phi }\dot{\theta }(\frac{I_{xx}-I_{yy}}{I_{zz}})+\frac{u_{4}}{I_{zz}}+d_{6} \end{matrix}\right.(1) x¨=mu1(sψsϕ+cψcϕsθ)mk1x˙+d1y¨=mu1(sψsθcϕcψsϕ)mk2y˙+d2z¨=mu1cθcϕgmk3z˙+d3ϕ¨=θ˙ψ˙(IxxIyyIzz)+Ixxu2+d4θ¨=ϕ˙ψ˙(IyyIzzIxx)+Iyyu3+d5ψ¨=ϕ˙θ˙(IzzIxxIyy)+Izzu4+d6(1)具体建立过程可见我上一篇博客,在这里我们同样忽略干扰 d i d_{i} di,即 d i = 0 , i = 1...6 d_{i}=0,i=1...6 di=0,i=1...6,忽略空气阻力,即 k i = 0 k_{i}=0 ki=0,只为方便理解,有需要可以自己最后在模型里加上。
首先由PID原理设计四旋翼速度环,即 x ¨ = K p x ( x 0 − x ) + K i x ∫ ( x 0 − x ) d t + K d x d ( x 0 − x ) d t ( 2 ) \ddot{x}=K_{px}(x_{0}-x)+K_{ix}\int (x_{0}-x)dt+K_{dx}\frac{d(x_{0}-x)}{dt}(2) x¨=Kpx(x0x)+Kix(x0x)dt+Kdxdtd(x0x)(2) y ¨ = K p y ( y 0 − y ) + K i y ∫ ( y 0 − y ) d t + K d y d ( y 0 − y ) d t ( 3 ) \ddot{y}=K_{py}(y_{0}-y)+K_{iy}\int (y_{0}-y)dt+K_{dy}\frac{d(y_{0}-y)}{dt}(3) y¨=Kpy(y0y)+Kiy(y0y)dt+Kdydtd(y0y)(3) z ¨ = K p z ( z 0 − z ) + K i z ∫ ( z 0 − z ) d t + K d z d ( z 0 − z ) d t ( 4 ) \ddot{z}=K_{pz}(z_{0}-z)+K_{iz}\int (z_{0}-z)dt+K_{dz}\frac{d(z_{0}-z)}{dt}(4) z¨=Kpz(z0z)+Kiz(z0z)dt+Kdzdtd(z0z)(4)其中 x 0 , y 0 , z 0 x_{0},y_{0},z_{0} x0,y0,z0是期望位置, x , y , z x,y,z x,y,z是实际位置,此为速度环PID公式
由于最后控制四旋翼的控制量是 u 1 , u 2 , u 3 , u 4 u_{1},u_{2},u_{3},u_{4} u1,u2,u3,u4,而 x , y , z x,y,z x,y,z u 1 u_{1} u1有关,因此可以计算出 u 1 u_{1} u1的表达式 u 1 = m x ¨ 2 + y ¨ 2 + ( z ¨ + g ) 2 ( 5.1 ) u_{1}=m\sqrt{\ddot{x}^2+\ddot{y}^2+(\ddot{z}+g)^2}(5.1) u1=mx¨2+y¨2+(z¨+g)2 (5.1) u 1 = m z ¨ c θ c ϕ ( 5.2 ) u_{1}=\frac{m\ddot{z}}{c\theta c\phi }(5.2) u1=cθcϕmz¨(5.2)
虽然式5.1与5.2都可以计算u1的值,但是式5.1中涉及到 x ¨ , y ¨ , z ¨ \ddot{x},\ddot{y},\ddot{z} x¨,y¨,z¨,存在耦合,会导致PID参数调节困难,因此计算 u 1 u_{1} u1采取式5.2。
这一部分在simulink中搭建如下
在这里插入图片描述

接下来开始姿态环设计,我们都知道,当四旋翼保持一定的横滚角或俯仰角时,四旋翼一定不能静止,一定向着x或y方向运动,即你可以理解为这两个姿态角的作用在一定程度上相当于速度的作用,改变这两个角可以改变四旋翼的飞行速度,从而改变无人机位置。从这里可以看到,x,y与 ϕ , θ \phi, \theta ϕ,θ之间存在耦合,因此 ϕ , θ \phi, \theta ϕ,θ的初始姿态 ϕ 0 , θ 0 \phi_{0}, \theta_{0} ϕ0,θ0需要通过模型(1)得到,即
ϕ 0 = a r c s i n [ m ( x ¨ s i n ψ − y ¨ c o s ψ ) / u 1 ] ( 6 ) \phi _{0}=arcsin[m(\ddot{x}sin\psi-\ddot{y}cos\psi)/u_{1}](6) ϕ0=arcsin[m(x¨sinψy¨cosψ)/u1](6) θ 0 = a r c s i n [ m ( x ¨ c o s ψ + y ¨ s i n ψ ) / ( u 1 c o s ϕ ) ] ( 7 ) \theta_{0}=arcsin[m(\ddot{x}cos\psi+\ddot{y}sin\psi)/(u_{1}cos\phi)](7) θ0=arcsin[m(x¨cosψ+y¨sinψ)/(u1cosϕ)](7)之后仿照(2),(3),(4)式可得姿态环,如下 ϕ ¨ = K p ϕ ( ϕ 0 − ϕ ) + K i ϕ ∫ ( ϕ 0 − ϕ ) d t + K d ϕ d ( ϕ 0 − ϕ ) d t ( 8 ) \ddot{\phi}=K_{p\phi}(\phi_{0}-\phi)+K_{i\phi}\int (\phi_{0}-\phi)dt+K_{d\phi}\frac{d(\phi_{0}-\phi)}{dt}(8) ϕ¨=Kpϕ(ϕ0ϕ)+Kiϕ(ϕ0ϕ)dt+Kdϕdtd(ϕ0ϕ)(8) θ ¨ = K p θ ( θ 0 − θ ) + K i θ ∫ ( θ 0 − θ ) d t + K d θ d ( θ 0 − θ ) d t ( 9 ) \ddot{\theta}=K_{p\theta}(\theta_{0}-\theta)+K_{i\theta}\int (\theta_{0}-\theta)dt+K_{d\theta}\frac{d(\theta_{0}-\theta)}{dt}(9) θ¨=Kpθ(θ0θ)+Kiθ(θ0θ)dt+Kdθdtd(θ0θ)(9) ψ ¨ = K p ψ ( ψ 0 − ψ ) + K i ψ ∫ ( ψ 0 − ψ ) d t + K d ψ d ( ψ 0 − ψ ) d t ( 10 ) \ddot{\psi}=K_{p\psi}(\psi_{0}-\psi)+K_{i\psi}\int (\psi_{0}-\psi)dt+K_{d\psi}\frac{d(\psi_{0}-\psi)}{dt}(10) ψ¨=Kpψ(ψ0ψ)+Kiψ(ψ0ψ)dt+Kdψdtd(ψ0ψ)(10)然后根据(1)式后三个式子可以计算出 u 2 , u 3 , u 4 u_{2},u_{3},u_{4} u2,u3,u4的值 u 2 = ϕ ¨ I x x ( 11 ) u_{2}=\ddot{\phi }I_{xx}(11) u2=ϕ¨Ixx(11) u 3 = θ ¨ I y y ( 12 ) u_{3}=\ddot{\theta }I_{yy}(12) u3=θ¨Iyy(12) u 4 = ψ ¨ I z z ( 13 ) u_{4}=\ddot{\psi }I_{zz}(13) u4=ψ¨Izz(13)其中,根据线性化的思想,将 ϕ ˙ , ψ ˙ , θ ˙ \dot{\phi },\dot{\psi },\dot{\theta} ϕ˙,ψ˙,θ˙相互乘积的部分忽略,至此双环PID控制器设计完成,接下来搭建simulink模型和整定PID参数。

实践部分

本部分包括模型搭建以及PID参数调节,先给出整体模型图,整体simulink模型如下
在这里插入图片描述
由于系统采取双环PID控制,因此调节参数时先确定内环参数,在内环参数确定后再开始调节外环。此外,内环的达到稳定的时间应小于外环。调整好pid参数后,就可以进行相关实验,比如让四旋翼画螺旋线,x输入sint,y输入cost,z输入0.1t,仿真时间50s,无人机螺旋线轨迹如下:
在这里插入图片描述
如果设定期望x为1,则无人机x变化曲线如下
在这里插入图片描述
如果设定期望y为1,则无人机y变化曲线如下
在这里插入图片描述
如果设定期望z为1,则无人机z变化曲线如下
在这里插入图片描述
simulink模型已经开源在网上,github下载地址:链接: 四旋翼pid控制simulink模型.gitee下载链接: 四旋翼pid控制.

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

四旋翼双环PID控制 的相关文章

  • PHP的大数组是什么意思?有什么作用?底层原理是什么?

    在 PHP 中 xff0c 大数组指的是包含大量元素的数组 xff0c 其元素数量可以达到数百万或数千万甚至更多 这种数组在处理大规模数据时非常有用 xff0c 例如在数据分析 机器学习和科学计算等领域中 PHP 的大数组的实现方式可以采用
  • PHP的全局变量是是干什么的?有什么作用?底层原理是什么?

    PHP的全局变量是指在整个PHP脚本中都可以被访问到的变量 这些变量存储在PHP进程的内存中 xff0c 并在整个脚本执行期间保持不变 全局变量的作用是在不同的函数和代码块中共享数据 xff0c 从而使代码更加简洁和易于维护 全局变量的底层
  • PHP的日志是干什么的?有什么用?底层原理是什么?

    在软件开发中 xff0c 日志是记录系统活动的重要方式之一 xff0c 也是排查问题和故障排除的主要工具之一 PHP提供了多种日志记录方式 xff0c 如文件日志 数据库日志和Syslog等 它们的共同目的是在代码执行时收集和记录信息 xf
  • PHP的开发环境和部署环境是什么意思?底层原理是什么?

    PHP的开发环境和部署环境是指在开发和部署PHP应用程序时所使用的不同环境 开发环境通常是指程序员在本地开发PHP应用程序的环境 xff0c 其目的是为了让程序员能够快速开发和测试应用程序 xff0c 同时方便调试和排除问题 在开发环境中
  • PHP为什么需要错误报告级别?底层原理是什么?

    PHP提供了多种错误报告级别 xff0c 包括错误信息 警告信息 提示信息和严格模式等 xff0c 用于在开发过程中捕获和处理错误 底层原理是通过PHP的内部错误处理机制来实现的 当PHP执行脚本时 xff0c 如果出现了错误 xff0c
  • PHP的代码调试技巧是什么意思?底层原理是什么?

    PHP的代码调试技巧是指在开发过程中 xff0c 通过调试技术来解决代码中的问题 xff0c 提高代码的可靠性和稳定性 这些技巧可以帮助开发人员快速定位代码中的错误 xff0c 提高代码的质量和效率 PHP提供了多种调试技术 xff0c 包
  • PHP的mysqli扩展和mysql扩展的区别是什么?底层原理是什么?

    mysqli和mysql扩展都是PHP提供的操作MySQL数据库的扩展 它们的区别在于mysqli扩展是MySQL Improved Extension的简写 xff0c 是mysql扩展的改进版 xff0c 提供了更好的性能和更多的功能
  • PHP的依赖关系是什么意思?底层原理是什么?

    PHP的依赖关系指的是PHP应用程序或库与其他软件包或库之间的关系 这些软件包或库可能包括操作系统提供的库 xff0c 例如文件I O和网络功能 xff0c 也可能包括第三方库 xff0c 例如数据库客户端库和图像处理库 底层原理是 xff
  • 什么是Composer?底层原理是什么?

    Composer是PHP的一个依赖管理工具 xff0c 它可以帮助开发者在项目中自动管理依赖关系 xff0c 例如第三方库 框架 组件等 通过Composer xff0c 可以在项目中添加 更新 卸载依赖项 xff0c 并自动解析它们的依赖
  • 为什么composer可以自动管理依赖关系?底层原理是什么?

    Composer能够自动管理依赖关系的原理是基于包管理和自动加载的机制 首先 xff0c Composer通过一个名为Packagist的在线包存储库来管理各种PHP包 xff0c 这个仓库中包含了大量的PHP库和框架 xff0c 开发者可
  • windows线程同步-事件Event用法总结

    事件对象 Win32 中最具弹性的同步机制就属 events 对象了 Event 对象是一种核 心对象 xff0c 它的唯一目的就是成为激发状态或未激发状态 这两种状态全由程序 来控制 xff0c 不会成为 Wait 函数的副作用 Even
  • composer.lock是干什么的?底层原理是什么?

    composer lock文件是Composer工具在安装依赖包时生成的一个锁文件 它记录了当前应用程序所依赖的所有PHP库及其版本号 xff0c 以及所有依赖库所依赖的其他库及其版本号等信息 在运行composer install命令时
  • PHP的Zend引擎是干什么的?底层原理是什么?

    PHP的Zend引擎是PHP解释器的核心组件 xff0c 负责将PHP代码转换为可执行的指令集 xff0c 并执行这些指令 Zend引擎是PHP的默认执行引擎 xff0c 被广泛使用 Zend引擎的底层原理可以分为以下几个关键步骤 xff1
  • PHP解释器是干什么的?底层原理是什么?

    PHP解释器是用于解释执行PHP代码的软件程序 它负责将编写的PHP代码转换为可执行的机器指令 xff0c 并执行这些指令以实现代码的功能 PHP解释器的底层原理可以分为以下几个步骤 xff1a 词法分析 xff08 Lexical Ana
  • PHP代码的底层是什么?底层原理是什么?

    PHP代码的底层是由计算机可执行的机器码 xff08 二进制指令 xff09 组成 底层原理是将PHP代码经过编译和解释执行的过程转化为机器码 底层原理可以分为以下几个步骤 xff1a 词法分析 xff08 Lexical Analysis
  • Jetson Xavier NX 的SD卡系统镜像制作

    Jetson Xavier NX 的SD卡系统镜像制作 一 SD卡系统查看二 系统镜像制作三 系统镜像烧录 一 SD卡系统查看 现有的SD卡的内存为128G xff0c 其中64G内存并未分配 span class token commen
  • 嵌入式Linux下使用crond服务

    参考 xff1a https www linuxidc com Linux 2014 02 97369 htm http www linuxidc com Linux 2014 02 97360 htm https blog csdn ne
  • 关于Flexsns Sky 卡80%,以及乱码的解决问题

    一直被 flexsns sky 这个应用折磨好久了 xff0c 刚开始的时候安装成功 但是打开界面一直卡在80 那里 xff0c ucenter 里面的设置也是对的 官网也是挂的 xff01 于是百思不得解 接下来 我来说说我的解决办法把
  • Ubuntu18.04运行ORB-SLAM3(Demo+本地Realsense D415运行)

    ORB SLAM3论文地址 xff1a https arxiv org abs 2007 11898 代码地址 xff1a https github com UZ SLAMLab ORB SLAM3 一 安装库 根据ORB SLAM3源代码
  • ROS中的坐标与坐标系转换

    ROS中的TF 官网建议新工作直接使用tf2 xff0c 因为它有一个更清洁的界面 xff0c 和更好的使用体验 xff08 自ROS Hydro以来 xff0c tf第一代已被 弃用 xff0c 转而支持tf2 xff09 TF介绍 TF

随机推荐

  • 激光雷达与相机融合(二)-----基于openCV的YOLO目标检测

    代码解析 1 加载模型 span class token comment load image from file span cv span class token operator span Mat img span class toke
  • 线程优先权Thread Priority概念总结

    全文参考 WIN32多线程设计 一书 为什么会有线程优先权 xff1a 为什么CPU处理线程时会按优先级执行 xff1f 想象在忙碌的一天中 xff0c 有很多事情待做但时间又不够 xff0c 其中有很多紧急的事情 比如当晚的英语在线测试
  • 将ros cv_bridge关联到自己安装的Opencv版本

    有时候需要同时使用较高版本的openCV 但一般默认安装的ros系统的cv bridge包关联的Opencv版本都较低 xff0c 这时候就需要将cv bridge关联到自己安装的高版本OpenCV 成功方法为第三条 xff0c 前两条为遇
  • chmod +x 与chmod 777的区别

    chmod 43 x 是将文件状态改为可执行 xff0c 而chmod 777 是改变文件读写权限 在linux中使用man命令查看chmod的大纲我们可以得出以下有用的信息 xff1a chmod OPTION MODE MODE FIL
  • WIndowsServer2012 DHCP服务器配置

    DHCP服务器配置 WIndowsServer2012 DHCP服务器配置服务器配置保留IP设置作用域选项 客户机设置 WIndowsServer2012 DHCP服务器配置 服务器配置 1 首先打开服务器管理器 xff0c 点击工具 xf
  • JavaScript设计模式:四、发布订阅模式

    JavaScript设计模式 xff1a 四 发布订阅模式 文章目录 JavaScript设计模式 xff1a 四 发布订阅模式一 概述1 观察者模式2 发布订阅模式3 观察者模式是不是发布订阅模式 一 概述 观察者模式 xff1a 观察者
  • FreeRTOS教程——二值信号量(四)

    二值信号量 信号量简介 目的 xff1a 共享资源访问 与任务同步 信号量类型 xff1a 二值信号量 计数型信号量 互斥信号量 递归互斥信号量 本质上是一种只包含一个项数的队列 二值信号量 0 和 1 xff0c 一种内核机制 内核同步
  • Bug:Warning: [antd: ***] overlay is deprecated. Please use menu instead.以及解决方案

    Ant Design Pro umi4Bug记录 xff1a Bug xff1a Warning antd overlay is deprecated Please use menu instead 解决方案 xff1a yarn add
  • 前端初学者的Ant Design Pro V6总结(上)

    前端初学者的Ant Design Pro V6总结 xff08 上 xff09 一 UI组件开发流程 61 gt 通用 xff08 异步 xff09 函数useEmotionCss 定义CSSuseModel获取全局状态useCallbac
  • 关于C语言在VS2017上开头格式

    span class token macro property span class token directive keyword include span span class token string lt stdio h gt sp
  • Java中Long和long的区别

    Java中Long和long的区别 Java的数据类型分为两种 xff1a 1 基本类型 xff1a byte 8 short 16 int 32 long 64 float 32 double 64 char 16 boolean 1 2
  • Windows 10 下如何彻底关闭 Hyper-V 服务

    CMD运行bcdedit set hypervisorlaunchtype off 恢复使用 xff1a bcdedit set hypervisorlaunchtype auto
  • 从百度运维实践谈“基于机器学习的智能运维”

    清华大学计算机系副教授裴丹于运维自动化专场发表了题为 基于机器学习的智能运维 的演讲 xff0c 上篇参看 科研角度谈 如何实现基于机器学习的智能运维 文章 xff0c 此为下篇 从百度运维实践谈基于机器学习的智能运维 以下为演讲实录 xf
  • python通过udp传输图片

    首先要了解UDP的工作模式 对于服务器 xff0c 首先绑定IP和端口 xff0c 本机测试的时候可以使用127 0 0 1是本机的专有IP xff0c 端口号 大于1024的是自定义的 xff0c 所以用大于1024的端口号 xff0c
  • D435i跑通ORB-SLAM2

    这篇文章主要记录我的实现过程 根据官方安装文档 xff0c 并参考以下两篇博客 xff0c 可以比较顺利的实现 xff1a Realsense D435i 在ubuntu上安装SDK与ROS Wrapper 运行ORB SLAM2 RTAB
  • 通俗理解滑模变结构控制(1)

    这里写自定义目录标题 1 什么是滑模变结构控制2 滑模变结构的一些基本知识3 滑模控制器设计4 滑模控制器例子 1 什么是滑模变结构控制 在开始介绍滑模变结构控制之前 xff0c 最好先学习一些线性控制的基础 xff0c 知道什么是李亚普诺
  • 终端滑模(Terminal滑模)理解

    一 什么是终端滑模 在前面所介绍的滑模控制中 xff0c 我们是选取了一个线性的滑模面s xff0c 使系统达到滑模面后 xff0c 误差逐渐收敛到0 xff0c 收敛的速度可以通过调节滑模面的参数来实现 后来人们为了使滑模控制有更好的性能
  • PX4环境git submodule update --init --recursive失败的解决办法

    最近开始搭建PX4环境 xff0c 搭建是需要从github下载工程 xff0c 然后使用语句git submodule update init recursive更新工程子模块 xff0c 但往往由于网络原因这一步需要很久 xff0c 甚
  • 变结构滑模控制抖振处理(1)------动态滑模法

    1 什么是动态滑模 从前面一些关于滑模的介绍 xff0c 我们知道 xff0c 在设计滑模控制器时 xff0c 避不开的问题就是抖振 至于抖振的产生 xff0c 很大程度上是由于一般滑模控制器的控制律u是一个不连续的函数 xff0c u中往
  • 四旋翼双环PID控制

    在我上篇博客 四旋翼无人机Matlab建模 中 xff0c 我建立了四旋翼的模型 xff0c 并在simulink中搭建了仿真 xff0c 但并没有设计控制器 本章便针对四旋翼设计最常见的串级PID控制器 xff0c 本篇文章主要从两个部分