obdasynciokinematicsguirefactoring
[OBD Acquisition & Kinematics] 비동기 통신 도입 및 거동 물리 분석 파이프라인 통합
• 2 min read
동기식 통신에 따른 로컬 UI 병목 현상을 해소하고 수집 속도의 한계를 극복하기 위해 통신 파이프라인에 비동기 I/O를 도입했다. 또한 수집된 OBD 데이터를 바탕으로 차량의 거동을 분석하는 물리 연산 모듈 및 시각화 도구를 통합하여 분석 파이프라인을 고도화했다.
[asyncio / 통신 레이어] 비동기 기반 CAN 통신 파이프라인 구축
메인 스레드 블로킹 문제를 해결하고 I/O 처리량을 개선했다.
- 기존의 동기식(Synchronous) 구조(
송신1 -> 대기 -> 수신1 -> 송신2 -> 대기 -> 수신2)에서는 한 사이클에 약 200ms가 소요되어 수집 속도가 5Hz에 불과했음. asyncio기반의AsyncRequestExecutor및AsyncRunner를 구현하여송신1 & 송신2 -> 먼저 오는 응답부터 처리하는 비동기(Asynchronous) CAN 트래픽 처리 아키텍처(async_comm.py,async_comm_new.py)를 도입함.- 그 결과 1사이클 소요 시간을 60ms로 단축시켜 데이터 수집 속도를 16.6fps 수준으로 대폭 최적화함.
- 40바이트에 달하는 멀티프레임 응답 처리 시 발생하는 물리적인 전송 지연을 감안하여, 흐름 제어(Flow Control) 페이로드 설정을
async_config.json에 추가하고 Polling 주기와 버스 복구 지연을 마이크로초 단위로 최적화하여 패킷 유실률을 최소화함.
[Tkinter / 뷰 컴포넌트] 모놀리식 UI의 컴포넌트 분리
단일 모듈로 존재하던 로컬 GUI를 도메인별 탭 형태로 모듈화했다.
main.py파일 하나에 집중되어 있던 UI 렌더링 코드를 분해하여ui/디렉토리 하위에 통신(comm.py), 데이터 분석(analyze.py), 거동 확인(movement.py), 시각화(visualize.py) 기능별로 격리함.- 컴포넌트를 분리함으로써 유지보수성을 확보하고, OBD 파싱 결과가 로컬 SQLite에 적재됨과 동시에 실시간 모니터링이 가능하도록 내부 구조를 개선함.
[Python / 분석 모듈] 거동 물리 분석 엔진 및 임계치 최적화
속도 및 조향 데이터를 활용해 차량의 주행 상태를 판단하는 로직을 추가했다.
src/movement.py및 관련 설정(movement.yaml)을 추가하여 회전, 조향각, 차선 변경 등 거동 분석을 위한 동적 임계치 판정 구조를 구현함.- 교차로 진입 등 실제 주행 환경에 맞추어 프로파일 기준 거리와 조향 판단 임계치를 동적으로 조정하여 거동 인식률을 튜닝함.
pandas와matplotlib를 통합해 종/횡방향 가속도 및 자이로(Gyro) 데이터 기반의 시각화 파이프라인을 추가함.
[센서 메타데이터 / 로직] 센서 신호 처리 메타데이터 교정
실제 센서 값과의 물리적 오차를 줄이고 정합성을 확보하기 위해 스케일링 계수 및 추정 로직을 보완했다.
- 수집 주기(1초)가 긴 Webhook 기반 RTK 데이터를 이용한 정합성 확인의 한계를 극복하기 위해, OBD에서 추출되는 네 바퀴의 속도 값을 직접 활용하여 횡가속도 및 요 레이트(Yaw Rate) 추정 공식을 유도함.
- 요 레이트는
(우측 바퀴 속도 - 좌측 바퀴 속도) / 윤거로 계산하고, 횡가속도는 산출된 요 레이트에 차량 속도를 곱하여 추정함. 지구 중력에 의한 기울어짐의 영향을 받는 종/횡가속도 센서와 달리 오차가 적은 요 레이트 특성을 이용하여 물리 단위(m/s^2)에 맞게 가속도 센서의 승수(mul), 제수(div), 오프셋(add) 파라미터를 교정함.