Macademia'nın robotik ve mühendislik programı · ücretsiz seviye tespiti ve kişisel öğrenme yolu

7. hafta / 14

Mobil robot ve manipülatör kinematiği

Araçlar: Python (NumPy, Matplotlib), bu platform

Bu haftanın sonunda

  • Diferansiyel sürüşün ileri ve ters kinematiğini türetmek
  • Enkoder tiklerinden pozu hesaplamak (odometri)
  • Odometrinin neden kaydığını (drift) açıklamak
  • Düzlemsel bir kolun ileri kinematiğini hesaplamak
  • İki uzuvlu ters kinematiği çözmek ve çoklu çözümleri ele almak
  • Bir eklemi Denavit–Hartenberg parametreleriyle tanımlamak

Ders notları

Kinematik, hareketi hangi kuvvetlerin oluşturduğunu sormadan tanımlar. Diferansiyel sürüşlü (differential drive) bir robotun, aralarında tekerlek açıklığı L bulunan, bağımsız olarak sürülen iki tekerleği vardır. Bu robot holonomik olmayan (non-holonomic) bir sistemdir: doğrudan yana doğru hareket edemez.

İleri kinematik (forward kinematics)

v = (vR + vL) / 2     ω = (vR − vL) / L     R = v / ω

Robot, anlık dönme merkezi (instantaneous centre of rotation, ICR) etrafında döner; bu merkez robottan R uzaklıktadır. Eşit tekerlek hızları düz bir çizgi verir (R = ∞); zıt hızlar robotu yerinde döndürür (R = 0).

ẋ = v cos θ    ẏ = v sin θ    θ̇ = ω

Ters kinematik (inverse kinematics)

Planlayıcılar ve ROS, genellikle bir Twist mesajı olarak istenen (v, ω) değerini üretir. Bunu tekerlek hızlarına dönüştürün:

vR = v + ωL/2     vL = v − ωL/2

Odometri ve kayma

Enkoder okumalarının integrali alınarak bir poz kestirimi elde edilir. Küçük hatalar (eşit olmayan tekerlek yarıçapları, patinaj, yanlış tekerlek açıklığı) özellikle yönelimde sınırsızca birikir. Robotların dış referanslara ve konumlandırmaya (localization) ihtiyaç duymasının nedeni budur (9. hafta).

Diğer sürüş türleri: Ackermann direksiyonu (otomobiller), mekanum ve omni tekerlekler (holonomik, yana hareket edebilir), paletli ve bacaklı robotlar.

Ek okuma: manipülatör kinematiği

Manipülatör, eklemlerle (döner veya prizmatik) birbirine bağlanmış rijit uzuvlardan (links) oluşan bir zincirdir. Bağımsız eklemlerin sayısı, serbestlik derecesini (degrees of freedom, DOF) verir. Eklem açıları konfigürasyon uzayını oluşturur; tutucunun (gripper) konumu ise görev uzayında (task space) yer alır.

İleri kinematik (forward kinematics, FK)

x = l1 cos θ1 + l2 cos(θ1 + θ2)    y = l1 sin θ1 + l2 sin(θ1 + θ2)

Ters kinematik (inverse kinematics, IK)

Bir (x, y) hedefi verildiğinde, kosinüs teoremi dirsek açısını verir:

cos θ2 = (x² + y² − l1² − l2²) / (2 l1 l2)
θ1 = atan2(y, x) − atan2(l2 sin θ2, l1 + l2 cos θ2)
  • Çoğu hedef için iki çözüm vardır (dirsek yukarı ve dirsek aşağı).
  • |l1 − l2| ≤ r ≤ l1 + l2 çalışma alanı halkasının dışında çözüm yoktur.
  • θ2 = 0° veya 180° olduğunda kol tekil (singular) konumdadır: bir yönde hareket etme yeteneğini kaybeder.

DH parametreleri ve dönüşümler

Daha çok eklemi olan kollar için 4×4 homojen dönüşümleri zincirleriz. Denavit–Hartenberg gösterimi her eklemi dört sayıyla (a, α, d, θ) tanımlar. Tabandan uca kadar dönüşümleri çarpmak tam FK'yı verir. Hızlar Jacobian ile ilişkilendirilir: ẋ = J(q) q̇.

Derinlemesine

Çözümlü örnek: bir odometri güncellemesi

