我们将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;
}


问题不在于无人机的晃动。如果我们将电动机置于最大速度并手动模拟角度,则将获得正确的角度。因此,也可以通过电动机进行正确的补偿。

如果我们需要添加更多代码,请询问。

先感谢您。

最佳答案

解决此类问题的标准详尽方法

您可以自上而下或自上而下。在这种情况下,我更倾向于考虑与硬件相关的问题,但这取决于您:

电源相关问题

当您用手抓住无人机并以最大油门速度运行电动机时,它们是否安装了螺旋桨?
不带螺旋桨的全速电动机仅吸收其满负荷的一小部分。提升无人机重量时,电压下降会导致电子故障。

替代原因:短路/导通?

机械问题(又称振动损坏传感器读数)

过去,我已经看到MEMS传感器在剧烈振动(幅度+ -4g)下会遭受很多损坏。所谓“饱受痛苦”,是指加速度计甚至不记录重力,陀螺仪返回无意义的数据。
如果振动很大,则需要为无人机使用更好的框架或为传感器提供更好的振动隔离。

软件问题(数据/算法/实现)

如果绝对与功率和机械方面无关,则可以记录传感器的原始数据并脱机处理它,看是否有意义。
为此,您需要实现嵌入在无人机中的相同算法。
在这里您将能够辨别:


错误/错误的嵌入式实现。
在工作条件下算法失败。
其他:数据看起来不正确(问题读取),软件未达到时间周期限制。

关于c - 无人机飞行时产生怪异的角度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45674958/

10-13 00:11