Program
Geçen yıl, Genesis gerçekçi fizik simülasyonları, etkileşimli 4B dünyalar ve daha fazlasını oluşturmak için heyecan verici yeni bir araç olarak yayımlandı. Denemek için sabırsızlanıyordum, fakat çalıştırmak kolay olmadı. İtiraf etmeliyim ki kurulum sırasında epey zorlukla karşılaştım.
Bu eğitimde, kısaca karşılaştığım sorunları paylaşacağım ve sonunda Google Colab ile birkaç küçük yöntem kullanarak nasıl çalıştırabildiğimi göstereceğim.
Sadece Genesis’e genel bir bakış istiyorsanız, önceki yazıma göz atın: Genesis Fizik Motoru: Örneklerle Rehber.
Genesis ile İlk Kurulum Deneyimim
Genesis ile çalışmaya ilk başladığımda, kurulum adımlarını dokümantasyondaki gibi izledim. Hemen bağımlılıklarla ilgili sorunlara takıldım. Genesis, Taichi adlı bir modülün belirli bir sürümünü (1.7.x) gerektiriyor, ancak macOS’üm bunu desteklemiyordu. Bilgi için; Mac’im 8 yıllık….
Biraz araştırma yaptıktan sonra, daha iyi bilgisayarlara sahip kullanıcıların bile aynı sorunları yaşadığını fark ettim. Saatler süren uğraşlar ve Genesis’in yalnızca belirli Python sürümleriyle çalıştığını keşfetmemin ardından sonunda yükleyebildim.
Ama yeni sorunlar ortaya çıktı. Hiçbir şey render etmiyordu ve OpenGL ile ilgili çeşitli problemlerim vardı. GitHub’daki örnek dosyalarını çalıştırmayı denediğimde bile daha fazla hata ve çakışmayla karşılaştım.
Sorunları çözdüğümü sandığımda ise “uniform not found” gibi hatalar almaya başladım; bu da bazı render ayarlarının eksik olduğu anlamına geliyordu.
Bu süreç boyunca, başkalarının da aynı sorunlarla karşılaşıp karşılaşmadığını görmek için çevrimiçi araştırma yaptım. Yalnız olmadığım ortaya çıktı—birçok kişi aynı zorluklarla karşılaşıyordu ve pek çoğu betiklerini çalıştıracak bir çözüm bulamıyor gibiydi.
Genesis’i Çalıştırma Yolum: İmdata Google Colab
İlk hayal kırıklığının ardından, Pro hesabımla Google Colab’i denemeye karar verdim ve aradığım şeyin tam da bu olduğunu gördüm. Colab’in GPU kaynaklarını kullanarak şunları yapabildim:
- Gerekli tüm bağımlılıkları sorunsuzca kurmak.
- GPU arka ucunu kullanarak yüksek performans ve gerçekçi render elde etmek.
- Sonunda temel örnekleri çalıştırmak ve Genesis’in potansiyelini keşfetmek.
NVIDIA A100-SXM4-40GB’ı seçtim; Genesis simülasyonlarını verimli şekilde yürütmek için fazlasıyla yeterliydi.
Google Colab ortamımı kurup Genesis’i yükledikten sonra, dokümantasyondaki en basit örneği çalıştırmayı denedim:
import genesis as gs
gs.init(backend=gs.cpu)
scene = gs.Scene(show_viewer=True)
Bu örnek, Genesis’i CPU arka ucuyla başlatmalı ve temel bir sahne görüntülemeliydi. Ancak hemen şu hatayla karşılaştım:
GenesisException: No display detected. Use show_viewer=False for headless mode.
Hata mesajı, Genesis’in sahneyi render etmek için grafiksel bir pencere oluşturmaya çalıştığını ancak Google Colab’in gerçek zamanlı görselleştirmeyi desteklemediğini belirtiyor. Colab, yerel bir ekrana erişim olmayan uzak bir ortamda çalışır; bu nedenle gs.Scene() başlatımındaki show_viewer=True parametresi işe yaramaz.
Hata mesajının önerdiği gibi, görüntüleyiciyi devre dışı bırakmak için kodu değiştirdim:
scene = gs.Scene(show_viewer=False)
Bu, betiğin çökmeden çalışmasına izin verdi. Ancak bu yaklaşım, sonuçları doğrudan görselleştirmenin bir yolu olmadığı anlamına geliyordu.
Çevrimiçi baktığımda, başkalarının da aynı sorunla karşılaştığını gördüm. Önerilen çözümlerin çoğu, uzak OpenGL ortamlarının yapılandırılmasını veya sanal bir ekran oluşturmak için Xvfb kullanılmasını içeriyordu. Ne yazık ki, bu yöntemleri Colab’de güvenilir şekilde çalıştıramadım; muhtemelen bağımlılık çakışmaları ve ortamın kısıtlamaları nedeniyle.
Bu noktada, daha pratik bir geçici çözüme ihtiyacım vardı!
Gerçek zamanlı render Colab’de mümkün olmadığından, çıktıyı kare kare görüntü olarak kaydetmeye karar verdim. Bu fikirlerle, daha sonra bir animasyona dönüştürülebilecek bir dizi görüntü oluşturabildim.
Uygulama ve Çıktılar
Bu bölümde, kodun uygulanışını ve elde ettiğim çıktıları adım adım anlatacağım.
GPU ortamını kurma
İlk olarak, Genesis’i kurdum:
pip install genesis-world
Ardından, GPU hızlandırma için CUDA arka ucuyla Genesis’i başlattım.
import genesis as gs
gs.init(backend=gs.cuda)
Aldığım çıktı şöyleydi:
[Genesis] [INFO] Running on [NVIDIA A100-SXM4-40GB] with backend gs.cuda. Device memory: 39.56 GB.
[Genesis] [INFO] 🚀 Genesis initialized. Version: 0.2.1, Seed: None, Precision: 32.
Sahneyi oluşturma ve inşa etme
Sonuçları kaydetmek için bir dizin oluşturun
İlk ihtiyacım olan şey, Genesis’in render ettiği görselleri kaydedebileceği bir klasördü.
import os
save_dir = "/content/simulation_frames"
os.makedirs(save_dir, exist_ok=True)
os.makedirs() fonksiyonu, belirtilen yolda simulation_frames adlı bir klasör oluşturur ve exist_ok=True argümanı, klasör zaten varsa hata oluşmamasını sağlar.
Böylece, simülasyondan gelen tüm kareleri ve çıktıları kaydetmek için özel bir konumum oldu.
Sahneyi başlatın
Sonra, nesneler ekleyip onlarla etkileşime girebileceğim bir sahne oluşturmam gerekiyordu.
scene = gs.Scene(show_viewer=False)
gs.Scene() yeni bir simülasyon alanı başlatır ve show_viewer=False gerçek zamanlı görselleştirmeyi devre dışı bırakır. Bu noktada, üzerine inşa etmeye hazır boş bir sahnem vardı.
Bir düzlem ve bir kutu ekleyin
Sahne hazır olunca nesneleri eklemeye başladım. Önce, zemin görevi gören bir düzlem ekledim.
plane = scene.add_entity(gs.morphs.Plane())
Düzlem, simülasyon için düz bir taban görevi görür. Varsayılan olarak sonsuzdur ve x-y ekseni boyunca düz bir şekilde yer alır.
Ardından sahneye bir kutu ekledim:
box = scene.add_entity(
gs.morphs.Box(
pos=(0, 0, 0), # Position of the box
size=(0.5, 0.5, 0.5) # Size of the box
)
)
Kutuyu (0, 0, 0) konumuna, yani sahnenin tam merkezine yerleştirdim ve boyutunu 0.5 birim genişlik, yükseklik ve derinlik olacak şekilde ayarlayarak varsayılandan daha küçük yaptım.
Artık basit bir kurulumum vardı: zemin olarak bir düzlem ve üzerinde duran bir kutu.
Bir kamera ekleyin
Sahnede olup biteni yakalamak için bir kamera ekledim.
cam = scene.add_camera(
res=(320, 240), # Resolution: 320x240 pixels
pos=(3.5, 2.0, 2.5), # Camera position
lookat=(0, 0, 0.5), # Point the camera is focused on
fov=30 # Field of view (in degrees)
)
Görüntü çözünürlüğünü 320x240 piksel olarak ayarladım; test için pratik bir seçim. Kamerayı (3.5, 2.0, 2.5) konumuna yerleştirdim; bu, sahneyi biraz yukarıdan ve yandan net bir şekilde görmesini sağladı. Kutunun odakta kalmasını garantilemek için kamerayı kutunun merkezinin biraz üstüne, (0, 0, 0.5) noktasına yönelttim. 30 derecelik görüş alanı (FOV) ile kamera sahnenin dar ve odaklı bir perspektifini yakaladı.
Sahneyi inşa edin
Sonraki adım, simülasyon ve render için sahneyi hazırlamak üzere inşa etmekti.
scene.build()
Bu adım kritik, çünkü Genesis simülasyonu optimize etmek için derleme anında (JIT) derleme kullanır. Sahneyi inşa ettiğimde Genesis şunları yaptı:
- Sahnedeki nesneler için bellek ayırdı.
- Render ve fizik hesaplamaları için GPU çekirdeklerini hazırladı.
- Simülasyonun sorunsuz çalışması için gerekli tüm veri yapılarını kurdu.
Artık her şey hazırdı—düzlemim, kutum ve kameram ayarlanmıştı ve sahne inşa edilmişti.
Render etme ve çıktıları kaydetme
Simülasyonu görselleştirmek için çıktıları kare kare render edip kaydettim. Her kare, simulation_frames dizinine bir görsel olarak yazıldı.
from PIL import Image
import numpy as np
# Render and save images
for i in range(30):
scene.step() # Advance simulation
if i % 5 == 0: # Save every 5th frame
print(f"Step {i}/30")
rgb_data = cam.render(rgb=True)
# Extract image data and save it
img_array = rgb_data[0]
img = Image.fromarray((img_array * 255).astype(np.uint8))
img.save(f"{save_dir}/frame_{i:03d}.png")
print(f"Frame {i} saved to {save_dir}")
Render işlemi sırasında, ilk birkaç karenin hızlı render edildiğini (2.297 FPS’ye kadar) gözlemledim; fakat simülasyon ilerledikçe performans düştü. FPS, 25. kareye gelindiğinde yaklaşık 0,33 FPS’ye indi. Bu, simülasyonun hesaplama karmaşıklığının artmasından veya daha büyük sahneler için GPU kaynak kısıtlarından kaynaklanıyor olabilir.
Aldığım çıktı şöyleydi:
[Genesis] [22:16:38] [INFO] Running at 2297.81 FPS.
INFO:genesis:Running at ~<2297.81>~ FPS.
Step 0/30
[Genesis] [22:16:56] [INFO] Running at 1.11 FPS.
INFO:genesis:Running at ~<1.11>~ FPS.
[Genesis] [22:16:56] [INFO] Running at 1.17 FPS.
INFO:genesis:Running at ~<1.17>~ FPS.
[Genesis] [22:16:56] [INFO] Running at 1.23 FPS.
INFO:genesis:Running at ~<1.23>~ FPS.
[Genesis] [22:16:56] [INFO] Running at 1.29 FPS.
INFO:genesis:Running at ~<1.29>~ FPS.
[Genesis] [22:16:56] [INFO] Running at 1.36 FPS.
INFO:genesis:Running at ~<1.36>~ FPS.
Frame 0 saved to /content/simulation_frames
Step 5/30
[Genesis] [22:17:14] [INFO] Running at 0.63 FPS.
INFO:genesis:Running at ~<0.63>~ FPS.
[Genesis] [22:17:14] [INFO] Running at 0.67 FPS.
INFO:genesis:Running at ~<0.67>~ FPS.
[Genesis] [22:17:14] [INFO] Running at 0.70 FPS.
INFO:genesis:Running at ~<0.70>~ FPS.
[Genesis] [22:17:14] [INFO] Running at 0.74 FPS.
INFO:genesis:Running at ~<0.74>~ FPS.
[Genesis] [22:17:14] [INFO] Running at 0.78 FPS.
INFO:genesis:Running at ~<0.78>~ FPS.
Frame 5 saved to /content/simulation_frames
Step 10/30
[Genesis] [22:17:32] [INFO] Running at 0.47 FPS.
INFO:genesis:Running at ~<0.47>~ FPS.
[Genesis] [22:17:32] [INFO] Running at 0.50 FPS.
INFO:genesis:Running at ~<0.50>~ FPS.
[Genesis] [22:17:32] [INFO] Running at 0.53 FPS.
INFO:genesis:Running at ~<0.53>~ FPS.
[Genesis] [22:17:32] [INFO] Running at 0.55 FPS.
INFO:genesis:Running at ~<0.55>~ FPS.
[Genesis] [22:17:32] [INFO] Running at 0.58 FPS.
INFO:genesis:Running at ~<0.58>~ FPS.
Frame 10 saved to /content/simulation_frames
Step 15/30
[Genesis] [22:17:49] [INFO] Running at 0.40 FPS.
INFO:genesis:Running at ~<0.40>~ FPS.
[Genesis] [22:17:49] [INFO] Running at 0.42 FPS.
INFO:genesis:Running at ~<0.42>~ FPS.
[Genesis] [22:17:49] [INFO] Running at 0.44 FPS.
INFO:genesis:Running at ~<0.44>~ FPS.
[Genesis] [22:17:49] [INFO] Running at 0.46 FPS.
INFO:genesis:Running at ~<0.46>~ FPS.
[Genesis] [22:17:49] [INFO] Running at 0.49 FPS.
INFO:genesis:Running at ~<0.49>~ FPS.
Frame 15 saved to /content/simulation_frames
Step 20/30
[Genesis] [22:18:07] [INFO] Running at 0.35 FPS.
INFO:genesis:Running at ~<0.35>~ FPS.
[Genesis] [22:18:07] [INFO] Running at 0.37 FPS.
INFO:genesis:Running at ~<0.37>~ FPS.
[Genesis] [22:18:07] [INFO] Running at 0.39 FPS.
INFO:genesis:Running at ~<0.39>~ FPS.
[Genesis] [22:18:07] [INFO] Running at 0.41 FPS.
INFO:genesis:Running at ~<0.41>~ FPS.
[Genesis] [22:18:07] [INFO] Running at 0.43 FPS.
INFO:genesis:Running at ~<0.43>~ FPS.
Frame 20 saved to /content/simulation_frames
Step 25/30
[Genesis] [22:18:24] [INFO] Running at 0.33 FPS.
INFO:genesis:Running at ~<0.33>~ FPS.
[Genesis] [22:18:24] [INFO] Running at 0.35 FPS.
INFO:genesis:Running at ~<0.35>~ FPS.
[Genesis] [22:18:24] [INFO] Running at 0.36 FPS.
INFO:genesis:Running at ~<0.36>~ FPS.
[Genesis] [22:18:24] [INFO] Running at 0.38 FPS.
INFO:genesis:Running at ~<0.38>~ FPS.
Frame 25 saved to /content/simulation_frames
Bunlar da elde ettiğim görseller:





Her görsel, kameradan görüldüğü şekliyle kutunun zaman içinde düzleme göre nasıl hareket ettiğini gösteriyor. Simülasyon adımlar hâlinde çalışır ve her adımda kutunun konumu değişir; bu da kutu hareket ediyormuş gibi görünmesini sağlar.
Bu örnek, Genesis’in basit fiziksel etkileşimleri nasıl simüle edip görüntüleyebildiğini vurguluyor. Kurulum temel olsa da sahnedeki nesnelerin davranışına dair iyi bir fikir veriyor. Ancak Genesis ile çok daha karmaşık ve gerçekçi senaryolar da rahatlıkla oluşturabilirsiniz! Bir sonraki bölümde bu yeteneklerden bazılarını inceleyeceğiz.
Genesis’i Keşfetmek: Yetenekler ve Özellikler
Nesne ve sahne oluşturma
Genesis, çeşitli nesneler ve morflar ekleyerek karmaşık sahneler oluşturmanıza olanak tanır. Nesneler, düzlemler, kutular ve küreler gibi basit şekil ögelerinden robotlar ve araziler gibi daha karmaşık varlıklara kadar uzanabilir.
Şekil Primitifleri:
- gs.morphs.Plane
- gs.morphs.Box
- gs.morphs.Cylinder
- gs.morphs.Sphere
Harici Dosya Desteği:
- MJCF: MuJoCo XML robot yapılandırmaları için gs.morphs.MJCF.
- URDF: Unified Robot Description Format dosyaları için gs.morphs.URDF.
- Mesh: .obj, .ply, .stl, .glb ve .gltf gibi 3B varlıklar için gs.morphs.Mesh.
Genesis, geometri ve duruş bilgisini kapsülleyen “morph” adlı birleşik bir kavram kullanır. Bu nesne yönelimli tasarım, varlıklarla doğrudan kendi metotları üzerinden etkileşime izin verir.
Render ve görselleştirme
Genesis’in temel güçlü yönlerinden biri, gelişmiş kamera özellikleriyle ayrıntılı görsel çıktılar üretebilmesidir. Kameralar “başsız mod”da çalışır; yani bir ekrana ihtiyaç duymadan görüntü oluşturabilirler. Düzenli renkli görüntüler (RGB), nesnelerin uzaklığını gösteren derinlik haritaları, sahnedeki farklı bölümleri etiketleyen segmentasyon maskeleri ve yüzey ayrıntılarını temsil eden normal haritalar gibi çeşitli görseller üretebilirler.
Video kaydetme
Kameraların simülasyonun her karesini otomatik olarak kaydetmesine izin vererek videolar oluşturabilirsiniz. Kaydı daha dinamik ve etkileyici kılmak için kayıt sırasında kamerayı hareket ettirebilirsiniz.
Örneğin, kareleri yakalarken kamerayı sahnenin etrafında dairesel bir yörünge üzerinde hareket edecek şekilde yapılandırabilirsiniz. cam.start_recording() işlevi kaydı başlatır ve simülasyonun her adımında kameranın konumu güncellenir. Tüm kareler yakalandığında, cam.stop_recording() videoyu "video.mp4" olarak kaydeder.
Nihai video, simülasyonun akıcı bir görünümünü sunarak nesnelerin zaman içindeki etkileşimini ve hareketini gösterir.
Yürüme/yer değiştirme görevleri için arazi üretimi
Robotik ve yapay zekâ eğitimi için farklı arazi türleri de oluşturabilirsiniz. Yerleşik arazi seçeneklerini kullanabilir veya gs.morphs.Terrain ile özel yükseklik haritaları sağlayarak kendi arazilerinizi tasarlayabilirsiniz. Bu araziler, robotların hareket kabiliyetini test etmek ve eğitmek için idealdir; Genesis’i robotik araştırmaları için harika bir araç yapar.
Genişletilebilirlik
Simülasyonlarınızı çeşitli yollarla özelleştirebilirsiniz. Nesnelere daha gerçekçi görünmeleri için gerçekçi dokular ekleyebilirsiniz. Modelleri içe aktarmak için çok sayıda dosya biçimi desteklenir; bir biçim desteklenmiyorsa eklenmesini talep edebilirsiniz. Ayrıca, kişiselleştirilmiş dosya ve ayarları kullanarak kendinize ait özel nesne şekilleri (morph’lar) oluşturabilirsiniz.
Sonuç
Bu eğitim, Genesis ile başlamanıza yardımcı olacak basit bir örnek sundu. Güçlü bu fizik motorunun nasıl çalıştığını göstermek için sahne oluşturma, nesne ekleme ve çıktıları render etme gibi temel konuları ele aldık.
Ancak bu, Genesis’in yapabileceklerinin sadece başlangıcı. Güçlü bir GPU ve yeterli bellek gibi doğru donanımla sınırsız olanaklar var. Genesis’i karmaşık robotik simülasyonlar için ya da yapay zekâ eğitimi için yüksek kaliteli veri kümeleri oluşturmak amacıyla kullanabilirsiniz. Kurulumu zahmetli olabilse de kesinlikle büyük potansiyele sahip bir araç!
Ana Rojo Echeburúa, Uygulamalı Matematik alanında doktora derecesine sahip bir yapay zeka ve veri uzmanıdır. Verileri eyleme dönüştürülebilir içgörülere çevirmeyi sever ve teknik ekipleri yönetme konusunda geniş deneyime sahiptir. Ana, müşterilerle yakın çalışarak onların iş sorunlarını çözmekten ve yenilikçi yapay zeka çözümleri geliştirmekten keyif alır. Sorun çözme becerileri ve açık iletişimiyle tanınan Ana, özellikle üretken yapay zeka olmak üzere yapay zekaya tutkuyla bağlıdır. Sürekli öğrenmeye ve etik yapay zeka geliştirmeye, ayrıca karmaşık sorunları basitleştirmeye ve teknolojiyi anlaşılır biçimde açıklamaya kendini adamıştır.

