SCS0009 데스크톱 제어 프로그램(GUI와 CLI)
이 페이지는 SCS0009 시리얼 버스 버전의 데스크톱 제어 튜토리얼입니다. 웹 제어는 SCS0009 웹 제어, 하드웨어 배선은 SCS0009 배선을 참고하세요.
빠른 시작
- Python 3.10+와 의존성 설치: 설치.
- 버스 드라이버 보드를 연결하고 시리얼 포트 확인: 환경 요구 사항.
- GUI 실행:
amazing-hand-gui또는python amazing_hand_gui.py. - 캘리브레이션에 따라 왼손/오른손, 각도, 중간 위치를 점검.
- 손가락별 슬라이더, 프리셋 포즈, 시퀀스로 동작.
AmazingHand Python 제어 도구(왼손과 오른손 지원)
Python으로 작성된 GUI와 명령줄 도구로, 시리얼 버스 서보 드라이버 보드를 통해 Feetech SCS0009 서보 8개를 제어하여 Pollen Robotics의 AmazingHand 로봇 손을 구동합니다.
왼손과 오른손을 모두 지원합니다. 시작 시 오른손(서보 ID 1-8) 또는 왼손(서보 ID 11-18)을 선택하며,
--hand로 질문을 건너뛸 수 있습니다. 포즈 라이브러리는 왼손/오른손이 공유하고, 각 손은data/config.yaml에서 서보 매핑, 장착 오프셋, 원시값 목표를 각각 유지합니다. 자세한 내용은 왼손/오른손 선택을 참고하세요.

