svh*_*vhr 5 position arduino accelerometer dead-reckoning gyroscope
我是一名计算机科学专业的学生,从事电子项目,需要计算偏航,俯仰,滚动和X,Y,Z位移.我想用一把枪连接IMU并跟踪它的方向和位移.我能够得到Yaw,Pitch和Roll,但遗憾的是无法理解如何计算我的枪的位移或位置.我使用的是包含MPU-6050的10-DOF GY-87传感器.
我得到了g和m/s2格式的值.从我研究过的研究来看,我需要获得加速度/时间2,然后添加所有值.但是我不明白我应该使用什么时差.参考:如何根据手机加速度计算距离
#include "I2Cdev.h"
#include "MPU6050.h"
// Arduino Wire library is required if I2Cdev I2CDEV_ARDUINO_WIRE implementation
// is used in I2Cdev.h
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
#include "Wire.h"
#endif
// class default I2C address is 0x68
// specific I2C addresses may be passed as a parameter here
// AD0 low = 0x68 (default for InvenSense evaluation board)
// AD0 high = 0x69
MPU6050 accelgyro;
//MPU6050 accelgyro(0x69); // <-- use for AD0 high
int16_t ax, ay, az;
float dx, dy, dz = 0;
int16_t gx, gy, gz;
#define LED_PIN 13
bool blinkState = false;
void setup() {
// join I2C bus (I2Cdev library doesn't do this automatically)
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
Wire.begin();
#elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE
Fastwire::setup(400, true);
#endif
Serial.begin(38400);
Serial.println("Initializing I2C devices...");
accelgyro.initialize();
Serial.println("Testing device connections...");
Serial.println(accelgyro.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");
Serial.println("Updating internal sensor offsets...");
accelgyro.setXGyroOffset(85);
accelgyro.setYGyroOffset(1);
accelgyro.setZGyroOffset(-4);
accelgyro.setXAccelOffset(-4269);
accelgyro.setYAccelOffset(-4836);
accelgyro.setZAccelOffset(1080);
pinMode(LED_PIN, OUTPUT);
}
void loop() {
accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
dx=dx+(float)(((float)ax/(float)16384)*9.8*0.05*0.05);
dy=dy+(float)(((float)ay/(float)16384)*9.8*0.05*0.05);
dz=dz+(float)(((float)az/(float)16384)*9.8*0.05*0.05);
Serial.print(dx); Serial.print("\t");
Serial.print(dy); Serial.print("\t");
Serial.print(dz); Serial.print("\t\n");
delay(1000);
// blink LED to indicate activity
blinkState = !blinkState;
digitalWrite(LED_PIN, blinkState);
}
Run Code Online (Sandbox Code Playgroud)
我想跟踪对象,如以下YouTube视频中所示.
http://www.youtube.com/watch?v=ZYyyaJgKsDg
如果你们中的任何人能够引起我的关心,我将不胜感激.谢谢
PS:抱歉我的英语不好并使用了非技术性条款.
我担心答案不是你想听的答案.从IMU单元计算位置是非常非常困难的.来自Google的这段视频是一个非常好的参考资料(详见第24分钟).基本上,您需要将加速度两次集成才能定位.您还需要从IMU看到的加速度中移除重力.如果做得不好,错误加起来非常快.
您引用的视频使用了球在桌面上滚动的信息来通知他们的模型.他们可以跟踪传感器的方向,以了解球的滚动方向.他们使用球的半径以及球板的角度变化来跟踪x和y球.如果你把球从桌子上拿下来就根本不起作用.
如果您需要跟踪某些内容,您应该寻找一些可以为您提供有关物体位置信息的传感器(GPS,视频分析).然后,您可以使用卡尔曼滤波器将其与IMU数据相结合,以获得良好的定位精度.
祝你的项目好运.
我知道这是一篇旧帖子,但我想我会从我用 MPU 6050 和 arduino 完成的实验中发布一些更正。
首先,您用于查找位移的方程不正确,您需要使用运动学方程。然而,方程 Xf = 1/2a t^2 + Vo t + Xo 也是不正确的,因为它仅适用于 CONSTANT 加速度。在这种情况下,加速度正在发生变化,因此您可以取两个数据集点之间的平均加速度并将其代入前面的方程或使用以下方程:
Xf = 1/4(Af + Ao) t^2 + Vo t + Xo
其中 Xf 是以米为单位的最终距离,Af 是以 m/s^2 为单位的最终 CURRENT 加速度,Ao 是以 m/s^2 为单位的最后一个数据集的先前加速度,t 是 Af 和 Ao 集之间的时间变化以秒为单位的数据,Vo 是最后一个数据集的瞬时速度,单位为 m/s,Xo 是最后一个数据集的最终距离或所有先前距离的总和,单位为米。Vo 需要使用先前的加速度和来自先前两个先前数据集或 Ao-1 的加速度使用以下运动学方程计算:
Vo = 1/2(Ao + Ao-1)*t + Vo-1
其中 Vo 是之前的瞬时速度,单位为 m/s,Ao 是之前的加速度,单位为 m/s^2,Ao-1 是之前两个数据集的加速度,单位为 m/s^2,t 是 Ao 和SECONDS 中的 Ao-1 数据集,Vo-1 是 Ao-1 数据集或两个数据集之前的以 m/s 为单位的瞬时速度。
其次,您需要使用更可靠的时钟。我建议使用 micros() 函数并记住 t 是数据集之间的时间变化。我不确定它的可靠性,但它是我能想到的最好的。确保在使用所述方程时从微秒转换为秒。
第三,我建议您通过将您的代码与校准草图(例如 Luis Ródenas 的草图)相结合,每隔一段时间甚至每次在代码的开头校准您的偏移量。您可以将其放置在 setup() 例程中,并且可以使用较小的缓冲区大小值或数据集(例如 200 或 300)以确保您不会在实验之间等待太长时间。
第四,您可以使用两个数据集加速度之间的平均值进行操作(这就是我们上面所做的),或者更进一步,使用各种数据集的平均值,例如使用 fifo 缓冲区数组来存储各种加速度值并取缓冲区中所有值的平均值。FIFO 缓冲区要求始终保留一定数量的值,但随着新值的进入,旧值会离开。fifo 越大,您的距离计算就越不准确,但 fifo 缓冲区将允许异常加速度值对您的数据产生过多影响。缓冲区的大小要求您在加速度值的准确性和孤立的异常值之间找到一个最佳点。如果您确实使用 fifo 缓冲区作为加速度值,则使用以下等式:
Xf = 1/2A t^2 + Vo t + Xo
Vo = Aold *t + Vo-1
其中 A 是从假设的 FIFO 缓冲区得出的新平均加速度,Aold 是来自最后一个 FIFO 平均值的旧平均加速度,t 是两个单独数据集点之间的时间变化。当然,一切都是标准单位,m/ss 等等。
您通过除以 16384 再乘以 9.8m/s^2 将原始加速度值转换为 m/s^2 做得很好。16384 值取决于 +-2g 的标准灵敏度设置,如果您选择其他设置(如 +-4g),则可能会发生变化。
最后,即使有上述所有变化,由于温度等许多不同因素,也很难获得准确读数。通过使用风扇或任何东西将陀螺仪/加速度计保持在室温或 25 摄氏度,为您的加速度计保持受控环境非常重要。mpu.getTemperature()我相信Jeff Rowberg MPU6050 库中有一个函数可以获取当前温度。
即使进行了所有这些更改,由于数学原因和小错误,仍然很难获得良好的准确读数。您可以尝试将陀螺仪设置为较不敏感的设置,因为我知道 mpu 6050 设置为默认的 +-2g 设置,较高的设置可以防止许多问题影响您的读数,但它对小位移的敏感度会降低。
总是有更多方法可以优化陀螺仪/加速度计值,一种方法是增加 MPU 数据流的频率以便在一段时间内接收更多数据,这可以让您接收更准确的读数. 我相信 Jeff Rowberg 库中有一个函数可以实现这一点。
| 归档时间: |
|
| 查看次数: |
43240 次 |
| 最近记录: |