发新帖本帖赏金 38.00元(功能说明)我要提问
返回列表
打印

【原创连载】+那些值得追忆的日子

[复制链接]
楼主: sharknarduo
手机看帖
扫描二维码
随时随地手机跟帖
21
xlhtracy| | 2015-6-9 09:41 | 只看该作者 回帖奖励 |倒序浏览
dirtwillfly 发表于 2015-6-8 14:06
@xlhtracy https://bbs.21ic.com/icview-958522-1-1.html

  这个帖子看到啦

使用特权

评论回复
22
xlhtracy| | 2015-6-9 09:42 | 只看该作者
sharknarduo 发表于 2015-6-8 19:53

  
三杯咖啡,一根烙铁,熬一夜

  文采还蛮好

使用特权

评论回复
23
闫鸿鹏| | 2015-6-9 10:13 | 只看该作者
这么牛,这些日子是值得追忆的,加油加油

使用特权

评论回复
24
偏爱番茄酱| | 2015-6-9 13:06 | 只看该作者

写的这么好,还不赏点:$

使用特权

评论回复
25
sharknarduo|  楼主 | 2015-6-9 13:22 | 只看该作者
今天调PID的时候发现应该把四旋翼的调试经验记录下来了,一方面提前为毕业论文做准备,另一方面,日后也可以回过头来对比一下各种算法。
         
     前天遥控刚整完,就顺便测试了下遥控飞机,给了个比较小的参数,结果飞行的效果还不如没有遥控并且姿态解算BUG没有修正时的效果。总结原因:
     1)遥控的控制量步进值过大。
     2)参数过小,响应速度慢。
     第二天,调完参数感觉还行,正准备试飞,发现坏了一个电调..于是只能灰溜溜跑回去买了两个电调,然后研究控制算法了。
     今天尝试改变了控制算法,主要为了验证理论的可行性:
     1)经典PID,D项直接用陀螺仪角速度
     2)经典PID,D项用偏差的微分
     3)经典PID,D项用微分先行,即直接对姿态解算之后的角度微分
     4)并级PID(这个纯属意外).
     5)串级PID,外环角度环,内环角速度环。
     
     1)第一种经典PID应用范围最广,实践之后可行,好处在于数据处理简单可行,且由于并没有将遥控量进行微分,由此可以避免遥控量切换时的开关扰动所造成的微分噪声放大。然而,这里提出一个缺陷:由于陀螺仪本身不可避免的零飘以及机械振动所造成的噪声存在,直接使用陀螺仪测得的角速度进行D项控制似乎有些欠妥,虽然机械振动产生的噪声在一定程度上可以通过机械上处理以及软件滤波减轻,但是陀螺仪本身的零飘却无以避免。
     2)第二种PID直接对偏差进行微分,开始的时候犯二了..居然忽略了参数应该是直接用角速度的200倍左右...竟然还天真地往小调..实际的效果是响应比第一种快很多,但是力矩感觉很小,反作用力小,由于融入了遥控量进行微分放大,开关切换时及其不稳定,很容易出现震荡,且静态时也不是特别稳定,或许对D项进行一阶惯性滤波或者衰减效果会好一些,这种算法比较适合玩航模的,比较依赖操作,不适合自动控制。
     3)第三种算法相当于前两者的结合,虽然没有了遥控量的开关扰动,但是抵抗外力的效果和第二种差不多,都不是太好,响应速度一般,稳定性还可以。现在还不清楚抵抗外力的作用为何会变弱。
     4)第四种是串级PID的失败品,由于理解错误在写代码的时候写成这货了。直接将角度环的电机输出叠加到角速度环的电机输出上然后一起输出..效果自然不好。
     5)第五种,串级PID,外环角度环控制输出作为期望角速度输入角速度环,作为内环的控制量进行内环PID控制,然后输出电机控制量。经过初步调试参数,发现整体效果和预期一样,但是参数整定极难,经典PID与之相比,难度简直就是小儿科..,突然有种无法下手的感觉,主要效果体现在I项的平滑度,在控制量切换时几乎不会有超调,显得很平滑,这也和理论相符,只要解决了参数整定的问题,相信这个算法将会是四旋翼近似二阶系统之后的最简便控制算法了。

