WHAT
MacGyvBotWhat We Built
MacGyvBot은 공구를 찾아 전달하고, 사용 후 다시 보관하는 로봇 시스템입니다
+REQUEST공구 요청사용자가 필요한 공구를 말하면 로봇이 서랍에서 꺼내 사용자에게 전달한다.
@@ -63,12 +64,14 @@ 단순 공구 탐지가 아니라 공구 관리 closed loop
2request loop + return loop
MacGyvBotScenario / Tool Request
사용자의 공구 요청은 공구명에서 사용자 위치 handoff까지 이어집니다
+공구명 파악LLM/parser로 tool intent 추출
서랍 파악tool-drawer mapping 확인
@@ -77,12 +80,14 @@ 사용자의 공구 요청은 공구명에서 사용자 위치 handoff까지
건네주기release gate 통과 후 전달
발표 포인트: 요청 흐름은 사용자의 말이 실제 handoff까지 이어지는 end-to-end 시나리오입니다.
+
MacGyvBotScenario / Tool Return
사용자의 공구 반납은 다시 공구를 식별하고 서랍 보관까지 닫습니다
+공구 전달받기human grasp result와 gripper handoff
공구 파악현재 tool context 또는 재탐지
@@ -90,12 +95,14 @@ 사용자의 공구 반납은 다시 공구를 식별하고 서랍 보관까
서랍에 보관place, release, close
발표 포인트: 반납 흐름은 로봇이 공구를 다시 책임지고 보관하는 ownership 전환입니다.
+
MacGyvBotSystem 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
MacGyvBotDevelopment Flow
개발 순서는 기능을 나열하는 방식이 아니라 시연 루프를 닫는 방식으로 진행됐습니다
+05.04
Pipeline Skeleton
ROS 2 package boundary, command/task coordinator, GUI skeleton
05.06
Pick & Handover
공구 꺼내기와 사용자 전달 최소 루프
개발 순서는 기능을 나열하는 방식이 아니라 시연 루프를
06.05 / 06.12Advanced & Safety
mask, PCA, yaw, collision, recovery 안정화
06.05 / 06.12
Advanced & Safety
mask, PCA, yaw, collision, recovery 안정화
발표 포인트: 먼저 최소 루프를 만들고, 이후 인식 정확도와 안전성을 단계적으로 올렸습니다.
+ HOW
MacGyvBotCommand / LLM
Command는 자연어를 robot task intent로 바꾸는 입구입니다
+
IMPLEMENTATION
@@ -148,12 +159,14 @@
LLM parser + rule fallback
FALLBACK
LLM 응답이 늦거나 실패해도 기본 명령은 규칙 기반 parser로 처리합니다.
MacGyvBotTask 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
MacGyvBotTask Coordination / Pause Resume
Pause / Resume은 단순 cancel이 아니라 중단된 step을 다시 실행하는 문제였습니다
+상황
문제
해결 방향
drawer preparation 중 pause
MoveIt goal cancel 후 현재 step 유실 위험
retry 가능한 suspended step으로 queue 앞에 보존
Pause / Resume은 단순 cancel이 아니라 중단된 step을 다시 실행
반복 pause/resumeyaw/J6/grasp 상태가 어긋남grasp-time J6 angle 보존과 status cleanup
반복 pause/resume
yaw/J6/grasp 상태가 어긋남
grasp-time J6 angle 보존과 status cleanup
발표 포인트: pause/resume은 버튼 기능이 아니라 motion, drawer, recovery 상태를 함께 보존하는 문제였습니다.
+ PERCEPTION
MacGyvBotPerception / 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
MacGyvBotPerception / 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
MacGyvBotPerception / Handoff / Initial
- 초기 구현은 손과 공구가 가까우면 잡았다고 판단하는 rule-based 방식이었습니다
+사용자 공구 전달 초기 구현
+Hand landmark손 위치와 주요 관절 좌표
Tool bboxYOLO가 찾은 공구 영역
Distance / overlap손과 공구의 근접도 계산
Rule thresholdgrasp 여부 판단
발표 포인트: 처음에는 단순한 기하 조건으로 handoff release gate를 만들 수 있다고 봤습니다.
+
MacGyvBotPerception / Handoff / Limitation
- 하지만 가까움은 실제 grasp가 아니었고, release 판단에는 위험했습니다
-
-
-
-
-
+
+
MacGyvBot
+
MacGyvBot
관찰
왜 문제가 됐나
결과
손이 스쳐 지나감
거리 기준은 접촉 의도를 구분하지 못함
false release 위험
손바닥을 편 상태
open hand도 bbox와 가까우면 threshold를 넘음
grasp 오인식
그리퍼/손 occlusion
YOLO bbox와 depth가 흔들림
handoff gate 불안정
BBOX rule-based 공구 전달 초기 구현의 한계
+
+
+
+
+
+
+
+ Rule-based grasp detection 실패손과 공구가 가깝지 않더라도 임계값을 넘는 경우 false release 위험이 생긴다.
+
+
+
+ YOLO bbox 기반 판단 실패손으로 공구를 가리는 경우 yolo 감지 실패
+
+
+
+
+
MacGyvBotPerception / Mask Generation
+ SAM+Depth mask
+
+
+
+
+ SAM+Depth mask generationSAM이 bbox 안 foreground를 따고, 가까운 전경 depth와 맞는 픽셀만 남깁니다.
+
+
+
+ YOLO bbox ROIbbox를 clamp하고 crop 기준으로 사용
+ SAM foregroundbbox 안에서 물체처럼 보이는 mask 생성
+ Foreground depthmask 안 가까운 depth cluster 선택
+ Refine + morphologydepth tolerance로 남기고 구멍 보정
+
+
MacGyvBotPerception / Handoff / Final
- 그래서 손 랜드마크 지도학습 모델과 mask contact를 함께 쓰는 gate로 발전시켰습니다
-
+
MacGyvBot
+
MacGyvBot
@@ -285,6 +332,7 @@ Perception은 탐지, mask, handoff, grasp를 하나의 evidence chain으로
@@ -299,6 +347,7 @@
MacGyvBot
공구 요청에서는 drawer open, pick, handoff pose까지 motion sequence
-
MacGyvBot
+
@@ -340,6 +391,7 @@
MacGyvBot
+
MacGyvBot
공구를 떨어뜨렸을 때는 queue를 보존하고 recovery flow로 전
@@ -381,6 +436,7 @@
MacGyvBot
+
@@ -404,18 +461,21 @@
MacGyvBot
+
MacGyvBot
@@ -423,6 +483,7 @@ 개선 방향은 perception 안정화와 reactive planning으로 이어집
+
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),
최종 사용자 공구 전달
+
+
+
@@ -264,6 +308,7 @@
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 mask grasp recognitionmask 표면에서 depth mask와 손의 depth를 비교하여 ML 결과가 grasp여도 그리퍼를 열지 않습니다.
+
+
+
+ Wrench mask grasp recognition공구 형상이 달라도 같은 mask 기반 판단을 적용합니다.
+
+
+
+
+ hand landmark ML classifier + temporal stability + mask contact
MacGyvBotPerception / 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 설정에 연결합니다.
MacGyvBotPerception / Lessons
Perception은 탐지, mask, handoff, grasp를 하나의 evidence chain으로 묶었습니다
+판단
초기 한계
최종 설계
공구 감지
bbox 중심만으로는 파지 자세 부족
YOLO fine-tuning + depth projection
Perception은 탐지, mask, handoff, grasp를 하나의 evidence chain으로
grasp pointVLM 지연과 좌표 흔들림SAM/depth mask + PCA yaw/width
grasp point
VLM 지연과 좌표 흔들림
SAM/depth mask + PCA yaw/width
발표 포인트: Perception의 핵심은 공구 검출 결과를 실제 로봇 제어 파라미터로 바꾸는 것입니다.
+ MANIPULATION
MacGyvBotManipulation / 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로 실행합니다.
+
MacGyvBotManipulation / 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
SAFETY
MacGyvBotSafety / 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
MacGyvBotSafety / 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를 안전하게 재호출하는 구조입니다.
+ SIM
MacGyvBotIsaac Sim Simulation
Isaac Sim은 개선 방향이 아니라 실제 로봇 투입 전 검증 체계입니다
+- drawer open/close sequence와 collision scene 검증 @@ -390,6 +446,7 @@
Isaac Sim은 개선 방향이 아니라 실제 로봇 투입 전 검증 체
이미지 교체 영역Isaac Sim drawer scene, robot reachability, collision visualization
IMPACT
MacGyvBotProject Impact
MacGyvBot의 임팩트는 공구 이동을 로봇 task로 바꾸는 데 있습니다
+EFF
작업자가 공구를 찾고 이동하는 시간을 줄임
SAFE
handoff gate, collision scene, drop recovery로 위험 동작을 줄임
AUTO
공구 요청/반납/보관을 자동화 가능한 workflow로 모델링
LOG
task status와 GUI feedback으로 실패 원인을 설명 가능하게 함
MacGyvBotNext Improvements
개선 방향은 perception 안정화와 reactive planning으로 이어집니다
+개선 방향
현재 한계
다음 접근
perception 고도화
조명, occlusion, low confidence bbox
mask 품질 평가와 multi-view/temporal filter
개선 방향은 perception 안정화와 reactive planning으로 이어집
환경 변화 대응서랍/공구 위치 변화, marker occlusiondrawer state cache와 simulation 기반 검증 확대
reactive planning정적 plan 후 runtime 변화에 취약collision-aware replanning과 operator confirmation
환경 변화 대응
서랍/공구 위치 변화, marker occlusion
drawer state cache와 simulation 기반 검증 확대
reactive planning
정적 plan 후 runtime 변화에 취약
collision-aware replanning과 operator confirmation