首先,我们需要注意的是水平仪本身并不是一个真实存在的传感器,而是一个用软件程序通过加速度计进行计算来进行当前角度误差计算的程序。此外,我们还需要注意,水平仪并不是用于测量无人机机身在水平方向上的倾斜角度的,而是用于计算飞控与无人机之间安装误差。如下图所示:
由于机械结构、机身外壳、螺丝或胶固定等其他因素可能会导致飞控的安装平面并没有与无人机机身保持平行,因此飞控中传感器所测量出的姿态就只是飞控的姿态,而不是无人机机身的姿态,因此有必要将此安装的误差角消除,于是飞控程序引入一个叫做“水平仪”的校准功能,但实际上这并不是一个真正的传感器,也不是用于测量飞机水平姿态的传感器,而是用于计算飞控与机身的误差。
水平仪校准的方法也很简单,在校准时需要将无人机机身置于水平桌面上,并且持续一段时间,此时校准程序会根据当前加速度计和陀螺仪的读数对飞控当前的姿态进行解算,得到当前飞控的俯仰角和滚转角。校准程序持续采集俯仰角和滚转角一段时间,最后求出它们的平均数,就得到了飞控与机身之间的安装误差。
int do_level_calibration()
{
//采集10秒的数据进行校准
const unsigned cal_time = 10;
int att_sub = orb_subscribe(ORB_ID(vehicle_attitude));
struct vehicle_attitude_s att;
int counter = 0;
float roll_mean = 0.0f;
float pitch_mean = 0.0f;
while (hrt_elapsed_time(&start) < cal_time * 1000000) {
int pollret = px4_poll(&fds[0], (sizeof(fds) / sizeof(fds[0])), 100);
if (pollret <= 0) {
return -1;
}
orb_copy(ORB_ID(vehicle_attitude), att_sub, &att);
//将姿态信息中的四元数q转为欧拉角
matrix::Eulerf euler = matrix::Quatf(att.q);
roll_mean += euler.phi();
pitch_mean += euler.theta();
counter++;
}
//各自的平均值,也就是得到了安装误差
roll_mean /= counter;
pitch_mean /= counter;
//滚转角和俯仰角由弧度制转为角度制
roll_mean *= (float) M_RAD_TO_DEG;
pitch_mean *= (float) M_RAD_TO_DEG;
return OK;
}
Copyright © 2015-2023 问渠网 辽ICP备15013245号