Files
Robot_Arm/tests/baselines/ik_exact.json
T
cbb b32d44efe0 test: 加 IK/数据/截图三重基线关卡,并刷新过期的截图基线
重构 2955 行的单文件查看器必须有"行为没变"的可判据,否则改到什么程度全靠感觉。
tests/ik_baseline.mjs 在 Node 里直接跑求解器(它本就是 UMD,带 module.exports 分支,
不需要浏览器),输出分两段:
  exact  —— 件数/顶点/三角、TCP 推断、限位、固定 FK/fkChain/orient、固定目标的
            solveDyn 解向量、selfTest/poseSelfTest 的误差与命中数。selfTest 内部走
            Math.random,这里锁成定 LCG,所以 exact 跨进程逐字节可复现。
  timing —— solveDyn 中位耗时(9 次去头 3 次预热)。本机进程间抖动实测约 ±28%,
            因此只按 ±10% 报 WARN,不当硬门。
关卡灵敏度已验:指向 scratch/arm-ik-solver_before.js 时报 5 处 exact 差异并 FAIL。

docs/shots/ 里 92 张是 10-09 生成的,早于 10-14 的重建,属过期基线;重跑 96 视图
全部 OK、0 FAIL。另发现既有非幂等问题:committed 的 mesh 是"端到端构建后再单跑一次
screw_mesh.py"的产物(螺钉 idx 118..214、ENV 件排在第 19 位),端到端构建则为
20..116、ENV 排在末尾,两者零件集合相同但顺序不同,导致 2 张线束透视图的透明排序
像素级不同。本提交以端到端构建为准。
2026-10-15 02:24:38 +08:00

229 lines
2.7 KiB
JSON

{
"meta": {
"solver": "web/arm-ik-solver.js",
"mesh": "web/mesh_arm.json"
},
"exact": {
"counts": {
"parts": 117,
"verts": 367118,
"tris": 351491,
"printed": 13,
"env": 1,
"joints": 6
},
"tcpZ": 93,
"TCP0": [
19.5,
128,
93
],
"motorTravel": 360,
"noAdjAxes": [],
"caps": 1936,
"lim": {
"J1": [
-180,
180,
true
],
"J2": [
-93,
126,
false
],
"J3": [
-180,
180,
true
],
"J4": [
-113,
113,
false
],
"J5": [
-94,
89,
false
],
"J6": [
-180,
180,
true
]
},
"fkQ0": [
106.498451,
235.370133,
140.165364
],
"fkChainQ0": [
106.498451,
235.370133,
140.165364
],
"orientQ0": [
0.595153,
0.645892,
-0.478139,
-0.757749,
0.649173,
-0.06626,
0.267598,
0.401744,
0.875781
],
"solveDyn": [
{
"T": [
150,
128,
260
],
"ok": true,
"err": 0,
"q": [
0.041,
5.809,
0.094,
-17.507,
-94,
0
]
},
{
"T": [
180,
128,
300
],
"ok": true,
"err": 0,
"q": [
0.049,
-0.026,
0.094,
-26.821,
-94,
0
]
},
{
"T": [
120,
-150,
320
],
"ok": true,
"err": 0,
"q": [
-43.713,
6.027,
0.239,
-0.279,
-89.002,
0
]
},
{
"T": [
60,
128,
420
],
"ok": true,
"err": 0,
"q": [
38.165,
0.129,
70.062,
-89.578,
-80.719,
0
]
}
],
"selfTest": {
"maxFkErr": 4.689582056016661e-13,
"maxIkErr": 7.082653493385528e-13,
"ikHit": 200,
"ikTried": 200,
"structWarn": [],
"poseHit": 8,
"poseTried": 8,
"poseErr": 0.0000017075472925031877,
"K": {
"X0": 19.5,
"Y0": 128,
"Z1": 610,
"Z2": 490,
"Z3": 445,
"Z4": 332,
"Z5": 222,
"TCP0": [
19.5,
128,
93
],
"ax": [
0,
0,
-1
],
"C0": -120,
"A43": -113,
"A32": -45,
"A54": -110,
"L5": 129
},
"LIM": {
"J1": {
"lo": -180,
"hi": 180,
"cont": true
},
"J2": {
"lo": -93,
"hi": 126,
"cont": false
},
"J3": {
"lo": -180,
"hi": 180,
"cont": true
},
"J4": {
"lo": -113,
"hi": 113,
"cont": false
},
"J5": {
"lo": -94,
"hi": 89,
"cont": false
},
"J6": {
"lo": -180,
"hi": 180,
"cont": true
}
}
},
"poseSelfTest": {
"poseHit": 8,
"poseTried": 8,
"poseErr": 0.0000012074182697257333
}
},
"timing": {
"solveDynMedianMs": [
252.53,
239.83,
192.01,
192.92
],
"poseSelfTestAvgMs": 93.48
}
}