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

我的自平衡小车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 们不吝指教, 见笑了。


相关文章:
自平衡小车设计报告
自平衡小车设计报告_电子/电路_工程科技_专业资料。...陀螺仪加速度传感器集成模块通过倾角改变量来进行反馈...? 1 , 运动方程简化为: L d2 θ (t ) ? g...
自平衡小车
自平衡小车_电子/电路_工程科技_专业资料。两轮自平衡小车设计报告摘要: 本文采用 STM32 单片机作为主控制器,用 MMA7361 加速度传感器和两个陀螺仪传感 器来检测车...
双轮自平衡小车设计报告
2、陀螺仪加速度计模块本设计中所采用的陀螺仪加...显示自平衡小车的各种参数,如倾斜角、瞬时速度、瞬时...D2 D3 D4 D5 D6 D7 BLA BLK 引脚说明 数据 ...
自平衡小车系统设计报告完整
利用外加的 3 轴加速度传感器、陀螺 仪、光电反射...4.2 动力学模型及其参数说明自平衡小车车轮不但受...因此传感器姿态信号的优劣直接影响了 小车的控制性能...
自平衡小车设计报告
自平衡小车设计报告_电子/电路_工程科技_专业资料。...方案三:用陀螺仪和加速度传感器(MMA7361 和 ENC-...单轴两轮自平衡小车姿态... 3页 免费喜欢此文档的...
两轮自平衡小车设计报告
比如压力传感器 MPU-60X0 对陀螺仪和加速度计分别用了三个 16 位的 ADC,将...PID 参数的调试花费了大量的时间。 六.总结 自平衡小车制作过程中, 我们接触到...
双轮自平衡小车结题
双轮自平衡小车结题_电子/电路_工程科技_专业资料。...(陀螺仪)、2 个倾角侍感器、电机编码器一世光学...3 轴 MEMS 加速度计,以及一个可扩展的数字运动处理...
两轮自平衡小车
根据两轮自平衡小车的功能特 点,选择陀螺仪和加速度计两种惯性传感器来采集车体的姿态信息,直流无刷电 机自带的霍尔元件编码器采集车体速度信息。 控制单元采用微...
基于陀螺仪和加速度计的飞行机器人自平衡算法研究-曹珂杰-南京工程学院
基于陀螺仪和加速度计的飞行机器人自平衡算法研究-曹珂...方案二:在姿态控制算法里,只用标准的 PI 加权...d2 分别是连杆 1、2 的长度,d3 为连杆 3 和 4...
双轮自平衡小车小车开题报告
双轮自平衡小车小车开题报告_电子/电路_工程科技_...(陀螺仪)、2 个倾角侍感器、电机编码器一世光学...创新点:使用 MEMS 陀螺、加速度计来测姿、测 速...
更多相关标签:
陀螺仪如何计算姿态角 | 陀螺仪姿态解算 | 陀螺仪 姿态 | unity 陀螺仪姿态 | 陀螺仪姿态算法 | 姿态陀螺仪写入oled | 陀螺仪采集姿态信息后 | 陀螺仪 姿态角 |