obdcaniso-tppythonsqlite

[OBD Acquisition & Kinematics] OBD 통신 코어 및 신호 파싱 아키텍처 구축

2 min read

지난달 1월, 차량의 조향 및 페달 데이터를 수집하기 위해 python-can 기반으로 비표준 확장 PID의 브루트포스(Brute-force) 스캔을 시도했으나, 범용 라이브러리의 프로토콜 처리 한계로 인해 수신 응답이 깨지는 현상이 발생했다. 이를 해결하기 위해 Windows 환경의 PCAN-OBDonUDS API로 우회하여 통신 안정성을 확보하는 트러블슈팅을 거쳤다. 또한 기존에 HTTP 스트리밍 서비스로 수신하던 RTK/GNSS 데이터는 공식 문서 제거 및 지원 중단에 따라 Java 기반의 Webhook API 수신 방식으로 마이그레이션하여 로컬 데이터베이스에 적재하도록 인프라를 변경했다. 더불어 영상 분석 과정에서 VBR(가변 비트레이트) 영상의 하드웨어 가속 렌더링 불가로 인한 14시간의 렌더링 소요라는 물리적 한계를 겪기도 했다. 이러한 일련의 제약과 삽질을 거쳐 안정적인 통신 계층의 중요성을 체감한 후, 2월 본격적인 작업 착수에 돌입하여 초기 OBD-II 및 UDS(ISO 14229) 프로토콜 기반의 차량 통신 시스템 설계와 CAN 메시지 파싱 엔진을 새롭게 구축했다. 하드웨어 인터페이스 연동과 비트 단위 데이터 추출의 정합성 확보에 집중했다.

[can-isotp / 하드웨어 인터페이스] CAN/ISOTP 통신 레이어 및 테스트 환경 구축

차량 진단 통신을 위한 하드웨어 인터페이스와 프로토콜 스택을 구현했다.

  • PCAN USB 인터페이스 기반의 CAN 버스 연결 및 can-isotp 프로토콜 스택을 적용하여 멀티프레임 메시지 처리 기반을 마련함.
  • Runner 클래스를 통해 세션 관리, 요청 전송 및 응답 수신 파이프라인을 구현함.
  • 로컬 SQLite 데이터베이스를 연동하여 2026-02-12.db 형태로 날짜별 DB 파일을 생성하고, 각 테스트 세션 명을 테이블명으로 지정하여 로그가 저장되도록 구현함.
  • pytest를 활용해 하드웨어 목업(Mock) 및 프로토콜, 통합 시스템 검증용 테스트 스위트를 구성함.

[bitstring / 파싱 엔진] 비트 단위 커스텀 신호 파싱 아키텍처 설계

각종 차량 센서 데이터를 추출하기 위한 메타데이터 기반 파싱 엔진을 구현했다.

  • signals.json을 통해 진단 메시지(DID)별 비트 인덱스(bix), 길이(len), 바이트 오더(blsb), 변환 계수(mul, div) 등을 정의하는 메타데이터 구조를 도입함.
  • 브레이크 페달 센서의 경우, 수집된 값이 밟지 않았을 때 240(1111 0000), 밟았을 때 241(1111 0001)로 변동되는 패턴을 확인하여 비트 인덱스를 기존 192(8bit)에서 199(1bit Boolean 플래그)로 교정해 온/오프 상태의 정확도를 확보함.
  • bitstring 라이브러리를 활용해 수신된 바이트 배열에서 가변 길이 비트 스트림을 추출 및 형변환하는 로직을 적용함.
  • 파싱 엔진(App 클래스) 초기화 시 발생하던 속성 할당 버그를 수정하여, 파라미터가 인스턴스별로 안전하게 주입되도록 __setattr__ 방식으로 객체 초기화 구조를 변경함.

[Python / 포매팅 모듈] 헥사데시멀(Hex) 데이터 포매팅 안정성 강화

데이터 타입 변환 중 발생하는 예외를 방지하기 위해 포매팅 함수를 개선했다.

  • format_hex 함수 내에서 bytes, int, None 타입 등 다양한 입력값에 대응하도록 타입 검사 로직을 추가함.
  • 응답이 없는 경우를 NO_RESPONSE로 명시하여 로그 분석의 가독성 및 추적 용이성을 확보함.