Tekerlek yarıçapı r = 0,033 m, tekerlek açıklığı L = 0,160 m ve tekerlek turu başına 4096 enkoder tiki olan küçük bir diferansiyel sürüşlü robot alalım (Webots ve Gazebo'daki TurtleBot3 Burger bu değerleri kullanır). 0,1 s'lik bir çevrimde sol enkoder 400, sağ enkoder 600 tik ilerliyor:

ΔsL = 2π · 0.033 · 400 / 4096 = 0.02025 m    ΔsR = 2π · 0.033 · 600 / 4096 = 0.03037 m
Δs = (ΔsR + ΔsL) / 2 = 0.02531 m    Δθ = (ΔsR − ΔsL) / L = 0.0633 rad (3.63°)

(0, 0, 0) noktasından başlayarak adımın ortasındaki yönelimi kullanın:

x += Δs cos(θ + Δθ/2) = 0.02530 m    y += Δs sin(θ + Δθ/2) = 0.00080 m    θ += Δθ

Orta nokta kuralı, güncelleme hızı düşük olduğunda veya robot keskin döndüğünde eski yönelimi kullanmaktan (basit Euler) çok daha doğrudur; tam yay formülü üçüncü seçenektir. θ'yı her zaman (−π, π] aralığına geri sarın.

Kayma gerçekte nereden gelir?

Rastgele patinaj kısmen ortalamada kaybolur; sistematik hatalar kaybolmaz. Koddaki tekerlek açıklığı %1 küçükse her dönüş %1 fazla hesaplanır: yerinde on turdan sonra yönelim 36° sapar. Ardından yön hatası mesafeyle orantılı bir konum hatasına dönüşür: 10 m düz sürüşte 1°'lik yön hatası 10 × 0,01745 ≈ 0,17 m yanal hata verir. Borenstein'ın UMBmark testi (4 m'lik bir kareyi saat yönünde ve tersinde sürüp bitiş noktalarını karşılaştırmak), eşit olmayan tekerlek çaplarını yanlış tekerlek açıklığından ayırır; böylece ikisini de kalibre edebilirsiniz.

Çözümlü örnek: iki uzuvlu ters kinematik

l1 = 0,30 m, l2 = 0,20 m ve hedef (0,35, 0,15) m olsun. Bu durumda r² = 0,145 ve

cos θ2 = (0.145 − 0.09 − 0.04) / (2 · 0.3 · 0.2) = 0.125 → θ2 = ±82.8°

θ2 = +82,8° için:

θ1 = atan2(0.15, 0.35) − atan2(0.1984, 0.325) = 23.2° − 31.4° = −8.2°

Diğer çözüm θ2 = −82,8°, θ1 = 54,6°'dir. İkisi de ileri kinematiğe geri konduğunda (0,35, 0,15) verir. Jakobiyen determinantı det J = l1 l2 sin θ2 = 0,0595 m²'dir, sıfırdan rahatça uzaktır. θ2 0°'ye yaklaştıkça det J sıfıra yaklaşır ve makul bir tutucu hızı için gereken eklem hızları q̇ = J⁻¹ ẋ patlar: gerçek bir kolda tekilliğin (singularity) hissettirdiği şey budur.

Arabalar farklıdır

Webots aracı Ackermann direksiyonu kullanır: R yarıçaplı bir dönüş için direksiyon açısı δ = atan(dingil mesafesi / R) olur. 0,26 m dingil mesafesi ve R = 1 m ile δ ≈ 14,6°'dir. Bir araba yerinde dönemez, bu yüzden planlayıcılar en küçük dönüş yarıçapına uymak zorundadır.

Simülasyonlar

Diferansiyel sürüş kinematiği

Tekerlek hızlarını ayarla ve robotun anlık dönme merkezi (ADM, ICR) etrafında dönüşünü izle. Kesikli robot odometri tahminidir: tekerlekleri kusursuz sayar, oysa gerçek tekerleklerde küçük bir yarıçap hatası vardır.

İki eklemli kol kinematiği

Hedefi taşımak ve ters kinematiği çözmek için tuvalde sürükle, ya da ileri kinematiğe geçip eklem açılarını kendin ayarla. Gölgeli halka erişilebilir çalışma alanıdır.

Kod

Python: tekerlek yolundan odometri güncellemesi
import math

TICKS_PER_REV, WHEEL_R = 360, 0.033          # enkoder, metre
TICKS_TO_M = 2 * math.pi * WHEEL_R / TICKS_PER_REV

def odom_step(x, y, th, dl, dr, L):
    """dl, dr: her tekerleğin son adımdan bu yana aldığı yol (m)."""
    dc = (dr + dl) / 2.0
    dth = (dr - dl) / L
    x += dc * math.cos(th + dth / 2)          # orta nokta integrasyonu
    y += dc * math.sin(th + dth / 2)
    th = (th + dth + math.pi) % (2 * math.pi) - math.pi
    return x, y, th
Python: FK, IK ve bir DH dönüşümü
import numpy as np

L1, L2 = 0.15, 0.11

def fk(q1, q2):
    x = L1*np.cos(q1) + L2*np.cos(q1 + q2)
    y = L1*np.sin(q1) + L2*np.sin(q1 + q2)
    return x, y

def ik(x, y, elbow_up=True):
    D = (x**2 + y**2 - L1**2 - L2**2) / (2*L1*L2)
    if abs(D) > 1:
        raise ValueError("target out of reach")
    q2 = np.arccos(D) * (-1 if elbow_up else 1)
    q1 = np.arctan2(y, x) - np.arctan2(L2*np.sin(q2), L1 + L2*np.cos(q2))
    return q1, q2

def dh(a, alpha, d, theta):
    ca, sa, ct, st = np.cos(alpha), np.sin(alpha), np.cos(theta), np.sin(theta)
    return np.array([[ct, -st*ca,  st*sa, a*ct],
                     [st,  ct*ca, -ct*sa, a*st],
                     [0,      sa,     ca,    d],
                     [0,       0,      0,    1]])

Sık yapılan hatalar

  • sin ve cos fonksiyonlarına radyan yerine derece vermek.
  • atan2(y, x) yerine atan(y / x) kullanmak; θ1 yanlış çeyreğe düşer.
  • Yönelimi (−π, π] aralığına sarmamak; denetleyici uzun yoldan döner.
  • Yuvarlama nedeniyle 1'in biraz üstüne çıkmış bir değerin acos'unu almak; NaN döner, önce [−1, 1] aralığına kırpın.
  • Geniş bir lastikte tekerlek açıklığını yanlış ölçmek ve sürekli büyüyen bir yön hatası almak.
  • x ve y'yi orta nokta yönelimi yerine yeni yönelimle güncellemek; keskin dönüşlerde yolu sistematik olarak saptırır.

Yazılım mühendisliği bağlantısı

Kinematik kodu saf matematiktir, bu yüzden özellik tabanlı test (property-based testing) için mükemmel bir hedeftir: elle seçilmiş birkaç durum yerine Hypothesis gibi bir araç yüzlerce rastgele girdi üretir ve değişmezleri (invariants) kontrol eder.

  • Gidiş dönüş: ulaşılabilir her p noktası için fk(ik(p)), iki dirsek çözümünde de 1e-9 m içinde p'ye eşittir.
  • Simetri: eşit tekerlek tikleri Δθ = 0, zıt tikler Δs = 0 verir.
  • Gereksinim olarak kurallar: ilk günden ROS REP 103'e (SI birimleri, x ileri, y sol, z yukarı) ve REP 105 çerçeve adlarına (map, odom, base_link) uyun ve bunu README'de belirtin. Robot yazılımındaki entegrasyon hatalarının çoğu algoritma hatası değil, çerçeve veya birim uyuşmazlığıdır.

Dönem projesi uygulaması: kinematik veya odometri modülünüz için özellik tabanlı bir test paketi ekleyip CI'da çalıştırın; bulduğu her karşı örneği kalıcı bir regresyon testi olarak kaydedin.

Laboratuvar görevi

Simülatörde (a) düz giden, (b) yerinde dönen, (c) 100 px yarıçaplı bir çember çizen tekerlek hızlarını bulun. Ardından tekerlek yarıçapı hatasını %5'e ayarlayın ve tam bir turdan sonraki odometri hatasını ölçün. Rastgele seçilmiş 100 erişilebilir nokta için, her iki dirsek çözümünde de fk(ik(x, y)) ifadesinin (x, y) döndürdüğünü doğrulayın. Simülatörde iki tekil konfigürasyon bulun ve kolun o noktalarda artık neyi yapamadığını açıklayın.

Kendini sına

  1. Bir diferansiyel sürüşlü robotta L = 0,25 m, v_L = 0,2 m/s ve v_R = 0,4 m/s. Dönüş yarıçapı nedir?

  2. Bir enkoder tur başına 1200 tik veriyor ve tekerlek yarıçapı 0,05 m. Tekerlek 300 tikte ne kadar yuvarlanır?

  3. Odometride 1°'lik bir yön hatası var ve robot ardından 10 m düz gidiyor. Yanal konum hatası yaklaşık ne kadardır?

  4. İki uzuvlu bir kolda l1 = 0,3 m, l2 = 0,2 m ve θ2 = 90°. Jakobiyeninin determinantı nedir?

Ödev

(v, ω) değerini tekerlek hızlarına dönüştüren bir Python fonksiyonu yazın ve bunu kullanarak simüle edilmiş bir robotu 1 m'lik bir karenin çevresinde sürün. %2 tekerlek yarıçapı hatasıyla gerçek yolu ve odometri yolunu çizdirin. Uç işlevcinin (end effector) bir çember çizmesini sağlayın: çember üzerinde noktalar üretin, her biri için IK çözün ve kolu Matplotlib ile canlandırın. Çalışma alanının dışında kalan noktaları ele alın.

Bu haftanın donanımı (Hyvex)

Esc
  • PanelAna sayfaSayfa
  • ModüllerTüm modüllerSayfa
  • ParçalarParça ansiklopedisiSayfa
  • Mühendislik yoluBüyükler için robotik: 128 parça, 7 seviyeSayfa
  • Robotik dersi (ESOF 323)Üniversite robotik dersi, 14 haftaSayfa
  • TestlerimMini testler ve puanlarSayfa
  • Blok atölyesiSerbest blok programlamaAraç
  • Devre laboratuvarıSanal Arduino ve devreAraç
  • Robot arenasıSanal robot sürüşüAraç
  • OyunlarBloklarla 8 öğretici oyunAraç
  • Mikro Kart atölyesiSanal LED kartı bloklarla programlaAraç
  • Robot atölyesiMikro Kart'ı robota tak, bloklarla görev yapAraç