我们使用 L3GD20 陀螺仪传感器和 LSM303DLHC 加速度传感器结合互补滤波器来测量无人机的角度。
如果我们用手模拟无人机的角度,例如,如果我们将无人机向前倾斜,我们的 x 角是正的。如果我们向后倾斜它,我们的 x 角是负的。
但是,如果我们启动电机,无人机将始终转向负 x 角。最重要的是,以前为正的 x 角现在是负的。因为无人机试图补偿这个角度,但角度是倒置的,无人机永远不会回到原来的状态。
#define RAD_TO_DEG 57.29578
#define G_GAIN 0.070
#define AA 0.98
#define LOOP_TIME 0.02
void calculate_complementaryfilter(float* complementary_angles)
{
complementary_angles[X] = AA * (complementary_angles[X] + gyro_rates[X] * LOOP_TIME) + (1 - AA) * acc_angles[X];
complementary_angles[Y] = AA * (complementary_angles[Y] + gyro_rates[Y] * LOOP_TIME) + (1 - AA) * acc_angles[Y];
}
void convert_accelerometer_data_to_deg()
{
acc_angles[X] = (float) atan2(acc_raw[X], (sqrt(acc_raw[Y] * acc_raw[Y] + acc_raw[Z] * acc_raw[Z]))) * RAD_TO_DEG;
acc_angles[Y] = (float) atan2(acc_raw[Y], (sqrt(acc_raw[X] * acc_raw[X] + acc_raw[Z] * acc_raw[Z]))) * RAD_TO_DEG;
}
void convert_gyro_data_to_dps()
{
gyro_rates[X] = (float)gyr_raw[X] * G_GAIN;
gyro_rates[Y] = (float)gyr_raw[Y] * G_GAIN;
gyro_rates[Z] = (float)gyr_raw[Z] * G_GAIN;
}
问题不在于无人机的晃动。如果我们将电机置于最大速度并手动模拟角度,我们会得到正确的角度。因此,电机也可以进行正确的补偿。
如果我们需要添加更多代码,请询问。
先感谢您。