11

私はコンピューター サイエンスの学生で、ヨー、ピッチ、ロール、および X、Y、Z 変位を計算する必要があるエレクトロニクス プロジェクトに取り組んでいます。銃に IMU を取り付けて、その向きと変位を追跡したいと考えています。ヨー、ピッチ、ロールを取得できますが、残念ながら銃の変位または位置を計算する方法を理解できません。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);
}

次のYouTubeビデオに示されているように、オブジェクトを追跡したいと思います。

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

この点について、どなたかご教示いただけると幸いです。ありがとうございました

PS: 下手な英語と非専門用語の使用について申し訳ありません。

4

5 に答える 5

3

遅くなりましたが、役に立つかもしれません。詳細は慣性航法システムのINSスタンドで検索できます。簡単に言えば、IMU はそれに取り付けられたフレームの加速度と角速度を測定します。たとえば、x 方向の acc は IMU の x 方向であり、位置を計算する参照フレームの x 方向ではありません。したがって、加速度を参照フレームに変換する必要があります。これは、オイラー角によって行うことができます。私が理解したように、MPU 6050 はオイラー角と変換行列さえも提供します。もしそうなら、あなたは使うべきです

Acc_inert = T * Acc_body 

センサーによって測定された acc ベクトルを参照フレームの acc ベクトルに転送します。次に、2回積分すると、基準フレーム内の位置が得られます。オイラー角と変換行列の計算に関する詳細は、インターネットで入手できます。

于 2016-09-09T10:41:25.830 に答える