ONE VEHICLE · ONE STATE · EVERY SURFACE

Wayon

차량이 이해한 상태를 HUD, 빛, 클라우드, 휴대폰과 워치까지 하나의 경험으로 연결하는 통합 시스템.

47추가 커밋
105변경 파일
17,461추가 라인
6연결 런타임
SCROLL TO EXPLORE

WHAT IS WAYON

차량의 상태를
하나의 경험으로.

Wayon은 단순한 오픈파일럿 포크나 하나의 앱이 아닙니다. 차량 CAN과 레이더, Comma의 주행 상태를 해석해 운전자에게 필요한 순간과 화면으로 전달하는 통합 계층입니다.

01READ

차량을 읽습니다.

GM SDGM의 CAN, 레이더 track, Comma 모델과 주행 상태를 각 소스의 원래 주기로 수신합니다.

Vehicle · Radar · Comma
02INTERPRET

운전 맥락으로 바꿉니다.

인게이지, 정차, 차선 접근, 카메라 과속과 운전자 상태를 하나의 일관된 Wayon state로 정리합니다.

Sunnypilot · Events · Context
03EXTEND

차 밖까지 이어집니다.

Navdy HUD와 앰비언트 라이트, Wayon Cloud, My Traverse, Wear와 CommANav가 같은 상태를 각자 필요한 방식으로 표현합니다.

HUD · Light · Cloud · Mobile
CONTROL BOUNDARY

Wayon의 표시·텔레메트리 확장은 비동기 소비자로 분리됩니다.

차량 제어와 safety 경로는 Sunnypilot의 기존 루프를 유지합니다.

SYSTEM MAP

한 대의 차.
여섯 개의 런타임.

Wayon은 단일 앱이 아니라 차량과 화면, 클라우드 사이의 책임을 분리한 시스템입니다. 아래 노드를 눌러 실제 데이터 흐름과 소스 경계를 확인할 수 있습니다.

01

PRIMARY SOURCE

차량 네트워크

GM SDGM에 연결된 Panda가 파워트레인·레이더 CAN을 수신합니다. 조향과 종방향 제어 경로는 Sunnypilot의 기존 안전 경계를 유지하고, Wayon 기능은 상태를 읽는 수동 소비자로 붙습니다.

Interface
CAN · Panda
Cadence
100 Hz state mirror
Source
opendbc / carstate.py
01

제어와 표시 분리

Navdy·Cloud가 실패해도 차량 제어 루프는 기다리지 않습니다.

02

최신 상태만 전달

대기열을 쌓지 않고 가장 최근 payload 하나를 유지합니다.

03

Onroad 부하 제한

영상 대신 수치·기하만 전송하고, Cloud는 30초 저주기로 동작합니다.

04

실패 경로 명시

Socket, ADB fallback, heartbeat, offroad remote가 각각 복구 경계를 가집니다.

SUNNYPILOT / WAYON LAYER

운전 경험은 바꾸고,
제어 경계는 지켰습니다.

순정 release-mici 위에 축적해 온 한국어 UI와 운전자 상태 경험을 통합하고, Navdy·Cloud·레이더 경고는 제어 루프 밖에서 소비하도록 분리했습니다.

Wayon한국어 이벤트 레이어

EVENT RENDERER

운전자 주의가 필요합니다

전방을 주시하세요

가나다 123Pretendard SemiBold
휴대폰 감지 아이콘

DRIVER MONITORING

휴대폰 감지 유지

시뮬레이션 토글은 DM 경고만 억제하고 감지 신호는 전방 위험 판단에 남깁니다.

오토홀드 아이콘

STANDSTILL

00:18

Wayon 오토홀드 타이머

RADAR LANE INTRUSION

측면 차량 접근

레이더 track 안정성·횡방향 속도·차선 경계를 함께 검사합니다.

01

843개 이벤트 오버라이드와 Pretendard 렌더링

KOREAN UI

문구뿐 아니라 크기와 위계까지.

app_ko.po 번역, 시스템 문자열 보강, mici_event_alert_overrides.json의 이벤트별 폰트 크기를 함께 적용했습니다. 글꼴은 Wayon의 Pretendard SemiBold atlas를 사용합니다.

구현 파일selfdrive/ui/translations/app_ko.po
selfdrive/ui/mici/mici_event_alert_overrides.json
selfdrive/ui/mici/onroad/alert_renderer.py

PHONE-AWARE DM

테스트 모드에서도 위험 신호는 남깁니다.

