Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
109 commits
Select commit Hold shift + click to select a range
ec5e915
Enable camera-free color discrimination checks
oyeong011 Jun 1, 2026
20c319c
Plan post-shake human handover safely
oyeong011 Jun 1, 2026
6667c29
Refactor launch parameters and update session logs for improved clari…
oyeong011 Jun 5, 2026
705ed30
Add cocktail cycle feature and related scripts for enhanced recipe ex…
oyeong011 Jun 5, 2026
0375894
Merge remote-tracking branch 'origin/develop' into experiment/offline…
oyeong011 Jun 5, 2026
7548495
Adopt yolo cup uprighting perception assets
oyeong011 Jun 5, 2026
5e552a7
Update calibration and launch files for improved color scanning pose …
oyeong011 Jun 5, 2026
e585e5c
Keep side-grip panel cleanup from tearing down prerequisites
oyeong011 Jun 5, 2026
4fb68a3
Run measured dispenser moves in link6 TCP frame
oyeong011 Jun 5, 2026
0b51ae9
Route dispenser press through measured calibration
oyeong011 Jun 5, 2026
ba5a00b
Make azas-panel refresh stale panel servers
oyeong011 Jun 5, 2026
b93840a
Avoid controller TCP dependency for front-hold moves
oyeong011 Jun 5, 2026
cde2651
Align dispenser regrasp bounds with measured TCP compensation
oyeong011 Jun 5, 2026
9834c10
Preserve measured dispenser operation baseline
oyeong011 Jun 7, 2026
70bbbca
Model dispenser and gripper occupancy conservatively
oyeong011 Jun 7, 2026
862187f
Restore visible horizontal dispenser spouts
oyeong011 Jun 7, 2026
6c0149f
Merge dispenser nozzles into one horizontal spout block
oyeong011 Jun 7, 2026
110dfc7
Remove stale workspace walls for dispenser course path
oyeong011 Jun 7, 2026
d882f9d
Align merged nozzle block with dispenser body
oyeong011 Jun 7, 2026
5bdfdd1
Show link6 gripper and match nozzle footprint
oyeong011 Jun 7, 2026
18cf286
Use standard Doosan virtual port for dispenser course
oyeong011 Jun 7, 2026
67a49ec
feat: add vision-based azas_cup_uprighting package
ssarahstar Jun 8, 2026
eeabf81
fix: expose dispenser simulation launch parameters
suuu0719 Jun 5, 2026
ab7742f
feat: add trait-based voice recommendations
suuu0719 Jun 5, 2026
17b9c52
fix: handle stronger voice follow-up requests
suuu0719 Jun 5, 2026
6689dfe
feat: 1차 키오스크
suuu0719 Jun 5, 2026
fae41d3
Add kiosk and voice UI integration
suuu0719 Jun 8, 2026
271ea5d
Make cocktail panel execute the real integrated flow
oyeong011 Jun 8, 2026
73fc4b3
Merge develop for latest robot pickup modules
oyeong011 Jun 8, 2026
57b1cca
Revert "Fix ArUco marker test compatibility across OpenCV versions"
suuu0719 Jun 8, 2026
4c6fbb2
Revert "Fix flaky ROS setup in colcon CI job"
suuu0719 Jun 8, 2026
0b62ea7
Merge pull request #36 from ROS2JARVIS/feature/voice
suuu0719 Jun 8, 2026
f08fc72
Merge pull request #32 from ROS2JARVIS/feature/azas-cup-uprighting
oyeong011 Jun 8, 2026
9dc3206
Merge pull request #37 from ROS2JARVIS/feature/kiosk
suuu0719 Jun 8, 2026
a34fc67
Integrate latest develop modules for panel work
oyeong011 Jun 8, 2026
cafe749
Enhance dispenser collision handling and improve recipe execution par…
oyeong011 Jun 9, 2026
47985f2
Stabilize panel-driven robot logic trials
oyeong011 Jun 9, 2026
bcad928
Make cup uprighting use field-verified execution
oyeong011 Jun 9, 2026
8b216d4
Prevent blind Somyeong gripper closure
oyeong011 Jun 9, 2026
d50208b
Keep side grip from driving link6 into the floor
oyeong011 Jun 9, 2026
3ac3561
Avoid false side-grip gripper scene contacts
oyeong011 Jun 9, 2026
dca3407
Honor direct color recipes in the panel
oyeong011 Jun 9, 2026
cb58ac1
Enhance lid grip planning and execution with new parameters and valid…
oyeong011 Jun 9, 2026
b272706
Add --force-cartesian-press option to override contact joints during …
oyeong011 Jun 9, 2026
9285161
feat: add J6 lid grip and step preseat workflow
ummobro Jun 10, 2026
1076da2
Merge remote-tracking branch 'origin/develop' into develop
ummobro Jun 10, 2026
a274d0a
Add script to stop all Azas field stack processes and clean up shared…
oyeong011 Jun 10, 2026
0dc58ae
fix all collisions
Jun 10, 2026
1ba755b
fix self collision
Jun 10, 2026
aefa8b1
feat(azas_voice): add voice dispenser executor node
suuu0719 Jun 10, 2026
dc76503
chore(tools): add virtual voice-dispenser sim runner and verifier
suuu0719 Jun 10, 2026
25a0f4a
feat: Enhance dispenser control and preview functionality
oyeong011 Jun 10, 2026
89c7f67
Merge remote-tracking branch 'origin/develop' into integration/panel-…
oyeong011 Jun 10, 2026
7a49b66
feat(azas_kiosk): launch the kiosk in the sim and wire its status dis…
suuu0719 Jun 10, 2026
134b8f6
Merge pull request #41 from ROS2JARVIS/feature/kiosk
suuu0719 Jun 10, 2026
b734603
Adopt gripper_tcp-basis dispenser collision measurement from develop
oyeong011 Jun 10, 2026
2199087
Re-teach dispenser press calibration and refine recipe execution
oyeong011 Jun 10, 2026
aa7af95
Drop calibration teach backups from version control
oyeong011 Jun 10, 2026
c6d87f3
Merge pull request #43 from ROS2JARVIS/integration/panel-tmux-lid-flo…
oyeong011 Jun 10, 2026
cf9fe8f
fix: resolve 180-degree reversal for vertical cups and optimize gripp…
ssarahstar Jun 10, 2026
d165949
refactor rg2 real model collision
Jun 10, 2026
c50d62b
fix aruco api
Jun 10, 2026
33def5c
fix merge conflict
Jun 10, 2026
925fce2
feat: remove cup uprighting logic and transition to home position pos…
ssarahstar Jun 10, 2026
3aac240
test
oyeong011 Jun 10, 2026
2e7ac70
cocktail press logic rewrite
oyeong011 Jun 11, 2026
ed73ed2
Refactor tmux integration and remove redundant robot connection logic
oyeong011 Jun 11, 2026
b0b462a
Implement perception-only hand detection node and related scripts; re…
oyeong011 Jun 11, 2026
debbdd2
feat: Enhance robot pipeline control and recipe sequences
oyeong011 Jun 11, 2026
4572eef
Merge branch 'develop' into refactor/rg2_collision2
oyeong011 Jun 11, 2026
0dae079
Merge branch 'develop' into feature/optimize-cup-uprighting
oyeong011 Jun 11, 2026
1c06ec4
Merge pull request #45 from ROS2JARVIS/feature/optimize-cup-uprighting
oyeong011 Jun 11, 2026
d511099
Merge pull request #44 from ROS2JARVIS/refactor/rg2_collision2
oyeong011 Jun 11, 2026
99c1544
Merge branch 'develop' of https://github.com/ROS2JARVIS/Azas into int…
oyeong011 Jun 11, 2026
dad9f3d
feat: Update robot pipeline control and handover logic
oyeong011 Jun 11, 2026
d01c263
Make RG2 mesh collision verifiable in M0609 planning
oyeong011 Jun 11, 2026
e5d18c8
Make the RG2 M0609 description load from link_6
oyeong011 Jun 11, 2026
49a36f2
Add auto cup flow router
chris3471 Jun 11, 2026
1a3b325
Improve cup route classifier overlay
chris3471 Jun 11, 2026
70338fd
Merge pull request #47 from ROS2JARVIS/experiment/develop-latest
chris3471 Jun 11, 2026
dc5c5ba
Fix cup uprighting auto execution
chris3471 Jun 11, 2026
9488d87
Merge remote-tracking branch 'origin/develop' into experiment/develop…
chris3471 Jun 11, 2026
f08ad8f
Fix lid marker merge conflict markers
chris3471 Jun 11, 2026
eb793db
Merge pull request #48 from ROS2JARVIS/experiment/develop-latest
chris3471 Jun 11, 2026
4244253
Refactor RG2 Gripper Configuration and Enhance Side Grip Logic
oyeong011 Jun 11, 2026
536675c
Merge origin develop for auto cup routing
oyeong011 Jun 11, 2026
d234251
QA 테스트 결과 side grip미작동, 아르코 마커 인식 이상함
oyeong011 Jun 11, 2026
aed286c
컵 상태 판단후 사이드 그립 안되는 오류
oyeong011 Jun 12, 2026
795c722
side grip dispenser cycle lid grip and put 연결완료
oyeong011 Jun 12, 2026
7363211
파이프라인 로직 구현
oyeong011 Jun 12, 2026
aaa5fc1
2차 테스트 성공
oyeong011 Jun 12, 2026
c9be6bf
쉐이킹전 및 stt로직 제외 작동 가능 확인
oyeong011 Jun 12, 2026
bc5bbd7
3차 테스트 side grip성공
oyeong011 Jun 12, 2026
e8a3ad3
4차 테스트 완료
oyeong011 Jun 12, 2026
854b442
5차테스트 stt, mediapipe제외 성공
oyeong011 Jun 12, 2026
31d2ccd
feat: Implement cocktail recipe catalog and voice command automation
oyeong011 Jun 12, 2026
5f7a7c9
6차 테스트 완료
oyeong011 Jun 13, 2026
c578ee0
쉐이킹 전까지 테스트 완료 확인
oyeong011 Jun 13, 2026
088b92b
7차 테스트 stt ~ 쉐이킹까지 완료
oyeong011 Jun 15, 2026
c3e3a26
test/8차 테스트 lid버튼 클릭없이 자동화 로직 구축
oyeong011 Jun 15, 2026
07ae581
feat: Add ElevenLabs API configuration and update cup holder offset i…
oyeong011 Jun 15, 2026
2a766be
Apply validated MediaPipe palm handover
chris3471 Jun 15, 2026
b6fde53
Connect post-shake MediaPipe handover
chris3471 Jun 15, 2026
311b3ad
side gripe target tcp
Jun 15, 2026
1bb4397
10차 테스트 한사이클 (사이드그립완료)
oyeong011 Jun 15, 2026
0b6791c
maybe failed
oyeong011 Jun 15, 2026
5bd7452
Preserve side-grip and cup-holder offsets before handover merge
oyeong011 Jun 15, 2026
d287518
Merge MediaPipe handover into side-grip flow
oyeong011 Jun 15, 2026
51a355a
Anchor final flow on protected main
oyeong011 Jun 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .env.local
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
ELEVENLABS_API_KEY=sk_76cef6a2940e749d15a65bcab0013911869653ae02770a29
ELEVENLABS_AGENT_ID=agent_7701kv4epy77erzrytfb1d4xyr27
2 changes: 2 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
cup_classifier_best.pth filter=lfs diff=lfs merge=lfs -text
src/azas_perception/config/yolo_cup_uprighting_best.pt filter=lfs diff=lfs merge=lfs -text
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,7 @@ tmp/
*.pth
*.onnx
*.tflite

