# 接口调用履历

本文档用于快速梳理当前项目里“前端请求 -> WASM 导出函数 -> C++ 分发层 -> 业务实现文件”的执行链路，便于对照源码阅读。

## 1. 建议先看的总入口

建议按下面顺序看文件：

1. `src/main.cpp`
   说明这个工程最终是一个 WASM 可执行模块，`main` 主要用于本地构建提示。
2. `src/smart_json_wrapper.cpp`
   这里是所有 WASM 导出函数的真正入口。
3. `include/KinematicsWebAPI.h`
   业务接口类声明，能看见分发结构。
4. `src/api/KinematicsWebAPI.Core.cpp`
   业务 JSON 请求的总分发入口。
5. `src/api/KinematicsWebAPI.*Commands.cpp`
   按功能拆开的命令处理层。
6. 对应底层业务文件
   机器人看 `src/Robot.cpp`、`src/RobotManager.cpp`
   SPC 看 `src/spc_core.cpp`
   四连杆看 `src/FourBarMechanism/`
   四足看 `src/QuadrupedRobotSimulation/`

## 2. 顶层 WASM 导出接口

### 2.1 业务接口导出

前端主调的是这两个导出函数：

- `init_func`
- `func`

调用链如下：

```text
JS/HTML
-> public/wasm/smart_api_wrapper.js
-> WASM 导出函数 init_func / func
-> src/smart_json_wrapper.cpp
-> KinematicsWebAPI
-> src/api/KinematicsWebAPI.Core.cpp
-> 各功能 Commands 文件
-> 底层业务实现
```

### 2.2 智能数学/测试接口导出

这一套和业务接口是并行的另一条线：

- `smart_process_json`
- `smart_get_function_list`
- `smart_get_function_info`
- `smart_test_match`
- `smart_get_version`

调用链如下：

```text
JS/HTML
-> public/wasm/smart_api_wrapper.js
-> smart_* 导出函数
-> src/smart_json_wrapper.cpp
-> SmartJsonProcessor / FunctionRegistry
-> math_utils / 注册的测试函数
```

这一套主要是“数学函数演示 + 智能参数匹配”，不走 `KinematicsWebAPI`。

## 3. 业务总分发链路

### 3.1 初始化

`src/smart_json_wrapper.cpp` 中：

- `init_func()`
  - 首次调用时创建全局单例 `global_server = new KinematicsWebAPI()`
  - `KinematicsWebAPI` 构造函数里会继续调用 `KinematicsWebAPI::init_func()`

`src/api/KinematicsWebAPI.Core.cpp` 中：

- `KinematicsWebAPI::init_func()`
  - 从 `include/URDFStrings.h` 读取默认 URDF
  - 调用 `RobotManager::initRobot(...)`
  - 默认会初始化两个机器人实例

### 3.2 请求处理

`src/smart_json_wrapper.cpp`

- `func(const char* json_request)`
  - 把前端 JSON 字符串转成 `std::string`
  - 调 `global_server->func(request_str)`

`src/api/KinematicsWebAPI.Core.cpp`

- `KinematicsWebAPI::func(std::string sanitized_body)`
  - 解析 JSON
  - 取出 `msg / req_code / req_from / req_cmd / req_param`
  - 调 `dispatchCommand(req_cmd, req_param)`
  - 最后统一封装为 `utils::create_api_response(...)`

- `KinematicsWebAPI::dispatchCommand(...)`
  - 机器人类命令 -> `handleRobotCommand(...)`
  - SPC -> `handleSpcCommand(...)`
  - 四连杆 -> `handleFourBarCommand(...)`
  - 四足 -> `handleQuadrupedCommand(...)`

## 4. 机器人相关接口履历

机器人相关命令都在：

- `src/api/KinematicsWebAPI.RobotCommands.cpp`

底层核心文件：

- `src/RobotManager.cpp`
- `src/Robot.cpp`

### 4.1 `Cmd_InitRobot`

调用履历：

```text
func
-> KinematicsWebAPI::dispatchCommand
-> KinematicsWebAPI::handleRobotCommand
-> Cmd_InitRobot 分支
-> utils::base64_to_urdf
-> utils::validate_urdf_base64
-> RobotManager::initRobot
-> Robot::initRobot
```

底层细节：

