← 로봇 통신 강의 목록으로
🤖
통신 기초
통신 기초 · 선수: 01강

03. Ethernet TCP/IP

로봇과 비전(상위) 시스템을 LAN 케이블 하나로 연결하고, 로봇이 "촬영해줘"({TRIG})를 보내면 비전이 "여기 좌표"({X,Y,R})로 답하는 흐름을 만듭니다. 실장비 HRSS의 COPEN/CWRITE/CREAD/CCLEAR 명령이 PC 표준 socket 코드와 1:1로 대응됨을 손으로 확인합니다. PC에서 비전 서버를 띄우고, 직접 작성한 로봇 Client 로 실제 송수신·파싱에 성공합니다.

TCP/IPsocketCOPENCWRITECREAD비전
소요 시간
약 1~1.5시간
난이도
📊 초급
선수 조건
🎯 01강
결과물
동일 IP 도메인 조건과 COPEN/CWRITE/CREAD/CCLEAR 흐름, {}·, 패킷 규약을 이해하고 Python socket 클라이언트로 비전 서버와 통신할 수 있습니다.

이 강의에서 배우는 것

  • 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 + 종료 역할).

python
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
bash
# 터미널 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 대응으로 실장비 프로그램의 뼈대를 확보했다

과제

  1. {TRIG2}를 보내 음수 좌표 {-45.10,210.00,-15.0} 를 받아 파싱
  2. 송신 문자열에서 } 를 빼고 보내 멈추는 현상을 재현하고 원인 설명
  3. 로봇 IP 192.168.1.10 일 때 통신 가능한 비전 IP 예를 3개 적기
예제 코드 / 강의 자료

전체 강의 자료와 예제 코드(시뮬레이터·과제·정답 포함)는 GitHub에서 자유롭게 받아볼 수 있습니다.

GitHub에서 보기 ↗