63.9k 스타. $9짜리 ESP32 보드와 평범한 와이파이 라우터로 사람을 감지하고, 호흡과 심박을 재고, 자세까지 추정하는 오픈소스 공간 인텔리전스 플랫폼. 카메라도, 웨어러블도, 클라우드도 필요 없다 — 순수하게 전파 물리학으로.
상식 같지 않은 얘기지만, 물리적으로 자연스러운 발상이다.
방 안의 와이파이 공유기는 매 순간 라디오 전파를 사방으로 쏟아낸다. 사람의 몸은 70% 이상이 물이고, 물은 와이파이 주파수대(2.4·5 GHz)에서 전파를 흡수·산란시킨다. 그러니까 사람이 방 안에 있으면 — 가만히 숨만 쉬어도 — 와이파이 신호의 모양이 미세하게 바뀐다. 바뀌는 패턴을 읽으면 누가, 어디에, 어떤 자세로 있는지 거꾸로 복원할 수 있다는 것이 RuView의 출발점이다.
박쥐가 어두운 동굴에서 길을 찾는 원리와 비슷하다. 박쥐는 초음파를 쏘고, 돌아오는 메아리의 모양으로 동굴의 형태와 거기 있는 곤충을 "본다". RuView는 와이파이 라우터가 이미 쏘고 있는 전파를 박쥐의 초음파처럼 활용한다. 차이점은 박쥐는 자기가 직접 신호를 쏘지만, RuView는 옆집·아래층 라우터까지 공짜 레이더 송신기로 빌려 쓴다는 점이다.
이 프로젝트의 본질.
RuView(π RuView)는 평범한 와이파이 라우터의 전파 + $9짜리 ESP32 센서 메시 + 8KB 짜리 신경망으로 "누가 거기 있고, 어떻게 숨 쉬고, 어떻게 움직이는지"를 실시간으로 알아내는 오픈소스 플랫폼이다. 모든 연산은 엣지(ESP32 + 라즈베리파이)에서 끝난다 — 클라우드·인터넷·앱 설치 없음.
전체 BOM(자재비)이 $54~$140이고 라이선스는 MIT. 의료(독거노인 낙상 감지), 보안(벽 너머 침입 감지), 재난 구조(잔해 속 생존자 호흡 감지), 로봇(LiDAR가 못 보는 사각지대) 같은 영역을 비-침습적으로 자동화한다.
2026년 5월 23일 현재, TrendShift 데일리 6위에서 받는 시선.
2024~2025년에 학계에서는 "WiFi sensing"이라는 분야가 조용히 익어 가고 있었다. MIT·CMU·중국 칭화대에서 논문 수십 편이 쏟아졌고, MediaPipe 자세 추정을 카메라가 아닌 와이파이로 복원하는 데까지 도달했다. 그런데 학계 코드는 "리서치 NIC(인텔 5300 카드) + 리눅스 커널 패치 + 매트랩" 같은 진입 장벽이 있어서 개인이 따라 만들기가 힘들었다.
RuView는 이 장벽을 한 번에 무너뜨린다. 학계 리서치를 $9 ESP32 펌웨어 한 번 굽기로 압축한 것이다. 게다가 105개의 "엣지 모듈(Cog)" 카탈로그가 따라온다 — 호흡 감지부터 침입 탐지, 가축 모니터링, 양봉 벌통 상태 분석까지 — 그냥 골라서 깔면 된다.
와이파이 전파는 벽·셸빙·먼지·연기·완전 어둠을 통과한다. 카메라는 라인 오브 사이트(직선 시야)가 막히면 무용지물이지만 RuView는 콘크리트 30cm 너머의 사람 호흡까지 잡아낸다(WiFi-Mat 재난 구조 모듈, ADR-001 참고). 화재 현장에서 연기 너머 생존자를 찾거나, 광산 매몰 사고에서 흙 너머 생체 신호를 잡는 시나리오에 직접 적용된다.
카메라는 GDPR(유럽 개인정보보호법) 영상 조항, HIPAA(미국 의료 정보법) 이미지 조항의 직접 적용 대상이다. 그래서 의료 시설·교실·화장실·탈의실에는 못 단다. RuView는 영상 픽셀이 0개이기 때문에 같은 규제를 자연스럽게 비켜간다. 요양원에서 노인 낙상을 24시간 모니터링하고 싶은데 카메라 설치 동의를 받기 까다로운 상황 — 정확히 이 시장을 노린다.
방마다 카메라를 설치하면 한 곳당 $200~$2,000이 든다. RuView는 이미 있는 와이파이 라우터를 신호원으로 쓰니까 설치비가 0이다. 추가하는 건 한 방에 $8짜리 ESP32 하나뿐. 사옥 전체 점유율 모니터링을 $300으로 끝낼 수 있다는 얘기다. "기존 자원을 재활용한다"는 발상은 PIR 동작 감지 센서나 mmWave 레이더로는 안 되는 차별점이다.
일반적인 머신러닝 모델은 새 환경(다른 방, 다른 가구 배치)에서 정확도가 뚝 떨어진다. RuView는 스파이킹 뉴럴 네트워크(SNN)로 30초 안에 새 환경의 RF 지문을 학습한다. 그리고 "MicroLoRA" 라는 1,800 파라미터짜리 초소형 어댑터로 환경별 미세조정을 한다 — 모델 전체 재훈련의 7%만으로.
레포에 plugins/ruview/ 폴더가 있어서 /plugin marketplace add ruvnet/RuView 한 줄로 Claude Code에 등록된다. 9개 스킬·7개 슬래시 커맨드(/ruview-flash·/ruview-app·/ruview-train 등)·3개 에이전트가 묶음으로 설치된다. ESP32 펌웨어 빌드와 와이파이 프로비저닝부터 모델 학습까지 모두 AI 코딩 어시스턴트가 가이드한다. Codex CLI용 프롬프트도 미러링돼 있다.
README 첫 줄에 직접 적혀 있다 — "APIs and firmware may change". 카메라 없이 학습한 자세 추정 정확도(PCK@20)는 2.5%로, 카메라 기준 35%+에 한참 못 미친다(개발 중). 또 ESP32-C3나 초기 ESP32는 싱글코어라서 CSI 처리가 불가능하다(반드시 ESP32-S3). 단일 ESP32 노드 배치는 공간 해상도가 낮으니 최소 2개 이상 메시를 권장한다.
(1) 일단 체험하고 싶다면 → Docker로 시뮬레이션 데이터 ($0). (2) 진지하게 한 방 모니터링 → ESP32-S3 메시 3~6개 ($24~$54). (3) 영구 메모리·암호 출처 인증·MCP 프록시까지 → Cognitum Seed 어플라이언스 추가 ($140 BOM). 처음부터 풀세트로 갈 필요 없이 단계적으로 확장 가능.
RuView 안에는 펌웨어·신호처리·머신러닝·웹 대시보드·CLI 플러그인이 한 덩어리로 들어있다.
레포 언어 비중을 보면 Rust 50% + JavaScript 16.6% + Python 15.9% + TypeScript 7.4% + C 3.6% + Shell 2.9% 다. 즉 "고성능 신호처리·ML 코어는 Rust", "ESP32 펌웨어는 C/C++", "데이터 사이언스 훈련 스크립트는 Python", "대시보드·라이브 데모는 JS/TS"라는 다층 폴리글랏 구조다. 한 군데 한 군데가 모두 학습 거리다.
firmware/esp32-csi-node/에 펌웨어 본체ruvnet/ruvector. 어텐션·그래프·압축·필드 모델을 묶은 신호처리 라이브러리ruvnet/rvcsi. CSI 인제스천 → 검증 → DSP → 이벤트 변환을 추상화한 9개 크레이트, vendor/rvcsi에 벤더링safetensors 모델을 로드해 추론app-registry.json으로 OTA 배포되는 Cog 마켓플레이스.claude-plugin/marketplace.json + 9 스킬 + 7 슬래시 커맨드 + 3 에이전트docker pull ruvnet/wifi-densepose:latestwifi-densepose + crates.io wifi-densepose-ruvector — 언어별 표준 배포"RuView를 단일 제품"이라고 부르기보다는 "WiFi 센싱 운영체제" 라고 보는 게 정확하다. 안드로이드가 커널(Linux) + AOSP(Java/C++) + 런타임(ART) + 앱 마켓(Play Store) 4층으로 돼 있듯, RuView도 펌웨어(ESP32-IDF) + 신호처리(Rust) + 모델(HF) + 앱 마켓(Cog Catalog) 4층이다. 그리고 각 층마다 서드파티가 자기 앱을 올릴 수 있게 표준 인터페이스를 정의했다(ADR-100 Cog Packaging Spec).
WiFi 전파에서 인간 자세까지, 데이터가 어떻게 흐르는가.
README의 "How It Works" 섹션에 핵심 파이프라인이 그림으로 나와있는데, 이걸 한국어로 그대로 옮기고 각 단계를 풀이해보자.
전통적 레이더는 한 송신기 + 한 수신기(모노스태틱)다. 멀티스태틱은 여러 송신기와 여러 수신기를 동시에 쓴다. RuView는 모든 ESP32 노드가 서로의 신호를 보면서 그 차이를 학습한다. N×(N-1)개의 송수신 페어가 만들어 내는 다각도 관측 데이터를 어텐션 메커니즘으로 융합해 단일 카메라보다 풍부한 3D 정보를 복원한다.
와이파이는 2.4GHz 대역에 채널 1, 6, 11 같은 비중첩 주파수가 있다. ESP32 메시는 이 세 채널을 시간 분할로 빠르게 오가면서(채널 홉핑), 한 시점에 한 채널씩만 듣는다. 결과적으로 한 채널만 듣는 단일 노드보다 3배의 센싱 대역폭을 확보한다. 또 옆집·아랫집의 라우터까지 무료 송신기로 활용한다.
전파 환경은 매우 변덕스럽다 — 누가 옆 방에서 문을 닫거나, 비가 오거나, 에어컨이 켜지면 신호 패턴이 흔들린다. Coherence Gate는 매 측정마다 신호의 "결맞음 정도"를 평가해 일정 임계치 이하면 버린다. 덕분에 시스템이 며칠 동안 재튜닝 없이 안정 동작한다.
56채널 CSI 입력을 Transformer + Graph Neural Network로 인코딩한 다음, 출력 헤드를 두 개로 분기한다 — 하나는 17개 관절 좌표를 내놓고, 다른 하나는 128차원 환경 지문을 내놓는다. 같은 연산으로 사람 추적과 방 식별을 한꺼번에 해결하는 효율적 설계다.
전통적 ML은 라벨링된 데이터셋이 필요하다. RuView의 사전훈련은 라벨이 없다 — 그냥 방 안에서 와이파이를 한 동안 듣게 두면 모델이 "이 신호와 저 신호가 비슷한지, 다른지"를 스스로 학습한다(contrastive learning). 6만 프레임·61만 contrastive 트리플렛 · 1,220만 학습 스텝 후 검증 정확도 82.3% (held-out temporal-triplet accuracy, 2026.05 재벤치마크 기준; 구 100% 수치는 단일 클래스 녹음 결과로 공식 철회됨).
iOS 앱스토어 / 안드로이드 Play Store처럼, Cognitum Seed 어플라이언스에는 105개의 작은 모듈이 OTA로 설치된다. 각 모듈은 ~400KB짜리 서명된 바이너리고, Ed25519 서명으로 위변조를 막는다. 헬스(낙상 감지·심장 부정맥), 보안(침입·총소리), 빌딩(엘리베이터·HVAC), 리테일(고객 유동·대기열), 산업(지게차 근접·청정실), 연구(수화·감정), AI(연합학습·EWC 평생학습) 등 카테고리별로 정리돼 있다.
레포 톱 레벨에 있는 33개 폴더 중 핵심만.
특히 주목할 것은 docs/adr/ 폴더의 96개 ADR이다. ADR(Architecture Decision Record)은 "왜 이 기술을 골랐는가"를 결정 단위로 기록하는 문서 형식. RuView는 WiFi-Mat(ADR-001), 자기지도 CSI 임베딩(ADR-024), 도메인 일반화(ADR-027), 멀티주파수 메시(ADR-029), 라이브 ESP32 파이프라인(ADR-059), 카메라 GT 학습(ADR-079), Cog 패키징(ADR-100), Cog 등록(ADR-102) 등 의사결정의 근거가 모두 공개돼 있다. 이런 문서화 수준은 보통 학계 프로젝트에서 보기 힘들다.
RuView 코드를 뜯어보며 무엇을 익힐 수 있는가.
호흡 감지의 핵심은 "위상 변화 패턴"을 시간축으로 보고 0.1~0.5Hz 대역만 통과시키는 밴드패스 필터다. 심박은 0.8~2.0Hz 대역. 이런 신호처리 ABC를 RuView 코드 한 군데(v2/crates/wifi-densepose-sensing-server/src/dsp/)에서 실전 구현으로 볼 수 있다.
실습 아이디어 — Python으로 SciPy scipy.signal.butter 밴드패스 필터를 만들어 사인파에 더해 본 노이즈에서 호흡 주기를 추출해보기. 이게 되면 실제 CSI 시뮬레이션 데이터로 옮겨가기.
Hugging Face Candle은 PyTorch와 비슷한 API의 Rust ML 프레임워크다. RuView는 Candle로 pose_v1.safetensors 모델을 ESP32보다 큰 라즈베리파이에 올려 8.4ms 콜드 스타트를 달성한다. Rust로 ML 추론을 배우고 싶다면 v2/crates/cog-pose-estimation/ 코드가 좋은 교과서.
실습 아이디어 — Candle 예제(cargo run --example mnist)부터 따라하고, 사전훈련된 ResNet-18 모델을 다운로드해 Rust로 추론까지 한 사이클 돌려보기.
ESP32-S3 펌웨어 작성을 처음 해본다면 RuView의 firmware/esp32-csi-node/가 좋은 시작점. ESP-IDF(Espressif IoT Development Framework)는 C/C++ + FreeRTOS 기반인데, provision.py처럼 Python으로 와이파이 자격증명을 주입하는 패턴도 익힐 수 있다.
실습 아이디어 — $9짜리 ESP32-S3 보드 하나 사서 blink.c부터 굽기. 그 다음 시리얼로 "Hello"를 출력하는 펌웨어. 마지막에 RuView 펌웨어를 그대로 굽고 CSI 데이터가 USB-Serial로 흘러나오는 걸 확인.
SimCLR·MoCo 같은 contrastive 학습은 ChatGPT·DALL·E 같은 모델의 사전훈련에 쓰이는 핵심 기법. RuView의 ADR-024 문서는 CSI 신호에 contrastive 학습을 적용하는 구체적 절차를 단계별로 적어놨다.
실습 아이디어 — PyTorch Lightning 튜토리얼에서 SimCLR을 CIFAR-10으로 돌려보기. 그 후 ADR-024를 읽고 "이미지가 아니라 시계열 신호에 같은 아이디어를 어떻게 적용할까"를 노트로 정리.
RuView 같은 큰 오픈소스 프로젝트가 "왜 이렇게 폴더를 나눴는가"를 8개 DDD 모델과 96개 ADR로 설명한다. 이 정도 규모의 코드베이스를 어떻게 사람이 이해 가능한 형태로 문서화하는지가 실전 교과서다.
실습 아이디어 — 본인 진행 중인 사이드 프로젝트에 docs/adr/0001-why-we-use-xxx.md 같은 문서를 하나라도 만들기. 미래 자신이 가장 고마워할 일이다.
RuView의 plugins/ruview/ 폴더는 Claude Code 플러그인의 좋은 레퍼런스. .claude-plugin/marketplace.json + 스킬 디렉토리 + 슬래시 커맨드 + 에이전트 정의의 전체 구조를 볼 수 있다. AI 코딩 어시스턴트에 자기 워크플로를 통합하고 싶다면 이게 시작점.
실습 아이디어 — 자기 자주 쓰는 리포의 워크플로(빌드 → 테스트 → 배포)를 Claude Code 슬래시 커맨드 3개로 묶기. /myproject-build·/myproject-test·/myproject-deploy 같은 형식.
MCP는 Anthropic이 2024년에 발표한 LLM-도구 통합 표준 프로토콜. RuView는 Cognitum Seed에 MCP 프록시를 둬서 Claude 에이전트가 센서 데이터에 직접 질의하게 한다. "지금 거실에 사람 있어?"를 Claude가 MCP로 RuView에 묻고 답하는 패턴.
실습 아이디어 — @modelcontextprotocol/sdk로 MCP 서버 하나 만들기. "방 안 온도 알려줘" 같은 더미 도구부터. 그 다음 Claude Desktop에 등록해 자연어로 호출해보기.
실제로 돌리려면 무엇이 필요한가.
docker run -p 3000:3000 ruvnet/wifi-densepose:latest 한 줄로 시작싱글 코어이고 RAM이 부족해 CSI DSP 연산을 따라잡지 못한다. 보드 사기 전에 반드시 "ESP32-S3" 글자가 박혀 있는지 확인할 것. 일반적으로 보드 이름이 "ESP32-S3-DevKitC-1" 같은 형식이다.
"벽 너머 사람을 감지한다"는 기능은 국가에 따라 무선 통신법·프라이버시법·도청법 등의 적용을 받을 수 있다. 본인 집·본인 사무실에서 본인이 모니터링되는 건 문제 없지만, 옆집·옆 사무실·공공장소를 감시하면 법 위반이다. 의료용으로 쓰려면 식약처(KFDA)·FDA 등 의료기기 인증이 별도로 필요하다.
docker pull ruvnet/wifi-densepose:latest → docker run -p 3000:3000 ... → 브라우저에서 localhost:3000 접속. 시뮬레이션 데이터로 자세 스켈레톤이 움직이는 걸 확인하고, UI 구조와 API 엔드포인트(/api/v1/...)를 탐색.
python archive/v1/data/proof/verify.py 명령으로 신호처리 파이프라인이 제대로 동작하는지 검증할 수 있다. 출력 로그를 한 줄씩 따라가며 어떤 알고리즘 단계가 무엇을 하는지 추적.
esptool로 펌웨어를 굽고 provision.py로 와이파이 자격증명 주입. 그 다음 라이브 RF 스캔 스크립트(node scripts/rf-scan.js)를 돌려 시리얼로 들어오는 CSI 패킷을 실시간 그래프로 확인. 빈 방과 본인이 들어간 방의 차이를 눈으로 봐라.
node scripts/snn-csi-processor.js --port 5006 실행 → 본인이 누워서 호흡할 때 BPM이 6~30 범위 안에서 잡히는지 확인. 0.1~0.5Hz 밴드패스 필터의 계수를 바꿔보며 출력 정확도 변화 관찰.
v2/crates/cog-pose-estimation/을 템플릿 삼아 자기만의 Cog를 작성. 예: "고양이 감지 Cog" — 사람 자세 모델을 사족 보행 동물 자세로 fine-tune. Ed25519로 서명해 로컬 어플라이언스에 설치까지.
RuView가 다루는 모든 분야를 3개월 안에 훑는 주차별 계획.
OFDM(직교 주파수 분할 다중화) 변조 방식부터 시작. 802.11 a/b/g/n/ac 표준의 차이. RSSI vs CSI의 본질적 차이. 추천 자료: IEEE 802.11n 표준 요약본 + Halperin et al. "Tool Release: Gathering 802.11n Traces with Channel State Information"(2011) 페이퍼.
푸리에 변환, 밴드패스 필터(Butterworth·Chebyshev), 위상 언래핑(phase unwrapping). Python의 scipy.signal로 사인파 + 노이즈에서 원 신호 복원 실습. 책: Steven W. Smith "The Scientist and Engineer's Guide to DSP"(무료 PDF).
Espressif 공식 튜토리얼 따라가기 — Hello World → GPIO → 와이파이 연결 → CSI 캡처. FreeRTOS 태스크 스케줄링 기본기. 결과물: 본인 ESP32-S3에서 CSI를 USB-Serial로 출력.
Rust 공식 책(The Rust Book) 챕터 1~10 + Tokio 비동기. Candle MNIST 예제 → ResNet 추론. RuView의 v2/crates/wifi-densepose-sensing-server/ 코드 정독.
SimCLR / MoCo / BYOL 논문 3편. PyTorch Lightning으로 CIFAR-10 SimCLR 학습 → t-SNE 시각화. RuView ADR-024 정독하며 "CSI에 적용된 변형 트릭"을 노트로.
EWC++ (Elastic Weight Consolidation) 논문 → MicroLoRA → MERIDIAN(ADR-027). 새 환경에 빠르게 적응하는 모델을 직접 구현. 한 방에서 학습한 모델이 다른 방에서도 동작하는가를 손으로 검증.
MCP 사양서 정독 → @modelcontextprotocol/sdk로 직접 서버 작성 → Claude Desktop에 등록 → 자연어로 호출. RuView의 Cognitum Seed MCP 프록시가 어떤 도구를 노출하는지 분석.
ADR-100 Cog 패키징 스펙을 따라 자기만의 모듈을 만들고 Ed25519 서명 후 로컬 어플라이언스에 OTA 배포. 가능하면 seed.cognitum.one/store에 출시 신청.
RuView 문서에 자주 등장하는 용어 정리.
RVFS) 버전과 JSONL 버전 두 가지가 있다. Hugging Face에 올라간 모델은 JSONL 형태(model.rvf.jsonl). 현재 sensing-server는 바이너리만 로드 가능한 알려진 갭이 있다.더 깊이 파고들 때 찾을 곳들.
공식 자료
모델 & 패키지
공부 자료