RM惯性测量单元IMU

news2024/11/13 23:08:27

在Robomaster比赛中,一般各大参赛队会在机器人的云台上搭载IMU,用以反馈云台的yaw轴和pitch轴的角度和角速度。

需要注意的是,尽管依靠云台电机6020的编码器同样可以实现以上数据的获取,但是由于云台控制对于灵敏度和精度的要求比较高,而云台电机编码器反馈的数据分辨率较低,并且速度数据波动较大,用它来做控制并不能够达到很好的效果,所以目前的主流方案依然是通过IMU的数据来做云台的闭环控制。

IMU的选型方案非常多,从几十到几千乃至上万不等。一般IMU内部会包含陀螺仪和加速度计,陀螺仪用来反馈角速度和计算位姿,加速度计用于反馈线速度,陀螺仪和加速度各自提供三个轴向的速度数据,所以一般这种IMU被称为六轴IMU。基于不同原理去制作的陀螺仪和加速度计,能够达到的精度范围也有一定的区别。

但是对于IMU来说,总会有一个难以克服的问题,即累积误差。由于IMU通过是通过对内部的陀螺仪获取的角速度数据对时间进行积分获取角度数据的,无论一个陀螺仪的精度有多高,总是会在每个时刻产生一些误差,随着积分效应,误差逐渐累积,最后就会产生累积误差。

为了解决累积误差问题,一般厂家会在IMU内部再集成一个三轴磁力计,从而构成一个所谓的九轴IMU。磁力计的作用是对IMU计算出的位姿定期进行较准,从而解决累积误差。但是磁力计不适合在电磁环境复杂的场合下使用,如果附近有能够产生强磁场的设备,会对磁力计的数据产生非常大的影响。

可以在下图中看到,比较常用的微机械陀螺仪(MEMS)其累积误差水平大概在每小时10°到100°。但是由于实际上每局比赛时间并没有那么长,所以其实累积误差造成的影响并不是特别严重,没有必要为了过高的精度要求而去购买特别贵的陀螺仪。

关于IMU的选型,不同的队伍有着不同的方案,而且一般来说都经过了若干次的迭代。

IMU选型上的坑很多,其中最严重的问题就是由于各种原因引发的复位/离线问题。在这种情况下,失去反馈的云台会立刻失控,从而发生“疯头”。

以下针对IMU总结一些需要注意的要点

  • 确保供电稳定,如果供电电压有较大的波动可能会引发IMU掉线
  • 确保物理防护,在赛场上的冲撞/弹丸打击可能会造成IMU的移位/掉线
  • 确保陀螺仪量程,如果撞击产生了超出陀螺仪量程的大角速度,可能会引发云台偏移的问题
  • 确保线路连接,保证通信线路电连接良好,尤其是当硬件方案涉及到比较长的走线时
  • IMU会受到温度影响,如果要在冬天时把机器人带到室外,记得采取一定的保温措施(比如加热电阻)

以下是一些防范IMU离线引发严重问题的方案

  • 准备电机闭环方案,检测到IMU离线后可以自动/手动切换成电机编码器反馈
  • 在云台上装载多个IMU,检测到一个离线后将反馈源切换成另一个
  • 采用官方开发板/自研开发板上集成的IMU,相比独立的IMU模块来说风险更小

最后推荐一个讲IMU的知乎专栏,有兴趣的同学可以看一看。https://zhuanlan.zhihu.com/p/41299359

开发板板载IMU

官方提供的开发板自带IMU,用户手册中的介绍如下

如果要使用开发板板载IMU,则必须将开发板固定在云台上可以同时随着yaw轴与pitch轴运动的位置。板载IMU的需要自己完成姿态解算,姿态解算是通过SPI读取MPU6500的寄存器数据后,将三轴加速度计和三轴陀螺仪的数据进行数据融合,解算出当前的位姿,其中为了能够使用矩阵进行快速的运算,需要将欧拉角转换成四元数。

姿态解算的推导涉及到比较复杂的数学过程,这里就不加以太多的介绍了,有兴趣的可以自己去看下面的博客。

姿态解算

  • 姿态解算-CSDN博客

  • mpu6050姿态解算与卡尔曼滤波(1)数学_mpu6050姿态解算与卡尔曼滤波(1)数学-CSDN博客

