理想状况下,传感器的读数与实际物理量相同,但因为一些随机因素的影响,传感器测量到的数据与实际数据存在误差,且误差不停变化。误差大致分为两种,零位误差和标度误差。markdown
对于一个传感器来讲,实际物理量=K*传感器度数+B。函数
理想状态下,K=1,B=0,可是实际中K与B的值会不停的随机变化,K的改变引发的误差叫标度误差,B的改变引发的误差叫零位误差。工具
传感器校准,就是经过对已知物理量的测量,求出K与B的值,并将这两个值传入传感器驱动,使得传感器驱动能够解算出准确的物理量。,spa
这个过程的学术名词叫“六面较准法”。Pixhawk的加速度计是3轴的,也就是在x,y,z三个方向上测得三个加速度,因此存在三个y=kx+b的公式,根据两点肯定一条直线的原则,每一个轴都要测量到两个不一样的已知值,因此将每一个轴垂直向下采集一个负G数据,垂直向上采集一个正G数据,从而算出每一个轴的k和b值。.net
入口函数do_accel_calibration指针
设置驱动中的校准参数为默认值,”px4_ioctl(fd, ACCELIOCSSCALE, (long unsigned int)&accel_scale);“的含义是将校准参数的默认值写入加速度计驱动,默认三个scale是1,三个offset是0.blog
Calibration_routines.cpp文件中的749行:do_accel_calibration_measurements -> calibrate_from_orientation -> detect_orientation函数的返回值就是机头朝向,六个朝向都会进行一次校准数据采集。rem
774行calibration_worker函数指针指向accel_calibration_worker函数accel_calibration_worker -> read_accelerometer_avg函数负责采集某个机头朝向的加速度计值,三个轴各取3000个数据平均,而后将平均数从传感器坐标系转换到机体坐标系,将转换后的结果存放到worker_data -> accel_ref[3][6][3](三个罗盘六个方向三个轴)同步
六个方向的数据采集完毕后,由calculate_calibration_values函数完成校准结果的计算,offset的计算就是取同一个轴上的两个数据的平均值。博客
将机体系x轴朝上,y轴朝上,z轴朝上的数据减去各个轴的offset后存放到3*3矩阵mat_A的三个行中,mat_A是机体坐标系的值,mat_A的三行表明三个不一样的朝向,mat_A的三列表明在某个朝向减去offset后的X、Y、Z值。
有未知3*3矩阵Accel_T:
mat_A * Accel_T = [g 0 0] //X轴朝上
|0 g 0 | //y轴朝上
[0 0 g] //z轴朝上
mat_invert3函数用伴随矩阵法求出mat_A的逆阵,等式左右两边同时左乘mat_A^-1解出Accel_T。若是飞机与加速度计的坐标系重合,则Accel_T中的主对角线的三个元素就是加速度计三个轴的scale信息。
若是飞机与加速度计的坐标系重合,则矩阵Accel_T的主对角线上的三个值就是加速度计三个轴的比例(scale)
若是夹角不为0,根据pxhawk本身导出的公式计算传感器坐标系下的校准参数。转换公式以下:
accel_T= rot^-1 * Accel_T_r *rot
Accel_offs= rot^-1 * Accel_offs_r
1) rot的含义
rot是传感器与机体系之间的旋转矩阵,传感器坐标系值*rot = 机体坐标系值
2) Accel_offs_r与Accel_offs的含义
Accel_offs_r是机体坐标系下三个轴的offset组成的三维向量,也就是accel_offs[3][3]。Accel_offs是传感器坐标系下的offset三维向量,Accel_offs是须要求得的三个轴offset校准参数的来源。
3) Accel_T_r与accel_T的含义
Accel_T_r是时机体坐标系下的比例(scale)3*3矩阵,也就是咱们在以前比例计算中得出的矩阵Accel_T。accel_T是传感器坐标系下的比例(scale)3*3矩阵,accel_T是咱们须要求得的三个轴scale校准参数的来源。
正交矩阵的转置(transpose)等于正交矩阵的逆阵,因此用board_rotation_t就是board_rotation的逆阵。
最后经过accel_scale结构体将六个校准参数存入参数列表并经过“px4_ioctl(fd, ACCELIOCSSCALE, (long unsigned int)&accel_scale)”将校准结果写入驱动。
Pixhawk注释的公式推到过程连括号都不匹配,因此我试着本身推导
其中mat_A_r是机体坐标系下的三个方向三个轴组成的3*3矩阵。mat_A是传感器坐标系下三个方向三个轴组成的3*3矩阵。Accel_T_r机体坐标系下的主对角线scale参数3*3矩阵。accel_T是传感器坐标系的scale参数3*3矩阵。
证实:accel_T = rot^-1* Accel_T_r *rot
mat_A_r* Accel_T_r = [g 0 0]
|0 g 0|
[0 0 g]
展开mat_A_r和右侧矩阵得出
mat_A* rot*Accel_T_r = xyz分别向上组成的传感器坐标系3*3矩阵* rot
左右同时右乘rot^-1,得出
mat_A*rot*Accel_T_r*rot^-1 = xyz分别向上组成的传感器坐标系3*3矩阵
因此
mat_A* (rot*Accel_T_r*rot^-1)= xyz分别向上组成的传感器坐标系3*3矩阵
由于mat_A*accel_T = xyz分别向上组成的传感器坐标系3*3矩阵
因此括号中的东西(rot*Accel_T_r*rot^-1)是传感器坐标系下的accel_T
证实:Accel_offs= rot^-1 * Accel_offs_r
机体坐标系offset三维向量 = (正G *ROT + 负G*ROT)/2 = ((正G + 负G)/2)*ROT = 传感器offset三维向量*ROT
其中正G是三个轴朝上造成的三维向量,负G是三个轴朝下造成的三维向量,ROT是坐标系转换旋转矩阵。
1)加速度计主管飞机姿态,加速度计校准后,在不考虑水平校准的状况下。飞机仪表盘上的滚转俯仰角更加准确。
2)能够用qGroundControl的分析工具实时查看加速度计的原始数据曲线,注意这里的数据是机体坐标系的,因此不用考虑旋转问题。将pixhawk的某个轴向上或水平,看读数是否是一个G或零,若是误差较大,校准后看好转了多少。