Skip to main content
SYS.ONLINE

Reachy Mini × Strands Agent on Jetson Thor

The white Reachy Mini Lite robot with two large camera eyes, sitting on a desk beside an NVIDIA Jetson Thor developer kit
The Pollen Robotics Reachy Mini Lite beside the NVIDIA Jetson Thor that runs its on-device Strands Agent.

Overview

A Reachy Mini Lite desk robot driven by a Strands Agent that runs entirely on-device on an NVIDIA Jetson Thor. Say "Hey Reachy" (or publish an MQTT message) and a fresh agent wakes up, decides which tool it needs — see the room with a local vision model, express an emotion with a pre-choreographed move, move with composable head/body/antenna gestures, or answer questions about IoT sensor data in an AWS data lake — speaks one short sentence, and tears itself down.

Idle is pure-local and $0: no cloud, no LLM tokens, just an offline wake-word listener. The agent's brain defaults to a local Nemotron model via Ollama and its eyes are NVIDIA Cosmos Reason 2 running locally on the Thor GPU. Amazon Bedrock (Nova 2 Lite) remains an opt-in backend for the exact same agent and tools.

End-to-end system architecture: the Jetson Thor edge box running the per-wake Strands Agent, voice wake-word, face tracker, idle watcher, media bus, Cosmos vision and Piper TTS, with optional AWS cloud paths (IoT Core, Bedrock, S3, Athena and S3 Tables) and the Reachy Mini Lite hardware
The end-to-end system — everything in the blue box runs on the Jetson Thor, offline and $0. The AWS paths are entirely optional.

A build series, one part per feature as it landed in the repo:

  1. The foundation — driving Reachy Mini Lite with Strands Agent
  2. Bringing the robot to life — Reachy Mini Python SDK hardware self-test
  3. Offline "Hey Reachy" wake-up with Vosk (no LLM)
  4. Local vision with NVIDIA Cosmos Reason 2
  5. The voice-assistant loop — wake, look, speak
  6. Asking the robot about IoT data in S3 Tables — Athena & Iceberg Q&A
  7. A second trigger — AWS IoT Core MQTT
  8. 80 SDK-provided emotion moves, by sentiment and voice prefix
  9. Idle presence — noticing who's around (humans vs cats)
  10. Real-time face tracking with a single camera owner
  11. Going fully local — Nemotron on Ollama, Amazon Bedrock optional
  12. Robot-state telemetry to AWS IoT Core
  13. Recording interactions to S3 with presigned URLs
  14. The media bus — one owner per device, fan out to many
  15. Conversational memory + composable motion tools

Technologies Used

  • Compute: NVIDIA Jetson Thor (CUDA GPU, unified memory)
  • Robot: Pollen Robotics Reachy Mini Lite over USB (6-DoF head, antennas, body, camera, mic, speaker)
  • Agent: Strands Agent — a fresh per-wake agent with a hard model-call budget
  • Local LLM: Nemotron (nemotron-3-nano:30b) served by Ollama, function-calling enabled
  • Local VLM: NVIDIA Cosmos Reason 2 (nvidia/Cosmos-Reason2-2B, a Qwen3-VL model)
  • Wake word / STT: Vosk small English model (offline)
  • TTS: Piper (offline neural voice), falling back to espeak-ng
  • Cloud (optional): AWS IoT Core, S3, Lambda, Athena, S3 Tables / Apache Iceberg, Amazon Bedrock (Nova 2 Lite)
The on-device AI model stack running on the Jetson Thor: Nemotron via Ollama for reasoning, NVIDIA Cosmos Reason 2 for vision, Vosk for wake word and speech-to-text, and Piper for text-to-speech
The on-device AI stack — Nemotron (brain), Cosmos Reason 2 (eyes), Vosk (ears) and Piper (voice), all on the Thor GPU.

Key Features

  • Cost-minimal per-wake lifecycle — idle runs only the offline Vosk listener ($0); a brand-new agent exists only between wake and reply, then is torn down.
  • Local-first brain & eyes — Nemotron via Ollama for reasoning and Cosmos Reason 2 for vision, both on the Thor GPU; Amazon Bedrock Nova 2 Lite is a drop-in swap with identical tools and prompt.
  • Two trigger sources, one robot owner — an offline voice wake word and an optional AWS IoT Core MQTT subscription feed a single request queue drained by one worker, so the motors are never driven by two sources at once.
  • Expressive motion — ~80 pre-choreographed emotion moves plus six composable primitive motion tools (nod, shake, look around, wiggle antennas, spin body, move head).
  • Concurrent local loops — real-time face tracking (OpenCV) and an idle presence watcher (humans vs cats via Cosmos), sharing one camera owner.
  • Camera/mic media bus — one broker owns each single-opener device and fans the live stream out over Unix sockets with per-subscriber backpressure isolation.
  • Conversational memory across wakes — recent turns persist to local JSON (Strands Agent FileSessionManager), reboot-safe and still $0 at idle.
  • Optional AWS paths — robot-state telemetry to IoT Core, interaction clips recorded to S3 with presigned URLs, and IoT data-lake Q&A over Athena/Iceberg via Lambda.
The per-wake agent message flow: capture and route the request (offline, $0), build a fresh Strands Agent capped by a model-call budget, run its tools (vision, emotion, motion, data lake), then respond and tear the agent down
Each wake builds a brand-new agent, runs it under a hard model-call cap, and destroys it — capture & route → fresh agent → tools → respond & tear down.