diff --git a/MACGYVBOT-DECK/assets/perception/handoff/driver_sam_depth_mask_grasp.gif b/MACGYVBOT-DECK/assets/perception/handoff/driver_sam_depth_mask_grasp.gif new file mode 100644 index 0000000..837b06f Binary files /dev/null and b/MACGYVBOT-DECK/assets/perception/handoff/driver_sam_depth_mask_grasp.gif differ diff --git a/MACGYVBOT-DECK/assets/perception/handoff/rule_base_failed.gif b/MACGYVBOT-DECK/assets/perception/handoff/rule_base_failed.gif new file mode 100644 index 0000000..a85b223 Binary files /dev/null and b/MACGYVBOT-DECK/assets/perception/handoff/rule_base_failed.gif differ diff --git a/MACGYVBOT-DECK/assets/perception/handoff/sam_depth_mask.gif b/MACGYVBOT-DECK/assets/perception/handoff/sam_depth_mask.gif new file mode 100644 index 0000000..a7509ef Binary files /dev/null and b/MACGYVBOT-DECK/assets/perception/handoff/sam_depth_mask.gif differ diff --git a/MACGYVBOT-DECK/assets/perception/handoff/wrench_sam_depth_mask_grasp.gif b/MACGYVBOT-DECK/assets/perception/handoff/wrench_sam_depth_mask_grasp.gif new file mode 100644 index 0000000..eba547f Binary files /dev/null and b/MACGYVBOT-DECK/assets/perception/handoff/wrench_sam_depth_mask_grasp.gif differ diff --git a/MACGYVBOT-DECK/assets/perception/handoff/yolo_detection_failed.gif b/MACGYVBOT-DECK/assets/perception/handoff/yolo_detection_failed.gif new file mode 100644 index 0000000..2eb74dd Binary files /dev/null and b/MACGYVBOT-DECK/assets/perception/handoff/yolo_detection_failed.gif differ diff --git a/MACGYVBOT-DECK/index.html b/MACGYVBOT-DECK/index.html index 528f81f..9fc2eaf 100644 --- a/MACGYVBOT-DECK/index.html +++ b/MACGYVBOT-DECK/index.html @@ -4,7 +4,7 @@ MacGyvBot Troubleshooting Deck - +
@@ -51,6 +51,7 @@

WHAT

MacGyvBot
What We Built

MacGyvBot은 공구를 찾아 전달하고, 사용 후 다시 보관하는 로봇 시스템입니다

+
REQUEST공구 요청사용자가 필요한 공구를 말하면 로봇이 서랍에서 꺼내 사용자에게 전달한다.
@@ -63,12 +64,14 @@

단순 공구 탐지가 아니라 공구 관리 closed loop

2request loop + return loop
+
MacGyvBot
Scenario / Tool Request

사용자의 공구 요청은 공구명에서 사용자 위치 handoff까지 이어집니다

+
공구명 파악LLM/parser로 tool intent 추출
서랍 파악tool-drawer mapping 확인
@@ -77,12 +80,14 @@

사용자의 공구 요청은 공구명에서 사용자 위치 handoff까지
건네주기release gate 통과 후 전달

발표 포인트: 요청 흐름은 사용자의 말이 실제 handoff까지 이어지는 end-to-end 시나리오입니다.
+
MacGyvBot
Scenario / Tool Return

사용자의 공구 반납은 다시 공구를 식별하고 서랍 보관까지 닫습니다

+
공구 전달받기human grasp result와 gripper handoff
공구 파악현재 tool context 또는 재탐지
@@ -90,12 +95,14 @@

사용자의 공구 반납은 다시 공구를 식별하고 서랍 보관까
서랍에 보관place, release, close

발표 포인트: 반납 흐름은 로봇이 공구를 다시 책임지고 보관하는 ownership 전환입니다.
+
MacGyvBot
System Architecture

전체 시스템은 command를 robot task로 바꾸고, task coordinator가 실행 순서를 소유합니다

+
CMDCommandLLM/parser, STT/TTS, GUI command
TASKTask Queuebring/return sequence, pause/resume
@@ -107,12 +114,14 @@

전체 시스템은 command를 robot task로 바꾸고, task coordinator가
PKGPackage boundarytask, command, perception, manipulation이 ROS topic/service로 연결됩니다.ROS
TOPICSTyped contracts/task_request, /task_control, /human_grasped_tool, /sam_yaw, /tool_drop_detectedROS

+
MacGyvBot
Development Flow

개발 순서는 기능을 나열하는 방식이 아니라 시연 루프를 닫는 방식으로 진행됐습니다

+
05.04

Pipeline Skeleton

