无人机之姿态控制篇

2023-05-16

姿态控制篇

拿四旋翼无人机为例,四个桨叶旋转是的无人机产生了升力,但是这个升力要怎么匹配才能使得无人机能够平稳的飞行呢,这个就是无人机姿态控制的关键。
在这里插入图片描述
如图四个电机1、2、3、4,水平位置X,Y。要想使无人机平稳的飞行则水平位置XY的升力必须达到平衡。这是姿态控制就要发挥它的作用了。
本次我使用的姿态控制算法也是传统的串级PID,首先我们需要先了解一下姿态控制需要用到哪些数据:
1、输入型数据:欧拉角(水平位置的反馈信息)、陀螺仪数据(可以理解为欧拉角的微分,这个数据可以实时检测到飞机的XY方向的角速度)
2、输出型数据:输出有三个轴的信息需要输出,X轴、Y轴、Z轴。X轴控制左右方向,比如检测到飞机往右边倾斜了X轴数据的数据会加大34电机的PWM,从而是的飞机恢复水平,反之检测到飞机往左边倾斜则X轴数据会加大12电机的PWM是的飞机恢复平衡。Y轴同理X轴。剩下就是Z轴也称Yaw轴,无人机桨叶在旋转的时候同时会带动飞机往反方向旋转,所以Yaw控制13电机24电机的平衡。
原理写完了直接上代码:

void Extern_pid(_PID_extern* par,float tar,float cur,float ratio_p,float ratio_i,float ratio_d)
{
float err = 0, i_err= 0, d_err = 0, results = 0;
 err = tar-cur;
 i_err = par->i_err+ratio_i*err;
 d_err = err-par->pre_err;
 par->pre_err = err;
 par->i_err = i_err;
 d_err = d_err*ratio_d;
 par->d_err = d_err;
 err = err*ratio_p;
 results = err+par->i_err+d_err;
 par->results = results;
}//先上一个PID的框架,后面就直接调用这个PID函数了
//各个参数的意义熟悉PID的同学应该很快就能看出来,下面就是串级PID的精髓了:
//position control
  Extern_pid((_PID_extern*)&pitch_angle,eulerPitchDesired,eulerPitchActual,
    ANGLE_PitchRoll_KP,ANGLE_PitchRoll_KI,ANGLE_PitchRoll_KD);
  Extern_pid((_PID_extern*)&roll_angle,eulerRollDesired,eulerRollActual,
    ANGLE_PitchRoll_KP,ANGLE_PitchRoll_KI,ANGLE_PitchRoll_KD);
Extern_pid((_PID_extern*)&yaw_angle,eulerYawDesired,flight_yaw(eulerYawActual,eulerYawDesired),
    ANGLE_Yaw_KP,ANGLE_Yaw_KI,ANGLE_Yaw_KD);
 //eulerPitchActual,eulerRollActual,flight_yaw(eulerYawActual,eulerYawDesired)这三个参数就是姿态解算出来的欧拉角,欧拉角作为串级PID的外环。
 //angular velocity control
  Extern_pid((_PID_extern*)&pitch_gyro,pitch_angle.results,gyro_x,
    VEL_PitchRoll_KP,VEL_PitchRoll_KI,VEL_PitchRoll_KD);
  Extern_pid((_PID_extern*)&roll_gyro,roll_angle.results,gyro_y,
    VEL_PitchRoll_KP,VEL_PitchRoll_KI,VEL_PitchRoll_KD);
  Extern_pid((_PID_extern*)&yaw_gyro,yaw_angle.results,gyro_z,
    VEL_Yaw_KP,VEL_Yaw_KI,VEL_Yaw_KD);
    //这个内环也解释一下,用外环PID的运算值加入到内环PID的期望值,这个思想等同于模糊PID即外环误差越大内环误差成倍数增大,类似于内环动态的KP,KI,KD值。内环主要是角速度环,在整个串级PID来说内环相当于单极PID的D值,只是这个D值反应很迅速,所以这个算法在无人机姿态控制效果很好。
    MotorValue[0]=(int16)(LIMIT(thr_out+pitch_filter_control+roll_filter_control+yaw_filter_control,0,960));
 MotorValue[1]=(int16)(LIMIT(thr_out-pitch_filter_control+roll_filter_control-yaw_filter_control,0,960));
 MotorValue[2]=(int16)(LIMIT(thr_out-pitch_filter_control-roll_filter_control+yaw_filter_control,0,960));
 MotorValue[3]=(int16)(LIMIT(thr_out+pitch_filter_control-roll_filter_control-yaw_filter_control,0,960));
 //然后就是把XYZ三轴经过PID运算的数据传到各个对应的电机

到此,姿态平稳控制完成,希望对你有用,有关无人机各个模块讲解持续更新中…

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

无人机之姿态控制篇 的相关文章