- `RobotManager::initRobot`
  - 创建 `std::shared_ptr<Robot>`
  - 调 `robot->initRobot(urdf_robot)`
  - 生成或使用 `robot_uuid`
  - 计算 URDF 哈希
  - 调 `_validateKinematics(robot)` 做基本正解验证
  - 存入 `_kinematics_table`

- `Robot::initRobot`
  - `kdl_parser::treeFromString(...)`
  - `tree.getChain("base", "tool0", kinematicChain)`
  - `parseJointChildLinkUuidsFromUrdf(...)`
  - 初始化 FK / IK 求解器

### 4.2 `Cmd_GetRobot`

调用履历：

```text
func
-> dispatchCommand
-> handleRobotCommand
-> Cmd_GetRobot
-> RobotManager::getRobot
-> Robot::isInitialized / Robot::getNumberOfJoints
```

### 4.3 `Cmd_RemoveRobot`

调用履历：

```text
func
-> dispatchCommand
-> handleRobotCommand
-> Cmd_RemoveRobot
-> RobotManager::removeRobot
```

### 4.4 `Cmd_ListRobots`

调用履历：

```text
func
-> dispatchCommand
-> handleRobotCommand
-> Cmd_ListRobots
-> RobotManager::listRobots
-> detail=true 时内部还会调 RobotManager::_validateKinematics
-> Robot::calculateFK_TCP
```

### 4.5 `Cmd_Kinematics_forward_pose_str`

用途：

- 输入一组 6 轴关节角
- 输出 TCP 位姿

调用履历：

```text
func
-> dispatchCommand
-> handleRobotCommand
-> Cmd_Kinematics_forward_pose_str
-> RobotManager::getRobot
-> Robot::parseJointString
-> Robot::calculateFK_TCP
```

`Robot::calculateFK_TCP` 内部主要做：

- 关节数组转 `KDL::JntArray`
- `fkSolver->JntToCart(...)`
- 取出位置和四元数

### 4.6 `Cmd_Kinematics_forward_all_joints`

用途：

- 输入一帧或多帧关节角列表
- 输出每个关节节点的位姿，组织成前端使用的 `OPERATION.frames[].objStates`

调用履历：

```text
func
-> dispatchCommand
-> handleRobotCommand
-> Cmd_Kinematics_forward_all_joints
-> RobotManager::getRobot
-> Robot::handleKinematicsForwardAllJoints
-> Robot::parseJointListString
-> Robot::kinematicsForwardAllJointsList
-> Robot::forwardKinematics
-> Robot::getJointUuidByIndex
```

补充说明：

- `Robot::handleKinematicsForwardAllJoints(...)`
  - 遍历每一帧关节角
  - 每帧都调一次 `kinematicsForwardAllJointsList(...)`
- `Robot::kinematicsForwardAllJointsList(...)`
  - 调 `forwardKinematics(...)`
  - 把 6 个关节的位姿打包成 `objStates`

### 4.7 `Cmd_Kinematics_inverse_pose_str_NoDifference`

用途：

- 输入一个或多个姿态点
- 不做插补，直接逐点逆解

调用履历：

```text
func
-> dispatchCommand
-> handleRobotCommand
-> Cmd_Kinematics_inverse_pose_str_NoDifference
-> RobotManager::getRobot
-> Robot::inversePoseStrNoDifference
-> Robot::parsePoseString
-> Robot::parseJointString
-> Robot::inverse(vector)
-> Robot::calculateIK_LMA
```

### 4.8 `Cmd_Kinematics_inverse_pose_str`

用途：

- 输入多个姿态点
- 相邻姿态间先自动插补轨迹，再逐点逆解

调用履历：

```text
func
-> dispatchCommand
-> handleRobotCommand
-> Cmd_Kinematics_inverse_pose_str
-> RobotManager::getRobot
-> Robot::inversePoseStr
-> Robot::parsePoseString
-> Robot::parseJointString
-> Robot::calculateAutoSteps
-> Robot::trajectoryPlanning
-> Robot::inverse(vector)
-> Robot::calculateIK_LMA
```

关键点：

- `calculateAutoSteps(...)` 根据位置差和姿态差自动算插补点数
- `trajectoryPlanning(...)` 调 KDL 轨迹插补
- 每个插补点再进入 `inverse(...)`

### 4.9 `Cmd_Kinematics_inverse_pose_str_2PSteps`

