Az NVIDIA Holoscan 5 SDK-ját bemutató útmutató egy egyszerű, mégis kritikus robotikai ellenőrző hurkot valósít meg: kézzel elmozdítható robotkart, amelynek motorjai pontosan annyi nyomatékot adnak, hogy a kart megtartsák a gravitáció ellenében. Az ilyen gravity-compensation (gravitáció-kompenzáció) feladat gyors, alacsony jitterű inverz dinamikai számításokat igényel — az algoritmusoknak folyamatosan ismerniük kell a robot aktuális állapotát és a linkek, tömegek, tehetetlenségi nyomatékok pontos modelljét. A bemutató a Holoscan 5 futtatókörnyezetét használva három egyedi operátorból építi fel a hurkot, és valós roboton, továbbá NVIDIA Nsight Systems-szel mérve mutatja be a késleltetést és jittert.
Miért Holoscan?
A Holoscan SDK célja, hogy egyesítse a nagy áteresztőképességű percepciót és az alacsony késleltetésű vezérlést egy egységes programozási modellben, amely CPU- és GPU-munkafolyamatokra egyaránt szabályozható végrehajtási utakat biztosít. A Holoscan minimális keretrendszer-hozzáadott költséget tart fenn, explicit végrehajtási terveket és beépített NVTX annotációkat ad, így az alkalmazás viselkedése könnyen ellenőrizhető Nsight Systems-ben.
Főbb tervezési elemek:
- Partition-ök: az operátorláncokat egyetlen szálra csoportosítják, így elkerülve a szálak közti kézbesítési költségeket és felesleges syscalleket, ami csökkenti a késleltetést és a jittert.
- Triggerek és sorok: OnClock és OnEach triggerekkel szabályozzák, mikor fusson egy operátor; korlátos, "drop-oldest" sorok megakadályozzák az elavult minták felgyülemlését.
- Könnyű integráció: Holoscan 5 egyszerűen beilleszthető meglévő kódokba, és könnyű adatot be- illetve kivezetni a gráfokból.
Hardver és szoftver
A bemutatóhoz használt elérhető platform a Seeed Studio reBot Arm B601-DM, amelynek aktorai quasi-direct-drive (QDD) kialakításúak, így jó nyomatéksávszélességet és érzékelést biztosítanak — fontosak haptikus, kollaboratív, illetve nyomaték-alapú feladatoknál. A leírást Jetson Orin Nano, Jetson Thor és x86 Ubuntu 24.04 rendszereken tesztelték. A példakód Python 3.12+-ot használ; a repository tartalmaz C++ implementációt is.
A gravitáció-kompenzációhoz a bemutató a Pinocchio könyvtárat használja inverz dinamika megoldóként (RNEA), amely a URDF modell alapján számolja ki a szükséges csuklónyomatékokat. A motorhoz való interfészt a motorbridge könyvtár szolgáltatja, amely olvassa a visszacsatolt állapotot és küldi a parancsokat.
A vezérlőhurok három operátora
A Holoscan programozási modell két alapfogalomra épül: Operator és Graph. A graváció-kompenzációs ellenőrző hurkot három operátorra bontjuk:
- JointStateSourceOp — csuklóállapot olvasása órával
- Kimenet: egy state port.
- Trigger: OnClock period=2500 µs, azaz 2,5 ms-os periodicitás (a bemutató 400 Hz-en fut).
- compute(): minden ticknél beolvassa a hét motor állapotát és kibocsátja azt.
- PinocchioGravityOp — gravitációs nyomaték számítása érkezett állapotból
- Bemenet: state, kimenet: command.
- Trigger: OnEach(state) — lefut, amikor új állapot érkezik.
- Paraméterek: kp (pl. 1.5), kd (pl. 1.0), tau_scale és joint_direction, amelyek operátor-paraméterként állíthatók.
- compute(): a beérkezett állapot és a paraméterek alapján átalakítja a csuklóállásokat a URDF modell szerinti vektorokká, majd Pinocchio computeGeneralizedGravity hívásával kiszámolja a gravitációs nyomatékokat, amelyek feedforward komponensként kerülnek a motorparancsokba egy kis compliance-szal (stiffness és damping).
- MotorCommandSinkOp — parancs elküldése a motoroknak
- Bemenet: command.
- Trigger: OnEach(command).
- compute(): ellenőrzi a parancs érvényességét (lejárt, nem soros vagy határon túli parancsokat elvet) és továbbítja a robot helpernek, amely elküldi a hét motorparancsot. A stop() callback leállítja és tiltja a motorokat.
A három operátort egy gráfba kötve a forrás határozza meg a ritmust, a többi operátor pedig a bejövő adatra reagál. A partition segítségével mindhárom operátort a "control" csoportba helyezik, így egy runtime-owned szálon sorosan futnak — ez minimalizálja a szálak közti váltást.
Fordítás, előkészítés és futtatás
A Holoscan gráfot a rendszer lefordítja és ellenőrzi futás előtt; ha a terv nem érvényes, a fordító összegzést ad vissza. A modell- és motorinicializálás a prepare_gravity_compensation() függvényben történik közvetlenül a futtatás előtt.
A futtatás például így indítható (virtuális környezettel és Python 3.12-vel):
- python3.12 -m venv build/python-venv
- build/python-venv/bin/python -m pip install --only-binary=:all: -r requirements-python.txt
- build/python-venv/bin/python -m pip check
- build/python-venv/bin/python python/gravity_compensation.py
A program a "Gravity compensation active" üzenet után engedi, hogy kézzel vezessük a kart; a Ctrl+C leállítja és letiltja a motorokat.
Teljesítménymérés: késleltetés és jitter Nsight Systems-szel
A Holoscan natív NVTX annotációkat ad, ezért az alkalmazás módosítása nélkül lehet profilozni NVIDIA Nsight Systems-szel. Például:
- mkdir -p build/profiles
- nsys profile -t nvtx --sample=none --backtrace=none --cpuctxsw=none -o build/profiles/gravity-python build/python-venv/bin/python python/gravity_compensation.py
A timeline megmutatja az operátorok végrehajtását és az üzenetátviteli időket. A bemutatóban összehasonlították a processzormaghoz pinningelt és nem pinningelt futtatásokat, valamint C++ és Python implementációkat. A megtartott mérések során több mint egymillió futást vizsgáltak, és a következő p50 / p99.99 / p99.999 késleltetésértékeket kapták (mikroszekundumban):
- HSDK C++ pinned: p50 = 7.1 µs, p99.99 = 17.2 µs, p99.999 = 20.7 µs
- HSDK C++ unpinned: p50 = 15.3 µs, p99.99 = 86.6 µs, p99.999 = 133.4 µs
- HSDK Python pinned: p50 = 93.0 µs, p99.99 = 142.6 µs, p99.999 = 1,014.0 µs
- HSDK Python unpinned: p50 = 113.8 µs, p99.99 = 1,373.5 µs, p99.999 = 3,134.1 µs
A pinning és izoláció csökkentette a p99.99 késleltetést körülbelül 5×-tel C++-ban és 9.6×-tel Pythonban. Mindkét Holoscan változat a Pinocchio C++ solverét hívja, de a Python futtatás köré interpreter-bevonás, objektumallokációk és a GIL koordinációja adódik, amelyek felerősítik a legrosszabb esetbeli késleltetéseket. C++-ban több kontroll van az allokációk és rendszerhívások felett, ami fontos mikro-szekundumos késleltetési költségvetésű vezérlőhurkoknál.
Ugyanakkor GPU-alapú percepciós munkafolyamatok több ezred- vagy tízezredmásodperces skálán mozognak, ott a kisebb CPU-allocok és incidens sziszhívások optimalizálása általában kevésbé kritikus; Python továbbra is praktikus összerakó nyelv lehet, ha a költséges részek CUDA-ban futnak.
Továbblépés: teljes vezérlőstack és percepció
A bemutató végére működő gravitáció-kompenzációs hurokunk van: egy operátor olvassa az állapotot, egy másik Pinocchio-val számolja a gravitációs nyomatékot, és egy harmadik küldi a motorparancsokat. Holoscan előre leellenőrizte a gráfot, és Nsight Systems segítségével megmutatta a futás viselkedését.
A gravitáció-kompenzáció alap, nem pedig a végleges vezérlő. A tutorial repository tartalmaz egy második Python példát, amely kinematikát és impedancia-kontrollt ad hozzá, lehetővé téve célpozíció/injekciót (például egy tanult policy-ből) miközben a kar taktilisan kompatibilis marad. Innen lehet tovább építkezni hand-guided teaching, teleoperation és manipuláció felé; percepció hozzáadásához használható a Holoscan vision modul és az NVIDIA Isaac ROS komponensei (pl. GR00T inference).
Hol lehet továbblépni
A teljes tutorial és a Holoscan 5 SDK letölthető a repositoryból, amely tartalmazza a részletes konfigurációs, matematikai és hardverindítási útmutatókat.



