Windows 환경에서 CAN FD 데이터를 수신하고, 레이더 데이터를 카메라 픽셀 좌표계로 실시간 변환하는 프로젝트입니다.
- CAN FD 지원: 고속 CAN FD 인터페이스 지원
- 듀얼 채널: CH1, CH2 독립적인 CAN 채널 처리
- TSMaster 스타일 고급 CAN 처리: TSMaster에서 사용하는 오픈소스 라이브러리 패턴을 적용한 고급 CAN 데이터 처리
- 실제 USB CAN 인터페이스 지원: PEAK PCAN-USB, Vector, IXXAT 등 다양한 CAN 인터페이스 지원
- DLC 불일치 자동 처리: DBC와 실제 데이터의 DLC가 다를 때 자동으로 패딩/자르기 처리
- 실시간 콜백 시스템: 메시지별 콜백 함수 등록으로 실시간 데이터 처리
- 고급 오류 처리: 메시지 상태별 세분화된 오류 처리 및 재시도 메커니즘
- 성능 모니터링: 처리 시간, 초당 메시지 수, 성공률 등 실시간 성능 모니터링
- CIPV 기반 객체 추적: 가장 가까운 선행 차량(CIPV) 객체 자동 추적
- 실시간 좌표 변환: 레이더 상대좌표를 카메라 픽셀 좌표로 실시간 변환
- 3D 투영 수식: 정확한 카메라 내부/외부 파라미터를 사용한 3D 투영
- 실시간 시각화: OpenCV를 사용한 실시간 객체 위치 표시
- 다중 객체 지원: 최대 32개 객체까지 동시 처리
- PyQt5 기반: 사용자 친화적인 GUI 인터페이스
- 실시간 모니터링: CAN 메시지와 레이더 데이터를 실시간으로 표시
- 고급 정렬 기능: 메시지 이름, 신호 이름, 시간순 정렬 및 역순 정렬 지원
- 실시간 필터링: 메시지 이름 및 신호 이름 기반 실시간 필터링
- 데이터 로깅: CAN 메시지를 CSV 파일로 저장
- 통계 정보: CAN 메시지 처리 통계 및 오류율 실시간 표시
can_interface/
├── can_interface.py # 메인 CAN 수신 프로그램 (GUI)
├── camera_projection.py # 레이더-카메라 projection 프로그램
├── tsmaster_can_processor.py # TSMaster 스타일 고급 CAN 데이터 처리 클래스
├── radar_data.py # 레이더 데이터 관리 클래스
├── send_can.py # CAN 송신 프로그램 (테스트용)
├── test_can.py # CAN 인터페이스 테스트 프로그램
├── test_tsmaster_can.py # TSMaster 스타일 CAN 처리 테스트 프로그램
├── test_can_fd.py # CAN FD 테스트 프로그램
├── test_dlc_mismatch.py # DLC 불일치 테스트 프로그램
├── yours.dbc # CAN 데이터베이스 파일 (메인)
├── candb_ex.dbc # CAN 데이터베이스 파일 (예제)
├── requirements.txt # Python 패키지 의존성
├── WINDOWS_SETUP.md # Windows 설치 가이드
├── LICENSE # 라이선스 파일
├── can_env/ # Python 가상환경 (로컬)
├── logs/ # CAN 로그 파일 저장 디렉토리
│ └── *.csv # CAN 메시지 로그 파일들
└── README.md # 이 파일
# Python 가상환경 생성
python -m venv can_env
# 가상환경 활성화 (Windows)
can_env\Scripts\activate
# 또는 (Linux/Mac)
source can_env/bin/activate
# 필요한 패키지 설치
pip install -r requirements.txt# conda 가상환경 생성
conda create -n can_env python=3.9
# 가상환경 활성화
conda activate can_env
# 필요한 패키지 설치
pip install -r requirements.txt- USB CAN 인터페이스를 컴퓨터에 연결
- 해당 제조사의 드라이버 설치
- 프로그램 실행 후 "Connect CH1", "Connect CH2" 버튼 클릭
# CAN 수신 프로그램 실행 (메인 프로그램)
python can_interface.py# 터미널 1: CAN 인터페이스 실행
python can_interface.py
# 터미널 2: 카메라 projection 실행
python camera_projection.py# CAN 송신 프로그램 실행 (테스트용)
python send_can.py
# CAN 인터페이스 테스트 실행
python test_can.py
# TSMaster 스타일 CAN 처리 테스트 실행
python test_tsmaster_can.py
# CAN FD 테스트 실행
python test_can_fd.pyfrom camera_projection import CameraProjectionProcessor
from can_interface import CanDataViewer
# CAN 인터페이스 초기화
can_viewer = CanDataViewer("yours_radar.dbc")
# Projection 프로세서 초기화
projection_processor = CameraProjectionProcessor(can_viewer)
# 실시간 projection 처리 시작
projection_processor.process_realtime_projection()# 카메라 내부 파라미터 조정
projection_processor.camera_matrix = np.array([
[fx, 0, cx], # 초점거리 fx, 주점 cx
[0, fy, cy], # 초점거리 fy, 주점 cy
[0, 0, 1] # 단위행렬
])
# 카메라-레이더 외부 파라미터 조정
projection_processor.rotation_matrix = R # 3x3 회전행렬
projection_processor.translation_vector = T # 3x1 이동벡터# CIPV projection 데이터 가져오기
cipv_data = can_viewer.get_cipv_projection_data("CH1")
if cipv_data["valid"]:
x = cipv_data["x"] # 레이더 X 좌표
y = cipv_data["y"] # 레이더 Y 좌표
obj_id = cipv_data["obj_id"] # 객체 ID
timestamp = cipv_data["timestamp"] # 타임스탬프- Sort by Name: 메시지 이름과 신호 이름으로 정렬
- Sort by Time: 시간순 정렬 (기본)
- Reverse: 현재 정렬의 역순으로 표시
- Filter: 특정 메시지나 신호만 표시
- 메시지 이름 필터: 예) "FR_RDR", ADAS"
- 신호 이름 필터: 예) "ADAS_CIPV", "FR_RDR_Obj_~"
- 대소문자 구분 없이 부분 일치 검색
- 자동 CIPV 감지:
ADAS메시지에서 CIPV 객체 ID 자동 추출 - 동적 신호 매핑: CIPV ID에 따라
FR_RDR_Obj{ID:02d}신호 자동 매핑 - 실시간 좌표 변환: 레이더 상대좌표를 카메라 픽셀 좌표로 실시간 변환
from radar_data import RadarDataManager
# RadarDataManager 인스턴스 생성
radar_manager = RadarDataManager()
# 가장 가까운 객체 거리
closest_distance = radar_manager.closest_distance
# 객체 개수
object_count = radar_manager.object_count
# 특정 ID의 객체 정보
object_1 = radar_manager.get_object_by_id(1)
if object_1:
print(f"거리: {object_1.distance}m")
print(f"각도: {object_1.angle}도")# 거리 범위 내 객체들
nearby_objects = radar_manager.get_objects_in_range(0, 50) # 0-50m
# 각도 범위 내 객체들
front_objects = radar_manager.get_objects_in_angle_range(-30, 30) # 정면 ±30도
# 속도 범위 내 객체들
fast_objects = radar_manager.get_objects_by_velocity(10, 50) # 10-50 m/s- PEAK PCAN-USB: PEAK-System의 USB CAN 인터페이스
- Vector CANoe/CANalyzer: Vector의 CAN 분석 도구
- IXXAT USB-to-CAN: IXXAT의 USB CAN 인터페이스
- SocketCAN: Linux 호환 인터페이스
- Virtual CAN: 테스트용 가상 인터페이스
각 레이더 객체는 다음 정보를 포함합니다:
- Object ID: 객체 식별자 (1-10)
- Distance: 거리 (미터) - 자동 계산
- Angle: 각도 (도) - 자동 계산
- Relative Position X/Y: 상대 위치 (미터)
- Relative Velocity X: 상대 속도 (m/s)
- Relative Acceleration X: 상대 가속도 (m/s²)
- Timestamp: 타임스탬프
프로젝트는 다음 CAN 메시지들을 사용합니다:
- ADAS: ADAS 운전자 정보 (CIPV 객체 ID 포함)
ADAS_CIPV: CIPV 객체 번호 (0-31)
- FR_RDR_01 ~ FR_RDR_32: 전방 레이더 객체 데이터 (32개 객체)
FR_RDR_RelPosX{ID:02d}Val: 상대 X 위치 (미터)FR_RDR_RelPosY{ID:02d}Val: 상대 Y 위치 (미터)FR_RDR_RelVelX{ID:02d}Val: 상대 X 속도 (m/s)FR_RDR_RelAccX{ID:02d}Val: 상대 X 가속도 (m/s²)
- 100: 차량 상태 (속도, 스티어링 각도)
- 101: 차량 가속도 (횡가속도)
- 102: 차선 정보
- 200-209: 레이더 객체 데이터 (10개 객체)
자세한 설치 방법은 WINDOWS_SETUP.md 파일을 참조하세요.
- "Log Start" 버튼으로 데이터 로깅 시작
- "Log End" 버튼으로 로깅 종료 및 CSV 파일 저장
- 파일명 형식:
YYYYMMDD_HHMMSS_can_log.csv - 로그 파일은
logs/디렉토리에 자동 저장
-
CAN 인터페이스 연결 실패
- USB CAN 인터페이스가 올바르게 연결되었는지 확인
- 해당 제조사의 드라이버가 설치되었는지 확인
- Virtual CAN으로 테스트: "Connect CH1" 버튼을 눌러 Virtual CAN 연결 시도
-
Python 패키지 설치 오류
# pip 업그레이드 pip install --upgrade pip # 가상환경에서 설치 pip install -r requirements.txt # 특정 패키지 개별 설치 pip install PyQt5 python-can cantools pandas numpy opencv-python
-
OpenCV 관련 오류
# OpenCV 재설치 pip uninstall opencv-python pip install opencv-python -
CAN FD 연결 실패
- CAN FD를 지원하지 않는 인터페이스인 경우 일반 CAN으로 자동 전환
- Vector, IXXAT 등 CAN FD 지원 인터페이스 사용 권장
-
CIPV 데이터가 표시되지 않는 경우
- DBC 파일이 올바르게 로드되었는지 확인
ADAS메시지가 수신되는지 확인- CAN 수신이 활성화되어 있는지 확인 (Start 버튼)
이 프로젝트는 MIT 라이선스 하에 배포됩니다.
버그 리포트나 기능 제안은 GitHub Issues를 통해 제출해 주세요.
- CIPV 기반 객체 추적: 가장 가까운 선행 차량 자동 추적
- 실시간 좌표 변환: 레이더 상대좌표를 카메라 픽셀 좌표로 실시간 변환
- 3D 투영 수식: 정확한 카메라 내부/외부 파라미터를 사용한 3D 투영
- 실시간 시각화: OpenCV를 사용한 실시간 객체 위치 표시
- 동적 신호 매핑: CIPV ID에 따른 자동 신호 이름 생성
- 듀얼 채널 지원: CH1, CH2 독립적인 CAN 채널 처리
- Ubuntu virtual CAN에서 Windows USB CAN 인터페이스로 변경
- 레이더 데이터 관리 클래스 추가
- GUI 인터페이스 개선
- 다양한 CAN 인터페이스 지원
- CAN FD 지원 추가
- Virtual CAN 기반 구현
- 기본 CAN 메시지 수신/송신 기능