0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何将加速度计和陀螺仪数据融合在一起

454398 来源:网络整理 作者:网络整理 2019-11-11 17:19 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

步骤1:MPU-6050模块

MPU-6050模块具有8个引脚,

INT:中断数字输出引脚。

AD0: I2C从地址LSB引脚。这是设备7位从机地址中的第0位。如果连接到VCC,则将其读为逻辑1,并且从机地址更改。

XCL:辅助串行时钟引脚。此引脚用于将其他具有I2C接口功能的传感器SCL引脚连接到MPU-6050。

XDA:辅助串行数据引脚。该引脚用于将其他启用I2C接口的传感器SDA引脚连接到MPU-6050。

SCL:串行时钟引脚。将此引脚连接到微控制器的SCL引脚。 SDA:串行数据引脚。将此引脚连接到微控制器的SDA引脚。

GND:接地引脚。将此引脚接地。

VCC:电源引脚。将此引脚连接到+ 5V DC电源。 MPU-6050模块的从站地址(当AD0 = 0时,即未连接到Vcc)为

从站写地址(SLA + W): 0xD0

从站读取地址(SLA + R): 0xD1

步骤2:计算

MPU6050模块的陀螺仪和加速度计传感器数据由2的补码形式的16位原始数据组成。

MPU6050模块的温度传感器数据由16位数据组成(不是2的补码形式)。

现在假设我们选择了

-加速度计满量程范围+/- 2g,灵敏度比例因子为16,384 LSB(Count)/g。

-陀螺仪的满量程范围为+/- 250°/s,灵敏度比例因子为131 LSB(计数)/°/s。然后,

要获取传感器原始数据,我们首先需要对加速度计和陀螺仪的传感器数据进行2的补码运算。在获得传感器原始数据之后,我们可以通过将传感器原始数据除以它们的灵敏度比例因子来计算加速度和角速度,方法如下:

以g(g力)计的加速度计值

ul》

沿X轴的加速度=(加速度计X轴原始数据/16384)g。

沿Y轴的加速度=(加速度计Y轴原始数据/16384)g。

沿Z轴的加速度=(加速度计Z轴原始数据/16384)g。

陀螺仪值,以°/s(每秒度)为单位

沿X轴的角速度=(陀螺仪X轴原始数据/131)°/s。

沿Y轴的角速度=(陀螺仪Y轴原始数据/131)°/s。

沿Z轴的角速度=(陀螺仪Z轴原始数据/131)°/s。

以°/c为单位的温度值(每度摄氏度)

以摄氏度为单位的温度=((温度传感器数据)/340 + 36.53)°/c。

例如

假设在2‘补码之后得到加速度计X轴原始值= +15454

然后Ax = +15454/16384 = 0.94 g。

更多

所以我们知道我们在+/- 2G和+/- 250deg/s的灵敏度下运行,但是我们的值如何与这些加速度/角度相对应。

这两者都是直线图,我们可以从中得出结果,对于1G,我们将读取16384,对于1deg/sec,我们将读取131.07(尽管由于二进制,0.07将被忽略),这些值只是通过绘制直线图得出的在32767时2G在-32768时为-2G,在250/-250时为-2G。

所以现在我们知道了灵敏度值(16384和131.07),我们只需要减去这些值的偏移量即可。然后

这些对于X和Y值都适用,但是由于Z记录为1G而不是0,因此在除以灵敏度之前,我们需要减去1G(16384)。

步骤3:MPU6050-Atmega328p连接

。..

连接如下:-

MPU6050 《======》 Arduino Nano。

VCC 《====== 》 5v输出引脚

GND 《======》接地引脚

SDA 《======》 A4引脚//串行数据

SCL 《======》 A5引脚//串行时钟

俯仰和横滚计算:

滚动是围绕旋转x轴和螺距是沿y轴的旋转。

结果以弧度为单位。 (乘以180并除以pi即可转换为度)

步骤4:代码和说明

#include

const int MPU=0x68; //I2C address of the MPU-6050

