从BNO055传感器获取IMU数据-1

news2024/11/19 7:48:39

最近学习惯导相关知识,BNO055是博世的绝对方向传感器,它结合了传感器数据和微处理器来过滤和组合数据,为用户提供空间中的绝对方向。

关于BNO055传感器

BNO055使用三个三轴传感器同时测量切向加速度(通过加速度计),旋转加速度(通过陀螺仪)和局部磁场强度(通过磁力计)。然后,可以将数据发送到外部微处理器,或使用运行专有融合算法的M0+微处理器在传感器内部进行分析。然后,用户可以选择以各种格式从传感器请求数据。

该芯片还具有中断功能,可以在发生某些运动(方向变化、突然加速等)时通知主机微控制器。

框图

传感器必须在使用前进行校准,读寄存器保存当前的校准状态。校准后,校准偏移可以写入传感器,然后传感器在下次通电时立即可以使用。

观看下面的视频,了解如何校准传感器。

Bosch Sensortec Tutorials:校准absolute orientation sensor BNO055

主机微控制器可以在非融合模式下从传感器(加速度计、陀螺仪和/或磁力计)请求任何或所有数据,并且可以在融合模式下请求绝对和相对方向(角度或四元数)。

传感器可以返回以 m / s 2 m/s^2 m/s2 或 mg ( 1 m g = 9.81 × 1 0 − 3 m / s 2 1mg = 9.81 \times 10^{-3} m/s^2 1mg=9.81×103m/s2); 磁场强度(mT);陀螺仪数据以度或弧度每秒为单位(分别为 DPS 和 RPS),以度或弧度为单位的欧拉角或四元数; 和以°C或°F为单位的温度。所有选项均在unit_selection寄存器中设置(数据表中的表 3-11,PDF 第 30 页)。

欧拉角 vs 四元数

如果要为运动范围有限的系统设计传感器解决方案,则可以使用欧拉角。但是,如果您正在设计一种可以在空间中定位任何地方的传感器,则应使用四元数。

欧拉角

欧拉角允许围绕垂直轴旋转三次的对象(x-y-x、x-z-x、y-x-y、y-z-y、z-x-z、z-y-z、x-y-z、x-z-y、y-x-z、y-z-x、y-z-x、z-x-y、z-y-x)的物体的简单可视化。

欧拉角示例

只要轴至少部分垂直,它们就足够了。但是,当轴旋转时,存在一个角度,其中两个轴可以描述相同的旋转 - 产生称为万向节锁定的条件。当万向节锁定发生时,如果没有外部参考,就不可能重新定向。

此动画有三个万向节(显示为红色、绿色和蓝色实心圆柱段)以及可用的旋转(显示为红色、绿色和蓝色透明球面月亮)。当内部绿色云台平面与红色云台平面对齐时,红蓝云台旋转轴重叠,云台锁定发生(浅黄色背景表示)。

使用四元数时不存在云台锁定的问题。

四元数

四元数是由威廉·汉密尔顿于1843年发明的,作为乘除三个数字的一种方式。几十年来,它们慢慢失宠,并在核时代看到了复兴,并再次通过现代计算机图形编程进行了振兴。四元数由四个数字组成:一个标量和一个三分量向量。

四元数

其中 w、x、y 和 z 都是实数,i、j 和 k 是四元数单位。

通常,w、x、y 和 z 保持在 -1 和 1 之间的范围内,并且 w 2 + x 2 + y 2 + z 2 = 1 \sqrt{w^2+x^2+y^2+z^2}=1 w2+x2+y2+z2 =1

这四个数字在一次旋转中简洁地重新定向矢量,无论长度是否发生变化。

蓝色和红色矢量的单位长度。橙色是将蓝色矢量旋转为红色矢量所需的旋转。

正态变换矩阵由九个数字组成,涉及三角函数的应用。四元数由四个数字组成,全部小于或等于 1。可以将四元数转换为正交变换矩阵,但由于与万向锁相关的数学性质,从旋转矩阵转换为四元数稍微困难一些。

将四元数转换为 3x3 正交旋转矩阵的方法。

下面的代码片段演示了如何创建 3×3 变换矩阵以及四元数的横滚角、俯仰角和偏航角。

/* Create Rotation Matrix rm from Quaternion */
double rm[3][3];

