四旋翼飞行器Quadrotor飞控之 PID调节(參考APM程序)-程序员宅基地

做四轴也有一段时间了。近期一直在做PID方面的工作。

如今四轴基本能够实现室内比較稳定的飞行,操控手感也能够接受。稍后上试飞视频。在此把一些PID方面的经验总结总结和大家分享一下。

首先介绍一下大概的硬件组成:

MCUFreescale MK60D

传感器(IMU):GY-86模块(MPU6050 + HMC5883L + MS5611

433MHz传输数据模块

DC-DC可调式开关稳压模块

遥控设备:JR XG7发射机 + JR 611B接收机

机架:普通红白f450机架

电机:朗宇2212kv880高效能电机(黑色)

电调:天行者40A

桨:仿APC1047

电池:DUPU 2200mah 25c

电路非常easy用洞洞板搭的简易測试电路。

 

软件方面最基本的是姿态解算,终于用的是MPU6050DMPDigital Motion Process)输出,遥控器控制的目标姿态也是四元数表示的。为了有较好的线性度,将两者的姿态差转换为欧拉角后再进行PID的控制。

以下进入正题。

PID算法非常大程度上參考了APM(国外成熟开源飞控项目。官网点击打开链接)的控制算法。它是採用的角度P和角速度PID的双闭环PID算法。角度的误差被作为期望输入到角速度控制器中。

双闭环PID相比传统的单环PID来说性能有了极大的提升,笔者也以前调试过传统的PID控制算法,即便參数经过了精心调整和双环控制算法相比在控制效果上的差距依然非常大。

不管是悬停的稳定性,打舵时的高速尾随性和回正时的高速性上都是后者的效果明显优于前者。

大概介绍一下APM算法的大概流程。这个PID控制流程图能够在APM官网找到。笔者參考的是APM3.1.0的代码和图上2.9版本号的有一点点出入,不影响大局(控制频率100hz)。


横滚(Roll)和俯仰(Pitch)的控制算法是一样的,控制參数也比較接近。首先得到轴姿态的角度差(angle error)。将这个值乘以角度系数p后限幅(限幅必须有。否则剧烈打舵时easy引发震荡)作为角速度控制器期望值(target_rate)。target_rate与陀螺仪得到的当前角速度作差,得到角速度误差(rate_error)乘以kp得到P。在I值小于限幅值(这个值大概在5%油门)或者rate_errori值异号时将rate_error累加到I中。前后两次rate_error的差作为D项。值得注意的是加须要入20hz(也能够採用其他合适频率)滤波,以避免震荡。

P,I,D三者相加并限幅(50%油门)得到终于PID输出。

偏航(Yaw)的控制算法和前两者略有不同。是将打舵量和角度误差的和作为角速度内环的期望值,这样能够获得更好的动态响应。

角速度内环和横滚与俯仰的控制方法一致,參数(积分限幅值会非常小,默认仅仅有万分之8)上有不同。

APM的算法移植过来。限幅值也移过来之后就能够进行PID參数调整了。

一般先进行横滚或俯仰方向的调整。

把四轴固定起来。仅仅留一个待调整方向的旋转自由度(简直就是旋转“烤四轴”有木有)。笔者稍后奉上调试时使用的装置。强烈建议调试时带上厚的防护手套,不然的话我的手早就被被打烂了。调个飞机还负伤就不值得了。

 左右两个直线轴承,用几颗自攻螺丝拧在桌子上(可怜的桌子快哭了快哭了),插上铝合金管(外径12mm。壁厚2mm,注意要调整两个直线轴承的位置使它们同轴),两头用角铁限位也是拧在桌子上快哭了快哭了快哭了。把四轴用胶带+扎带绑在上面就可以開始“烤四轴”。

 

大概过程(注意修正反向):

1、预计大概的起飞油门。

2、调整角速度内环參数。

3、将角度外环加上,调整外环參数。

4、横滚俯仰參数一般可取一致,将飞机解绑,抓在手中測试两个轴混合控制的效果(注意安全)。有问题回到“烤四轴”继续调整,直至飞机在手中不会抽搐。

5、大概设置偏航參数(不追求动态响应,起飞后头不偏就可以),起飞后再观察横滚和俯仰轴向打舵的反应,如有问题回到“烤四轴”。

