Sine wave playback sırasında eklem hareketleri ve end-effector izi gerçek zamanlı güncelleniyor.
Bir inverse kinematics demosundan mühendislik çalışma ortamına
LinkagePy, hedef noktayı ekranda sürükleyip birkaç kolun hareketini izleten tek amaçlı bir IK demosu olarak başlamadı. Amacım, iki boyutlu mekanizma probleminin tüm temel katmanlarını aynı yerde deneyebileceğim bir mühendislik aracı geliştirmekti: geometriyi ve bağlantı topolojisini kurmak, mekanizmanın geçerliliğini denetlemek, bilinen eklem değerlerinden konumları hesaplamak, bir end-effector hedefi için gerekli eklem değerlerini çözmek ve ortaya çıkan hareketi zaman alanında analiz etmek.
Bu nedenle ürünün merkezinde yalnızca bir canvas değil, yeniden kullanılabilir bir kinematik çekirdek bulunuyor. Arayüz bu çekirdeğin üzerine kurulmuş bir çalışma yüzeyi. Kullanıcı mekanizmayı düzenlediğinde veri modeli değişiyor; çözücü aynı model üzerinden yeni konumları üretiyor; animasyon ve analiz katmanları da aynı sonucu görselleştiriyor. Böylece ekranda görünen her çizgi ve kontrol, ayrı bir görsel numara yerine tanımlı mühendislik verisinin karşılığı oluyor.
Mekanizma modeli ve forward kinematics
Çekirdekte nokta, eklem, bağlantı ve mekanizma kavramlarını birbirinden ayırdım. Eklem modeli konum, tip, açı, deplasman, sabitlik durumu ve hareket limitlerini taşıyor; link modeli iki joint arasındaki fiziksel bağlantıyı ve uzunluğu tanımlıyor. Mechanism sınıfı bu elemanları bir grafik olarak tutuyor, ground jointleri belirliyor, bağlantıları sorguluyor ve çözümden önce topolojinin geçerli olup olmadığını kontrol ediyor. Serbestlik derecesi hesabı da Grübler yaklaşımıyla aynı model üzerinden yapılıyor.
Forward Kinematics çözücüsü sabit ground jointlerden başlayan bir breadth-first traversal uyguluyor. Her bağlantıda bir sonraki eklemin tipi okunuyor: revolute joint için bağlantı uzunluğu ve açıdan yeni uç noktası, prismatic joint için tanımlı eksen ve deplasmandan etkin uzunluk hesaplanıyor. Sonuç, tüm joint kimliklerini iki boyutlu Point2D konumlarına eşleyen bir çözüm haritası. Bu harita canvas çiziminden hız analizine kadar diğer katmanların ortak, deterministik veri kaynağı oluyor.
Sol panel topolojiyi, sağ panel seçili jointin sayısal değerlerini; orta canvas ise mekanizmanın geometrik karşılığını gösteriyor.
Jacobian ve Damped Least Squares ile inverse kinematics
Inverse Kinematics katmanında hedef, seçilen end-effector jointini verilen X–Y koordinatına taşıyacak eklem açılarını bulmak. Çözücü her iterasyonda önce forward kinematics ile mevcut uç konumunu hesaplıyor, hedef ile arasındaki hata vektörünü ölçüyor ve hata toleransın altına indiğinde yakınsamayı tamamlıyor. Jacobian matrisi, her eklem açısını küçük bir epsilon kadar değiştirip uç noktanın tepkisini ölçen sayısal sonlu fark yöntemiyle elde ediliyor.
Güncelleme adımında klasik pseudoinverse yerine Damped Least Squares kullanıyorum: `Δθ = Jᵀ (J Jᵀ + λ²I)⁻¹ e`. Damping terimi, mekanizma tekil veya tekile yakın bir konfigürasyona geldiğinde matris çözümünü daha kararlı tutuyor. Hesaplanan her açı ilgili jointin minimum ve maksimum limitlerinden geçiriliyor; maksimum iterasyon, hata toleransı, damping ve Jacobian epsilon değerleri çözücünün açık parametreleri. Çözüm sonunda yakınsama durumu, iterasyon sayısı ve son hata saklanıyor. Bu yaklaşım bana yalnızca çalışan bir hedef takibi değil, başarısız veya zor geometrilerde davranışı gözlemleyebildiğim kontrollü bir deney ortamı sağladı.
Etkileşimli stüdyo ve düzenleme akışı
PySide6 ile geliştirdiğim masaüstü arayüzü üç ana çalışma katmanına ayrılıyor. Ortadaki koyu grid canvas mekanizmayı, jointleri, end-effector hedefini ve hareket izlerini çiziyor. Joints çekmecesi mekanizmadaki elemanları aramayı, seçmeyi, eklemeyi veya kaldırmayı sağlıyor. Properties çekmecesi seçili jointin X–Y konumu, açısı, minimum–maksimum limitleri ve bağlı link bilgilerini sayısal olarak düzenlemeye açıyor. Üst çubukta proje adı, görünüm panelleri, ayarlar ve kayıt; altta ise simülasyonun bütün zaman ve hedef parametreleri bulunuyor.
Düzenleme komutlarını undo/redo çalışabilecek bir command stack üzerinden ele aldım. Canvas etkileşimi ile model mutasyonu aynı sınıfa yığılmıyor; kullanıcı hareketi bir komuta, komut mekanizma durumundaki kontrollü değişikliğe dönüşüyor. Kaydetme ve yükleme katmanı mekanizma verisini JSON olarak serileştiriyor. Böylece uygulama yalnızca hazırlanmış örnekleri oynatmıyor; yeni mekanizmaların oluşturulabildiği, kapatılıp yeniden açılabildiği gerçek bir editör davranışı sunuyor.
Açı, hız, ivme ve IK hatası aynı zaman ekseninde izlenerek mekanizma davranışı görsel sonuçtan sayısal analize taşınıyor.
Hareket üretimi, waypointler ve zaman alanı analizi
Animation Controller mekanizmayı yalnızca sabit bir hedefe götürmek yerine farklı zaman tabanlı senaryolarda çalıştırıyor. Sine Wave modu motor jointlerine faz farkıyla periyodik açı üretirken Pendulum modu yerçekimi, damping ve etkin bağlantı uzunluğunu kullanarak sarkaç davranışı hesaplıyor. Desired Location, Orbit ve Sweep modları ise hedef noktasını kontrollü bir dinamik sistem üzerinden sabit konuma, eliptik yörüngeye veya tarama yoluna taşıyor. Hız, genlik, süre, loop, orbit yarıçapı ve yüksekliği arayüzden anlık değiştirilebiliyor.
Waypoint sistemi kullanıcının birden fazla X–Y hedefini ve her geçişin süresini tanımlamasına izin veriyor. Noktalar alt araç çubuğundan eklenebiliyor, ayrı timeline editöründe düzenlenebiliyor ve path dosyası olarak kaydedilip tekrar yüklenebiliyor. Analiz paneli seçilen joint için açı, hız ve ivmeyi; çözücü için IK error değerini zaman serisi halinde gösteriyor. Canvas üzerindeki locus trail ile grafiklerdeki sayısal tarihçe aynı koşunun iki farklı okuması: biri hareketin uzaydaki izini, diğeri sistemin zamana verdiği cevabı açıklıyor.
Gerçek zamanlı uygulama mimarisi
Numerik çözüm ile Qt arayüz döngüsünü birbirinden ayırmak ürünün kullanılabilirliği için kritik bir karardı. IK işlemleri solver thread üzerinde yürütülüyor; giriş durumu çözücüye aktarılıyor ve sonuç sinyal üzerinden ana UI katmanına dönüyor. Böylece kullanıcı hedefi hareket ettirirken ağır hesap doğrudan paint veya input eventini bloke etmiyor. Canvas, kontrol paneli ve analiz görünümü yalnızca tamamlanmış durumları tüketiyor.
Pydantic modelleri mekanizma verisinin sınırlarını açık tutarken NumPy lineer cebir ve vektör hesaplarını üstleniyor; pyqtgraph ise zaman serisi grafiklerini çiziyor. Bu ayrım projeyi hem test edilebilir hem de genişletilebilir kılıyor: geometri ve çözücüler Qt olmadan doğrulanabiliyor, UI aynı matematiksel sözleşmeleri kullanıyor. Yeni bir hareket modu eklemek çizim kodunu, yeni bir grafik eklemek de mekanizma modelini yeniden yazmayı gerektirmiyor.
Başlangıç yüzeyi yeni mekanizma oluşturmayı, örneklerle keşfetmeyi ve son çalışmalara dönmeyi tek yerde topluyor.
Test edilmiş bir hesaplama çekirdeği
Bu projede görsel sonucun ikna edici olması tek başına yeterli değildi; kinematik araçta güven, aynı girdinin doğru ve tekrar üretilebilir sonuca ulaşmasına bağlı. Test kapsamı geometri işlemlerini, joint ve link doğrulamalarını, mekanizma topolojisini, forward ve inverse çözücüleri, joint limitlerini, singularity davranışını, animasyon kontrolünü, komut geçmişini, persistence round-tripini, analiz bufferlarını ve UI ile çekirdek arasındaki temel sözleşmeleri kapsıyor.
Portfolyoya eklerken projeyi temiz bir Python 3.12 ortamında yeniden kurup mevcut test paketini çalıştırdım: 60 test geçti. Bunun yanında playback sırasında gerçek hareket üretimini, mekanizmanın kaydedilip kayıpsız geri yüklenmesini ve grafik buffer sınırını kontrol eden üç smoke acceptance senaryosu da başarılı oldu. LinkagePy benim için mekanik düşünceyi, lineer cebiri, gerçek zamanlı arayüz geliştirmeyi ve doğrulanabilir yazılım mimarisini aynı üründe birleştirdiğim kapsamlı bir mühendislik çalışması oldu.