用途：

- 只取两个姿态点
- 按指定 `steps` 做轨迹插补

调用履历：

```text
func
-> dispatchCommand
-> handleRobotCommand
-> Cmd_Kinematics_inverse_pose_str_2PSteps
-> RobotManager::getRobot
-> Robot::inversePoseStr2PSteps
-> Robot::parsePoseString
-> Robot::parseJointString
-> Robot::trajectoryPlanning(..., steps)
-> Robot::inverse(vector)
-> Robot::calculateIK_LMA
```

### 4.10 `Cmd_SelectCraftTree` / `Cmd_AddOperationTree`

这两个目前是轻量占位接口。

调用履历：

```text
func
-> dispatchCommand
-> handleRobotCommand
-> 直接在 KinematicsWebAPI.RobotCommands.cpp 内拼装返回 JSON
```

当前没有继续下钻到独立业务类。

## 5. SPC 接口履历

命令文件：

- `src/api/KinematicsWebAPI.SpcCommands.cpp`

底层文件：

- `include/spc_core.h`
- `src/spc_core.cpp`

### 5.1 `Cmd_Spc`

调用履历：

```text
func
-> dispatchCommand
-> handleSpcCommand
-> SpcCalculator::Spc
-> SpcTestData::FromJson
-> SpcCalculator::CalculateXR
-> SpcCalculator::CalculateXS
-> SpcCalculator::CalculateCpk
-> SpcCalculator::RoundSpcData
-> SpcResultJson::ToJson
```

底层职责分布：

- `SpcTestData::FromJson`
  - 从请求中读取 `n / k / usl / lsl / x`
- `CalculateXR`
  - 算 X-R 控制图
- `CalculateXS`
  - 算 X-S 控制图
- `CalculateCpk`
  - 算过程能力指数和直方图数据
- `RoundSpcData`
  - 做统一小数位保留

## 6. 四连杆接口履历

命令文件：

- `src/api/KinematicsWebAPI.FourBarCommands.cpp`

底层文件：

- `include/FourBarMechanism/CrankSliderMechanism.h`
- `src/FourBarMechanism/CrankSliderMechanism.cpp`

### 6.1 `Cmd_FourBar_CrankSlider`

调用履历：

```text
func
-> dispatchCommand
-> handleFourBarCommand
-> createCrankSliderMechanism
-> CrankSliderMechanism::setL_AB / setL_BS / setS_OFS
-> CrankSliderMechanism::validateParameters
-> CrankSliderMechanism::calculate
-> CrankSliderMechanism::getTrajectoryPoints
-> CrankSliderMechanism::getSliderTrajectory
```

说明：

- 命令层负责把参数取出来、调机制对象、再把结果组装成 JSON
- 真正的机构计算在 `src/FourBarMechanism/CrankSliderMechanism.cpp`

### 6.2 `Cmd_FourBar_CrankSlider_Simulate`

用途：

- 输入曲柄滑块初始参数、起始角度、结束角度、总时长和步长时间
- 一次性生成整段仿真帧数据，适合前端播放、导出轨迹和离线验证

调用履历：

```text
func
-> dispatchCommand
-> handleFourBarCommand
-> createCrankSliderMechanism
-> CrankSliderMechanism::setL_AB / setL_BS / setS_OFS
-> CrankSliderMechanism::validateParameters
-> for each frame:
   -> CrankSliderMechanism::calculate(currentAngleDeg)
-> CrankSliderMechanism::getTrajectoryPoints
-> CrankSliderMechanism::getSliderTrajectory
```

主要入参：

- `L_AB`：曲柄长度
- `L_BS`：连杆长度
- `S_OFS`：滑块偏移
- `startAngleDeg`：起始曲柄角度
- `endAngleDeg`：结束曲柄角度
- `duration`：仿真总时长，单位秒
- `stepTime`：仿真步长时间，单位秒

主要出参：

- `frames[]`：逐帧仿真数据，每帧包含 `frame`、`time`、`angleDeg`、`points`、`poses`、`angles`
- `trajectory`：B 点整段轨迹
- `slider_trajectory`：S 点整段滑块轨迹

### 6.3 `Cmd_FourBar_Simulate`

用途：

