[OBD Acquisition & Kinematics] 실시간 차량 센서 수집 및 주행 궤적 시각화 파이프라인 구축
• 2 min read
현장 데이터 유실을 방지하기 위해 차량 진단 포트(OBD-II) 기반 고속 데이터 수집과 실시간 주행 궤적 연산 파이프라인을 Python 환경에서 구현했다.
[Python / Persistence] 센서 데이터 고속 수집 및 로컬 영속성 계층 구현
- CAN 버스 인터페이스로 인입되는 원시 비트 스트림을 물리적 지표(속도, 조향각, 가속도 Vx/Vy, 브레이크 신호 등)로 자동 변환하는 파싱 모듈을 구현했다.
- 초당 수백 건 이상 유입되는 센서 스트림 데이터를 로컬 SQLite에 적재하기 위해 데이터베이스 디스크 동기화 수준을 변경하고 커넥션 단위 배치 삽입을 수행하도록 영속성 계층을 개선했다.
[Python / Kinematics] 하버사인 기반 동역학 연산 및 주행 궤적 추정
- 수집한 차량 속도와 요 레이트 변화량을 기준으로 주행 시작 지점을 상대 좌표(0, 0)로 설정해, 차량의 실시간 이동 궤적을 추적하는 kinematics 엔진을 구축했다.
- 주행 궤적 산출 시 센서 노이즈 누적을 해결하기 위해 정차 상태 가속도와 회전율 데이터로 바이어스를 동적 갱신했으며, 가속 및 회전 유형 판단 중 일시적 신호 튐 현상을 방지하는 폴링 엣지 기반 상태 래치 알고리즘을 적용했다.
수집 차량 센서 데이터 무결성을 현장에서 검증할 수 있도록 외부 네트워크 연결 없이 독립 구동되는 로컬 시각화 인프라를 구축했다.
[Grafana / SQLite] 시계열 데이터 시각화 컨테이너 배포
- Grafana 컨테이너 이미지에 내부 로컬 SQLite 파일을 데이터소스로 연동하는 플러그인 구조를 적용해, 시계열 데이터와 Geomap 패널 기반 궤적 데이터를 시각화했다.
- 컨테이너 볼륨 마운트 정책을 구성해 데이터베이스 파일 쓰기 작업과 읽기 작업이 분리 수행되도록 적용했다.
수집 차량 센서 종류가 늘어남에 따라 단일 메시지 처리 구조를 확장하고, 병렬 수집 환경 내 타임스탬프 충돌 문제를 해결하기 위해 코드를 변경했다.
[Python / Event Loop] 메시지 라우팅 아키텍처 기반 다중 프로토콜 지원
- 단일 수집 식별자에 종속되던 메시지 처리 루틴을 라우팅 패턴으로 변경해, 이기종 센서 데이터들을 개별 핸들러로 분배하도록 아키텍처를 개선했다.
- 통신 효율을 낮추는 불필요한 세션 유지 로직을 제거하고, 상태 의존성이 없는 요청-응답 구조로 파이프라인을 변경했다.
[SQLite / Persistence] 병렬 데이터 삽입 충돌 완화 및 고유 식별 체계 개편
- 복수 센서 데이터가 동일 타임스탬프에 수집될 때 발생하는 고유 키 제약 조건 충돌을 해결하기 위해 데이터베이스 식별 체계를 시간 기반에서 Auto-increment 방식으로 변경했다.
- 동시성 처리 환경 내 수집 타이밍 중첩 시 내부 마이크로초 미세 보정 로직을 거쳐 데이터 순서를 보장하도록 이벤트 루프를 개선해 기록 누락을 해결했다.