{"id":160,"date":"2026-04-03T20:34:57","date_gmt":"2026-04-04T01:34:57","guid":{"rendered":"https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/?page_id=160"},"modified":"2026-11-14T01:28:26","modified_gmt":"2026-11-14T06:28:26","slug":"system-interface","status":"publish","type":"page","link":"https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/system-implementation\/system-interface\/","title":{"rendered":"System Interface"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\">Fall 2026 Updates<\/h3>\n\n\n\n<p><strong>Unitree Interface (updated):<\/strong><\/p>\n\n\n\n<p>The ROS 2 control bridge over the Unitree SDK drives the 29-DoF G1 with Dex3 hands. Commands are exposed as <code>~\/cmd_vel<\/code>, <code>~\/cmd_arm<\/code> and <code>~\/cmd_low<\/code>, and robot setup is exposed as services: <code>~\/change_mode<\/code>, <code>~\/ready_locomotion<\/code> (damp \u2192 stand \u2192 start), <code>~\/release_arms<\/code>, <code>~\/set_profile<\/code> (motor gains), <code>~\/set_hand_pose<\/code> (Dex3 poses) and <code>~\/reset_integral_error<\/code>. The application-side control loop switches between High-level, Low-level, Idle and Emergency modes.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-content\/uploads\/sites\/92\/2026\/11\/vr-SDR-s19.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1500\" height=\"844\" src=\"https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-content\/uploads\/sites\/92\/2026\/11\/vr-SDR-s19.jpg\" alt=\"Unitree interface: ROS 2 commands, services and application-side control modes.\" class=\"wp-image-320\" srcset=\"https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-content\/uploads\/sites\/92\/2026\/11\/vr-SDR-s19.jpg 1500w, https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-content\/uploads\/sites\/92\/2026\/11\/vr-SDR-s19-300x169.jpg 300w, https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-content\/uploads\/sites\/92\/2026\/11\/vr-SDR-s19-768x432.jpg 768w\" sizes=\"auto, (max-width: 1500px) 100vw, 1500px\" \/><\/a><figcaption class=\"wp-element-caption\"><strong>Fig:<\/strong> Unitree interface: ROS 2 commands, services and application-side control modes.<\/figcaption><\/figure>\n\n\n\n<p><strong>Distributed Systems &amp; Communication:<\/strong><\/p>\n\n\n\n<p>The stack is split across three onboard computers so that VLM inference, real-time tracking, and planning\/control\/navigation run on separate devices, each in its own isolated runtime. This keeps heavy model dependencies away from the control loop and removes the dependence on external Wi-Fi.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Thor<\/strong> (aarch64, ROS 2 Jazzy): LLM\/VLM inferencing.<\/li>\n\n\n\n<li><strong>Orin<\/strong> (aarch64, ROS 2 Jazzy, inside the G1): object tracking and perception.<\/li>\n\n\n\n<li><strong>NUC<\/strong> (x86_64, ROS 2 Jazzy): arm planning and control, navigation, LiDAR driver.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-content\/uploads\/sites\/92\/2026\/11\/vr-SDR-s22.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1500\" height=\"844\" src=\"https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-content\/uploads\/sites\/92\/2026\/11\/vr-SDR-s22.jpg\" alt=\"Distributed system architecture across Thor, Orin and NUC.\" class=\"wp-image-322\" srcset=\"https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-content\/uploads\/sites\/92\/2026\/11\/vr-SDR-s22.jpg 1500w, https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-content\/uploads\/sites\/92\/2026\/11\/vr-SDR-s22-300x169.jpg 300w, https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-content\/uploads\/sites\/92\/2026\/11\/vr-SDR-s22-768x432.jpg 768w\" sizes=\"auto, (max-width: 1500px) 100vw, 1500px\" \/><\/a><figcaption class=\"wp-element-caption\"><strong>Fig:<\/strong> Distributed system architecture across Thor, Orin and NUC.<\/figcaption><\/figure>\n\n\n\n<p><strong>Universal Stack Manager (deployment tool):<\/strong><\/p>\n\n\n\n<p>A single <code>.\/scripts\/deploy.sh<\/code> entry point provisions and operates every target over SSH: install, update, assets, build, status, launch, stop and logs, with <code>--dry-run<\/code> support. The workflow is provision (repositories and Pixi environment) \u2192 sync assets (models and checkpoints) \u2192 build (colcon) \u2192 operate (launch, stop and logs in tmux).<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-content\/uploads\/sites\/92\/2026\/11\/vr-SDR-s24.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1500\" height=\"844\" src=\"https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-content\/uploads\/sites\/92\/2026\/11\/vr-SDR-s24.jpg\" alt=\"Universal Stack Manager: one deployment script for every onboard target.\" class=\"wp-image-323\" srcset=\"https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-content\/uploads\/sites\/92\/2026\/11\/vr-SDR-s24.jpg 1500w, https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-content\/uploads\/sites\/92\/2026\/11\/vr-SDR-s24-300x169.jpg 300w, https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-content\/uploads\/sites\/92\/2026\/11\/vr-SDR-s24-768x432.jpg 768w\" sizes=\"auto, (max-width: 1500px) 100vw, 1500px\" \/><\/a><figcaption class=\"wp-element-caption\"><strong>Fig:<\/strong> Universal Stack Manager: one deployment script for every onboard target.<\/figcaption><\/figure>\n\n\n\n<p><strong>Skill Library:<\/strong><\/p>\n\n\n\n<p>Robot capabilities are wrapped as reusable skills for the task executor.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Base skills (8):<\/strong> navigate_to, turn_to, stop, localize, track(text), ground(text), move_arm_to, press(target).<\/li>\n\n\n\n<li><strong>Composed skills (5):<\/strong> go_to_place(name), call_elevator, enter_elevator, ride, exit_elevator.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-content\/uploads\/sites\/92\/2026\/11\/vr-SDR-s16.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1500\" height=\"844\" src=\"https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-content\/uploads\/sites\/92\/2026\/11\/vr-SDR-s16.jpg\" alt=\"Skill library: base skills and composed elevator skills.\" class=\"wp-image-318\" srcset=\"https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-content\/uploads\/sites\/92\/2026\/11\/vr-SDR-s16.jpg 1500w, https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-content\/uploads\/sites\/92\/2026\/11\/vr-SDR-s16-300x169.jpg 300w, https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-content\/uploads\/sites\/92\/2026\/11\/vr-SDR-s16-768x432.jpg 768w\" sizes=\"auto, (max-width: 1500px) 100vw, 1500px\" \/><\/a><figcaption class=\"wp-element-caption\"><strong>Fig:<\/strong> Skill library: base skills and composed elevator skills.<\/figcaption><\/figure>\n\n\n\n<p><strong>Hardware:<\/strong><\/p>\n\n\n\n<p>Sharing the robot with the sponsor exposed the team to frequent hardware failures: over the fall the team repaired more than ten Dex3 hands and recovered the G1 after a breakdown, followed by a break-in period. The catch-up plan combined repairing the existing robot, provisioning an additional robot, and testing the task executor in simulation during downtime.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-content\/uploads\/sites\/92\/2026\/11\/vr-SDR-s20.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1500\" height=\"844\" src=\"https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-content\/uploads\/sites\/92\/2026\/11\/vr-SDR-s20.jpg\" alt=\"Hardware maintenance: more than ten Dex3 hands repaired this fall.\" class=\"wp-image-321\" srcset=\"https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-content\/uploads\/sites\/92\/2026\/11\/vr-SDR-s20.jpg 1500w, https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-content\/uploads\/sites\/92\/2026\/11\/vr-SDR-s20-300x169.jpg 300w, https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-content\/uploads\/sites\/92\/2026\/11\/vr-SDR-s20-768x432.jpg 768w\" sizes=\"auto, (max-width: 1500px) 100vw, 1500px\" \/><\/a><figcaption class=\"wp-element-caption\"><strong>Fig:<\/strong> Hardware maintenance: more than ten Dex3 hands repaired this fall.<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Spring 2026<\/h3>\n\n\n\n<p><strong>Unitree Interface:<\/strong><\/p>\n\n\n\n<p>The unitree_interface package is a ROS 2 (Jazzy) bridge for the Unitree G1 humanoid robot that abstracts away DDS communication behind standard ROS topics and services. It&#8217;s split into two components: UnitreeInterface, which handles the ROS-facing API including subscriptions, publishers, services, and a control mode state machine, and UnitreeSDKWrapper, which manages all the underlying SDK\/DDS communication. Both share CycloneDDS domain 0, so no domain ID separation is needed. The node operates as a state machine cycling through Monostate, Idle, HighLevel, LowLevel, and Emergency modes. HighLevelMode exposes velocity and arm commands via the locomotion client and arm SDK respectively, while LowLevelMode (compile-time gated) allows direct per-joint motor control with CRC-32 checksums. Joint topology is defined at compile time in topology.hpp, mapping all 29 joints by URDF name to index with gearbox-based default gains. Mode transitions are validated and exposed via a service, joint state feedback is published at ~500Hz, and an estop subscription in both active modes triggers a terminal damping state.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1023\" height=\"224\" src=\"https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-content\/uploads\/sites\/92\/2026\/02\/control_modes.png\" alt=\"\" class=\"wp-image-100\" srcset=\"https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-content\/uploads\/sites\/92\/2026\/02\/control_modes.png 1023w, https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-content\/uploads\/sites\/92\/2026\/02\/control_modes-300x66.png 300w, https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-content\/uploads\/sites\/92\/2026\/02\/control_modes-768x168.png 768w\" sizes=\"auto, (max-width: 1023px) 100vw, 1023px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1274\" height=\"345\" src=\"https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-content\/uploads\/sites\/92\/2026\/02\/b5dbe3d31c173686300c8d481646308b.png\" alt=\"\" class=\"wp-image-103\" srcset=\"https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-content\/uploads\/sites\/92\/2026\/02\/b5dbe3d31c173686300c8d481646308b.png 1274w, https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-content\/uploads\/sites\/92\/2026\/02\/b5dbe3d31c173686300c8d481646308b-300x81.png 300w, https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-content\/uploads\/sites\/92\/2026\/02\/b5dbe3d31c173686300c8d481646308b-768x208.png 768w\" sizes=\"auto, (max-width: 1274px) 100vw, 1274px\" \/><\/figure>\n\n\n\n<p><strong>Fig : Modes and Transitions.<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Fall 2026 Updates Unitree Interface (updated): The ROS 2 control bridge over the Unitree SDK drives the 29-DoF G1 with Dex3 hands. Commands are exposed as ~\/cmd_vel, ~\/cmd_arm and ~\/cmd_low, and robot setup is exposed as services: ~\/change_mode, ~\/ready_locomotion (damp \u2192 stand \u2192 start), ~\/release_arms, ~\/set_profile (motor gains), ~\/set_hand_pose (Dex3 poses) and ~\/reset_integral_error. The application-side [&hellip;]<\/p>\n","protected":false},"author":434,"featured_media":0,"parent":93,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-160","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-json\/wp\/v2\/pages\/160","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-json\/wp\/v2\/users\/434"}],"replies":[{"embeddable":true,"href":"https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-json\/wp\/v2\/comments?post=160"}],"version-history":[{"count":4,"href":"https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-json\/wp\/v2\/pages\/160\/revisions"}],"predecessor-version":[{"id":351,"href":"https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-json\/wp\/v2\/pages\/160\/revisions\/351"}],"up":[{"embeddable":true,"href":"https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-json\/wp\/v2\/pages\/93"}],"wp:attachment":[{"href":"https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-json\/wp\/v2\/media?parent=160"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}