rm[1][1] = quat.w()*quat.w() + quat.x()*quat.x() - quat.y()*quat.y() - quat.z()*quat.z();   
rm[1][2] = 2*quat.x()*quat.y() - 2*quat.w()*quat.z();            
rm[1][3] = 2*quat.x()*quat.z() + 2*quat.w()*quat.y();
rm[2][1] = 2*quat.x()*quat.y() + 2*quat.w()*quat.z();       
rm[2][2] = quat.w()*quat.w() - quat.x()*quat.x() + quat.y()*quat.y() - quat.z()*quat.z();          
rm[2][3] = 2*quat.y()*quat.z() - 2*quat.w()*quat.x();     
rm[3][1] = 2*quat.x()*quat.z() - 2*quat.w()*quat.y();       
rm[3][2] = 2*quat.y()*quat.z() + 2*quat.w()*quat.x();            
rm[3][3] = quat.w()*quat.w() - quat.x()*quat.x() - quat.y()*quat.y() + quat.z()*quat.z();

/* Display Rotation Matrix */
Serial.print(rm[1][1],5);Serial.print("  \t");
Serial.print(rm[1][2],5);Serial.print("  \t");
Serial.println(rm[1][3],5);
Serial.print(rm[2][1],5);Serial.print("  \t");
Serial.print(rm[2][2],5);Serial.print("  \t");
Serial.println(rm[2][3],5);
Serial.print(rm[3][1],5);Serial.print("  \t");
Serial.print(rm[3][2],5);Serial.print("  \t");
Serial.println(rm[3][3],5);

/* Create Roll Pitch Yaw Angles from Quaternions */
double yy = quat.y() * quat.y(); // 2 Uses below

double roll = atan2(2 * (quat.w() * quat.x() + quat.y() * quat.z()), 1 - 2*(quat.x() * quat.x() + yy));
double pitch = asin(2 * quat.w() * quat.y() - quat.x() * quat.z());
double yaw = atan2(2 * (quat.w() * quat.z() + quat.x() * quat.y()), 1 - 2*(yy+quat.z() * quat.z()));

/*  Convert Radians to Degrees */
float rollDeg  = 57.2958 * roll;
float pitchDeg = 57.2958 * pitch;
float yawDeg   = 57.2958 * yaw;

/*  Display Roll, Pitch, and Yaw in Radians and Degrees*/
Serial.print("Roll:");  Serial.print(roll,5);  Serial.print(" Radians \t"); Serial.print(rollDeg,2);  Serial.println(" Degrees");
Serial.print("Pitch:"); Serial.print(pitch,5); Serial.print(" Radians \t"); Serial.print(pitchDeg,2); Serial.println(" Degrees");
Serial.print("Yaw:");   Serial.print(yaw,5);   Serial.print(" Radians \t"); Serial.print(yawDeg,2);   Serial.println(" Degrees");

今天有些困了,明天继续。。。

公众号 | FunIO
微信搜一搜 “funio”,发现更多精彩内容。
个人博客 | blog.boringhex.top

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

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

相关文章

【认知提升思维篇】之心灵之力的自我认可模式

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:普本…

深入浅出vite(一)--vite的优点及原理、性能优化

Vite 需要 Node.js 版本 14.18,16。然而,有些模板需要依赖更高的 Node 版本才能正常运行,当你的包管理器发出警告时,请注意升级你的 Node 版本。 背景 webpack支持多种模块化,将不同模块的依赖关系构建成依赖图来进行…

DevExpress WinForms功能区组件,让业务应用创建更轻松!(下)

DevExpress WinForms的Ribbon(功能区)组件灵感来自于Microsoft Office,并针对WinForms开发人员进行了优化,它可以帮助开发者轻松地模拟当今最流行的商业生产应用程序。 在上文中(点击这里回顾>>)&am…

Axure教程—中继器菜单

本文将教大家如何用AXURE中的中继器制作菜单(不自动折叠其他菜单) 一、效果 预览地址:https://8ao8gl.axshare.com 二、功能 1、点击菜单出现相应的子菜单 2、子菜单如果想折叠,点击相应的菜单 三、制作 (1&#xff…

Java-@Transactional注解超详细

本文已收录于专栏 《Java》 目录 本文前言概念说明使用说明底层实现注意事项注解扩展总结提升 本文前言 Transactional注解是Spring框架中用于声明式事务管理的关键注解。本文将深入探讨Transactional注解的作用、使用方式和常见属性,并结合代码实例演示其在实际项目…

Adobe PS 2023、Adobe Photoshop 2023下载教程、安装教程

最后附下载地址 Adobe Photoshop 简介: Adobe Photoshop是一款广泛使用的图像处理软件,由Adobe公司开发。它提供了许多强大的工具和功能,可以用于图像编辑、合成、修饰、设计等各个领域。用户可以使用Photoshop来调整图像的亮度、对比度、色…

《水经注地图服务》如何快速发布墨卡托DAT缓存

