Bodie Hardware Overview: Anatomy of a Companion Rover

2026-03-15 4 min read
Bodie v0.1 schematic blueprint

What Is Bodie?

Bodie is an autonomous companion rover — a small indoor robot designed to navigate a home, recognize people and pets, respond to voice, and express itself through an animated face and R2-D2-style sounds. The name comes from “Body for Homie,” tying it to my broader Homie personal AI ecosystem.

The design philosophy is simple: cat, not chatbot. Bodie doesn’t talk. It chirps, whirrs, and emotes. It wanders with purpose but doesn’t demand attention. When it does something unexpected, the non-verbal personality makes that charming rather than unsettling.

This post walks through every major hardware component on the platform.

Chassis: Waveshare RaspRover

The foundation is a Waveshare RaspRover (SKU 26828, PT version) — a 4WD rover kit designed for the Raspberry Pi.

What you get out of the box:

  • 4x N20 encoder motors with PID closed-loop speed control
  • ESP32 sub-controller handling real-time motor control, IMU polling, and battery monitoring
  • Pan/tilt camera mount with ST3215 serial bus servos (20 kg·cm torque, 360° continuous rotation)
  • 9-axis IMU (ICM20948 — accelerometer, gyroscope, magnetometer)
  • INA219 battery voltage and current sensor
  • 3S 18650 battery module with simultaneous charge/discharge support
  • Built-in microphone array and dual-track speakers (SSS1629A5 codec + APA2068 amplifier)

The rover’s footprint is roughly 172mm × 182mm × 251mm and weighs about 1.3 kg fully loaded. Maximum speed is 0.65 m/s, though I cap it at 0.3 m/s for indoor safety.

The ESP32 communicates with the Pi 5 over GPIO UART at 115200 bps using a bidirectional JSON protocol. It also enforces a hard watchdog — if no motor command arrives within 500 ms, motors cut to zero. Safety by construction.

Compute: Raspberry Pi 5

The brain is a Raspberry Pi 5 (4GB) running Raspberry Pi OS (Debian Bookworm, 64-bit) with ROS 2 Humble.

4GB might sound tight, but the heavy inference work is offloaded to dedicated silicon (more on that below), and the tactical/strategic reasoning happens off-board. The Pi 5 handles sensor fusion, SLAM, navigation, and skill execution — plenty for 4GB.

Storage & AI Acceleration: Pimoroni NVMe Base Duo

This is where things get interesting. A Pimoroni NVMe Base Duo (PIM704) sits under the Pi 5, providing two M.2 slots through an onboard PCIe packet switch.

Slot 1: Crucial P310 1TB NVMe SSD

A compact M.2 2230 drive. The P310 is rated for 7,100 MB/s reads, but the Pi 5’s single PCIe Gen 2 x1 lane (shared through the packet switch) caps real-world throughput around 450 MB/s. Still dramatically faster than a microSD card, and 1TB gives room for ROS bags, model weights, and maps without worrying about space.

Slot 2: Hailo-8 M.2 AI Accelerator

26 TOPS of dedicated AI inference at just 2.5W typical draw. This runs YOLOv8s object detection compiled to Hailo’s HEF format, achieving roughly 13ms inference latency (~76 FPS). That’s real-time multi-object detection — people, pets, furniture — without touching the Pi 5’s CPU.

The Hailo-8 is the key enabler for running serious perception on a battery-powered rover. Without it, you’re stuck choosing between a stripped-down model that misses things or burning your entire CPU budget on inference.

LiDAR: Waveshare D500

A Waveshare D500 360° 2D DTOF laser scanner handles mapping and obstacle detection.

  • Range: 0.03–12m
  • Accuracy: ±10–30mm depending on distance
  • Points per scan: 2304 at ~10 Hz
  • Interface: UART at 230400 bps via USB-to-serial (CP210x)

Combined with SLAM Toolbox and Nav2 in ROS 2, this gives Bodie continuous 2D mapping and autonomous navigation with dynamic obstacle avoidance.

Display: 5.5” AMOLED Face Screen

A Waveshare 5.5” capacitive touch AMOLED (1080×1920, portrait orientation) serves as Bodie’s face. It connects via HDMI with USB for touch input.

The display renders animated expressions — eyes that track, blink, narrow, widen, and shift to convey emotional state. The AMOLED’s true blacks mean the bezels disappear in a dark room, so the eyes float on the chassis. It’s a small detail that makes a big difference in perceived personality.

Audio: Mic Array & Speaker

The original RaspRover ships with a built-in mic array and speakers, but I’m upgrading both for better voice interaction.

Microphone: ReSpeaker XMOS XVF3800 4-Mic Array

The XVF3800 processor provides AI-powered noise suppression and beamforming across four microphones. This is critical for a rover that generates its own motor noise — without hardware-level noise cancellation, wake word detection and speech recognition degrade fast.

Speaker: DUNGZDUZ Mini USB/Bluetooth Speaker

A compact dual-mode speaker (USB-A plug-and-play + Bluetooth) for emotive audio output. Bodie communicates through R2-D2-style chirps and tones generated by AudioLDM2, a text-to-audio diffusion model running on the local GPU server. The speaker needs to be small enough to mount on the chassis and loud enough to be heard across a room.

Power

The RaspRover’s built-in power system uses 3x 18650 lithium-ion cells in series (3S configuration):

  • Nominal voltage: 11.1V (12.6V full charge, ~9.0V cutoff)
  • Typical capacity: ~3500 mAh per cell → 38.9 Wh total, roughly 33 Wh usable
  • Runtime estimates: ~1.1 hours active navigation, ~2.8 hours idle/sentry, ~1.7 hours light patrol

The INA219 sensor gives real-time voltage and current readings, so Bodie can monitor its own energy state and (eventually) autonomously seek a charging dock when running low.

How It All Connects

The communication architecture follows a strict hierarchy:

ESP32  ──UART JSON (115200 bps)──▶  Raspberry Pi 5
                                        │
                              USB: LiDAR, Camera,
                              Display, Mic, Speaker
                                        │
                              WiFi ──▶  Local GPU Server
                                        │
                              HTTPS ──▶  Claude API

The ESP32 handles sub-10ms motor control and sensor polling. The Pi 5 runs ROS 2, fuses sensor data, and executes navigation. A local GPU server handles tactical LLM reasoning and audio generation over WebSocket. And Claude provides high-level goal-setting and memory consolidation over the API.

Each tier degrades gracefully. If the GPU server goes offline, Bodie continues its last task set. If the cloud is unreachable, the local LLM covers. If everything upstream fails, the Pi 5’s reflex layer keeps the rover safe and stationary.

What’s Next

Hardware is assembled and initial bring-up is underway. Upcoming posts will cover the software stack — ROS 2 configuration, Hailo-8 model compilation, the three-tier cognitive architecture, and the autonomous charging dock build.

More to come.