当前位置:首页 >> 机械/仪表 >>

我的自平衡小车D2——加速度计与陀螺仪获取姿态参数的差异


查看: 4984|回复: 17

我的自平衡小车 D2——加速度计与陀螺仪获取姿态参数 的差异
[复制链接]

黑马

电梯直达 楼主 发表于 2012-3-23 11:00:50 |只看该作者 |倒序浏览

22 主 题 版主

11 好友

854 积分

滤波的算法还没有研究明白,先放上一段从传感器直接采样的结 果。
? ? ? ? ? #include <Wire.h> #define Acc 0x1D #define Gyr 0x69 #define Mag 0x1E #define Gry_offset -13 #define Gyr_Gain 0.07 // 陀螺仪偏移量 // 满 量 程 2000dps 时 灵 敏 度

RedDot Winner

? 发消息

?

(dps/digital) ? ? ? float angleG; // 采样时间 #define pi 3.14159

?? unsigned long timer = 0; ?? void setup() { ?? ?? ?? ?? ?? ?? void loop() { ?? 间(ms) ?? 速度 ?? 速度 ?? long o_timer = timer; } sensor_init(); Serial.begin(19200); delay(1000);

// 配置传感器 // 开启串口以便监视数据

// 上一次采样时

float Y_Accelerometer = gDat(Acc, 1);

// 获取向前的加

float Z_Accelerometer = gDat(Acc, 2);

// 获取向下的加

float angleA = atan(Y_Accelerometer / Z_Accelerometer)

* 180 / pi; ?? // 根据加速度分

量得到的角度(degree) ?? ?? ?? timer = millis(); int dt = timer - o_timer; // 当前时间(ms) // 微分时间 Gry_offset)

angleG = angleG + Gyr_Gain * (gDat(Gyr, 0) +

* dt / 1000; ?? 得到的角度(degree) ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? int gDat(int device, int axis) { ?? ?? // 读九轴姿态传感器寄存器函数 ?? // For Arduino, by 黑马 ?? // 调用参数表 ?? // ?? // ?? // ADXL345 ?? // L3G4200D ?? // HMC5883L ?? // Example ?? // 00 #include <Wire.h> ?? // 01 #define Acc 0x1D; ?? // 02 #define Gyr 0x69; ?? // 03 #define Mag 0x1E; ?? // 04 ?? // 05 void setup() { ?? // 06 ?? // 07 ?? // 08 } sensor_init(); delay(1000); Acc Gyr Mag type device 0 x x x axis 1 y y z 2 z z y } Serial.print(timer); Serial.print(","); Serial.print(angleA, 6); Serial.print(","); Serial.print(angleG, 6); Serial.print(";"); delay(10); // 输出数据 // 对角速度积分

?? // 09 ?? // 10 void loop() { ?? // 11 ?? // 12 ?? // 13 ?? // 14 } ?? ?? ?? ?? ?? 址 ?? 址 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? Int ?? ?? } ?? ?? void sensor_init() { 传感器 ?? ?? ?? writeRegister(Acc, 0x2D, 0b00001000); // 配置 ADXL345 writeRegister(Gyr, 0x20, 0b00001111); // 设置睡眠模 // 测量模式 // 配置九轴姿态 return v; // 返回读书值 address = address + axis * 2; Wire.beginTransmission(device); Wire.send(address); Wire.requestFrom(device, 2); while(Wire.available() < 2); vL = Wire.receive(); vH = Wire.receive(); Wire.endTransmission(); // 读取数据 // 结束传输 // 数据偏移-坐标轴 // 开始传输数据 // 发送指针 // 请求2 byte 数据 // 成功获取前等待 if (device == Mag) address = 0x03; // HMC5883L 的读数地 int v; byte vL, vH, address; // 存放 byte 数值 int Z-Gyroscope; Z-Gyroscope = gDat(Gyr, 2); delay(50);

if (device == Acc) address = 0x32; // ADXL345的读数地址 if (device == Gyr) address = 0xA8; // L3G4200D 的读数地

if (device == Mag) v = (vL << 8) | vH; else v = (vH << 8) | vL; // 将 byte 数据合并为

式、x, y, z 轴使能 ?? writeRegister(Gyr, 0x21, 0b00000000); // 选择高通滤波

模式和高通截止频率

?? ??

writeRegister(Gyr, 0x22, 0b00000000); writeRegister(Gyr, 0x23, 0b00110000);

// 设置中断模式 // 设 置 量 程

(2000dps)、自检状态、SPI 模式 ?? 滤波 ?? ?? ?? ?? } ?? ?? void writeRegister(int device, byte address, byte val) { 写寄存器 ?? ?? ?? ?? ?? } 复制代码 Wire.beginTransmission(device); Wire.send(address); Wire.send(val); Wire.endTransmission(); // // 配置 L3G4200D(2000 deg/sec) writeRegister(Mag, 0x02, 0x00); // 配置 HMC5883L // 连续测量 writeRegister(Gyr, 0x24, 0b00000000); // FIFO & 高通

通过串口上传3个数据:采样时间、通过加速度计算得到的角度 AngleA、通过角速度积分得到的角度 AngleG。 在 pc 端得到的数据曲线

红色曲线是 AngleA,绿色是 AngleG,范围± ,整个测量时间为 10° 20s 可以看到最前面静止区域,两条曲线噪声都不算严重,至少可以说 明系统噪声不会是太严重的问题。 A 部分是敲击桌子产生的,由于加速度计是通过测量两个方向的加 速度来计算偏转角的。理想情况我们想要得到的是这两个方向的重

力加速度分量。但是任何机械系统不可避免存在的平动振动也会产 生相当大的加速度,而加速度计完全无法区分这两种加速度,所以 振动加速度在我们的测量中引入了强烈的噪声。 B 部分是用手偏移一个角度的结果,而 C 部分是系统晃动时采集的 数据,此时不可避免的引入振动,加速度计过分敏感的神经再次受 到强烈的刺激 。

而陀螺仪对振动不敏感,所以基本不会受到什么影响。我认为最前 面加速度计测量得到的噪声也主要来源于桌面的震动,毕竟我桌子 上的电脑风扇也是一个很大的噪声源。陀螺仪积分过程本身还有一 个好处,时间积分为0的随机噪声也在此过程中平滑掉了。 短时间来看,陀螺仪已经可以非常好的对姿态进行判定,但是对于 较长的时间,误差也随积分的过程不断累积,尽管有做过修正量 Gry_offset 来调校,随着时间累积,这个调校总归是不可靠的。 下面是100s 的静态测试

如果系统是动态的,受到系统反应时间的影响,误差会更大,所以 用加速度计进行修正是必要的。 卡尔曼滤波应该是比较"简单"而成熟的算法,但是要完全看懂对于 我这样的初鸟来说也不太容易。 D3应该就是关于卡尔曼滤波的一些 心得了。 其实这些对于论坛里各位 DX 来说可能是相当浅显的内容, 不过毕竟也是我个人从0到1的过程, 希望 DX 们不吝指教, 见笑了。


相关文章:
陀螺仪”和“加速度计”工作原理
陀螺仪加速度计”工作原理_电子/电路_工程...其实在自平衡小车上非 静止的时候,加速度计测出的...y = sinx; 如果超过这个范围, 小车姿态也无法调整...
MEMS加速度计与MEMS陀螺仪有什么区别?
热气团的比重周围的冷气是有差异的,通过惯性 热气...因而,我觉得我们在利用这一类加速度计进行定向时,...姿态测量系统MEMS陀螺仪... 6页 2下载券 MEMS加速...
基于单片机的两轮自平衡车控制系统设计
使用互补滤波完成陀螺仪数据与加速度计数据的数据融合...2.2.3 姿态检测 两轮自平衡车是一个本质不平衡...D2 D1 定时器 0 __ M1 C/T D0 M0 M1 和 ...
加速度计陀螺仪
加速度计陀螺仪_能源/化工_工程科技_专业资料。加速度计: 测量物体运动产生的加速度。 加速度使得机械悬臂与两个电极之 间的距离发生变化,从而改变了两个电容。...
加速度计类型简介
加速度计有两种: 一种是角加速度计,是由陀螺仪(...压阻加速度计各品牌的型号、 参数、原理、价格、...线加速度计的原理是惯性原理,也就是力的平衡,A(...
三轴加速度计
三轴加速度计_机械/仪表_工程科技_专业资料。传统的陀螺仪是一个机械系统部件;三轴加速度计是一个微机电系统(MEMS) 元件。陀螺仪 笨重,不耐冲击,无法直接产生...
对于陀螺仪和加速的传感器的认识】
只靠加速度传感器 来估计自 己的姿态 是 很危险而...加速度计是极易受外部干扰的传感器, 但是测量值随时间...用陀螺仪本身的角度积分 其实 MK 四轴的平衡算法...
两轮自平衡小车
(4) 因此,两轮自平衡小车平衡控制的基本思想是:是系统以姿态传感器(陀 螺仪加速度计)来监测车身所处的俯仰状态和状态变化率,通过高速中央处理 器计算出适当...
自平衡小车设计报告_图文
它集成了 3 轴 MEMS 陀螺仪,3 轴 MEMS 加速度计, 以及一个可扩展的数字...PID 参数的调试花费了大量的时间。 六.总结 自平衡小车制作过程中, 我们接触到...
两轮自平衡小车设计报告
它集成了 3 轴 MEMS 陀螺仪,3 轴 MEMS 加速度计, 以及一个可扩展的数字...PID 参数的调试花费了大量的时间。 六.总结 自平衡小车制作过程中, 我们接触到...
更多相关标签: