1、1 这是我在优酷上传的两段视频。 从开始做四轴到现在,已经累计使用了三个月的时间,从开始的尝试用四元数法进行姿态 检测,到接着使用的卡尔曼滤波算法,我们走过了很多弯路,我在从上周开始了对德国人 四轴代码的研究和移植,发现德国人的代码的确有他的独到之处,改变了很多我对模型的 想法,因为本人是第一次尝试着制作模型,因此感觉很多想法还是比较简单。经过了一周 的时间,我将德国人的代码翻译并移植到了我目前的四轴上,并进行了调试,今天,专门 请到了一个飞直升机的教练,对我们的四轴进行试飞,并与一个华科尔的四轴进行了现场 比较,现在我们四轴的稳定性已经达到了商品四轴的程度。下面是我这一周时间内对德国 人代码
2、的一些理解: 德国人代码中的姿态检测算法: 首先,将陀螺仪和加速度及的测量值减常值误差,得到角速度和加速度,并对角速度进行 积分,然后对陀螺仪积分和加速度计的数值进行融合。融合分为两部分,实时融合和长期 融合,实时融合每一次算法周期都要执行,而长期融合没 256 个检测周期执行一次, (注意 检测周期小于控制周期的 2ms) 实时融合: 1.将陀螺仪积分和加表滤波后的值做差; 2.按照情况对差值进行衰减,并作限幅处理; 3.将衰减值加入到角度中。 长期融合: 长期融合主要包括两个部分,一是对角速度的漂移进行估计(估计值是要在每一个控制周 期都耦合到角度中的) ,二是对陀螺仪的常值误差(也就是陀
3、螺仪中立点)进行实时的修正。 1.将陀螺仪积分的积分和加速度积分做差(PS:为什么这里要使用加表积分和陀螺仪积分 的积分,因为在 256 个检测周期内,有一些加速度计的值含有有害的加速度分量,如果只 使用一个时刻的加表值对陀螺仪漂移进行估计,显然估计值不会准确,使用多个周期的值 进行叠加后做座平均处理,可以减小随机的有害加速度对估计陀螺仪漂移过程中所锁产生 的影响) 2.将上面两个值进行衰减,得到估计的陀螺仪漂移 3.对使考虑了陀螺仪漂移和不考虑陀螺仪漂移得到的角度做差,如果这两个值较大,说明 陀螺仪在前段时间内测到的角速率不够准确,需要对差值误差(也就是陀螺仪中立点)进 行修正,修正幅度和差
4、值有关 长期融合十分关键,如果不能对陀螺仪漂移做修正,则系统运行一段时间后,速率环的稳 定性会降低。 下面比较一下德国四轴中姿态检测部分和卡尔曼滤波之间的关系: 卡尔曼滤波是一种线性系统的最优估计滤波方法。对于本系统而言,使用卡尔曼滤波的作 用是通过对系统状态量的估计,和通过加速度计测量值对系统状态进行验证,从而得到该 系统的最优状态量,并实时更新系统的各参数(矩阵) ,而最重要的一点,改滤波器能够对 陀螺仪的常值漂移进行估计,从而保证速率环的正常运行,并在加速度计敏感到各种有害 加速度的时候,使姿态检测更加准确。但是卡尔曼滤波器能否工作在最优状态很大程度上 取决于系统模型的准确性,模型参数的
5、标定和系统参数的选取。然而,仅仅通过上位机观 测而得到最优工作参数是不显示的,因为参数的修改会导致整个系统中很多地方发生改变, 2 很难保证几个值都恰好为最优解,这需要扎实的理论知识,大量的测量数据和系统的仿真, 通过我对卡尔曼滤波器的使用,发现要想兼顾锁有的问题,还是有一定难度的。 而德国人的姿态检测部分是在尝试使用一种简单方法去解决复杂问题,他既没有使用传统 的四元数法进行姿态检测,也么有使用卡尔曼滤波。他的计算量不比最简单的卡尔曼滤程 序波程序的计算量小,但与卡尔曼滤波相比,更加直观,易于理解,参数调节也更加方便。 我个人理解,这个方法是在尝试着对卡尔曼滤波这一复杂相互耦合的多状态变量的
6、线性系 统状态估计过程进行了简单的解耦,从而将姿态的最优估计和陀螺仪漂移的最优估计分隔 开,这样,就可以通过比较直观的观测手段对两个部分的参数进行调整,但是,这种方法 的理论性肯定不如使用四元数法和卡尔曼滤波,在一些特殊的情况下还可能出现问题,但 是,由于卡尔曼滤波器设计的难度,使用这种方法还是比较现实的。 控制算法: 德国人的控制算法的核心是对角速度做 PI 计算,P 的作用是使四轴能够产生对于外界干扰 的抵抗力矩,I 的作用是让四轴产生一个与角度成正比的抵抗力。 如果只有 P 的作用,将四轴拿在手上就会发现,四轴能够抵抗外界的干扰力矩的作用,而 且这个抵抗力非常快速,只要手妄图改变四轴的转
7、速,四轴就会产生一个抵抗力矩,但是, 如果用手将四轴扳过一个角度,则四轴无法自己回到水平的角度位置,这就需要 I 的调节 作用。 对角速度做 I(积分)预算实际得到的就是角度,德国人四轴里面用的也是角度值,如果 四轴有一个倾斜角度,那么四轴就会自己进行调整,直到四轴的倾角为零,它所产生的抵 抗力是与角度成正比的,但是,如果只有 I 的作用,会使四轴迅速产生振荡,因此,必须 将 P 和 I 结合起来一起使用,这时候基本上就会得到德国四轴的效果了。 在对角速度进行了 PI 调节之后,德国人将操纵杆的值融合到结果中去,并对得到的新的值 有进行了一次 PI 计算,这个积分参数很小,使用这个积分的作用因
8、为,四轴在有一个非常 小的倾角的情况下产生的抵抗力矩很小,无法使四轴回到水平位置,这就会导致无论怎么 手动调节微调,四轴都很难做到悬停,会不停得做水平漂移运动,这就必须不停的进行调 整。 简单介绍一下用加速度传感器修正角速度传感器(陀螺仪)累计误差的原理 收藏 内容原作者 OURAVR - feng_matrix 陀螺仪输出角速度,是瞬时量,一般角速度姿态平衡上是不能直接使用,多数惯导系统控 制需要角度信号 所以需要角速度与时间积分计算角度,得到的角度变化量与初始角度相加,就得到目标角 度,其中积分时间 Dt 越小,输出角度越准 但陀螺仪的原理决定了它的测量基准是自身,并没有系统外的绝对参照物
9、,加上 Dt 是不可 能无限小 所以积分的累积误差会随着时间流逝迅速增加,最终导致输出角度与实际不符,所以陀螺 仪只能工作在相对较短的时间尺度内。 加速度测量的是重力方向,有系统外绝对参照物“重力轴” ,在无外力加速度的情况下,能 3 准确输出 ROLL/PITCH 两轴姿态角度 并且此角度不会有累积误差,在更长的时间尺度内都是准确的。但是加速度传感器测角度 也有缺点 加速度传感器实际上是用 MEMS 技术检测惯性力造成的微小形变,而惯性力与重力本质就 是一个东东 所以它就不会区分重力加速度与外力加速度,当系统在三维空间做变速运动时,它的输出 就不正确了。 很可惜,多数需要惯导姿态角的系统,都
10、不是工作在静止状态下。 所以在没有其它参照物的基础上,要得到较为真实的姿态角,就要扬长避短,结合两者的 优点,摈弃其各自缺点 最简单的办法就是加权,设计算法在短时间尺度内增加陀螺仪的权值,在更长时间尺度内 增加加速度权值,这样系统输出角度就更真实了 其实 MK 四轴的平衡算法也是这样,首先对陀螺仪做 PI 运算,其中 I 的真正含义就是积分 反演角度 有了陀螺仪 PI 算法,四轴就有了瞬时增稳,就可以遥控飞了,但是它不会永远水平 由于累积误差的作用,很快中立点就不是水平位置了,这时候就需要用加速度不断的纠正 陀螺仪积分误差。 你可以看到 MK 算法中有根据加速度方向不断把积分量 I 递减清零的
11、代码,就是这个融合 算法的核心了 MK 立足于一个高级航模玩具,为了在低成本 8 位单片机上运行,不去显式的计算姿态角, 只把校正后的 PI 值输出负反馈控制电机了 这样的好处是基本上只用整型算法就能完成运算,而要显式的计算姿态角,更专业的做法 就是 KALMAN 滤波显式求解姿态 卡曼滤波也是在对历史数据积分,并且可以同步融合陀螺仪与加速度数据,陀螺仪与加速 度贡献权值还可以通过滤波参数调整 所以它就成了惯性数据处理的经典算法,他的缺点是浮点运算量较大,对系统资源要求较 高 很少有人在资源较少的 8 位单片机上玩卡曼滤波的。 总结一下就是: PITCH/ROLL 角速度积分PITCH/ROLL 姿态角,再结合加速度纠正累积误差 YAW 角速度积分 方向角,再结合地磁传感器、GPS 纠正累积误差 当然导航并非只能用加速度传感器,其它有绝对参照物的传感器都可以 比如人除了耳蜗外,还有视觉,根据身边的景物人也不会有累积误差导致摔跤的问题 但一般人闭上眼睛,即便有耳蜗能保持平衡,摔跤可能性也会增加。 还有其它传感器,比如红外,航模上有种德国红外平衡仪,就是检测地平线上下,红外背 景强度不同来保证绝对姿态的。 卫星上以前还听说过星光导航的,应该也是用它来作为一个相对静止的参照物。