跳到主要内容
版本:独立版外骨骼手套

接口与数据说明

REST API

  • 前缀/api/v1
  • 地址http://{host}:{port}/api/v1/...
  • Content-Type:JSON(上传接口除外)
方法路径作用示例命令
GET/streamsWebSocket 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_toolscurl -s http://127.0.0.1:8080/api/v1/hands/configs
POST/hands/select选手型并启动进程链(exo/transform/controllercurl -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_tfcurl -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_idscopeROS topic(模板)ROS 类型方向
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/<手型名>/poses_<new_parent_frame>PoseArraysubscribe
io_align.poses_right.robotnamehand/io_align/<手型名>/poses_<new_parent_frame>PoseArraysubscribe
io_teleop.joint_cmd_left.robotnamehand/io_teleop/<手型名>/joint_cmd_finger_leftJointStatesubscribe
io_teleop.joint_cmd_right.robotnamehand/io_teleop/<手型名>/joint_cmd_finger_rightJointStatesubscribe
io_esk.vibration_feedback/io_esk/vibration_feedbackFloat64MultiArraypublish

ROS2 接口

如需直接通过 ROS2 订阅/发布数据,可使用以下 Topic:

输入

  • /io_esk/vibration_feedback

    • Topic/io_esk/vibration_feedback
    • Typestd_msgs/Float64MultiArray
    • 响应频率:120Hz
    • 用途:用于外骨骼指尖振动反馈
    • 内容解释
    // Float64MultiArray
    // ros 官方msg
    std_msgs/MultiArrayLayout layout
    float64[] data
    // 震动等级: 1-10级别,0为不震动
    // 接收力反馈数据序号: 顺序: 0-4 右手,5-9 左手。
    // 右手从thumb->pinky->ring->middle->index
    // 左手从thumb->index->middle->ring->pinky

输出

  • /io_esk/joint_data

    • Topic/io_esk/joint_data
    • Typesensor_msgs/JointState.msg
    • 输出频率:120Hz
    • 用途:输出外骨骼手套关节编码器数据
  • /io_esk/joystick_data

    • Topic/io_esk/joystick_data
    • Typesensor_msgs/Joy.msg
    • 输出频率:120Hz
    • 用途:输出外骨骼手指控制单元摇杆数据
    • 内容解释
    std_msgs/Header header
    float32[2] axes #右
    float32[2] axes #左
    int32[4] buttons#右
    int32[4] buttons#左
  • /io_fusion/tf_exoskeleton

    • Topic/io_fusion/tf_exoskeleton
    • Typetf2_msgs/TFMessage.msg
    • 输出频率:120Hz
    • 用途:输出外骨骼手套所有连杆数据
    • 内容解释:外骨骼所有link的位置与姿态信息
    //TFMessage.msg
    geometry_msgs/TransformStamped[] transforms
    • 发布 tf 为如下 link 相对于 base_link 的坐标变化:

      tips(指尖)

      点击展开指尖 link 列表
      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(外骨骼连杆)

      点击展开外骨骼连杆 link 列表
      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

参考 URDF

blender_human_skeleton_v5.urdf — 点击下载 URDF 文件