01 / CONNECT
Quick start
The quick-start example below applies to the manipulation workbench.
Check your installed software version first. Keep the workbench process running; the graphical interface is optional. The default service address is http://127.0.0.1:8085.
These HTTP/JSON endpoints are provided by the installed client software. They do not require an account or API key by default. They do not cover remote access, cross-origin websites or authentication for a public service.
| Product | Version | Run from the installed program directory |
|---|---|---|
| OmindOS Navigation | 0.2.0-preview.8 | ./omindos workbench |
| OmindOS Manipulation | 0.3.1 | ./OmindOS-Workbench --no-browser |
Use Content-Type: application/json for POST requests. Both programs use port 8085 by default. Run them separately, or pass --port 8086 to the manipulation program and update your client URL.
curl --fail-with-body http://127.0.0.1:8085/v1/workbench-stateimport json
from urllib.request import urlopen
with urlopen("http://127.0.0.1:8085/v1/workbench-state",
timeout=10) as response:
state = json.load(response)
print(state)API REFERENCE
Find an endpoint
All 17 endpoints · Expand an endpoint to read its description.
02 / NAVIGATION
Navigation profiles
Register robot parameters, preserve versions and retrieve a profile by ID. Identical submissions return the same ID; changed parameters create a new version. Registration does not enable physical motors.
POST/v1/robot-profilesRegister robot parameters
Body: complete robot profile; success returns HTTP 201 and profile_id
GET/v1/robot-profiles/{profile_id}Retrieve a parameter version
Retrieve a saved version using the complete profile ID
| Field | Meaning |
|---|---|
robot_id | Robot identifier |
kinematics.urdf_xml | URDF XML text |
dynamics.joints | Motor and transmission parameters keyed by joint name; use a complete profile exported from the workbench |
Export robot-parameters.json from the workbench first. Do not fill unknown motor calibration parameters with estimated values. Replace PROFILE_ID below with the complete profile_id returned by POST.
curl --fail-with-body \
-X POST http://127.0.0.1:8085/v1/robot-profiles \
-H 'Content-Type: application/json' \
--data-binary @robot-parameters.json
curl --fail-with-body \
http://127.0.0.1:8085/v1/robot-profiles/PROFILE_IDThe success response includes profile_id, robot_id and joint_names. runtime_applied and hardware_validated are false: the profile is stored, not applied to a physical controller.
03 / MANIPULATION
Manipulation
For OmindOS Manipulation 0.3.1: model queries, dual-arm and waist planning, and geometric navigation for differential or omnidirectional bases. The supplied RM75 models use left_tool0 and right_tool0 as TCP frames. Use the mapping returned by the selected model.
GET/v1/workbench-stateRead workbench state
Read active configuration and software stop state
GET/v1/workbench-modelsList robot models
List models available in this installation
GET/v1/workbench-model/{id}Read a model and poses
Read profile, mapping and poses; id: b / 6fb / 6f
GET/v1/workbench-active-profileRead the active profile
Read the applied workbench profile
POST/v1/workbench-active-profileUpdate the active profile
Body: complete profile; validate, apply and invalidate previous motion results
GET/v1/planning-configRead planning configuration
Read reference mapping; use model-supplied mapping for actual CAD
POST/v1/planning-startStart a planning task
Submit joint or dual-TCP planning; return task state
GET/v1/planning-task/{task_id}Read planning results
Read planning status, error and successful result
POST/v1/planning-cancelCancel a planning task
Body: {"task_id":"ACTUAL_TASK_ID"}
POST/v1/robot-modelCompute model and forward kinematics
urdf_xml (required), positions, base_pose; compute model and forward kinematics
POST/v1/workbench-stopSoftware stop and reset
{"engaged":true} stops; reset also requires expected_epoch
Planning requests: fields and units
| Field | Meaning |
|---|---|
profile | Complete model profile; available from the model endpoint |
mode | joint: joint path; object: coordinated dual-TCP translation and rotation |
start / target | Joint names mapped to angles in radians; provide target for joint mode |
mapping | Model-specific arm, waist and TCP mapping |
translation_m | [x, y, z] translation in metres for object mode |
rotation_deg | XYZ Euler angles in degrees for object mode; this field uses degrees |
base_pose / obstacles | Fixed base pose and world-frame box obstacles |
For joint planning, the base, gripper and non-body joints remain fixed. Each object translation component is limited to ±0.25 m; each rotation_deg component to ±45°.
Navigation requests: maps and planning after parking
| Field | Meaning |
|---|---|
profile, start, goal | Required: complete profile, starting joint positions and base goal |
goal / base_pose | x_m, y_m, yaw_rad; metres and radians |
config | Read the complete default from navigation-config before editing; drive_type is differential or omnidirectional |
config.map | size_m, origin_m, resolution_m; row-major occupancy data, with integer 0 as free space. Omitting data creates an empty simulation map |
mapping / obstacles | Model mapping and shared environment obstacles |
manipulation.translation_m | Optional [x, y, z]; starts coordinated dual-TCP planning after parking is confirmed |
Navigation pose comes from geometric simulation. A real map still requires site calibration. Planning output is not a control trajectory ready to send to motors.
04 / EXAMPLES
Examples
Read manipulation workbench state
This Python example uses only the standard library. It reads state, the model catalog and navigation configuration without changing workbench parameters.
import json
from urllib.request import urlopen
base_url = "http://127.0.0.1:8085"
for endpoint in ("/v1/workbench-state", "/v1/workbench-models",
"/v1/navigation-config"):
with urlopen(base_url + endpoint, timeout=10) as response:
print(endpoint, json.load(response))Register a navigation profile
Prepare robot-parameters.json exported from the workbench before running this example. The profile is stored in the running program’s data directory.
import json
from pathlib import Path
from urllib.request import Request, urlopen
payload = Path("robot-parameters.json").read_bytes()
request = Request(
"http://127.0.0.1:8085/v1/robot-profiles",
data=payload,
headers={"Content-Type": "application/json"},
method="POST",
)
with urlopen(request, timeout=10) as response:
result = json.load(response)
print(result["profile_id"])Submit a prepared planning request
Prepare planning-request.json using the fields above and the current model’s profile and mapping. Poll using the returned task_id; HTTP success does not mean planning is complete.
curl --fail-with-body \
-X POST http://127.0.0.1:8085/v1/planning-start \
-H 'Content-Type: application/json' \
--data-binary @planning-request.json
curl --fail-with-body \
http://127.0.0.1:8085/v1/planning-task/TASK_ID05 / TASK STATES
States and errors
Planning: running → succeeded / failed / canceled. A successful submission only creates the task. Continue querying its state.
Navigation: planning, navigating, aligning, parking. Navigation-only success ends at parked. A task with follow-up manipulation enters manipulation_planning and finishes at succeeded.
Query the task every 0.1–0.5 seconds. A gap longer than 3 seconds stops the task. For navigation-only success, result is null: read navigation. Do not continue using a partial path after failure or cancellation.
| HTTP | Action |
|---|---|
| 400 | Invalid request; inspect error. Asynchronous validation may also return status=failed |
| 403 | Local same-origin check failed; use a local client and 127.0.0.1 |
| 404 | Requested profile, model or task is missing; check the full ID |
| 413 | Invalid body size or transfer encoding; profile request limit: 2 MiB |
| 415 | Incorrect POST content type; set Content-Type: application/json |
| 423 | Software stop, task exclusion or state interlock; read current state and do not automatically retry motion |
Stop and reset
Send {"engaged":true} to /v1/workbench-stop to engage the software stop. Before resetting, read the current motion_epoch and pass that integer as expected_epoch with engaged: false. Reset does not resume a task. A software stop is not a hardware emergency stop.
06 / COMPATIBILITY
Versions and scope
| Documentation version | Documented scope | Runtime |
|---|---|---|
| Navigation 0.2.0-preview.8 | Robot profile registration and retrieval; preview release, physical hardware not validated | Ubuntu 22.04 / 24.04 x86_64; installed workbench and Docker Engine |
| Manipulation 0.3.1 | Local kinematics, path planning, conservative sampled collision checking and geometric navigation simulation | Ubuntu 22.04 / 24.04 x86_64; installed workbench, no separate ROS or Docker |
The manipulation version covers the documented local software functions. Hardware drivers, dynamics, force control, continuous collision checking and payload collision checking are outside its validated scope. The navigation profile API does not imply that a quadruped has been calibrated.
Confirm the software version, robot model, parameters and task environment before integration.
Discuss integrationDocumentation updated: 2026-10-10