Okullar için Robotik ve Mühendislik · anaokulundan liseye

8. ünite / 10 · 4 saat

Çarpışmasız yörünge: çarpışma denetimi ve RRT ile planlama

Kolu ve engelleri basit geometriyle modelle, bir duruşun çarpışıp çarpışmadığını sına ve eklem uzayında RRT-Connect ile engelin etrafından yol bul.

Bu ünitenin sonunda

  • Uzuvları kapsül, engelleri kutu olarak modelleyip çarpışmayı denetlemek
  • Konfigürasyon uzayı fikrini ve doğrudan hareketin neden çarpışabildiğini açıklamak
  • RRT-Connect algoritmasının adımlarını izlemek
  • plan komutunun sonucunu (yol, düğüm, yineleme) yorumlamak

Ders notları

Çarpışma modeli

Gerçek şekiller yerine basit geometri kullanırız. Her uzuv bir kapsüldür (doğru parçası + yarıçap: 0,08; 0,065; 0,055; 0,025 m), engeller eksen hizalı kutulardır. Kapsül–kutu testi kutuyu yarıçap kadar şişirip doğru parçasını kesiştirir (slab yöntemi). Masa ve engeller her uzuv için denetlenir, yasak bölgeler de. Hızlıdır, hafif tutucudur (kutu köşeleri yuvarlanmaz) ve gerçek bir hücrede yerini üreticinin hücre modeline bırakır.

Konfigürasyon uzayı

Kolun bütün durumu altı eklem açısıdır; her duruş altı boyutlu bir uzayda bir noktadır. Çarpışan duruşlar bu uzayda yasak bölgeler oluşturur. PTP, iki nokta arasındaki doğru çizgiyi bu uzayda izler; çizgi yasak bir bölgeden geçebilir. Duvarlı hücrede A'nın üstünden B'nin üstüne PTP, hareketin yaklaşık %41'inde ön koluna duvarla çarpışır; iki uç nokta ayrı ayrı çarpışmasız olduğu halde. Uç noktaları denetlemek yetmez, yolu da denetlemelisin.

RRT-Connect