프로젝트 구조
amazing_hand_gui.py – GUI 메인 프로그램
amazing_hand_cmd.py – 명령줄 도구
hand_logic.py – 공용 비즈니스 로직(UI 비의존)
pyproject.toml – 패키지 메타데이터, 의존성, pytest 설정
data/
config.yaml – 애플리케이션 설정(시리얼, 제한, 원시값 목표)
hand_config.yaml – 저장된 포즈와 시퀀스
docs/
REQUIREMENTS.md – 요구 사항과 인수 기준
CONFIG_FORMAT.md – 설정 파일 형식 설명
scs_servo_protocol.md – SCS0009 레지스터 참고
CHANGES.md – 원본 대비 변경 사항과 이유
user_manual.md – 중앙 튜토리얼로 이전된 리디렉션 페이지
tests/
test_hand_logic.py – hand_logic 단위 테스트(155개)
test_gui_utils.py – GUI 유틸리티 함수 단위 테스트(51개)
test_cmd.py – CLI 단위 테스트(42개)
test_integration.py – 통합 테스트(14개)
test_system.py – 서브프로세스 시스템 테스트(22개)
test_system_hardware.py – 하드웨어 테스트(33개, --hardware 필요)
test_cmd_hardware.py – CLI 하드웨어 테스트(21개, --hardware 필요)환경 요구 사항
- Python 3.10 이상(GUI는 Tkinter 포함 필요)
- 서보 8개용 독립 5V 외부 전원
- 드라이버가 설치된 USB 시리얼 버스 어댑터
설치
pip 설치 권장(pyproject.toml 읽음):
pip install -e .또는 의존성 직접 설치:
pip install -r requirements.txt개발 및 테스트 환경:
pip install -r requirements-dev.txt캘리브레이션
서보의 각도 체계, 포즈 프리셋, 중간 위치는 구체적인 로봇 손에 따라 달라집니다. 이 파라미터는 모두 data/config.yaml에 모여 있습니다.
왼손/오른손 선택
두 손은 사용하는 서보와 기계 구조가 달라 UI가 뜨기 전에 먼저 선택합니다:
AmazingHand — which hand?
1 = right hand (servo IDs 1-8)
2 = left hand (servo IDs 11-18)
Enter 1 or 2 [1]:
LEFT hand — servo IDs 11-18
Ring (11, 12) Middle (13, 14) Pointer (15, 16) Thumb (17, 18)
middle position raw: [571, 451, 571, 451, 571, 451, 571, 451]질문 건너뛰기:
python amazing_hand_gui.py --hand left
python amazing_hand_cmd.py --pose victory --hand left--hand를 지정하지 않으면 data/config.yaml의 hand: 값을 사용합니다.
왜 한 손이 단순히 ID 그룹을 바꾸는 것이 아닌가. 서보 번호(오른손 1-8, 왼손 11-18, 왼손은 손가락 번호가 미러링되어 약지가 먼저) 외에도 왼손에는 기계적 차이 두 가지가 더 있으며, 프로그램이 모두 자동으로 처리합니다:
| 오른손 | 왼손 | |
|---|---|---|
| 서보 ID | 1-8 | 11-18 |
| 손가락 → ID | 검지 1,2 / 중지 3,4 / 약지 5,6 / 엄지 7,8 | 약지 11,12 / 중지 13,14 / 검지 15,16 / 엄지 17,18 |
| 제조사 MiddlePos | [451, 571, …] | [571, 451, …] |
| 장착 오프셋 | 0° | −35.16°(hands.left.angle_offset) |
| 같은 손가락 두 서보 | (a, b) | (b, a)(hands.left.mirror_pose) |
위 두 항목 중 하나라도 빠지면 제스처가 틀어집니다: 장착 오프셋이 빠지면 손가락마다 35°씩 어긋나고, 같은 손가락 두 서보 교환이 빠지면 펼침 방향이 완전히 반대로 됩니다(V자 제스처에서 두 손가락이 모이고, 모여야 할 세 손가락이 오히려 벌어짐).
data/hand_config.yaml은 왼손/오른손이 공유하며 항상 오른손 순서로 저장되고, 왼손은 읽을 때 변환하고 저장할 때 되돌립니다.
새 손을 캘리브레이션합니다. hands.left의 값을 템플릿으로 삼은 뒤 다음 순서로 검증하세요:
- Middle position을 눌러 Current (0-1023) 행에서 예상 원시값이 읽히는지 확인
- Open All / Close All — 스트로크가 기계적 제한까지 가고 걸리지 않아야 함
- 펼침 제스처 시도(victory는 V자, greeting은 세 손가락 모음)
어느 항목이 잘못되었으면 어떤 파라미터를 조정할까요:
| 현상 | 수정할 곳 |
|---|---|
| Middle position 판독값이 잘못됨 | hands.<이름>.raw_positions.middle |
| 펼침 방향이 반대 | hands.<이름>.mirror_pose |
| 스트로크가 부족하거나 과함 | hands.<이름>.raw_positions.open / close |
각도 체계
GUI와 CLI 모두 각도 값을 사용하며, rustypot 드라이버가 서보 내부 원시값으로 변환합니다:
raw = 1024 × angle / 300° + 511 (0.29297°/step, 원시값 범위 0–1023)| 각도 | 의미 |
|---|---|
| −35° | 완전 펼침(신전) |
| 0° | 중간 위치, 손가락이 자연스럽게 약간 굽음 |
| +75° | 완전히 쥠(주먹) |
손가락마다 두 서보는 나란히, 축 중심이 일직선입니다: 같은 방향 회전은 벌림, 반대 방향 회전은 굴곡/신전을 만듭니다. 짝수 ID 서보는 홀수 ID 대비 부호가 반전되므로 같은 개폐 값으로 두 서보가 반대 방향으로 움직입니다; 이는 프로그램이 자동 처리하므로 직접 변환할 필요가 없습니다.
제한
limits:
servo_min: -75 # 모든 서보 명령의 절대 스트로크 상하한
servo_max: 75
base_min: -75 # 개폐 슬라이더 범위
base_max: 75
side_min: -35 # 좌우 슬라이더 범위
side_max: 35side_min/side_max는 좌우 벌림을 제어합니다. 프로그램이 정규화(u = |side_offset| / |side_min|)하므로 이 범위만 바꿔도 실제 벌림 폭은 변하지 않고 슬라이더 눈금만 압축됩니다. 손가락 벌림 각도를 실제로 바꾸려면 auto_extremes도 함께 수정해야 합니다.
원시값 목표
전역 위치 버튼 세 개는 각도 모델을 거치지 않고 서보를 정확한 원시값으로 구동합니다:
raw_positions: # 인덱스 0 -> 서보 ID 1 …… 인덱스 7 -> 서보 ID 8
open: [260, 760, 260, 760, 260, 760, 260, 760]
close: [760, 260, 760, 260, 760, 260, 760, 260]
middle: [451, 571, 451, 571, 451, 571, 451, 571]- open / close — 기계 스트로크 양 끝. 제조사의 Feetech 디버깅 도구로 서보를 개별 구동해 측정합니다.
- middle — 캘리브레이션된 기계 중간 위치(즉 제조사 Arduino 데모 프로그램의 MiddlePos). open과 close의 중점이 아니라 raw 511에서 약 ±60 raw(±17.6°) 벗어난 값입니다.
이는 손마다 개별 캘리브레이션 값입니다. 제조사 원문은 *"replace values by your calibration results"*입니다.
검증 방법: Servo Feedback 패널에 Current (0-1023) 행이 있어 원시 위치를 실시간 표시합니다. Middle position 버튼을 누르면 이 행이 451, 571, 451, 571, …로 읽혀야 합니다.
컨트롤 범위 치트시트
| 컨트롤 | 범위 |
|---|---|
| 개폐 슬라이더(세로) | −75 … +75 |
| 좌우 슬라이더(가로) | −35 … +35 |
| 속도 | 1(느림) … 6(빠름) |
속도 값은 드라이버가 rad/s로 서보에 전달하므로 1–6은 대략 57–344 °/s에 대응합니다. 부하가 걸리면 실제 속도는 이 값의 약 **70%**이므로 시퀀스 지연을 정할 때 이를 계산에 넣어야 합니다.
GUI 실행(amazing_hand_gui.py)

