小四轴编程入门教程

2023-05-16

小四轴编程入门教程之一:陀螺仪和加速度计

在小四轴中,陀螺仪是一种用于测量小四轴旋转速度的传感器,它测量的是角速度,是指物体在单位时间内转过的角度大小。通过测量物体在X/Y/Z三个轴上的角速度,我们就可以得到物体在X/Y/Z三个轴上一段时间内转过的角度。

那么,在小四轴上,陀螺仪的作用是什么呢? 我们知道,把一个物体悬浮在空中的方法可以是给物体的四个角施加拉力。如果物体某个方向的力度不够,那么物体就会因为重力的作用朝这个方向倾斜。通过在该物体上装上陀螺仪,就可以知道物体倾斜的方向,然后据此调整物体四个角的拉力,就可以达到让物体悬浮的目的。

至此,我们基本了解了陀螺仪在小四轴中的作用。但是,有一个问题我们不能忽略,那就是误差的问题。我们在使用传感器测量角速度时候,假定我们每一毫秒读取一次传感器数据,然后把该数据当作物体在这一毫秒内转过的角度。由于物体倾斜的过程并不是匀速的,所以计算出来的角度和物体实际转过的角度是有误差的。这样一来,随着时间的增加,所累加的误差也会越来越大。这样一来,即使物体在水平状态,但是由于陀螺仪的计算误差,从运算结果来看,物体并不在水平状态。

这个时候,我们引入了加速度计。加速度计是用于测量物体的加速度的。它的一个好处就是可以借助重力加速度来帮助我们来计算一个静止物体相对于地面的倾角。当一个物体和地面完全水平的时候,物体的倾角是0。但是,由于加速度计测量的不仅仅是重力的作用,对于一个运动的物体,它的测量数据是重力和其它力共同作用的的结果。由于在空中飞行的小四轴是运动的物体,所以我们无法根据加速度计所得到的数据直接来判断小四轴是否处于水平状态。

我们知道,要把小四轴悬浮在空中,就要在它的四个角通过电机施加升力。而每个电机应该给多少升力则取决于小四轴的倾斜状态。当小四轴处于水平状态,四个电机给一样的升力,当小四轴朝某个方向跌落,则该方向的电机给予更大的升力。要做到这一点,我们就要时刻测量小四轴的倾角。

但是,根据上面的描述,我们知道无论是陀螺仪,还是加速度计,都无法准确地给出飞行中的小四轴的倾斜状态。人们想到一个方法,就是用加速计测量的数据来修正陀螺仪的数据。这就是我们下一节要讲到的:

小四轴编程入门教程之二:数据的滤波和融合

在上一节,我们讲述了陀螺仪和加速度计的作用。在这一节,我们讲述如何对陀螺仪和加速度数据进行滤波和融合。

首先,我们来谈小四轴的滤波。滤波的方法有很多种,在小四轴上,对于陀螺仪和加速度计,我们一般采用不同的滤波方法。对于陀螺仪,大家最常见的就是滑动平均法。即把最新的10个或者20个数据进行平均。在次基础上,对不同的数采用不同的加权,又能变种出很多种不同的滤波方法。对小四轴初学者来说,用最简单的滑动平均法就可以。对于加速度计,我们通常采用掐尾法,即去掉低位的数据以避免由于小四轴震动而引起的误差。

接下来,我们来谈小四轴的融合。所谓融合,就是把陀螺仪测量出来的数据和加速度计测量出来的数据以一定比重混合在一起。和大家在做蛋糕过程中,加多少牛奶,多少面粉方法类似。

小四轴融合常用的方法有:四元数法,互补滤波法,卡尔曼法等。通过调整合适的参数比例,把陀螺仪测量出来的物体角度和加速度计测量出来的角度进行互相修正。

由于该节涉及到的数学知识比较多,这里只是大略提及了各个概念,而不一一进行深入分析。对于各种滤波和融合的算法C语言实现方法,大家可以直接阅读我们的源代码。

小四轴编程入门教程之三:PID的实现

四轴飞行器的位置式PID控制和增量式PID控制

在开始本文的描述前,我们先来看看什么叫PID控制器。P是Proportional的简称,I是Integral的简称,D是Derivative的简称,合并起来,PID控制器指的就是是比例,积分和微分控制器,用公式表示如下(e是指设定值和当前值的误差,t是指当前的时间)。
公式一:pid

