Chuyển đến nội dung chính

Genesis Physics Engine: Hướng dẫn từng bước để thiết lập Genesis

Tìm hiểu cách thiết lập và chạy Genesis Physics Engine trên Google Colab, vượt qua các vấn đề cài đặt và bắt đầu với mô phỏng vật lý.
Đã cập nhật 5 thg 10, 2026  · 12 phút đọc

Khám phá cùng AI

ChatGPTClaudePerplexity

Năm ngoái, Genesis ra mắt như một công cụ mới đầy hứa hẹn để tạo các mô phỏng vật lý chân thực, thế giới 4D tương tác và nhiều hơn nữa. Tôi rất háo hức thử, nhưng để chạy được thì không hề dễ. Phải thừa nhận là tôi đã gặp rất nhiều thách thức trong quá trình thiết lập. 

Trong hướng dẫn này, tôi sẽ chia sẻ ngắn gọn những vấn đề đã gặp, và cách tôi cuối cùng đã chạy được Genesis bằng Google Colab cùng một vài mẹo nhỏ.

Nếu bạn chỉ muốn xem tổng quan về Genesis, hãy đọc bài viết trước của tôi, Genesis Physics Engine: Hướng dẫn kèm ví dụ.

Trải nghiệm thiết lập ban đầu với Genesis

Khi bắt đầu làm việc với Genesis, tôi làm theo các bước cài đặt trong tài liệu. Ngay lập tức, tôi gặp vấn đề về phụ thuộc. Genesis yêu cầu một phiên bản cụ thể của mô-đun Taichi (1.7.x), nhưng macOS của tôi lại không hỗ trợ. Để bạn hình dung, Mac của tôi đã 8 năm tuổi….

Sau khi tìm hiểu, tôi nhận ra những người dùng khác cũng gặp các vấn đề tương tự, dù máy của họ tốt hơn. Sau nhiều giờ cố gắng, và phát hiện Genesis chỉ hoạt động với một vài phiên bản Python nhất định, tôi cuối cùng đã cài đặt được.

Nhưng vấn đề mới lại xuất hiện. Nó không render được gì, và tôi gặp một loạt lỗi liên quan đến OpenGL. Ngay cả khi chạy các tệp ví dụ từ GitHub của họ, tôi cũng vấp phải thêm lỗi và xung đột.

Rồi đến lúc tưởng như đã xử lý xong, tôi lại gặp các lỗi kiểu "uniform not found", nghĩa là một số thiết lập render bị thiếu.

Trong suốt quá trình này, tôi tìm trên mạng xem có ai gặp vấn đề tương tự không. Hóa ra tôi không phải người duy nhất—rất nhiều người gặp khó khăn tương tự, và phần lớn dường như không tìm được cách để script của họ chạy được.

Tôi đã khiến Genesis hoạt động như thế nào: Google Colab cứu nguy

Sau chuỗi thất vọng ban đầu, tôi quyết định thử Google Colab với tài khoản Pro, và đó hóa ra là đúng thứ tôi cần. Nhờ tài nguyên GPU của Colab, tôi đã có thể:

  • Cài đặt toàn bộ các phụ thuộc cần thiết mà không gặp bất kỳ trục trặc nào.
  • Dùng backend GPU để đạt hiệu năng tốt và render chân thực.
  • Cuối cùng, chạy các ví dụ cơ bản và khám phá tiềm năng của Genesis.

Tôi chọn NVIDIA A100-SXM4-40GB, đủ mạnh để xử lý các mô phỏng của Genesis một cách hiệu quả. 

Khi đã thiết lập môi trường Google Colab và cài Genesis, tôi thử chạy ví dụ đơn giản nhất trong tài liệu:

import genesis as gs
gs.init(backend=gs.cpu)
scene = gs.Scene(show_viewer=True)

Ví dụ này sẽ khởi tạo Genesis với backend CPU và hiển thị một cảnh cơ bản. Tuy nhiên, tôi ngay lập tức gặp lỗi sau:

GenesisException: No display detected. Use show_viewer=False for headless mode.

Thông báo lỗi cho biết Genesis đang cố tạo một cửa sổ đồ họa để render cảnh, nhưng Google Colab không hỗ trợ trực quan thời gian thực. Colab chạy trong môi trường từ xa không có truy cập vào màn hình cục bộ, nên tham số show_viewer=True trong khởi tạo gs.Scene() không hoạt động.

