File size: 9,202 Bytes
a3897c9
 
 
 
62b690f
a3897c9
 
 
 
 
 
 
 
 
6a31f4a
a3897c9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d47f18b
 
 
 
a3897c9
 
 
 
 
62b690f
a3897c9
 
 
 
62b690f
a3897c9
 
 
 
 
62b690f
6a31f4a
 
 
 
 
 
 
 
 
5d823e5
 
 
 
 
 
 
 
6a31f4a
 
 
 
5d823e5
 
 
 
 
 
 
 
 
d47f18b
 
5d823e5
a3897c9
954b37d
a3897c9
 
 
 
 
 
 
 
 
 
62b690f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Method</title><style>
:root{--bg:#0b1020;--fg:#e8eefb;--dim:#8ea0c2;--line:#1e2a45;--card:#111a2e;
--accent:#ffc46b;--ok:#7be0a0;--bad:#ff8f7a;
--s0:12px;--s1:14px;--s2:16px;--s3:20px;--s4:28px;--s5:40px}
*{box-sizing:border-box}
body{margin:0;background:var(--bg);color:var(--fg);font-size:var(--s2);
font-family:'IBM Plex Sans',system-ui,sans-serif;line-height:1.6}
.wrap{max-width:1100px;margin:0 auto;padding:0 20px 72px}
a{color:var(--accent)}
h1{font-size:var(--s5);line-height:1.15;margin:40px 0 8px;font-weight:650}
h2{font-size:var(--s4);margin:44px 0 10px;font-weight:600}
h3{font-size:var(--s3);margin:28px 0 6px;font-weight:600}
p{margin:10px 0;max-width:70ch}
.dim{color:var(--dim);font-size:var(--s1)}
.bad{color:var(--bad);font-size:var(--s0)}
nav{display:flex;gap:8px;flex-wrap:wrap;margin:18px 0 4px}
nav a{display:inline-block;padding:10px 16px;min-height:44px;line-height:24px;
border:1px solid var(--line);border-radius:999px;text-decoration:none;
background:var(--card)}
nav a[aria-current]{border-color:var(--accent)}
.cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));
gap:12px;margin:20px 0}
.card{background:var(--card);border:1px solid var(--line);border-radius:12px;
padding:16px}
.card b{display:block;font-size:var(--s4);color:var(--accent);font-weight:650}
.card span{color:var(--dim);font-size:var(--s1)}
figure{margin:24px 0}
figure img{width:100%;border-radius:10px;border:1px solid var(--line);
background:#fff}
figcaption{color:var(--dim);font-size:var(--s1);margin-top:8px;max-width:80ch}
table{border-collapse:collapse;width:100%;margin:14px 0;font-size:var(--s1)}
th,td{border-bottom:1px solid var(--line);padding:9px 10px;text-align:right}
th:first-child,td:first-child{text-align:left}
th{color:var(--dim);font-weight:500}
td b{color:var(--ok)}
details{background:var(--card);border:1px solid var(--line);border-radius:10px;
padding:12px 16px;margin:16px 0}
summary{cursor:pointer;color:var(--dim);font-size:var(--s1);min-height:44px;
display:flex;align-items:center}
code{background:#0d1526;padding:2px 6px;border-radius:5px;font-size:var(--s1)}
/* Inline links in prose measured 47x16 and 54x16 at 375 px — a tap target,
   because a finger does not know it is "only prose". Padding alone would
   break the line box, so the height comes from an inline-block with the
   line-height carrying it. */
p a,figcaption a{display:inline-block;min-height:44px;line-height:44px;
padding:0 2px}
/* The <pre> pipeline diagram and the results table are the two things wider
   than a phone. Let each scroll inside its own box rather than pushing the
   document sideways — a horizontally scrolling PAGE hides content with no
   affordance, a scrolling code block is a known idiom. */
pre{background:var(--card);border:1px solid var(--line);border-radius:10px;
padding:14px 16px;overflow-x:auto;font-size:var(--s1);max-width:100%}
.tablewrap{overflow-x:auto;-webkit-overflow-scrolling:touch}
.tablewrap table{min-width:640px}
img{max-width:100%;height:auto}
/* Subscripts default to a fraction of the parent and rendered at 11.7px —
   off the --s0..--s5 scale the audit counts. Pinned to the smallest step. */
sub,sup{font-size:var(--s0);line-height:0}
</style></head><body><div class="wrap"><nav><a href="index.html">overview</a><a href="method.html" aria-current="page">method</a><a href="results.html">results</a><a href="sensors.html">sensors</a><a href="gallery.html">gallery</a><a href="workbench.html">3D workbench</a></nav>
<h1>Method</h1>
<pre class="card">frame − reference   →  dI, signed RGB difference
dI                  →  surface gradient        ← the only step that needs a choice
∇ integrate         →  depth
depth               →  5 features → newtons    ← fitted on presses of known load</pre>

<h3>Lookup table</h3>
<p>A (90,90,90,2) array from difference colour to gradient, filled by pressing
a sphere of unknown radius: <code>a² = d(2R−d)</code> recovers the radius and
the depth datum from the data. ~700 frames per sensor.</p>

<h3>Calibration-free</h3>
<p>Three LEDs at known azimuths, so each channel reads the gradient projected
on one direction and <code>(gx,&nbsp;gy)</code> is a 3×2 least-squares solve.
No table, no sphere presses. This is the GelSight Wedge driver's approach. It
recovers shape but not scale.</p>

<h3>Fitting the newtons, and why the weights can lie</h3>
<p>Five collinear contact features, then a monotone isotonic calibration.
Isotonic clips outside its fitted range, so transfer ρ is scored on the linear
projection: on the isotonic output a fully extrapolated target returns a
constant, and a constant has no ranks. Least squares can also cancel large
opposite-sign terms, a balance holding only at the ratios it was fitted on —
that sends one row of the <a href="results.html">transfer matrix</a>
negative.</p>

<h2>Stage 1 scored on its own — no force labels</h2>
<p>Force estimation is image→depth then depth→newtons, and a ρ only ever scores
the pair: a geometrically wrong depth that is monotone in contact size still
ranks force well. Depth has no ground truth, so stage 1 is judged by eye on the
panels below and by physical checks that need no labels.</p>

<div class='tablewrap'><table><thead><tr><th>dataset</th><th>n</th><th>flat-gel leak, LUT</th><th>leak, calib-free</th><th>peak [mm]</th><th>over the gel</th><th>truncated</th><th>LUT vs calib-free shape</th></tr></thead><tbody>
<tr><td>cnc_mini_26</td><td>120</td><td>0.016</td><td>0.013</td><td>2.71</td><td>14%</td><td>90%</td><td>+0.796</td></tr>
<tr><td>cnc</td><td>120</td><td>0.014</td><td>0.013</td><td>1.66</td><td>1%</td><td>76%</td><td>+0.838</td></tr>
<tr><td>feats</td><td>120</td><td>0.064</td><td>0.041</td><td>1.12</td><td>0%</td><td>100%</td><td>+0.703</td></tr>
<tr><td>sparsh</td><td>89</td><td>0.016</td><td>0.011</td><td>0.93</td><td>0%</td><td>64%</td><td>+0.895</td></tr>
<tr><td>faf</td><td>117</td><td>0.045</td><td>0.041</td><td>1.69</td><td>8%</td><td>89%</td><td>+0.845</td></tr></tbody></table></div>

<p class="dim">Leak is mean |depth| off-contact over peak — zero for a coherent
surface. “Over the gel” counts peaks past the 4.25&nbsp;mm elastomer, possible
only where the contact runs off the sensor and the depth is extrapolated.
“Truncated” is a fact about the capture, not the method, and bounds what any
reconstruction can know. The last column is the two reconstructions agreeing
with each other, which is evidence neither invents the shape — not that either
is right.</p>

<p class="dim">One row needed a fix before it could be read at all — see
<a href="sensors.html">sensors</a>.</p>

<figure><img src="assets/panel_cnc_mini_26.png" alt="cnc_mini_26 — GelSight Mini, CNC presses, 0–20 N"><figcaption>cnc_mini_26 — GelSight Mini, CNC presses, 0–20 N · markerless · 8 samples. Columns 5 and 6 are the same surface from each reconstruction; the calibration-free one is drawn with relative height because its scale is not recovered.</figcaption></figure><figure><img src="assets/panel_fota_cnc.png" alt="FoTa cnc_Mini — GelSight Mini, CNC probes"><figcaption>FoTa cnc_Mini — GelSight Mini, CNC probes · markerless · 8 samples. Columns 5 and 6 are the same surface from each reconstruction; the calibration-free one is drawn with relative height because its scale is not recovered.</figcaption></figure><figure><img src="assets/panel_feats.png" alt="FEATS — marker gel, FEA force labels"><figcaption>FEATS — marker gel, FEA force labels · MARKER · 8 samples. Columns 5 and 6 are the same surface from each reconstruction; the calibration-free one is drawn with relative height because its scale is not recovered.</figcaption></figure><figure><img src="assets/panel_sparsh.png" alt="Sparsh / Meta — 10 gel pads"><figcaption>Sparsh / Meta — 10 gel pads · markerless · 8 samples. Columns 5 and 6 are the same surface from each reconstruction; the calibration-free one is drawn with relative height because its scale is not recovered.</figcaption></figure><figure><img src="assets/panel_faf.png" alt="FeelAnyForce — 42 captures"><figcaption>FeelAnyForce — 42 captures · markerless · 8 samples. Columns 5 and 6 are the same surface from each reconstruction; the calibration-free one is drawn with relative height because its scale is not recovered.</figcaption></figure>

<details><summary>Three claims made here and withdrawn (with their
numbers)</summary>
<p class="dim">“React's poor reconstruction is cross-sensor transfer” — the
sensors were the other way round; the table's own capture is a GelSight Mini.
“A DC-biased gradient integrates into a dome” — removing the DC moved the leak
0.0715 → 0.0713. “Calibration-free is 2–3× better” — three frames of noise; on
24 it is a tie. And the LED map was first chosen by a criterion that rewards a
small reconstruction, which split a connector into two blobs while scoring
best; it is now set by sphere presses reconstructing as circles (axis ratio
1.266 vs 1.798).</p></details>
</div></body></html>