README 문장 정리 되돌림

This commit is contained in:
seo committed 2026-08-03 04:11:50 +09:00
1 parent dfd9d737de
commit 18d142d7ec
1 file changed
+134 -48
+134 -48
View File
@@ -1,73 +1,159 @@
# OBD CAN 기반 운전 성향 분석 # OBD CAN 기반 운전 성향 분석 시스템
차량 OBD-II CAN 데이터를 받아 운전 점수를 계산하는 시스템 설계 자료입니다. ## 프로젝트 개요
차량 **OBD-II 기반 CAN 통신**으로 주행 데이터를 수집하고, 운전 행동을 분석하여 **운전 성향(캐릭터)** 및 **주행 점수**를 실시간으로 시각화하는 시스템입니다.
속도(Speed), RPM, 조향각(Steering), 브레이크(Brake) 데이터를 활용해 운전 습관을 평가합니다.
속도, RPM, 조향각, 브레이크 값을 기준으로 급가속, 급제동, 급조향, 저속 지속 같은 상황을 나눕니다. 결과는 TFT 화면에 점수와 상태로 표시하는 구조로 잡았습니다. ---
## 기간 ## 프로젝트 목표
- 차량 OBD CAN 데이터를 **안정적으로 수집/처리**
- 위험 운전 행동과 교통 흐름 방해 행동을 분리하여 **감점 요소 설계**
- 정체 구간에서의 오판을 줄이기 위한 **보호 로직 적용**
- TFT 디스플레이를 통해 **실시간 점수/캐릭터 UI 출력**
- (추가) 세션/로그 기반으로 **주행 기록 누적 및 통계 확장 기반 마련**
- 2026.01.06 ~ 2026.01.19 ---
## 맡은 부분 ## 시스템 구성
- MCP2515 기반 CAN 통신 회로 구성 ### 전체 구조
- Arduino와 TFT, SD, RTC 모듈 연결 1. **차량 OBD-II → CAN 데이터 수신**
- 차량 OBD-II 환경에서 데이터 요청/응답 확인 2. **MCP2515 CAN Controller**로 프레임 수신/송신
- 점수 화면과 기록 구조 설계 3. **Arduino Nano Mini**에서 UDS/ISO-TP 응답 파싱 및 점수 산출
4. **TFT LCD(ILI9341)** 에 속도/조향/브레이크/RPM/점수/캐릭터 출력
## 사용한 것 ---
- `Arduino` ## CAN/UDS 통신 방식(요청-응답)
- `C/C++`
- `MCP2515`
- `CAN`
- `UDS`
- `OBD-II`
- `Adafruit_ILI9341`
- `SD`
- `DS1302`
## 데이터 흐름 차량 ECU와는 CAN 버스를 통해 통신하며, 필요한 값은 **UDS(ReadDataByIdentifier, 0x22)** 요청으로 읽어옵니다.
1. OBD-II 포트에서 CAN 프레임을 받습니다. - **Request (예시)**: `0x22 C1 01` → “DID=C101 읽어줘”
2. MCP2515가 CAN 프레임을 Arduino로 넘깁니다. - **Response (Positive)**: `0x62 C1 01 ...payload...`
3. Arduino가 UDS 응답 payload를 바이트 위치와 스케일 값으로 변환합니다. - 응답 서비스 ID는 일반적으로 `요청ID + 0x40` 규칙 (0x22 → 0x62)
4. 변환한 속도, RPM, 조향각, 브레이크 값을 점수 계산에 사용합니다.
5. TFT 화면에 현재 값, 점수, 운전 상태를 표시합니다.
## 평가 기준 > 수신한 응답 프레임의 payload는 **바이트 오프셋/길이/부호/스케일링/엔디안** 규칙에 따라 물리값으로 변환합니다.
### 위험 행동 ### -통신 흐름 그림
<img src="IMAGE/CAN_3.png" width="700" alt="CAN request/response"/>
### -ECU / CAN ID 맵
<img src="IMAGE/CAN_!.png" width="500" alt="ECU map"/>
### -Payload 바이트 매핑
<img src="IMAGE/CAN_2.png" width="500" alt="payload map"/>
---
## 동작 방식
- CAN 통신으로 주행 데이터를 **주기적으로 수신**합니다.
- 수신 값은 노이즈/스파이크 완화를 위해 **필터링(이동평균/저역통과 등)** 후 점수 로직에 적용됩니다.
- 감점 요인은 아래와 같이 **위험 요인 / 흐름 방해 / 정체 보호**로 구성됩니다.
---
## 감점 요인 설계
### [위험 요인 감점]
- 급가속 - 급가속
- 급제동 - 급제동
- 급조향 - 급조향
- 고속 상태의 급조향 - 고속 + 급조향
- 고RPM 유지 - 고RPM 유지
- 위험 행동 반복 - 급가속 + 급조향 동시 발생
- 위험 행동 반복(누적 패널티)
### 흐름 방해
### [흐름 방해 감점]
- 저속 지속 - 저속 지속
- 평균 속도 대비 낮은 속도 유지 - 평균 대비 과도한 저속
- 감속 뒤 회복 지연 - 불필요 감속 후 회복 지연
- 저속 시간 누적 감점
### 정체 보호 ### [정체 구간 보호(오판 방지)]
- 정체 판단 시 **흐름 방해 감점 적용 X**
- 정체 구간에서는 **위험 감점 기준 완화**
- 정체 해제 판단 시 정상 평가로 복귀
- 정체 상태에서는 흐름 방해 감점을 제외합니다. ---
- 정체 상태에서는 급가속/급제동 기준을 별도로 둡니다.
- 정체가 끝나면 일반 평가 상태로 돌아갑니다.
## 자료 ## 운전 성향(캐릭터) & 점수 UI
- 점수: 0 ~ 100 (기본 100에서 감점 누적)
- 캐릭터 예시:
- **매드맥스(과격)**: 위험 행동 빈도 높음
- **일반**: 평균적인 감점 수준
- **안전**: 위험 행동 낮고 안정 주행
- **거북이**: 저속/흐름 방해 패턴이 높음
- TFT UI: 속도/조향각/브레이크/RPM + 점수 + 캐릭터(이미지/아이콘)
- `IMAGE/CAN_3.png`: CAN 요청/응답 흐름 ---
- `IMAGE/CAN_!.png`: ECU / CAN ID 맵
- `IMAGE/CAN_2.png`: payload 바이트 매핑
- `IMAGE/FSM.png`: 상태 전환 흐름
- `IMAGE/HW.png`: 하드웨어 구성
## 한계 ## 상태 머신(FSM) 기반 평가 흐름
평가 오탐을 줄이기 위해 주행 상태를 FSM으로 관리합니다.
- 차량마다 DID와 payload 위치가 달라 그대로 재사용하기 어렵습니다. <img src="IMAGE/FSM.png" width="400" alt="FSM"/>
- 정체 판단은 속도 기반이라 실제 도로 상황과 다를 수 있습니다.
- 차종별 CAN 맵을 따로 분리해야 다른 차량에 맞추기 쉽습니다. 상태:
- NORMAL (일반 평가)
- TRAFFIC (정체 보호)
- HIGHWAY / HIGH_SPEED (고속 주행)
- LOW_SPEED (저속 누적 감점 강화)
- RECOVERY (감속 후 회복 판단)
---
## 사용 기술 스택
### Hardware
<img src="IMAGE/HW.png" width="400" alt="FSM"/>
- Arduino Nano Mini
- MCP2515 CAN Module
- 2.2inch TFT LCD (ILI9341)
- microSD Module (캐릭터 RAW 리소스 + 로그 저장)
- DS1302 RTC Module (시간 기록)
### Software
- Arduino IDE (C/C++)
- CAN 통신: `mcp_can`
- TFT UI: `Adafruit_GFX`, `Adafruit_ILI9341`
- SD 처리: `SPI`, `SD`
- UDS/ISO-TP 기반 데이터 요청/응답 처리
---
## 데이터 로깅/세션 관리(추가)
### 1) 타임스탬프 로그 저장
- DS1302 RTC를 이용해 **주행 로그에 날짜/시간을 기록**합니다.
- SD 카드에 아래 형태로 저장(예시):
- `YYYY-MM-DD HH:MM:SS, speed, rpm, steer, brake, score, state, character`
### 2) 재시동 시 세션 이어쓰기(최근 N분)
- **시동 OFF 후 N분 이내 재시동** 시, 이전 점수/상태를 이어서 누적합니다.
- 예: 시동 OFF 후 **5분 이내 재시동 → 이전 세션 이어서 누적**
- 예: 시동 OFF 후 **5분 초과 재시동 → 새 세션으로 초기화**
- 구현 포인트:
- `last_off_time`을 RTC로 저장해두고 재부팅 시 비교
- SD(또는 EEPROM)에 **최근 세션 score/state** 저장 후 복원
### 3) 시간 기반 통계 확장(향후)
- SD 로그를 기반으로 **하루/주간 통계**(평균 점수, 위험 이벤트 횟수, 정체 시간 비율 등) 기능 확장
- 장기적으로 차종별 DID/맵을 config로 분리해 호환성 강화
---
## 한계 및 개선 사항
- **차종별 CAN/UDS 데이터 차이**
- DID/바이트 오프셋이 차량마다 달라 호환성 확장이 필요함
- **정체/고속/저속 모드 판별 한계**
- 현재는 속도 기반 추정이므로 환경에 따라 오탐 가능
### 향후 개선 방향
- 주행 기록에 날짜/시간 타임스탬프 추가
- N분 이내 재시동 시 이전 운전 기록 이어서 사용
- SD 로그 기반 하루/주간 통계 기능 확장
- 차종별 DID/맵을 외부 설정 파일화하여 확장성 강화
---