MPU6050四元数解算求助
我最近在学习MPU6050姿态解算,原始数据通过四元数解算后的数据一直在正常值上下震荡,成正弦波动。我对程序中的Kp,Ki值进行调整,不管怎么调,一直是震荡的。请教大家,这是什么原因造成的?郁闷的很。#include "Wire.h"
#include "I2Cdev.h"
#include "MPU6050.h"
MPU6050 accelgyro;
int16_t ax, ay, az;
int16_t gx, gy, gz;
float accx,accy,accz;
float gyrox,gyroy,gyroz;
float axo=0,ayo=0,azo=0;//加速度计偏移量
float gxo=0,gyo=0,gzo=0;//陀螺仪偏移量
float pi=3.1415926;
float AcceRatio=16384.0;
float GyroRatio=131.0;
float Rad=180.0/pi;
//
//
#define Kp 0.025f//10.0f
#define Ki 0.0f//0.008f
#define halfT 0.001f
float q0=1,q1=0,q2=0,q3=0;
float exInt=0,eyInt=0,ezInt=0;
float Angle_roll,Angle_pitch,Angle_yaw;
void AngleUpdate(float ax,float ay,float az,float gx,float gy,float gz)
{
float norm;
float vx,vy,vz;
float ex,ey,ez;
if (ax*ay*az==0)
return;
norm=sqrt(ax*ax+ay*ay+az*az);
ax=ax/norm;
ay=ay/norm;
az=az/norm;
vx=2*(q1*q3-q0*q2);
vy=2*(q0*q1-q3*q2);
vz=q0*q0-q1*q1-q2*q2+q3*q3;
ex=ay*vz-az*vy;
ey=az*vx-ax*vz;
ez=ax*vy-ay*vx;
exInt=exInt+ex*Ki;
eyInt=eyInt+ey*Ki;
ezInt=ezInt+ez*Ki;
gx=gx+Kp*ex+exInt;
gy=gy+Kp*ey+eyInt;
gz=gz+Kp*ez+ezInt;
q0=q0+(-q1*gx-q2*gy-q3*gz)*halfT;
q1=q1+(q0*gx+q2*gz-q3*gy)*halfT;
q2=q2+(q0*gy-q1*gz+q3*gx)*halfT;
q3=q3+(q0*gz+q1*gy-q2*gx)*halfT;
norm=sqrt(q0*q0+q1*q1+q2*q2+q3*q3);
q0=q0/norm;
q1=q1/norm;
q2=q2/norm;
q3=q3/norm;
Angle_roll=atan2(2*q2*q3+2*q0*q1,-2*q1*q1-2*q2*q2+1)*Rad;
Angle_pitch=asin(-2*q1*q3+2*q0*q2)*Rad;
Angle_yaw=atan2(2*q1*q2+2*q0*q3,-2*q2*q2-2*q3*q3+1)*Rad;
}
void setup()
{
Wire.begin();
Serial.begin(9600);
accelgyro.initialize();
unsigned short times=400;
for(int i=0;i<times;i++)
{
accelgyro.getMotion6(&ax,&ay,&az,&gx,&gy,&gz);
axo += ax; ayo += ay; azo += az; //采样和
gxo += gx; gyo += gy; gzo += gz;
}
axo /= times; ayo /= times; azo /= times; //计算加速度计偏移
gxo /= times; gyo /= times; gzo /= times; //计算陀螺仪偏移
Serial.println("Angle_roll , Angle_pitch , Angle_yaw");
Serial.print(axo);Serial.print(", ");Serial.print(gxo);
}
void loop()
{
accelgyro.getMotion6(&ax,&ay,&az,&gx,&gy,&gz);
accx=(ax-axo)/AcceRatio;
accy=(ay-ayo)/AcceRatio;
accz=(az-azo)/AcceRatio;
gyrox=(ax-gxo)/GyroRatio;
gyroy=(ay-gyo)/GyroRatio;
gyroz=(az-gzo)/GyroRatio;
//Serial.print(accx);Serial.print(",");Serial.print(accy);Serial.print(",");Serial.println(accz);
AngleUpdate(accx,accy,accz,gyrox,gyroy,gyroz);
//Kalman_Filter(Angle_roll,gyrox);
Serial.print(Angle_roll);Serial.print(",");Serial.print(Angle_pitch);Serial.print(",");Serial.println(Angle_yaw);
delay(100);
} 数学算法这块一直啃不下来。帮顶 一起学习,等高手帮我指导一下 LZ解决了么,第44行那里我看了网上好多都是+,LZ那里用的是减号,我改了也没用。。。波动很有规律, 就是不能正常工作。 请问楼主问题解决了么 楼主 我知道你的程序哪里错了 那里应该是GX-GX偏移量 詹波波 发表于 2015-11-13 13:56 static/image/common/back.gif
楼主 我知道你的程序哪里错了 那里应该是GX-GX偏移量
竟然没发现。。。谢谢你,你调出来了吗,我放下好久,今天才又拿起来玩玩,参数不好调
页:
[1]