ROS 2 package boundary, command/task coordinator, GUI skeleton

05.06

Pick & Handover

공구 꺼내기와 사용자 전달 최소 루프

@@ -121,6 +130,7 @@

개발 순서는 기능을 나열하는 방식이 아니라 시연 루프를
06.05 / 06.12

Advanced & Safety

mask, PCA, yaw, collision, recovery 안정화

발표 포인트: 먼저 최소 루프를 만들고, 이후 인식 정확도와 안전성을 단계적으로 올렸습니다.
+
@@ -135,6 +145,7 @@

HOW

MacGyvBot
Command / LLM

Command는 자연어를 robot task intent로 바꾸는 입구입니다

+
IMPLEMENTATION @@ -148,12 +159,14 @@

LLM parser + rule fallback

FALLBACK

LLM 응답이 늦거나 실패해도 기본 명령은 규칙 기반 parser로 처리합니다.

+
MacGyvBot
Task Coordination / Task Queue

Task Coordination은 bring과 return을 TaskStep queue로 쪼개 실행합니다

+
01Requestcommand intent를 bring 또는 return task로 변환IN
@@ -169,12 +182,14 @@

실행 순서를 모듈 내부에 숨기지 않고 queue 상태로 관리QUEUEsingle source of task state

+
MacGyvBot
Task Coordination / Pause Resume

Pause / Resume은 단순 cancel이 아니라 중단된 step을 다시 실행하는 문제였습니다

+
상황
문제
해결 방향
drawer preparation 중 pause
MoveIt goal cancel 후 현재 step 유실 위험
retry 가능한 suspended step으로 queue 앞에 보존
@@ -182,6 +197,7 @@

Pause / Resume은 단순 cancel이 아니라 중단된 step을 다시 실행
반복 pause/resume
yaw/J6/grasp 상태가 어긋남
grasp-time J6 angle 보존과 status cleanup

발표 포인트: pause/resume은 버튼 기능이 아니라 motion, drawer, recovery 상태를 함께 보존하는 문제였습니다.
+
@@ -196,6 +212,7 @@

PERCEPTION

MacGyvBot
Perception / Tool Detection

YOLO fine-tuning으로 공구 후보를 먼저 안정적으로 찾습니다

+
이미지 교체 영역YOLO fine-tuning 결과: RGB frame + bbox + class confidence
@@ -205,58 +222,85 @@

RealSense RGB/depth 기반 tool detection

YOLOcustom tool dataset + fine-tuning
-
- -
-
MacGyvBot
-
Perception / Mask Generation
-

SAM+Depth mask는 handoff와 grasp point 계산이 공유하는 공구 표면입니다

-
-
YOLO bboxSAM prompt 후보
-
SAM masktool pixel 영역
-
Depth band같은 표면 깊이 유지
-
Mask lockhandoff/PCA 공통 입력
-
이미지 교체 영역SAM mask overlay, depth band visualization, locked mask debug image
MacGyvBot
Perception / Handoff / Initial
-

초기 구현은 손과 공구가 가까우면 잡았다고 판단하는 rule-based 방식이었습니다

+

사용자 공구 전달 초기 구현

+
Hand landmark손 위치와 주요 관절 좌표
Tool bboxYOLO가 찾은 공구 영역
Distance / overlap손과 공구의 근접도 계산
Rule thresholdgrasp 여부 판단
-
발표 포인트: 처음에는 단순한 기하 조건으로 handoff release gate를 만들 수 있다고 봤습니다.
+
MacGyvBot
Perception / Handoff / Limitation
-

하지만 가까움은 실제 grasp가 아니었고, release 판단에는 위험했습니다

-
-
관찰
왜 문제가 됐나
결과
-
손이 스쳐 지나감
거리 기준은 접촉 의도를 구분하지 못함
false release 위험
-
손바닥을 편 상태
open hand도 bbox와 가까우면 threshold를 넘음
grasp 오인식
-
그리퍼/손 occlusion
YOLO bbox와 depth가 흔들림
handoff gate 불안정
+

BBOX rule-based 공구 전달 초기 구현의 한계

+
+
+
+ rule-based grasp detection failure example +
Rule-based grasp detection 실패손과 공구가 가깝지 않더라도 임계값을 넘는 경우 false release 위험이 생긴다.
+
+
+ YOLO detection failure during handoff example +
YOLO bbox 기반 판단 실패손으로 공구를 가리는 경우 yolo 감지 실패
+
+
+
+
+ +
+
MacGyvBot
+
Perception / Mask Generation
+

SAM+Depth mask

