Skip to main content
Version: Exoskeleton Glove

Interfaces and Data Reference

REST API

  • Prefix: /api/v1
  • Base URL: http://{host}:{port}/api/v1/...
  • Content-Type: JSON (except upload endpoints)
MethodPathPurposeExample
GET/streamsAuthoritative WebSocket stream catalog (id, topic, type, direction)curl -s http://127.0.0.1:8080/api/v1/streams
GET/statusRuntime status: topology, hand model, side, subprocesses, ROS bridge, sync statecurl -s http://127.0.0.1:8080/api/v1/status
GET/hands/configsList valid hand models (scans configs/end_tools)curl -s http://127.0.0.1:8080/api/v1/hands/configs
POST/hands/selectSelect hand model and start process chain (exo/transform/controller)curl -s -X POST http://localhost:8080/api/v1/hands/select -H "Content-Type: application/json" -d '{"hands":["DexcelRobotics_Apex"]}'
POST/hands/configs/uploadUpload hand config package to configs/end_tools/<hand>/curl -s -X POST http://localhost:8080/api/v1/hands/configs/upload -F "files=@hand.zip" -F "overwrite=true"
POST/runtime/frequencySet exo publish rate 120 (default) / 100 Hz; writes yaml and restarts exo_tfcurl -s -X POST http://localhost:8080/api/v1/runtime/frequency -H "Content-Type: application/json" -d '{"hz":100}'
POST/wifi/provisionStart sending provisioning infocurl -s -X POST http://localhost:8080/api/v1/wifi/provision -H "Content-Type: application/json" -d '{"ssid":"MyWiFi","password":"pwd","return_ip":"192.168.1.1"}'
POST/exo/udp/startStart UDP exoskeleton discoverycurl -s -X POST http://localhost:8080/api/v1/exo/udp/start
GET/exo/udp/stopStop UDP discoverycurl -s -X POST http://localhost:8080/api/v1/exo/udp/stop

WebSocket Data Streams

The current version throttles WebSocket to 30 Hz by default. For full-rate data, use ROS topics.

Send JSON control messages after connecting:

Subscribe to data streams:

{"op": "subscribe", "streams": ["io_esk.joint_data", "io_esk.tf"]}

When streams is omitted, the default streams from the configuration are auto-expanded based on the currently selected hand model.

Publish data (e.g. vibration feedback):

{"op": "publish", "stream": "io_esk.vibration_feedback", "data": {"data": [0,0,0,0,0,0,0,0,0,0]}}

Server push format:

{"stream": "io_esk.joint_data", "data": { ... }}

Stream Catalog

base_idscopeROS topic (template)ROS typeDirection
io_esk.tfglobal/io_fusion/tf_exoskeletonTFMessagesubscribe
io_esk.joint_dataglobal/io_esk/joint_dataJointStatesubscribe
io_esk.joystick_dataglobal/io_esk/joystick_dataJoysubscribe
io_align.tf.robotnamehand/io_align/tf_handTFMessagesubscribe
io_align.poses_left.robotnamehand/io_align/<hand_model>/poses_<new_parent_frame>PoseArraysubscribe
io_align.poses_right.robotnamehand/io_align/<hand_model>/poses_<new_parent_frame>PoseArraysubscribe
io_teleop.joint_cmd_left.robotnamehand/io_teleop/<hand_model>/joint_cmd_finger_leftJointStatesubscribe
io_teleop.joint_cmd_right.robotnamehand/io_teleop/<hand_model>/joint_cmd_finger_rightJointStatesubscribe
io_esk.vibration_feedback/io_esk/vibration_feedbackFloat64MultiArraypublish

ROS 2 Interface

To subscribe/publish data directly via ROS 2, use the following topics:

Input

  • /io_esk/vibration_feedback

    • Topic: /io_esk/vibration_feedback
    • Type: std_msgs/Float64MultiArray
    • Response rate: 120Hz
    • Purpose: Vibration feedback at exoskeleton fingertips
    • Payload:
    // Float64MultiArray
    // ROS standard msg
    std_msgs/MultiArrayLayout layout
    float64[] data
    // Vibration level: 1–10, 0 = off
    // Force feedback index order: 0–4 right hand, 5–9 left hand
    // Right hand: thumb -> pinky -> ring -> middle -> index
    // Left hand: thumb -> index -> middle -> ring -> pinky

Output

  • /io_esk/joint_data

  • /io_esk/joystick_data

    • Topic: /io_esk/joystick_data
    • Type: sensor_msgs/Joy.msg
    • Output rate: 120Hz
    • Purpose: Joystick data from finger control units
    • Payload:
    std_msgs/Header header
    float32[2] axes # right
    float32[2] axes # left
    int32[4] buttons # right
    int32[4] buttons # left
  • /io_fusion/tf_exoskeleton

    • Topic: /io_fusion/tf_exoskeleton
    • Type: tf2_msgs/TFMessage.msg
    • Output rate: 120Hz
    • Purpose: Transform data for all exoskeleton links
    • Payload: Position and orientation of all exoskeleton links
    //TFMessage.msg
    geometry_msgs/TransformStamped[] transforms
    • Published transforms are relative to base_link:

      Tips (fingertips)

      Click to expand fingertip link list
      right_hand
      right_thumb_tip
      right_index_tip
      right_middle_tip
      right_ring_tip
      right_pinky_tip
      left_hand
      left_thumb_tip
      left_index_tip
      left_middle_tip
      left_ring_tip
      left_pinky_tip

      Exoskeleton links

      Click to expand exoskeleton link list
      link_RightSkeletonBase
      link_RightSkeletonThumbBase
      link_RightSkeletonThumb1
      link_RightSkeletonThumb2
      link_RightSkeletonThumb3
      link_RightSkeletonThumb4
      link_RightSkeletonIndex1
      link_RightSkeletonIndex2
      link_RightSkeletonIndex3
      link_RightSkeletonIndex4
      link_RightSkeletonMiddle1
      link_RightSkeletonMiddle2
      link_RightSkeletonMiddle3
      link_RightSkeletonMiddle4
      link_RightSkeletonRing1
      link_RightSkeletonRing2
      link_RightSkeletonRing3
      link_RightSkeletonRing4
      link_RightSkeletonPinky1
      link_RightSkeletonPinky2
      link_RightSkeletonPinky3
      link_RightSkeletonPinky4
      link_LeftSkeletonBase
      link_LeftSkeletonThumbBase
      link_LeftSkeletonThumb1
      link_LeftSkeletonThumb2
      link_LeftSkeletonThumb3
      link_LeftSkeletonThumb4
      link_LeftSkeletonIndex1
      link_LeftSkeletonIndex2
      link_LeftSkeletonIndex3
      link_LeftSkeletonIndex4
      link_LeftSkeletonMiddle1
      link_LeftSkeletonMiddle2
      link_LeftSkeletonMiddle3
      link_LeftSkeletonMiddle4
      link_LeftSkeletonRing1
      link_LeftSkeletonRing2
      link_LeftSkeletonRing3
      link_LeftSkeletonRing4
      link_LeftSkeletonPinky1
      link_LeftSkeletonPinky2
      link_LeftSkeletonPinky3
      link_LeftSkeletonPinky4

Reference URDF

blender_human_skeleton_v5.urdf — Click to download the URDF file