# Local offline experiment outputs
outputs/
src/azas_bringup/config/*.bak-*
240 changes: 239 additions & 1 deletion COMMANDS.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ colcon test --packages-select azas_voice
```bash
cd /home/ssu/Azas

# 패널 서버가 없으면 시작하고, 브라우저에서 http://127.0.0.1:8765/ 를 엽니다.
# 패널 서버를 새로 초기화하고, 브라우저에서 http://127.0.0.1:8765/ 를 엽니다.
# 첫 실행 때 ~/.local/bin/azas-panel symlink도 자동으로 준비합니다.
bash tools/run/open_robot_pipeline_control_panel.sh
```
Expand All @@ -90,6 +90,12 @@ bash tools/run/open_robot_pipeline_control_panel.sh
azas-panel
```

이미 떠 있는 서버를 그대로 재사용해서 열 때:

```bash
azas-panel --reuse
```

패널 서버만 종료할 때:

```bash
Expand All @@ -111,6 +117,153 @@ ros2 launch dsr_bringup2 dsr_bringup2_moveit.launch.py \
model:=m0609 mode:=virtual host:=127.0.0.1 port:=12345
```

### 칵테일 디스펜서 전체 사이클 RViz preview

컵을 디스펜서 앞에 놓고 → 그리퍼를 완전히 열고 → 안전하게 위로 올라간 뒤
→ 빈 그리퍼를 닫고 → 측정된 프레스 조인트에서 펌프질 → 컵을 다시 잡는
통합 사이클을 RViz에서 먼저 봅니다.

```bash
cd /home/ssu/Azas
bash tools/run/stop_cocktail_motion_preview.sh
bash tools/run/show_cocktail_motion_preview.sh 1x1
```

`show_cocktail_motion_preview.sh`의 기본 RViz는 교안의 MoveIt RViz
(`RVIZ_MODE=bringup`)라서 주황색 로봇/Trajectory/PlanningScene 화면으로 보입니다.
하얀 RobotModel 중심의 디버그 화면이 필요할 때만 `RVIZ_MODE=clean`을 붙입니다.

동일한 동작을 환경변수로 직접 실행하려면:

```bash
cd /home/ssu/Azas
RECIPE_DISPENSER_IDS=1x1 \
DISPENSER_COLLISION_OBJECTS=1 \
KEEP_ALIVE_AFTER_DONE=1 \
RESET_EXISTING_VIRTUAL_PREVIEW=1 \
REPLACE_EXISTING_RVIZ=1 \
bash tools/run/run_cocktail_collision_rviz_preview.sh
```

예: 1번 디스펜서 2회 프레스

```bash
RECIPE_DISPENSER_IDS=1x2 \
DISPENSER_COLLISION_OBJECTS=1 \
KEEP_ALIVE_AFTER_DONE=1 \
bash tools/run/run_cocktail_collision_rviz_preview.sh
```

RViz preview가 떠 있는 상태에서 실제 로봇 one-click 스크립트를 실행하면
virtual/emulator 세션과 실제 세션이 섞이지 않도록 거부합니다.

preview를 닫고 실제 로봇 실행으로 전환하려면:

```bash
bash tools/run/stop_cocktail_motion_preview.sh
```

이 정리 스크립트는 preview shell뿐 아니라 `dsr_bringup2_moveit.launch.py mode:=virtual`,
`run_emulator`, `DRCF M0609`, 관련 RViz까지 확인합니다. 남은 virtual/emulator가
있으면 실제 one-click은 계속 거부됩니다.

### 측정 조인트 티칭값 기반 RViz preview

`calibration.yaml`의 `cup_pre_place_joints_deg`, `cup_place_joints_deg`,
`press_pre_joints_deg`, `press_contact_joints_deg`를 읽어서 `/joint_states`만
publish합니다. 실제 로봇 서비스, MoveJoint, MoveLine, 그리퍼 서비스는 호출하지
않습니다.

RViz까지 한 번에 띄우려면 이 wrapper를 씁니다.

```bash
source /opt/ros/humble/setup.bash
cd /home/ssu/Azas
source install/setup.bash
bash tools/run/show_measured_recipe_joint_preview_rviz.sh --dispenser-ids 1 --loop
```

이 wrapper는 기본적으로 창현 side-grip 로직과 같은 source tree의
`src/azas_bringup/config/safety.yaml`,
`src/azas_bringup/config/measured_dispenser_collision.yaml`을 명시적으로 로드합니다.
`side_grip_table`, `side_grip_workspace_*` 안전영역, measured dispenser collision,
full collision YAML marker를 RViz에 띄웁니다. 깜빡임이 있으면 남은 preview 노드를
정리하고 다시 실행합니다.

```bash
cd /home/ssu/Azas
source /opt/ros/humble/setup.bash
source install/setup.bash
pkill -f 'preview_measured_dispenser_recipe_rviz.py|publish_measured_recipe_joint_rviz_preview.py|joint_state_relay.py|dispenser_sequence_preview_node|workspace_collision_scene_node|measured_dispenser_collision_scene_node|collision_scene_rviz_publisher|link6_gripper_collision_node|__node:=m0609_robot_state_publisher' || true
pkill -x rviz2 || true

DISPLAY=:20.0 \
SHOW_WORKSPACE_SAFETY=true \
SHOW_MEASURED_DISPENSER_COLLISION=true \
SHOW_FULL_COLLISION_SCENE=true \
PUBLISH_WORKSPACE_COLLISION_OBJECTS=true \
PUBLISH_DISPENSER_COLLISION_OBJECTS=true \
JOINT_VELOCITY_DEG_S=40.0 \
HOLD_SECONDS=1.0 \
PUBLISH_RATE=60.0 \
bash tools/run/show_measured_recipe_joint_preview_rviz.sh \
--dispenser-ids 1 \
--no-press-reset-before-press \
--press-use-recorded-pre-joints \
--press-depth-m 0.040 \
--press-extra-depth-m 0.0 \
--safe-lift-joint-fallback \
--press-lock-contact-joints 6 \
--loop
```

첫 번째 터미널에서 RViz demo를 실행합니다.

```bash
source /opt/ros/humble/setup.bash
cd /home/ssu/Azas
source install/setup.bash
ros2 launch dsr_moveit_config_m0609 demo.launch.py
```

다른 터미널에서 측정 조인트 preview publisher를 실행합니다. 이 Python 명령만으로는
RViz 창을 띄우지 않습니다.

```bash
source /opt/ros/humble/setup.bash
cd /home/ssu/Azas
source install/setup.bash
python3 tools/run/preview_measured_dispenser_recipe_rviz.py --dispenser-ids 1 --loop
```

예: 1번 디스펜서를 2회, 3번 디스펜서를 1회 순서로 표시

```bash
python3 tools/run/preview_measured_dispenser_recipe_rviz.py --dispenser-ids 1x2,3
```

### 색상 스캔 자세 RViz preview

디스펜서 색상 구분 전에 쓰는 카메라 보기 관절 자세
`[0, 10, 32, 0, 100, 90]°`를 실제 로봇 명령 없이 RViz에서 표시합니다.

```bash
cd /home/ssu/Azas
bash tools/run/show_color_scan_pose_rviz.sh
```

검증용으로 RViz 창 없이 `/joint_states`만 확인하려면:

```bash
USE_RVIZ=false bash tools/run/show_color_scan_pose_rviz.sh
```

현재 상태가 실제 실행 가능한지 확인하려면:

```bash
bash tools/run/check_one_click_cocktail_ready.sh
```

---

## 4. 비-하드웨어 점검
Expand Down Expand Up @@ -302,6 +455,88 @@ bash tools/run/run_connected_robot_control.sh

`run_robot_real.sh`는 strict gate stamp와 측정 config를 다시 확인한 뒤에도, operator 확인 전 `detected:upright` cup pose와 실제 camera-derived tumbler pose를 요구합니다.

### 7-6. 실제 로봇 디스펜서 통합 사이클 one-click

RViz preview로 동작을 확인한 뒤, 실제 로봇 연결부터 통합 디스펜서 사이클까지
한 번에 실행합니다. 실행 전 virtual/RViz preview 세션은 종료되어 있어야 합니다.
패널에서는 `실제 실행 준비확인` 버튼으로 상태를 보고, `실제 one-click` 버튼으로
preview 정리 후 동일한 통합 실행을 시작할 수 있습니다.

```bash
cd /home/ssu/Azas

# preview/emulator가 남아 있으면 먼저 정리
bash tools/run/stop_cocktail_motion_preview.sh

# 현재 real/RG2 서비스 상태 확인
TCP_CHECK_SEC=1 TCP_HARD_BLOCK=1 RECIPE_DISPENSER_IDS=1x1 \
bash tools/run/check_one_click_cocktail_ready.sh || true

REAL_COCKTAIL_CONFIRM=ENABLE_REAL_COCKTAIL_SEQUENCE \
RECIPE_DISPENSER_IDS=1x1 \
ROBOT_HOST=192.168.1.100 \
bash tools/run/run_cocktail_now_real.sh
```

`run_cocktail_now_real.sh`는 내부에서도 preview 정리를 한 번 더 수행합니다. 따라서
운영 명령은 위 한 줄로 충분하지만, RViz preview에서 바로 넘어오는 경우에는 정리 로그가
`Preview stop complete`인지 확인하고 진행합니다.

예: 1번 디스펜서 2회 프레스

```bash
REAL_COCKTAIL_CONFIRM=ENABLE_REAL_COCKTAIL_SEQUENCE \
ROBOT_HOST=192.168.1.100 \
bash tools/run/run_cocktail_now_real.sh 1x2
```

이 스크립트는 `/dsr01` 아래 실제 Doosan motion 서비스, `/jarvis/rg2/set_width`
그리퍼 서비스, 측정 디스펜서 collision publisher를 준비한 뒤
`run_measured_dispenser_recipe_sequence.py --execute --confirm`으로
컵놓기→프레스→다시잡기 사이클을 실행합니다. 컵 좌표는 직접 입력하지 않고
기존 비전/pose 파이프라인과 측정 디스펜서 pose만 사용합니다.
`calibration.yaml`에 `press_contact_joints_deg`가 있는 디스펜서는
해당 측정 조인트를 프레스 접촉 자세의 기준으로 사용하고, 설정된 Cartesian
pre-pose를 먼저 강제로 타지 않습니다. 접촉 조인트 도달 후 live TCP를 읽어
그 위치의 Z만 올리고/내리며 `RECIPE_DISPENSER_IDS=1x2` 같은 반복 프레스를 수행합니다.
실제 Doosan bringup 전에 `check_one_click_cocktail_config.sh`가 먼저 실행되어
해당 레시피의 front-hold pose와 press contact joint가 모두 있는지 확인합니다.
motion service가 아직 없으면 `check_one_click_cocktail_ready.sh`와
`run_one_click_cocktail_real.sh`가 `ROBOT_HOST:12345` TCP 연결을 먼저 확인합니다.
`[WARN] Doosan TCP not reachable now` 또는 연결 timeout 진단이 나오면 프레스 로직으로
진입하지 못한 상태이므로 로봇 컨트롤러 IP/네트워크/펜던트 상태를 먼저 복구해야 합니다.
`run_cocktail_now_real.sh`는 실제 실행 모드에서 이 TCP 불가 상태를 hard-block으로
처리하고, `DRY_RUN=1`일 때만 명령 경로 확인을 위해 계속 진행합니다.

정상 종료 시 콘솔과 `log/manual/one_click_real_integrated_recipe.log`에
`[PASS] measured dispenser recipe sequence completed`가 남고,
마지막에 `get_current_posj`/`get_current_posx` 샘플을 출력합니다.
실패 시에는 실패 stage와 통합 로그 tail을 바로 출력합니다.
실행 후 로그만 다시 판정하려면:

```bash
bash tools/run/check_one_click_cocktail_result.sh
```

로그 tail, 관련 프로세스, 결과 판정을 한 번에 모으려면:

```bash
bash tools/run/report_cocktail_now_status.sh
```

프레스 전 안전 상승 높이, 누르는 깊이, RG2 대기시간은 환경변수로 조절할 수 있습니다.

```bash
REAL_COCKTAIL_CONFIRM=ENABLE_REAL_COCKTAIL_SEQUENCE \
RECIPE_DISPENSER_IDS=1x2 \
PRESS_PRE_LIFT_M=0.35 \
PRESS_TRANSIT_HEIGHT_M=0.30 \
PRESS_DEPTH_M=0.07 \
RG2_OPEN_SETTLE_SECONDS=6.0 \
ROBOT_HOST=192.168.1.100 \
bash tools/run/run_one_click_cocktail_real.sh
```

## 8. 스모크 테스트

하드웨어 없이 실행 가능한 자동화 테스트입니다.
Expand All @@ -313,6 +548,9 @@ bash tools/smoke/smoke_pick_and_align_no_motion.sh
# 제어 경로 엔드투엔드 스모크
bash tools/smoke/smoke_control_path.sh

# 실제 모션 없이 one-click 칵테일 경로/패널 명령 생성 검증
bash tools/smoke/smoke_one_click_cocktail_no_motion.sh

# 가짜 하드웨어 서비스 스모크
bash tools/smoke/smoke_fake_hardware_path.sh

Expand Down
83 changes: 83 additions & 0 deletions DESIGN.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
# Design

## Source of truth
- Status: Draft
- Last refreshed: 2026-06-15
- Primary product surfaces: Azas voice order screen, menu preview panel, robot pipeline status UI, kiosk/menu surfaces.
- Evidence reviewed: `src/azas_voice/web/voice.html`, `src/azas_voice/web/voice.css`, `src/azas_voice/web/voice.js`, `src/azas_voice/azas_voice/voice_screen_node.py`, `src/azas_voice/azas_voice/voice_pipeline_executor_node.py`, `src/azas_voice/config/recipes.yaml`, `src/azas_kiosk/`.

## Brand
- Personality: calm, precise, service-oriented cocktail robot.
- Trust signals: visible order confirmation, clear recipe ingredients, robot process status, failure/resume state visibility.
- Avoid: marketing hero pages, decorative-only UI, hidden robot motion state, fake coordinates or unsupported safety claims.

## Product goals
- Goals: let users order many named drinks by voice or touch, preview the finished drink, watch the active vision feed, and understand the robot's current manufacturing stage.
- Non-goals: manual robot coordinate entry, free-form motion generation, unsupported recipe execution outside measured dispenser/color mappings.
- Success signals: users can pick from a larger menu, see ingredient amounts, see the current robot step, see the active camera/detection process, and recover from interrupted dispenser sequences.

## Personas and jobs
- Primary personas: demo operator, guest ordering a drink, developer validating the robot flow.
- User jobs: choose or request a drink, confirm execution, monitor robot progress, understand a stopped/resumed run.
- Key contexts of use: local robot station, ROS launch-driven demo, touchscreen or browser view near the robot.

## Information architecture
- Primary navigation: single voice order screen with adjacent menu/status panel.
- Core routes/screens: voice conversation, selected drink preview, robot process stage, catalog list.
- Content hierarchy: current order and confirmation first, finished drink preview second, vision feed and robot process status nearby, recipe catalog below.

## Design principles
- Principle 1: show operational state directly instead of explaining the system.
- Principle 2: make the drink choice visual and scannable without hiding execution readiness.
- Tradeoffs: favor compact, reliable status over decorative immersion; prefer symbolic recipe/color data over robot-coordinate exposure.

## Visual language
- Color: ingredient colors map consistently to red/juice, yellow/syrup, green/liqueur, blue/rum.
- Typography: readable dashboard sizing; compact headings inside panels.
- Spacing/layout rhythm: two-column desktop layout with stacked mobile flow.
- Shape/radius/elevation: restrained panels and item cards; avoid nested card-on-card layouts.
- Motion: small process animations for robot stage changes; keep motion nonessential and readable.
- Imagery/iconography: HTML/SVG drink preview and CSS robot scene are acceptable when real finished-drink photos are unavailable.

## Components
- Existing components to reuse: voice orb, dialogue bubbles, status grid, recipe glass SVG, ingredient chips, pipeline step list.
- New/changed components: catalog item buttons, drink stat block, robot process scene, resume-aware pipeline stage, live vision camera panel.
- Variants and states: idle, recommended, confirmed, making, completed, failed, dry-run, resume recovery, Realsense live, cup upright/lying, lid detection, hand detection.
- Token/component ownership: `src/azas_voice/web/voice.css` owns current web styling; recipe data comes from `src/azas_voice/config/recipes.yaml`.

## Accessibility
- Target standard: practical WCAG AA for text contrast and keyboard/touch operation where possible.
- Keyboard/focus behavior: catalog entries and test form controls must remain button/input elements with visible focus.
- Contrast/readability: status text and badges must remain readable over panel backgrounds.
- Screen-reader semantics: use section labels and meaningful button labels for menu order actions.
- Reduced motion and sensory considerations: animations should be decorative and not required for understanding status.

## Responsive behavior
- Supported breakpoints/devices: desktop browser near robot, tablet/touch display, narrow mobile fallback.
- Layout adaptations: voice and menu panels stack on narrow screens; catalog remains scrollable.
- Touch/hover differences: catalog buttons must be usable without hover-only affordances.

## Interaction states
- Loading: retain previous state until fresh `/api/state` arrives.
- Empty: show no selected recipe and invite a voice/test utterance.
- Error: show pipeline/status failure and last known stage when available.
- Success: show completed badge and final drink preview.
- Disabled: hardware execution may remain dry-run from launch parameters.
- Offline/slow network, if applicable: periodic refresh should keep the last known UI state visible.
- Camera transitions: cup upright/lying view remains visible for 2 seconds after classification leaves the active stage; lid detection view stops when the pipeline enters shake; hand detection view appears during the handover stage.

## Content voice
- Tone: concise Korean service copy.
- Terminology: use menu, 레시피, 제조, 디스펜서, 컵 픽업, 재개 consistently.
- Microcopy rules: do not expose internal implementation detail unless it helps operator recovery.

## Implementation constraints
- Framework/styling system: static HTML/CSS/JavaScript served by `voice_screen_node.py`.
- Design-token constraints: no central token system yet; keep colors local and ingredient-specific.
- Performance constraints: catalog rendering should avoid repeated full DOM rebuilds unless catalog data changes.
- Compatibility constraints: ROS nodes publish JSON status and ROS image topics; browser UI polls `/api/state` and fetches cache-busted JPEG camera frames from `voice_screen_node.py`.
- Test/screenshot expectations: run parser/mapper tests for recipe changes and smoke browser/server behavior when launch environment is available.

## Open questions
- [ ] Whether production demos should include real generated drink images per recipe or keep the current deterministic SVG/HTML preview.
- [ ] Whether interrupted pipeline recovery should also surface the checkpoint JSON contents in the operator panel.
18 changes: 18 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,24 @@ git pull origin develop
bash tools/setup/bootstrap_local_workspace.sh
```

다른 팀원 PC를 같은 상태로 맞출 때는 branch/build/package 검증까지 포함한 아래 스크립트를 사용합니다.

```bash
bash tools/setup/bootstrap_team_pc.sh
```

YOLO 모델은 각 PC에서 repo-local 경로로 연결합니다. `best.pt` 파일 자체는 Git에 커밋하지 않습니다.

```bash
bash tools/setup/link_yolo_model.sh /path/to/best.pt
```

RealSense가 패널에서 안 뜨는 PC는 먼저 아래 비-모션 체크로 카메라 패키지, USB 인식, ROS 토픽을 확인합니다.

```bash
bash tools/checks/check_realsense_camera_ready.sh
```

패널 실행:

```bash
Expand Down
Loading
Loading