《水经注地图服务》的快速发布功能是一个能够帮助用户实现快速发布地图服务的功能,并且提供常规情况下大多数用户所需的默认配置,让用户在发布地图时更加便捷。 前面为大家分享了《水经注地图服务》快速发布经纬度DAT缓存以及如何在水经微图中加载&…

项目管理甘特图,怎么做才能更高效?(附甘特图详细制作教程和模板)

如何制作项目管理的甘特图?给大家放几个模板感受下: 01 项目管理Excel套表 02 工程项目流程甘特图 03 项目进度横道图 04 生产制造排程规划图 05 项目日程表 06 项目进度计划表 甘特图制作教程,一共两种方法,大家按需选择&#x…

android注入so或者dex

本程序分为32位和64位,以及so中加载apk(或者dex都可以)。 代码地址:点击下载 (一)so注入 32位和64位so注入代码几乎相同,因此仅以32位为例说明so注入的过程。 arm64-v8a架构可以兼容armeabi…

SLF4J门面日志框架源码探索 | 京东云技术团队

1 SLF4J介绍 SLF4J即Simple Logging Facade for Java,它提供了Java中所有日志框架的简单外观或抽象。因此,它使用户能够使用单个依赖项处理任何日志框架,例如:Log4j,Logback和JUL(java.util.logging)。通过在类路径中…

单片机Hard fault 产生原因和错误跟踪的方法

一、单片机 Hard fault产生的原因 Hard fault产生的原因有两方面,硬件方面和软件方面。 ①硬件方面常见原因: 电源设计有错误,造成器件供电不稳; 电源质量不好,纹波,噪声过大; 器件接地不良&…

干货分享|HOOPS Web平台和Polygonica进行增材制造的云CAM服务示例

这篇文章提供了一个示例项目,展示了使用 Machineworks Polygonica 和 HOOPS Web 平台进行增材制造的云 CAM 服务。该项目作为一个示例,说明了如何在服务器端使用 Polygonica 与 HOOPS Communicator 和 Exchange 来开发云服务。 它涵盖了增材制造 CAM 的…

Android问题笔记-Android Studio编译报错:2 files found with path.....

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&…

看物联网技术ZETA如何帮助场馆实现数智化管理升级?

背景介绍: 江宁足球训练基地位于南京江宁区上坊镇境内,是江苏省女足及青少年足球发展基地。该基地总占地面积为333300平方米,其中房屋建筑面积有19000平方米,健身房350平方米,拥有9个标准足球场,曾承办多场甲级足球赛…

Java多线程与并发

1、JDK版本的选择 选择JDK8、JDK11进行讲解的原因:Oracle长期支持 2、进程和线程的区别 进程和线程的由来 3、进程与线程的区别 进程是资源分配的最小单位,线程是cpu调度的最小单位. 所有与进程相关的资源,都被记录在PCB(进程控制块)中。进程是抢占…

day08 教你用英语过海关

前言 🏠个人主页:我是沐风晓月 🧑个人简介:大家好,我是沐风晓月,阿里云社区博客专家 😉😉 💕 座右铭: 先努力成长自己,再帮助更多的人,一起加油进…

基于深度学习FasterRCNN模型Restnet50 的生活垃圾智能分类(准确率达84%)-含python工程全源码

目录 前言总体设计系统整体结构图系统流程图 运行环境1. 硬件环境2. Python 环境 模块实现1. 数据预处理2. 数据加载3. 模型构建4. 模型训练及保存5. 模型加载与调用 系统测试1. 模型准确率2. 分类别准确率 工程源代码下载其它资料下载 前言 本项目基于Faster R-CNN模型&#…

mmrotate框架基本使用

1、如何将类交给mmrotate框架容器管理 容器:框架中现有基本容器包括DATASETS, BACKBONES, LOSSES, DETECTORS。初始化容器:Registry(‘backbone’)中’backbone’为容器初始化配置文件。#/mmdet/models/builder.py 部分代码 from mmcv.utils import Re…

【Lisp】【Python】在CAD中用插件获取选中字块的文字,在rhino中批量生成图层

文章目录 1 get_selected_text.lsp1.1 使用方法LISP代码解析1.2 动图 2 Rhino中使用PythonScript批量建立图层.py2.1 直接生成2.2 带颜色生成 2.3 动图展示 1 get_selected_text.lsp 1.1 使用方法 用记事本复制以下代码,改文件名为get_selected_text.lsp (defun c:…

springboot高校宿舍报修管理系统-计算机毕设 附源码83946

springboot高校宿舍报修管理系统 摘 要 科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流,人类发展的历史正进入一个新时代。在现实…