接口与数据说明
REST API
- 前缀:
/api/v1 - 地址:
http://{host}:{port}/api/v1/... - Content-Type:JSON(上传接口除外)
| 方法 | 路径 | 作用 | 示例命令 |
|---|---|---|---|
| GET | /streams | WebSocket stream 权威目录(id、topic、类型、方向) | curl -s http://127.0.0.1:8080/api/v1/streams |
| GET | /status | 运行时状态:拓扑、手型、侧别、子进程、ROS 桥、sync 状态 | curl -s http://127.0.0.1:8080/api/v1/status |
| GET | /hands/configs | 获取有效手型列表(扫描 configs/end_tools) | curl -s http://127.0.0.1:8080/api/v1/hands/configs |
| POST | /hands/select | 选手型并启动进程链(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 | 上传手型配置包到 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 | 修改 exo 发布频率 120(默认)/ 100 Hz,写 yaml 并重启 exo_tf | curl -s -X POST http://localhost:8080/api/v1/runtime/frequency -H "Content-Type: application/json" -d '{"hz":100}' |
| POST | /wifi/provision | 开始发送配网信息 | 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 | 启动 udp 识别外骨骼程序 | curl -s -X POST http://localhost:8080/api/v1/exo/udp/start |
| GET | /exo/udp/stop | 停止 udp 识别程序 | curl -s -X POST http://localhost:8080/api/v1/exo/udp/stop |
WebSocket 数据流
当前版本默认WS限流30hz,需全量数据请选用 ros topic 获取。
连接后发送 JSON 控制消息:
订阅数据流:
{"op": "subscribe", "streams": ["io_esk.joint_data", "io_esk.tf"]}
省略 streams 时,按配置中的默认流及当前已选手型自动展开。
发布数据(如振动反馈):
{"op": "publish", "stream": "io_esk.vibration_feedback", "data": {"data": [0,0,0,0,0,0,0,0,0,0]}}
服务端推送格式:
{"stream": "io_esk.joint_data", "data": { ... }}
Stream 目录
| base_id | scope | ROS topic(模板) | ROS 类型 | 方向 |
|---|---|---|---|---|
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/<手型名>/poses_<new_parent_frame> | PoseArray | subscribe |
io_align.poses_right.robotname | hand | /io_align/<手型名>/poses_<new_parent_frame> | PoseArray | subscribe |
io_teleop.joint_cmd_left.robotname | hand | /io_teleop/<手型名>/joint_cmd_finger_left | JointState | subscribe |
io_teleop.joint_cmd_right.robotname | hand | /io_teleop/<手型名>/joint_cmd_finger_right | JointState | subscribe |
io_esk.vibration_feedback | — | /io_esk/vibration_feedback | Float64MultiArray | publish |
ROS2 接口
如需直接通过 ROS2 订阅/发布数据,可使用以下 Topic:
输入
-
/io_esk/vibration_feedback
- Topic:
/io_esk/vibration_feedback - Type:std_msgs/Float64MultiArray
- 响应频率:120Hz
- 用途:用于外骨骼指尖振动反馈
- 内容解释:
// Float64MultiArray// ros 官方msgstd_msgs/MultiArrayLayout layoutfloat64[] data// 震动等级: 1-10级别,0为不震动// 接收力反馈数据序号: 顺序: 0-4 右手,5-9 左手。// 右手从thumb->pinky->ring->middle->index// 左手从thumb->index->middle->ring->pinky - Topic:
输出
-
/io_esk/joint_data
- Topic:
/io_esk/joint_data - Type:sensor_msgs/JointState.msg
- 输出频率:120Hz
- 用途:输出外骨骼手套关节编码器数据
- Topic:
-
/io_esk/joystick_data
- Topic:
/io_esk/joystick_data - Type:sensor_msgs/Joy.msg
- 输出频率:120Hz
- 用途:输出外骨骼手指控制单元摇杆数据
- 内容解释:
std_msgs/Header headerfloat32[2] axes #右float32[2] axes #左int32[4] buttons#右int32[4] buttons#左 - Topic:
-
/io_fusion/tf_exoskeleton
- Topic:
/io_fusion/tf_exoskeleton - Type:tf2_msgs/TFMessage.msg
- 输出频率:120Hz
- 用途:输出外骨骼手套所有连杆数据
- 内容解释:外骨骼所有link的位置与姿态信息
//TFMessage.msggeometry_msgs/TransformStamped[] transforms-
发布 tf 为如下 link 相对于 base_link 的坐标变化:
tips(指尖)
点击展开指尖 link 列表
right_handright_thumb_tipright_index_tipright_middle_tipright_ring_tipright_pinky_tipleft_handleft_thumb_tipleft_index_tipleft_middle_tipleft_ring_tipleft_pinky_tipexoskeleton(外骨骼连杆)
点击展开外骨骼连杆 link 列表
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:
参考 URDF
blender_human_skeleton_v5.urdf — 点击下载 URDF 文件