전체 수치 중간점검 겸 정리
로봇팔·주차 수치 레퍼런스 (전체)
기준: 2026-06-12 재캘리브레이션 + 펌웨어 RobotArmCase.ino + auto_pick.py + park.py
1. 채널별 기본 정보
| 채널 |
부위 |
모터 |
펄스 min~max(us) |
안전범위(도) |
실사용 home |
| 5 |
그리퍼 |
MG996R |
500~2500 |
0~50 |
0 |
| 7 |
손목회전 |
MG996R |
500~2500 |
40~130 |
130 |
| 9 |
손목굽힘 |
MG996R |
500~2500 |
70~170 |
90 |
| 11 |
팔꿈치 |
FT330M 35kg |
400~2600 |
0~90 |
60 |
| 13 |
어깨 |
FT330M 35kg |
400~2600 |
20~140 |
120 |
| 15 |
베이스 |
FT330M 35kg |
400~2600 |
0~180 |
150 |
CH15: 펌웨어 cal[] home 필드는 90이지만 미사용.
실제 홈/대기는 poseHome()이 BASE_PLACE=150으로 보냄. 다른 5채널은 cal[] home이 실제 사용됨.
2. 각도값 → 물리적 의미 (방향 사전)
| 채널 |
값 |
의미 |
| 5 그리퍼 |
0 / 50 |
열림 / 닫힘 |
| 7 손목회전 |
130 / 40 |
가로(x)잡기 / 세로(y)잡기 |
| 9 손목굽힘 |
170 / 155 / 90 / 70 |
일자 / 집기(6/12) / 놓기숙임 / 최대숙임 |
| 11 팔꿈치 |
0 / 20 / 90 |
일자 / 집기 / 최대굽힘 |
| 13 어깨 |
140 / 120 / 100 / 60 / 20 |
뒤젖힘 / 들기·이동 / 수직 / 놓기 / 집기하강 |
| 15 베이스 |
0 / 90 / 180 / 150 |
왼쪽 / 뒤 / 오른쪽 / 후면(놓기) |
3. 물건별 베이스각(CH15) 변천
| 물건 |
6/9 최초 |
조정시도 |
6/12 확정 |
| L (좌·팔기준) |
47 |
— |
49 |
| C (중앙) |
35 |
— |
37 |
| R (우) |
23 |
18→24→22→23 |
25 |
물건 6.5cm 간격, 좌우대칭 ±12도, 재조립으로 전체 +2도 시프트
4. 펌웨어 자세 명령 → 채널 목표값
| 명령 |
13어깨 |
11팔꿈치 |
9손목 |
7회전 |
15베이스 |
5집게 |
| H 홈 |
120 |
60 |
90 |
130 |
150 |
0 |
| RL/RB/RR 준비 |
90 |
30 |
120 |
· |
0/90/180 |
0 |
| P 내리기 |
30 |
30 |
180 |
· |
· |
0 |
| G 집기 |
· |
· |
· |
· |
· |
50 |
| O 놓기 |
· |
· |
· |
· |
· |
0 |
| L 들기 |
120 |
40 |
120 |
· |
· |
· |
| C 이동 |
120 |
60 |
100 |
· |
150 |
· |
| B 후면놓기 |
30 |
30 |
180 |
· |
150 |
0 |
| BL/BR 좌우놓기 |
60 |
30 |
120 |
· |
0/180 |
0 |
5. auto_pick.py 시퀀스 (동작 × 채널, 6/12 최신)
| 동작 |
5 |
7 |
9 |
11 |
13 |
15 |
대기s |
| 준비:집게열기 |
0 |
· |
· |
· |
· |
· |
1.0 |
| 준비:들기 |
· |
· |
· |
· |
120 |
· |
3.0 |
| 준비:팔꿈치 |
· |
· |
· |
20 |
· |
· |
1.7 |
| 준비:손목 |
· |
· |
155 |
· |
· |
· |
1.7 |
| 준비:손목회전 |
· |
130 |
· |
· |
· |
· |
1.7 |
| 조준 |
· |
· |
· |
· |
· |
L49/C37/R25 |
3.0 |
| 하강 |
· |
· |
· |
· |
20 |
· |
3.0 |
| 집기 |
50 |
· |
· |
· |
· |
· |
1.0 |
| 들기 |
· |
· |
· |
· |
120 |
· |
3.0 |
| 후면회전 |
· |
· |
· |
· |
· |
150 |
3.0 |
| 놓기하강 |
· |
· |
· |
· |
60 |
· |
3.0 |
| 손목숙임 |
· |
· |
90 |
· |
· |
· |
1.7 |
| 놓기 |
0 |
· |
· |
· |
· |
· |
1.0 |
| 손목복귀 |
· |
· |
155 |
· |
· |
· |
1.7 |
| 다시들기 |
· |
· |
· |
· |
120 |
· |
3.0 |
| 홈 |
(H 명령) |
|
|
|
|
|
3.0 |
ALL: 준비 1회 → 물건마다 조준~다시들기 반복(L→C→R) → 마지막 홈
6. 변환식 (각도↔펄스↔거리)
| 변환 |
식 |
| 각도→펄스 |
us = map(angle,0,180, pMin,pMax) |
| 펄스→PCA틱 |
ticks = us×4096×50/1,000,000 (50Hz) |
| 무부하 실측 |
400us=0°, 2600us=180° (FT330M, 중심1500us) |
| 핵심 |
펄스=위치만 결정, 토크는 모터스펙(힘≠펄스) |
7. FK — 자세별 도달거리 (수직평면)
| 어깨/팔꿈치/손목 |
수평(mm) |
높이(어깨기준mm) |
비고 |
| 30/30/180 |
246 |
+33 |
P 뻗기 |
| 30/20/90 |
198 |
-15 |
최대도달 |
| 40/68/113 |
159 |
-35 |
(구 집기) |
| 링크 |
L1=130, L2=65, L3=60 |
|
mm |
| 충돌영역 |
베이스반경 R_BASE=70, 어깨높이 H_SHLDR=40 |
|
|
8. 속도/타이밍
| 항목 |
값 |
| 펌웨어 moveDelay |
25ms/도 기본, SP 17=1.5배 |
| auto_pick WAIT (big/small/grip) |
3.0 / 1.7 / 1.0초 |
| 교훈 |
WAIT < 이동시간이면 펌웨어가 명령 씹음 (R회전 최장~2.5s) |
주차 현황 (미완)
| 버전 |
결과 |
| step&measure (3축) |
2회 성공 (X오차 0.4mm). 가장 잘 된 버전 |
| 연속 비주얼서보 (이후 변경) |
회전이 마커를 시야 밖으로 밀어냄 → 놓침 반복 → 타임아웃. 수정할수록 악화 |
결론: 주차는 미완성. 재개 시 연속서보 버리고 step&measure로 롤백 권장.
안전 결함 — 추락 사고 원인
park.py를 Ctrl+C/kill로 죽여도, 마지막 /cmd_vel 속도가 남아 바퀴 계속 회전
→ 터틀봇 책상에서 추락 → 기둥 파손 (6/10)
대응 필수:
- 테스트는 바닥에서 (책상 위 금지) 또는 바퀴 들고
- 종료 시 반드시
ros2 topic pub --once /cmd_vel ... "{}" 로 정지 확인
- 별도 watchdog: 일정시간 명령 없으면 자동 0속도 (미구현)
- E-stop 물리 버튼 / 터틀봇 전원 즉시 차단 수단 확보
9. 주차 기준점 (park.py, 6/12 실측 — 참고용, 주차 자체는 미완)
| 축 |
목표 |
허용(TOL) |
측정노이즈 |
제어 |
| X (전후, mm) |
-12.0 |
±2.0 |
±0.5 |
전/후진 |
| yaw (방향, 도) |
-2.0 |
±2.0 |
±0.8 |
제자리 회전 |
| Z (횡거리, mm) |
236.0 |
±10.0 |
±0.5 |
평행주차 기동 |
10. 주차 제어 파라미터 (연속서보)
| 항목 |
값 |
비고 |
| 부호 |
DIR=-1 / DIR_YAW=1 / DIR_LAT=1 |
실측 |
| KX/V_MAX/V_MIN |
0.0005 / 0.025 / 0.012 |
전후 P제어 |
| KW/W_MAX/W_MIN |
0.006 / 0.08 / 0.04 |
회전(시야이탈 방지 낮춤) |
| LOST_SEC / EMA_A / STABLE_SEC |
2.0 / 0.5 / 1.5 |
|
| 횡기동 |
틀기35°→전진(오차×0.7/sin35°)→되틀기 |
검증됨 |
| 탐색 |
회전스캔+이동, SCAN_SPEED 0.15 |
돌면서 검출 |
11. 마커·물건 배치
| 항목 |
값 |
| 마커 |
DICT_5X5_100, ID 99, 한변 85mm(검은변) |
| 마커 높이 |
바닥에서 3.8cm |
| 물건 |
중앙=마커 3cm 뒤, 좌우 6.5cm 간격 ×3, 동일크기 |
| 물건 특성 |
스티로폼 고리형(구멍) — 놓을때 걸림 → 손목 숙여 낙하 |
| 인식거리 |
25cm~1.5m (30cm미만 불가: 잘림+초점흐림) |
| 시작위치 권장 |
보드 횡거리 30~60cm, 마커방향 ±30도 |
12. 시스템 경로/포트
| 항목 |
값 |
| 라파이 |
ssh group4@192.168.0.187 |
| 아두이노 |
by-id usb-Arduino__www.arduino.cc__0043_1344B... |
| OpenCR |
by-id usb-ROBOTIS_OpenCR_..._FFFFFFFEFFFF-if00 |
| 카메라 |
camera_ros, camera:=1(imx219), 1640x1232, RGB888 |
| MQTT |
localhost, 토픽 pack/arm/cmd |
| PCA9685 |
I2C 0x40, A4(SDA)/A5(SCL) |
| 전원 |
18650 3S→벅 6.5V→PCA V+ (GND공통) |
13. 모터 교체 이력
| 시점 |
모터 |
이유 |
| 초기 |
SG90 1.8kg |
약함→기어갈림/부러짐 |
| → |
MG996R 10kg |
끝단(손목/그리퍼) |
| → |
FT330M 35kg ×3 |
무거운관절, 25kg클론이 못버팀 |
| 6/12 |
CH9 MG996R 신품 |
낙하 사망 교체 |
14. 그리퍼(CH5) 특이사항
| 항목 |
값 |
| 안전범위 |
0~50 (펌웨어 클램프) |
| 50 = 한계인 이유 |
그 이상 조이면 물건에 막혀 스톨 → 모터 사망 위험(과거 패턴) |
| 더 조이려면 |
펌웨어 safeMax 수정+재업로드 (비추, 접촉면 고무가 안전) |