gpt4 book ai didi

position - 使用加速度计和陀螺仪计算位移 (MPU6050)

转载 作者:行者123 更新时间:2023-12-01 18:11:52 52 4
gpt4 key购买 nike

我是一名计算机科学专业的学生,​​正在从事一个电子项目,需要计算偏航、俯仰、滚动和 X、Y、Z 位移。我想在枪中安装 IMU 并跟踪其方向和位移。我能够获得偏航、俯仰和横滚,但不幸的是无法理解如何计算枪的位移或位置。我使用的是包含 MPU-6050 的 10 自由度 GY-87 传感器。

我得到的值以 g 和 m/s2 格式表示。根据我已经研究过的研究,我需要获得加速度/时间2,然后添加所有值。但不明白我应该使用什么时差。引用:How to calculate distance based on phone acceleration

#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);
}

我想跟踪以下 YouTube 视频中所示的对象。

http://www.youtube.com/watch?v=ZYyyaJgKsDg

如果你们中有人能在这方面指导我,我将不胜感激。谢谢

P.S:抱歉我的英语不好并且使用了非技术术语。

最佳答案

恐怕这个答案不是您想听到的。从 IMU 单元计算位置非常非常困难。这个video from Google是一个很好的引用来说明原因(请参阅第 24 分钟了解详细解释)。基本上,您需要对加速度进行两次积分才能到达位置。您还需要从 IMU 看到的加速度中消除重力。如果做得不完美,错误就会很快累积起来。

您引用的视频使用球在 table 上滚动的信息来告知他们的模型。他们可以跟踪传感器的方向来了解球的滚动方向。他们利用球的半径以及板的角度变化来跟踪球的 x 和 y 方向。如果你把他们的球从 table 上拿下来,那就根本不起作用。

如果您需要跟踪某物,您应该寻找一些可以为您提供有关物体位置信息的传感器(GPS、视频分析)。然后,您可以使用卡尔曼滤波器将其与 IMU 数据相结合,以获得良好的位置精度。

祝您的项目顺利。

关于position - 使用加速度计和陀螺仪计算位移 (MPU6050),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26476467/

52 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com