使用特权

评论回复
26
xlhtracy| | 2015-6-9 13:23 | 只看该作者
偏爱番茄酱 发表于 2015-6-9 13:06
写的这么好,还不赏点

这个必须有,你的帖子也有赏 ,等我晚点一起赏

使用特权

评论回复
27
黑小子mxx| | 2015-6-9 19:42 | 只看该作者
sharknarduo 发表于 2015-6-9 13:22
今天调PID的时候发现应该把四旋翼的调试经验记录下来了,一方面提前为毕业论文做准备,另一方面,日后也可 ...

楼主能否推荐一本侧重于应用的控制算法书籍或是相关资料呢?

使用特权

评论回复
28
尤彼卡| | 2015-6-9 21:55 | 只看该作者
大神就是这样炼成的

使用特权

评论回复
29
lcwhg| | 2015-6-10 11:50 | 只看该作者
学习学习,挺好的制作,谢谢分享。

使用特权

评论回复
30
sharknarduo|  楼主 | 2015-6-10 22:54 | 只看该作者
四旋翼调试日记(2)——姿态解算
姿态估计是捷联惯导中一个非常重要的问题。姿态解算的方法有很多,比较常用的有向量法,欧拉角法,四元数法以及方向余弦法(DCM)。
     由于四旋翼对实时性的要求比较高,而ARM长处在于控制,并不在于运算,因此选用计算量较小的四元数法成为了低成本四旋翼的首选。
     1)欧拉角法。该算法比较直观,很容易理解,然而由于每个姿态更新周期都涉及大量的反三角函数运算,且存在万向节锁(Gimbal Lock),因此在四旋翼上一般不直接用该方法进行姿态解算,而是将欧拉角法和四元数法相结合进行控制。
     2)方向余弦。相对于第一种方法,方向余弦使用大量的矩阵运算来表示角度,一般用于运算能力较强的芯片如DSP等。
     3)向量法。理论上比四元数有更为广泛的应用,但也局限于其运算量而没有应用在四旋翼上。
     4)四元数法。简单地说,四元数是最简单的超复数,由一个实部和三个虚部构成,因此其具有复数的相关性质,早在高中的时候其实我们就已经接触过四元数了,只不过当时是对复数做了一个延伸,而没有深入讨论。四元数既可以用向量形式表示,也可以矩阵形式表示,因此其所支持的运算形式就比较广泛了。从其物理意义上讲,四元数表示的是刚体的旋转,而在姿态解算中,我们通常使用的是四元数微分方程。不过四元数也有其缺点:只从表达式看,根本看不出其物理意义,就像是内存中的二进制序列,并不是很直观,因此一般来说不直接使用四元数进行控制,当然也不排除这种方法的可行性。
      
     以个人理解,姿态解算的核心无非两点:一是预处理,二是融合。
     1)预处理在这里指的是对传感器的原始数据进行校正,滤波等。主要分为加速度计的水平校准,低通滤波;陀螺仪的零偏计算及校准;磁力计的椭圆以及偏心校准等。通常情况下认为陀螺仪的高频噪声较小,因此不对陀螺仪的原始数据进行滤波,当然进行滤波也是可行的。
     2)融合的算法就非常多了,有卡尔曼滤波,牛顿高斯算法,梯度下降法,互补滤波等等。
      一开始使用了牛顿高斯算法对加速度计测得的重力向量与四元数换算的重力向量的误差进行最优估计,得到一个机体的实际角速度,事实上是通过消除 两者误差的方式将其融合,这种方式运算量小,响应快,相当于一个PI控制,当然缺陷就是容易超调,容易受干扰,不过整体效果还过得去。得到估计的角速度之后,将其输入四元数微分方程更新四元数,进行迭代。
      相比于横滚和俯仰角,航向角的处理较为复杂。对于横滚和俯仰角,在得到姿态四元数之后,一般就可以将其转换成欧拉角进行PID控制。而由于加速度计不具备修正航向角的能力,因此必须引入磁力计修正航向角的环节,在这里就分为将磁力计的数据和加速度计一起融入牛顿高斯算法或者使用互补滤波等算法对航向角修正两种,也就是典型的AHRS和IMU算法的区别。我选择了IMU,因为将磁力计融合四元数对于使用无刷电机的四旋翼而言是一件非常危险的事,无刷电机产生的不均匀磁场会对磁力计产生巨大的干扰,且无法进行补偿。因此一开始我选择了简单的一阶互补滤波,虽然效果不是很好,原因有三点:
      1)滤波器的参数不合理
      2)磁力计未做校准
      3)使用磁力计计算航向角需要对磁场进行分解,因此相当于将横滚与俯仰角的噪声引入了航向角的计算环节。
后来,我改用了卡尔曼滤波,并且针对磁力计在180度到-180度之间的突变进行了反转,由此解决了卡尔曼滤波出现的反向旋转到正确角度的现象。但是卡尔曼的响应并不是特别理想,当然了,对于四旋翼而言,航向角的控制主要是将其角速度控制为0即可,而对于全姿态的姿态控制而言,这恐怕是远远不能满足要求的。
      除此之外还有梯度下降法进行姿态解算,这其实就是把牛顿高斯算法改为梯度下降法,其原理为将0看成是误差的一个极小值,而梯度的方向为极大值的方向,因此只需要逆着梯度的方向就可以找到最小值,而我们要做的就是计算误差的极值并且需要设定合适的步长,因为过大的步长会使得得到的估计偏离最优估计,而过小的步长则会导致运算量过大,相对于牛顿高斯算法,该算法运算量稍大,然而其不容易产生超调,在STM32的可接受范围,可以尝试使用。

使用特权

评论回复

打赏榜单

21ic小喇叭 打赏了 10.00 元 2015-06-15

31
tjjack| | 2015-6-12 14:14 | 只看该作者
离成功的日子愈来愈近了。

使用特权

评论回复
32
comeon201208| | 2015-6-13 19:32 | 只看该作者
这个是需要做事的耐心的啦。

使用特权

