SYSTEM BLUEPRINT

제안서에서 약속한 구조를
9개 화면으로 증명합니다

레이저 거리 · 로터리 엔코더 · IMU 각도 3종 데이터 로거 사전 기획서 — 현장 운영자 / 데이터 분석 담당자 / 설치·보수 담당자 3개 흐름 · 2026.08 · 우리팀

현장 운영자 시나리오

현장 운영자 — 켜고, 확인하고, 남긴다

장비 앞에서 프로그램을 켜는 사람이 겪는 5단계. 화면은 단순하지만 그 뒤의 수집 구조는 데이터를 한 건도 흘리지 않습니다.

프로그램 실행

설치 파일로 배포된 SensorLogger 실행. .NET 미설치 PC에서도 바로 구동됩니다.

채널 3종 연결

레이저는 COM 포트, IMU는 MIP 포트, 엔코더는 카운터 경로로 각각 연결하고 수신값을 확인합니다.

수집 시작

저장 위치와 세션 이름을 확정하고 시작. 이후 화면 조작과 무관하게 수집이 계속됩니다.

실시간 감시

거리·회전각·기울기를 큰 숫자로 보면서 수신 = 저장 카운터와 드롭 0을 함께 확인합니다.

세션 종료 · 요약

수집을 끝내면 채널별 수신/저장/폐기 건수가 요약되고 바로 CSV로 내보낼 수 있습니다.

현장 운영자 | 화면 01

채널 연결 설정 — 엔코더가 COM 포트에 없는 이유를 화면이 설명합니다

SensorLogger v1.0 · 채널 연결 설정
채널 연결 설정
센서 3종의 접속 경로와 통신 규격을 확정하고 실제 수신 여부를 확인합니다
3 / 3 채널 연결됨
레이저 거리 센서
ymsystem DEN-10-500
접속 경로
COM3
통신 규격
115200 · 8-N-1 · 100 Hz
테스트 수신값
187.42 mm
연결됨
로터리 엔코더
Autonics E50S8-100-3-T-24
접속 경로
USB DAQ · CTR0
통신 규격
A/B/Z 쿼드러처 4체배 · 400 c/rev
테스트 수신값
3,182 count
연결됨
IMU / AHRS 각도
3DM-GV7-AHRS
접속 경로
COM7
통신 규격
MIP 바이너리 · 115200 · 1000 Hz
테스트 수신값
roll 2.14°
연결됨
엔코더는 시리얼 포트가 없습니다 — 카운터 경로가 필요합니다
품번 E50S8-100-3-T-24T는 토템폴 출력을 뜻합니다. COM 포트 대신 USB DAQ 쿼드러처 카운터(CTR0) 경로가 선택되어 있으며, 산업용 카운터 모듈 / 레벨시프터+MCU 경로로 언제든 교체 가능합니다.
저장 위치 D:\SensorLog\sensor_log.db  ·  WAL 모드  ·  여유 공간 412 GB 수집 시작

[화면 개요 및 목적]

제안서 역제안 ①(착수 3일 결선 설계서)이 실제 화면으로 구현된 모습입니다. 세 채널의 접속 경로를 한 줄씩 나열하되, 엔코더만 COM 포트가 아니라 '카운터 경로'로 표시됩니다. 연결 테스트 수신값을 각 행 우측에 띄워, 배선이 맞았는지 프로그램을 종료하지 않고 확인합니다.

[핵심 기능 로직]

엔코더 행은 카운터 경로(산업용 카운터 모듈 / USB DAQ 쿼드러처 / 레벨시프터+MCU)를 드롭다운으로 교체할 수 있게 설계했습니다. 하단 경고 배너는 품번 해석 근거를 그대로 노출해, 운영자가 바뀌어도 같은 실수가 반복되지 않게 합니다.

  • SerialPort 포트 스캔 · 보드레이트/패리티 프로파일 저장
  • 쿼드러처 4체배 카운터 어댑터 · 100 PPR → 400 count/rev
현장 운영자 | 화면 02

실시간 수집 대시보드 — 화면은 30fps, 저장은 원본 속도

