0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

利用Cordic算法來進(jìn)行姿態(tài)解算

FPGA研究院 ? 來源:FPGA之旅 ? 2023-07-04 09:15 ? 次閱讀

二. 踩坑分享

在進(jìn)行姿態(tài)解算分享之前,先分享一個踩坑經(jīng)歷。一般來說MPU6050的ID讀出為0x68,淘寶上買到的模塊,基本上都是這個。但是我使用的是自己畫的PCB,手動焊接的,在讀取ID的時候,一直為0x98,但是認(rèn)知中要為0x68才是對的,這個時候就會懷疑是不是自己的程序或者焊接的問題了。但好在后面讀取六軸數(shù)據(jù),姿態(tài)解算后得到的角度基本是正確的(折騰了一天了,才發(fā)現(xiàn))。這是個坑,大家可以注意一下。

三. 姿態(tài)解算

所謂姿態(tài)解算就是通過六軸的數(shù)據(jù),來求解物體的三個角度: roll , pitch , yaw。

1. 通過加速度求解

先看一下加速度求解角度的表達(dá)式(通過加速度是無法求解yaw的)。atan(acc_y / acc_x)和sqrt(acc_y*acc_y + acc_z * acc_z)不就是上篇中Cordic算法求解的值嗎,都不需要使用的其他的計(jì)算。

roll = atan(acc_y / acc_x);
pitch = atan(acc_x / (sqrt(acc_y*acc_y + acc_z * acc_z)));

2. 通過角速度求解

通過角速度的求解就更簡單了,只需要將當(dāng)前角度加上(角速度×dt)就可以。角速度求解的時候會有些問題,在靜態(tài)的時候,角速度會有零漂,這個時候角度誤差會越來越大。

3. 融合

可以看到有上面的兩種方法求解角度,可以單獨(dú)使用,但是可能會不太準(zhǔn)確,精度要求不高的場合可以只使用加速度求解。在精度要求比較高的場合下,需要使用這兩種方法求解,然后再將求得的結(jié)果進(jìn)行融合。常用的方法有: 卡爾曼濾波、一階互補(bǔ)濾波、二階互補(bǔ)濾波。

一階互補(bǔ)濾波,如下,簡單粗暴。要想濾波效果好的話,可以試試卡爾曼濾波。

roll = a * acc_roll + (1 - a) *gyro_roll;

以上只是一種比較常規(guī)的求解方法,追求高精度的話,可以使用四元數(shù)的方法進(jìn)行求解(復(fù)雜度大大增加)。

四. 代碼實(shí)現(xiàn)

代碼都是現(xiàn)成的,在之前的文章中已經(jīng)寫好了,這里做的工作就是將這些模塊組合在一起。

1. 模塊接口

輸入請求,輸出應(yīng)答和三個角度,角度值擴(kuò)大了2^16倍。

module IMU(
  input            clk,    //27M
  input            rst_n,


  input            imu_req,
  output           imu_ack,


  output signed[31:0]     roll,
  output signed[31:0]     pitch,
  output signed[31:0]     yaw,


  output           IICSCL,       /*IIC 時鐘輸出*/
  inout            IICSDA       /*IIC 數(shù)據(jù)線*/
);

2. 狀態(tài)機(jī)

這里使用到了兩個Cordic模塊,第一個模塊先計(jì)算出roll和sqrt(acc_y*acc_y + acc_z * acc_z)的值,然后第二個模塊通過acc_x和sqrt(acc_y*acc_y + acc_z * acc_z)的值 計(jì)算出 pitch的角度。最后對數(shù)據(jù)經(jīng)過了一個簡單的FIR濾波。

