Kanca
Bu ders bir simülasyonun ekranda gördüğün kısmıyla arka planda hesaplanan
kısmını ayırıyor. Aşağıdaki sahnede engelleri sürükleyip yeniden planlat:
değişen şey görüntü değil, altta çalışan çarpışma ve arama hesabı.
PyBullet'te de ayrım aynıdır — stepSimulation() çağrılmadıkça sahne
zamanda ilerlemez, çizim ne kadar akıcı olursa olsun.
Ya şunu denesen? Bir engelin boyutunu iki katına çıkarsan planlayıcılar hâlâ yol bulur mu?
Nasıl hesaplandı?Tablodaki yol uzunluğu, ham (x, y) nokta dizisinin toplam mesafesidir — dizinin kendisi burada.
Her algoritmanın döndürdüğü PlanResult.path, ardışık (x, y) noktalarından oluşur; yukarıdaki tablonun “Yol uzunluğu” sütunu bu dizideki ardışık noktalar arası mesafelerin toplamıdır (pathLength, lib/robotics/planners).
Ne oldu
PyBullet, Bullet fizik motorunun Python arayüzü — oyunlar, görsel efekt, robotik ve pekiştirmeli öğrenme için katı cisim dinamiği (rigid body dynamics) ve çarpışma algılama (collision detection) sağlayan, URDF dosyalarını doğrudan yükleyebilen bir kütüphane.
Bu platformun reference-python/ klasöründeki backend/simulation/scene.py
dosyası bir sahnenin nasıl adım adım kurulduğunu gösteriyor:
def connect(gui: bool = False) -> int:
mode = p.GUI if gui else p.DIRECT
client_id = p.connect(mode)
p.setAdditionalSearchPath(pybullet_data.getDataPath())
p.setGravity(0, 0, -9.8)
p.loadURDF("plane.urdf")
return client_id
Üç ayrı karar burada görünür:
- GUI ve DIRECT modu:
p.GUIbir pencere açıp sahneyi anlık çizer — insan gözlemi için ama yavaş.p.DIRECThiçbir pencere açmaz, sadece hesaplar. Testlerde ve otomatik çalıştırmalarda daimaDIRECTkullanılır (bkz.reference-python/CLAUDE.md) — çizmenin kendisi zaman alır, hesabın doğruluğunu etkilemez. - Yerçekimi:
setGravity(0, 0, -9.8), z ekseninde dünya yerçekimi ivmesini (yaklaşık 9.8 m/s²) tanımlar. Bu bir ivme vektörüdür, kuvvet değil — cisme etkiyen kuvvet, kütlesiyle çarpılarak çıkar (bu yüzdenbaseMass=0verilen cisim yerçekiminden etkilenmez). Bu satır olmadan sahnedeki hiçbir cisim düşmez. - Zemin:
plane.urdf, PyBullet'in kendi paketiyle gelen hazır bir düzlem modeli — sahnenin "yer" referansı.
Robot ise ayrı bir çağrıyla, sabit tabanlı olarak yüklenir:
def load_robot() -> int:
return p.loadURDF("kuka_iiwa/model.urdf", useFixedBase=True)
useFixedBase=True, robotun tabanının dünyaya sabitlendiği (bir mobil
robot gibi yerde kaymadığı) anlamına gelir — sabit tabanlı bir endüstriyel
kol için doğru varsayım.
Engeller farklı bir mantıkla eklenir. backend/simulation/obstacles.py
içindeki add_obstacle, her engeli baseMass=0 ile oluşturur:
return p.createMultiBody(
baseMass=0,
baseCollisionShapeIndex=collision_shape,
baseVisualShapeIndex=visual_shape,
basePosition=obstacle.center,
)
Kütlesi sıfır olan bir cisim PyBullet'in fizik motorunda hiç hareket etmez — sabit (statik) kalır. Bu, engellerin robot tarafından itilip kaydırılamayacağını garantiler.
Önemli ayrım: Bu platformdaki (ve reference-python'daki) yol
planlayıcılar (A*, RRT, RRT*), PyBullet'in TAM fizik/temas hesabını
KULLANMAZ — arama sırasında her aday nokta, çok daha hızlı bir geometrik
testle kontrol edilir (is_collision_free, is_path_segment_free; bu
platformun TypeScript karşılığı lib/robotics/collision.ts içindeki
isPointFree ve isSegmentFree). Yukarıdaki sahnede "Çalıştır"a
bastığında çalışan tam olarak bu geometrik kontrol — PyBullet'in kendisi
bu platformda tarayıcı tarafında hiç çalışmıyor (bkz.
docs/02-mimari.md "hesaplama tarayıcıda yapılır"). reference-python
tarafında PyBullet çalışıyor, ama orada da çarpışma kararını o
vermiyor: depo, engelleri PyBullet sahnesine yalnızca görselleştirme
için ekler, kararı aynı bağımsız geometrik testle üretir (bkz.
reference-python/docs/architecture.md).
Gerçek dünyada
PyBullet, robotik araştırmalarında ve pekiştirmeli öğrenme (reinforcement
learning) deneylerinde yaygın kullanılan açık kaynaklı bir araç — gerçek
donanım kırılmadan önce bir kontrol algoritmasını binlerce kez ücretsiz
"denemeye" izin verir. Bu platformun kendi reference-python/ projesi
tam olarak bu amaçla kurulmuş: KUKA iiwa'yı gerçek geometrisiyle (URDF
üzerinden) yükleyip planlanan yolu gözle görülebilir bir sahnede
oynatıyor. Doğrulamanın kendisi orada da geometrik testle yapılıyor —
fizik motoru sahneyi gösteriyor, kararı vermiyor. İkisini ayırmak
önemli: bir simülatörün ekranda bir şey göstermesi, o şeyi doğruladığı
anlamına gelmez.
Dene
Sahneye birkaç engel ekle, sonra "Çalıştır"a bas. A*'ın bulduğu yolun engellerin gerçekten dışından geçtiğini gözlemle. Şimdi bir engeli başlangıç noktasının tam üstüne koy — planlayıcının hâlâ bir yol bulup bulamadığına, bulamıyorsa ne kadar sürede "başarısız" sonucuna vardığına bak.
Kaynak kodu: connect, add_obstacle, isPointFree
Sonraki
Bir sahne kurup fiziğini gördün. Sıradaki ders, bu simülasyonun endüstride "dijital ikiz" denen kavramla aynı şey olup olmadığını — ve neden olmadığını — ele alıyor.