SensorLogger v1.0 · 실시간 수집 · SES-20260901-0932
실시간 수집 · 세션 SES-20260901-0932
화면 표시는 초당 30회로 솎아내고, 저장은 센서 원본 속도 그대로 진행됩니다
REC 01:42:17
레이저 거리 (CH1)
187.42 mm
100 Hz · 최근 갱신 0.01초 전
IMU 롤 각도 (CH3)
2.14 deg
1000 Hz · pitch -0.87 / yaw 118.42
엔코더 회전각 (CH2)
286.38 deg
3,182 count · CW 회전 중
무손실 검증
수신 샘플
6,148,320
=
DB 저장 샘플
6,148,320
드롭
0
수집 버퍼 점유율 12% · 배치 커밋 500건 단위
최근 수신 샘플 · 단조 타임스탬프 기준 t_mono = QPC 기반 · 시스템 시각 오프셋 동시 기록
t_mono (s) 채널 상태
6137.482913 CH3 · IMU roll 2.141 pitch -0.873 저장됨
6137.482804 CH1 · LASER 187.42 mm 저장됨
6137.481902 CH3 · IMU roll 2.139 pitch -0.871 저장됨
6137.480118 CH2 · ENCODER 3182 count / 286.38 deg 저장됨
6137.479903 CH3 · IMU roll 2.136 pitch -0.870 저장됨

[화면 개요 및 목적]

제안서 역제안 ②(무손실 3-레이어 파이프라인)를 증명하는 핵심 화면입니다. 공고에서 요구한 '텍스트 수치 표시'를 대형 숫자로 만들고, 그 아래에 수신 카운트 = 저장 카운트 = 드롭 0을 상시 노출합니다. 데모 Step 3에서 이 화면이 그대로 작동합니다.

[핵심 기능 로직]

센서별 수집 스레드는 크기 제한 링버퍼에만 밀어 넣고 끝냅니다. 저장 스레드가 500건 단위로 묶어 커밋하고, 화면은 33ms 주기로 최신값만 읽어 갱신합니다. 화면이 느려져도 수집·저장은 영향을 받지 않는 구조입니다.

  • Bounded Channel 백프레셔 · 버퍼 점유율 실시간 표기
  • QueryPerformanceCounter 단조 타임스탬프 + 시스템 시각 오프셋
현장 운영자 | 화면 03

세션 종료 요약 — '드롭 0'을 숫자로 넘겨드립니다

SensorLogger — 세션 종료 요약 세션 SES-20260901-0932 종료 — □ ×
DROPPED SAMPLES
0
6시간 12분 연속 수집
총 수신 샘플
22,340,918
DB 저장 행 수
22,340,918
DB 파일 크기
1.42 GB
채널 수신 저장 체크섬 실패 재연결
CH1 · LASER 2,234,092 2,234,092 3 0
CH2 · ENCODER 223,410 223,410 0
CH3 · IMU 19,883,416 19,883,416 11 1
체크섬 실패 14건은 폐기 후 카운트만 기록되어 DB에 잘못된 값이 들어가지 않았습니다. 재연결 1회는 IMU USB 순단으로, 2.1초 만에 자동 복구되었습니다. CSV로 내보내기 검증 리포트 저장

[화면 개요 및 목적]

수집을 끝냈을 때 운영자가 가장 알고 싶은 것은 '이번 데이터 믿어도 되나'입니다. 채널별 수신·저장·체크섬 실패·재연결 횟수를 표로 제시하고, 좌측에 드롭 0을 크게 배치했습니다. 데모 Step 4의 비교 수치가 여기서 나옵니다.

[핵심 기능 로직]

체크섬 실패 패킷은 DB에 넣지 않고 카운트만 남깁니다. 즉 '저장 행 수'는 검증을 통과한 데이터만의 수치이며, 수신 카운트와 일치한다는 것은 유효 데이터가 전부 남았다는 뜻입니다. 이 요약은 검증 리포트 파일로도 저장됩니다.

  • 세션 메타 테이블 · 채널별 집계 쿼리 자동 생성
  • 무손실 검증 리포트 내보내기 (수신/저장/폐기 대조)
