Spaces:
Running
Running
| <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, 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 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> |