int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ; //16-bit integers

int AcXcal,AcYcal,AcZcal,GyXcal,GyYcal,GyZcal,tcal; //calibration variables

double t,tx,tf,pitch,roll;

void setup()

{

Wire.begin(); //initiate wire library and I2C

Wire.beginTransmission(MPU); //begin transmission to I2C slave device

Wire.write(0x6B); // PWR_MGMT_1 register

Wire.write(0); // set to zero (wakes up the MPU-6050)

Wire.endTransmission(true); //ends transmission to I2C slave device

Serial.begin(9600); //serial communication at 9600 bauds

}

void loop()

{

Wire.beginTransmission(MPU); //begin transmission to I2C slave device

Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H)

Wire.endTransmission(false); //restarts transmission to I2C slave device

Wire.requestFrom(MPU,14,true); //request 14 registers in total

//Acceleration data correction

AcXcal = -950;

AcYcal = -300;

AcZcal = 0;

//Temperature correction

tcal = -1600;

//Gyro correction

GyXcal = 480;

GyYcal = 170;

GyZcal = 210;

//read accelerometer data

AcX=Wire.read()《《8|Wire.read(); // 0x3B (ACCEL_XOUT_H) 0x3C (ACCEL_XOUT_L)

AcY=Wire.read()《《8|Wire.read(); // 0x3D (ACCEL_YOUT_H) 0x3E (ACCEL_YOUT_L)

AcZ=Wire.read()《《8|Wire.read(); // 0x3F (ACCEL_ZOUT_H) 0x40 (ACCEL_ZOUT_L)

//read temperature data

Tmp=Wire.read()《《8|Wire.read(); // 0x41 (TEMP_OUT_H) 0x42 (TEMP_OUT_L)

//read gyroscope data

GyX=Wire.read()《《8|Wire.read(); // 0x43 (GYRO_XOUT_H) 0x44 (GYRO_XOUT_L)

GyY=Wire.read()《《8|Wire.read(); // 0x45 (GYRO_YOUT_H) 0x46 (GYRO_YOUT_L)

GyZ=Wire.read()《《8|Wire.read(); // 0x47 (GYRO_ZOUT_H) 0x48 (GYRO_ZOUT_L)

//temperature calculation

tx = Tmp + tcal;

t = tx/340 + 36.53; //equation for temperature in degrees C from datasheet

tf = (t * 9/5) + 32; //fahrenheit

//get pitch/roll

getAngle(AcX,AcY,AcZ);

//printing values to serial port

Serial.print(“Angle: ”);

Serial.print(“Pitch = ”); Serial.print(pitch);

Serial.print(“ Roll = ”); Serial.println(roll);

Serial.print(“Accelerometer: ”);

Serial.print(“X = ”); Serial.print(AcX + AcXcal);

Serial.print(“ Y = ”); Serial.print(AcY + AcYcal);

Serial.print(“ Z = ”); Serial.println(AcZ + AcZcal);

Serial.print(“Temperature in celsius = ”); Serial.print(t);

Serial.print(“ fahrenheit = ”); Serial.println(tf);

Serial.print(“Gyroscope: ”);

Serial.print(“X = ”); Serial.print(GyX + GyXcal);

Serial.print(“ Y = ”); Serial.print(GyY + GyYcal);

Serial.print(“ Z = ”); Serial.println(GyZ + GyZcal);

delay(1000);

}

//function to convert accelerometer values into pitch and roll

void getAngle(int Ax,int Ay,int Az)

{

double x = Ax;

double y = Ay;

double z = Az; pitch = atan(x/sqrt((y*y) + (z*z))); //pitch calculation

roll = atan(y/sqrt((x*x) + (z*z))); //roll calculation

//converting radians into degrees

pitch = pitch * (180.0/3.14);

roll = roll * (180.0/3.14) ;

}

-----------------------------------------------------------------------------------------------

Results:-

--------------------------------------------------------------------------------------

Angle: Pitch = 88.89 Roll = -0.47