데이터 분석 담당자 시나리오

분석 담당자 — 쌓인 데이터를 꺼내 쓴다

공고의 "추후 확인할 수 있도록"이라는 문장이 실제로 무엇을 뜻하는지. 사후 분석이 이 로거의 최종 사용처입니다.

DB 열기

sensor_log.db 파일 하나만 있으면 됩니다. 다른 PC로 복사해 열어도 그대로 동작합니다.

세션 선택

기간과 채널로 걸러 분석할 수집 세션을 고릅니다. 수집 중에도 조회가 가능합니다.

시간 정렬 확인

속도가 다른 세 채널을 하나의 시간축에 맞춰 정렬한 결과를 미리 봅니다.

기준 축 · 간격 선택

IMU 기준인지 레이저 기준인지, 몇 ms 간격으로 뽑을지 분석 목적에 맞게 고릅니다.

CSV 내보내기

엑셀에서 바로 열리는 형태로 저장. 원본 테이블은 조금도 건드리지 않습니다.

데이터 분석 담당자 | 화면 01

수집 세션 조회 — 수집을 멈추지 않고 과거 데이터를 봅니다

SensorLogger v1.0 · 데이터 조회 · sensor_log.db
수집 세션 조회
sensor_log.db 안에 쌓인 세션을 기간으로 찾아 분석 대상을 고릅니다
D:\SensorLog\sensor_log.db · 1.42 GB
기간 2026-09-01 00:00 ~ 2026-09-03 23:59 채널 CH1 LASERCH2 ENCODERCH3 IMU 조회
SES-20260901-0932
2026-09-01 09:32 ~ 15:44
수집 시간
06:12:41
저장 행 수
22,340,918
드롭
0
선택됨
SES-20260901-0821
2026-09-01 08:21 ~ 09:05
수집 시간
00:44:12
저장 행 수
2,651,004
드롭
0
열기
SES-20260831-1710
2026-08-31 17:10 ~ 19:38
수집 시간
02:28:55
저장 행 수
8,930,412
드롭
0
열기
SES-20260831-0913
2026-08-31 09:13 ~ 12:02
수집 시간
02:49:07
저장 행 수
10,142,880
드롭
0
열기
조회 중에도 수집은 멈추지 않습니다. SQLite를 WAL 모드로 열어 읽기와 쓰기가 서로를 막지 않도록 구성했습니다.

[화면 개요 및 목적]

로컬 DB에 쌓인 세션을 기간·채널로 찾는 진입 화면입니다. 각 세션 카드에 수집 시간, 저장 행 수, 드롭 건수를 함께 표기해 '어느 세션이 온전한 데이터인지'를 목록 단계에서 판단할 수 있게 했습니다.

[핵심 기능 로직]

SQLite를 WAL 모드로 열어 읽기 트랜잭션이 쓰기를 막지 않습니다. 그래서 현장에서 수집이 돌아가는 중에도 사무실에서 같은 파일을 조회할 수 있습니다. 세션 메타는 별도 테이블로 관리해 대용량 샘플 테이블을 스캔하지 않습니다.

  • SQLite WAL · 읽기/쓰기 비차단 동시 접근
  • session 메타 테이블 인덱스 (started_at, channel_mask)
데이터 분석 담당자 | 화면 02

시간 정렬 뷰 — 거리와 각도를 같은 행에서 비교합니다

