- It runs from your checkout. The container has no copy of the software
of its own — the
innate-osfolder you cloned during setup is mounted into it live, so editing files on your machine changes the running robot. No image rebuilds. workspace/is your part of it. Skills and agents are Python files inworkspace/custom_skills/andworkspace/custom_agents/, and the robot hot-reloads them the moment you save. Deeper changes — like the ROS nodes underros2_ws/— need a build step; the table further down covers what takes effect when.
A real robot runs the same
workspace/, so whatever you build against the
simulator deploys to hardware unchanged.Your first skill, end to end
Skills are Python classes the AI agent can call — the skills overview covers the full interface. The loop below takes about two minutes and exercises the whole pipeline: file watcher, hot reload, the web app, and the simulated base.Create the skill file
Create The agent reads your
workspace/custom_skills/victory_spin.py:execute() signature and docstring to learn how to
call the skill — type hints and the docstring are the API contract.Save — that's the whole deploy
The container watches
workspace/ and hot-reloads skills within a second
or two of saving. No build, no restart. If you want to see it happen:Trigger it
Open the web app, go to the skill menu, and run
victory_spin
(manual triggering) — the simulated
robot spins in the 3D view:Edit the file, save, trigger again: that’s the whole iteration loop.Hand it to an agent
Skills become interesting when an agent can decide to use them. Drop a minimal agent next door inworkspace/custom_agents/cheerful.py:
workspace/custom_skills/ are local/<name>, shipped ones are
innate-os/<name> — and get_skills() matches IDs exactly.
It hot-reloads the same way. Select Cheerful in the web app’s agent
picker, start it, and tell it in chat that you just merged a big PR — it
should decide, on its own, that the situation calls for victory_spin.
Watch its reasoning stream in the AI-thoughts panel.
Agent chat needs a brain backend — the hosted Innate service or a local
Gemini key, whichever you chose during
setup. See
Anatomy of an Agent for everything an agent
can define.
When do changes take effect?
| You edited | What to do |
|---|---|
skills or agents in workspace/ | nothing — they hot-reload on save |
ROS code in ros2_ws/src/ | inside the container: innate build, then innate restart |
| the simulated world itself | ./innate-sim down && ./innate-sim up — physics runs on the host |
Watching it run
Three windows into the running stack, from shallow to deep:-
./innate-sim(no arguments) — the live dashboard: overall health, the world server’s render backend and speed, and the brain log. -
./innate-sim logs <target>— tail one subsystem’s log;brainshows skill loading and agent reasoning,startupaggregates everything from the last boot,world-servercovers physics and rendering. -
The tmux session — every subsystem in its own window:
ws://localhost:9090 for TF, /scan,
/mars/main_camera/points, camera topics, and /cmd_vel teleop. The
simulated driver publishes the exact topic surface of the real hardware
drivers — same topics, types, rates, and frame names — so anything you build
against it (input devices, dashboards, recorders) carries over to hardware
unchanged.
What’s different from a real robot
The point of the digital twin is that almost nothing is — but a few hardware-bound features have no simulated counterpart:- Speech requires the hosted backend: the web app’s speak bar disables itself with a hint when the sim runs on a local Gemini key or without a backend.
- Voice input — there is no simulated microphone; talk to the agent through chat instead.
- Policy-defined (trained) skills are trained from teleoperation recordings on physical hardware; the simulator is for developing and testing code-defined skills and agents.
The simulated world as a Python object
For scripts, notebooks, and RL loops there is a second way in that needs no ROS and no Docker:VirtualMars, the whole simulated world as one Python
object.