- 统一仿真 PDPS 连杆定义界面中的 `PRRR / RPRR / RRRP / RRRR` 四类结构
- 输入机构类型、起始输入、结束输入、总时长和步长时间
- 一次性返回逐帧点位、姿态、角度和轨迹，适合前端 Three.js 播放和 ECharts 曲线验证

调用履历：

```text
func
-> dispatchCommand
-> handleFourBarCommand
-> simulateUnifiedFourBar
-> 按 mechanismType 创建或调用对应机构类
-> validateParameters
-> for each frame:
   -> calculate(currentInput)
-> 组装 frames / trajectory / parameters
```

类型映射：

- `RRRP`：调用 `CrankSliderMechanism`，角度驱动曲柄滑块正解
- `PRRR`：调用 `SliderCrankMechanism`，滑块位移驱动曲柄滑块逆解
- `RPRR`：调用 `CrankRockingBlockMechanism_Forward`，当前按曲柄摇块正解承接
- `RRRR`：调用 `FourBarMechanism`，角度驱动四转副四杆正解

主要公共入参：

- `mechanismType`：`PRRR`、`RPRR`、`RRRP`、`RRRR`
- `startValue` / `endValue`：统一输入范围，角度驱动类型表示角度，`PRRR` 表示滑块 X
- `duration`：仿真总时长，单位秒
- `stepTime`：仿真步长时间，单位秒

各类型参数：

- `RRRP`：`L_AB`、`L_BS`、`S_OFS`
- `PRRR`：`L_AB`、`L_BS`、`S_OFS`，也可使用 `startSliderX` / `endSliderX`
- `RPRR`：`OA`、`AB`、`OC`
- `RRRR`：`L1`、`L2`、`L3`、`L4`

主要出参：

- `mechanismType`：实际仿真的机构类型
- `inputName`：当前输入字段名，`angleDeg` 或 `sliderX`
- `frames[]`：逐帧仿真数据，每帧包含 `frame`、`time`、`inputValue`、`points`、`poses`、`angles`
- `trajectory`：主运动点轨迹
- `slider_trajectory`：滑块轨迹，适用于 `RRRP / PRRR`
- `alternative_trajectory`：备选逆解轨迹，适用于 `PRRR`
- `trajectory_c`：C 点轨迹，适用于 `RRRR`
- `crank_circle`：曲柄端点轨迹，适用于 `RPRR / RRRR`
- `rocker_trajectory`：摇块轨迹，适用于 `RPRR`

注意：

- `RPRR` 当前先复用现有曲柄摇块正解类，PDPS 中输入/输出链节的方向、坐标系和安装约定后续如有更精确资料，可继续对齐参数语义。

## 7. 四足机器人接口履历

命令文件：

- `src/api/KinematicsWebAPI.QuadrupedCommands.cpp`

中间帮助层：

- `include/QuadrupedRobotSimulation/KinematicsHelper.h`
- `src/QuadrupedRobotSimulation/KinematicsHelper.cpp`

底层实现文件：

- `src/QuadrupedRobotSimulation/KinematicsSimulation.cpp`
- `src/QuadrupedRobotSimulation/KinematicsReverse.cpp`
- `src/QuadrupedRobotSimulation/CompleteJsonExporter.cpp`
- `src/QuadrupedRobotSimulation/RobotConfig.cpp`
- `src/QuadrupedRobotSimulation/SharedGeometry.cpp`

### 7.1 `Cmd_QuadrupedRobot_CalculateAllPointsFromMotorAngles`

用途：

- 输入电机角
- 反推出各关键点坐标

调用履历：

```text
func
-> dispatchCommand
-> handleQuadrupedCommand
-> KinematicsHelper::QuadrupedRobot_CalculateAllPointsFromMotorAngles
-> KinematicsHelper::RobotGaitDataManagerFromJson
-> ReverseKinematicsCalculator
-> ReverseKinematicsCalculator::CalculateAllPointsFromMotorAnglesJsonStr
-> json::parse
```

说明：

- 数据管理入口在 `RobotGaitDataManagerFromJson(...)`
- 反解主逻辑在 `src/QuadrupedRobotSimulation/KinematicsReverse.cpp`

### 7.2 `Cmd_QuadrupedRobot_PerformForwardKinematics`

用途：

- 输入步态/系统参数
- 正向生成四足机器人整段步态轨迹

调用履历：

