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
    +关注

    关注

    1602

    文章

    21320

    浏览量

    593194
  • CORDIC算法
    +关注

    关注

    0

    文章

    17

    浏览量

    9696
  • MPU6050
    +关注

    关注

    38

    文章

    304

    浏览量

    69845
  • 姿态解算
    +关注

    关注

    0

    文章

    48

    浏览量

    8191

原文标题:FPGA实现MPU6050姿态解算

文章出处:【微信号:FPGA研究院,微信公众号:FPGA研究院】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    【先楫HPM5361EVK开发板试用体验】06-基于MPU9250的姿态

    姿态信息,因此需要进行姿态以获取设备的准确姿态姿态
    发表于 01-17 14:55

    mpu6050姿态问题

    如题,我在用互补滤波和四元数算法mpu6050的角度姿态。但是现在的问题是,一旦我的mpu6050转动速度一快,输出的数据就会出现问题。如下图.前面3栏,分别是xyz的角度。转动的
    发表于 05-09 18:33

    四轴姿态

    mpu6050姿态,内部DMP输出。上位机为匿名的上位机。
    发表于 06-14 17:15

    【CANNON申请】姿态

    申请理由:這款开发板的硬件非常适合我现在在做姿态设计,再加上自有的mpu6050 gps,可以用来测试姿态
    发表于 01-26 13:58

    请问四轴的姿态算法有哪些?

    好不容易弄了一个四元数的四轴程序,但是四轴总会有抖动,想问问有没有好的姿态算法
    发表于 04-11 06:36

    请问MPU6050的软件姿态和DMP姿态各自的优缺点是什么?

    MPU6050有软件姿态和DMP姿态,他们各自的优缺点是什么呢?因为大家都知道的是DMP
    发表于 05-29 04:36

    四轴飞行器姿态部分程序总结

    新手写的姿态部分的算法总结,那个所谓的pi滤波好像是互补滤波推出来的啊。。。。现在也不知道怎么的。。还有小四轴的电机驱动一定要用nmo
    发表于 07-18 16:11

    姿态算法和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

    使用MPU6050硬件DMP姿态

    姿态方法设坐标系绕旋转α角后得到坐标系,在空间中有一个矢量在坐标系中的投影为,在内的投影为由于旋转绕进行,所以Z坐标未变,即有。转换成矩阵形式表示为:即 所以从旋转到可以写成上面仅仅是绕一根轴的旋转,如果三维空间中的欧拉角旋转要转三次:MPU6050的四元数
    发表于 02-10 06:20

    MPU6050姿态融合的相关资料推荐

    mpu6050是一个六轴传感器包括三轴陀螺仪和三轴加速度,分别可以测得三轴的角速度、加速度。但是一般传感器的原始数据都不能直接直接拿来用,都需要滤波和姿态融合。对于初学者来说卡尔曼滤波和姿
    发表于 02-10 06:25

    使用MPU9250学习姿态

    最近在使用MPU9250学习姿态,查询了非常多的网上关于MPU6050和MPU9250的资料,发现内置的DMP可以计算出姿态角,可原代
    发表于 02-10 06:29

    FPGA实现MPU6050姿态

    一. 简介 在之前的文章中(很久之前了,已经通过FPGA获取到了MPU6050的六轴数据: 三轴加速 和 三轴角速度,但是没有对它进行然后处理。那么在本篇文章中,将利用Cordic算法
    发表于 06-08 13:49