问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

你真的了解IMU的参数吗?结合FishBot的MPU6050看一下

创作时间:
作者:
@小白创作中心

你真的了解IMU的参数吗?结合FishBot的MPU6050看一下

引用
1
来源
1.
https://fishros.org.cn/forum/topic/2572/%E4%BD%A0%E7%9C%9F%E7%9A%84%E4%BA%86%E8%A7%A3imu%E7%9A%84%E5%8F%82%E6%95%B0%E5%90%97-%E7%BB%93%E5%90%88fishbot%E7%9A%84mpu6050%E7%9C%8B%E4%B8%80%E4%B8%8B

IMU(惯性测量单元)是许多机器人和运动控制设备中的关键组件,而MPU6050则是其中最常用的传感器之一。本文将详细介绍IMU的参数,包括量程、灵敏度和噪声,并结合FishBot运动控制板的MPU6050模块,展示如何通过代码进行参数设置。

1. MPU6050的测量原理及数据类型

MPU6050是一款集成了3轴陀螺仪和3轴加速度计的传感器,能够提供关于设备运动状态的详尽数据。它通过测量设备在三个空间轴(X、Y和Z轴)上的角速度和加速度,帮助用户了解设备的运动情况。陀螺仪部分通过检测因旋转而引起的科里奥利力来测量角速度。加速度计部分则测量设备加速过程中各轴向的加速度。

科里奥力(Coriolis Force)是一种因旋转参考系中物体运动而产生的惯性力。它是由法国科学家古斯塔夫·科里奥利在1835年首次描述的,主要出现在旋转系统中,如地球自转等。科里奥利力的大小和方向取决于物体的速度和旋转轴的角速度。

在陀螺仪传感器中,如MPU6050,科里奥利力的原理被用来测量角速度。当传感器(或载体)绕某轴旋转时,陀螺仪内的振动结构(通常是微型振子)也会因旋转而受到偏移,这种偏移通过电容式传感器检测到。检测到的信号随后被放大和转换为电信号,最终输出为旋转速度的测量值。科里奥利力的应用使得MPU6050能精确追踪设备的方向变化,这在手机、无人机、运动追踪设备等多种应用中非常关键。

2. 测量数据的单位

  • 角速度(陀螺仪): 度/秒(°/s)
  • 加速度(加速度计): g(重力加速度,1g 约等于 9.81 m/s²)

3. IMU参数:量程、灵敏度和噪声

量程和灵敏度选择

  • 量程:MPU6050的陀螺仪部分支持±250, ±500, ±1000, ±2000°/秒的量程,加速度计部分支持±2, ±4, ±8, ±16g的量程。选择量程时需考虑应用场景的需求:例如,如果设备用于高速运动的跟踪,应选择较高的量程以避免数据溢出。
  • 灵敏度:陀螺仪的灵敏度根据量程不同而不同,例如,在±250°/秒的量程下,灵敏度为131 LSB/°/s。加速度计的灵敏度也随量程变化,如在±2g的量程下,灵敏度为16384 LSB/g。选择灵敏度高的设定可以提高测量的精确度,但可能会降低动态范围。

噪声

  • 噪声类型:MPU6050的噪声主要包括零偏噪声和随机游走噪声。
  • 噪声单位:通常以°/s/√Hz和mg/√Hz来表示。
  • 噪声产生原因:主要是由电子电路的内在物理特性引起的,如器件内部的电阻和电容。

4. MPU6050的参数设置代码解析

下面这段代码是从FishBot主控板使用的IMU模块驱动中摘抄的,代码中包含了设置陀螺仪和加速度计量程的功能。通过写入不同的配置值到MPU6050的寄存器,可以调整量程和灵敏度。

// 设置陀螺仪量程
byte MPU6050::setGyroConfig(int config_num){
    byte status;
    switch(config_num){
        case 0: // ±250 deg/s
            gyro_lsb_to_degsec = 131.0;
            status = writeData(MPU6050_GYRO_CONFIG_REGISTER, 0x00);
            break;
        case 1: // ±500 deg/s
            gyro_lsb_to_degsec = 65.5;
            status = writeData(MPU6050_GYRO_CONFIG_REGISTER, 0x08);
            break;
        case 2: // ±1000 deg/s
            gyro_lsb_to_degsec = 32.8;
            status = writeData(MPU6050_GYRO_CONFIG_REGISTER, 0x10);
            break;
        case 3: // ±2000 deg/s
            gyro_lsb_to_degsec = 16.4;
            status = writeData(MPU6050_GYRO_CONFIG_REGISTER, 0x18);
            break;
        default:
            status = 1; // 错误处理
            break;
    }
    return status;
}

// 设置加速度计量程
byte MPU6050::setAccConfig(int config_num){
    byte status;
    switch(config_num){
        case 0: // ±2 g
            acc_lsb_to_g = 16384.0;
            status = writeData(MPU6050_ACCEL_CONFIG_REGISTER, 0x00);
            break;
        case 1: // ±4 g
            acc_lsb_to_g = 8192.0;
            status = writeData(MPU6050_ACCEL_CONFIG_REGISTER, 0x08);
            break;
        case 2: // ±8 g
            acc_lsb_to_g = 4096.0;
            status = writeData(MPU6050_ACCEL_CONFIG_REGISTER, 0x10);
            break;
        case 3: // ±16 g
            acc_lsb_to_g = 2048.0;
            status = writeData(MPU6050_ACCEL_CONFIG_REGISTER, 0x18);
            break;
        default:
            status = 1; // 错误处理
            break;
    }
    return status;
}

此代码段显示了如何根据需要配置MPU6050的量程,以适应不同的应用场景。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号