화면은 네 영역으로 나뉩니다:
- 왼쪽 열: 네 손가락의 손가락별 제어 패널, 개폐/벌림 슬라이더, Auto/Raw 모드, 속도, Open/Close/Center 포함.
- 가운데 열: 전역 제어 버튼(Open All / Close All / Center All / Middle position)과 포즈 관리.
- 오른쪽 열: 텔레메트리 곡선과 Servo Feedback 피드백 표(위치, 부하, 온도, 전압).
- 하단: 실행 로그와 상태 표시줄, 연결 상태, 동작 진행률과 오류 메시지 표시.
pip 설치 후 바로 호출할 수 있습니다:
amazing-hand-gui
amazing-hand-gui --port /dev/ttyUSB0또는 직접 실행:
python amazing_hand_gui.py
python amazing_hand_gui.py --port /dev/ttyUSB0포트 드롭다운에는 이 컴퓨터에 실제로 존재하는 시리얼 포트가 나열됩니다(pyserial 우선, 없으면 Windows 레지스트리 읽음). 따라서 번호가 뒤인 어댑터도 표시됩니다. 드롭다운에 포트 번호를 직접 입력할 수도 있습니다. 설정의 기본 포트가 연결되어 있지 않으면 GUI가 첫 번째 실제 포트에서 자동 시작됩니다; 포트를 고정하려면 --port를 명시하세요.
기능

