当前位置 : 主页 > 网页制作 > css >

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

来源:互联网 收集:自由互联 发布时间:2021-06-13
我是一名计算机科学专业的学生,​​从事电子项目,需要计算偏航,俯仰,滚动和X,Y,Z位移.我想用一把枪连接IMU并跟踪它的方向和位移.我能够得到偏航,俯仰和俯仰,但遗憾的是无法理解如何
我是一名计算机科学专业的学生,​​从事电子项目,需要计算偏航,俯仰,滚动和X,Y,Z位移.我想用一把枪连接IMU并跟踪它的方向和位移.我能够得到偏航,俯仰和俯仰,但遗憾的是无法理解如何计算我的枪的位移或位置.我使用的是包含MPU-6050的10-DOF 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看到的加速度中移除重力.如果做得不好,错误加起来非常快.

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

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

祝你的项目好运.

网友评论