SensorLogger v1.0 · 시간 정렬 뷰 · v_aligned_samples
시간 정렬 뷰 · SES-20260901-0932
채널별 원본은 그대로 두고, 하나의 시간축에 맞춰 정렬한 결과만 보여줍니다
기준 축: CH3 IMU 1000 Hz리샘플 10 ms
정렬 구간 길이
06:12:41
2026-09-01 09:32:14 시작
정렬 후 행 수
2,234,092
10 ms 간격 · 결측 0.00%
채널 간 최대 시차
0.94 ms
단조 타임스탬프 기준 보정 후
v_aligned_samples · 미리보기 원본 테이블 3개는 수정되지 않습니다 (읽기 전용 뷰)
t_utct_mono (s)distance_mmenc_degroll_degpitch_degyaw_deg
09:32:14.1206137.480187.42286.382.141-0.873118.421
09:32:14.1306137.490187.44286.412.139-0.871118.424
09:32:14.1406137.500187.41286.452.136-0.870118.428
09:32:14.1506137.510187.38286.492.132-0.868118.431
09:32:14.1606137.520187.35286.522.128-0.866118.435
09:32:14.1706137.530187.33286.562.124-0.864118.439
거리와 각도를 같은 행에서 비교할 수 있어야 사후 분석이 가능합니다 CSV로 내보내기

[화면 개요 및 목적]

속도가 제각각인 세 채널(레이저 100Hz, IMU 1000Hz, 엔코더 이벤트)을 하나의 시간축에 정렬한 결과입니다. 이 화면이 없으면 '그때 그 거리에서 각도가 몇 도였나'를 답할 수 없습니다. 시간 정렬 설계가 곧 이 프로젝트의 데이터 품질입니다.

[핵심 기능 로직]

채널별 원본 테이블은 절대 변형하지 않고, 읽기 전용 뷰에서 기준 축 샘플마다 가장 가까운 이웃 값을 붙입니다. 채널 간 최대 시차를 함께 표기해 정렬 결과의 신뢰 범위를 숨기지 않습니다.

  • 읽기 전용 정렬 뷰 · 최근접 이웃 매칭 + 시차 표기
  • 단조 타임스탬프 기준 정렬 · 시스템 시각 역산 컬럼 제공
데이터 분석 담당자 | 화면 03

CSV 내보내기 — 기준 축과 간격을 고르고 그대로 엑셀로

SensorLogger v1.0 · CSV 내보내기
CSV 내보내기 SES-20260901-0932 · 원본 훼손 없음 — □ ×
1. 내보낼 구간
09:32:14.120 ~ 15:44:55.310
2. 시간 기준 축
IMU 1000 Hz 레이저 100 Hz 엔코더 이벤트
3. 리샘플 간격
1 ms 10 ms 100 ms 원본
미리보기 · sensor_export_20260901_0932.csv
t_utc,t_mono_s,distance_mm,enc_deg,roll_deg,pitch_deg,yaw_deg 2026-09-01T09:32:14.120Z,6137.480,187.42,286.38,2.141,-0.873,118.421 2026-09-01T09:32:14.130Z,6137.490,187.44,286.41,2.139,-0.871,118.424 2026-09-01T09:32:14.140Z,6137.500,187.41,286.45,2.136,-0.870,118.428 2026-09-01T09:32:14.150Z,6137.510,187.38,286.49,2.132,-0.868,118.431 2026-09-01T09:32:14.160Z,6137.520,187.35,286.52,2.128,-0.866,118.435
예상 행 수
2,234,092
예상 파일 크기
184 MB
내보내기 시작

[화면 개요 및 목적]

공고에서 "(필요 시)"로 표기된 CSV 다운로드를, 실제 분석에 쓸 수 있는 수준으로 설계했습니다. 구간·기준 축·리샘플 간격 3가지만 고르면 되고, 오른쪽에 실제 출력될 헤더와 첫 다섯 줄을 미리 보여줍니다.

[핵심 기능 로직]

예상 행 수와 파일 크기를 내보내기 전에 계산해 표시하므로, 수백 MB짜리 파일을 만들어 놓고 후회하는 일이 없습니다. 내보내기는 스트리밍 방식으로 처리해 메모리에 전체를 올리지 않습니다.

  • Data Aggregation & Visualization
  • 스트리밍 CSV 라이터 · UTF-8 BOM (엑셀 한글 깨짐 방지)
설치 · 보수 담당자 시나리오

설치·보수 담당자 — 값이 이상할 때 원인을 가른다

현장에서 숫자가 튀면 배선 문제인지 파싱 문제인지부터 갈라야 합니다. 그 판단을 화면이 대신해 주도록 설계했습니다.

결선 확인