Eklem uzayında iki ağaç büyütülür: biri başlangıçtan, biri hedeften. Her yinelemede rastgele bir duruş seçilir (yüzde 15'i doğrudan hedeftir); bir ağaç ona doğru 0,35 radyanlık bir adım atar (kenar çarpışmasızsa). Sonra öbür ağaç, yeni düğüme ulaşana ya da bir engele çarpana kadar ona doğru uzar. Ulaşırsa iki ağaç birleşmiş ve yol bulunmuştur. Ardından kısayol düzleştirme: iki düğüm arasındaki doğrudan kenar çarpışmasızsa aradaki düğümler atılır.

  • Sonuç tohumlanır: aynı tohum aynı yolu verir, bu yüzden test edilebilir ve tekrar edilebilir.
  • Duvarlı hücrede (tohum 1) çözüm 6 yinelemede bulunur; ham yol 7, düzleştirilmiş yol 3 düğümdür.
  • Yol bulunamazsa plan-failed: bu "yol yok" demek değildir, "bütçe içinde bulunamadı" demektir (algoritma olasılıksal tamdır).

Yol eklem uzayında bir dizi duruştur; plan komutu onu tek bir yamuk profille zamanlar ve sahnede oynatır. Planlanan yolda çarpışma olmadığı kare kare doğrulanır (testte).

Simülasyon

Öğretim modeli: sanal kol bu dersin kendi modelidir. Uzuv ölçüleri, eklem sınırları, hız ve ivme değerleri ve güvenlik eşikleri bu sayfadaki kodda tanımlı ders sabitleridir; hiçbir robot üreticisinin ürünü, dili ya da eğitim içeriği değildir ve ders resmî bir üretici eğitimi değildir. Gerçek bir hücrede ölçüler üreticinin belgelerinden, güvenlik değerleri risk değerlendirmesinden gelir.

Çarpışmasız yol planlama: duvar, RRT-Connect, tohum

A'nın üstünden B'nin üstüne giderken arada bir duvar var. Doğrudan PTP'nin hangi oranda, hangi uzuvla çarptığını gör; sonra RRT-Connect ile çarpışmasız yol bul. Duvar yüksekliği, tohum ve yineleme bütçesi ayarlanır; düğüm, yineleme ve yol sayısı okunur.

Kendin dene

Planlama simülasyonunda duvar yüksekliğini 0,42 m'de bırakıp "doğrudan PTP"yi dene: hareketin hangi oranında, hangi uzuvla çarptığını oku. Sonra "Planla"ya bas ve düğüm, yineleme, ham ve düzleştirilmiş yol sayısını yaz. Tohumu değiştir: yol farklı mı, hâlâ çarpışmasız mı? Son olarak yineleme bütçesini 2'ye indir ve plan-failed iletisini gör.

Kod

ArmScript bloklarını ArmScript simülasyonuna yapıştırıp tarayıcında çalıştırabilirsin. Python blokları yalnızca standart kütüphane kullanır; kendi bilgisayarında çalıştır.

Python: uzuv (doğru parçası) ile kutu çarpışması
def seg_hits_box(a, b, lo, hi, pad):
    t0, t1 = 0.0, 1.0                    # doğru parçasının kutu içinde kaldığı [t0, t1] aralığı
    for i in range(3):
        d = b[i] - a[i]
        l, h = lo[i] - pad, hi[i] + pad  # kutuyu uzuv yarıçapı kadar şişir
        if abs(d) < 1e-12:
            if a[i] < l or a[i] > h:
                return False
            continue
        u, v = (l - a[i]) / d, (h - a[i]) / d
        if u > v:
            u, v = v, u
        t0, t1 = max(t0, u), min(t1, v)
        if t0 > t1:
            return False
    return True
print(seg_hits_box((-1, .5, .5), (2, .5, .5), (0, 0, 0), (1, 1, 1), 0))      # True: içinden geçer
print(seg_hits_box((-1, 1.05, .5), (2, 1.05, .5), (0, 0, 0), (1, 1, 1), 0))  # False: yanından geçer
Python: RRT-Connect (2B oyuncak dünyada)
import math, random
def rrt_connect(start, goal, free, step=0.1, iters=2000, lo=(0, 0), hi=(1, 1)):
    def dist(p, q): return math.hypot(p[0] - q[0], p[1] - q[1])
    def toward(p, q):
        d = dist(p, q)
        return q if d <= step else (p[0] + (q[0] - p[0]) * step / d, p[1] + (q[1] - p[1]) * step / d)
    def edge_free(p, q):                 # kenarı küçük adımlarla denetle
        n = max(1, int(dist(p, q) / 0.02))
        return all(free((p[0] + (q[0] - p[0]) * i / n, p[1] + (q[1] - p[1]) * i / n)) for i in range(n + 1))
    def extend(tree, target):
        i = min(range(len(tree)), key=lambda k: dist(tree[k][0], target))
        q = toward(tree[i][0], target)
        if not edge_free(tree[i][0], q):
            return None
        tree.append((q, i))
        return len(tree) - 1
    def chain(tree, i):
        out = []
        while i is not None:
            out.append(tree[i][0]); i = tree[i][1]
        return out
    a, b = [(start, None)], [(goal, None)]   # biri başlangıçtan, biri hedeften büyür
    for _ in range(iters):
        ia = extend(a, (random.uniform(lo[0], hi[0]), random.uniform(lo[1], hi[1])))
        if ia is not None:
            while True:                  # öbür ağacı yeni düğüme doğru ısrarla uzat
                ib = extend(b, a[ia][0])
                if ib is None: break
                if dist(b[ib][0], a[ia][0]) < 1e-9:
                    path = chain(a, ia)[::-1] + chain(b, ib)[1:]
                    return path if a[0][0] == start else path[::-1]
        a, b = b, a                      # ağaçların rolünü değiştir
    return None
random.seed(1)
wall = lambda p: not (0.45 < p[0] < 0.55 and p[1] < 0.8)
print(len(rrt_connect((0.1, 0.2), (0.9, 0.2), wall)))   # 25 nokta (tohum 1)
ArmScript: duvarın üstünden taşımak için plan
# A ile B arasında duvar var: yük taşırken plan kullan
var ust_a = pose(0.55, -0.32, 0.25)
var al_a = pose(0.55, -0.32, 0.03)
var ust_b = pose(0.55, 0.32, 0.25)
var koy_b = pose(0.55, 0.32, 0.03)
open
plan ust_a         # çarpışmasız yol iste
lin al_a
close
lin ust_a
plan ust_b         # duvarın üstünden ya da çevresinden
lin koy_b
open
lin ust_b
print "bitti, parça B'de"

Sık yapılan hatalar

  • Yalnızca uç noktaları denetlemek: doğrudan yol bir engelin içinden geçebilir.
  • Çarpışma modelini sonsuz hassas sanmak: kapsül ve kutu bir yaklaşıktır, gerçek hücrede güvenlik payı bırak.
  • plan-failed'i "çözüm yok" saymak: bütçeyi artır ya da tohumu değiştir, sonra karar ver.
  • Planlı yolu zamanlamayı unutmak: eklem uzayı yolu hız ve ivme sınırlarıyla yürütülmelidir.

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

Rastgele bir algoritmayı tohumlayarak belirlenimli yap ve özellik testleriyle sına: "yol bulunursa bütün kenarlar çarpışmasızdır", "aynı tohum aynı yol", "düzleştirme yolu uzatmaz".

  • Bütçe bitince nedenle birlikte başarısız ol (no-path, start-invalid, goal-invalid); çağıran taraf farkı bilsin.
  • Süreyi ve düğüm sayısını raporla: planlayıcı performansı bir gereksinimdir.

Kendini sına

  1. Bu derste uzuvlar çarpışma için nasıl modellenir?

  2. İki uç nokta çarpışmasızken PTP neden yine de çarpışabilir?

  3. RRT-Connect neden iki ağaç büyütür?

  4. plan-failed iletisi ne demektir?

Bu üniteden sonra bitirme projesinde

Macademia'da ilgili

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
  • Drone dersiBüyükler için: parça, simülasyon, yazılım; 10 üniteSayfa
  • 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ç