加速度校准分析(Pixhawk加速度校准算法简析)

1. 加速度计上电校准零偏是否可行?

答案是,以PX4飞控为例,在NED系下,水平放置时,机体测量加速度的数据应该是[0 0 -g],所以,除非你确定你的飞控校准加速度零偏的时候是绝对的水平,否则只会加大误差,更别谈每次上电自动校准,减零偏了,试想一下,如果我就是要飞机在斜坡上起飞,那飞机飞起来回平就完全不对了,飞机认为的水平已经不是你所见的水平。

2.加速度计校准有哪些方法?

主要有两种,一种是依赖于高精度的外部设备,比如转台等,进行的精确标定;主要校准安装误差,比例系数和零位偏移。方法为静态六位置法标定法。六位置法一般需要借助高精度转台进行试验测试,将姿态解算测试系统水平固定在转台测试台面上,安装过程中保证系统坐标系与转台测试面坐标系重合,对加速度传感器的各敏感轴进行竖直向上和向下测试,通过转动转台的内框-中框-外框对加速度计三个轴共测试六次。利用最小二乘法计算对六位置数据行进最小误差估计得到 12 个误差系数。具体方法可以参考一些导航方面的书籍论文。

另外一种则是重力参考标定,飞控会自动运行代码或离线数据采集进行参数计算。我们主要讲工程上最实用的,明显第二种比较简单实用,一般来讲,是不会用到转台这类设备进行精确标定的,原因就是设备太贵,买不起。所以一般采用重力参考标定方式。

3.加速度校准的原理?

静态放置情况下,无论加速度计计的位置在哪,所测的的加速度模值始终应该是当地重力加速度。

4.校准的目的?

换个说法,就是如果不校准会怎样?简单来讲,会影响你姿态解算的精度,比如互补滤波,解算的静态精度与测量的重力加速度有直接关系,所以能提高姿态解算的精度。

5.可不可以不校准?

实际应用也可以不校准加速度计,毕竟,精度再差,也不差那么一些,当然,如果对飞控的精度要求比较高,还是校准最好。

加速度计一般校准一次即可,不需要每次都上电校准,所以,也可以采集离线数据,校准之后,将参数写入你的飞控代码。

6.如何做?

主要介绍两种方法,包括pixhawk飞控的算法解析。

6.1离线数据matlab计算

飞控静止下,随便转几个面,保持一段时间,记录飞控的加速度数据。

建立模型:

带入上式,进行最小二乘拟合,matlab中用lsqcurvefit函数,求出a1-a6参数。

实验结果如图所示:

图中看出,校准后,加速度计数据的输出更接近重力加速度g,与重力加速度的误差更小。

得到参数如下:

1.0010    0.1178   1.0059   -0.2940    0.9926   0.1514

6.2 PX4固件加速度计校准算法

因为不是外部设备(转台)进行标定,所以校准的原理与前面介绍的一样,都采用重力加速度作为参考。

建立模型:

accel_corr[3]是参考向量,也就是重力加速度向量

accel_T[3][3]是转换矩阵,包含旋转和尺度缩放

accel_raw[3]是实际测量的加速度向量

accel_offs[3]是加速度数据的零点偏移

飞控采用六面校准,即取6个面的数据,则可以得到参考向量。

分别对应头朝上,朝下,朝左,朝右,反向,水平放置,则实测的数据accel_raw_ref[6][3]。

步骤:

一、先求出每个轴的偏移,方法是利用重力加速度在每个轴上的最大最小数据,求和后除以2得到。

二、下面求accel_T[3][3]矩阵的参数,包含9个未知参数,一个轴有3个数据,每个方向有3个轴数据,所以这时只需采样3面数据即可。

展开:

即转换成A * x = b形式。

x = A^-1 * b

接着就是求解线性方程组,求出x矩阵,即accel_T[3][3]

具体代码见src\modules\commander\accelerometer_calibration.cpp文件。

7.几个需要注意的点

Ø  前面有提到,在采集数据的时候,主要是要获得静态状态下数据,所以最好不要加速晃动飞控采集,同样的原理,比如开源pixhawk飞控校准的时候,在摆6个面的时候,尽量缓慢,且保持一段时间;

Ø  虽然求出了12个参数,但是pixhawk飞控输出加速度数据的时候,也只用了6个数据,3个零偏,3个尺度变换因子,即accel_T矩阵的对角元素

Ø  前面所述的算法,只是核心的思想,PX4飞控实际的模型还包含了旋转信息

这里的rot矩阵,主要是根据你的飞控安装方向,外置罗盘的安装方向进行的数据坐标系校正

Ø  加速度数据的标定并不能保证你的飞行是水平的,如果有几度的安装误差,飞起来会怎样?很显然,飞机会以固定的角度,一直往一个地方飘。

如果有读者对飞控研发的某些知识点,有不清楚的地方可以在评论下写明,笔者会挑一些普遍的问题进行讲解。后续文章主要方向还是算法方面,且偏向工程应用,具体的理论推导就不阐述了。

  • 3
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
校准三轴加速度计可以使用以下步骤: 1. 放置加速度计在一个平稳的表面上,确保不受外力干扰。 2. 读取加速度计的原始值并记录。 3. 将加速度计沿着三个轴旋转90度,记录每个轴的读数。 4. 使用以下公式计算每个轴的比例因子和偏移量: scale_factor = (reading_max - reading_min) / (expected_max - expected_min) offset = (reading_max + reading_min) / 2 - (expected_max + expected_min) / 2 其中,reading_max是旋转后轴的最大读数,reading_min是旋转后轴的最小读数,expected_max是期望的最大值,expected_min是期望的最小值。 5. 应用比例因子和偏移量来校准加速度计的读数。 下面是一个简单的C语言示例代码,用于校准加速度计: ```c float scale_factor_x, scale_factor_y, scale_factor_z; float offset_x, offset_y, offset_z; void calibrate_accelerometer() { // 获取原始读数 float x_raw = read_accelerometer_x(); float y_raw = read_accelerometer_y(); float z_raw = read_accelerometer_z(); // 旋转90度,获取每个轴的读数 float x90_raw = read_accelerometer_x(); float y90_raw = read_accelerometer_y(); float z90_raw = read_accelerometer_z(); float x180_raw = read_accelerometer_x(); float y180_raw = read_accelerometer_y(); float z180_raw = read_accelerometer_z(); // 计算比例因子和偏移量 scale_factor_x = (x90_raw - x_raw) / 90.0; offset_x = (x90_raw + x_raw) / 2.0; scale_factor_y = (y90_raw - y_raw) / 90.0; offset_y = (y90_raw + y_raw) / 2.0; scale_factor_z = (z90_raw - z_raw) / 90.0; offset_z = (z90_raw + z_raw) / 2.0; } void read_accelerometer(float* x, float* y, float* z) { // 读取原始加速度计读数 float x_raw = read_accelerometer_x(); float y_raw = read_accelerometer_y(); float z_raw = read_accelerometer_z(); // 校准读数 *x = (x_raw - offset_x) / scale_factor_x; *y = (y_raw - offset_y) / scale_factor_y; *z = (z_raw - offset_z) / scale_factor_z; } ``` 在这个例子中,`calibrate_accelerometer`函数用于校准加速度计,`read_accelerometer`函数用于读取校准后的加速度计读数。`read_accelerometer_x`、`read_accelerometer_y`和`read_accelerometer_z`函数用于读取原始加速度计读数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值