滤波

  • 姿态估计(1)——互补滤波(Complementary filter )-CSDN博客

四元数

  • 彻底搞懂四元数-CSDN博客

牛顿迭代快速求根

  • 牛顿迭代法快速寻找平方根 | Matrix67: The Aha Moments

官方车代码里面同样有解算的代码,并且有多种算法。下面这段代码是一个禁用了磁力计数据的算法,也是我自己以前移植到自己的工程里进行过测试的,由于当时我发现磁力计读取到的数据干扰很大,于是选择了禁用了磁力计数据的算法,只使用加速度计和陀螺仪进行数据融合。其中invSqrt是运用牛顿迭代法快速求平方根,是用于归一化处理的,官方给的注释在我看来已经已到位了,因此在这里不去加更多的注脚。

void mahony_ahrs_updateIMU(struct ahrs_sensor *sensor, struct attitude *atti)
{
  float recipNorm;
  float halfvx, halfvy, halfvz;
  float halfex, halfey, halfez;
  float qa, qb, qc;

  gx = sensor->wx;
  gy = sensor->wy;
  gz = sensor->wz;
  ax = sensor->ax;
  ay = sensor->ay;
  az = sensor->az;
  mx = sensor->mx;
  my = sensor->my;
  mz = sensor->mz;
  // Compute feedback only if accelerometer measurement valid (avoids NaN in accelerometer normalisation)
  if (!((ax == 0.0f) && (ay == 0.0f) && (az == 0.0f)))
  {

    // Normalise accelerometer measurement
    recipNorm = invSqrt(ax * ax + ay * ay + az * az);
    ax *= recipNorm;
    ay *= recipNorm;
    az *= recipNorm;

    // Estimated direction of gravity and vector perpendicular to magnetic flux
    halfvx = q1 * q3 - q0 * q2;
    halfvy = q0 * q1 + q2 * q3;
    halfvz = q0 * q0 - 0.5f + q3 * q3;

    // Error is sum of cross product between estimated and measured direction of gravity
    halfex = (ay * halfvz - az * halfvy);
    halfey = (az * halfvx - ax * halfvz);
    halfez = (ax * halfvy - ay * halfvx);

    // Compute and apply integral feedback if enabled
    if (twoKi > 0.0f)
    {
      integralFBx += twoKi * halfex * (1.0f / sampleFreq); // integral error scaled by Ki
      integralFBy += twoKi * halfey * (1.0f / sampleFreq);
      integralFBz += twoKi * halfez * (1.0f / sampleFreq);
      gx += integralFBx; // apply integral feedback
      gy += integralFBy;
      gz += integralFBz;
    }
    else
    {
      integralFBx = 0.0f; // prevent integral windup
      integralFBy = 0.0f;
      integralFBz = 0.0f;
    }

    // Apply proportional feedback
    gx += twoKp * halfex;
    gy += twoKp * halfey;
    gz += twoKp * halfez;
  }

  // Integrate rate of change of quaternion
  gx *= (0.5f * (1.0f / sampleFreq)); // pre-multiply common factors
  gy *= (0.5f * (1.0f / sampleFreq));
  gz *= (0.5f * (1.0f / sampleFreq));
  qa = q0;
  qb = q1;
  qc = q2;
  q0 += (-qb * gx - qc * gy - q3 * gz);
  q1 += (qa * gx + qc * gz - q3 * gy);
  q2 += (qa * gy - qb * gz + q3 * gx);
  q3 += (qa * gz + qb * gy - qc * gx);

  // Normalise quaternion
  recipNorm = invSqrt(q0 * q0 + q1 * q1 + q2 * q2 + q3 * q3);
  q0 *= recipNorm;
  q1 *= recipNorm;
  q2 *= recipNorm;
  q3 *= recipNorm;
  atti->roll = atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2 * q2 + 1) * 57.3; // roll     -pi----pi
  atti->pitch = asin(-2 * q1 * q3 + 2 * q0 * q2) * 57.3;                                // pitch    -pi/2----pi/2
  atti->yaw = atan2(2 * q1 * q2 + 2 * q0 * q3, -2 * q2 * q2 - 2 * q3 * q3 + 1) * 57.3;  // yaw      -pi----pi
}