결선 설계서대로 A·B·Z와 전원이 연결됐는지 확인하고 프로그램을 진단 모드로 전환합니다.

신호 진단

엔코더 펄스 파형과 IMU 패킷 원문을 눈으로 보고 어느 계층에서 끊겼는지 확인합니다.

원인 특정

B상 단선, 체크섬 실패, 프레임 절단 등 원인이 화면에 그대로 이름으로 표시됩니다.

시뮬레이터 재현

같은 상황을 시뮬레이터로 재현해 수정이 실제로 통했는지 장비 없이 검증합니다.

로그 회수

롤링 로그 파일 하나만 보내주시면 원격에서도 원인 분석이 가능합니다.

설치 · 보수 담당자 | 화면 01

하드웨어 진단 — 펄스 파형과 패킷 원문을 그대로 보여줍니다

SensorLogger v1.0 · 진단 모드 · CH2 / CH3
하드웨어 진단 모드
현장에서 값이 이상할 때, 배선 문제인지 파싱 문제인지 이 화면 하나로 갈라냅니다
진단 중 · 수집은 계속 진행
CH2 엔코더 · A/B/Z 쿼드러처 신호 정상 · 위상차 90° ± 2°
A상
B상
Z상
누적 카운트 (4체배)
3,182
회전 방향
CW
Z상 원점 통과
7 회
A상만 들어오고 B상이 없으면 방향 판별 불가, Z상이 없으면 원점 복귀 불가입니다. 이 화면에서 어느 선이 빠졌는지 바로 확인됩니다.
CH3 IMU · MIP 패킷 원문 체크섬 OK
75 65 82 0E 0E 05 40 0C 4C CD 3F 5F BF 5F 8E 3A 42 EC D6 F4 6A 1C 9B 7E ​ SYNC : 75 65 (MIP 헤더) DESC : 82 (필터 데이터 셋) LEN : 0E (14 바이트) FIELD : 05 40 (오일러 각 RPY) CKSUM : 9B 7E 검증 통과
패킷 수신율
999.94 Hz
체크섬 실패 (누적)
11

[화면 개요 및 목적]

왼쪽은 엔코더의 A·B·Z 쿼드러처 신호, 오른쪽은 IMU의 MIP 패킷 헥사 원문입니다. 값이 이상할 때 '센서가 이상한지, 배선이 이상한지, 우리 파싱이 이상한지'를 이 한 화면에서 가릅니다. 제안서 역제안 ①의 사후 관리 버전입니다.

[핵심 기능 로직]

A·B 위상차가 90°에서 벗어나면 배선/노이즈, Z상이 없으면 원점 복귀 불가, 체크섬 실패가 늘면 케이블 길이나 접지 문제로 좁혀집니다. 판단 기준을 화면 안에 문장으로 적어 담당자가 바뀌어도 동일하게 진단됩니다.

  • A/B 위상차 측정 · Z상 인덱스 카운트 · 방향 판별
  • MIP 패킷 헥사 덤프 · 디스크립터/체크섬 필드 하이라이트
설치 · 보수 담당자 | 화면 02

센서 시뮬레이터 — 실물 없이 재현하고, 실물 있어도 계속 씁니다

SensorLogger v1.0 · 시뮬레이터 · 회귀 테스트
센서 시뮬레이터
센서 실물이 도착하기 전에도, 그리고 도착한 뒤에도 계속 쓰이는 검증 장비입니다
가상 COM 포트 3개 활성
레이저 거리 시뮬레이터
DEN-10-500 응답 에뮬레이션
생성 모드
사인파 왕복 120~250 mm · 100 Hz
현재 출력
187.42 mm → COM11
ON
엔코더 펄스 생성기
A/B/Z 쿼드러처 · 100 PPR
생성 모드
정속 60 RPM · 1회전마다 Z상 1펄스
현재 출력
3,182 count → CTR0
ON
MIP 패킷 생성기
3DM-GV7-AHRS 필터 데이터 셋
생성 모드
요 118° 부근 진동 · 1000 Hz
현재 출력
roll 2.14° → COM12
ON
고장 상황 재현
USB 순단 2초 체크섬 깨진 패킷 주입 프레임 절단 수신 B상 단선 카운터 롤오버 디스크 지연 500 ms
실물로는 재현하기 어려운 상황을 버튼 하나로 만들어, 프로그램이 데이터를 잃지 않고 버티는지를 납품 전에 확인합니다.
회귀 테스트 결과 · 24 케이스
PASS USB 순단 후 2.1초 내 자동 재연결 PASS 체크섬 실패 패킷 폐기 · DB 미기록 PASS 절단 프레임 재동기화 후 정상 파싱 PASS B상 단선 감지 및 경고 표시 PASS 카운터 롤오버 부호 보정 PASS 디스크 지연 시 버퍼 흡수 · 드롭 0
최근 실행 2026-09-01 08:55 24 / 24 PASS

