MADIYAR MUKANOV
[ Client Project · 2026 ]

Autonomous Robot Inspection
— Reading Instruments So a Person Doesn't Have To

A Unitree quadruped robot walks a fixed route through a facility, stops at instrument panels, photographs them, and reads what they say — gauges and digital displays alike. We built the layer that makes this possible on top of the robot's existing navigation stack, and the whole thing now runs unattended on the robot itself.

Metadata

ROBOT Unitree quadruped
ONBOARD COMPUTE NVIDIA Jetson
ROS 2 Humble
RECOGNITION Gemini Robotics-ER

Tech Stack

ROS 2 Humble BehaviorTree.CPP C++ Python FastAPI Docker MediaMTX
Robot navigating the route, live position on the map, camera feed — one continuous run
[ 01 ]

Concept

The client needed a way to inspect an industrial site without sending a person to walk the same round every shift: walk a route, stop at each instrument, record what it reads, hand the numbers to an operator. The robot itself could already move to coordinates — everything past that was manual.

A behavior tree only ever talks to navigation through its public interface, and nothing else assumes anything about how navigation works underneath.

[ 02 ]

Architecture

Web UI / API Client
REST API
FastAPI
Behavior Tree Executor
BehaviorTree.CPP, C++
Robot Navigation
Nav2 — existing stack

The route is an XML behavior tree, with custom nodes for moving to a target, checking battery, and requesting/holding permission to enter a zone — everything talks to navigation only through Nav2's own interface. A separate coordination service tracks which zones are occupied, so a robot waits its turn instead of abandoning the task. On arrival at each point, a separate inspection module grabs a frame from the robot's camera, sends it to Gemini Robotics-ER, and returns a structured reading — instrument type, value, unit, confidence.

[ 03 ]

Deployment

The stack runs identically in three places: a simulated robot for debugging, a server at a second site, and — the one that mattered most — packaged and running directly on the robot's onboard NVIDIA Jetson. Onboard, the robot completes its route without depending on a server at all.

Getting onto the robot was its own piece of work: a different processor architecture, a different base image, ROS networking pinned to the robot's specific interface, and an auto-restart on reboot so a power cycle doesn't require someone to SSH in and start it by hand.

[ 04 ]

Tech Stack

ROS 2 Humble · CycloneDDS C++ — tree executor & coordination Python — API & inspection module BehaviorTree.CPP 4.6 + ROS2 FastAPI / uvicorn Gemini Robotics-ER Docker / docker compose — x86 + ARM64 Nav2 — integrated with, not authored MediaMTX NVIDIA Jetson
arrow_back Back to Projects