손가락별 슬라이더로 개폐와 좌우를 제어하며, Auto(개폐 + 좌우)와 Raw(두 서보 각도 직접 제어) 두 모드 지원
Auto 모드의 두 슬라이더는 제어축이며 프로그램이 자동으로 차동 합성합니다; Raw 모드에서만 두 서보 각도를 직접 지정합니다. 손가락마다 두 서보는 나란히, 축 중심이 일직선입니다: 같은 방향 회전은 벌림, 반대 방향 회전은 굴곡/신전.
손가락별 Open / Close / Center 바로가기 버튼
손가락별 속도 선택(1–6), 별도의 전역 속도 동기화 드롭다운
정밀 미세 조정을 위한 키보드 단축키
전역 위치 버튼: Open All, Close All, Center All, Middle position
data/hand_config.yaml 기반 포즈와 시퀀스 관리
저장된 포즈를 화면에서 직접 삭제 가능(🗑 Delete 버튼)
실시간 서보 텔레메트리 곡선(위치, 부하, 온도, 전압)
Servo Feedback 표, 실시간 원시 위치(0–1023) 포함, 캘리브레이션 검증에 사용 가능
키보드 조작
- 1-4: 손가락 선택(Ring 약지, Middle 중지, Pointer 검지, Thumb 엄지)
- 방향키: 선택한 손가락 이동
- 위/아래: 쥐기 / 펼치기
- 왼쪽/오른쪽: 좌우 이동
- 보조키:
- 없음: 1°씩(정밀)
- Shift: 5°씩(일반)
- Ctrl: 10°씩(빠름)
- 바로가기 동작:
- Q: 선택한 손가락 완전히 쥐기
- E: 선택한 손가락 완전히 펼치기
- C: 좌우 위치 중앙 정렬
전역 버튼
| 버튼 | 개폐 | 좌우 |
|---|---|---|
| ✋ Open All | 모든 손가락을 원시값 open으로 | 중앙 정렬 |
| ✊ Close All | 모든 손가락을 원시값 close로 | 중앙 정렬 |
| ⊙ Center All | 변경 없음 | 중앙 정렬 |
| ⊙ Middle position | 모든 손가락을 원시값 middle로 | 중앙 정렬 |
Global Speed 드롭다운(1–6)은 선택한 속도를 모든 손가락 컨트롤에 즉시 적용하고 각 손가락 슬라이더 표시도 동기화합니다.
세 원시값 버튼(Open All, Close All, Middle position)은 각도 모델을 우회하므로 실행 후 슬라이더에는 정확한 값이 아니라 가장 가까운 표현 가능한 값이 표시됩니다. 이후 슬라이더를 다시 만지면 손이 원시 목표에서 최대 약 0.3° 벗어납니다 — 이는 캘리브레이션 위치를 정확히 맞추기 위한 의도적 절충입니다.
알려진 문제: Center All은 Raw 모드에 있는 손가락을 건너뛰지 않으며, 직접 설정한 원시 각도를 덮어씁니다. 손가락별 ⊙ Center 버튼은 그렇지 않습니다.
CLI 실행(amazing_hand_cmd.py)
독립 명령줄 도구로, GUI를 시작하지 않고 포즈를 적용하고 시퀀스를 재생할 수 있습니다. GUI와 같은 data/hand_config.yaml을 읽고 저장된 포즈 값을 그대로 전송하며, GUI가 보내는 값과 완전히 동일합니다.
Linux: 시리얼 권한
USB 시리얼 어댑터는 보통 /dev/ttyACM0(Waveshare / CDC-ACM) 또는 /dev/ttyUSB0(FTDI / CH340)로 나타납니다.
확인 방법:
ls /dev/ttyACM* /dev/ttyUSB* 2>/dev/null
# 또는
dmesg | grep -E 'ttyACM|ttyUSB' | tail -5Permission denied가 나오면 현재 사용자를 dialout 그룹에 추가한 뒤 다시 로그인하세요:
sudo usermod -aG dialout $USERpip 설치 후
amazing-hand-cmd --list
amazing-hand-cmd --pose open
amazing-hand-cmd --sequence demo --loop
amazing-hand-cmd --pose open --speed 6
# 필요 시 시리얼 포트 덮어쓰기:
amazing-hand-cmd --pose open --port /dev/ttyUSB0직접 실행
python amazing_hand_cmd.py --list
python amazing_hand_cmd.py --pose open
python amazing_hand_cmd.py --pose close --speed 6
python amazing_hand_cmd.py --sequence demo
python amazing_hand_cmd.py --sequence wave --loop
python amazing_hand_cmd.py --port /dev/ttyUSB0 --pose open
python amazing_hand_cmd.py --list --config /path/to/hand_config.yaml파라미터
| 파라미터 | 기본값 | 설명 |
|---|---|---|
| --pose NAME | – | 지정한 이름의 포즈 적용 |
| --sequence NAME | – | 지정한 이름의 시퀀스 재생 |
| --list | – | 모든 포즈와 시퀀스 나열 |
| --loop | 끔 | Ctrl+C까지 시퀀스 반복 재생 |
| --speed N | 3 | 서보 속도 1(느림)… 6(빠름) |
| --port PORT | Linux /dev/ttyACM0 Windows COM9 | 시리얼 포트 번호 |
| --baudrate N | 1000000 | 보드레이트 |
| --config PATH | data/hand_config.yaml | 다른 설정 파일 지정 |
| --hand | config.yaml의 hand | 사용할 손 지정(오른손 1-8, 왼손 11-18) |
스크립트 종료 시(Ctrl+C 포함) 모든 서보의 토크가 자동으로 해제됩니다.
CLI에는 data/config.yaml에 대응하는
--config파라미터가 없으며, 이 파일은 항상 프로젝트 디렉터리에서 로드됩니다.
설정 파일
data/config.yaml
| 섹션 | 용도 |
|---|---|
| serial | 플랫폼별 기본 시리얼 포트, 보드레이트, 선택 가능한 보드레이트 목록 |
| servos | 손가락마다 대응하는 서보 ID |
| limits | 서보와 두 슬라이더의 각도 범위 |
| speeds | 1–6 속도 스케일의 기본값/최소/최대 |
| auto_extremes | 좌우 슬라이더가 극한일 때의 서보 위치 |
| raw_positions | 전역 위치 버튼의 정확한 원시값 목표 |
| paths | 포즈/시퀀스 파일 위치 |
서보와 손가락의 대응 관계
| 손가락 | 서보 ID | 포즈 배열 인덱스 |
|---|---|---|
| Pointer 검지 | 1, 2 | 4, 5 |
| Middle 중지 | 3, 4 | 2, 3 |
| Ring 약지 | 5, 6 | 0, 1 |
| Thumb 엄지 | 7, 8 | 6, 7 |
포즈 배열 순서는 약지, 중지, 검지, 엄지이며 서보 ID 순서가 아닙니다. hand_config.yaml을 직접 편집할 때 가장 틀리기 쉬운 부분입니다.
amazing_hand_cmd.py 상단 주석에는 "index 0→servo1 … 7→servo8"이라고 적혀 있지만 그 주석은 잘못되었으며, 위 표가 코드의 실제 동작입니다.
포즈와 시퀀스