[화면 개요 및 목적]

제안서 역제안 ③(시뮬레이터 선행 개발)의 실체입니다. 센서 3종의 출력을 가상 COM 포트와 카운터 채널로 만들어 내고, USB 순단·체크섬 오류·B상 단선 같은 고장 상황을 버튼으로 재현합니다. 데모 Step 2가 이 화면의 동작을 체험시킵니다.

[핵심 기능 로직]

실물 도착 전에는 개발 환경, 도착 후에는 회귀 테스트 장비, 납품 후에는 현장 재현 도구로 역할이 바뀝니다. 24개 고장 케이스를 매 빌드마다 자동 실행해 '드롭 0'이 우연이 아님을 반복 검증합니다.

  • 가상 COM 포트 페어 · MIP 패킷 생성기 · A/B/Z 펄스열 생성기
  • 고장 주입 회귀 테스트 24 케이스 자동 실행
설치 · 보수 담당자 | 화면 03

이벤트 로그 뷰어 — 경고 14건, 데이터 손실 0건

SensorLogger v1.0 · 이벤트 로그
이벤트 로그 뷰어 2026-09-01 · 자동 롤링 — □ ×
기록된 이벤트
1,284
경고 (WARN)
14
오류 (ERROR)
0
데이터 손실
0
sensorlogger-20260901.log · 롤링 파일 현장 이슈 발생 시 이 파일만 보내주시면 원인을 짚어 드립니다
09:32:14.118 INFO SESSION 세션 SES-20260901-0932 시작 · WAL 모드 · 배치 500
09:32:14.204 INFO CH2 Z상 원점 감지 · 누적 카운트 0으로 리셋
11:07:41.882 WARN CH3 MIP 체크섬 불일치 1건 · 패킷 폐기 (누적 7)
12:18:03.117 WARN CH3 USB 순단 감지 · 재연결 시도
12:18:05.221 INFO CH3 재연결 성공 (2.104초) · 버퍼 잔량 0 · 손실 없음
14:52:09.640 WARN WRITER 디스크 응답 지연 380ms · 버퍼 점유 41%로 흡수
15:44:55.310 INFO SESSION 세션 종료 · 수신 22,340,918 = 저장 22,340,918
경고가 14건 있었지만 저장된 데이터는 한 건도 잃지 않았습니다. 조용히 넘어가는 대신 무슨 일이 있었는지 전부 남기는 것이 설계 원칙입니다.

[화면 개요 및 목적]

장시간 무중단 운전에서 아무 일도 없는 경우는 없습니다. 중요한 것은 무슨 일이 있었고 그것이 데이터에 영향을 줬는지를 말해 주는 것입니다. 경고는 남기되 손실은 0이라는 사실을 상단 지표로 대비시켰습니다.

[핵심 기능 로직]

롤링 파일로 일자별 분할 저장되며, 세션 시작/종료·재연결·체크섬 실패·디스크 지연 흡수 등 데이터 신뢰도에 영향을 주는 이벤트만 선별해 기록합니다. 파일 하나로 원격 원인 분석이 가능하도록 포맷을 고정했습니다.

  • Serilog 롤링 파일 · 이벤트 등급별 필터 및 집계
  • Issue Tracking & Status Management