always@(*) begin
  case(state)
  S_IDLE:
    if( imu_req == 1'b1)
      next_state <= S_READ_MPU6050;
 ? ? ? else
 ? ? ? ? ? next_state <= S_IDLE;
 ? S_READ_MPU6050:
 ? ? ? if( mpu6050_ack == 1'b1 )
 ? ? ? ? ? next_state <= S_Cordic;
 ? ? ? else
 ? ? ? ? ? next_state <= S_READ_MPU6050;
 ? S_Cordic:
 ? ? ? if( cordic_ack == 1'b1)
 ? ? ? ? ? next_state <= S_Cordic2;
 ? ? ? else
 ? ? ? ? ? next_state <= S_Cordic;
 ? S_Cordic2:
 ? ? ? if( cordic2_ack == 1'b1)
 ? ? ? ? ? next_state <= S_FILTER;
 ? ? ? else
 ? ? ? ? ? next_state <= S_Cordic2;
 ? S_FILTER:
 ? ? ? if( fir_filter_ack == 1'b1)
 ? ? ? ? ? next_state <= S_ACK;
 ? ? ? else
 ? ? ? ? ? next_state <= S_FILTER;
 ? S_ACK:
 ? ? ? next_state <= S_IDLE;
 ? default: ? ? next_state <= S_IDLE;
 ? endcase
end

3. 融合

這里的融合,暫時沒有做,只對加速度求解的角度進(jìn)行了一個濾波處理,后面會根據(jù)需要再進(jìn)行更新。

FIR_Filter FIR_Filter_HP(


  .clk            (      clk       ),
  .rst_n           (      rst_n      ),


  .fir_filter_req       (      fir_filter_req ),
  .fir_filter_ack       (      fir_filter_ack ),


  .filter_data_in       (      theta      ),
  .filter_data_out      (      acc_roll    )
);




FIR_Filter FIR_Filter_HP2(


  .clk            (      clk       ),
  .rst_n           (      rst_n      ),


  .fir_filter_req       (      fir_filter_req ),
  .fir_filter_ack       (              ),


  .filter_data_in       (      theta2      ),
  .filter_data_out      (      acc_pitch    )
);



模塊已上板測試,解算出來的角度沒有問題(可能精度不是那么完美,濾波與融合那里需要下點(diǎn)功夫)。





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1620

    文章

    21510

    瀏覽量

    598871
  • CORDIC算法
    +關(guān)注

    關(guān)注

    0

    文章

    17

    瀏覽量

    9708
  • MPU6050
    +關(guān)注

    關(guān)注

    38

    文章

    307

    瀏覽量

    70644
  • 姿態(tài)解算
    +關(guān)注

    關(guān)注

    0

    文章

    49

    瀏覽量

    8218

原文標(biāo)題:FPGA實(shí)現(xiàn)MPU6050姿態(tài)解算

文章出處:【微信號:FPGA研究院,微信公眾號:FPGA研究院】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    mpu6050姿態(tài)問題

    如題,我在用互補(bǔ)濾波和四元數(shù)算法mpu6050的角度姿態(tài)。但是現(xiàn)在的問題是,一旦我的mpu6050轉(zhuǎn)動速度一快,輸出的數(shù)據(jù)就會出現(xiàn)問題。如下圖.前面3欄,分別是xyz的角度。轉(zhuǎn)動的
    發(fā)表于 05-09 18:33

    四軸姿態(tài)

    mpu6050姿態(tài),內(nèi)部DMP輸出。上位機(jī)為匿名的上位機(jī)。
    發(fā)表于 06-14 17:15

    【CANNON申請】姿態(tài)

    申請理由:這款開發(fā)板的硬件非常適合我現(xiàn)在在做姿態(tài)設(shè)計(jì),再加上自有的mpu6050 gps,可以用來測試姿態(tài)
    發(fā)表于 01-26 13:58

    請問MPU6050的軟件姿態(tài)和DMP姿態(tài)各自的優(yōu)缺點(diǎn)是什么?

    MPU6050有軟件姿態(tài)和DMP姿態(tài),他們各自的優(yōu)缺點(diǎn)是什么呢?因?yàn)榇蠹叶贾赖氖荄MP
    發(fā)表于 05-29 04:36

    姿態(tài)算法和kalman對加速度進(jìn)行處理的資料分享!

    分享一波資料,姿態(tài)算法和kalman對加速度進(jìn)行處理的,效果都試過還行,源碼可直接使用程序源碼.rar (3.56 KB )
    發(fā)表于 07-31 04:36

    Pixhawk代碼分析-姿態(tài)篇A 精選資料推薦

    姿態(tài)篇A基本知識1、如何實(shí)現(xiàn)控制一個無人機(jī)系統(tǒng)的算法主要有兩類:姿態(tài)檢測算法、
    發(fā)表于 08-09 08:09

    MPU6050姿態(tài)的原理是什么

    MPU6050姿態(tài)的原理是什么?MPU6050姿態(tài)的程序該如何去是實(shí)現(xiàn)呢?
    發(fā)表于 12-17 07:14

    姿態(tài)算法模塊理解

    了解或想開發(fā)無人機(jī)的朋友肯定繞不過姿態(tài)這茬,花點(diǎn)時間去了解它們原理并不難,這里提供兩個原理鏈接供大家參考:四元數(shù)表示旋轉(zhuǎn)的理解四旋翼姿態(tài)
    發(fā)表于 01-11 07:06

    使用MPU9250學(xué)習(xí)姿態(tài)

    最近在使用MPU9250學(xué)習(xí)姿態(tài),查詢了非常多的網(wǎng)上關(guān)于MPU6050和MPU9250的資料,發(fā)現(xiàn)內(nèi)置的DMP可以計(jì)算出姿態(tài)角,可原代
    發(fā)表于 02-10 06:29

    FPGA實(shí)現(xiàn)MPU6050姿態(tài)

    一. 簡介 在之前的文章中(很久之前了,已經(jīng)通過FPGA獲取到了MPU6050的六軸數(shù)據(jù): 三軸加速 和 三軸角速度,但是沒有對它進(jìn)行然后處理。那么在本篇文章中,將利用Cordic算法
    發(fā)表于 06-08 13:49

    基于Runge-Kutta算法的無人機(jī)姿態(tài)

    。首先根據(jù)前人的研究成果實(shí)現(xiàn)姿態(tài)角的比卡逼近法,然后引入Runge-Kutta算法,推導(dǎo)出小型無人機(jī)姿態(tài)角更新的
    發(fā)表于 11-02 16:03 ?6次下載
    基于Runge-Kutta<b class='flag-5'>算法</b>的無人機(jī)<b class='flag-5'>姿態(tài)</b>角<b class='flag-5'>解</b><b class='flag-5'>算</b>

    基于MPU6050的四軸硬件姿態(tài)研究

    針對四軸飛行器姿態(tài)信息的實(shí)時準(zhǔn)確獲取問題,對四軸飛行器的姿態(tài)方面進(jìn)行了研究。在分析姿態(tài)表示的
    發(fā)表于 03-08 09:19 ?7次下載
    基于MPU6050的四軸硬件<b class='flag-5'>姿態(tài)</b><b class='flag-5'>解</b><b class='flag-5'>算</b>研究

    mpu6050姿態(tài)原理_mpu6050姿態(tài)程序

    mpu6050常用作提供飛控運(yùn)行時的姿態(tài)測量和計(jì)算。本文首先介紹了MPU6050姿態(tài)的原理,其次詳細(xì)的介紹了mpu6050姿態(tài)
    的頭像 發(fā)表于 03-09 09:15 ?4.3w次閱讀

    如何使用互補(bǔ)濾波器進(jìn)行四旋翼飛行器的姿態(tài)資料說明

    針對小型四旋翼飛行器姿態(tài)這一基本問題,詳細(xì)分析了姿態(tài)的過程,提出了其中的難點(diǎn)問題。應(yīng)用低
    發(fā)表于 04-08 08:00 ?1次下載

    MPU6050使用互補(bǔ)濾波與卡爾曼濾波算法進(jìn)行姿態(tài)

    MPU6050使用互補(bǔ)濾波與卡爾曼濾波算法進(jìn)行姿態(tài)
    發(fā)表于 08-07 15:46 ?10次下載