运动状态中的加速度传感器

之前对加速度传感器读数震荡早有耳闻,但是一直没有真正在电机启动状态下记录读数。今天春节的慵懒综合症差不多过去了,做了一个小实验,对加速度传感器做一个简单的评估。

实验条件是从上方吊起四轴飞行器,操作顺序为:
1. 接通电源,记录读数
2. 启动电机功率到40(80~100为起飞功率),飞行器无摆动
3. 停止电机
4. 启动电机功率到40,同时手动让飞行器做钟摆运动
5. 保持电机功率,用拉绳把飞行器倾斜30度左右

得到的记录数据如下:

传感器工作情况记录

传感器工作情况记录

图中的红色数据是加速度传感器计算出来的角度,黑色是平均滤波后的角度。横坐标是时间,50表示1秒。从图中得到以下结论:
1. 在电机未启动时,加速度传感器和陀螺仪传感器积分值较接近,数据抖动在1度到4度之间,因为是悬挂状态,所以可以认为数据是准确的;
2. 电机启动之后,在飞行器没有摆动的情况下,读数依然跳动的非常厉害(正负15度);
3. 在钟摆运动的情况下,由于数据抖动的原因,读数看上去和不动的时候居然没啥区别;
4. 在手动倾斜的情况下,可以看出传感器虽然读数跳动剧烈,但是总体趋势还是会偏移;

从钟摆运动的中段1500到2000之间取出数据放大,分别查看陀螺仪传感器读数和加速度传感器的读数:

钟摆运动下的陀螺仪传感器读数

钟摆运动下的陀螺仪传感器读数

钟摆运动下的加速度传感器读数

钟摆运动下的加速度传感器读数

果然如传闻所说,陀螺仪传感器还是比较给力的,至少数据图看上去还比较整齐;而加速度传感器基本处于暴走状态,必须要长时间的平均才能反映大致的倾角范围。

新来的朋友可能会有疑问,既然这样的话,为什么不直接抛弃加速度传感器,直接用陀螺仪来测量角度呢。其实主要原因在于陀螺仪测量角度是靠积分计算的,时间一长就会有误差的积累。最简单的验证就是把飞行器水平放到地上,你会发现积分出来的角度在几分钟之后非常缓慢的上升到几十度。所以需要在积分的过程中不断的掺入加速度传感器的读数,用来修正误差。

今天的实验是室内试验,只敢把电机功率调到40,在真正飞行状态下,误差会更大。不过有了数据,心里大概能踏实点儿了。接下来就是考虑如何减少加速度传感器的震动误差,可以考虑从结构上物理减震和从算法上调整计算参数。希望接下来好运吧! :)



对 “运动状态中的加速度传感器” 的 32 条 评论

  1. obK仔 说:

    沙发一下..哈哈~~

    终于大概懂了点为什么要用陀螺仪了~~原来是这样子~

    好文章啊~动力老哥~

  2. 糖伯虎 说:

    看了这个图片,只能有四个字,触目惊心。加速度咱也玩过了,没曾想这么暴走,我建议动力哥降低加速度的采样率,不对请拍砖

    • 是啊,我之前是用手拿着晃,感觉读数还可以。可能是因为我的电机摔过几次,轴有点偏了,所以在高速旋转的时候,会有随机的加速度跳动

    • 恩,我现在是保持加速度采样率,然后把5次读数平均成一个值,希望能好一点

      • 糖伯虎 说:

        做了平均值滤波后,效果如何?

        • 从测量读数看来,效果是好了很多,但是飞起来还是很不稳定。
          前一段时间工作忙,所以很久没进展了,而且还不知道从何入手。这几天突然想起一个问题,正好也向糖伯虎老兄请教一下。
          我之前看电调的说明书,需要使用50Hz的PWM来控制电调,但是这样一来,我测量各传感器的350Hz的采样频率其实是没有意义的,因为测量7次才修改一次转速。
          不知道糖伯虎老兄有没有玩过航模的电调,这个PWM是否允许修改频率?
          我这几天也准备查查资料,打算再次把程序大改一遍

  3. SSS_SXS 说:

    动力兄,分析数据用什么软件获得?

  4. SSS_SXS 说:

    了解,看来你们真是学以至用,有时间我也学着试试

  5. SSS_SXS 说:

    动力兄,能不能把整个四轴飞行器制作的大致思路再整理一下,包括涉及到的算法

  6. obK仔 说:

    動力老哥..我今天終於焊好了一塊ADXL345..各種辛苦啊..吹死了3片才弄好..

    但後來發現我在網上找的程序輸出來的值有點奇怪..你能夠幫忙提供一下你寫的關於ADXL的程序讓我測試一下嗎?只需要輸出XYZ軸的加速度就可以了..謝謝你啦..我的郵箱是umwcl.kai@gmail.com

  7. obK仔 说:

    对了..动哥..

    你知道arduino i2c(SDA, SCL两个pin)是开漏输出的吗?
    那其他digital pin如果要开漏的话如何设置呢?

    • obK仔 说:

      不然如果digital pin都输出5V的话不会把ADXL345烧了吗?

    • 汗,啥叫开漏输出?我不太清楚,不过你不用担心烧掉,这种管脚都是有内置电阻的

      • obK仔 说:

        是这样的..一般arduino默认输出5V的高电平..
        但在实际使用上..ADXL和L3G4200的管脚能接受的高电平只有3.3V左右..最高3.6V..

        为了便于总线上的扩展..很多单片机就会预留开漏输出的管脚..
        也就是在管脚不接上拉电阻的情况下..单片机是输出不了高电平的电压值的..
        为的就是便于单片机能在开漏脚上输出更种总线需要的电压..

        AVR的GPIO可以有几种模式设置的..开漏就是其中一种,但被arduino封装以后不知道如何设置..所以就想请教一下~

        • 多谢obK仔的解释,我其实没有系统的上过电子的课程,书也没怎么翻过,所以这些基本概念真是欠缺啊。
          看了说明书还真是3.3V的,我直接就把DigitalWrite接上去了。只能说Arduino的板子设计的好,不然估计早烧了。这样说来,Arduino应该是开漏的:)

  8. 张涛 说:

    本人现在在做一智能小车(不是飞思卡尔,仅仅是普通的四驱车),本来设计底盘时,两边的轮子在一条直线上(就好像长方形那样)但是转弯速度不是很满意,所以想如果把轮子的安装改成,前两个轮子距离短,后两个轮子距离和以前一样长(类似于梯形),不知会不会提高转弯时速度,新手发帖,可能不是很通顺,忘各位前辈知道的话,帮我分析分析,谢谢!

    • 请问你的小车是多少个电机驱动的?这方面我的经验的不多,但是我基本明白你的意思。从极端的角度来考虑,假如把前面两个轮子合并成一个轮子,变成一个三轮车。
      这样的情况下,转弯速度基本就靠两个后轮的速度差来决定了。之所以你觉得四轮转弯慢,我猜想是因为前轮角度不能变化,在拐弯时对地面有较大摩擦力。
      我看到很多的设计,两个前轮是万向轮,这样转弯阻力就会比较小。

  9. 胡泊 说:

    有没有用卡尔曼滤波

    • 没有用,我对比了平衡滤波和卡尔曼滤波,看上去好像差不多(假设我卡尔曼的代码没写错)
      放假前我检查出一些bug,已经修复了,不过上了7天班,又去外地休了7天假,只能等这个周末试飞了 :)

  10. 小张 说:

    我最近做毕设的时候买了一个集合电子罗盘(测地磁场)和三轴加速度计集合的模块。照博主的说法,那个电子罗盘估计也是在劫难逃的抖动得厉害了。我最近试了的确如此,心疼吖,那么贵的东西买了做出来还是这么平平的效果。不知道博主有没有什么好的招数支给大家,来滤除各种传感器无用的噪声。譬如有什么算法拿出来讨论一下!

    • 轮式机器人震动应该没这么大吧?飞行器因为螺旋桨转速很快,所以有高频振动,轮式机器人应该多读几次取平均值就行

      • kapok 说:

        博主,您好。我最近正在研究四轴,用的是MPU6050的3轴陀螺仪3轴加速度计先来学习一下,考虑到您所述的在飞行器电机运行期间加速度计得到的结果误差很大,但我不打算用kerman滤波,想请问您,在电机运行期间,通过多次采样(间隔时间长一点)可以实现吗,效果如何?

  11. chentc 说:

    大哥,看了你这篇之后我又看了这篇教程 说的是加速度传感器姿态识别的东西

    http://www.starlino.com/imu_guide.html

    请问加速度传感器是不是只能做到平稳无额外加速度(重力加速度之外)的情况下的3D识别呢?一旦有额外的抖动,加速度传感器就几乎无能为了了吗?

    是不是在姿态识别中加速度传感器做的就只是近似估计重力加速度和加速度传感器模块之间的夹角呢?

    • 是啊,对于比较平稳运动的物体,加速度传感器是很精确的,但是对于有抖动的物体,加速度传感器基本没用了,只能读很多次以后平均做个参考值。

发表评论

可以使用下列 XHTML 标签:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>