Interfaces and Data Reference
REST API
- Prefix:
/api/v1 - Base URL:
http://{host}:{port}/api/v1/... - Content-Type: JSON (except upload endpoints)
| Method | Path | Purpose | Example |
|---|---|---|---|
| GET | /streams | Authoritative WebSocket stream catalog (id, topic, type, direction) | curl -s http://127.0.0.1:8080/api/v1/streams |
| GET | /status | Runtime status: topology, hand model, side, subprocesses, ROS bridge, sync state | curl -s http://127.0.0.1:8080/api/v1/status |
| GET | /hands/configs | List valid hand models (scans configs/end_tools) | curl -s http://127.0.0.1:8080/api/v1/hands/configs |
| POST | /hands/select | Select 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/upload | Upload 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/frequency | Set exo publish rate 120 (default) / 100 Hz; writes yaml and restarts exo_tf | curl -s -X POST http://localhost:8080/api/v1/runtime/frequency -H "Content-Type: application/json" -d '{"hz":100}' |
| POST | /wifi/provision | Start sending provisioning info | curl -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/start | Start UDP exoskeleton discovery | curl -s -X POST http://localhost:8080/api/v1/exo/udp/start |
| GET | /exo/udp/stop | Stop UDP discovery | curl -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_id | scope | ROS topic (template) | ROS type | Direction |
|---|---|---|---|---|
io_esk.tf | global | /io_fusion/tf_exoskeleton | TFMessage | subscribe |
io_esk.joint_data | global | /io_esk/joint_data | JointState | subscribe |
io_esk.joystick_data | global | /io_esk/joystick_data | Joy | subscribe |
io_align.tf.robotname | hand | /io_align/tf_hand | TFMessage | subscribe |
io_align.poses_left.robotname | hand | /io_align/<hand_model>/poses_<new_parent_frame> | PoseArray | subscribe |
io_align.poses_right.robotname | hand | /io_align/<hand_model>/poses_<new_parent_frame> | PoseArray | subscribe |
io_teleop.joint_cmd_left.robotname | hand | /io_teleop/<hand_model>/joint_cmd_finger_left | JointState | subscribe |
io_teleop.joint_cmd_right.robotname | hand | /io_teleop/<hand_model>/joint_cmd_finger_right | JointState | subscribe |
io_esk.vibration_feedback | — | /io_esk/vibration_feedback | Float64MultiArray | publish |
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 msgstd_msgs/MultiArrayLayout layoutfloat64[] 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 - Topic:
Output
-
/io_esk/joint_data
- Topic:
/io_esk/joint_data - Type: sensor_msgs/JointState.msg
- Output rate: 120Hz
- Purpose: Exoskeleton glove joint encoder data
- Topic:
-
/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 headerfloat32[2] axes # rightfloat32[2] axes # leftint32[4] buttons # rightint32[4] buttons # left - Topic:
-
/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.msggeometry_msgs/TransformStamped[] transforms-
Published transforms are relative to
base_link:Tips (fingertips)
Click to expand fingertip link list
right_handright_thumb_tipright_index_tipright_middle_tipright_ring_tipright_pinky_tipleft_handleft_thumb_tipleft_index_tipleft_middle_tipleft_ring_tipleft_pinky_tipExoskeleton links
Click to expand exoskeleton link list
link_RightSkeletonBaselink_RightSkeletonThumbBaselink_RightSkeletonThumb1link_RightSkeletonThumb2link_RightSkeletonThumb3link_RightSkeletonThumb4link_RightSkeletonIndex1link_RightSkeletonIndex2link_RightSkeletonIndex3link_RightSkeletonIndex4link_RightSkeletonMiddle1link_RightSkeletonMiddle2link_RightSkeletonMiddle3link_RightSkeletonMiddle4link_RightSkeletonRing1link_RightSkeletonRing2link_RightSkeletonRing3link_RightSkeletonRing4link_RightSkeletonPinky1link_RightSkeletonPinky2link_RightSkeletonPinky3link_RightSkeletonPinky4link_LeftSkeletonBaselink_LeftSkeletonThumbBaselink_LeftSkeletonThumb1link_LeftSkeletonThumb2link_LeftSkeletonThumb3link_LeftSkeletonThumb4link_LeftSkeletonIndex1link_LeftSkeletonIndex2link_LeftSkeletonIndex3link_LeftSkeletonIndex4link_LeftSkeletonMiddle1link_LeftSkeletonMiddle2link_LeftSkeletonMiddle3link_LeftSkeletonMiddle4link_LeftSkeletonRing1link_LeftSkeletonRing2link_LeftSkeletonRing3link_LeftSkeletonRing4link_LeftSkeletonPinky1link_LeftSkeletonPinky2link_LeftSkeletonPinky3link_LeftSkeletonPinky4
- Topic:
Reference URDF
blender_human_skeleton_v5.urdf — Click to download the URDF file