六軸センサMPU6050(GY521)を用いて角度算出を行いたいです
上記センサを用いて角度検出を行い,Arduino UNOを用いてシリアルモニタ上に表示しようとしています.最終的には検出した値を3dモデルと同期させることが目的です.
角度はモニタの回転角(相対角度?)ではなく,地面に対しての角度(絶対角度?)を取得を行いたいです.
また,madgwickフィルタを用いた補正についても行いたいので教えて下さると助かります.
それらを満たすソースコードを教えて頂けるとありがたいです.
x軸周りとy軸周りの角度は取得できていますが,z軸周りが取得できません
プログラムを1から自作するのは能力不足のため行えませんでしたので,GitHubよりソースコードを拝借いたしました.
コードの内容は殆ど把握できていないので引っ張ってきたものをそのまま使用しています.
下記のソースコードを試したところ,x軸(pitch)とy軸(roll)まわりの角度は地面に対する角度で取得できているのですが,z軸まわりだけはシリアルモニタを開いた時点からの回転角でしか表示できません.(シリアルモニタを表示した時点が0度)
以下にソースコードを載せますが,引用しただけですので,これを修正していただく,
もしくは1から作り変えてくださると大変助かります.
該当のソースコード
Arduino言語
1#include <Wire.h> 2#include <MPU6050.h> 3 4MPU6050 mpu; 5 6// Pitch, Roll and Yaw values 7int pitch = 0; 8int roll = 0; 9float yaw = 0; 10 11void setup() 12{ 13 Serial.begin(115200); 14 15 Serial.println("Initialize MPU6050"); 16 17 while(!mpu.begin(MPU6050_SCALE_2000DPS, MPU6050_RANGE_2G)) 18 { 19 Serial.println("Could not find a valid MPU6050 sensor, check wiring!"); 20 delay(500); 21 } 22 23 // Calibrate gyroscope. The calibration must be at rest. 24 // If you don't want calibrate, comment this line. 25 mpu.calibrateGyro(); 26 27 // Set threshold sensivty. Default 3. 28 // If you don't want use threshold, comment this line or set 0. 29 mpu.setThreshold(1); 30 31 // Check settings 32 checkSettings(); 33} 34 35void loop() 36{ 37 // Read normalized values 38 Vector normAccel = mpu.readNormalizeAccel(); 39 Vector normGyro = mpu.readNormalizeGyro(); 40 41 // Calculate Pitch & Roll 42 pitch = -(atan2(normAccel.XAxis, sqrt(normAccel.YAxis*normAccel.YAxis + normAccel.ZAxis*normAccel.ZAxis))*180.0)/M_PI; 43 roll = (atan2(normAccel.YAxis, normAccel.ZAxis)*180.0)/M_PI; 44 45 //Ignore the gyro if our angular velocity does not meet our threshold 46 if (normGyro.ZAxis > 1 || normGyro.ZAxis < -1) { 47 normGyro.ZAxis /= 100; 48 yaw += normGyro.ZAxis; 49 } 50 51 //Keep our angle between 0-359 degrees 52 if (yaw < 0) 53 yaw += 360; 54 else if (yaw > 359) 55 yaw -= 360; 56 57 // Output 58 Serial.print("Pitch = "); 59 Serial.print(pitch); 60 Serial.print("\tRoll = "); 61 Serial.print(roll); 62 Serial.print("\tYaw = "); 63 Serial.print(yaw); 64 65 Serial.println(); 66 67 delay(10); 68} 69 70void checkSettings() 71{ 72 Serial.println(); 73 74 Serial.print(" * Sleep Mode: "); 75 Serial.println(mpu.getSleepEnabled() ? "Enabled" : "Disabled"); 76 77 Serial.print(" * Clock Source: "); 78 switch(mpu.getClockSource()) 79 { 80 case MPU6050_CLOCK_KEEP_RESET: Serial.println("Stops the clock and keeps the timing generator in reset"); break; 81 case MPU6050_CLOCK_EXTERNAL_19MHZ: Serial.println("PLL with external 19.2MHz reference"); break; 82 case MPU6050_CLOCK_EXTERNAL_32KHZ: Serial.println("PLL with external 32.768kHz reference"); break; 83 case MPU6050_CLOCK_PLL_ZGYRO: Serial.println("PLL with Z axis gyroscope reference"); break; 84 case MPU6050_CLOCK_PLL_YGYRO: Serial.println("PLL with Y axis gyroscope reference"); break; 85 case MPU6050_CLOCK_PLL_XGYRO: Serial.println("PLL with X axis gyroscope reference"); break; 86 case MPU6050_CLOCK_INTERNAL_8MHZ: Serial.println("Internal 8MHz oscillator"); break; 87 } 88 89 Serial.print(" * Gyroscope: "); 90 switch(mpu.getScale()) 91 { 92 case MPU6050_SCALE_2000DPS: Serial.println("2000 dps"); break; 93 case MPU6050_SCALE_1000DPS: Serial.println("1000 dps"); break; 94 case MPU6050_SCALE_500DPS: Serial.println("500 dps"); break; 95 case MPU6050_SCALE_250DPS: Serial.println("250 dps"); break; 96 } 97 98 Serial.print(" * Gyroscope offsets: "); 99 Serial.print(mpu.getGyroOffsetX()); 100 Serial.print(" / "); 101 Serial.print(mpu.getGyroOffsetY()); 102 Serial.print(" / "); 103 Serial.println(mpu.getGyroOffsetZ()); 104 105 Serial.println(); 106}
補足情報
当方プログラミングに関して初心者なので最低限の知識しか持ち合わせていないと思います.
ソースコード等最低限の情報さえご教授いただければ後は自分で勉強させていただきます.
よろしくお願いします.
*追記
回答3件
あなたの回答
tips
プレビュー