KitSprout/SmartIMU

MPU9250磁力計品質

shengwen-tw opened this issue · 7 comments

你好,
您好
我是Moonbear的一員,

近期想要自己實作一個簡單的AHRS程式,
因此拿了上學期修課時所用的板子開始做(2.0)

我近期閱讀了一下您過去的程式碼發現,
舊的2.0的程式在AHRS是有解出磁力Yaw姿態但卻選擇不融合回去,
估計是因為精度的問題

那麼關於磁力計的部份目前已知MPU9150內建的磁力計似乎會有漂移現象,
因此想要在此請教您有關於2.2版改用9250的效果如何呢

感謝
聖文

Hi 聖文 @shengwen1997

QFC 2.0 飛控版本最後的更新應該是這個 2014.01.23 Commit - 6b3d1668f50d4b16774aef3b2704a975c109c289

最後版本是有加入互補濾波做融合的,馬達轉動影響不大,
整體影響較大主要是初始校正的方法,磁力計處理設計如下圖。

另外不知道你說的飄移現象是指甚麼?誤差逐漸變大嗎?
基本上電子羅盤做好校正,剩下的誤差來源大部分都來自於環境因素,
不太可能會像陀螺儀積分一樣,累積誤差。

MPU9250 的電子羅盤部分目前僅讀出 Device ID 而已,還沒有實際拿來做應用。

// QCopterFC_ahrs.c

...

static float AngZ_Temp = 0.0f;

...

Quaternion_ToAngE(&NumQ, &AngE);

tempX = ( Mag.X*arm_cos_f32(Mag.EllipseSita)+Mag.Y*arm_sin_f32(Mag.EllipseSita))/Mag.EllipseB;
tempY = (-Mag.X*arm_sin_f32(Mag.EllipseSita)+Mag.Y*arm_cos_f32(Mag.EllipseSita))/Mag.EllipseA;

AngE.Pitch = toDeg(AngE.Pitch);
AngE.Roll = toDeg(AngE.Roll);
AngE.Yaw = toDeg(AngE.Yaw)+180.0f;

/* 互補濾波 Complementary Filter */
#define CF_A 0.9f
#define CF_B 0.1f
AngZ_Temp = AngZ_Temp + GyrZ*SampleRate;
AngZ_Temp = CF_A*AngZ_Temp + CF_B*AngE.Yaw;

...

使用時間進行調整到最後會極偏於使用加速規,那幾乎等於不使用陀螺儀了,
對於四軸來說似乎不是個好方法?

我有推算過,
若tau取0.49的話,
大約30秒至1分鐘左右陀螺儀比重會下降到百分之一以下

@shengwen1997
不是很懂你的敘述,"使用時間進行調整"和"大約30秒至1分鐘左右"的意思?

@shengwen1997
或許可以把你推算的過程貼上來。

上面的那張圖片跟此篇文章解釋的東西似乎是一致的
http://feichashao.com/balance_filter/#i-9

聖文

@shengwen1997
互補濾波部分是參考該篇文章,所以上面自己畫的圖與文章講的本質上是相同的,
差別只在於用電子羅盤實現和配合我所撰寫的程式而已,
有興趣看原文可以自行 google Shane Colton 撰寫的 "The Balance Filter"