以离散的数字方式表示如下(其中,k表示某个时刻,e(k)就表示某个时刻的误差值)。

公式二:pid2

以四轴飞行器为例,假定我们每1ms读取一次陀螺仪和加速度的数值,并计算到姿态pitch和roll,再假定我们的目前姿态是水平状态,即pitch=0,roll=0,那么我们就可以得到某个时刻的PID计算公式如下图(其中A代表的是姿态角)。

公式三:pid3

上述公式就是我们在四轴飞行器源代码里面经常看到的编程方法,通常,我们把微分控制的姿态差直接用陀螺仪的数据来表示,因为从陀螺仪读取出来的数据代表的就是现在和上一次的角速度差,乘以1ms的时间差,即为角度差,因而公式变为。

公式四:pid4

对于简单的四轴飞行,积分不是必要的条件,而且积分使用不好的情况下,会对四轴飞行器的稳定性产生很大影响,所以对于四轴飞行器初学者来说,我们可以先去除积分项,把公式简化成下面的样子。

公式五:pid6

就这样,一个简单的四轴飞行器的PID控制公式就出现在我们面前了。把该公式变换成代码,即可以实现四轴飞行器的PID控制。

从上面的描述,我们可知,这是一个位置式的PID控制器,即我们是把当前位置和水平位置作为误差来进行PID控制,从而实现四轴飞行器的水平飞行的。增量式PID和位置式PID的不同就在于增量PID控制是把位置的变化量作为控制量。这样一来,我们可以得到下述的计算公式。

公式六:pid7

从上面公式,我们可以看出,积分项累加的结果就是当前姿态减去初始姿态,假定初始姿态为水平状态,那么姿态增量的积分就是当前的姿态。比例控制的是当前姿态相对于上一姿态的增量,根据我们之前的描述,可以用陀螺仪数据来表示。假定我们忽略微风项的控制,那么公式可以简化为:

公式七:pid8

把公式七和公式五做对比,我们可以知道,在四轴飞行器中,位置式的PD控制相当于增量式PID的PI控制。把位置式PID控制和增量式PID控制组合在一起,就可以组成串级PID控制。

上文详细描述了位置式和增量式PID控制,并引出了串级PID控制的概念,如需转载,请勿用于商业目的,并注明:该文章出自圆点博士无人机www.bspilot.com

 

 

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

