13 KiB
13 KiB
接口调用履历
本文档用于快速梳理当前项目里“前端请求 -> WASM 导出函数 -> C++ 分发层 -> 业务实现文件”的执行链路,便于对照源码阅读。
1. 建议先看的总入口
建议按下面顺序看文件:
src/main.cpp说明这个工程最终是一个 WASM 可执行模块,main主要用于本地构建提示。src/smart_json_wrapper.cpp这里是所有 WASM 导出函数的真正入口。include/KinematicsWebAPI.h业务接口类声明,能看见分发结构。src/api/KinematicsWebAPI.Core.cpp业务 JSON 请求的总分发入口。src/api/KinematicsWebAPI.*Commands.cpp按功能拆开的命令处理层。- 对应底层业务文件
机器人看
src/Robot.cpp、src/RobotManager.cppSPC 看src/spc_core.cpp四连杆看src/FourBarMechanism/四足看src/QuadrupedRobotSimulation/
2. 顶层 WASM 导出接口
2.1 业务接口导出
前端主调的是这两个导出函数:
init_funcfunc
调用链如下:
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_jsonsmart_get_function_listsmart_get_function_infosmart_test_matchsmart_get_version
调用链如下:
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)
- 把前端 JSON 字符串转成
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.cppsrc/Robot.cpp
4.1 Cmd_InitRobot
调用履历:
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::initRobotkdl_parser::treeFromString(...)tree.getChain("base", "tool0", kinematicChain)parseJointChildLinkUuidsFromUrdf(...)- 初始化 FK / IK 求解器
4.2 Cmd_GetRobot
调用履历:
func
-> dispatchCommand
-> handleRobotCommand
-> Cmd_GetRobot
-> RobotManager::getRobot
-> Robot::isInitialized / Robot::getNumberOfJoints
4.3 Cmd_RemoveRobot
调用履历:
func
-> dispatchCommand
-> handleRobotCommand
-> Cmd_RemoveRobot
-> RobotManager::removeRobot
4.4 Cmd_ListRobots
调用履历:
func
-> dispatchCommand
-> handleRobotCommand
-> Cmd_ListRobots
-> RobotManager::listRobots
-> detail=true 时内部还会调 RobotManager::_validateKinematics
-> Robot::calculateFK_TCP
4.5 Cmd_Kinematics_forward_pose_str
用途:
- 输入一组 6 轴关节角
- 输出 TCP 位姿
调用履历:
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
调用履历:
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
用途:
- 输入一个或多个姿态点
- 不做插补,直接逐点逆解
调用履历:
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
用途:
- 输入多个姿态点
- 相邻姿态间先自动插补轨迹,再逐点逆解
调用履历:
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做轨迹插补
调用履历:
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
这两个目前是轻量占位接口。
调用履历:
func
-> dispatchCommand
-> handleRobotCommand
-> 直接在 KinematicsWebAPI.RobotCommands.cpp 内拼装返回 JSON
当前没有继续下钻到独立业务类。
5. SPC 接口履历
命令文件:
src/api/KinematicsWebAPI.SpcCommands.cpp
底层文件:
include/spc_core.hsrc/spc_core.cpp
5.1 Cmd_Spc
调用履历:
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.hsrc/FourBarMechanism/CrankSliderMechanism.cpp
6.1 Cmd_FourBar_CrankSlider
调用履历:
func
-> dispatchCommand
-> handleFourBarCommand
-> createCrankSliderMechanism
-> CrankSliderMechanism::setL_AB / setL_BS / setS_OFS
-> CrankSliderMechanism::validateParameters
-> CrankSliderMechanism::calculate
-> CrankSliderMechanism::getTrajectoryPoints
-> CrankSliderMechanism::getSliderTrajectory
说明:
- 命令层负责把参数取出来、调机制对象、再把结果组装成 JSON
- 真正的机构计算在
src/FourBarMechanism/CrankSliderMechanism.cpp
7. 四足机器人接口履历
命令文件:
src/api/KinematicsWebAPI.QuadrupedCommands.cpp
中间帮助层:
include/QuadrupedRobotSimulation/KinematicsHelper.hsrc/QuadrupedRobotSimulation/KinematicsHelper.cpp
底层实现文件:
src/QuadrupedRobotSimulation/KinematicsSimulation.cppsrc/QuadrupedRobotSimulation/KinematicsReverse.cppsrc/QuadrupedRobotSimulation/CompleteJsonExporter.cppsrc/QuadrupedRobotSimulation/RobotConfig.cppsrc/QuadrupedRobotSimulation/SharedGeometry.cpp
7.1 Cmd_QuadrupedRobot_CalculateAllPointsFromMotorAngles
用途:
- 输入电机角
- 反推出各关键点坐标
调用履历:
func
-> dispatchCommand
-> handleQuadrupedCommand
-> KinematicsHelper::QuadrupedRobot_CalculateAllPointsFromMotorAngles
-> KinematicsHelper::RobotGaitDataManagerFromJson
-> ReverseKinematicsCalculator
-> ReverseKinematicsCalculator::CalculateAllPointsFromMotorAnglesJsonStr
-> json::parse
说明:
- 数据管理入口在
RobotGaitDataManagerFromJson(...) - 反解主逻辑在
src/QuadrupedRobotSimulation/KinematicsReverse.cpp
7.2 Cmd_QuadrupedRobot_PerformForwardKinematics
用途:
- 输入步态/系统参数
- 正向生成四足机器人整段步态轨迹
调用履历:
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.cppinclude/smart_json_wrapper.hsrc/math_utils.cpp
8.1 smart_process_json
调用履历:
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
调用履历:
smart_get_function_list
-> SmartJsonProcessor::getAvailableFunctions
-> FunctionRegistry::getAllFunctions
8.3 smart_get_function_info
调用履历:
smart_get_function_info
-> SmartJsonProcessor::getFunctionInfo
-> FunctionRegistry::getFunction
8.4 smart_test_match
调用履历:
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. 如果你要继续顺着看,推荐顺序
如果你想先搞清“机器人接口”:
src/smart_json_wrapper.cpp里的funcsrc/api/KinematicsWebAPI.Core.cppsrc/api/KinematicsWebAPI.RobotCommands.cppsrc/RobotManager.cppsrc/Robot.cpp
如果你想先搞清“四足机器人接口”:
src/api/KinematicsWebAPI.QuadrupedCommands.cppsrc/QuadrupedRobotSimulation/KinematicsHelper.cppsrc/QuadrupedRobotSimulation/KinematicsSimulation.cppsrc/QuadrupedRobotSimulation/KinematicsReverse.cppsrc/QuadrupedRobotSimulation/CompleteJsonExporter.cpp
如果你想先搞清“SPC 接口”:
src/api/KinematicsWebAPI.SpcCommands.cppsrc/spc_core.cppinclude/spc_core.h