← Back to projects

Venn: The Companion Robot

An open-source telepresence robot: a Raspberry Pi rover streaming live video and two-way audio over WebRTC, driven from a phone and expressing emotions on an OLED face.

An open-source telepresence robot: a Raspberry Pi Zero 2 W rover that streams live video and two-way audio over peer-to-peer WebRTC, takes driving commands back, and shows how it feels on a small OLED face.

WebRTCRaspberry PiPythonaiortcFastAPIReact NativeTypeScriptEmbedded Linux
Venn, the open-source telepresence robot, on its 2WD chassis

Operator Mobile Application

One landscape screen holding the video feed, two-way audio to talk to the robot, the joystick, the throttle and its face

Venn operator application: live video feed, joystick, throttle and emotion panel

Core Features

Mobility, presence and expression on budget hardware

Low-Latency WebRTC Video

A 480p H.264 feed from the Pi camera reaches the operator at 142 ms average glass-to-glass latency, comfortably under the 200 ms target set for fluid teleoperation.

38 ms Command Path

Joystick input travels as JSON over a WebRTC RTCDataChannel straight to the robot, reaching PWM output on the L298N driver in 38 ms — crisp steering with no visible lag or oversteer.

Affective OLED Interface

A 128x32 SSD1306 OLED on the I2C bus renders five expressions — happy, angry, neutral, sad, surprised — picked from the phone and drawn on the robot's face near-instantly.

Two-Way I2S Audio

An INMP441 MEMS microphone and a MAX98357 Class-D amplifier driving a 1W speaker carry conversation both ways over I2S, handled with ALSA on the Pi.

Raspberry Pi Zero 2 W Core

A headless Raspberry Pi OS Lite install runs a Python aiortc application launched by a systemd service on boot, multiplexing video, audio and control over a single peer connection.

Stable Power for 10.7 Hours

Two 18650 cells in series feed the L298N at 7.4V while an LM2596 buck converter holds the Pi's 5V rail within ±0.02V — about 10.7 hours idle and 4 hours under full streaming and driving load.

Hardware Integration

Venn hardware assembly on the 2WD chassis before the enclosure goes on

Venn's physical architecture is structured to optimize battery weight distribution, and ensure clean power delivery through buck converter stepping. A high-quality omnidirectional microphone and a digital amplifier are powered over I2S to ensure natural audio feedback.

Circuit Schema

Venn circuit schema: 18650 pack, buck converter, L298N, motors, I2S audio and OLED

The schematic highlights the circuit diagram connecting the Raspberry Pi Zero 2 W, the L298N driver, Sony 18650 Li-Ion batteries, digital MEMS INMP441, SSD1306 OLED, and speaker.

Project Description


Static IP cameras and fixed-angle home monitoring reduce remote presence to a passive, one-way task. Commercial telepresence robots that fix this, such as the Enabot EBO series, come at a high retail cost and lock users into closed, proprietary cloud ecosystems, while accessible DIY rovers built around microcontrollers like the ESP32-CAM keep costs down but treat the robot purely as a utilitarian surveillance tool, with no affective feedback for genuine social engagement.

Venn was built by a 5-person team to close that gap: an open-source telepresence platform that brings dynamic spatial mobility, low-latency bidirectional communication and an integrated affective interface together in one budget-friendly package. A Raspberry Pi Zero 2 W drives a 2WD chassis and opens a peer-to-peer WebRTC connection straight to the operator's phone, carrying live video, two-way audio and motor commands with no server in the data path, while a minimalist OLED face renders emotional expressions so remote interaction feels less like surveillance and more like presence.

Technology Stack


Robot (Raspberry Pi)

  • Python with the aiortc library, launched on boot by a systemd service and answering the phone's WebRTC offer.
  • Headless Raspberry Pi OS Lite (32-bit) on a Raspberry Pi Zero 2 W, with a 5MP Camera Module V1.3 on the CSI port.
  • ALSA (pyalsaaudio) for I2S capture and playback, PWM to the L298N for steering, and I2C to the SSD1306 OLED face.

Mobile Client

  • React Native with Expo and TypeScript, acting as the WebRTC offerer through react-native-webrtc.
  • React Native Gesture Handler and Reanimated behind the on-screen joystick that drives the robot.
  • Operator input packaged as JSON commands and sent straight down the P2P data channel, with no server in between.

Backend & Protocols

  • Python FastAPI exposing WebSocket endpoints as a rendezvous point for the robot and the phone.
  • WebRTC signalling over SDP offers and answers, with ICE candidates gathered through STUN.
  • One peer connection carrying a 480p H.264 video track, two-way audio and a JSON RTCDataChannel.