Metadata-Version: 2.4
Name: ohho-os
Version: 1.1.2
Summary: OhhO OS — the open-source, robot-agnostic engine for any robot, with or without ROS.
Author: OhhO
License-Expression: Apache-2.0
Project-URL: Homepage, https://github.com/ohho-robotics/ohho-sdk
Project-URL: Source, https://github.com/ohho-robotics/ohho-sdk
Keywords: robotics,ros2,vla,agent,embodied-ai
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: Science/Research
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Typing :: Typed
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Provides-Extra: yaml
Requires-Dist: pyyaml>=6.0; extra == "yaml"
Provides-Extra: serial
Requires-Dist: pyserial>=3.5; extra == "serial"
Provides-Extra: arm
Requires-Dist: lerobot>=0.1; extra == "arm"
Provides-Extra: agent
Requires-Dist: numpy>=1.24; extra == "agent"
Requires-Dist: anthropic>=0.40; extra == "agent"
Provides-Extra: data
Requires-Dist: pyarrow>=14.0; extra == "data"
Provides-Extra: unitree
Requires-Dist: cyclonedds>=0.10; extra == "unitree"
Provides-Extra: dji
Requires-Dist: pymavlink>=2.4; extra == "dji"
Provides-Extra: serve
Requires-Dist: fastapi>=0.110; extra == "serve"
Requires-Dist: uvicorn>=0.27; extra == "serve"
Provides-Extra: train
Requires-Dist: torch>=2.1; extra == "train"
Requires-Dist: numpy>=1.24; extra == "train"
Provides-Extra: ros2
Provides-Extra: dev
Requires-Dist: pytest>=7; extra == "dev"
Provides-Extra: all
Requires-Dist: pyyaml>=6.0; extra == "all"
Requires-Dist: pyserial>=3.5; extra == "all"
Requires-Dist: lerobot>=0.1; extra == "all"
Requires-Dist: numpy>=1.24; extra == "all"
Requires-Dist: anthropic>=0.40; extra == "all"
Requires-Dist: pyarrow>=14.0; extra == "all"
Requires-Dist: torch>=2.1; extra == "all"
Requires-Dist: cyclonedds>=0.10; extra == "all"
Requires-Dist: pymavlink>=2.4; extra == "all"
Requires-Dist: fastapi>=0.110; extra == "all"
Requires-Dist: uvicorn>=0.27; extra == "all"
Dynamic: license-file

# OhhO OS

Python package `ohho-os` (import `ohho`), version 1.1.2. The `ohho` console
script is installed by `pip install -e .`.

[![CI](https://github.com/ohho-robotics/ohho-sdk/actions/workflows/ci.yml/badge.svg)](https://github.com/ohho-robotics/ohho-sdk/actions/workflows/ci.yml)
[![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://www.apache.org/licenses/LICENSE-2.0)

The badge reads `.github/workflows/ci.yml` on
[ohho-robotics/ohho-sdk](https://github.com/ohho-robotics/ohho-sdk).
That workflow has not run for this tree yet.

## Three commands

```bash
pip install -e .
ohho doctor
ohho sim --robot omnibot --seconds 2
```

`pip install -e .` installs the dependency-free base (stdlib only) and the
`ohho` script. `ohho doctor` prints the interpreter, the runtimes and
adapters it can import, and the built-in robot ids. `ohho sim` connects
with transport `sim://` and runtime `native`, then drives an in-process
pattern for the given number of seconds.

On this machine (Python 3.12.3, Linux, base install) both commands exited 0.
`ohho doctor` reported runtime `native`, adapter `sim`, and robots
`omnibot`, `sim`, `unitree-go2`.

## Tests

```bash
python -m unittest discover -s tests
```

Same environment as above:

```
Ran 197 tests in 22.971s
OK (skipped=18)
```

The 18 skips were: 4 hardware-in-the-loop tests (`OHHO_HIL` unset),
13 tests that need `agent_engine` and numpy, and 1 test that needs
fastapi (`[serve]`). No failures.

CI runs that discover command, then `ohho doctor` and
`ohho sim --robot omnibot --seconds 2`, on Ubuntu, macOS, and Windows
for Python 3.10, 3.11, 3.12, and 3.13. This commit does not include a
GitHub Actions result for those cells.

## Needs hardware

`ohho doctor`, `ohho sim --robot omnibot`, and the default test run do
not open a serial port, a camera, or a GPU. The simulator is in-process.

`tests/hil/` talks to real robots. Every test in that package is
skipped unless `OHHO_HIL=1`. The ports they use:

| Test | Device | Environment variable | Default |
|---|---|---|---|
| OmniBot base | Yahboom serial | `OHHO_OMNIBOT_PORT` | `/dev/ttyUSB0` |
| OmniBot arm | Feetech bus | `OHHO_OMNIBOT_ARM` | `/dev/ttyACM0` |
| OmniBot base + arm | both of the above | both | both defaults |
| Unitree Go2 | DDS interface | `OHHO_GO2_IFACE` | `eth0` |

Those adapters are not installed by `pip install -e .`. The extras are
`serial` (pyserial), `arm` (lerobot), and `unitree` (cyclonedds). The
`ros2` extra does not pip-install `rclpy`; that module comes from a ROS 2
distro. `train` needs torch. None of those were installed for the test
run above.

## TypeScript

`ts/` is the previous TypeScript workspace (`package.json`,
`tsconfig.json`, `packages/`), moved with the same file contents. It does
not typecheck. `tsc --noEmit -p ts/tsconfig.json` (TypeScript 5.6.3)
exits with 246 `error TS` diagnostics, including missing modules
(`react`, `vitest`, `@/lib/...`) and files that are not in this tree
(`packages/schemas/src/types.ts`, `packages/schemas/src/robot-catalog.ts`).
See `ts/AGENTS.md`. Paths in that file still describe the old repository
root.

## Licence

Apache-2.0. The full text is [`LICENSE`](LICENSE).

## Releasing

```bash
git tag v1.1.2
git push origin v1.1.2
```

`v1.1.2` matches `version` in `pyproject.toml`. `.github/workflows/release.yml` runs on tags matching `v*`. It fails the release when the tag version and that `version` differ, checks every classifier against `trove-classifiers`, builds the sdist and wheel with `python -m build`, runs `twine check`, and publishes to PyPI with trusted publishing (`pypa/gh-action-pypi-publish`, `environment: pypi`, no API token). A following job, in a fresh virtualenv on Ubuntu and macOS, retries `pip install ohho-os==<tag version>` until that version is installable, then runs `ohho doctor`.

Tag `v1.1.1` already points at `286d408` and was not published. PyPI returned 400 because `Topic :: Scientific/Engineering :: Robotics` is not a trove classifier. That tag stays. `v1.1.2` has not been pushed.
