03. Ethernet TCP/IP
로봇과 비전(상위) 시스템을 LAN 케이블 하나로 연결하고, 로봇이 "촬영해줘"({TRIG})를 보내면 비전이 "여기 좌표"({X,Y,R})로 답하는 흐름을 만듭니다. 실장비 HRSS의 COPEN/CWRITE/CREAD/CCLEAR 명령이 PC 표준 socket 코드와 1:1로 대응됨을 손으로 확인합니다. PC에서 비전 서버를 띄우고, 직접 작성한 로봇 Client 로 실제 송수신·파싱에 성공합니다.
이 강의에서 배우는 것
- 1TCP/IP 성립 조건(동일 IP 도메인, 앞 3옥텟 일치)을 설명하고 IP를 맞춘다
- 2COPEN(ETH)·CWRITE·CREAD·CCLEAR 4개 명령의 송수신 흐름을 작성한다
- 3HRSS 패킷 규약({ } 자동 감쌈, , 구분자)을 이해하고 패킷을 해석한다
- 4PC에서 socket 클라이언트(로봇 Client)로 비전 서버와 실제 통신한다
소개
HRSS 통신은 COPEN/CWRITE/CREAD/CCLEAR 4개 명령으로 끝납니다. COPEN 의 첫 인자가 ETH면 TCP/IP, SER이면 RS-232 — 한 글자 차이로 채널 종류가 완전히 달라집니다. 이번 편은 전부 ETH(TCP/IP)입니다.
핵심 개념
1) 통신 4대 명령
| 명령 | 역할(PC 대응) |
|---|---|
| COPEN(ETH, HANDLE) | 채널 열기 (connect) |
| CWRITE(HANDLE, data) | 송신 (sendall) |
| CREAD(HANDLE, recv) | 수신 (recv) |
| CCLEAR(HANDLE) | 버퍼 클리어 |
2) 동일 IP 도메인 — "같은 동네"여야 통한다
데이터는 같은 IP 네트워크 도메인(앞 3옥텟 일치)에서만 오갑니다. 로봇 192.168.1.10 ↔ 비전 192.168.1.20 은 OK(앞 3옥텟 192.168.1 일치), 192.168.2.20 은 불통. 여러 대면 HUB로 묶고, 카메라는 PoE로 LAN을 통해 전원을 함께 받습니다.
3) 패킷 포맷 — {data}와 콤마
패킷 시작/끝에 중괄호 { }가 자동으로 붙고(TRIG 송신 → 실제 {TRIG}), 값은 콤마 ,로 구분합니다. 테스트 전 네트워크 설정에서 "Show message" 옵션을 체크해야 통신 내용이 대화창에 보입니다. Client=로봇(먼저 접속), Server=비전(포트 열고 대기).
핵심 예제
비전 서버에 {TRIG}를 송신하고 {X,Y,R}을 수신·파싱하는 로봇 Client. with 블록을 벗어나면 소켓이 닫힙니다(CCLEAR + 종료 역할).
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((host, port)) # COPEN(ETH, HANDLE)
s.sendall("{TRIG}".encode()) # CWRITE(HANDLE, "TRIG")
data = s.recv(1024).decode() # CREAD(HANDLE, ...)
x, y, r = data.strip().strip("{}").split(",") # { } 제거 후 , 파싱
print(f"X={x}, Y={y}, 회전각={r}") # X=123.45, Y=67.89, 30.0# 터미널 A: 비전 서버
python ../../_shared/tcp_echo_server.py --mode vision --port 6000
# 터미널 B: 로봇 Client
python src/tcp_vision/main.py # 송신 {TRIG} → 수신 {123.45,67.89,30.0}이 Python 흐름은 실장비 HRSS와 1:1 대응됩니다: connect↔COPEN(ETH), sendall↔CWRITE, recv↔CREAD, with 종료↔CCLEAR. { } 감쌈과 , 구분은 HRSS가 자동 처리합니다.
자주 하는 실수
Q. ConnectionRefusedError 가 납니다.
A. 서버(터미널 A)가 안 떴거나 포트가 다릅니다. 서버를 먼저 띄우고 양쪽 --port 를 6000으로 맞추세요.
Q. 실장비에서 통신 자체가 안 됩니다.
A. IP 앞 3옥텟 불일치가 가장 흔합니다(둘 다 192.168.1.xx 인지 확인). 또 COPEN 첫 인자가 ETH인지(시리얼은 SER) 확인하세요.
Q. 응답이 안 오고 멈추거나 좌표가 0,0,0 으로 옵니다.
A. 패킷 끝 }가 빠졌거나 서버가 모르는 요청을 받은 것입니다. 송신을 { ... }로 감쌌는지, payload 를 정확히 TRIG/TRIG2로 보냈는지 확인하세요.
정리
- TCP/IP 성립 조건(동일 IP 도메인, 앞 3옥텟 일치)과 연결 구조(HUB·PoE)를 이해했다
- COPEN(ETH)/CWRITE/CREAD/CCLEAR 4명령과 { }·, 패킷 규약을 익혔다
- PC 비전 서버에 직접 작성한 로봇 Client 로 송수신·파싱에 성공했다
- PC 코드 ↔ HRSS 코드 1:1 대응으로 실장비 프로그램의 뼈대를 확보했다
과제
- {TRIG2}를 보내 음수 좌표 {-45.10,210.00,-15.0} 를 받아 파싱
- 송신 문자열에서 } 를 빼고 보내 멈추는 현상을 재현하고 원인 설명
- 로봇 IP 192.168.1.10 일 때 통신 가능한 비전 IP 예를 3개 적기