一天精通无人机第 40 讲 高级篇系列:陀螺仪校准

file

陀螺仪是一种可以测量系统的旋转角速度的传感器,与加速度计类似的,具有x、y、z这3个轴的角速度。从理论上讲,陀螺仪是由多组可以按任意方向旋转的转动装置所组成。转动轴不受外部系统的转动影响,根据角动量守恒原则,转动装置在旋转时会保持恒定的大小和方向。当外部系统发声旋转时内部转动装置仍然保持恒定的方向和速度旋转,测量这两个系统的差就可以得到当前系统的旋转角速度。为了测量x、y、z这3个轴的角速度,通常采用万向节构成转动装置。

file

陀螺仪校准仍是使用零偏和标度因数来进行校准。但是由于陀螺仪的特殊性标度因数需要使用非常复杂的办法来计算但效果却并不理想,因此在实际应用中并不去处理标度因数,将3轴的标度因数都设定为1,而只去计算3轴的零偏。零偏的计算非常简单,具体方法如下:

  1. 将陀螺仪静止放置在桌面上,持续记录一段时间的数据。

  2. 将记录的多组数据求出平均值作为陀螺仪的3轴零偏。

我们来看一下陀螺仪校准的程序代码:

int gyro_calibration_worker(int gyro_sensor_sub)
{
    //记数器,数据采样个数
    unsigned count = 0;
    //一共记录5000组数据
    const unsigned calibration_count = 5000;
    //陀螺仪的uORB结构体对象
    struct sensor_gyro_s sensor_gyro = { 0 };
    //循环记录数据
    while (count < calibration_count) 
    {
        //判断uORB是否有更新
        bool updated = false;
        orb_check(gyro_sensor_sub, &updated);
        if (updated) 
        {
            //复制陀螺仪数据
            orb_copy(ORB_ID(sensor_gyro), gyro_sensor_sub, &gyro_report);

            //计算标度因数总合
            worker_data->gyro_scale.x_offset += gyro_report.x;
            worker_data->gyro_scale.y_offset += gyro_report.y;
            worker_data->gyro_scale.z_offset += gyro_report.z;

            count++;
        }
    }

    //总合除以总数得到平均值
    worker_data->gyro_scale.x_offset /= count;
    worker_data->gyro_scale.y_offset /= count;
    worker_data->gyro_scale.z_offset /= count;

    return OK;
}

下期预告:《磁罗盘校准》

file