4666|3

190

帖子

10

TA的资源

一粒金砂(中级)

楼主
 

【KW41Z】FXOS8700CQ (3D加速度计+3D磁力计) 融合算法 [复制链接]

【KW41Z】FXOS8700CQ  (3D加速度计+3D磁力计)
https://bbs.eeworld.com.cn/forum ... 1318&fromuid=194541
(出处: 电子工程世界-论坛)

有一定的认识,这里主要是讲解融合算法
欧拉角是存在万向锁的问题,所以引入了Roll Pitch Yaw ,其相关的定义如下:




再看芯片

刚好是一个方向的,所以不用取反。

对应的推导结果公式如下:
Roll :

Pitch :
.
Yaw:



相关代码
  1. /* Read sensor data */
  2.             Sensor_ReadData(&g_Ax_Raw, &g_Ay_Raw, &g_Az_Raw, &g_Mx_Raw, &g_My_Raw, &g_Mz_Raw);

  3.             /* Average accel value */
  4.             for (i = 1; i < MAX_ACCEL_AVG_COUNT; i++)
  5.             {   //缓冲区
  6.                 g_Ax_buff[i] = g_Ax_buff[i - 1];
  7.                 g_Ay_buff[i] = g_Ay_buff[i - 1];
  8.                 g_Az_buff[i] = g_Az_buff[i - 1];
  9.             }

  10.             g_Ax_buff[0] = g_Ax_Raw; //最新的数据
  11.             g_Ay_buff[0] = g_Ay_Raw;
  12.             g_Az_buff[0] = g_Az_Raw;

  13.             for (i = 0; i < MAX_ACCEL_AVG_COUNT; i++) //求平均值
  14.             {
  15.                 g_Ax += (double)g_Ax_buff[i];
  16.                 g_Ay += (double)g_Ay_buff[i];
  17.                 g_Az += (double)g_Az_buff[i];
  18.             }

  19.             g_Ax /= MAX_ACCEL_AVG_COUNT;
  20.             g_Ay /= MAX_ACCEL_AVG_COUNT;
  21.             g_Az /= MAX_ACCEL_AVG_COUNT;

  22.             if(g_FirstRun)
  23.             {
  24.                 g_Mx_LP = g_Mx_Raw;
  25.                 g_My_LP = g_My_Raw;
  26.                 g_Mz_LP = g_Mz_Raw;
  27.             }

  28.             g_Mx_LP += ((double)g_Mx_Raw - g_Mx_LP) * 0.01;  //低通滤波
  29.             g_My_LP += ((double)g_My_Raw - g_My_LP) * 0.01;
  30.             g_Mz_LP += ((double)g_Mz_Raw - g_Mz_LP) * 0.01;

  31.             /* Calculate magnetometer values 减去偏差*/
  32.             g_Mx = g_Mx_LP - g_Mx_Offset;
  33.             g_My = g_My_LP - g_My_Offset;
  34.             g_Mz = g_Mz_LP - g_Mz_Offset;

  35.             /* Calculate roll angle g_Roll (-180deg, 180deg) and sin, cos */
  36.             g_Roll = atan2(g_Ay, g_Az) * RadToDeg;
  37.             sinAngle = sin(g_Roll * DegToRad);
  38.             cosAngle = cos(g_Roll * DegToRad);

  39.             /* De-rotate by roll angle g_Roll */
  40.             By = g_My * cosAngle - g_Mz * sinAngle;
  41.             g_Mz = g_Mz * cosAngle + g_My * sinAngle;
  42.             g_Az = g_Ay * sinAngle + g_Az * cosAngle;

  43.             /* Calculate pitch angle g_Pitch (-90deg, 90deg) and sin, cos*/
  44.             g_Pitch = atan2(-g_Ax , g_Az) * RadToDeg;
  45.             sinAngle = sin(g_Pitch * DegToRad);
  46.             cosAngle = cos(g_Pitch * DegToRad);

  47.             /* De-rotate by pitch angle g_Pitch */
  48.             Bx = g_Mx * cosAngle + g_Mz * sinAngle;

  49.             /* Calculate yaw = ecompass angle psi (-180deg, 180deg) */
  50.             g_Yaw = atan2(-By, Bx) * RadToDeg;
  51.             if(g_FirstRun)
  52.             {
  53.                 g_Yaw_LP = g_Yaw;
  54.                 g_FirstRun = false;
  55.             }

  56.             g_Yaw_LP += (g_Yaw - g_Yaw_LP) * 0.01;//低通滤波
复制代码












此帖出自NXP MCU论坛

最新回复

楼主,你好,能发一些融合算法的研究资料给我吗?875640457@qq.com。谢谢!  详情 回复 发表于 2017-11-16 17:50
点赞 关注
 

回复
举报

2

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
楼主,你这个不用进行椭球拟合校准吗?这样的数据测出来准确?
此帖出自NXP MCU论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
楼主,你好。g_Mx_Offset,RadToDeg,DegToRad这几个值怎么取呢?
此帖出自NXP MCU论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

4
 
楼主,你好,能发一些融合算法的研究资料给我吗?875640457@qq.com。谢谢!
此帖出自NXP MCU论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表