随机推荐

  • 软体和软件的区别

    作者 xff1a 朱金灿 来源 xff1a http blog csdn net clever101 我们这边把Software翻译为软件 xff0c 台湾同胞把它翻译为软体 最近生发一点思考 xff0c 觉得把Software翻译为软体
  • Docker入门

    Docker简介 Docker是开发人员和系统管理员构建 发布和运行分布式应用程序的开放平台 是应用容器 xff08 Application Container xff09 xff0c 是可以为应用提供可运行容器的一个平台 Docker看作
  • js 中 set 与 数组 相互转换

    1 定义set span class token keyword let span manage ip span class token operator 61 span span class token keyword new span
  • mybatis多条件批量删除整理

    批量增加 span class token operator lt span insert id span class token operator 61 span span class token string 34 batchSaveU
  • vscode设置打开多个标签页

    首先进入路径C Users admin AppData Roaming Code User xff1b 然后打开settings json文件 xff0c 并添加一条配置 xff1a 34 workbench editor enablePr
  • Java Date 关于before和after 的使用

    1 date1 after date 当date1大于date2时 xff0c 返回true xff0c 当小于等于时 xff0c 返回false xff1b 2 date1 before date xff0c 当date1小于date2时
  • js正则表达式判断密码满足大写字母,小写字母,数字和特殊字符,其中任意三种组合,且长度在8到15之间

    一 判断密码满足大写字母 xff0c 小写字母 xff0c 数字和特殊字符 xff0c 其中任意三种组合 xff0c 且长度在8到15之间 在js中的代码 xff0c 如下 var testPassword 61 a zA Z 43 A Z
  • Java 获取两个时间的时间差(时、分、秒)

    前言 在平时的工作中 xff0c 难免会遇到获取两个时间相差多少天 小时 分钟 秒 毫秒 xff0c 现在我将自己获取的方法总结如下 xff1a 注明 xff1a 原文章转载链接出自 xff1a https www cnblogs com
  • HeidiSQL工具导出导入MySQL数据

    有时候 为了数据方便导出导入SQL 我们可以借助一定的工具 方便我们队数据库的移植 可以达到事半功倍的效果 在这里 就给大家简单的介绍一款能方便导出或者导入MySQL的数据 首先 选择你要导出的数据库 点击鼠标右键 如下图所示 这里是进行对
  • Navicat相关注册码

    Navicat相关注册码 用户名和组织随便起 注册码如下 Navicat for SQL Server V10 0 10 NAVD 3CG2 6KRN IEPM NAVL NIGY 6MYY XWQE NAVI C3UU AAGI 57FW
  • 我心目中的好的技术教程

    作者 xff1a 朱金灿 来源 xff1a http blog csdn net clever101 当人类进入互联网时代 xff0c 便宣告一个新的学习模式 网上学习的诞生 现在各种网上教程之多可以用恒河沙数来形容 xff08 这里暂时除
  • TCP的建立

    大家好呀 xff0c 我是请假君 xff0c 今天又来和大家一起学习数通了 xff0c 今天要分享的知识是TCP的建立 TCP是一个面向连接的可靠的传输控制协议 xff0c 在每次数据传输之前首先需要建立连接 xff0c 连接建立成功后才开
  • Java根据数字金额生成大写金额

    要求 根据用户输入金额数字转换成相对应大写金额例如 xff1a 430 65 xff0c 转换成肆佰叁拾元陆角伍分代码如下 xff1a public class MoneyFormatUtils private static final S
  • POI 设置Excel单元格背景色(参考颜色代码)

    创建一个 workbook 对象 Workbook workbook 61 new XSSFWorkbook 创建一个 sheet Sheet sheet 61 workbook createSheet 创建一行 Row row 61 sh
  • RedisTemplate之opsForValue使用说明

    转载链接出自 xff1a https blog csdn net qq 25135655 article details 80357137 Redis中opsForValue 方法的使用介绍 xff1a 1 set K key V valu
  • Python爬虫(二)——爬取电影天堂,保存下载地址

    首先我们开始要分析一下 xff0c 下载种子我们需要哪几步 xff1a 获取所有电影页的访问地址获取电影页源码提取出下载地址将下载地址保存 首先第一步 xff0c 我们来分析一下电影天堂网站的结构 xff0c 发现他跟我们的古诗文网还是非常
  • pixhawk飞控中添加uORB主题

    本说明针对 Firmware v1 2 0 参考 xff1a https pixhawk org start id 61 zh dev shared object communication 1 添加流程说明 在Firmware msg下新
  • px4 多旋翼SITL仿真

    好久不写csdn了 xff0c 自己的笔记都记在了onenote里面了 xff0c 没有时间写东西分享 xff0c 今天找了个记得比价规整的分享一下 备注 xff1a SITL需要程序源码和QGC xff0c 以及配置环境时安装的一些东西
  • keil空间不足,.\Objects\template.axf: Error: L6406E: No space in execution regions with .ANY selector mat

    关于keil空间报错 xff0c 我总结了一下集中解决方案 xff1a 1 有可能是所选主控芯片RAM xff0c ROM真的被用完了 xff0c 这是需要更换主控芯片 2 keil里面的优化还可以继续优化省出一点空间 下面红色标的选择跟你
  • 无人机之姿态控制篇

    姿态控制篇 拿四旋翼无人机为例 xff0c 四个桨叶旋转是的无人机产生了升力 xff0c 但是这个升力要怎么匹配才能使得无人机能够平稳的飞行呢 xff0c 这个就是无人机姿态控制的关键 如图四个电机1 2 3 4 xff0c 水平位置X x