+
+
+
+
YOLO bbox ROIbbox를 clamp하고 crop 기준으로 사용
+
SAM foregroundbbox 안에서 물체처럼 보이는 mask 생성
+
Foreground depthmask 안 가까운 depth cluster 선택
+
Refine + morphologydepth tolerance로 남기고 구멍 보정
+
+
+ SAM and depth mask generation result +
SAM+Depth mask generationSAM이 bbox 안 foreground를 따고, 가까운 전경 depth와 맞는 픽셀만 남깁니다.
+
+
MacGyvBot
Perception / Handoff / Final
-

그래서 손 랜드마크 지도학습 모델과 mask contact를 함께 쓰는 gate로 발전시켰습니다

-
+

최종 사용자 공구 전달

+
+
RELEASE GATE -

hand landmark ML classifier + temporal stability + mask contact

-

손 landmark를 feature로 만든 지도학습 기반 ML 모델이 open/grasp gesture를 먼저 판단합니다. 그 결과가 일정 시간 유지되고, SAM+Depth mask 표면 접촉까지 확인될 때만 handoff release를 허용합니다.

+

hand landmark ML classifier + SAM depth mask contact

+

rule-based proximity 대신 손 landmark 지도학습 모델로 grasp/open을 먼저 판단합니다. 여기에 SAM+Depth mask로 잡힌 공구 표면과의 contact, 시간 안정성을 함께 확인해 release gate를 닫습니다.

MLhand landmarks → grasp / open classification
+
MASKSAM+Depth locked tool surface → contact evidence
-
이미지 교체 영역handoff annotated image: landmarks, ML grasp result, mask contact
+
+
+ driver SAM depth mask grasp recognition result +
Driver mask grasp recognitionmask 표면에서 depth mask와 손의 depth를 비교하여 ML 결과가 grasp여도 그리퍼를 열지 않습니다.
+
+
+ wrench SAM depth mask grasp recognition result +
Wrench mask grasp recognition공구 형상이 달라도 같은 mask 기반 판단을 적용합니다.
+
+
+
@@ -264,6 +308,7 @@

hand landmark ML classifier + temporal stability + mask contact

MacGyvBot
Perception / PCA Grasp

PCA는 mask의 주축으로 yaw와 gripper width를 계산합니다

+
이미지 교체 영역PCA axis overlay, yaw angle, width estimate debug result
@@ -272,12 +317,14 @@

PCA는 mask의 주축으로 yaw와 gripper width를 계산합니다

RESULT

mask 주축으로 yaw를 얻고, tool width를 gripper width 설정에 연결합니다.

+
MacGyvBot
Perception / Lessons

Perception은 탐지, mask, handoff, grasp를 하나의 evidence chain으로 묶었습니다

+
판단
초기 한계
최종 설계
공구 감지
bbox 중심만으로는 파지 자세 부족
YOLO fine-tuning + depth projection
@@ -285,6 +332,7 @@

Perception은 탐지, mask, handoff, grasp를 하나의 evidence chain으로
grasp point
VLM 지연과 좌표 흔들림
SAM/depth mask + PCA yaw/width

발표 포인트: Perception의 핵심은 공구 검출 결과를 실제 로봇 제어 파라미터로 바꾸는 것입니다.
+
@@ -299,6 +347,7 @@

MANIPULATION

MacGyvBot
Manipulation / Bring Tool

공구 요청에서는 drawer open, pick, handoff pose까지 motion sequence를 구성합니다

+
Drawer handlehandle pose 접근
Pull opendrawer open motion
@@ -306,13 +355,14 @@

공구 요청에서는 drawer open, pick, handoff pose까지 motion sequence
Handoff pose사용자 위치로 이동
Releaseperception gate 통과

-
발표 포인트: Manipulation은 perception 결과를 motion target, yaw, gripper width로 실행합니다.
+
MacGyvBot
Manipulation / Store Tool In Drawer

공구 반납은 drawer ownership을 다시 얻고 안전 높이에서 보관하는 문제입니다

+
STORE FLOW @@ -326,6 +376,7 @@

receive → identify → open drawer → place → close

MOTION

MoveIt target, RG2 width, hand-eye transform, marker reference

+
@@ -340,6 +391,7 @@

SAFETY

MacGyvBot
Safety / Drawer Collision Scene

Drawer collision scene은 실제 로봇 동작에서 planning 가능성과 안전성을 동시에 좌우했습니다

+
SCENEdrawer_onlyMoveIt planning scene에 drawer keep-out collision object 추가
@@ -353,12 +405,14 @@

drawer collision scene + RG2 self-collision 관리

PLANsafe but not over-constrained
+
MacGyvBot
Safety / Drop Detection Recovery