6、横滚和俯仰ok以后。再调整偏航轴參数以达到好的动态效果。

 

过程具体解释:

1、要在飞机的起飞油门基础上进行PID參数的调整。否则“烤四轴”的时候调试稳定了,飞起来非常可能又会晃荡。

 

2、内环的參数最为关键!

理想的内环參数可以非常好地尾随打舵(角速度控制模式下的打舵)控制量。

在平衡位置附近(正负30度左右),舵量突加,飞机高速响应;舵量     回中,飞机立马停止运动(差点儿没有回弹和震荡)。

2.1首先改变程序,将角度外环去掉。将打舵量作为内环的期望(角速度模式,在APM中叫ACRO模式。在大疆中叫手动模式)。

2.2加上PP太小。不能修正角速度误差表现为非常“软”倾斜后难以修正。打舵响应也差。

P太大,在平衡位置easy震荡,打舵回中或给干扰(用手突加干扰)时会震荡。

合适的P能较好的对打舵进行响应。又不太会震荡。可是舵量回中后会回弹好几下才干停止(没有D)。

2.3加上DD的效果十分明显,加快打舵响应,最大的作用是能非常好地抑制舵量回中后的震荡。可谓立竿见影。太大的D会在横滚俯仰混控时表现出来(虽然在“烤四轴”时的表现可能非常好),详细表现是四轴抓在手里推油门会抽搐。假设这样。仅仅能回到“烤四轴”减少D。同一时候P也仅仅能跟着减少。D调整完后可以再次加大P值,以可以尾随打舵为推断标准。

2.4加上I,会发现手感变得柔和了些。因为笔者“烤四轴”的装置中四轴的重心高于旋转轴,这决定了在四轴偏离水平位置后会有重力分量使得四轴会继续偏离平衡位置。

I的作用就能够使得在一定角度范围内(30度左右)能够修正重力带来的影响。表现打舵使得飞机偏离平衡位置,舵量回中后飞机立马停止转动,若没有I或太小,飞机会因为重力继续转动。

 

3、角度外环仅仅有一个參数P。将外环加上(在APM中叫Stabilize模式,在大疆中叫姿态模式)。

打舵会相应到期望的角度。

P的參数比較简单。太小,打舵不灵敏。太大,打舵回中易震荡。以合适的打舵反应速度为准。

 

4、至此,“烤四轴”效果应该会非常好了,可是两个轴混控的效果怎样还不一定。有可能会抽(两个轴的控制量叠加起来,特别是较大的D,会引起抽搐)。假设抽了。减少PD的值。I基本不用变。

 

5、加上偏航的修正參数后(直接给双环參数,角度外环P和横滚差点儿相同,内环P比横滚大些。I和横滚差点儿相同,D能够先不加)。拿在手上试过修正和打舵方向正确后能够试飞了(试飞非常危急。!

。!选择在宽敞、无风的室内,1米的高度(高度太低会有地面效应干扰,太高不easy看清姿态且easy摔坏),避开人群的地方比較适合,如有意外情况,立马关闭油门。!。

5.1试飞时主要观察这么几个方面的情况,一般经过调整的參数在平衡位置不会大幅度震荡,须要观察:

5.1.1在平衡位置有没有小幅度震荡(可能是因为机架震动太大导致姿态解算错误造成。也可能是角速度内环D的波动过大,前者能够加强减震措施。传感器下贴上3M胶,必要时在两层3M泡沫胶中夹上“减震板”,注意:铁磁性的减震板会干扰磁力计读数;后者能够尝试减少D项滤波的截止频率)。

5.1.2观察打舵响应的速度和舵量回中后飞机的回复速度。

5.1.3各个方向(记得測试右前。左后等方向)大舵量突加输入并回中时是否会引起震荡。如有。尝试减小内环PD也可能是因为“右前”等混控方向上的舵量太大造成。

 

6、横滚和俯仰调好后就能够调整偏航的參数了。合适參数的推断标准和之前一样。打舵高速响应。舵量回中飞机立马停止转动(參数D的作用)。

 

至此。双环PID參数调节完成!祝爽飞!

 


转载于:https://www.cnblogs.com/clnchanpin/p/6939455.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34375054/article/details/94626749

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签