Tilbake til tidslinjen
hobby 2025

En RC-bil som ikke bryr seg om hvor langt du kjører

En langdistanse RC-bil som strømmer to kameraer over 4G, kjørt fra en PC hvor som helst på internett. Det interessante er ikke maskinvaren, det er nettverket: en egen UDP-hole-punching-protokoll så bilen og kontrolleren finner hverandre direkte, uten statiske IP-er, uten relé-servere, og med lavest mulig forsinkelse.

Førerstasjonen under kjøring: to store skjermer over en laptop, hver skjerm viser ett av bilens to kameraer (en lav frontvisning ned en vei og en bredere oversiktsvisning). Et bilde-i-bilde-overlegg i hjørnet viser den faktiske RC-bilen på asfalten ved siden av en sko. Laptopskjermen er delt mellom kode til venstre og live telemetri (styring, gass, akseverdier) til høyre.
Førerstasjonen. To kamerafeeds på skjermene, telemetri på laptopen, og et lite vindu med bilen et sted ute i byen.

Hvorfor dette ble vanskelig

Hjemme-5G var utløseren. De fleste mobilabonnementer sitter bak carrier-grade NAT, som betyr: ingen innkommende tilkoblinger, ingen statisk IP, ingen portforwarding. Den vanlige løsningen er en relé-server i midten, men en relé legger på forsinkelse, og forsinkelse er døden for RC-kjøring.

Protokollen

UDP-hole-punching

  • Begge endepunkter registrerer seg hos en lett rendezvous-tjeneste som kun utveksler offentlige IP- og portpar.
  • Hvert endepunkt sender så UDP-pakker mot den andres par. NAT-mappinger faller på plass på begge sider, og trafikken går P2P fra det øyeblikket.
  • Rendezvous-tjenesten er ute av bildet så snart håndtrykket er ferdig.

Reconnect og dårlige forbindelser

  • Periodiske keep-alives holder NAT-mappingene åpne.
  • Når linken faller, gjør begge sider et nytt håndtrykk uten at operatøren må gjøre noe.
  • Mottrykk på videopipelinen så et kort fall ikke gir en lang kø med utdaterte bilder.

Video

To kameraer på bilen (et primært frontkamera og et bredere oversiktskamera), kodet og sendt som parallelle UDP-strømmer. Mottakeren tegner begge feedene side om side. Encoder-bitraten tilpasser seg den målte linkkvaliteten så bildet brytes ned gradvis i stedet for å stoppe helt.

Web-dashbord med mørkt tema. Øverst til venstre: et live navigasjonskart over Trondheim med bilens rute tegnet i blått. Øverst til høyre: stor fart 53 km/t og batteriindikator 73,6 %. Under: et linjediagram for effektforbruk i watt. Til høyre vises systemtelemetri: odometer 1245,5 km, oppetid 00:00:27, nettverksping 21 ms, pakketap 0,02 %, omgivelse 12,5 °C, Raspberry Pi 45,0 °C, motor 86,4 °C, batteripakke 31,4 °C.
Operatørdashbordet. Posisjon, linkstatus og temperaturene som avgjør hvor lenge en kjøretur varer.
POV-bilde av to hender som holder en Nintendo Switch Pro-kontroller foran en krummet skjerm med live navigasjonskart.
Styreinput kan være hva sjåføren foretrekker: kontroller, ratt, tastatur.

Demoer

Tidlig innendørsdemo.

Utendørs, fulgt etter på sykkel.

Langdistanse. Kjørt ut av syne.

Hva jeg ville endret

Bytte til QUIC for videopathen, slik at jeg får køhåndtering og connection migration gratis. Legge på et forward-error-correction-lag for keyframes; å miste en keyframe på en dårlig link er fortsatt den verste feilmoden. Og, helt forutsigbart, gi bilen en bedre antenne.

Tilbake til tidslinjen