모든 포즈와 시퀀스는 data/hand_config.yaml에 저장됩니다. 파일이 없으면 GUI가 자동으로 생성합니다.
포즈 저장
- 슬라이더나 키보드로 손을 목표 포즈에 맞춥니다
- "Name:" 입력란에 이름을 입력합니다
- Pose Management 영역의 "➕ Add New"를 클릭합니다
속도는 슬라이더 이동 속도에만 영향을 주며, 저장되는 포즈는 서보 위치 8개만 기록합니다.
포즈 불러오기 / 삭제
- 드롭다운에서 선택한 뒤 ✓ Apply를 클릭하면 손이 해당 포즈로 이동합니다
- Apply 오른쪽의 🗑 Delete를 클릭하고 확인하면 영구 삭제됩니다
시퀀스 관리
- Sequence Player에서 "🔧 Manage"를 클릭해 시퀀스 관리자를 엽니다
- Saved Sequences(왼쪽 열)
- 기존 시퀀스 보기, 실행, 편집, 삭제
- 더블 클릭 또는 "▶ Execute" 클릭으로 한 번 실행
- Sequence Builder(오른쪽 열)
- "Available Poses"의 포즈를 더블 클릭하면 한 단계로 추가됩니다
- 단계마다 서보 8개의 속도와 지연을 개별 설정할 수 있으며, 단계는 "pose:s1,s2,...,s8|delay" 형식으로 저장됩니다
- ↑/↓로 순서를 바꾸거나 "⏱ Delay" 버튼으로 독립 일시정지를 삽입합니다
- 이름을 입력한 뒤 "💾 Save Sequence"를 클릭해 저장하고, "▶ Execute"로 저장 없이 먼저 시험 실행할 수 있습니다
- 메인 창으로 돌아와 연속 재생이 필요하면 Sequence Player의 Loop를 체크합니다

