我们使用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;
}
问题不在于无人机的晃动。如果我们将电机置于最大速度并手动模拟角度,我们就会得到正确的角度。因此也是电机的正确补偿。
如果我们需要添加更多代码,请询问。
提前谢谢你。
答案 0 :(得分:0)
你可以上下或上下。在这种情况下,我更倾向于考虑与硬件相关的问题,但这取决于你:
当你用手拿无人机并全速运转电机时,是否安装了螺旋桨? 没有螺旋桨的全速电动机仅占其满载的一小部分。当提升无人机重量时,电压降会导致电子故障。
替代原因:短路/推导?
过去,我发现MEMS传感器在剧烈振动(振幅+ -4g)下会受到很大影响。随着"经历了很多苦难。我的意思是加速计甚至没有记录重力和陀螺仪返回无意义的数据。 如果振动是有意义的,你需要一个更好的无人机框架或更好的振动隔离传感器。
如果它与功率和机械方面无关,您可以记录原始传感器数据并离线处理它以确定它是否有意义。 为此,您需要在无人机中嵌入相同算法的实现。 在这里,您将能够辨别: