8. ünite / 10 · yaklaşık 4 saat
Diferansiyel sürüşlü robot ve odometri
İki tekerlekten gövde hızına, (v, ω) komutları, enkoderle konum kestirimi ve hatanın nereden geldiği.
Bu ünitenin sonunda
- Gövde hızından (v, ω) tekerlek hızlarını ve tersini hesaplamak
- Enkoder sayımlarından odometriyle poz (x, y, θ) kestirmek
- Tekerlek çapı hatası ve kaymanın odometriyi nasıl kaydırdığını göstermek
- gpiozero Robot sınıfıyla klavyeden sürüş kurmak
Ders notları
İki bağımsız tekerlekli ve bir sarhoş tekerlekli robot, diferansiyel sürüşlüdür: tekerlekler aynı hızda dönerse düz gider, farklı hızda dönerse yay çizer, zıt yönde dönerse yerinde döner.
L iz genişliğidir (tekerlekler arası mesafe). Ters yönde, istenen (v, ω) için vL = v − ωL/2, vR = v + ωL/2. Üst düzey kod (Flask paneli, ROS 2) robotla hep (v, ω) dilinde konuşur; tekerlek hızlarına çevirmek sürücü katmanının işidir.
Odometri
Her döngüde iki enkoderin sayım farkı tekerlek yollarına (dL, dR) çevrilir. Ortalama yol ileri hareketi, fark dönüşü verir; tam yay formülü kısa adımlarda bile doğrudur. Ama odometri hata biriktirir: tekerlek çapında %2'lik hata, her metrede 2 cm demektir; dönüşteki küçük hata ise ilerledikçe büyüyen yan kaymaya dönüşür. Kayma ve tümsekler hiç ölçülmez.
Bu yüzden gerçek robotlar odometriyi başka sensörlerle düzeltir: IMU (MPU6050) dönüşü, kamera ya da lidar konumu. ESOF 323'ün 7. ve 9. haftaları bunun matematiğini işler.
Simülasyonlar
Diferansiyel sürüşlü robot ve odometri
Klavye (W A S D) ya da düğmelerle sür. Gerçek poz yeşil, enkoderden hesaplanan odometri turuncu: tekerlek çapı hatası ve kaymayla zamanla ayrılırlar.
3B kameralı keşif robotu
Diferansiyel sürüşlü robotu 3B sahada GPIO pinleriyle (L298N IN1–IN4, ENA/ENB) sür ya da izle kipini aç: kamera görüş konisi topu görünce yeşile döner, robot topa yaklaşır. Sahneyi sürükleyerek döndür, iki parmakla yakınlaştır. Sahne durumu testli saf mantıktan gelir; 3B yalnız görselleştirmedir.
Ya da pinleri elle sür (L298N):
Kendin dene
Benzetimde robotu klavyeyle (W A S D) bir kare çizecek şekilde sür ve başlangıca dön. Gerçek poz ile odometri arasındaki farkı oku. Sonra tekerlek çapı hatasını %3 yap ve aynı kareyi tekrarla: fark nasıl değişti? Kaymayı aç ve yerinde dönüşlerde hatanın neden hızla büyüdüğünü açıkla.
Kod
from math import sin, cos, pi, atan2
class Odometry:
def __init__(self, track_m=0.15, wheel_d=0.065, cpr=1400):
self.L, self.k = track_m, pi * wheel_d / cpr # sayım başına metre
self.x = self.y = self.th = 0.0
def update(self, dticks_l: int, dticks_r: int):
dl, dr = dticks_l * self.k, dticks_r * self.k
d, dth = (dl + dr) / 2, (dr - dl) / self.L
if abs(dth) < 1e-9:
self.x += d * cos(self.th); self.y += d * sin(self.th)
else:
R = d / dth # dönüş yarıçapı
self.x += R * (sin(self.th + dth) - sin(self.th))
self.y -= R * (cos(self.th + dth) - cos(self.th))
self.th = atan2(sin(self.th + dth), cos(self.th + dth))
def wheels(v: float, w: float, L=0.15):
return v - w * L / 2, v + w * L / 2 # sol, sağ (m/s)Sık yapılan hatalar
- İz genişliğini cetvelle ölçüp kalibre etmemek: robotu 10 tur döndürüp L'yi düzelt.
- Sol ve sağ enkoderi ters bağlamak: ileri giderken robot "dönüyor" sanır.
- Odometriyi mutlak doğru kabul etmek: uzun yolda mutlaka kayar.
- Açıyı sarmamak (−π..π): 359° ile 1° arasındaki fark 358° hesaplanır.
Yazılım mühendisliği bağlantısı
Kinematiği ve odometriyi donanımdan bağımsız bir modülde tut ve özellik testleri yaz:
- "Eşit sayımlarda θ değişmez", "zıt eşit sayımlarda x, y değişmez".
- "Çeyrek çember komutu θ'yı π/2 artırır". Aynı modül benzetimde ve gerçek robotta kullanılır.
Kendini sına
v_L = 0,1 m/s, v_R = 0,3 m/s, L = 0,2 m. ω kaçtır?
Robotu yerinde döndürmek için tekerlekler nasıl dönmeli?
Tekerlek çapı %2 küçük ölçülmüşse 5 m'lik düz yolda odometri hatası yaklaşık?
Odometri hangi hatayı hiç göremez?