评论回复
33
sharknarduo|  楼主 | 2015-6-15 18:50 | 只看该作者
四旋翼调试日记(3)——上位机
    上位机是所有在线实时系统监测调试仿真必不可少的一个环节,它不仅可以实现在线监测,并且可以嵌入算法以及调用诸如Matlab等仿真软件生成的DLL进行在线仿真计算,以及三维重现等可视化功能,因此在四旋翼调试过程中自然也不能少了上位机。
    能够编写上位机的语言非常多,常用的如C++,C#,JAVA,VB,Labview,Delphi,Qt等等。相对而言C#和Labview上手容易,只要有面向对象的编程基础基本上可以毫无障碍地上手,因此我最终选择了C#,因为早在做智能车时期就已经玩腻了Labview,相对于C#而言,Labview其实就是一套引出了接口的可视化编程环境,灵活度并不高,当然,其对NI的硬件支持使得Labview在自动化测控领域也占有了相当的份额。
    几乎所有的C#初学者都会感叹于C#的方便简单,然而事实上在深入学习之后会发现C#的学习 曲线刚好和C++相反,上手及其容易,要想深入乃至精通,其实是非常难的,不过对于我们这些想要写一些不是特别复杂的程序的程序员而言,C#绝对是神器。不过C#的程序效率是无法和C++相提并论的,毕竟在大多数情况下,非托管代码和托管代码比,在效率上还是有较大的优势的,但这并不能阻止C#的流行,通常可以使用C++写算法,引出接口,使用C#调用。另一方面,微软提出,当前C#下的DirectX开发的3D程序效率已经和C++十分接近,且XNA游戏开发基本上以C#为主,所以个人还是比较看好C#。此外,在移动端的开发,C#依然占有一定的市场,如WP,虽然当前的手机端被IOS与Android所统治,但我们还是应该以批判地眼光去审视其发展问题,由于JAVA学习成本较低,大量的软件类本科生跟风学习,Android开发的岗位需求日渐饱和,相比而言,IOS开发则成本高的多,并且上手难度也较大,至于其前景,则不好说,毕竟IOS是一个基于UNIX的系统,其收费性质和封闭性使得其发展速度开始跟不上基于Linux的Android了,当然,这些都是题外话了。
    上位机的主要功能分为六大块:通信,协议,控制,显示,分析,仿真,重构。     
    1)通信作为软件的根基,如果通信的部分处理的不好,那么整个软件的所有功能都将成为**肋,因此,我们就很有必要对通信部分进行多线程处理,在这里可以使用线程池的方式处理。这里只使用了串口通信,至于TCP/UDP等网络通信方式也是大同小异的,不同之处在于协议。在串口接收事件中进行数据包的解码,之后开辟一个工作者线程,在该线程中进行数据处理,显示,分析等等,需要注意的是跨线程操作控件时需要进行委托,此外,尽量避免数据的线程同步问题。不同于传统的单线程编程模式,多线程编程中经常会出现意想不到的问题,如死锁,多线程的逻辑错误往往是始料未及的。
    2)原以为协议会比较简单,然而实际上,写一个完整的协议事实上是十分蛋疼的,尤其在整个四旋翼系统需要不同的控制信号时,那么每个数据帧的长度可能会有所不同,因此,我针对了这种变帧长的数据帧进行了编码和解码的协议编写,基本的帧结构为以两个字节作为帧头来区分不同的数据帧同时用两个字节来表示帧长度,通过将串口缓冲区的数据转移到数组列表中(类似队列),通过索引帧头,帧长度的方式填充缓冲区以此来得到帧数据,经验证,该协议在一定程度上具有自校正能力,即进行了一定的纠错。
    3)显示部分主要分为图像显示和波形显示。图像显示的功能主要为显示RGB565格式的彩色图像(OV7670摄像头的图像格式)以及8位灰度图(0V7620摄像头的图像格式),设计的初衷是便于显示航拍图像。至于波形显示,则是必不可少的了,在调试过程中,可以将诸如角度信息,PID的各项信息进行波形显示,有针对性地进行分析,并且程序能够自动对波形数据进行最值与极值点进行标注显示。同时,波形数据对为理论分析也提供了大量的依据。
    4)控制部分主要分为四轴解锁上锁,写入PID参数以及期望角度的改变,同时在接收到下位机的ACK信号之后进行相关的显示。
    5)重构。这里的重构指的是三维姿态显示,最初采用的是OPENGL,在.NET环境下,主要有SharpGL和CSGL,然而由于微软的DirectX和OPENGL一直处于竞争关系,因此C#对于OPENGL的支持十分的不友好,效率低下,于是我转用C++写OPENGL程序,效率可以,然而导入C#程序却十分困难,最后只能写成2个程序,在C#中通过调用进程的方式处理,显然,这样十分别扭,于是,我不得不放弃了OPENGL,转而使用微软的DirectX,花了几天时间初步学习了一下DirectX,发现用C#写DirectX程序还是十分简便的,效率也不低,于是又花了半天学了下3DMAX,做了一个四旋翼的三维模型,简单的渲染之后就可以用DirectX导入了,至于之后的旋转,平移这些运动对于DirectX来说也是小菜一碟了。

使用特权

评论回复
34
angerbird| | 2015-6-15 18:58 | 只看该作者
动手能力很强的,,做设计开发的关键就是动手能力的一个体现的。

使用特权

评论回复
35
guzongchuan| | 2015-6-18 13:51 | 只看该作者
:handshake

使用特权

评论回复
36
冰河w| | 2015-6-19 15:50 | 只看该作者
楼主分享点资料,让我们也DIY一下

使用特权

