那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

利用Cordic算法來進行姿態解算

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

二. 踩坑分享

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

三. 姿態解算

所謂姿態解算就是通過六軸的數據,來求解物體的三個角度: roll , pitch , yaw。

1. 通過加速度求解

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

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

2. 通過角速度求解

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

3. 融合

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

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

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

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

四. 代碼實現

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

1. 模塊接口

輸入請求,輸出應答和三個角度,角度值擴大了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 數據線*/
);

2. 狀態機

這里使用到了兩個Cordic模塊,第一個模塊先計算出roll和sqrt(acc_y*acc_y + acc_z * acc_z)的值,然后第二個模塊通過acc_x和sqrt(acc_y*acc_y + acc_z * acc_z)的值 計算出 pitch的角度。最后對數據經過了一個簡單的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. 融合

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

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    )
);



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





審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • FPGA
    +關注

    關注

    1630

    文章

    21797

    瀏覽量

    606021
  • CORDIC算法
    +關注

    關注

    0

    文章

    17

    瀏覽量

    9759
  • MPU6050
    +關注

    關注

    39

    文章

    307

    瀏覽量

    71665
  • 姿態解算
    +關注

    關注

    0

    文章

    49

    瀏覽量

    8303

原文標題:FPGA實現MPU6050姿態解算

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

收藏 人收藏

    評論

    相關推薦

    mpu6050姿態問題

    如題,我在用互補濾波和四元數算法mpu6050的角度姿態。但是現在的問題是,一旦我的mpu6050轉動速度一快,輸出的數據就會出現問題。如下圖.前面3欄,分別是xyz的角度。轉動的
    發表于 05-09 18:33

    四軸姿態

    mpu6050姿態,內部DMP輸出。上位機為匿名的上位機。
    發表于 06-14 17:15

    【CANNON申請】姿態

    申請理由:這款開發板的硬件非常適合我現在在做姿態設計,再加上自有的mpu6050 gps,可以用來測試姿態
    發表于 01-26 13:58

    請問MPU6050的軟件姿態和DMP姿態各自的優缺點是什么?

    MPU6050有軟件姿態和DMP姿態,他們各自的優缺點是什么呢?因為大家都知道的是DMP
    發表于 05-29 04:36

    姿態算法和kalman對加速度進行處理的資料分享!

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

    Pixhawk代碼分析-姿態篇A 精選資料推薦

    姿態篇A基本知識1、如何實現控制一個無人機系統的算法主要有兩類:姿態檢測算法
    發表于 08-09 08:09

    MPU6050姿態的原理是什么

    MPU6050姿態的原理是什么?MPU6050姿態的程序該如何去是實現呢?
    發表于 12-17 07:14

    姿態算法模塊理解

    了解或想開發無人機的朋友肯定繞不過姿態這茬,花點時間去了解它們原理并不難,這里提供兩個原理鏈接供大家參考:四元數表示旋轉的理解四旋翼姿態
    發表于 01-11 07:06

    使用MPU9250學習姿態

    最近在使用MPU9250學習姿態,查詢了非常多的網上關于MPU6050和MPU9250的資料,發現內置的DMP可以計算出姿態角,可原代
    發表于 02-10 06:29

    FPGA實現MPU6050姿態

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

    基于Runge-Kutta算法的無人機姿態

    。首先根據前人的研究成果實現姿態角的比卡逼近法,然后引入Runge-Kutta算法,推導出小型無人機姿態角更新的
    發表于 11-02 16:03 ?6次下載
    基于Runge-Kutta<b class='flag-5'>算法</b>的無人機<b class='flag-5'>姿態</b>角<b class='flag-5'>解</b><b class='flag-5'>算</b>

    基于MPU6050的四軸硬件姿態研究

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

    mpu6050姿態原理_mpu6050姿態程序

    mpu6050常用作提供飛控運行時的姿態測量和計算。本文首先介紹了MPU6050姿態的原理,其次詳細的介紹了mpu6050姿態
    的頭像 發表于 03-09 09:15 ?4.4w次閱讀

    如何使用互補濾波器進行四旋翼飛行器的姿態資料說明

    針對小型四旋翼飛行器姿態這一基本問題,詳細分析了姿態的過程,提出了其中的難點問題。應用低
    發表于 04-08 08:00 ?1次下載

    MPU6050使用互補濾波與卡爾曼濾波算法進行姿態

    MPU6050使用互補濾波與卡爾曼濾波算法進行姿態
    發表于 08-07 15:46 ?10次下載
    电脑百家乐的玩法技巧和规则| 新皇冠现金网| 百家乐官网单机游戏免费| 百家乐官网牡丹娱乐城| 威尼斯人娱乐网可信吗| 百家乐官网账号变动原因| 百家乐全程打庄| 大发888真钱游戏娱乐城下载| 百家乐官网娱乐用品| 百家乐有赢钱公式吗| 博彩优惠| 公海百家乐官网的玩法技巧和规则 | 御匾会百家乐官网的玩法技巧和规则 | 百家乐官网澳门有网站吗| 菲律百家乐太阳城| 金赞娱乐城| 蓝盾百家乐官网赌场娱乐网规则| 德州百家乐扑克桌| 百家乐官网网址是多少| 现金百家乐攻略| 百家乐官网技术下载| 千亿百家乐官网的玩法技巧和规则 | 百家乐官网群的微博| 大发888的促销代码| 百家乐官网纸牌赌博| 百家乐赢钱公式论| 百家乐官网翻天快播| 十三张百家乐的玩法技巧和规则| 百家乐官网视频二人雀神| 百家乐真人斗地主| 百家乐官网现金网开户平台| 澳门百家乐网上赌城| 网上百家乐官网赢钱公式| 678百家乐博彩娱乐网| 百家乐官网筹码多少钱| rmb百家乐的玩法技巧和规则| 澳门百家乐官网看路博客| 全讯网vc8888| 乐中百家乐官网的玩法技巧和规则| 娱乐城开户免存送现金| 百家乐什么叫缆|