小四轴编程入门教程 的相关文章

  • Jetson Nano从零开始(2):硬件篇

    Jetson Nano从零开始 xff08 2 xff09 xff1a 硬件篇 摘要主要硬件 xff1a 步骤1 烧写系统镜像到TF卡2 开机 其他硬件信息电源供电方式连接树莓派相机的方式 其它硬件参考文章 xff1a 摘要 这一篇主要讲n
  • 使用RGBD相机实现YOLOv3目标识别并测距,获取物体三维坐标

    设备环境 xff1a Ubuntu18 04 43 ros melodic 相机 xff1a 乐视相机 xff08 乐视遗产 xff0c 和奥比中光的 Astra Pro 同方案 xff0c 便宜 xff09 1 首先要安装一部分依赖 su
  • [jetson浅试] yolov5+deepsort+Tensorrt C++部署(Xavier AGX)

    1 简介 xff1a 这学期刚开学的时候搞的 xff0c 空下来整理一些 xff08 以后还是应该养成边搞边写博客的好习惯 xff09 本文主要是对yolov5 deepsort tensorrt A c 43 43 implementat
  • 阿里2014年校园题目最后一题答案及证明

    该题目来自cdsn的一位网友 xff08 可见http blog csdn net thebestdavid article details 11975809 xff09 xff0c 具体内容如下 xff1a 在黑板上写下50个数字 xff
  • 编程——两种list的翻转方法

    对于题目相信大家都比较熟悉了 xff0c 下面就直接上代码了 xff0c 其中没有给出list的creat函数 xff0c 有兴趣的同学可以自己实现 1 模板node的定义 template lt class T gt class TNod
  • 数组旋转新方法

    题目 xff1a 对一个int数组进行左右任意长度的旋转 xff0c 如 xff1a 原始数组为 1 2 3 4 5 xff0c 左旋两位 xff08 可用 2表示 xff09 得 3 4 5 1 2 xff0c 右旋两位 xff08 可用
  • 为什么链表操作过程中对于结构体指针,都要用malloc来开辟内存空间

    sqlist h ifndef SQLIST H define SQLIST H include lt stdio h gt include lt stdlib h gt define maxsize 1024 线性表的最大长度 typed
  • P1706 全排列问题

    原题 P1706 全排列问题 这题显然可以暴力 长达164行 include lt iostream gt include lt istream gt include lt ostream gt include lt cstdio gt i
  • 自动化专业考研方向简介

    自动化专业考研方向简介 xff08 一 xff09 大家在准备考研时 xff0c 想没想过 自己对什么感兴趣 xff1f 自己以后想干什么 xff1f 毕业后如何打算 xff1f 如果你认真考虑了这几个问题 xff0c 相信你的未来研究生生
  • UVA1185 Big Number

    原题 https www luogu com cn problem UVA1185 本题用到的定理的证明 https www cnblogs com weiliuyby p 5831991 html 题目 给出n 求n 的位数 从网上找到了
  • 浅谈威佐夫博弈

    如果不了解威佐夫博弈的话 xff0c 下面有威佐夫博弈的介绍 有两堆石子 xff0c 数量任意 xff0c 可以不同 游戏开始由两个人轮流取石子 游戏规定 xff0c 每次有两种不同的取法 xff0c 一是可以在任意的一堆中取走任意多的石子
  • YBT1325:循环比赛日程表

    我们先看题 我们仔细观察就会发现一下规律 xff1a 设一个数 设两个数 且 1 在的范围内 有 2 在的范围内 有 3 在的范围内 有 以上三条我都验证过了 正确 所以代码就出来了 include lt iostream gt using
  • Codeforces Contest #1553 A : Digit Sum 题解

    题目链接 Digit Sum 题面 将上面一大坨翻译一下 xff0c 就是 xff1a 定义函数的数字和 给出 求有多少个满足且 若模余 xff0c 则成立 一开始想是输出的下取整 xff0c 最后的结果 xff1a 没有考虑到的情况 xf
  • Atcoder Beginner Contest 100 - 题解

    A 原题 Happy Birthday 本题其实很水 只需要输入这两个整数 xff0c 如果中有一个大于 就输出 xff0c 否则输出 Yay include lt bits stdc 43 43 h gt using namespace
  • ubuntu 18.04 server 扩容(LVM)磁盘 解决磁盘不足的情况 (亲测)

    因为发现我的本地server出现磁盘满了的情况 所以进行lvm的扩容 截图的都是扩容后的 所以忽略容量 1 查看磁盘情况 df span class hljs attribute h span 原本发现 dev mapper ubuntu
  • 欢迎使用CSDN-markdown编辑器

    欢迎使用Markdown编辑器写博客 本Markdown编辑器使用StackEdit修改而来 xff0c 用它写博客 xff0c 将会带来全新的体验哦 xff1a Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传
  • 工作一年,辞职复习半年,考杭电计算机的经验分享

    工作一年 xff0c 辞职复习半年 xff0c 考杭电计算机的经验分享 如果 xff0c 毕业了工作顺利的人大概率是不会去考研的 xff0c 去考研的人 xff0c 大概率是想改变的 题记 2019 4 6 关于我 纠结的人生 为什么考研
  • CSS表格样式

    文章目录 CSS表格样式caption side 标题位置border collapse 边框合并border spacing 边框间距css样式 xff08 推荐使用 xff09 CSS表格样式 caption side 标题位置 语法
  • Android使用Annotations注解优化代码

    文章目录 Android使用Annotations注解优化代码Null 注解Typedef 注解Resource Type 注解Threading 注解Value Constraints 注解Overriding Methods 注解Ret
  • C语言strstr函数

    函数strstr定义 xff1a char strstr const char str1 const char str2 xff1b 位于头文件 string h 中 作用 xff1a strstr函数用于判断字符串str2是否为字符串st

