چرا GPS و IMU به تنهایی کافی نیستند؟
GPS دقت ~۲.۵m دارد، بهروزرسانی ۱Hz، و در زیر درخت یا نزدیک ساختمان خراب میشود. IMU بدون drift سریع است اما خطاهایش با زمان جمع میشوند. راهحل: ترکیب هر دو با فیلتر کالمن. این فیلتر یک مدل آماری است که به هر سنسور بسته به قابلیتاعتمادش وزن میدهد و بهترین تخمین را میسازد.
EKF (Extended Kalman Filter) نسخه توسعهیافته برای سیستمهای غیرخطی مثل ناوبری است. ArduPilot، iNAV و ROS همه از EKF استفاده میکنند.
🛠️ کارت پروژه
| سنسورها | MPU-9250 (IMU+Mag) + NEO-M8N (GPS) |
| پردازنده | Arduino Mega یا Raspberry Pi |
فیلتر کالمن ساده — Complementary به Kalman
برای مبتدیها ابتدا یک فیلتر کالمن ۱D برای ترکیب GPS Lat با Dead Reckoning پیاده میکنیم:
// فیلتر کالمن ۱ بعدی برای موقعیت X
struct Kalman1D {
float x; // تخمین موقعیت
float P; // واریانس خطا
float Q=0.01; // نویز پروسس (IMU drift)
float R=2.5; // نویز اندازهگیری (GPS noise متر)
float update(float measurement, float prediction){
// Predict
P += Q;
// Update
float K = P / (P + R); // Kalman Gain
x = prediction + K*(measurement - prediction);
P = (1 - K) * P;
return x;
}
};
Kalman1D kx, ky;
float estX=0, estY=0;
void loop(){
// از Odometry/IMU تخمین حرکت
float predX = estX + vx * dt;
float predY = estY + vy * dt;
if(gps.location.isUpdated()){
// GPS موقعیت جدید (متر از مبدأ)
float gpsX = (gps.location.lat() - homeLat) * 111320.0;
float gpsY = (gps.location.lng() - homeLng) * 111320.0 * cos(radians(homeLat));
estX = kx.update(gpsX, predX);
estY = ky.update(gpsY, predY);
} else {
estX = predX; estY = predY; // فقط IMU
}
}
جدول مقایسه روشهای Fusion
| روش | پیچیدگی | دقت | مناسب برای |
|---|---|---|---|
| فیلتر مکمل | خیلی ساده | متوسط | تعادل ربات |
| Kalman 1D | ساده | خوب | GPS + Odometry |
| EKF (ArduPilot) | پیچیده | عالی | UGV حرفهای |
| robot_localization (ROS) | پیچیده | عالی | Raspberry Pi + ROS |