Accelerometer: X = 15974 Y = -440 Z = 312

Temperature in celsius = 29.38 fahrenheit = 84.88

Gyroscope: X = -111 Y = 341 Z = 211

Angle: Pitch = 89.41 Roll = -0.27

Accelerometer: X = 16102 Y = -380 Z = 172

Temperature in celsius = 29.42 fahrenheit = 84.96

Gyroscope: X = -115 Y = 373 Z = 228

Angle: Pitch = 89.28 Roll = -0.34

Accelerometer: X = 16058 Y = -400 Z = 204

Temperature in celsius = 29.42 fahrenheit = 84.96

Gyroscope: X = -98 Y = 354 Z = 224

Angle: Pitch = 88.83 Roll = -0.54

Accelerometer: X = 15978 Y = -460 Z = 320

Temperature in celsius = 29.33 fahrenheit = 84.79

Gyroscope: X = -124 Y = 376 Z = 207

Angle: Pitch = 89.21 Roll = -0.31

Accelerometer: X = 15978 Y = -392 Z = 228

Temperature in celsius = 29.42 fahrenheit = 84.96

Gyroscope: X = -121 Y = 364 Z = 189

Angle: Pitch = 89.00 Roll = -0.56

Accelerometer: X = 15890 Y = -464 Z = 260

Temperature in celsius = 29.38 fahrenheit = 84.88

Gyroscope: X = -111 Y = 361 Z = 221

Angle: Pitch = 88.67 Roll = -0.65

Accelerometer: X = 16018 Y = -492 Z = 360

Temperature in celsius = 29.38 fahrenheit = 84.88

Gyroscope: X = -130 Y = 340 Z = 216

Angle: Pitch = 88.53 Roll = -0.43

Accelerometer: X = 16110 Y = -428 Z = 432

Temperature in celsius = 29.42 fahrenheit = 84.96

Gyroscope: X = -92 Y = 380 Z = 217

Angle: Pitch = 88.85 Roll = -0.60

Accelerometer: X = 15930 Y = -476 Z = 304

Temperature in celsius = 29.47 fahrenheit = 85.05

Gyroscope: X = -102 Y = 374 Z = 219

Angle: Pitch = 88.87 Roll = -0.24

Accelerometer: X = 16222 Y = -372 Z = 344

Temperature in celsius = 29.52 fahrenheit = 85.13

Gyroscope: X = -96 Y = 351 Z = 226

Angle: Pitch = 89.05 Roll = -0.26

Accelerometer: X = 15970 Y = -376 Z = 284

Temperature in celsius = 29.38 fahrenheit = 84.88

Gyroscope: X = -105 Y = 367 Z = 201

Angle: Pitch = 89.13 Roll = -0.62

Accelerometer: X = 16034 Y = -484 Z = 200

Temperature in celsius = 29.52 fahrenheit = 85.13

Gyroscope: X = -110 Y = 391 Z = 207

Angle: Pitch = 88.98 Roll = -0.51

Accelerometer: X = 16178 Y = -452 Z = 280

Temperature in celsius = 29.47 fahrenheit = 85.05

Gyroscope: X = -117 Y = 379 Z = 221

Angle: Pitch = 89.27 Roll = -0.43

Accelerometer: X = 16066 Y = -428 Z = 192

Temperature in celsius = 29.42 fahrenheit = 84.96

Gyroscope: X = -101 Y = 359 Z = 208

Angle: Pitch = 89.31 Roll = -0.19

Accelerometer: X = 16150 Y = -356 Z = 212

Temperature in celsius = 29.52 fahrenheit = 85.13

Gyroscope: X = -115 Y = 361 Z = 189

Angle: Pitch = 88.76 Roll = -0.51

Accelerometer: X = 16026 Y = -452 Z = 348

Temperature in celsius = 29.42 fahrenheit = 84.96

Gyroscope: X = -139 Y = 368 Z = 192

Angle: Pitch = 88.57 Roll = -0.69