评论回复
37
sharknarduo|  楼主 | 2015-6-29 18:21 | 只看该作者
四旋翼调试日记(4)——嵌入式遥控及IOS开发
在能够做到很精确地控制四旋翼之前,遥控绝对是一个必不可少的部分,而大多数外出飞四旋翼的时候多半不会想背着个大电脑,开个上位机去在线调参了,于是,这个嵌入式的遥控应运而生。
    整个四旋翼系统做下来学到的东西还是非常多的,可以说起步的时候做做小车可以学到不少知识,而想要进一步提高和发展,那么做做四旋翼一定是一个很不错的选择。由于毕业设计的时间相对来说还是比较紧,本来想一上来就直接跑UCOS的,结果发现时间可能不够了,于是花了3天写了一个仿系统的状态机,基本功能包括在线设参数(小键盘真是写的蛋碎),摇杆控制四旋翼,波形显示,电机状态显示,以及一些紧急控制等等。
    本来想通过姿态角来投影椭圆长短轴以及线段长度,并且通过空间坐标来计算椭圆内像素点颜色以此实现光源渲染效果,然而实现之后发现72M主频的STM32完全带不动如此大计算量的运算和显示,由此3D姿态显示完全成为了**肋,最后不得不删掉这个功能,为之后的定高等参数显示留出更多的空间。
    PCB是小伙伴画的,没精力去学PCB了,说不定以后心血来潮会学着玩,这一版的PCB总的来说还是有些缺陷的,比如蓝牙4.0的天线下面铺地了,结果造成了蓝牙的通信距离锐减并且误码率很高,最后不得不用蓝牙模块了。不过总的来说还是很不错的,特别是外观。
    图标以及字模都存储在SD卡里,液晶用FSMC模拟驱动,刷新频率一般般,不快,所以采用局部刷新的方式来优化,波形显示很简单,使用队列的方式刷新缓存,然后描点。原以为波形图会比较难实现,在线设参数会很简单,结果刚好相反。数字键盘的难度远远比波形图难的多,毕竟在这方面,面向过程的语言和面向对象的语言还是无法相提并论的,最后用片内FLASH保存设定参数,方便下次再次设定。做完这个遥控这个人都Orz了..惊叹于C#的封装以及系统级别的封装严密性,如果再让我做一次这种状态机,我想我是不会再做的了。  
   

图片



    几乎每个玩四旋翼的都会想到用自己的手机控制四旋翼吧,有现成的系统不用,那简直就是浪费资源了。不过IOS开发的成本相对比较高,上手难度也不如桌面级系统的软件开发那么容易,和JAVA开发相比,也不是那么容易上手。其实IOS开发本身不难,主要是Objective-C这个奇葩语言的思维方式和传统的C,C++,C#有很大的不同,虽然上层代码可以直接用C++,但只有Objective-C可以直接调用Cocoa API。而且对于我们这些不想花钱买开发者账号的人而言,就必须花时间越狱并且每次进行真机调试之前进行繁杂的设置了,不过这些都无法阻止对IOS开发的热情。对于IOS的初步设想和嵌入式遥控相仿,主要会多一个三维姿态显示,这里会选择用OPENGL ES(嵌入式系统),其使用广泛,效率较高,在IPHONE端的3D应用几乎都采用这种方式。其次通信部分则使用蓝牙4.0,不知道在剩下的一个多月时间里能不能完成这个遥控。估计加摄像头和云台进行航拍是没时间实现了,毕竟精力和能力有限。

使用特权

评论回复

打赏榜单

21ic小喇叭 打赏了 5.00 元 2015-06-30

38
sharknarduo|  楼主 | 2015-7-4 14:34 | 只看该作者
四旋翼调试日记(5)
                                     ——基于惯导与高度传感器的四旋翼自主悬停算法的可行性(1)