공구를 떨어뜨렸을 때는 queue를 보존하고 recovery flow로 전환합니다

+
Drop event/tool_drop_detected
Cancel motion현재 MoveIt goal cancel
@@ -367,6 +421,7 @@

공구를 떨어뜨렸을 때는 queue를 보존하고 recovery flow로 전
Resume중단 step 재실행

발표 포인트: drop recovery는 새 알고리즘이 아니라 기존 perception, grasp, drawer flow를 안전하게 재호출하는 구조입니다.
+
@@ -381,6 +436,7 @@

SIM

MacGyvBot
Isaac Sim Simulation

Isaac Sim은 개선 방향이 아니라 실제 로봇 투입 전 검증 체계입니다

+
  • drawer open/close sequence와 collision scene 검증
  • @@ -390,6 +446,7 @@

    Isaac Sim은 개선 방향이 아니라 실제 로봇 투입 전 검증 체

이미지 교체 영역Isaac Sim drawer scene, robot reachability, collision visualization
+
@@ -404,18 +461,21 @@

IMPACT

MacGyvBot
Project Impact

MacGyvBot의 임팩트는 공구 이동을 로봇 task로 바꾸는 데 있습니다

+
EFF
작업자가 공구를 찾고 이동하는 시간을 줄임
SAFE
handoff gate, collision scene, drop recovery로 위험 동작을 줄임
AUTO
공구 요청/반납/보관을 자동화 가능한 workflow로 모델링
LOG
task status와 GUI feedback으로 실패 원인을 설명 가능하게 함
+
MacGyvBot
Next Improvements

개선 방향은 perception 안정화와 reactive planning으로 이어집니다

+
개선 방향
현재 한계
다음 접근
perception 고도화
조명, occlusion, low confidence bbox
mask 품질 평가와 multi-view/temporal filter
@@ -423,6 +483,7 @@

개선 방향은 perception 안정화와 reactive planning으로 이어집
환경 변화 대응
서랍/공구 위치 변화, marker occlusion
drawer state cache와 simulation 기반 검증 확대
reactive planning
정적 plan 후 runtime 변화에 취약
collision-aware replanning과 operator confirmation

