[OBD Acquisition & Kinematics] 실시간 차량 센서 수집 및 주행 궤적 시각화 파이프라인 구축

2 min read

현장의 데이터 유실을 방지하기 위해, 차량 내 진단 포트(OBD-II)를 통한 고속 데이터 수집 및 실시간 주행 궤적 연산 파이프라인을 Python 기반으로 새롭게 설계 및 구현했다.

[Python / Persistence] 센서 데이터 고속 수집 및 로컬 영속성 계층 구현

  • CAN 버스 인터페이스를 통해 인입되는 원시 비트 스트림 데이터를 물리적 지표(속도, 조향각, 가속도 Vx/Vy, 브레이크 신호 등)로 자동 변환하는 파싱 모듈을 구현했다.
  • 초당 수백 건 이상 인입되는 센서 스트림 데이터를 지연 없이 로컬 SQLite에 적재하기 위해, 데이터베이스의 디스크 동기화 수준을 완화하고 커넥션 단위에서 일괄(Batch) 삽입을 수행하도록 영속성 계층을 최적화했다.

[Python / Kinematics] 하버사인 기반 동역학 연산 및 주행 궤적 추정

  • 수집된 차량 속도와 요 레이트(Yaw Rate) 변화량을 기반으로, 주행 시작 지점을 상대 좌표(0, 0)로 설정하여 차량의 실시간 이동 궤적을 누적 추적하는 이동 기구학(Kinematics) 엔진을 구축했다.
  • 주행 궤적 산출 시 센서 노이즈가 누적되는 현상을 상쇄하기 위해 정차 상태의 가속도 및 회전율 데이터를 활용하여 바이어스를 동적으로 갱신했으며, 가속 및 회전 유형 판단 시 일시적인 신호 튐 현상을 방지하는 폴링 엣지 기반 상태 래치(Latching) 알고리즘을 적용하여 추론 정합성을 확보했다.

수집된 차량 센서 데이터의 무결성을 현장에서 즉각 검증하기 위해, 외부 네트워크 연결 없이 독립 구동되는 로컬 시각화 인프라를 구축했다.

[Grafana / SQLite] 시계열 데이터 시각화 컨테이너 배포

  • Grafana 컨테이너 이미지를 기반으로, 내부 로컬 SQLite 파일을 데이터소스로 직접 연동하는 플러그인 구조를 채택하여 시계열 데이터와 Geomap 패널 기반의 궤적 데이터를 실시간으로 표출했다.
  • 컨테이너 볼륨 마운트 정책을 구성하여 데이터베이스 파일의 쓰기 작업(수집 엔진)과 읽기 작업(시각화 대시보드)이 시스템 락(Lock) 충돌 없이 안전하게 분리 수행되도록 마이크로서비스 관점의 접근 방식을 적용했다.

수집할 차량 센서 종류가 늘어남에 따라 단일 메시지 처리 구조를 확장하고, 병렬 수집 환경에서 발생하는 타임스탬프 충돌 문제를 원천적으로 해결하기 위한 구조적 리팩토링을 단행했다.

[Python / Event Loop] 메시지 라우팅 아키텍처 기반 다중 프로토콜 지원

  • 단일 수집 식별자에 묶여 있던 메시지 처리 루틴을 라우팅 패턴으로 리팩토링하여, 차량 내 이기종 센서 데이터들을 각 전담 핸들러로 동적 분배하는 구조로 아키텍처를 확장했다.
  • 통신 효율을 떨어뜨리던 불필요한 세션 유지(Keep-alive) 로직을 완전히 제거하고, 상태 의존성이 없는 순수 요청-응답(Request-Response) 기반으로 통신 파이프라인을 간소화했다.

[SQLite / Persistence] 병렬 데이터 삽입 충돌 완화 및 고유 식별 체계 개편

  • 여러 센서 데이터가 동일한 타임스탬프에 수집될 경우 발생하는 고유 키 제약 조건 충돌 문제를 해결하기 위해, 데이터베이스의 식별 체계를 시간 기반에서 순차 증가(Auto-increment) 방식으로 변경했다.
  • 동시성 처리 환경에서 수집 타이밍이 겹치더라도 내부적인 마이크로초(Microsecond) 미세 보정 로직을 통해 데이터의 순서를 엄격히 보장하도록 이벤트 루프를 보완하여, 기록 누락 현상을 완벽히 차단했다.