SimulationIgnorePhoneDM이 켜지면 휴대폰 자체로 인한 DM 경고는 억제하지만 distractedTypes.phone은 계속 publish합니다. 전방 차량이 급격히 가까워질 때는 별도 phoneLeadClosing 이벤트를 만듭니다.

판정 경계

휴대폰 감지, 레이더 상대 속도, 거리와 TTC를 조합하며 동일 경고는 cooldown으로 제한합니다.

AUTOHOLD TIMER

정차 상태를 운전자 언어로 다시 표현.

resumeRequired 이벤트 자체는 유지하되 Mici에서는 Wayon 전용 오토홀드 타이머로 렌더링합니다. Navdy에만 Resume 배너가 가지 않도록 serialization 경계에서 별도로 숨깁니다.

안전 불변조건

이벤트를 selfdrived에서 제거하지 않습니다. 제거하면 저속 조향 상태와 타이머 조건까지 깨지므로, 출력 장치별 renderer에서만 표현을 바꿉니다.

RADAR LANE RISK

차선 침범을 ‘위치’가 아니라 ‘추세’로 봅니다.

최대 60 m 안의 안정된 radar track에 대해 차선 대비 횡위치와 횡속도를 추적합니다. 경계 접근은 Navdy 차선 색으로, 지속 침범은 radarLaneIntrusionSP 이벤트로 전달합니다.

구현 파일sunnypilot/selfdrive/controls/lib/radar_lane_intrusion.py
selfdrive/selfdrived/selfdrived.py
selfdrive/selfdrived/test_radar_lane_intrusion_event.py

WAYON SOUND SET

같은 상황, 더 짧고 분명한 피드백.

Wayon의 48 kHz mono PCM 경고음 세트를 Sunnypilot 자산으로 교체했습니다.

WAYON CLOUD

차에서 내려도,
차량은 하나의 상태로 남습니다.

Comma의 저주기 telemetry와 route, Firebase 차량 진단을 Cloudflare Worker가 한 화면으로 합칩니다. Onroad에서는 가볍게, Offroad에서는 route 정리와 스냅샷을 수행합니다.

Wayon · Vehicle Console
Wayon Cloud 실제 대시보드 화면
현재 배포 중인 Wayon Cloud UI · 연결 자격 정보와 위치는 제외
01

Live state

시동, onroad, openpilot enabled, 차량 속도, Comma 전압·전류·열 상태를 D1의 최신 상태로 저장합니다.

02

Trips

route log를 요약해 거리·시간·평균/최고 속도와 최대 720개 경로 point를 기록합니다.

03

Snapshots

Offroad에서 wide/driver camera JPEG을 만들고 KV에 저장하며, 메타데이터만 D1에서 조회합니다.

04

Vehicle status

Firebase car_status의 연료, 주행 가능 거리, 타이어, 배터리와 Wayon state를 브라우저에서 합성합니다.

작업OnroadOffroad부하 경계
Telemetry30초300초최소 5초 제한
Route point10초 또는 15 m정리최대 720 point
Route summary기록만60초 확인종료 후 45초 grace
Camera snapshot없음1시간최소 5분 제한
Comma uploaderBearer upload
Cloudflare WorkerAPI + dashboard
D1state · trips · metadata
KVJPEG snapshots
FirebaseTraverse diagnosis

MOBILE SURFACES

같은 차량을 보는
서로 다른 화면.

My Traverse는 차량 진단과 원격 명령, CommANav는 Tmap 안전운전 정보를 담당합니다. 휴대폰과 워치는 Comma 제어 루프에 들어가지 않고 별도 사용자 경험 계층으로 남습니다.

My Traverse 차량 진단 화면
My Traverse 메인 차량 화면

MY TRAVERSE

차량의 현재가 시작되는 메인 화면.

현재 상태, 마지막 위치와 원격 명령을 한 흐름에 배치합니다. Android WebView와 Kotlin native bridge가 Firebase 상태를 화면, 홈 위젯과 Wear Data Layer의 같은 snapshot으로 갱신합니다.

Vehicle health연료·주행거리·오일·12 V·TPMS
Remote commands시동·도어·트렁크·공조 macro
Parking location마지막 위치와 reverse geocoding
Widgets & WearRemoteViews·Tile·4개 complication
앱 내부 데이터 경로Firebase /car_status → ValueEventListener
→ WebView javascript update
→ widget_data SharedPreferences
→ Wearable Data Layer /status
→ Wear Tile + complication refresh
TRAVERSE주행가능거리610
연료 65%배터리 81%

WEAR OS

앱을 열지 않아도 새로워지는 차량 정보.