+
diff --git a/MACGYVBOT-DECK/styles/common.css b/MACGYVBOT-DECK/styles/common.css index bbbf4b3..e30a99c 100644 --- a/MACGYVBOT-DECK/styles/common.css +++ b/MACGYVBOT-DECK/styles/common.css @@ -548,6 +548,12 @@ ul.clean-list li::before { align-items: stretch; } +.decision-panel.handoff-final-layout { + grid-template-columns: minmax(0, .78fr) minmax(0, 1.22fr); + gap: 20px; + align-items: stretch; +} + .decision-panel .proof-panel, .decision-panel .signal-stack { min-height: 330px; @@ -644,6 +650,242 @@ ul.clean-list li::before { .placeholder b { display: block; font-size: 28px; margin-bottom: 10px; color: #fff; } .placeholder span { display: block; font-size: 18px; line-height: 1.35; max-width: 520px; } +.failure-media-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 20px; + margin-top: 28px; +} + +.failure-shot { + margin: 0; + overflow: hidden; + border: 1px solid var(--line); + border-radius: 10px; + background: #fff; + box-shadow: 0 18px 40px rgba(10, 13, 16, .1); +} + +.failure-shot img { + display: block; + width: 100%; + height: 326px; + object-fit: contain; + background: + linear-gradient(90deg, rgba(111,232,255,.08) 1px, transparent 1px), + linear-gradient(0deg, rgba(111,232,255,.06) 1px, transparent 1px), + #12171b; + background-size: 24px 24px; +} + +.failure-shot figcaption { + display: grid; + gap: 7px; + min-height: 96px; + padding: 16px 18px; + border-top: 1px solid var(--line); +} + +.failure-shot figcaption b { + font-size: 19px; + line-height: 1.2; + color: var(--ink); +} + +.failure-shot figcaption span { + font-size: 15px; + line-height: 1.42; + color: var(--muted); + word-break: keep-all; + overflow-wrap: normal; +} + +.grasp-media-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 20px; + margin-top: 28px; +} + +.grasp-shot { + margin: 0; + overflow: hidden; + border: 1px solid var(--line); + border-radius: 10px; + background: #fff; + box-shadow: 0 18px 40px rgba(10, 13, 16, .1); +} + +.grasp-shot img { + display: block; + width: 100%; + height: 326px; + object-fit: contain; + background: + linear-gradient(90deg, rgba(111,232,255,.08) 1px, transparent 1px), + linear-gradient(0deg, rgba(111,232,255,.06) 1px, transparent 1px), + #12171b; + background-size: 24px 24px; +} + +.grasp-shot figcaption { + display: grid; + gap: 7px; + min-height: 96px; + padding: 16px 18px; + border-top: 1px solid var(--line); +} + +.grasp-shot figcaption b { + font-family: var(--mono); + font-size: 18px; + line-height: 1.2; + color: var(--ink); +} + +.grasp-shot figcaption span { + font-size: 15px; + line-height: 1.42; + color: var(--muted); + word-break: keep-all; + overflow-wrap: normal; +} + +.handoff-grasp-media { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 16px; + align-items: stretch; + min-height: 330px; +} + +.handoff-final-layout .proof-metric { + align-items: center; + min-height: 52px; + padding-top: 12px; +} + +.handoff-final-layout .proof-metric strong { + display: block; + font-size: 31px; + line-height: 1; + min-height: 36px; +} + +.grasp-shot.compact img { + height: 232px; +} + +.grasp-shot.compact figcaption { + min-height: 98px; + padding: 13px 15px; +} + +.grasp-shot.compact figcaption b { + font-size: 15px; +} + +.grasp-shot.compact figcaption span { + font-size: 13px; + line-height: 1.38; +} + +.wide-media-shot { + margin: 28px 0 0; + overflow: hidden; + border: 1px solid var(--line); + border-radius: 10px; + background: #fff; + box-shadow: 0 18px 40px rgba(10, 13, 16, .1); +} + +.wide-media-shot img { + display: block; + width: 100%; + height: 276px; + object-fit: contain; + background: + linear-gradient(90deg, rgba(111,232,255,.08) 1px, transparent 1px), + linear-gradient(0deg, rgba(111,232,255,.06) 1px, transparent 1px), + #12171b; + background-size: 24px 24px; +} + +.wide-media-shot figcaption { + display: flex; + align-items: center; + gap: 18px; + min-height: 64px; + padding: 14px 18px; + border-top: 1px solid var(--line); +} + +.wide-media-shot figcaption b { + flex: 0 0 auto; + font-size: 19px; + line-height: 1.2; + color: var(--ink); +} + +.wide-media-shot figcaption span { + color: var(--muted); + font-size: 15px; + line-height: 1.4; + word-break: keep-all; + overflow-wrap: normal; +} + +.mask-proof-layout { + display: grid; + grid-template-columns: minmax(0, .38fr) minmax(0, .62fr); + gap: 22px; + align-items: stretch; + margin-top: 28px; +} + +.vertical-flow { + display: grid; + gap: 13px; +} + +.vertical-flow .flow-step { + min-height: 86px; + padding: 16px 18px; +} + +.vertical-flow .flow-step:not(:last-child)::after { + content: ""; + left: 50%; + right: auto; + top: 100%; + bottom: auto; + width: 12px; + height: 12px; + border-right: 2px solid #8d979f; + border-bottom: 2px solid #8d979f; + transform: translate(-50%, -3px) rotate(45deg); +} + +.vertical-flow .flow-step b { + font-size: 20px; +} + +.vertical-flow .flow-step span { + font-size: 15px; +} + +.wide-media-shot.compact { + margin-top: 0; +} + +.wide-media-shot.compact img { + height: 346px; +} + +.wide-media-shot.compact figcaption { + min-height: 72px; +} + .metrics { display: grid; grid-template-columns: repeat(4, 1fr); diff --git a/MACGYVBOT-DECK/styles/deck.css b/MACGYVBOT-DECK/styles/deck.css index cf5cc88..fad134b 100644 --- a/MACGYVBOT-DECK/styles/deck.css +++ b/MACGYVBOT-DECK/styles/deck.css @@ -1,4 +1,4 @@ -@import url("./common.css?v=20260615-flow-fix-2"); +@import url("./common.css?v=20260615-vertical-caret-up"); /* Deck viewport and slide frame */ html, body { margin: 0; min-height: 100%; background: #111; color: var(--ink); font-family: var(--sans); } @@ -32,6 +32,28 @@ body { overflow: hidden; } transform-origin: center; } .slide.active { display: block; } + +.slide.active:has(> .slide-body):not(.cover):not(.divider) { + display: grid; + grid-template-rows: auto auto minmax(0, 1fr); +} + +.slide-body { + min-height: 0; + width: 100%; + display: grid; + align-content: center; + justify-items: stretch; +} + +.slide-body > :first-child { + margin-top: 0 !important; +} + +.slide-body > .source-note { + align-self: end; +} + .slide.cover { background: linear-gradient(90deg, rgba(255,216,100,.08) 1px, transparent 1px),