重构 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 张线束透视图的透明排序
像素级不同。本提交以端到端构建为准。
229 lines
2.7 KiB
JSON
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
|
|
}
|
|
}
|