Files
smart_wasm/docs/robot_kinematics_api.md
2026-06-16 15:51:52 +08:00

17 KiB
Raw Permalink Blame History

URDF/Orocos KDL 机器人算法接口文档

本文档说明当前机器人运动学模块对外暴露的业务接口,包括功能、参数、返回值和单位约定。接口定义以 src/api/KinematicsWebAPI.RobotCommands.cpp 当前实现为准。

1. 通用调用格式

所有业务命令都通过统一 JSON 请求进入 KinematicsWebAPI::func

{
  "msg": "request message",
  "req_code": "REQ_001",
  "req_from": "client",
  "req_cmd": "Cmd_Name",
  "req_param": {}
}
字段 类型 必填 说明
msg string 调用说明。失败时如果业务层没有更具体错误,可能回传为响应 msg
req_code string 调用方请求编号,响应中原样返回。
req_from string 调用来源,响应中原样返回。
req_cmd string 命令名称。
req_param object 命令参数。

统一响应外层格式如下:

{
  "success": true,
  "code": 0,
  "msg": "request message",
  "req_code": "REQ_001",
  "req_from": "client",
  "req_cmd": "Cmd_Name",
  "timestamp": 1792137600,
  "res_data": {}
}
字段 类型 说明
success boolean 外层调用是否成功。业务层返回 success:falseerror 时为 false
code number 0 表示成功,1000 表示业务失败,400 表示 JSON 格式错误,500 表示处理异常。
msg string 响应消息。失败时优先取业务层 messageerror
res_data object 业务命令返回体。本文后续“返回值”均指 res_data 内部结构。

2. 单位和格式约定

数据 格式 单位
关节角 j1,j2,j3,j4,j5,j6 弧度 rad
关节角序列 j1,j2,j3,j4,j5,j6;j1,j2,j3,j4,j5,j6 弧度 rad
TCP 位姿 x,y,z,qx,qy,qz,qw 位置为米 m姿态为四元数
TCP 位姿序列 x,y,z,qx,qy,qz,qw;x,y,z,qx,qy,qz,qw 位置为米 m姿态为四元数
URDF 关节上下限 URDF <limit lower upper> 旋转关节为弧度 rad
objStates 位姿 tx,ty,tz,qx,qy,qz,qw 位置为米 m姿态为四元数

注意WASM/KDL 侧返回的 IK 关节结果是弧度。如果前端工艺数据使用角度,需要在前端显式做 rad -> deg 转换。

3. 机器人管理接口

3.1 Cmd_InitRobot

功能:注册或更新机器人 URDF并初始化 KDL Tree、6 轴运动学链、FK/IK 求解器、关节上下限和关节 child link 映射。

参数:

字段 类型 必填 默认值 说明
robot_uuid string "" 机器人实例 ID。为空时内部使用 URDF 内容哈希作为 ID。
urdf_base64 string "" URDF 文件内容的 base64 字符串。
force_update boolean true 是否强制更新。为 false 且内容未变化时跳过更新。

返回值:

字段 类型 说明
success boolean 初始化是否成功。
message string 初始化结果说明。
timestamp string 当前时间字符串。

示例:

{
  "req_cmd": "Cmd_InitRobot",
  "req_param": {
    "robot_uuid": "abb_irb120_3_58",
    "urdf_base64": "PD94bWwgdmVyc2lvbj0iMS4wIj8+...",
    "force_update": true
  }
}

3.2 Cmd_GetRobot

功能:查询指定机器人实例是否存在、是否已初始化以及关节数量。

参数:

字段 类型 必填 默认值 说明
uuid string "" 机器人实例 ID。注意该接口当前字段名为 uuid,不是 robot_uuid

返回值:

字段 类型 说明
success boolean 查询是否成功。
uuid string 机器人实例 ID。
initialized boolean 机器人是否已初始化。
joints_count number 当前运动学链关节数量。
timestamp string 当前时间字符串。

失败时返回:

{
  "error": "Robot not found"
}

3.3 Cmd_RemoveRobot

功能:删除指定机器人实例和对应 URDF 哈希记录。

