1. 도입 (Introduction)
문제 제기:
카메라 없이 실내에 있는 사람의 수나 움직임을 파악할 수 있을까?
사생활을 보호하면서도 안전을 확인할 방법은 없을까?
프로젝트 목표:
일상생활에서 사용하는 WiFi 신호의 미세한 변화, 즉 **채널 상태 정보(CSI, Channel State Information)**를 분석하여 사람의 존재 유무, 인원 수, 그리고 이동 경로를 시각화하는 프로젝트를 진행했습니다.
결과 미리보기:
이 글에서는 Intel AX210 WiFi 칩셋과 Linux CSI Tool을 활용해 데이터를 수집하고, NumPy와 Matplotlib으로 분석 및 시각화한 전체 과정을 공유합니다.
2. WiFi CSI란 무엇인가? 🤔
핵심 개념:
CSI는 송신기와 수신기 사이의 WiFi 신호가 어떻게 변화하는지를 담은 일종의 **"신호 건강검진표"**입니다.
- **진폭(Amplitude)**과 위상(Phase) 정보가 포함되어 있습니다.
원리 (쉬운 비유):
잔잔한 호수에 돌을 던지면 물결이 생기듯,
- 아무도 없을 때: WiFi 신호는 잔잔한 호수처럼 비교적 안정적입니다.
- 사람이 움직일 때: 사람의 몸이 신호를 반사·흡수·산란시켜 진폭과 위상에 미세한 변화(물결)를 만듭니다.
우리의 목표:
이 ‘물결’ 패턴을 분석해 사람의 움직임을 역으로 추적하는 것입니다.
3. 프로젝트 환경 구성 (My Setup) 🛠️
하드웨어 (H/W)
- WiFi 카드: Intel Wi-Fi 6E AX210 M.2 (1개)
- PC: Ubuntu 20.04 LTS 설치 (송신기·수신기 역할)
- 안테나: 외부 안테나 사용 시 신호 정확도가 개선되지만, 필수는 아님
소프트웨어 (S/W)
- OS: Ubuntu 20.04 LTS
- CSI 수집 도구: iwl-csi-tool
- 언어: Python 3.8+
- 라이브러리:
- NumPy – 데이터 처리 및 연산
- Pandas – 데이터 관리 (선택 사항)
- Matplotlib, Seaborn – 데이터 시각화
- Scipy – (초기 시도) 신호 필터링
4. 데이터 수집 및 전처리 (The Process)
CSI 데이터 수집:
- iwl-csi-tool을 사용해 **송신기(AP)**와 **수신기(Station)**를 설정
- 다양한 시나리오(한 명 걷기, 두 명 걷기, 앉았다 일어나기 등)에서 .dat 파일 형태로 데이터 수집
데이터 파싱 및 정제:
- .dat 파일을 Python에서 NumPy 배열로 파싱
- 노이즈 제거 (이상치 제거 및 평활화 필터 적용)
- 진폭(Amplitude) 기반으로 의미 있는 신호만 추출
5. 핵심 트러블슈팅: 왜 Scipy 대신 NumPy를 선택했나? 🚀
🔹 초기 접근 (Scipy 활용)
처음에는 scipy.signal의 버터워스 필터와 사비츠키-골레이 필터를 사용했습니다.
🔹 문제점: 성능 저하 (The Bottleneck)
- CSI 데이터는 초당 수백~수천 패킷이 발생
- Scipy 필터는 범용적이지만 실시간 처리 시 속도가 매우 느림
- 프로파일링 결과, scipy.signal 함수가 병목 구간으로 확인됨
🔹 해결 과정: NumPy로 전환
- Scipy는 정교하지만 오버헤드가 큼
- 우리의 목표는 실시간성에 초점 → 더 가볍고 빠른 방법 필요
- **NumPy의 np.convolve**를 이용해 **이동 평균 필터(Moving Average Filter)**를 직접 구현
🔹 문제점: 정확도 부정확
- 사람이라는 조건을 판단할 데이터가 부족 보통 딥 러닝으로 학습된 모델로 사람을 판단해야하지만 학습자료가 없고
원시 데이터로 순수 알고리즘을 통한 사람판단 = 정확도 저하
🔹 해결 과정: 사람을 판단하는 요구사항을 완화
- 동작하는 물체의 크기를 가늠할 수 있도록 스캔된 방향의 센서 데이터간 간격이 특정 숫자 이하일 경우 하나의 객체(사람)라 판단하고 사람 수 를 카운트 하도록.
🔹 결과 및 교훈
- NumPy 기반 필터로 N배 속도 향상, 준-실시간 분석 가능
- "항상 최고의 도구가 최적의 도구는 아니다"
- 프로젝트 요구사항(특히 성능)에 맞는 적절한 기술 선택의 중요성을 체감
- 1대의 AP로는 인식 성공률이 굉장히 낮음 수신기, 송신기를 1대씩 최소 2기 이상 배치해야 성공률을 20% 이상 끌어올릴 수 있을거라는 판단.
6. 동작 분석 및 시각화 (Results & Visualization) 📊
특징 추출 (Feature Extraction)
- 정제된 CSI 진폭 데이터의 분산(Variance) 또는 **표준편차(Standard Deviation)**를 계산
- 변동성이 큰 구간 → 움직임 발생으로 판단
인원 수 추정
- 움직임 감지 시 분산 값의 크기를 기반으로 인원 수 추정
- (예: 1명 vs 2명 임계값 설정)
- 환경에 따라 정확도 편차 존재 (한계점 명시)
이동 경로 시각화
- 여러 안테나의 신호 세기 차이 또는 PCA 기반으로 2D 매핑
- Matplotlib.animation을 활용해 시간에 따른 경로 변화를 동적으로 표현
7. 결론 및 향후 과제 (Conclusion & Future Work)
✅ 프로젝트 요약
- 일반용 WiFi 칩셋 AX210만으로 추가 센서 없이 사람의 움직임 감지 및 시각화 가능함을 확인했습니다 하지만.. 초기 정보를 많이 알아봤어야했는데 AP를 2대를 사용해 수신기, 송신기로 구축해 사용했어야 했는데 1대의 AP로 테스트하니 굉장히 부정확한 데이터가 산출되었습니다 또한 사람이라는걸 인식하는 과정에서 원시데이터로는 한계가 있다는 점, 딥러닝 등 학습된 모델이 있어야 50%이상의 인식 성공률을 나타낼 수 있을거라는 판단과 함께 1대 AP에서 인식 성공률은 1~3%대로 나타났습니다
또한 이 1~3%도 정확한 인식이라는걸 보장하기 어렵다는것
꾸준하게 테스트해볼 예정입니다.