
อธิบาย World — API พระเจ้าใน Nvidia 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 มีการ renderadd_timeline_callback()
แทรก function เข้าไปรันทุกครั้ง “หลัง” มีเหตุการณ์เกี่ยวกับเวลาเกิดขึ้นอย่าง play, pause หรือ stopadd_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()
เป็นต้น