```text
func
-> dispatchCommand
-> handleQuadrupedCommand
-> KinematicsHelper::QuadrupedRobot_PerformForwardKinematics
-> KinematicsHelper::RobotGaitDataManagerFromJson
-> QuadrupedRobotConfiguration
-> QuadrupedRobotSimulation
-> QuadrupedRobotSimulation::CalculateAllTrajectoriesJsonString
-> CompleteJsonExporter::ExportCompleteDataJsonString
-> json::parse
```

说明：

- 配置拼装在 `RobotConfig.cpp`
- 轨迹生成主体在 `KinematicsSimulation.cpp`
- 最终 JSON 打包在 `CompleteJsonExporter.cpp`

## 8. 智能数学接口履历

这部分不是机器人业务，但也常会看到。

核心文件：

- `src/smart_json_wrapper.cpp`
- `include/smart_json_wrapper.h`
- `src/math_utils.cpp`

### 8.1 `smart_process_json`

调用履历：

```text
smart_process_json
-> SmartJsonProcessor::processRequest
-> 解析 req_cmd
-> FunctionRegistry::getFunction
-> SmartJsonProcessor::parseJsonParams
-> FunctionRegistry::smartMatchParams
-> FunctionInfo::validateParams
-> function handler lambda
-> math_utils 中的 add/subtract/multiply/divide/fibonacci 等
```

### 8.2 `smart_get_function_list`

调用履历：

```text
smart_get_function_list
-> SmartJsonProcessor::getAvailableFunctions
-> FunctionRegistry::getAllFunctions
```

### 8.3 `smart_get_function_info`

调用履历：

```text
smart_get_function_info
-> SmartJsonProcessor::getFunctionInfo
-> FunctionRegistry::getFunction
```

### 8.4 `smart_test_match`

调用履历：

```text
smart_test_match
-> 解析 req_cmd
-> FunctionRegistry::getFunction
-> SmartJsonProcessor::parseJsonParams
-> FunctionRegistry::smartMatchParams
-> 返回匹配结果，不真正执行业务函数
```

## 9. 文件职责一览

### 9.1 入口层

- `src/main.cpp`
  - 构建入口，基本不承接业务
- `src/smart_json_wrapper.cpp`
  - 所有 WASM 导出函数
  - 业务接口入口和智能数学接口入口都在这里

### 9.2 业务分发层

- `src/api/KinematicsWebAPI.Core.cpp`
  - 总分发
- `src/api/KinematicsWebAPI.RobotCommands.cpp`
  - 机器人接口分支
- `src/api/KinematicsWebAPI.SpcCommands.cpp`
  - SPC 接口分支
- `src/api/KinematicsWebAPI.FourBarCommands.cpp`
  - 四连杆接口分支
- `src/api/KinematicsWebAPI.QuadrupedCommands.cpp`
  - 四足接口分支

### 9.3 业务实现层

- `src/RobotManager.cpp`
  - 机器人实例生命周期管理
- `src/Robot.cpp`
  - 机器人 KDL 正解、逆解、轨迹插补、前端返回格式组装
- `src/spc_core.cpp`
  - SPC 计算主体
- `src/FourBarMechanism/*.cpp`
  - 连杆/曲柄滑块算法
- `src/QuadrupedRobotSimulation/*.cpp`
  - 四足机器人轨迹与反解

## 10. 如果你要继续顺着看，推荐顺序

如果你想先搞清“机器人接口”：

1. `src/smart_json_wrapper.cpp` 里的 `func`
2. `src/api/KinematicsWebAPI.Core.cpp`
3. `src/api/KinematicsWebAPI.RobotCommands.cpp`
4. `src/RobotManager.cpp`
5. `src/Robot.cpp`

如果你想先搞清“四足机器人接口”：

1. `src/api/KinematicsWebAPI.QuadrupedCommands.cpp`
2. `src/QuadrupedRobotSimulation/KinematicsHelper.cpp`
3. `src/QuadrupedRobotSimulation/KinematicsSimulation.cpp`
4. `src/QuadrupedRobotSimulation/KinematicsReverse.cpp`
5. `src/QuadrupedRobotSimulation/CompleteJsonExporter.cpp`

如果你想先搞清“SPC 接口”：

1. `src/api/KinematicsWebAPI.SpcCommands.cpp`
2. `src/spc_core.cpp`
3. `include/spc_core.h`
