文章目录
MPU6050 内部整合了 3 轴陀螺仪和 3 轴加速度传感器,并且含有一个第二 IIC 接口,可用于连接外部磁力传感器,并利用自带的数字运动处理器( DMP: Digital Motion Processor )硬件加速引擎,通过主 IIC 接口,向应用端输出完整的 9 轴融合演算数据。有了 DMP,我们可以使用 InvenSense 公司提供的运动处理资料库,非常方便的实现姿态解算,降低运动处理运算对操作系统的负荷,同时大大降低开发难度。
加速度传感器是一种能够测量加速度的传感器。对于加速度传感器,我们可以把加速度传感器想象为一个装有小球的盒子模型,假设小球在真空环境下,一切东西都处于无重力状态(失重),这时,小球也不例外,将悬浮在盒子的中间,如果每一面盒壁受到冲击都会返回压力信号,那么通过转换就能测得该方向上的加速度,注意加速度传感器检测到力的方向与它自身运动加速度的方向是相反的,这种力通常被称为惯性力。

陀螺仪传感器的作用是检测三个轴(x、y、z)的旋转,其原理就是,一个旋转物体的旋转轴所指的方向在不受外力影响时,是不会改变的。人们根据这个道理,用它来保持方向。然后用多种方法读取轴所指示的方向,并自动将数据信号传给控制系统。

mpu6050 物理模型可以想象成下图:

mpu6050 对陀螺仪和加速度计分别用了三个 16 位的 ADC,将其测量的模拟量转化 为可输出的数字量。
要通过6050得到四元数和欧拉角,这个过程有两种办法,一种是用原始数据( 三轴加速度、三轴角速度 ),通过卡尔曼滤波、积分运算、减少误差零点漂移等姿态融合运算转化等一系列复杂运算得出。第二种是直接用MPU6050 内部的自带的数字运动处理器(即 DMP )。
DMP 就是MPU6050 内部的运动引擎,直接输出四元数,可以减轻外围微处理器的工作负担且避免了繁琐的滤波和数据融合。Invensense 公司有提供了一个 MPU6050 的嵌入式运动驱动库,这个库是基于MSP430的,不过只需要简单修改就可以移植到大部分芯片上。
输出结果:
I0、I1、I2 为处理后的欧拉角;
I3、I4、I5 为加速度计原始值;

传送门:
官方原始库:http://drivers.softpedia.com/get/Other-DRIVERS-TOOLS/Others/InvenSense-Embedded-Motion-Tracker-Driver-51.shtml
移植教程参考:https://blog.csdn.net/haha1fan/article/details/72440574
rtt下移植教程:https://blog.csdn.net/qq_16519885/article/details/121574865
坐标系可大致分为两种:固定坐标系和载体坐标系。
固定坐标系指固定的坐标系,不管怎么运动,该坐标系都固定不变,如:惯性系( i 系)、世界系( w 系)、导航系( n 系)等;
载体坐标系指随着载体的运动而运动的坐标系,也就是固联在在载体上的坐标系,如:载体系( b 系)、传感器坐标系( s 系)、机器坐标系( r 系)等;
我们从传感器芯片上读取的加速度,角速度等数据,都是载体系上的数据。而真正导航说需要的数据,一般都是固定坐标系上的,所以惯性导航的任务中很大一部分,就是将载体系的数据转换到固定坐标系上,这一点需要旋转矩阵的相关知识来实现。
二维旋转矩阵可具象化为:原坐标系有一点 P(
X
a
X_a
Xa,
Y
b
Y_b
Yb) ,现在将坐标系由逆时针方向旋转一个角度
θ
\theta
θ ,P 点不动,求现在P点的坐标。
推导过程如下图:

如果我们把转之前的坐标系定义为导航系(n),把转之后的坐标系定义为载体系(b), 那么矩阵 M (
θ
\theta
θ )正好是载体系(b)到导航系(n)的坐标变换矩阵。
那么有载体系到导航系的坐标变换矩阵:
M
b
n
=
[
c
o
s
θ
−
s
i
n
θ
s
i
n
θ
c
o
s
θ
]
M^n_b= \left[ \begin{matrix} cos \theta & -sin\theta \\ sin\theta & cos\theta \\ \end{matrix} \right]
Mbn=[cosθsinθ−sinθcosθ]
matlab仿真结果:

附矩阵计算公式:

将GPS获取的定位信息看作固定不变的坐标系,即导航系( n 系),将固联在小车质心处的mpu6050看作一个载体系( b 系),之后将定点数据通过惯性导航公式在两个坐标系间互相转换,再通过算法可计算角度进行导航。
航向角( yaw ):
yaw = yaw +
∫
\int
∫ yaw_rad
d
t
d_t
dt ;
( yaw_rad 为 z 轴角速度,注:航向角也可通过 mpu6050 直接获取)
旋转矩阵:
M
b
n
=
[
c
o
s
(
y
a
w
)
−
s
i
n
(
y
a
w
)
s
i
n
(
y
a
w
)
c
o
s
(
y
a
w
)
]
M^n_b= \left[ \begin{matrix} cos ( yaw ) & -sin (yaw ) \\ sin ( yaw) & cos ( yaw ) \\ \end{matrix} \right]
Mbn=[cos(yaw)sin(yaw)−sin(yaw)cos(yaw)]
将加速度旋转到导航系:
acc_n = acc_b *
M
b
n
M_b^n
Mbn;
( n为导航系,b为载体系)
速度更新:
V = V +
∫
\int
∫ acc_n
d
t
d_t
dt;
(原速度加上加速度的积分)
互补融合(与编码器速度进行互补滤波融合):
v_mini * cos(yaw) * (trust) + vx * (1 - trust) = Vx;
v_mini * sin(yaw) * (trust) + vy * (1 - trust) = Vy;
( trust 代表信任程度,小于等于1,大于等于0;v_mini 为编码器测得速度)
位置更新:
P = P +
∫
\int
∫ V *
d
t
d_t
dt;
(原位置加上对速度积分)
Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/
我有两个Rails模型,即Invoice和Invoice_details。一个Invoice_details属于Invoice,一个Invoice有多个Invoice_details。我无法使用accepts_nested_attributes_forinInvoice通过Invoice模型保存Invoice_details。我收到以下错误:(0.2ms)BEGIN(0.2ms)ROLLBACKCompleted422UnprocessableEntityin25ms(ActiveRecord:4.0ms)ActiveRecord::RecordInvalid(Validationfa
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal
我正在尝试将以下SQL查询转换为ActiveRecord,它正在融化我的大脑。deletefromtablewhereid有什么想法吗?我想做的是限制表中的行数。所以,我想删除少于最近10个条目的所有内容。编辑:通过结合以下几个答案找到了解决方案。Temperature.where('id这给我留下了最新的10个条目。 最佳答案 从您的SQL来看,您似乎想要从表中删除前10条记录。我相信到目前为止的大多数答案都会如此。这里有两个额外的选择:基于MurifoX的版本:Table.where(:id=>Table.order(:id).
我目前正在用Ruby编写一个项目,它使用ActiveRecordgem进行数据库交互,我正在尝试使用ActiveRecord::Base.logger记录所有数据库事件具有以下代码的属性ActiveRecord::Base.logger=Logger.new(File.open('logs/database.log','a'))这适用于迁移等(出于某种原因似乎需要启用日志记录,因为它在禁用时会出现NilClass错误)但是当我尝试运行包含调用ActiveRecord对象的线程守护程序的项目时脚本失败并出现以下错误/System/Library/Frameworks/Ruby.frame
我有一个应用需要发送用户事件邀请。当用户邀请friend(用户)参加事件时,如果尚不存在将用户连接到该事件的新记录,则会创建该记录。我的模型由用户、事件和events_user组成。classEventdefinvite(user_id,*args)user_id.eachdo|u|e=EventsUser.find_or_create_by_event_id_and_user_id(self.id,u)e.save!endendend用法Event.first.invite([1,2,3])我不认为以上是完成我的任务的最有效方法。我设想了一种方法,例如Model.find_or_cr
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or
在许多ruby类之间共享记录器实例的最佳(正确)方法是什么?现在我只是将记录器创建为全局$logger=Logger.new变量,但我觉得有更好的方法可以在不使用全局变量的情况下执行此操作。如果我有以下内容:moduleFooclassAclassBclassC...classZend在所有类之间共享记录器实例的最佳方式是什么?我是以某种方式在Foo模块中声明/创建记录器还是只是使用全局$logger没问题? 最佳答案 在模块中添加常量:moduleFooLogger=Logger.newclassAclassBclassC..