{"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-04-03T20:35:15","modified_gmt":"2026-04-04T01:35:15","slug":"system-interface","status":"publish","type":"page","link":"https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/system-interface\/","title":{"rendered":"System Interface"},"content":{"rendered":"\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>Unitree Interface: 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 [&hellip;]<\/p>\n","protected":false},"author":434,"featured_media":0,"parent":0,"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":2,"href":"https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-json\/wp\/v2\/pages\/160\/revisions"}],"predecessor-version":[{"id":162,"href":"https:\/\/mrsdprojects.ri.cmu.edu\/2026teama\/wp-json\/wp\/v2\/pages\/160\/revisions\/162"}],"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}]}}