Theo gợi ý từ thông báo lỗi, tôi sửa mã để tắt viewer:

scene = gs.Scene(show_viewer=False)

Cách này cho phép script chạy mà không bị crash. Tuy nhiên, điều đó đồng nghĩa tôi không thể trực quan hóa kết quả ngay lập tức.

Sau khi tra cứu, tôi thấy nhiều người cũng gặp vấn đề tương tự. Nhiều giải pháp đề xuất cấu hình môi trường OpenGL từ xa hoặc dùng Xvfb để tạo màn hình ảo. Tiếc là tôi không thể khiến các phương pháp này hoạt động ổn định trên Colab, có lẽ do xung đột phụ thuộc và giới hạn của môi trường.

Đến lúc này, tôi cần một cách xử lý thực tế hơn!

Vì render thời gian thực không khả thi trên Colab, tôi quyết định lưu kết quả render theo từng khung hình dưới dạng ảnh. Với cách này, tôi có thể tạo một chuỗi ảnh để ghép thành hoạt hình sau đó.

Triển khai và kết quả

Trong phần này, tôi sẽ hướng dẫn bạn qua triển khai mã và các đầu ra tôi thu được.

Thiết lập môi trường GPU

Trước hết, tôi cài Genesis:

pip install genesis-world

Sau đó, tôi khởi tạo Genesis với backend CUDA để tăng tốc bằng GPU.

import genesis as gs
gs.init(backend=gs.cuda)

Đây là kết quả tôi nhận được:

[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.

Tạo và xây dựng cảnh

Tạo thư mục để lưu kết quả

Điều đầu tiên tôi cần là một thư mục để Genesis lưu các ảnh đã render. 

import os
save_dir = "/content/simulation_frames"
os.makedirs(save_dir, exist_ok=True)

Hàm os.makedirs() tạo thư mục tên simulation_frames tại đường dẫn chỉ định, và đối số exist_ok=True đảm bảo nếu thư mục đã tồn tại thì sẽ không phát sinh lỗi.

Như vậy, tôi có một nơi riêng để lưu tất cả khung hình và đầu ra của mô phỏng.

Khởi tạo cảnh

Tiếp theo, tôi cần tạo một cảnh để thêm đối tượng và tương tác với chúng.

scene = gs.Scene(show_viewer=False)

gs.Scene() khởi tạo không gian mô phỏng mới, và show_viewer=False tắt trực quan hóa thời gian thực. Lúc này, tôi đã có một cảnh trống sẵn sàng để bắt đầu xây dựng.

Thêm một mặt phẳng và một khối hộp

Khi cảnh đã sẵn sàng, tôi bắt đầu thêm đối tượng. Đầu tiên là một mặt phẳng, đóng vai trò mặt đất.

plane = scene.add_entity(gs.morphs.Plane())

Mặt phẳng là bề mặt phẳng làm nền cho mô phỏng. Mặc định, nó là vô hạn và nằm trên trục x-y.

Tiếp theo, tôi thêm một khối hộp vào cảnh:

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
    )
)

Tôi đặt khối hộp ở (0, 0, 0), ngay giữa cảnh, và chỉnh kích thước thành 0.5 đơn vị chiều rộng, cao và sâu, nhỏ hơn mặc định.

Giờ tôi đã có một thiết lập đơn giản: một mặt phẳng làm nền và một khối hộp đặt phía trên.

Thêm camera

Để ghi lại những gì diễn ra trong cảnh, tôi thêm một camera.

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)
)

Tôi đặt độ phân giải ảnh là 320x240 pixel, phù hợp để thử nghiệm, và đặt vị trí camera tại (3.5, 2.0, 2.5), cho góc nhìn rõ ràng từ hơi chếch và phía trên. Để đảm bảo khối hộp luôn trong tiêu điểm, tôi hướng camera vào (0, 0, 0.5), ngay trên tâm của hộp. Với góc nhìn (FOV) 30 độ, camera ghi lại khung cảnh theo góc hẹp và tập trung. 

Xây dựng cảnh

Bước tiếp theo là xây dựng cảnh để chuẩn bị cho mô phỏng và render.