代码解释如下:

1、函数mahony_ahrs_updateIMU接收两个结构体作为参数接收两个结构体作为参数:sensor包含IMU传感器的数据,atti用于存储计算后的姿态角。

2、变量gxgygz是陀螺仪测量的角速度,axayaz是加速度计测量的加速度,mxmymz是磁力计测量的磁场强度。变量twoKptwoKi是算法的控制参数,分别代表比例和积分增益的两倍。变量sampleFreq是传感器数据采样频率。

加速度计数据验证和归一化

函数首先检查加速度计的数据是否有效,避免除以零。

recipNorm是加速度计数据的归一化因子,用于确保加速度向量的长度为1。将归一化因子应用于加速度向量的每个分量,使其成为一个单位向量。

计算姿态误差(计算估计的重力方向向量,这是通过当前姿态四元数 q0q1q2q3 来实现的。)

halfvxhalfvyhalfvz是估计的重力方向向量。halfexhalfeyhalfez是估计的重力方向向量与实际测量的加速度向量的叉乘结果,代表姿态估计的误差。

积分和比例反馈

  • 如果积分增益 twoKi 大于0,将误差的积分反馈加入角速度。
  • 如果积分增益为0,则重置积分反馈,防止积分饱和。

  • 应用比例反馈,将姿态误差乘以比例增益 twoKp 并加到角速度上。

四元数积分和归一化

  • 将角速度乘以一个因子,准备进行四元数的积分更新。

  • 根据角速度更新四元分的每个分量。

  • 四元数归一化,确保其长度为1,表示有效的旋转。

计算姿态角

  • 使用四元数计算俯仰角(pitch)、横滚角(roll)和偏航角(yaw),并将结果从弧度转换为度。

结尾

函数没有返回值,计算结果直接存储在 atti 结构体中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2058569.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信删除的聊天记录怎么恢复?实测有效,3招教您轻松恢复

微信已成为我们传递信息、分享情感的重要桥梁。然而,不小心误删的聊天记录往往让人懊悔不已,尤其是那些珍贵的对话和重要的信息。面对微信删除的聊天记录怎么恢复的问题,很多人都会感到束手无策。 但别担心,无论您是技术小白还是…

单因子年化23.7%,基于deap的因子挖掘,我改进了fitness和metrics方案(附python代码和数据)

原创文章第626篇,专注“AI量化投资、世界运行的规律、个人成长与财富自由"。 我们目前投入使用的因子挖掘,基于两个框架,deap和gplearn,deap做一点点改动,就可以完美应用于多标的截面因子挖掘。而gplearn如果要支…

秋叶SD整合安装包更新了!8月最新版4.9【附下载】

01 SD整合包可以扫描下方,免费获取 02 安装步骤 下载好后解压双击打开即可使用(第一次安装部署时间稍长,等待一会即可) 安装完进入界面后,点击右下角一键启动,稍微等待一会儿就会加载WebUI。 选择大模…

期货模拟交易系统考核选拔系统资管分仓有哪些特点?

分仓账户本身是为了风险管理和资金管理的目的而设立的,‌通过将资金分散到不同的账户中,‌可以降低整体风险,‌避免某个合约的亏损对整个资金造成过大的影响。‌这种分散投资的策略有助于提高交易的安全性。‌然而,‌分仓账户的安…

MySQL 索引合并优化实践

在生产环境的数据库中,经常会看到有些 SQL 的 where 条件包含:普通索引等值 主键范围查询 order by limit。明明走普通索引效率更高,但是选择走了索引合并,本文就对这种索引合并的情况研究一下。 作者:张洛丹&#x…

细数目标管理的坑:避免陷阱,实现高效执行

目标管理作为一种被广泛采用的管理方法,通过明确的目标设定和追踪,提升组织绩效和员工动力。然而,正如任何管理工具一样,目标管理也并非完美无缺,其在实际应用中往往伴随着一系列潜在的“坑”。 一、目标设定&#x…

如何使用DataGear零编码快速制作MQTT物联网实时数据看板

DataGear是一个开源免费的数据可视化分析平台,企业版在开源版基础上开发,新增了诸多企业级特性,包括:MySQL及更多部署数据库支持、MQTT/WebSocket/Redis/MongoDB数据集、OAuth2.0/CAS/JWT/LDAP统一登录支持、前后端敏感信息加密传…

