-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
439 lines (404 loc) · 23.8 KB
/
Copy pathindex.html
File metadata and controls
439 lines (404 loc) · 23.8 KB
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>TRACE: Interactive Bi-Directional Cable Tracing Amid Clutter</title>
<meta name="description" content="TRACE combines bi-directional cable tracing with interactive perception primitives (Divergence Push and Cluster Dilation) to trace monochrome cables amid clutter." />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link rel="icon" type="image/svg+xml" href="media/favicon.svg" />
<link href="https://fonts.googleapis.com/css2?family=Newsreader:ital,opsz,wght@0,6..72,400;0,6..72,500;0,6..72,600;1,6..72,400;1,6..72,500&family=DM+Sans:ital,opsz,wght@0,9..40,300;0,9..40,400;0,9..40,500;0,9..40,600;1,9..40,400&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="styles.css" />
<script>
/* Pre-hide hero only when motion is welcome; a safety timeout guarantees
content appears even if the motion module never loads (offline / CDN fail). */
(function () {
if (window.matchMedia('(prefers-reduced-motion: no-preference)').matches) {
document.documentElement.classList.add('reveal-pending');
setTimeout(function () {
document.documentElement.classList.remove('reveal-pending');
}, 1500);
}
})();
</script>
</head>
<body>
<nav class="toc" aria-label="Section navigation">
<!-- <a href="#result">Overview</a> -->
<a href="#problem">Problem</a>
<a href="#pipeline">Pipeline</a>
<a href="#divergence">Divergence</a>
<a href="#primitives">Primitives</a>
<a href="#setup">Setup</a>
<a href="#results">Results</a>
<a href="#cite">Citation</a>
</nav>
<div class="page-wrap">
<!-- ─── Hero ──────────────────────────────────────────── -->
<header class="hero">
<p class="hero-kicker hero-reveal">IROS 2026 · AUTOLab, UC Berkeley</p>
<h1 class="hero-reveal">TRACE: Interactive Bi-Directional Cable Tracing Amid Clutter</h1>
<div class="hero-meta hero-reveal">
<div class="hero-byline">
<div class="authors">
<!-- TODO: add per-author homepage links when available -->
Nidhya Shivakumar<sup>*1</sup><span class="author-sep">,</span>
Ethan Ransing<sup>*1</sup><span class="author-sep">,</span>
Josh Zhang<sup>1</sup><span class="author-sep">,</span>
Shamak Gowda<sup>1</sup><span class="author-sep">,</span>
Kevin Yang<sup>1</sup><span class="author-sep">,</span>
Justin Yu<sup>1</sup><span class="author-sep">,</span>
Ken Goldberg<sup>1</sup>
</div>
<div class="affiliations">
<span><sup>1</sup>AUTOLab at the University of California, Berkeley · Berkeley AI Research (BAIR)</span>
<span><sup>*</sup>Equal contribution</span>
</div>
</div>
<div class="header-actions">
<!-- TODO: when the IROS 2026 PDF / arXiv is live, swap each span for
<a href="..." class="action-link" target="_blank" rel="noopener"> and drop the "soon" tag. -->
<span class="action-link is-soon" title="Paper link coming soon" aria-disabled="true">
<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/>
<polyline points="14 2 14 8 20 8"/>
<line x1="9" y1="13" x2="15" y2="13"/>
<line x1="9" y1="17" x2="15" y2="17"/>
</svg>
Paper (PDF) <span class="soon-tag">soon</span>
</span>
<span class="action-link is-soon" title="Code repository coming soon" aria-disabled="true">
<svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
<path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0 0 24 12c0-6.63-5.37-12-12-12z"/>
</svg>
Code <span class="soon-tag">soon</span>
</span>
<a class="action-link contact-link" href="mailto:ethan.ransing@berkeley.edu">
<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<rect x="3" y="5" width="18" height="14" rx="2"/>
<polyline points="3 7 12 13 21 7"/>
</svg>
Contact
</a>
</div>
</div>
<p class="hero-claim hero-reveal">
Monochrome cables cannot be told apart by appearance alone. TRACE traces each
cable from both ends, locates where the two estimates disagree, and manipulates
the cables to resolve ambiguities.
</p>
<figure class="hero-stage hero-reveal hero-splash" aria-label="Splash video placeholder">
<img class="hero-poster" src="media/splash.png" width="1400" height="779" fetchpriority="high" decoding="async" alt="A TRACE run: cables recovered as continuous, topologically consistent colored traces on a dark workspace" />
<div class="splash-overlay" aria-hidden="true">
<span class="splash-play">▶</span>
<span class="splash-title">Splash video — placeholder</span>
<span class="splash-sub">Replace with continuous recording of one run</span>
</div>
</figure>
</header>
<main>
<!-- § Result hook — temporarily disabled
<div class="section result-hook" id="result">
<p class="hook-line">
Across 60 cluttered trials, TRACE increases the proportion of cable length
correctly traced from <span class="stat">40.2%</span> to
<span class="stat">89.3%</span> — a <span class="stat">77%</span>
average improvement over HANDLOOM 2.0, the prior state of the art — and
traces every cable correctly in <span class="stat">32 / 60</span> scenes.
</p>
</div>
-->
<!-- § The monochrome challenge -->
<div class="section" id="problem">
<h2>The monochrome tracing problem</h2>
<p>
When cables differ in color, each one can be followed by its hue. Monochrome cables
remove that cue: every strand looks the same, so at each crossing it is ambiguous which
way a given cable continues. The system
must instead reason about geometry, and where the geometry is ambiguous,
resolve it by interacting with the scene. In the figure below, the only reliable visual
anchors are the detected connector endpoints.
</p>
<div class="challenge">
<div class="challenge-stage">
<img id="challengeImg" src="media/endpoints_detected.jpg" width="1200" height="649" loading="lazy" decoding="async" alt="Monochrome cables with detected connector endpoints" />
</div>
<div class="seg-group" role="group" aria-label="Toggle challenge view">
<button class="seg-btn active" data-img="media/endpoints_detected.jpg">Raw scene + detected endpoints</button>
<button class="seg-btn" data-img="media/final_traces.jpg">TRACE’s recovered traces</button>
</div>
</div>
<p class="fig-caption">A Faster R-CNN detects the connectors (green). TRACE finds which endpoint connects to which and recovers the correct trace for each cable.</p>
</div>
<!-- § Pipeline / architecture -->
<div class="section" id="pipeline">
<h2>The TRACE pipeline</h2>
<p>
TRACE builds on the MANIP framework for modular interactive perception. Each iteration is a
closed loop of three stages: estimate the state of the cables, identify where that estimate is
uncertain, and act to reduce the uncertainty. The system then re-images the scene and repeats
until the trace is topologically consistent.
</p>
<div class="method-figure">
<img src="media/architecture.png" width="2202" height="710" loading="lazy" decoding="async" alt="TRACE architecture: a 4K overhead RGB image feeds the State Estimator (Object Detection + HANDLOOM), then the Divergence Classifier + Action Selector labels each divergence point as object, tangential crossing, or cluster, then the IP Primitives stage runs Cluster Dilation, Tangential Push, or Object Decluttering, and the loop continues until Termination." />
</div>
<p class="fig-caption">Fig. 2 — the TRACE architecture (MANIP framework). The loop re-images and re-traces until every cable is topologically consistent, up to T<sub>max</sub> = 10 iterations.</p>
<p>
The state estimator pairs a Faster R-CNN connector detector with the
HANDLOOM 1.0 single-cable tracer, applied from both ends of each cable. The
Meta Policy Selector then combines three signals that the prior heuristic baselines do not
consider jointly — object masks, a local cable-density estimate, and the consistency
between the two traces — to select an appropriate action. The method operates on
monocular RGB images alone, without depth, stereo, or range data.
</p>
</div>
<!-- § Bi-directional tracing + divergence -->
<div class="section" id="divergence">
<h2>Bi-directional tracing & divergence</h2>
<p>
TRACE traces from every connector, which yields two independent estimates for each cable.
The point at which the estimate from connector A and the estimate from connector B cease to
agree is, by construction, where the cable’s identity is uncertain — a divergence
point. The steps below illustrate this.
</p>
<p>
Identifying these points proceeds in two passes. The first checks reciprocal consistency,
flagging traces whose forward and backward directions fail to overlap. The second analyzes
each flagged location and classifies it by how densely cables are packed nearby: a
cable cluster where they are dense, or a shallow tangential crossing where
they merely cross.
</p>
<div class="diverge">
<div class="diverge-stage">
<img src="media/divergence.png" width="1500" height="835" loading="lazy" decoding="async" alt="Bi-directional traces with divergence points" />
<!-- markers positioned as % of the composite -->
<span class="marker green s-endpoints" style="left:13.5%; top:19.4%"></span>
<span class="marker green s-endpoints" style="left:85.1%; top:39.6%"></span>
<span class="marker cyan s-diverge" style="left:57.9%; top:30.6%"></span>
<span class="marker cyan s-diverge" style="left:51.4%; top:54.7%"></span>
</div>
<div class="stepper" id="divergeStepper">
<button class="step-btn active" data-step="endpoints">1 · Detect connectors</button>
<button class="step-btn" data-step="trace">2 · Trace from each end</button>
<button class="step-btn" data-step="diverge">3 · Find divergence</button>
</div>
<p class="diverge-caption" id="divergeCaption">
A and B connectors are detected (green). Each one seeds an independent trace.
</p>
</div>
</div>
<!-- § Interactive perception moves -->
<div class="section" id="primitives">
<h2>Interactive perception primitives</h2>
<p>
At each divergence point, the Meta Policy Selector identifies one of three situations and
applies the corresponding action: Bimanual Object Decluttering when a foreground object
occludes the cable, a Divergence Push at a shallow tangential crossing, or a Cluster Dilation
at a dense knot where cables visually merge. Use the toggle to see each case.
</p>
<div class="seg-group density-toggle" role="group" aria-label="What the Meta Policy Selector detects">
<span class="seg-label">Selector detects:</span>
<button class="seg-btn" data-pick="declutter">Object on a cable</button>
<button class="seg-btn active" data-pick="push">Tangential crossing (low density)</button>
<button class="seg-btn" data-pick="dilation">Cable cluster (high density)</button>
</div>
<div class="primitive-cards">
<figure class="primitive-card" data-primitive="declutter">
<div class="primitive-stage">
<img src="media/declutter_placeholder.svg" width="540" height="500" loading="lazy" decoding="async" alt="Placeholder: bimanual object decluttering" />
</div>
<figcaption>
<strong>Bimanual Object Decluttering</strong>
A segmentation model finds objects resting on the cables; a pick-and-place clears them. When two
objects sit on opposite sides, both YuMi arms clear them at once.
</figcaption>
</figure>
<figure class="primitive-card" data-primitive="push">
<div class="primitive-stage">
<img src="media/div_push.png" width="455" height="516" loading="lazy" decoding="async" alt="Divergence Push along the cable-distance-transform ridge" />
</div>
<figcaption>
<strong>Divergence Push</strong>
TRACE computes a Cable Distance Transform and extracts its ridges — the paths of
maximum clearance between cables — using a Frangi vesselness filter. The end-effector
follows that ridge through the crossing and a short distance (12 px) beyond, separating
the two cables.
</figcaption>
</figure>
<figure class="primitive-card" data-primitive="dilation">
<div class="primitive-stage">
<img src="media/cluster_dilation.png" width="568" height="501" loading="lazy" decoding="async" alt="Cluster Dilation at the deepest open point" />
<span class="dilation-jaw jaw-a"></span>
<span class="dilation-jaw jaw-b"></span>
</div>
<figcaption>
<strong>Cluster Dilation</strong>
A closed gripper moves to the most open point within the cluster, opens its jaws, and rotates
180° in each direction to spread the merged cables apart.
</figcaption>
</figure>
</div>
<p class="fig-caption">The highlighted card is the action TRACE selects for the chosen case. Hover the Cluster Dilation card to see the gripper motion. <em>Object-decluttering frame is a placeholder — flagged.</em></p>
</div>
<!-- § Marquee: watch a real run -->
<div class="section" id="loop">
<h2>The full perception–action loop</h2>
<p>
The viewer below shows one complete logged run of this loop, on the hardest setting —
4 cables, 8 connectors. It alternates between perception (the density heatmap of all eight
traces) and action (the Divergence Push the robot plans); each caption is drawn from the
system’s action log, and the colored traces become continuous as the ambiguities are resolved.
</p>
<div class="run-viewer">
<div class="run-stage">
<img id="runImg" src="media/loop/iter_0.jpg" width="1400" height="779" loading="lazy" decoding="async" alt="Robot run frame" />
<div class="run-badge" id="runBadge">Initial estimate</div>
</div>
<div class="run-controls">
<button id="runPlay" class="run-play" aria-label="Play">▶ Play</button>
<input id="runScrub" class="run-scrub" type="range" min="0" max="8" value="0" step="1" aria-label="Iteration" />
<span class="run-counter"><span id="runIdx">0</span> / 8</span>
</div>
<p class="run-caption" id="runCaption">Iteration 0 — initial bi-directional trace of all eight connectors. Many cables break at crossings.</p>
</div>
<p class="fig-caption">A complete pipeline run on an eight-connector Tier 4 scene.</p>
</div>
<!-- § Experimental setup -->
<div class="section" id="setup">
<h2>Experimental setup</h2>
<p>
All evaluation is conducted on physical hardware, comprising 110 trials in
total: 50 without foreground clutter and 60 with it (15 per tier). No simulation or depth
sensing is used.
</p>
<dl class="spec">
<div><dt>Robot</dt><dd>Bimanual ABB YuMi; motion planning via Jacobi Motion</dd></div>
<div><dt>Camera</dt><dd>Overhead Logitech BRIO, 4K, 1 m above the workspace</dd></div>
<div><dt>Perception</dt><dd>Monocular RGB only — no depth, stereo, or range data</dd></div>
<div><dt>Cables</dt><dd>2–4 white 6-foot USB-C ↔ USB-C cables, randomly arranged</dd></div>
<div><dt>Endpoints</dt><dd>Connectors seated in two 8×5 cm black USB hubs on opposite sides</dd></div>
<div><dt>Compute / iter</dt><dd>Tier 4: 6.4 s tracing + 13.4 s execution (Ryzen 7 7700X, RTX 4090)</dd></div>
</dl>
<h3>Tiers of complexity</h3>
<p>
Evaluation follows the tiered protocol from MANIP: four tiers scale the scene from 2 cables and
2 crossings up to 4 cables and 4–5 crossings, with 3–4 clutter objects throughout.
</p>
<div class="table-wrap">
<table class="tier-table">
<thead>
<tr><th>Per scene</th><th>Tier 1</th><th>Tier 2</th><th>Tier 3</th><th>Tier 4</th></tr>
</thead>
<tbody>
<tr><td>Cables</td><td>2</td><td>2</td><td>3</td><td>4</td></tr>
<tr><td>Tangential crossings</td><td>2</td><td>3</td><td>3–4</td><td>4–5</td></tr>
<tr><td>Foreground objects</td><td>3–4</td><td>3–4</td><td>3–4</td><td>3–4</td></tr>
</tbody>
</table>
</div>
<p class="fig-caption">The four complexity tiers used for every evaluation below.</p>
</div>
<!-- § Results -->
<div class="section" id="results">
<h2>Cable-tracing accuracy</h2>
<p>
Each bar shows the average percentage of cable length correctly traced, across the four
complexity tiers. The two scenarios can be compared using the toggle; the margin over
HANDLOOM 2.0 grows substantially once foreground clutter is present.
</p>
<div class="seg-group" role="group" aria-label="Scenario">
<button class="seg-btn active" data-chart="clutter">With foreground clutter (60 trials)</button>
<button class="seg-btn" data-chart="clean">Without clutter (50 trials)</button>
</div>
<div class="chart" id="chart" aria-hidden="true"></div>
<div class="chart-legend">
<span><i class="swatch" style="background:#5B8DB8"></i>HANDLOOM 2.0</span>
<span><i class="swatch" style="background:#E8801A"></i>TRACE</span>
</div>
<p class="fig-caption" id="chartCaption">With foreground clutter, TRACE correctly traces all cables in 32 of 60 trials, a 77% average improvement over HANDLOOM 2.0.</p>
<div class="table-wrap">
<table class="tier-table" id="tierStats">
<thead>
<tr><th>% length traced</th><th>Tier 1</th><th>Tier 2</th><th>Tier 3</th><th>Tier 4</th></tr>
</thead>
<tbody><!-- rendered by script.js to mirror the active scenario --></tbody>
</table>
</div>
<h3>Against other tracers & frontier VLMs</h3>
<div class="table-wrap">
<table>
<thead>
<tr><th>Method</th><th>Compute</th><th>Initial</th><th>Final</th></tr>
</thead>
<tbody>
<tr class="method-row"><td>RT-DLO <span class="muted">(600×600 crops)</span></td><td>0.05 s</td><td>57.1%</td><td>76.0%</td></tr>
<tr class="method-row"><td><strong>TRACE</strong> <span class="muted">(crops)</span></td><td>0.40 s</td><td>68.3%</td><td class="best">97.5%</td></tr>
<tr class="section-break method-row"><td>Nano Banana Pro <span class="muted">(VLM)</span></td><td>—</td><td>37.5%</td><td>34.8%</td></tr>
<tr class="method-row"><td>ChatGPT 5.2 <span class="muted">(VLM)</span></td><td>—</td><td>19.5%</td><td>26.8%</td></tr>
<tr class="method-row"><td><strong>TRACE</strong></td><td>0.40 s</td><td>40.2%</td><td class="best">89.3%</td></tr>
</tbody>
</table>
</div>
<p class="fig-caption">For TRACE, the “final” column reflects accuracy after its interactive moves; the baseline methods are evaluated from a single pass.</p>
</div>
<!-- § VLM comparison -->
<div class="section">
<h2>TRACE vs. frontier VLMs</h2>
<p>
When asked to trace the same monochrome scene, current vision-language models tend to produce
connections that are not present in the image. TRACE’s geometric, interactive approach is
substantially more accurate.
</p>
<div class="method-figure">
<img src="media/vlm_compare.jpg" width="1600" height="478" loading="lazy" decoding="async" alt="Monochrome scene (left) vs a VLM's hallucinated colored tracing (right)" />
</div>
<div class="badge-row">
<div class="badge"><span class="badge-num accent">89.3%</span>TRACE</div>
<div class="badge"><span class="badge-num">34.8%</span>Nano Banana Pro</div>
<div class="badge"><span class="badge-num">26.8%</span>ChatGPT 5.2</div>
</div>
<p class="fig-caption">Left: the monochrome input. Right: a VLM’s colored reconstruction, which is incorrect where cables cross. Values are final correctly-traced length; spurious cables are scored as zero.</p>
</div>
<!-- § BibTeX -->
<div class="section" id="cite">
<h2>Citation</h2>
<pre class="bibtex">@inproceedings{trace2026,
title = {TRACE: Interactive Bi-Directional Cable Tracing Amid Clutter},
author = {Nidhya Shivakumar and Ethan Ransing and Josh Zhang and
Shamak Gowda and Kevin Yang and Justin Yu and Ken Goldberg},
booktitle = {Proceedings of the IEEE/RSJ International Conference on
Intelligent Robots and Systems (IROS)},
year = {2026}
}</pre>
</div>
</main>
</div>
<footer>
<div class="page-wrap footer-inner">
<span>2026 AUTOLab, UC Berkeley</span>
<span>Page template adapted from the <a href="https://github.com/eliahuhorwitz/Academic-project-page-template" target="_blank" rel="noopener">Academic Project Page Template</a>.</span>
</div>
</footer>
<script src="script.js"></script>
<script type="module">
/* Entrance-only choreography: one orchestrated hero reveal on load, then static.
Progressive enhancement — if the import fails, the head-script timeout has
already revealed the hero, and every widget in script.js runs independently. */
if (document.documentElement.classList.contains('reveal-pending')) {
try {
const { animate, stagger } = await import('https://cdn.jsdelivr.net/npm/motion@11.18.2/+esm');
const els = document.querySelectorAll('.hero-reveal');
await animate(
els,
{ opacity: [0, 1], transform: ['translateY(14px)', 'translateY(0px)'] },
{ duration: 0.62, delay: stagger(0.085), easing: [0.22, 1, 0.36, 1] }
).finished;
document.documentElement.classList.remove('reveal-pending');
} catch (e) {
document.documentElement.classList.remove('reveal-pending');
}
}
</script>
</body>
</html>