단계 형식
pose_name:speed1,speed2,...,speed8|delay- speed1..speed8 — 포즈 순서대로 배열한 서보 속도 8개(1–6)
- delay — 다음 단계까지의 대기 시간, 예: 0.6s. 생략 가능; 생략하면 GUI가 고정 자동 대기로 돌아갑니다
- 독립 일시정지는 SLEEP:1.0s로 작성합니다(쉼표로 구분한 속도 목록 없음)
지연 선택. 드라이버 자체는 서보가 멈췄는지 읽을 수 있지만, 시퀀스 재생은 고정 지연을 사용합니다. 대략 스트로크 각도 / (속도 × 57.3 × 0.7)초로 추정하고 여유를 두세요 — 부하가 걸린 손에서는 약 130°를 넘는 동작이 속도 3에서 1.0초 이상 필요합니다.
YAML 형식 예시
poses:
open:
positions: [-35, -35, -35, -35, -35, -35, -35, -35]
close:
positions: [75, 75, 75, 75, 75, 75, 75, 75]
ring_close: # 약지 쥐기, 나머지 펼침
positions: [75, 75, -35, -35, -35, -35, -35, -35]
sequences:
demo:
steps:
- "open:3,3,3,3,3,3,3,3|2.0s"
- "close:6,6,6,6,6,6,6,6|2.0s"
- "ok:3,3,3,3,3,3,3,3|1.0s"
- "victory:3,3,3,3,3,3,3,3|1.0s"
- "greeting:3,3,3,3,3,3,3,3|1.5s"
- "close:6,6,6,6,6,6,6,6|2.0s"
wave:
steps:
- "open:6,6,6,6,6,6,6,6|0.8s"
- "wave_r:5,5,5,5,5,5,5,5|0.6s"
- "wave_l:5,5,5,5,5,5,5,5|0.6s"
- "open:5,5,5,5,5,5,5,5|0.8s"
finger_roll:
steps:
- "open:6,6,6,6,6,6,6,6|0.5s"
- "ring_close:5,5,5,5,5,5,5,5|0.6s"
- "open:5,5,5,5,5,5,5,5|0.5s"
- "middle_close:5,5,5,5,5,5,5,5|0.6s"
- "open:5,5,5,5,5,5,5,5|0.5s"반복 재생은 런타임(GUI 체크박스)에서 제어하며 YAML에 더 이상 기록되지 않습니다.
테스트
프로젝트에는 단위/통합/시스템 테스트 284개와 하드웨어 테스트 54개가 포함되어 있습니다.
전체 테스트 실행(하드웨어 불필요)
pytestGUI + CLI 하드웨어 테스트 실행(서보 연결 필요)
pytest tests/test_system_hardware.py --hardware --port /dev/ttyACM0
pytest tests/test_cmd_hardware.py --hardware --port /dev/ttyACM0
# 또는 둘 다:
pytest tests/test_system_hardware.py tests/test_cmd_hardware.py --hardwaretest_system_hardware.py는 연결, 포즈 적용, 텔레메트리 읽기, 손가락별 개폐/흔들기, 속도 제어, 시퀀스 실행과 운동 감지를 검증합니다.
test_cmd_hardware.py는 CLI 계층을 엔드투엔드로 검증합니다: 포즈 위치, 속도 파라미터, 시퀀스 단계, wait_for_motion, --list 출력, 종료 시 토크 해제.
전체 인수 기준은 인수 요구 사항과 테스트를 참고하세요.
주의: 비하드웨어 테스트는 hand_logic.py의 폴백 기본값을 검증하며, 그 기본값은 여전히 원본의 −40…110 스케일입니다. 런타임에 data/config.yaml이 이를 덮어쓰므로 캘리브레이션과 무관하게 테스트가 통과합니다 — 즉 테스트가 현재 캘리브레이션 파라미터를 검증하지는 않습니다.
서보 ID 설정
Feetech 공식 소프트웨어와 시리얼 버스 드라이버로 서보 ID를 설정하는 튜토리얼: https://www.robot-maker.com/forum/tutorials/article/168-brancher-et-controler-le-servomoteur-feetech-sts3032-360/
Feetech 소프트웨어 다운로드: https://github.com/Robot-Maker-SAS/FeetechServo
텔레메트리와 피드백
- 지표 선택: 위치, 부하, 속도, 온도, 전압, 이동 플래그.
- 차트 모드: Multi-Servo(다중 서보 곡선)와 Scope(단일 채널 오실로스코프).
- 확대/이동: Y Zoom / Pan, Time Zoom / Pan.
- 피드백 표: Goal, Position, Speed, Load, Voltage, Temperature, Status, Moving.


시퀀스 편집기
- Sequence Player에서 Manage를 클릭합니다.
- Available Poses로 단계를 추가하고, 손가락별 속도, 단계 지연을 조정하거나 슬립을 삽입합니다.
- ↑/↓로 순서를 조정하고 이름을 입력해 저장합니다; Execute로 먼저 시험 실행할 수도 있습니다.
- 메인 창으로 돌아와 시퀀스를 선택하고 Play; Loop를 켜면 연속 재생합니다.
시퀀스 정의는 data/hand_config.yaml의 sequences 키 아래에 있습니다.
문제 해결
| 현상 | 권장 사항 |
|---|---|
| 시리얼 포트가 나열되지 않음 | USB 어댑터를 다시 꽂거나, 드라이버를 설치하거나, GUI를 재시작합니다. |
| Connect 버튼이 회색으로 표시됨 | 이미 연결되어 있으므로 먼저 Disconnect를 클릭합니다. |
| 창 크기 조정 시 버벅임 | 불필요한 창을 닫습니다; resize는 디바운스/스로틀 처리됨. |
| 시퀀스가 모든 손가락을 구동하지 않음 | 단계별 속도를 확인하고 각 포즈에 서보 값 8개가 모두 포함되는지 확인합니다. |
| 차단 표시가 계속됨 | 기계적 간섭을 점검합니다; 목표와 실제 위치 차이가 크고 움직임이 없으면 차단이 트리거됩니다. |
관련 개발 문서
감사의 말
원본 프로젝트: Betatester777 하드웨어와 참고 펌웨어: Pollen Robotics

