sodero CLI¶
sodero is the command-line tool of the SSH workspace. It performs the operations of the Station page (adding nodes, connecting ports, loading settings and maps, starting nodes, calling robot tools) and prints every result as JSON, so people, scripts and AI agents can all use it.
The CLI is its own best reference:
| Command | What it gives |
|---|---|
sodero --help |
All command groups |
sodero GROUP ACTION --help |
Every option of one command, with defaults |
sodero capabilities |
The full command list, exit codes and limits as JSON |
sodero tools list / sodero tools describe TOOL |
The robot tools of the running nodes and their input schemas |
sodero-help / sodero-help NAME |
The workspace guides, for example sodero-help navigation |
Conventions¶
- JSON output. Each command prints one JSON result on stdout. Pipe it through
python3 -m json.toolto read it comfortably. A failure prints one JSON error on stderr:{"error": {"code": ..., "message": ..., "details": ...}}. - Preview first. A command that changes something only previews until you add
--execute. Read the preview, then repeat the command with--execute. - Versions. Changes to the node graph take
--if-version N, theexpected_versionfromsodero topology get. Changes to settings and documents take--if-sha256 SHA256from the matchingget. Each saved change returns the next value. If someone changed the Station page in the meantime, the change is refused with a conflict (exit code 6): read again and retry. - One Station. On a robot, the only item is the Station
station.--itemdefaults to it and can be left out. - Node IDs. A node's ID comes from its module, not from the
--kindoption oftopology add-node:--kind camera --name cam0createssodero.camera_gateway.cam0, and--kind strider --name jackalcreatessodero.mlc.jackal. The IDs of all built-in modules are listed in Key Concepts › Station and Nodes.
Exit Codes¶
| Code | Meaning | What to do |
|---|---|---|
| 0 | Success | For an accepted change, check the returned state |
| 1 | Other failure | Read error.message and fix the cause |
| 2 | Invalid arguments | Check --help |
| 3 | Authentication or permission | Reconnect; ask the robot's operator |
| 4 | Service unavailable | Check the state before you repeat a change |
| 5 | Timeout | Check the state; run the printed resume command |
| 6 | Conflict | Read the current version or SHA-256 again, then retry |
| 7 | Busy | Retry after a pause |
| 8 | Limit exceeded | Reduce the size or count |
Command Map¶
| Group | Actions | Use |
|---|---|---|
project |
status |
Station and workspace information |
runtime |
status, logs, start, stop, node start, node stop |
Which nodes run, their logs; start and stop nodes |
topology |
catalog, get, add-node, connect, disconnect, remove-node, import |
Edit the node graph |
tools |
list, describe, call |
Robot tools: Strider, Motion Studio, navigation, localization, documents… |
navigation |
list, get, apply |
Settings of the camera, visual odometry, localizer and navigator |
maps |
upload, attach |
Attach .nav map bundles to the localizer and navigator |
locomotion, policies |
list, get, apply; upload |
Legged locomotion and IMU settings; your own ONNX walking policy |
articulations |
get, configure, upload |
Joints and actuators of Articulation nodes |
packages |
list, upload, remove |
Your own modules |
apps |
start, stop, status, logs, call |
Nodes of your own modules |
watch, camera |
watch; camera snapshot |
Sample readings for a few seconds; save a camera picture |
files |
upload |
Stage a file on the robot for documents.apply (kept for at most 6 hours) |
run, programs |
run; programs list, programs logs |
Run a program in the workspace and keep its output |
Worlds, project items, the project Library and Sodero Assets belong to Sodero Cloud. On a robot these commands answer NOT_AVAILABLE_ON_DEVICE.
Recipes¶
Status and Logs¶
sodero runtime status # every node: configured, running, its state
sodero runtime logs sodero.actuator_gateway.jackal --lines 100
sodero tools call strider.get_state --input '{"target":"sodero.mlc.jackal"}'
Start and Stop Nodes¶
sodero runtime node start sodero.actuator_gateway.jackal --execute # gateway first
sodero runtime node start sodero.mlc.jackal --execute # then its controller
sodero runtime node stop sodero.mlc.jackal --execute
sodero runtime start --execute --wait starts every saved node, like Start all nodes on the Station page.
Start all nodes includes nodes that drive real hardware. Start nodes one by one when the graph contains hardware you do not want to run.
Edit the Node Graph¶
Stop the nodes you change first, as on the Station page; changes apply when they next start. Every graph change needs the current version. Read it, preview, then execute:
sodero topology get # note "expected_version", e.g. 12
sodero topology add-node --kind camera --name cam0 --if-version 12 # preview
sodero topology add-node --kind camera --name cam0 --if-version 12 --execute # returns version 13
sodero topology connect --source sodero.localizer.camera \
--target sodero.camera_gateway.cam0.camera --if-version 13 --execute
sodero topology catalog lists the node kinds with their ports: gateway, strider, motion_studio, articulation, camera, imu, vo, localizer, navigator and package. For legged robots, which are prepared with Sodero support, it also lists legged_locomotion and legged_navigator, a navigator that drives a Legged locomotion node.
Change Settings of Built-in Nodes¶
sodero navigation list
sodero navigation get --node sodero.navigator > navigator.json # the editable config and its sha256
# save the "config" part to config.json and change the values you need, then:
sodero navigation apply --node sodero.navigator --config @config.json --if-sha256 SHA256 # preview
sodero navigation apply --node sodero.navigator --config @config.json --if-sha256 SHA256 --execute
Stop the node first; the new settings apply when it starts again. These are the same settings the Station page shows in the node's inspector.
Attach a Map¶
sodero runtime node stop sodero.navigator --execute # stop the nodes that use the map
sodero runtime node stop sodero.localizer --execute
sodero runtime node stop sodero.visual_odometry --execute # if the Station has one
sodero navigation get --node sodero.localizer # note "sha256"
sodero maps upload /workspace/maps/warehouse.nav --node sodero.localizer --if-sha256 SHA256 # preview: checks the bundle
sodero maps upload /workspace/maps/warehouse.nav --node sodero.localizer --if-sha256 SHA256 --execute # attach it
The localizer and the navigator share one map bundle, so one upload serves both. Start the nodes again afterwards. See Load and Configure a Map and Localization and Navigation.
Modules (Your Own Programs)¶
sodero packages upload /workspace/my-work/patrol.tar.gz --execute
sodero topology add-node --kind package --package customer.patrol --if-version N --execute # name from package.yaml
sodero apps start NODE --execute
sodero apps logs NODE --lines 100
See Create Custom Modules for the package format.
Robot Tools¶
sodero tools list # tools of the running nodes, with their targets
sodero tools describe localization.set_initial_pose # input schema
sodero tools call localization.set_initial_pose --input '{"x": -1.6, "y": 2.4, "yaw": 0.0}' # preview
sodero tools call localization.set_initial_pose --input '{"x": -1.6, "y": 2.4, "yaw": 0.0}' --execute
A tool that changes something or moves the robot acts only with --execute. Strider and Motion Studio tools need the exact target (from tools list) when the Station has more than one robot of that kind, for example {"mode": "TWIST", "target": "sodero.mlc.jackal"} for strider.set_mode.