参数:

字段 类型 必填 默认值 说明
uuid string "" 机器人实例 ID。注意该接口当前字段名为 uuid,不是 robot_uuid

返回值:

字段 类型 说明
success boolean 删除是否成功。
message string 删除结果说明。
timestamp string 当前时间字符串。

3.4 Cmd_ListRobots

功能:列出当前已注册的机器人实例。

参数:

字段 类型 必填 默认值 说明
detail boolean false 是否返回关节数量、校验状态和 URDF 哈希摘要。

返回值:

字段 类型 说明
success boolean 是否查询成功。
robots object 机器人字典。键为机器人 ID值为实例说明或详细信息字符串。
count number 当前机器人数量。
timestamp string 当前时间字符串。

4. 正运动学接口

4.1 Cmd_Kinematics_forward_pose_str

功能:输入 6 个关节角,计算 TCP 位姿。

参数:

字段 类型 必填 默认值 说明
robot_uuid string "default" 机器人实例 ID。
q_init_str string "0,0,0,0,0,0" 6 个关节角,单位为弧度。该字段名为历史命名,实际表示 FK 输入关节。

返回值:

字段 类型 说明
position number[] TCP 位置 [x,y,z],单位为米。
orientation number[] TCP 四元数 [qx,qy,qz,qw]
joints number[] 输入关节角,单位为弧度。
success boolean 正解是否成功。

失败时常见错误:

错误 说明
Robot not found or not initialized 机器人未注册或初始化失败。
Invalid joints format 关节字符串不是 6 个数值。
Forward kinematics calculation failed FK 失败,常见原因包括关节超限。

示例:

{
  "req_cmd": "Cmd_Kinematics_forward_pose_str",
  "req_param": {
    "robot_uuid": "abb_irb120_3_58",
    "q_init_str": "0.15,-0.25,0.35,0.1,-0.2,0.3"
  }
}

4.2 Cmd_Kinematics_forward_all_joints

功能:输入一帧或多帧 6 轴关节角,计算每一帧中各关节节点位姿,并按前端 OPERATION.frames.objStates 格式输出。

参数:

字段 类型 必填 默认值 说明
robot_uuid string "default" 机器人实例 ID。
joints_str string "0,0,0,0,0,0" 关节角序列,格式为 j1,j2,j3,j4,j5,j6;...,单位为弧度。

返回值:

当前返回存在一层历史嵌套,结构如下:

{
  "success": true,
  "OPERATION": {
    "success": true,
    "count": 2,
    "OPERATION": {
      "frames": [
        {
          "time": "0.020000",
          "objStates": [
            {
              "i": "child_link_uuid",
              "tx": 0,
              "ty": 0,
              "tz": 0,
              "qx": 0,
              "qy": 0,
              "qz": 0,
              "qw": 1
            }
          ]
        }
      ]
    }
  }
}
字段 类型 说明
OPERATION.success boolean 批量 FK 是否成功。
OPERATION.count number 输入关节帧数量。
OPERATION.OPERATION.frames array 前端播放帧。
frames[].time string 当前实现固定为 "0.020000"
frames[].objStates array 每个关节 child link 对应的对象位姿。
objStates[].i string URDF 中解析出的 child link UUID。
objStates[].tx/ty/tz number link 位置,单位为米。
objStates[].qx/qy/qz/qw number link 姿态四元数。

失败时常见错误:

错误 说明
Empty joints input 未解析到有效关节帧。
每组关节角都必须包含 6 个值 某一帧关节数量不是 6。
Forward kinematics calculation for all joints failed FK 失败,常见原因包括关节超限。

5. 逆运动学接口

5.1 Cmd_Kinematics_inverse_pose_str

功能:输入一个或多个 TCP 位姿,执行逆运动学。单点时直接求解;多点时对相邻位姿自动估算步数并插补,再逐点求 IK。

参数:

字段 类型 必填 默认值 说明
robot_uuid string "default" 机器人实例 ID。
pose_str string "" 位姿或位姿序列,格式为 x,y,z,qx,qy,qz,qw;...。位置单位为米。
q_init_str string "0,0,0,0,0,0" IK 初始关节角,单位为弧度。用于影响多解选择和求解连续性。

返回值:

字段 类型 说明
joints number[][] 逆解关节序列,每组 6 个关节角,单位为弧度。
success boolean IK 是否成功。

实现说明:

  • 单点输入返回 1 组关节解。
  • 多点输入会对相邻点自动插补,自动步数范围当前为 10 到 100。
  • 逐点 IK 成功后,会把上一点结果作为下一点初值。
  • 逐点 IK 失败时,若已有成功结果则复用上一组结果,否则复用初始关节角,避免轨迹数组中断。

示例:

{
  "req_cmd": "Cmd_Kinematics_inverse_pose_str",
  "req_param": {
    "robot_uuid": "abb_irb120_3_58",
    "pose_str": "0.374,0,0.63,0,0,0,1",
    "q_init_str": "0,0,0,0,0,0"
  }
}

5.2 Cmd_Kinematics_inverse_pose_str_2PSteps

功能:输入两个 TCP 位姿,按调用方指定步数进行插补,并对插补点逐点求 IK。主要用于 MoveL 直线路径的离散关节解生成。

参数:

字段 类型 必填 默认值 说明
robot_uuid string "default" 机器人实例 ID。
pose_str string "" 起点和终点位姿,格式为 pose1;pose2。如果只传 1 个点,则直接求单点 IK。
q_init_str string "0,0,0,0,0,0" IK 初始关节角,单位为弧度。
steps_str string "default" 插补点数量字符串,例如 "30"。当前实现会调用 stoi 转整数,不能传非数字。

返回值:

字段 类型 说明
joints number[][] 逆解关节序列,每组 6 个关节角,单位为弧度。
success boolean IK 是否成功。

实现说明:

  • 返回值是弧度,不是角度。
  • 插补过程中每一点 IK 成功后,会更新下一点的初值。
  • 如果某个插补点 IK 失败,会复用上一组成功结果;若还没有成功结果,则复用初始关节角。

示例:

{
  "req_cmd": "Cmd_Kinematics_inverse_pose_str_2PSteps",
  "req_param": {
    "robot_uuid": "abb_irb120_3_58",
    "pose_str": "0.374,0,0.63,0,0,0,1;0.4626,0.2209,0.334,0.148283,0.435718,0.079062,0.884258",
    "q_init_str": "0,0,0,0,0,0",
    "steps_str": "30"
  }
}

5.3 Cmd_Kinematics_inverse_pose_str_NoDifference

功能:直接对输入位姿点执行 IK不做相邻点插补。适用于调用方已经生成了离散轨迹点只需要逐点求关节解的场景。

参数:

字段 类型 必填 默认值 说明
robot_uuid string "default" 机器人实例 ID。
pose_str string "" 位姿或位姿序列,格式为 x,y,z,qx,qy,qz,qw;...
q_init_str string "0,0,0,0,0,0" IK 初始关节角,单位为弧度。

返回值:

字段 类型 说明
joints number[][] 逆解关节序列,每组 6 个关节角,单位为弧度。
success boolean IK 是否成功。

实现说明:

  • 单点输入返回 1 组关节解。
  • 多点输入不插补,逐点求解,并用上一点成功结果作为下一点初值。
  • 当前多点实现循环到 posePoints.size() - 1,最后一个输入位姿不会被求解;如果业务需要完整多点结果,建议后续修正。

6. 奇异点检测接口

6.1 Cmd_Kinematics_check_singularity

功能:基于当前关节姿态计算 TCP 雅可比矩阵,对奇异值、条件数和可操作度进行评估,返回 normalwarningsingular 风险等级。

参数:

