✅博主简介:擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。
✅ 如需沟通交流,扫描文章底部二维码。
(1)改进GRU网络补偿传感器误差与扩展卡尔曼滤波融合定位:
针对GNSS/INS组合导航中INS漂移问题,设计一个改进GRU网络学习加速度计和陀螺仪的误差趋势。在离线阶段采集大量静态和动态IMU数据,以IMU原始输出和温度等环境变量为输入,以高精度参考真值误差为标签,训练双GRU网络分别预测加速度和角速度的偏差。在线时将GRU的预测值作为补偿量注入惯性解算,然后将补偿后的INS数据与GNSS位置速度做EKF松组合。EKF状态包括位置误差、速度误差、姿态误差和陀螺漂移共15维。实际飞行测试显示,加入GRU补偿后,EKF定位误差由0.42m降低至0.15m,姿态角误差减小约40%。
(2)非线性自抗扰外环与模糊PID内环串级姿态‑位置控制:
针对植保无人机负载变化导致的扰动,设计外环位置控制器采用非线性自抗扰控制NLADRC,以期望加速度为控制量,通过非线性扩张状态观测器NESO估计总扰动并补偿。姿态内环则采用模糊PID控制器,以期望姿态角为输入,模糊规则根据角误差和误差变化率在线调整PID参数,适应不同负载状态。高度通道采用独立的模糊PID控制器。在飞控Pixhawk硬件上部署控制器,通过负载突变测试(药箱从满载至半载),高度波动小于0.3m,位置保持精度±0.5m,较标准PID有明显提升。
(3)多源传感器冗余融合与自主航迹规划:
为应对山区地形和二维航线不足,引入激光雷达和气压计进行高度融合,当GNSS信号短时丢失时,使用INS+雷达高度估计进行航位推算,保证安全性。自主作业航线生成考虑地块多边形和喷洒覆盖率,通过牛耕往复路径覆盖。在贵州省安顺茶园进行喷洒试验,累积飞行30个架次,航线偏差率在2%以内,系统作业效率达到每小时22亩。
import numpy as np from filterpy.kalman import ExtendedKalmanFilter from filterpy.common import Q_discrete_white_noise # 改进GRU网络误差补偿模型 import torch import torch.nn as nn class GRU_ErrorCompensator(nn.Module): def __init__(self, input_dim=12, hidden=64): super().__init__() self.gru = nn.GRU(input_dim, hidden, 2, batch_first=True) self.fc = nn.Linear(hidden, 3) # 预测加速度计偏差 def forward(self, x): out, _ = self.gru(x) return self.fc(out[:, -1, :]) # EKF融合定位 class GNSS_INS_EKF: def __init__(self, dt): self.ekf = ExtendedKalmanFilter(dim_x=15, dim_z=6) self.ekf.F = np.eye(15) # 简化状态转移矩阵 self.ekf.H = np.zeros((6,15)) self.ekf.H[:3,:3] = np.eye(3) # 位置观测 self.ekf.H[3:6,3:6] = np.eye(3) # 速度观测 self.dt = dt def update(self, imu, gnss, gru_model): # IMU补偿 imu_comp = imu + gru_model(torch.tensor(imu).unsqueeze(0)).detach().numpy()[0] # 预测 self.ekf.predict() # GNSS更新 self.ekf.update(gnss) return self.ekf.x # 非线性自抗扰控制器 class NLADRC: def __init__(self, h=0.01, b0=1.0): self.h = h self.b0 = b0 self.z1 = 0.0 # 估计位置 self.z2 = 0.0 # 估计速度 self.z3 = 0.0 # 估计总扰动 self.r = 100.0 # 响应因子 self.h0 = 0.02 def fal(self, e, alpha, delta): if abs(e) > delta: return np.sign(e) * abs(e)**alpha else: return e / (delta**(1-alpha)) def observe(self, y, u): e = self.z1 - y self.z1 += self.h * (self.z2 - 3*self.r*e) self.z2 += self.h * (self.z3 - 3*self.r*self.fal(e,0.5,self.h0) + self.b0*u) self.z3 += self.h * (- 4*self.r*self.r*self.fal(e,0.25,self.h0)) def control(self, ref, de): return (self.r*self.r*(ref - self.z1) - 2*self.r*self.z2 - self.z3) / self.b0 # 模糊PID(简化) class FuzzyPID: def __init__(self): self.Kp = 1.0; self.Ki = 0.2; self.Kd = 0.05 def adjust(self, e, de): if abs(e) > 5: self.Kp = 2.0 else: self.Kp = 1.2 return self.Kp, self.Ki, self.Kd如有问题,可以直接沟通
👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