通常来说,要使四旋翼飞行器达到自主悬停的效果需要得到其三维空间坐标,通过增加位置环来控制四旋翼飞行器的空间位置。事实上,悬停控制与定点控制并不能一概而论,前者只是后者的一种特例。由于仅通过加速度计二次积分得到的位移会快速发散,因此,似乎只用惯导实现三维空间坐标的测量是天方夜谭,尤其在四旋翼这样的系统下,更是难上加难。因此,我们必须转换思路,从其他方向寻找突破口。
首先从最易实现的定高控制入手,主流的方案分为以下几种:
(1)  超声波。对测得的高度进行单级PID控制。
(2)  气压计。对测得的高度进行单级PID控制。
(3)  超声波与惯导,将三轴加速度计通过方向余弦矩阵旋转到竖直方向(重力方向)后减去重力,从而得到重力坐标系下四旋翼飞行器的竖直运动加速度,对其进行滤波之后进行积分得到该方向速度。另一方面,对超声波测得的高度值进行补偿,微分后得到竖直方向的机体速度,将两者进行互补滤波得到融合后的机体竖直方向的运动速度。对融合后的机体竖直速度进行积分得到机体在竖直方向上的位移。对得到的融合后的竖直速度与竖直位移进行串级PID控制,内环为速度环,外环为高度环。
(4)  气压计与惯导。原理同上。
(5)  超声波、气压计与惯导。与(3)类似,不同之处在于引入了超声波与气压计所测高度的融合,通过调整机体在不同高度超声波与气压计的“可信度”,达到一个较为连续的融合高度。
简而言之,虽然气压计的精度远不如超声波高,然而其适用范围较广,超声波则只限于平地使用,且其测距范围与测量角度有限。

由于没有除惯导以外的传感器的介入,水平方向的自稳显得难上许多。在分析这个问题前,我们首先要明白四旋翼飞行器产生水平漂移的原因。
(1)  惯导的安装误差。
(2)  加速度计的测量误差。
(3)  陀螺仪的测量误差。
(4)  机体振动产生的影响。
误差是不可避免的,如果这个世界没有了误差,那么就不需要工程师的存在了,关键在于如何应对这些误差。由(1)产生的误差只能尽可能减少,无法消除,而(4)产生的误差则可以通过机械上的方式来处理,当然软件滤波也是较好的选择。从算法的层面讲,(2)、(3)所产生的误差是我们所关注的重点。陀螺仪的误差主要体现在其零飘与温飘,当然,我们可以在系统初始化时对静态的陀螺仪进行采样滤波,将其均值作为陀螺仪的零偏,然而飞行过程中的零偏变化却无法通过该方法计算。本文着重讨论(2),因此不再对(4)进行赘述。
加速度计的误差校正方式主要分为两大类:
(1)      将起飞平面当做水平,由此计算传感器偏差,在之后的运算中进行补偿。
(2)      使用诸如最小二乘法等最优估计算法对加速度计进行校正。
前者运算简便,然而只适用于地面较为水平的情况,局限性较大。而后者则需以当地的准确重力加速度进行标定。而无论采用何种方法最终都无法避免四轴的水平漂移,因为姿态解算测得的0度并不是真正的“水平”,很遗憾,这个世界是不完美的。
了解了四旋翼飞行器漂移的原因,我们知道要解决四旋翼飞行器的悬停的问题“无非”是找到真正的“水平”,如此就有了两类思路:
(1)  在不变更姿态控制的基础上,引入水平姿态补偿。
(2)  在原有姿态控制的基础上增加对于某个“状态量”的闭环控制。
    如此,我们的重点就变成了“如何计算水平姿态补偿”与使用何种“状态量”来进行闭环控制。

使用特权

评论回复

打赏榜单

21ic小喇叭 打赏了 3.00 元 2015-07-24

39
sharknarduo|  楼主 | 2015-7-25 12:48 | 只看该作者
四旋翼调试日记(6)
                                     ——由串级PID联想 基于惯导与高度传感器的四旋翼自主悬停算法的可行性(2)

紧接上文,本文将从以下两个方面讨论:
(1)基于惯导的反映“水平”的状态量闭环控制。
(2)“水平”姿态补偿。
从串级PID控制中,我们可以得知通过增加角速度内环可以增加系统的动态稳定性与响应,同时减少系统的超调,事实上仅通过角速度环的控制就可以使机体达到保持某个角度静止的效果。同样的,高度闭环中的速度内环也能起到同样的效果。由此,我们会联想到是否可以寻找机体在水平方向位移的微观量,并对其进行闭环控制呢?
众所周知,位移的微分是速度,速度的微分是加速度,那么加速度的微分是什么呢?
以机体X轴方向为例,T0时刻测得的合加速度为ax,T1时刻测得的合加速度为ax’,其夹角为  ,那么其差向量为 ,它代表为了消除机体在X轴上的加速度趋势所需的反加速度向量。由牛顿第二定律可得机体在X轴方向的反作用力为M  ,由于  ,为了简化运算,我们可以将上式转化为标量形式,即  =ax–ax’,即加速度微分。而我们的目的就是构造这个误差,并对其闭环控制,从而达到消除机体在X与Y轴方向的加速度变化趋势,同理可得,

使用特权

评论回复
40
sharknarduo|  楼主 | 2015-7-25 12:48 | 只看该作者
因此,在  时,机体X轴在T0与T1时刻速度的增量可近似为
   ,(1)
上式反映了机体X轴方向速度与合加速度增量的关系。由此,我们可以得到一种全新的控制思路:
  
深究(1)式的物理意义,可以追溯到动量定理:
将其分解展开得到:




    而  这个合外力函数则需要从空气动力学的角度进行分析,奈何本人的物理知识有限,只能分析到此。然而,从中可以证明四旋翼飞行器在漂移过程中所受的合外力在时间上的积累与其加速度增量有关,即能够通过控制其单位采样周期内的加速度增量来达到控制其漂移速度的目的,其中加速度增量(即加速度微分)为0是四旋翼飞行器悬停的一个必要不充分条件。
理论分析结束,位移法与以上方法相比,前者是积分,后者是微分,后者是前者的逆向思维产物,而相比较而言,后者可以避免加速度计积分过程中的累积误差即积分漂移。至此,我们还需解决以下几个实际问题:
(1)  加速度滤波
(2)  使用何种方法将加速度微分控制为0.
我们知道加速度计的高频噪声较严重,尤其是廉价的加速度传感器,针对问题(1),目前所能想到的滤波方法无非是滑动平均滤波(低通滤波),至于效果能否满足需求,现在还不得而知。
针对问题(2),分为两种解决方案:
(1) 模仿人的行为,将加速度微分通过算法转换为期望角度的补偿量,以此来动态调整,达到真正意义上的“水平”。
(2) 增加前文提到的串级控制,将其输出直接叠加在姿态控制上,最终达到调整姿态到“水平”。
由于(2)已在前文提及,这里不做详细讨论,下面对(1)进行深入分析。
首先,我们要了解0是速度增量与加速度增量的一个极值,由此我们可以尝试使用梯度下降法。首先,梯度下降法的定义如下:
基于这样的观察:如果实值函数  在点 a处可微且有定义,那么函数   在 a点沿着梯度相反的方向  下降最快。若

对于  >0为一个足够小数值时成立,那么    。
因此,我们可以从函数F的局部极小值的初始估计  出发,得到如下递推表达式:
因此可以得到
通过调整不同的步长  来达到序列函数F的快速收敛。其中  可以是函数也可以是定值,  为误差函数,  为其梯度函数。
由上可得,我们需要构造一个之前分析中提到的误差函数,即  。这里将其转化为标量式:
这样得到的误差函数的极小值必然为0,且为标量形式,然后计算其梯度  。

设期望角度补偿量为  ,因此:

那么我们要做的就是确定一个合理的步长函数或是定值。


总结
    本文主要讨论了四旋翼飞行器的几种自主悬停算法的可行性,传统的位移法在没有位移传感器的介入下计算位移会产生积分漂移,而本文所讨论的算法均从微元的角度出发,由小及大,其难点在于对加速度计的滤波处理。

使用特权

评论回复
发新帖 本帖赏金 38.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则