Tile은 요청 순간 WearStatusRefresh를 호출하고 15분 freshness를 선언합니다. 워치페이스에는 상태, 연료, 주행 가능 거리, 배터리 전압 complication provider가 각각 등록됩니다.

15 minTile freshness4Complications2 pathsPhone + Firebase

COMMANAV

Tmap의 도로 맥락을 Navdy로.

폰에서 Tmap EDC의 SDI를 정규화하고 Navdy protobuf notification frame으로 바꿔 Bluetooth RFCOMM에 씁니다. 고정식·이동식·박스형·구간단속을 같은 HUD 이벤트 계약으로 다룹니다.

고정식이동식박스형구간단속
전송 규격RFCOMM UUID 1992B7D7-C9B9-4F4F-AA7F-9FE33D95851E
Frame 0x0D + little-endian length + protobuf event
Duplicate suppression 1,000 ms
CommANav가 전달한 카메라 정보를 표시하는 Navdy 화면
Navdy 실기기 캡처 · 카메라 제한속도 0 / 320 m

AMBIENT CONTROL

차량 상태가
빛의 상태가 됩니다.

콤마는 Bluetooth를 직접 다루지 않습니다. 기어와 과속 상태가 Navdy까지 도착하면, Navdy 내부 AmbientLightController가 메인 모듈과 GATT 통신을 수행합니다.

ReverseOFF

blink와 밝기 동기화를 중지하고 즉시 소등 패킷을 보냅니다.

Park · N · DriveRESTORE

사용자 색과 현재 HUD 밝기를 복원합니다.

Camera overspeedRED BLINK

빨강과 원래 색을 1초 간격으로 교차합니다.

ReconnectREPLAY

현재 reverse·overspeed·active 상태를 다시 적용합니다.

Primary service0000ae30 … 34fb
Write / Notifyae01 / ae02
Reconnect5 s
Write timeout1.2 s
Queue cap20 packets

현재는 메인 모듈 하나를 제어하고 메인 모듈이 서브 모듈을 동기화하는 구조입니다. 서브 모듈 개별 제어에는 장치별 GATT connection, 역할 mapping, 독립 command queue가 추가로 필요합니다.

OPERATIONS & SAFETY

업데이트 후에도
돌아갈 길을 남겼습니다.

Wayon 서비스는 manager에서 자동 복구되고, 인터넷 원격 SSH는 offroad에서만 열립니다. 공식 comma 업로더와 Wayon 업로더도 동시에 돌지 않도록 명시적으로 분리했습니다.

ONROAD

주행 중

Navdy 5 Hz, Wayon telemetry 30초. remote tunnel과 snapshot은 닫힘.

6 SECOND GATE

Offroad 확인

IsOnroad가 6초 연속 false일 때만 Cloudflare Tunnel을 시작.

REMOTE

점검 모드

60초 signed protocol token과 WebSocket proxy로 localhost SSH에 연결.

WAKE

즉시 종료

IsOnroad가 바뀌면 tunnel을 닫고 주행 런타임으로 복귀.

바뀌지 않는 경계

01

Navdy·Cloud 오류는 controlsd, card, selfdrived의 주기를 기다리게 하지 않습니다.

02

레이더 침범 로직은 이벤트를 만들 수 있지만 CAN actuation 값을 직접 변경하지 않습니다.

03

차량 속도 보정은 cluster 표시 경로에 한정하고 조향·가감속 명령에는 적용하지 않습니다.

04

토큰·장치 ID·Firebase 자격 증명은 이 문서와 Git 자산에 포함하지 않습니다.

ENGINEERING RECORD

47번의 작고
검증 가능한 변화.

2026년 7월 7일부터 16일까지 순정 upstream/release-mici 위에 누적된 Wayon 변경입니다. 카테고리로 좁혀 실제 작업 순서를 볼 수 있습니다.

SOURCE OF TRUTH

다음 작업을 시작할 파일.

Navdy bridge
selfdrive/navdy/navdy_op_bridge.py
Navdy runtime
selfdrive/navdy/navdy_power_bridge.py
HUD Android patch
selfdrive/navdy/hud_patch/engaged-path-v7-alert-banner-speed-warning/
Wayon uploader
system/wayon_cloud_uploader.py
Cloud Worker
cloudflare/wayon-cloud/src/worker.js
Radar intrusion
sunnypilot/selfdrive/controls/lib/radar_lane_intrusion.py
Mici alerts
selfdrive/ui/mici/onroad/alert_renderer.py
Deep technical guide
selfdrive/navdy/README.md
확대 화면