scene.build()

Bước này rất quan trọng vì Genesis dùng biên dịch vừa-đúng-lúc (JIT) để tối ưu mô phỏng. Khi tôi xây dựng cảnh, Genesis đã:

  • Cấp phát bộ nhớ cho các đối tượng trong cảnh.
  • Chuẩn bị các kernel GPU cho render và tính toán vật lý.
  • Thiết lập đầy đủ cấu trúc dữ liệu cần thiết để mô phỏng chạy mượt.

Mọi thứ đã sẵn sàng—mặt phẳng, khối hộp và camera đều đã được thiết lập, và cảnh đã được xây dựng.

Render và lưu kết quả

Để trực quan hóa mô phỏng, tôi render và lưu đầu ra theo từng khung hình. Mỗi khung hình được lưu thành một ảnh trong thư mục simulation_frames. 

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}")

Trong quá trình render, tôi nhận thấy vài khung hình đầu render rất nhanh (lên đến 2.297 FPS), nhưng hiệu năng giảm dần khi mô phỏng tiếp diễn. Đến khung hình 25, FPS giảm còn khoảng 0,33 FPS. Điều này có thể do độ phức tạp tính toán tăng dần của mô phỏng hoặc do hạn chế tài nguyên GPU với các cảnh lớn hơn.

Đây là kết quả tôi nhận được:

[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

Đây là những ảnh tôi thu được:

Khung 1

Khung 2

Khung 3

Khung 4

Khung 5

Mỗi ảnh cho thấy cách khối hộp di chuyển so với mặt phẳng theo thời gian, qua góc nhìn của camera. Mô phỏng chạy theo từng bước, và ở mỗi bước, vị trí của hộp thay đổi, khiến nó trông như đang chuyển động.

Ví dụ này cho thấy Genesis có thể mô phỏng và hiển thị các tương tác vật lý đơn giản. Dù thiết lập này cơ bản, nó giúp bạn hình dung cách các đối tượng cư xử trong cảnh. Nhưng bạn hoàn toàn có thể tạo các kịch bản phức tạp và chân thực hơn với Genesis! Chúng ta sẽ khám phá một số khả năng đó ở phần tiếp theo.

Khám phá Genesis: Khả năng và tính năng

Tạo đối tượng và cảnh

Genesis cho phép bạn tạo các cảnh phức tạp bằng cách thêm nhiều đối tượng và morph. Đối tượng có thể từ các khối cơ bản như mặt phẳng, hộp, và cầu đến các thực thể phức tạp hơn như robot và địa hình.

Khối hình cơ bản:

  • gs.morphs.Plane
  • gs.morphs.Box
  • gs.morphs.Cylinder
  • gs.morphs.Sphere

Hỗ trợ tệp bên ngoài:

  • MJCF: gs.morphs.MJCF cho cấu hình robot MuJoCo XML.
  • URDF: gs.morphs.URDF cho các tệp Unified Robot Description Format.
  • Mesh: gs.morphs.Mesh cho tài sản 3D như .obj, .ply, .stl, .glb và .gltf.

Genesis dùng một khái niệm thống nhất gọi là "morph", bao hàm hình học và thông tin pose. Thiết kế hướng đối tượng này cho phép tương tác trực tiếp với các thực thể thông qua phương thức của chúng.

Render và trực quan hóa

Một trong những thế mạnh của Genesis là khả năng tạo đầu ra hình ảnh chi tiết nhờ các tính năng camera nâng cao. Camera hoạt động ở "chế độ headless", nghĩa là có thể tạo ảnh mà không cần màn hình hiển thị. Chúng có thể xuất nhiều loại ảnh, bao gồm ảnh màu thông thường (RGB), bản đồ độ sâu thể hiện khoảng cách của vật thể, mặt nạ phân đoạn gán nhãn các phần khác nhau của cảnh, và normal map biểu diễn chi tiết bề mặt.

Ghi video

Bạn có thể tạo video bằng cách để camera tự động ghi lại từng khung hình của mô phỏng. Bạn thậm chí có thể di chuyển camera trong lúc ghi để video sinh động và cuốn hút hơn.

Ví dụ, bạn có thể cấu hình camera di chuyển theo quỹ đạo tròn quanh cảnh trong lúc chụp khung hình. Hàm cam.start_recording() bắt đầu ghi, và ở mỗi bước mô phỏng, vị trí của camera được cập nhật. Khi đã chụp đủ khung, cam.stop_recording() sẽ lưu video thành "video.mp4".

Video cuối cùng mang đến góc nhìn mượt mà của mô phỏng, cho thấy các đối tượng tương tác và chuyển động theo thời gian.

Tạo địa hình cho các bài toán di chuyển

Bạn cũng có thể tạo nhiều loại địa hình khác nhau để phục vụ robotics và huấn luyện AI. Bạn có thể dùng các tùy chọn địa hình tích hợp sẵn hoặc tự thiết kế bằng cách cung cấp height map tùy chỉnh với gs.morphs.Terrain. Những địa hình này rất phù hợp để kiểm thử và huấn luyện khả năng di chuyển của robot, biến Genesis thành công cụ hữu ích cho nghiên cứu robotics.

Khả năng mở rộng

Bạn cũng có thể tùy biến mô phỏng theo nhiều cách. Bạn có thể thêm texture chân thực cho đối tượng, giúp chúng sống động hơn. Công cụ còn hỗ trợ nhiều định dạng tệp để nhập mô hình, và nếu định dạng nào chưa hỗ trợ, bạn có thể đề xuất bổ sung. Ngoài ra, bạn có thể tạo hình dạng đối tượng tùy chỉnh (gọi là morph) bằng tệp và thiết lập riêng.

Kết luận

Hướng dẫn này cung cấp một ví dụ đơn giản để bạn bắt đầu với Genesis. Chúng ta đã đi qua những điều cơ bản như tạo cảnh, thêm đối tượng và render đầu ra, để cho thấy cách hoạt động của công cụ mô phỏng vật lý mạnh mẽ này.

Tuy nhiên, đây chỉ là khởi đầu cho những gì Genesis có thể làm. Với phần cứng phù hợp, như GPU mạnh và đủ bộ nhớ, có rất nhiều khả năng. Bạn có thể dùng nó cho các mô phỏng robotics phức tạp hoặc tạo bộ dữ liệu chất lượng cao để huấn luyện AI. Dù việc thiết lập có thể rắc rối, đây chắc chắn là một công cụ đầy tiềm năng!


Dr Ana Rojo-Echeburúa's photo
Author
Dr Ana Rojo-Echeburúa
LinkedIn
Twitter

Ana Rojo Echeburúa là chuyên gia AI và dữ liệu, có bằng Tiến sĩ Toán Ứng dụng. Cô yêu thích việc biến dữ liệu thành những insight có thể hành động và có nhiều kinh nghiệm lãnh đạo các nhóm kỹ thuật. Ana thích làm việc chặt chẽ với khách hàng để giải quyết các vấn đề kinh doanh và tạo ra những giải pháp AI sáng tạo. Được biết đến với kỹ năng giải quyết vấn đề và giao tiếp rõ ràng, cô đam mê AI, đặc biệt là AI tạo sinh. Ana luôn theo đuổi việc học tập không ngừng và phát triển AI có đạo đức, cũng như đơn giản hóa các vấn đề phức tạp và giải thích công nghệ theo cách dễ tiếp cận.

Chủ đề
Trí tuệ Nhân tạo
Mô hình Ngôn ngữ Lớn

Học AI với các khóa học này!

Lộ trình

Cơ bản về Llama

4 giờ
Thử nghiệm với Llama 3 để thực hiện suy luận trên các mô hình đã được huấn luyện sẵn, tinh chỉnh chúng trên các tập dữ liệu tùy chỉnh và tối ưu hóa hiệu suất.
Xem chi tiếtRight Arrow
Bắt Đầu Khóa Học
Xem thêmRight Arrow
Liên quan

blog

Claude Opus 4.6: Tính năng, Điểm chuẩn, Bài kiểm tra thực hành và hơn thế nữa

Mô hình mới nhất của Anthropic dẫn đầu ở mã hóa tác tử và lập luận phức tạp. Thêm vào đó, nó có cửa sổ ngữ cảnh 1M.
Matt Crabtree's photo

Matt Crabtree

10 phút

Xem ThêmXem Thêm