随机推荐

  • Linux下串口读写通信

    span class token keyword int span fd span class token operator 61 span span class token number 0 span span class token p
  • kubernetes最新版安装单机版v1.21.5

    kubernetes最新版安装单机版v1 21 5 k8s集群由Master节点和Node xff08 Worker xff09 节点组成 今天我在这里给大家只用1台机器 xff0c 安装kubernetes 1 安装前置环境 root 6
  • 双系统、多系统快速切换

    前言 装双系统甚至多系统 xff0c 是为了满足不同需求 每个操作系统都有自身的特点 xff0c 因为这样那样的原因 xff0c 很多人选择双系统 双系统满足了不同需求 xff0c 但是每次需要手动选择所要进入的系统 xff0c 切换系统也
  • ROS::CmakeList 例子

    ROS CmakeList 例子 span class token function cmake minimum required span span class token punctuation span VERSION span cl
  • ROS:静态TF发布

    ROS xff1a 静态TF发布 方式1 xff1a span class token tag span class token tag span class token punctuation lt span launch span sp
  • ROS::线程锁

    ROS xff1a xff1a 线程锁 boost span class token operator span mutex mutex span class token punctuation span span class token
  • 无人机智能飞行类库设计构思

    搭建无人机 智能飞行类库的主要目的就在于 xff1a 便于无人机路径规划各种算法的实施 xff0c 便于飞行仿真以及便于今后在硬件上实现算法 完整做到这些需要做三方面做工作 xff1a 一 计算几何 计算几何问题主要用于路径优化 避障等 x
  • STL教程:C++ STL快速入门

    目录 1 STL引言 2 STL是什么 xff08 STL简介 xff09 3 STL历史 4 STL组件 5 STL基本结构 6 STL 使用方法 7 STL目录 网址 xff1a STL教程 xff1a C 43 43 STL快速入门
  • vue使用sortablejs插件的时候报Sortable: `el` must be an HTMLElement

    最近因为项目需要很灵活自定义查询 xff0c 故使用了vue和element ui组件库 xff0c 其中el table需要行和列拖拽排序 故使用到了sortable插件 一 报错的排查 首先对 xff1a const tbody 61
  • 记一次Linux 4.15.0-65-generic安装Elasticsearch成功的过程

    一 xff0c 操作系统和安装的应用 xff1a 1 操作系统 xff1a Linux version 4 15 0 65 generic buildd 64 lgw01 amd64 006 gcc version 7 4 0 Ubuntu
  • [docker]笔记-镜像 管理

    1 镜像管理 docker search xxxx 查找镜像 例如查找httpd root 64 localhost docker search httpd 下载镜像 docker pull xxxx root 64 localhost d
  • quill-editor扩展的正确姿势

    一 无关的插曲 曾几何时 xff0c 风云万里 xff0c 万海桑田 耕耘于代码堆里多年 做过android移动端 xff0c 做过web端 xff0c 做过java后端和 net xff0c 也做过python数据分析 但真正扩展源码的亦
  • 导入excel时js转换时间的正确姿势

    一 基础 1 excel的日期是以1900 1 0开始计算的 xff0c 既1900 1 1就是1天 xff1b 2 js的Date是以 1970 1 1 08 00 00 开始的 xff1b excel时间换算如下 xff1a 点击常规后
  • springboot下ClassUtils.getDefaultClassLoader().getResource(“static“).getPath() 空指针异常???

    在static加个文件文件就ok xff0c 不信你看看
  • Compilation failure: Compilation failure

    有a项目和b项目 xff0c 如果a项目打包成功 xff0c b依赖a 现b打包的时候报Compilation failure Compilation failure了 xff0c 原因是a中有 span class token opera
  • mysql数据更新时变更时间自动更新

    ALTER TABLE test CHANGE startTime startTime timestamp NOT NULL ON UPDATE CURRENT TIMESTAMP DEFAULT CURRENT TIMESTAMP
  • docker、docker-compose和Portainer的安装

    一 docker安装 span class token comment 安装docker相关依赖 span yum span class token function install span y yum utils device mapp
  • vue-cli+spring boot前后端分离跨域及session丢失解决办法

    前后端分离跨域笔记 小小的唠叨前端代码后端 小小的唠叨 曾几何时 xff0c 项目开发时间很紧 xff0c 项目组很多的人即不懂vue也不大懂spring boot及mybatic的强大之处 xff0c 也没有做过前后端分离 xff0c 项
  • vue打包整合到spring boot一记

    目录 背景vue cli打包之前的配置总结 背景 前段时间 xff0c 根据需求 xff0c 要将项目烧入到芯片 xff0c 但我的擅长之处就是前后端分离开发 xff0c 因此需要前端vue开发好 xff0c 打包放到后端里面一起执行 那时
  • 小四轴编程入门教程

    小四轴编程入门教程之一 xff1a 陀螺仪和加速度计 在小四轴中 xff0c 陀螺仪是一种用于测量小四轴旋转速度的传感器 xff0c 它测量的是角速度 xff0c 是指物体在单位时间内转过的角度大小 通过测量物体在X Y Z三个轴上的角速度