Odometry چیست؟ ناوبری بدون GPS
Odometry (کیلومترشمار) روشی است که با شمارش تعداد دورهای چرخ، موقعیت ربات را محاسبه میکند. موتور پلهای ایدهآل است چون هر پالس = یک قدم دقیق (۱.۸°) — بدون encoder موقعیت دقیق داریم. Dead Reckoning یعنی با دانستن نقطه شروع + قدمهای زدهشده، موقعیت فعلی را میدانیم.
محدودیت: خطاها جمع میشوند — در مسافتهای طولانی drift دارد. برای داخل ساختمان تا ۲۰–۵۰ متر کافی است.
🛠️ کارت پروژه
| دقت موقعیت | ~±۵mm در ۲ متر (با microstep 1/16) |
| بودجه | ~۶۰۰K (NEMA17 × ۲ + A4988 × ۲) |
محاسبات Odometry
| پارامتر | مقدار | فرمول |
|---|---|---|
| قطر چرخ | ۱۰۰mm | — |
| محیط چرخ | ۳۱۴.۱mm | π × d |
| قدم در هر دور (1/16 step) | ۳۲۰۰ | 200 × 16 |
| mm در هر قدم | ۰.۰۹۸mm | ۳۱۴.۱ / ۳۲۰۰ |
| قدم برای ۱۰۰۰mm | ۱۰۱۹۸ قدم | ۱۰۰۰ / ۰.۰۹۸ |
کد حرکت به مختصات
#define STEP_L 3
#define DIR_L 4
#define STEP_R 5
#define DIR_R 6
const float MM_PER_STEP = 0.098; // mm/قدم با 1/16 microstep
const float WHEEL_BASE = 200.0; // mm بین دو چرخ
float posX=0, posY=0, heading=0; // mm, mm, degrees
void stepBoth(long stepsL, long stepsR, int delayUs=800){
long maxSteps = max(abs(stepsL), abs(stepsR));
for(long i=0; i0?HIGH:LOW);
digitalWrite(STEP_L,HIGH); delayMicroseconds(delayUs/2);
digitalWrite(STEP_L,LOW);
}
if(i0?HIGH:LOW);
digitalWrite(STEP_R,HIGH); delayMicroseconds(delayUs/2);
digitalWrite(STEP_R,LOW);
}
delayMicroseconds(delayUs/2);
}
}
void moveMM(float dist){
long steps = (long)(dist/MM_PER_STEP);
stepBoth(steps,steps);
posX += dist*cos(heading*PI/180);
posY += dist*sin(heading*PI/180);
}
void turnDeg(float deg){
float arc = (deg/360.0)*PI*WHEEL_BASE;
long steps = (long)(arc/MM_PER_STEP);
stepBoth(steps,-steps); // چپ جلو، راست عقب = چرخش چپ
heading += deg;
}