ArcGIS 数据服务在三维 Cesium/SuperMap 项目中使用遇到的一些问题及其解决方法

ArcGIS 数据服务在三维 Cesium/SuperMap 项目中使用遇到的一些问题及其解决方法 一、三维系统支持的 ArcGIS 服务及其投影 1、动态服务 ArcGIS 动态服务的数据,支持任意投影在三维系统中加载。 2、切片服务 ArcGIS 切片服务仅支持 3857(web 墨卡托投影)&#x…

C++ 设计模式(1. 单例模式)

单例模式是一种创建型设计模式, 它的核心思想是保证一个类只有一个实例,并提供一个全局访问点来访问这个实例。 特点 全局访问点的意思是,为了让其他类能够获取到这个唯一实例,该类提供了一个全局访问点(通常是一个静态…

锐特驱动器ECR系列IO输出高电平配置

设置极性:常闭值0 默认输出极性常开,平时高组态或无电平输出,点通工作时输出低电平;常闭平时低电平,工作时输出高电平; 常开常闭概念具体可参考: http://t.csdnimg.cn/TIsW9 设置输出功能&…

如何用Java SpringBoot+Vue搭建校内跑腿业务系统?实战教程解析

✍✍计算机毕业编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java、…

​​​​​​​STM32通过SPI硬件读写W25Q64

目录 STM32通过SPI硬件读写W25Q64 1. STM32的SPI外设简介 2. STM32的SPI框图 2.1 数据寄存器和移位寄存器(左上角部分) 控制逻辑(其余右下角的部分) 3.STM32的SPI基本框图 4. STM32的SPI主模式全双工连续传输 时序图 5. S…

网安新声 | 从微软“狂躁许可”漏洞事件看安全新挑战与应对策略

网安加社区【网安新声】栏目,汇聚网络安全领域的权威专家与资深学者,紧跟当下热点安全事件、剖析前沿技术动态及政策导向,以专业视野和前瞻洞察,引领行业共同探讨并应对新挑战的策略与可行路径。 近期,微软披露了一个最…

AIGC企业知识库系统的全方位应用

在知识爆炸的时代,企业如同航行在浩瀚信息海洋中的巨轮,每一滴知识的浪花都可能成为推动其破浪前行的动力。而 AIGC企业知识库系统可以帮助企业精准捕捞、高效利用这些宝贵资源,不仅重塑了企业知识管理的版图,更引领了一场前所未有…

秋招力扣Hot100刷题总结——回溯

回溯问题通常应用于解决排列组合等问题,需要注意的是回溯函数中的参数、结束条件、遍历开始顺序等。 回溯三部曲: (1)确定递归函数的参数。 (2)确定递归函数的终止条件。 (3)确定单层…

错误:Input string was not in a correct format.

之前写的桌面端,在国内客户电脑运行着没问题,到欧洲国家电脑上就挂掉了 原因:TM 小数点不是. 而是, 是逗号,不明觉厉 解决办法: 1、更改客户电脑配置 这里把逗号改成.就行了 但是这种办法比较笨,总不能…

视频检索技术为电子商务直播领域带来了前所未有的革新

视频检测在这个场景中指的是通过视频流实时识别和检索直播中销售人员展示的商品。这涉及到从连续的视频帧中分析和识别商品的视觉内容,通常与语音和文本数据结合,以提高识别准确性。 技术原理 文本引导的注意机制:这一机制通过直播中销售人员…

初始redis:List

列表 List 相当于数组或者顺序表。 对于List来说,两侧都可以插入和删除,时间复杂度是O(1)。 有很多的操作,比如 llen 可以获取List的长度,lrem 可以删除元素 ,lrange可以去一个字符串 , lindex可以根据下标…

MBR20100FCT-ASEMI无人机专用MBR20100FCT

编辑:ll MBR20100FCT-ASEMI无人机专用MBR20100FCT 型号:MBR20100FCT 品牌:ASEMI 封装:TO-220F 批号:最新 恢复时间:35ns 最大平均正向电流(IF):20A 最大循环峰值…

Leetcode344. 反转字符串(双指针-对撞)

题目描述: 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 示例: 示例 1: 输…