Accelerometer: X = 16086 Y = -504 Z = 388

Temperature in celsius = 29.33 fahrenheit = 84.79

Gyroscope: X = -118 Y = 352 Z = 214

步骤5:了解倾斜角

加速度计

地球的重力是恒定的加速度,力始终指向降到地球中心

当加速度计与重力平行时,测得的加速度将为1G,当加速度计与重力垂直时,加速度将为0G。

倾斜角可以使用以下公式从测量的加速度中计算出:

θ= sin-1(测量的加速度/重力加速度)

陀螺仪

陀螺仪(又称速率传感器)用于测量角速度(ω)。

为了获得机器人的倾斜角,我们需要将陀螺仪的数据如下式所示:

ω=dθ/dt,

θ=∫ωdt

Gyro和加速度传感器Fusio n

在研究了陀螺仪和加速度计的特性之后,我们知道它们各有优缺点。根据加速度计数据计算出的倾斜角具有较慢的响应时间,而根据陀螺仪数据计算出的积分倾斜角会在一段时间内发生漂移。换句话说,可以说加速度计数据对长期有用,而陀螺仪数据对短期有用。

责任编辑:wv

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 陀螺仪
    +关注

    关注

    44

    文章

    873

    浏览量

    101080
  • 加速度计
    +关注

    关注

    6

    文章

    783

    浏览量

    47835
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    加速度计都有哪些分类?

    加速度计的分类主要依据其工作原理和测量维度(轴数),以下是详细的分类:按工作原理分类(这是最核心的分类方式)这是根据加速度计内部如何感知和转换加速度信号来划分的。
    的头像 发表于 12-04 15:55 52次阅读
    <b class='flag-5'>加速度计</b>都有哪些分类?

    加速度计伺服电路模块原理与应用

    在惯性导航与姿态控制这尖端技术领域,系统感知运动状态的能力直接决定了其精度与可靠性。而将物理世界的加速度精确转换为可用电信号的关键,在于个核心部件——加速度计伺服电路模块。该模块专
    的头像 发表于 11-28 15:43 157次阅读

    如何为你的项目选择合适的加速度计

    在智能科技飞速发展的今天,从翱翔天空的飞行器到我们手中的智能设备,对运动的精准感知已成为关键。加速度计,作为测量加速度和振动的核心传感器,其选型直接决定了项目的成败。面对不同的技术类型,如何才能做出最明智的选择?本文将带您了解主要的加速
    的头像 发表于 11-06 15:32 140次阅读
    如何为你的项目选择合适的<b class='flag-5'>加速度计</b>?

    MEMS加速度计:小身材里藏着怎样的&amp;quot;运动感知&amp;quot;大能量?

    在智能设备无处不在的今天,精确测量运动与姿态已成为众多行业的核心需求。加速度计作为惯性传感器,能精准捕捉由重力或运动引起的线性加速度,ER-MA-5 MEMS加速度计凭借其小巧体积、轻盈重量和低能耗
    的头像 发表于 10-21 15:00 172次阅读
    MEMS<b class='flag-5'>加速度计</b>:小身材里藏着怎样的&amp;quot;运动感知&amp;quot;大能量?

    石油钻井为何离不开抗高温抗冲击的石英加速度计

    在地下数千米的复杂钻井环境中,钻头需要穿越坚硬的岩层、承受剧烈振动和超过150℃的高温。此时,石英加速度计就如同钻井系统的"感知神经",通过与陀螺仪协同工作,精确测量角速度加速度
    的头像 发表于 09-30 15:16 340次阅读
    石油钻井为何离不开抗高温抗冲击的石英<b class='flag-5'>加速度计</b>?

    MEMS加速度计如何让无人机在狂风中稳如磐石?

    当无人机在强风中保持悬停,其背后是加速度计在实时感知每丝气流扰动。ER-MA-5 MEMS加速度计通过测量线性加速度,与陀螺仪、磁力
    的头像 发表于 09-25 14:54 405次阅读
    MEMS<b class='flag-5'>加速度计</b>如何让无人机在狂风中稳如磐石?

    MEMS加速度计与石英加速度计的发展现状与水平对比

    在工程测量与惯性导航领域,加速度计是感知运动与振动的核心传感器。其中,微机电系统(MEMS)加速度计和石英加速度计是两种技术路线迥异但应用广泛的重要类型。它们各自的发展现状和技术水平呈现出
    的头像 发表于 09-19 14:55 916次阅读
    MEMS<b class='flag-5'>加速度计</b>与石英<b class='flag-5'>加速度计</b>的发展现状与水平对比

    洞察万物运动:详解加速度计的分类与广泛应用

    在我们日常生活中,从智能手机屏幕的自动旋转到汽车的紧急安全气囊触发,种看不见的技术始终在默默工作,感知着物体的运动和振动。这种技术的核心元件就是加速度计。它是种能够测量加速度(包括
    的头像 发表于 09-18 16:06 673次阅读
    洞察万物运动:详解<b class='flag-5'>加速度计</b>的分类与广泛应用

    为什么在振动分析中加速度计最常用?

    尽管振动可以通过位移、速度加速度三个参数来完整描述,但在现代预测性维护和状态监测领域,加速度传感器(加速度计)占据了绝对主导地位,原因如下:宽广的频率范围:机械设备的早期故障(如轴承
    的头像 发表于 09-12 12:02 435次阅读
    为什么在振动分析中<b class='flag-5'>加速度计</b>最常用?

    航空航天对石英加速度计的要求?

    在航空航天这对精度与可靠性要求近乎极致的领域,石英加速度计不仅是测量的工具,更是飞行安全、导航精度和任务成功的核心保障。它如同飞行器的“精密感官”,必须在地面、高空乃至太空的极端环境下,瞬间捕捉
    的头像 发表于 08-21 15:56 622次阅读
    航空航天对石英<b class='flag-5'>加速度计</b>的要求?

    求助,关于ST的IMU和地磁用motionfx库融合后航向角异常的问题求解

    是40uT,Y轴是0uT,但是航向角是300度,稍微振动传感器改变加速度计的值和陀螺仪的值后航向角稳定为270度,我不理解为啥磁场输入正常但是航向角输出异常呢?查阅资料得知改变倾角后,融合
    发表于 06-10 07:19

    ST的IMU和地磁用motionfx库融合后航向角异常的原因?

    是40uT,Y轴是0uT,但是航向角是300度,稍微振动传感器改变加速度计的值和陀螺仪的值后航向角稳定为270度,我不理解为啥磁场输入正常但是航向角输出异常呢?查阅资料得知改变倾角后,融合
    发表于 04-23 08:11

    高性能石英加速度计,满足最严苛应用需求

    在精度、可靠性和环境适应性至关重要的行业中,ER-QA-02A高性能石英加速度计无疑是款颠覆性的产品。专为最具挑战性的环境设计,这款先进的加速度计以无与伦比的精度和稳定性,成为航空航天、国防、工业以及地震监测等领域的理想选择。
    的头像 发表于 02-19 17:41 893次阅读

    ADXL345超低功耗3轴加速度计中文手册

    电子发烧友网站提供《ADXL345超低功耗3轴加速度计中文手册.pdf》资料免费下载
    发表于 01-06 16:35 5次下载

    十轴姿态传感器模块 | 集成加速度计陀螺仪、磁力,自带BLE5.0蓝牙

    电子全新推出的款十轴姿态传感器模块,模块集成高精度的加速度计陀螺仪和磁力,采用高性能微处理器和先进的滤波算法,能够快速解算出模块当前的实时姿态。超多功能1精
    的头像 发表于 01-06 12:47 1490次阅读
    十轴姿态传感器模块 | 集成<b class='flag-5'>加速度计</b>、<b class='flag-5'>陀螺仪</b>、磁力<b class='flag-5'>计</b>,自带BLE5.0蓝牙