OmniCraft Logo

อธิบาย World — API พระเจ้าใน Nvidia Isaac Sim

2 min read isaac sim
( อัพเดทล่าสุด: )

บทความนี้จะมาพูดถึง Nvidia Isaac Sim กันบ้าง ว่าด้วยเรื่องของ World — API พระเจ้าที่ล่วงรู้ทุกอย่างในฉากของเรา

แล้วก็ API ที่ยกตัวอย่างทั้งหมดในบทความนี้จะเป็น Python API นะครับ

คุณสมบัติของ World

World ประกอบไปด้วย object instance สำคัญ 2 อัน คือ PhysicsContext และ Scene

PhysicsContext มีหน้าที่ในการจัดการคุณสมบัติทาง physics โดยรวมของฉาก ส่วน Scene จะใช้ในการ register วัตถุที่เราโหลดเข้ามา เพื่อให้ World สามารถล่วงรู้ ถึงวัตถุทั้งหมดตลอดเวลา

การใช้งาน World จะอยู่ในรูปแบบของ Singleton pattern ที่เราเรียกผ่าน World.instance() หมายความว่าเราจะมีข้อมูลของ PhysicsContext และ Scene แค่หนึ่งเดียวไม่ว่าเราจะเรียกใช้ World.instance() ใน extension ใดๆก็ตาม ที่เรานำมาใช้งาน ระหว่างการรัน Isaac Sim โปรแกรมหนึ่ง

Timeline Control

ความสามารถต่อไปของ World API คือ การควบคุมการเดินไปของเวลาใน simulation ที่เรียกว่า Timeline ตัว World จะมี method อยู่ 4 อัน play_async(), pause_async(), stop_async() และ step_async() ในการควบคุม Timeline

  • play_async() ใช้ในการสั่งให้เวลาเริ่มเดินไปหรือเดินต่อจากหยุด
  • pause_async() หยุดเวลา
  • stop_async() สั่งให้เวลาของ Timeline กลับไปยังจุดเริ่มต้น
  • step_async() จะเป็นคำสั่งให้เวลาเดินไปเป็นทีละหน่วย แล้วหยุด กรณีที่เราต้องการ control เวลาให้เดินไป ตามจำนวนที่เรากำหนดเอง

Callbacks functions

ตัว World จะมี API ให้เรา ดักรัน code ตามเหตุการณ์พื้นฐานต่างๆ ที่เกิดขึ้นระหว่างการรันโปรแกรม ซึ่งจะมีอยู่ 4 เหตุการณ์ นั่นคือ physics, render, timeline และ stage callback

เรามาคุยกันเรื่อง physics callback กันก่อน เพราะเป็นอันที่เราต้องใช้งานแทบทุกโปรแกรม

กระบวนการปกติ ใน simulation จะมีการคำนวณสถานะทาง physics ที่เกิดขึ้นกับวัตถุทั้งหมดในฉาก เมื่อคำนวณเสร็จ จะต่อด้วยกระบวนการ render ทันที ที่จะอัพเดทค่าผลลัพธ์เหล่านั้น แสดงออกมาเป็นภาพ 3D ให้เราเห็น ซึ่งความถี่ที่ทำกระบวนการนี้ (physics + render) จะมีค่า default อยู่ที่ 60Hz หรือก็คือ 60 ครั้งต่อวินาที

การใช้ add_physics_callback() จะทำให้เราสามารถแทรก function ที่จะรัน “ก่อน” simulation คำนวณ physics ใน step ปัจจุบันได้ ซึ่งเป็นกระบวนการที่เราต้องทำเป็นประจำ ในการสั่งการ robot controller หรือ เขียนโปรแกรมใส่ business logic อื่นๆ ให้กับฉาก

ส่วน callback อีก 3 อันที่เหลือ รัน “หลัง” เหตุการณ์เกิดขึ้นทั้งหมด ซึ่งก็มีดังนี้:

  • add_render_callback() เป็นคำสั่งที่ใช้แทรก function ที่จะรันทุกครั้ง “หลัง” simulation มีการ render
  • add_timeline_callback() แทรก function เข้าไปรันทุกครั้ง “หลัง” มีเหตุการณ์เกี่ยวกับเวลาเกิดขึ้นอย่าง play, pause หรือ stop
  • add_stage_callback() แทรก function เข้าไปรันทุกครั้ง “หลัง” มีการเปลี่ยนแปลง usd prim ใน Stage

นอกจาก API ในการ add callback แล้ว World ก็มี API ที่ใช้จัดการ callback เพิ่มเติมอีก ตัวอย่างเช่น

  • การลบ callback ออกทีละ function remove_physics_callback()
  • ล้าง callback ออกทั้งหมด clear_all_callbacks()
  • ตรวจว่ามี callback อะไรบ้างที่เราได้ add เข้าไปแล้วรึยัง: physics_callback_exists("my_callback")

เครื่องมือในการจัดการ Task

หน้าที่หลัก World อีกอย่าง คือ การจัดการ Task ในฉากของเรา

Task คือ concept ในการเขียน code ของ Isaac Sim ที่ใช้ในการแตกหน้าที่การทำงานต่างๆ ของโปรแกรมเราเป็นส่วนย่อย ทั้งในส่วนของการเซ็ตอัพวัตถุ และการรัน business logic เพื่อให้ง่ายต่อการจัดการและเขียนโปรแกรม

ซึ่งเมื่อไรที่เราเขียน Task ขึ้นมา และต้องการนำมาใช้งานใน Extension เราจะต้องทำการเพิ่ม Task เหล่านั้น เข้าไปใน World ก่อน จึงจะทำงานได้

ดังนั้น World เลยมี API ที่ใช้ในการจัดการ Task เข้ามารวมอยู่ด้วย อย่างเช่น add_task() ที่ใช้ในการเพิ่ม Task ใดๆเข้าไปใน World เพื่อให้เริ่มทำงาน แล้วก็ method ที่ใช้ในการติดตามดู สถานะของ Task อย่างเช่น is_done(), get_observation(), is_tasks_scene_build() เป็นต้น