字段 类型 必填 默认值 说明
robot_uuid string "default" 机器人实例 ID。
joints_str string q_init_str"0,0,0,0,0,0" 6 个关节角,单位为弧度。
q_init_str string "0,0,0,0,0,0" 兼容字段。未传 joints_str 时使用。
singular_threshold number 1e-4 最小奇异值低于或等于该阈值时判定为奇异。
warning_threshold number 1e-2 最小奇异值低于或等于该阈值时判定为接近奇异。
condition_threshold number 1e6 条件数大于或等于该阈值时判定为奇异。
condition_warning_threshold number 1e4 条件数大于或等于该阈值时判定为接近奇异。

返回值:

字段 类型 说明
success boolean 检测是否成功。
is_singular boolean 是否判定为奇异。
is_near_singular boolean 是否判定为接近奇异。
risk_level string 风险等级:normalwarningsingular
rank number 雅可比矩阵秩。
joint_count number 运动学链关节数量。
min_singular_value number 最小奇异值。
max_singular_value number 最大奇异值。
condition_number number 条件数。最小奇异值为 0 时为无穷大。
manipulability number 可操作度指标,当前为全部奇异值乘积。
singular_values number[] 雅可比矩阵奇异值。
thresholds object 本次检测使用的阈值。
joints number[] 输入关节角,单位为弧度。
jacobian number[][] TCP 雅可比矩阵。

示例:

{
  "req_cmd": "Cmd_Kinematics_check_singularity",
  "req_param": {
    "robot_uuid": "abb_irb120_3_58",
    "joints_str": "0.15,-0.25,0.35,0.1,-0.2,0.3"
  }
}

风险判断逻辑:

  • singularmin_singular_value <= singular_threshold,或 condition_number >= condition_threshold,或 rank < joint_count
  • warning:未达到 singular,但 min_singular_value <= warning_thresholdcondition_number >= condition_warning_threshold
  • normal:不满足以上风险条件。

失败时常见错误:

错误 说明
Invalid joints format 关节字符串不是 6 个数值。
Joint value out of limits 输入关节超出 URDF 上下限。
Jacobian calculation failed 雅可比矩阵计算失败。

7. 非运动学占位接口

以下命令目前也由机器人命令处理器识别,但不是机器人运动学算法接口,当前仅返回固定成功结构。

7.1 Cmd_SelectCraftTree

功能:占位接口,表示选择工艺树。

参数:

字段 类型 必填 默认值 说明
tree_id string "" 工艺树 ID。

返回值:

字段 类型 说明
success boolean 固定为 true
tree_id string 输入工艺树 ID。
message string 固定成功消息。
timestamp string 当前时间字符串。

7.2 Cmd_AddOperationTree

功能:占位接口,表示新增操作树。

参数:

字段 类型 必填 默认值 说明
name string "" 操作树名称。
operations array [] 操作列表。

返回值:

字段 类型 说明
success boolean 固定为 true
tree_name string 输入操作树名称。
operations_count number 输入操作数量。
message string 固定成功消息。
timestamp string 当前时间字符串。

8. 关节上下限和初始化约束

初始化机器人时会执行以下检查和准备:

  • URDF 必须能解析为 KDL Tree。
  • 模块会自动推导一条 6 轴串联运动学链,不再固定依赖 base_linkbasetool0 等名称。
  • 当前只支持 6 轴机器人链,非 6 轴会初始化失败。
  • 会从 URDF <limit lower="..." upper="..."> 读取关节上下限。
  • FK 输入、全关节 FK 输入、IK 初值、IK 结果、奇异点检测输入都会执行关节上下限检查。

9. 常见接入建议

  • 前端 MoveJ 工艺通常使用角度数据做关节空间插值,调用 FK 前需要统一转为弧度。
  • 前端 MoveL 工艺应把 TCP 位姿传给 IK 接口IK 返回弧度后如需存入角度工艺数据,需要转为角度。
  • 连续 MoveL 或 MoveJ 后接 MoveL 时,建议把上一段末尾关节作为下一段 q_init_str,保证 IK 多解选择更连续。
  • 奇异点检测只能发现风险,不会自动规避路径;规避需要结合多解选择、路径调整、姿态微调或工艺点重规划。
  • Cmd_Kinematics_forward_pose_str 的入参字段名 q_init_str 属于历史命名,实际含义是 FK 输入关节角。