UWB 개발 키트를 사면 하드웨어는 바로 켜지는데, 그 좌표를 내 프로그램에서 어떻게 받아야 할지 막히는 경우가 많습니다.
특히 SDK가 따로 없는 키트라면 이 연결 지점을 직접 만들어야 합니다.
Q1 같은 개발 키트는 시리얼 포트로 좌표 문자열을 그대로 흘려보냅니다.
Python에서는 시리얼 통신 라이브러리 하나로 이 값을 받아 바로 쓸 수 있습니다.

필요한 준비물
pyserial 라이브러리가 필요합니다. pip install pyserial 한 줄로 설치됩니다.
태그 또는 리스너가 USB로 PC나 Raspberry Pi에 연결되어 있어야 합니다.
연결되면 /dev/ttyUSB0(Linux) 또는 COM3(Windows) 같은 포트 이름으로 인식됩니다.

시리얼 포트 열고 데이터 받기
포트 이름과 통신 속도(baud rate)를 맞춰 연결을 엽니다.
대부분의 UWB 키트는 115200bps를 씁니다.
import serial
ser = serial.Serial('/dev/ttyUSB0', 115200, timeout=1)
while True:
line = ser.readline().decode('utf-8', errors='ignore').strip()
if line:
print(line)이 코드를 실행하면 태그가 보내는 좌표 문자열이 그대로 출력됩니다.
형식은 키트마다 다르지만, 보통 x,y,z 또는 lep 12.34 56.78 같은 형태로 나옵니다.
좌표 문자열을 숫자로 파싱하기
받은 문자열에서 숫자만 뽑아내야 실제로 쓸 수 있습니다.
쉼표나 공백으로 구분된 형식이라면 split으로 간단히 나눌 수 있습니다.
parts = line.split(',')
if len(parts) >= 2:
x = float(parts[0])
y = float(parts[1])
print(f"현재 위치: x={x:.2f}, y={y:.2f}")키트 출력 형식이 lep x y z qf 같은 공간 구분이라면 split(‘ ‘)로 나누고 인덱스를 맞춰 파싱합니다.
노이즈 값 걸러내기
가끔 통신 오류로 깨진 문자열이 들어올 수 있습니다.
float 변환에서 오류가 나면 그 줄은 버리고 다음 줄을 받는 방식으로 처리하는 게 안전합니다.
try:
x = float(parts[0])
y = float(parts[1])
except ValueError:
continueQF(품질지수) 값이 함께 오는 키트라면, QF가 낮은 값은 걸러내고 신뢰도 높은 좌표만 쓰는 방식도 추천합니다.
받은 좌표를 어디에 쓸까
좌표를 받는 것 자체는 시작 단계입니다.
이후에는 이 값을 실시간 지도에 표시하거나, 특정 구역 진입을 감지하는 로직에 연결하거나, 데이터베이스에 기록해 이동 경로를 분석하는 방향으로 확장합니다.
로봇 제어와 연결한다면, 받은 좌표를 목표 경로와 비교해 방향을 조정하는 로직으로 이어집니다.
자주 묻는 질문
시리얼 포트 이름을 모르겠어요.
Linux에서는 ls /dev/tty*, Windows에서는 장치관리자에서 확인할 수 있습니다.
여러 태그의 좌표를 동시에 받을 수 있나요?
가능합니다.
게이트웨이나 리스너 쪽에서 태그별 ID와 좌표를 함께 보내주는 키트를 쓰면 구분해서 처리할 수 있습니다.
Python 대신 다른 언어로도 받을 수 있나요?
가능합니다.
시리얼 통신 라이브러리가 있는 언어라면 동일한 방식으로 구현할 수 있습니다.
→ 사용 중인 키트와 원하는 연동 방식 알려주시면 코드 구성부터 상담해 드립니다.
직접 코드를 짜기 어려운 담당자라면
이 글은 Python으로 직접 데이터를 받아 처리하는 개발자를 기준으로 설명했습니다.
위치추적 시스템 도입을 검토하는 안전관리·운영 담당자라면 이 연동 작업 자체를 맡길 수 있습니다.
GrowSpace는 좌표 수신부터 지도 표시, 구역 진입 감지, 데이터 기록까지 필요한 연동을 직접 구축해 드립니다.



