Quickstart

Connect to OmniBot, drive it, and hand it a goal. The Python package is not on PyPI, so the snippets below are the intended API, not a command that runs today.

New here? Start with the Setup Guide for a complete walkthrough with illustrations.

1. Connect

from ohho import Robot

# Auto-detect the best runtime, or name a transport explicitly.
bot = Robot.connect("omnibot")                       # auto — sim fallback
dog = Robot.connect("unitree-go2", "dds://192.168.1.10")
arm_bot = Robot.connect("omnibot", "serial:///dev/ttyUSB0,/dev/ttyACM0")
ros_bot = Robot.connect("omnibot", "ros2://", runtime="ros2")

No hardware? Use the simulator — always available, no setup:

bot = Robot.connect("omnibot", transport="sim://")

2. Drive and read telemetry

Every robot exposes the same surface; capabilities a robot lacks are no-ops.

bot.drive(vx=0.2, vy=0.0, w=0.3)     # holonomic where supported
print(bot.telemetry().odom)          # x, y, theta, vx, vy, omega

if bot.has("manipulation"):
    bot.move_joints([0.0, -0.5, 0.5, 0.0, 0.0, 0.2])

bot.emergency_stop()                  # halt everything immediately
bot.release_stop()                    # resume

3. Hand it a goal (the agent)

from ohho.agent import Agent

agent = Agent(bot)                    # pluggable brain: cloud or on-device
log = agent.run("find the red cup and bring it to the kitchen")
for line in log:
    print(line)

The agent runs a continuous perceive → reason → act → reflect loop. With the [agent] extra + ANTHROPIC_API_KEY, it uses a Claude tool-calling reasoner that builds tools from the robot's capabilities. Without it, a ScriptedBrain fallback exercises the robot deterministically.

4. Record data and train

from ohho.data import Recorder

rec = Recorder(bot, repo_id="local/demo", fps=10.0)
rec.start_episode(task="pick up the cup")
for _ in range(50):
    bot.drive(vx=0.1)
    rec.capture_frame()
rec.stop_episode()
rec.save("~/datasets/demo")
from ohho.train import finetune

ckpt = finetune(dataset="~/datasets/demo", policy="smolvla", device="auto")

5. Serve the trained policy

Coming soon. This command is not published and does not run today.

ohho serve --checkpoint ./checkpoints/smolvla --port 8000

6. Run a skill

Coming soon. This command is not published and does not run today.

ohho market list ohho market run omnibot patrol

CLI shortcuts

Coming soon. This command is not published and does not run today.

ohho doctor # check your environment ohho list # list built-in robots ohho connect omnibot # connect + print status + telemetry ohho sim --robot omnibot # launch the built-in simulator ohho drive omnibot --vx 0.15 # drive forward ohho agent omnibot "tidy the desk" # hand the agent a goal ohho serve --port 8000 # serve a policy over REST ohho market list # list registered skills ohho profile detect # detect your hardware profile

The same loop on a different robot

Because behavior is written against capabilities, not a specific robot, the exact agent code above runs unchanged on the quadruped or the arm:

Agent(dog).run("patrol the warehouse and report obstacles")

Next