caasi 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- caasi-0.1.0/.gitignore +26 -0
- caasi-0.1.0/LICENSE +21 -0
- caasi-0.1.0/PKG-INFO +178 -0
- caasi-0.1.0/README.md +147 -0
- caasi-0.1.0/docs/.nojekyll +0 -0
- caasi-0.1.0/docs/assets/copy.js +98 -0
- caasi-0.1.0/docs/assets/sidebar.js +151 -0
- caasi-0.1.0/docs/assets/style.css +537 -0
- caasi-0.1.0/docs/assets/theme.js +106 -0
- caasi-0.1.0/docs/configuration.html +257 -0
- caasi-0.1.0/docs/data.html +257 -0
- caasi-0.1.0/docs/environment.html +283 -0
- caasi-0.1.0/docs/index.html +283 -0
- caasi-0.1.0/docs/native.html +290 -0
- caasi-0.1.0/docs/projects.html +246 -0
- caasi-0.1.0/docs/remote.html +359 -0
- caasi-0.1.0/docs/review.html +164 -0
- caasi-0.1.0/docs/ros.html +364 -0
- caasi-0.1.0/docs/runs.html +248 -0
- caasi-0.1.0/docs/simulation.html +212 -0
- caasi-0.1.0/docs/training.html +188 -0
- caasi-0.1.0/examples/navigation.yaml +28 -0
- caasi-0.1.0/pyproject.toml +49 -0
- caasi-0.1.0/src/caasi/__init__.py +7 -0
- caasi-0.1.0/src/caasi/checks/__init__.py +96 -0
- caasi-0.1.0/src/caasi/checks/containers.py +35 -0
- caasi-0.1.0/src/caasi/checks/graphics.py +50 -0
- caasi-0.1.0/src/caasi/checks/hardware.py +47 -0
- caasi-0.1.0/src/caasi/checks/isaac.py +99 -0
- caasi-0.1.0/src/caasi/checks/ml.py +42 -0
- caasi-0.1.0/src/caasi/checks/nvidia.py +70 -0
- caasi-0.1.0/src/caasi/checks/python_env.py +51 -0
- caasi-0.1.0/src/caasi/checks/robotics.py +54 -0
- caasi-0.1.0/src/caasi/checks/ros.py +63 -0
- caasi-0.1.0/src/caasi/checks/simulators.py +41 -0
- caasi-0.1.0/src/caasi/checks/storage.py +39 -0
- caasi-0.1.0/src/caasi/checks/system.py +40 -0
- caasi-0.1.0/src/caasi/checks/vision.py +41 -0
- caasi-0.1.0/src/caasi/cli/__init__.py +1 -0
- caasi-0.1.0/src/caasi/cli/benchmark_cmd.py +111 -0
- caasi-0.1.0/src/caasi/cli/config_cmd.py +126 -0
- caasi-0.1.0/src/caasi/cli/container_cmd.py +107 -0
- caasi-0.1.0/src/caasi/cli/control_cmd.py +132 -0
- caasi-0.1.0/src/caasi/cli/dataset_cmd.py +195 -0
- caasi-0.1.0/src/caasi/cli/definitions.py +114 -0
- caasi-0.1.0/src/caasi/cli/doctor.py +98 -0
- caasi-0.1.0/src/caasi/cli/gpu.py +165 -0
- caasi-0.1.0/src/caasi/cli/init_cmd.py +37 -0
- caasi-0.1.0/src/caasi/cli/lab.py +47 -0
- caasi-0.1.0/src/caasi/cli/main.py +126 -0
- caasi-0.1.0/src/caasi/cli/misc.py +120 -0
- caasi-0.1.0/src/caasi/cli/moveit_cmd.py +151 -0
- caasi-0.1.0/src/caasi/cli/native_cmd.py +119 -0
- caasi-0.1.0/src/caasi/cli/nav_cmd.py +177 -0
- caasi-0.1.0/src/caasi/cli/project_cmd.py +67 -0
- caasi-0.1.0/src/caasi/cli/remote_cmd.py +114 -0
- caasi-0.1.0/src/caasi/cli/replay_cmd.py +75 -0
- caasi-0.1.0/src/caasi/cli/ros_cmd.py +217 -0
- caasi-0.1.0/src/caasi/cli/run_cmd.py +207 -0
- caasi-0.1.0/src/caasi/cli/sensor_cmd.py +105 -0
- caasi-0.1.0/src/caasi/cli/setup_cmd.py +103 -0
- caasi-0.1.0/src/caasi/cli/shell_cmd.py +53 -0
- caasi-0.1.0/src/caasi/cli/sim.py +167 -0
- caasi-0.1.0/src/caasi/cli/system.py +148 -0
- caasi-0.1.0/src/caasi/cli/train_cmd.py +94 -0
- caasi-0.1.0/src/caasi/cli/view_cmd.py +93 -0
- caasi-0.1.0/src/caasi/cli/vision_cmd.py +121 -0
- caasi-0.1.0/src/caasi/core/__init__.py +1 -0
- caasi-0.1.0/src/caasi/core/benchmark.py +46 -0
- caasi-0.1.0/src/caasi/core/config.py +240 -0
- caasi-0.1.0/src/caasi/core/containers.py +56 -0
- caasi-0.1.0/src/caasi/core/dataset.py +196 -0
- caasi-0.1.0/src/caasi/core/experiment.py +178 -0
- caasi-0.1.0/src/caasi/core/nvidia.py +133 -0
- caasi-0.1.0/src/caasi/core/project.py +187 -0
- caasi-0.1.0/src/caasi/core/remotes.py +89 -0
- caasi-0.1.0/src/caasi/core/ros.py +89 -0
- caasi-0.1.0/src/caasi/core/runs.py +369 -0
- caasi-0.1.0/src/caasi/core/sensors.py +130 -0
- caasi-0.1.0/src/caasi/core/viewers.py +99 -0
- caasi-0.1.0/src/caasi/core/vision.py +58 -0
- caasi-0.1.0/src/caasi/i18n/__init__.py +78 -0
- caasi-0.1.0/src/caasi/i18n/en.py +678 -0
- caasi-0.1.0/src/caasi/state.py +69 -0
- caasi-0.1.0/src/caasi/utils/__init__.py +1 -0
- caasi-0.1.0/src/caasi/utils/output.py +64 -0
- caasi-0.1.0/src/caasi/utils/pydist.py +18 -0
- caasi-0.1.0/src/caasi/utils/shell.py +57 -0
- caasi-0.1.0/src/caasi/utils/sysinfo.py +120 -0
- caasi-0.1.0/tests/__init__.py +1 -0
- caasi-0.1.0/tests/conftest.py +115 -0
- caasi-0.1.0/tests/test_benchmark_cmd.py +107 -0
- caasi-0.1.0/tests/test_config.py +159 -0
- caasi-0.1.0/tests/test_container_cmd.py +189 -0
- caasi-0.1.0/tests/test_control_cmd.py +133 -0
- caasi-0.1.0/tests/test_dataset_cmd.py +189 -0
- caasi-0.1.0/tests/test_definitions_cmd.py +101 -0
- caasi-0.1.0/tests/test_doctor.py +63 -0
- caasi-0.1.0/tests/test_experiment.py +189 -0
- caasi-0.1.0/tests/test_gpu.py +84 -0
- caasi-0.1.0/tests/test_i18n.py +76 -0
- caasi-0.1.0/tests/test_lab.py +50 -0
- caasi-0.1.0/tests/test_misc.py +42 -0
- caasi-0.1.0/tests/test_moveit_cmd.py +110 -0
- caasi-0.1.0/tests/test_native_cmd.py +104 -0
- caasi-0.1.0/tests/test_nav_cmd.py +120 -0
- caasi-0.1.0/tests/test_project.py +106 -0
- caasi-0.1.0/tests/test_project_cmd.py +89 -0
- caasi-0.1.0/tests/test_remote_cmd.py +159 -0
- caasi-0.1.0/tests/test_replay_cmd.py +154 -0
- caasi-0.1.0/tests/test_ros_cmd.py +277 -0
- caasi-0.1.0/tests/test_run_cmd.py +153 -0
- caasi-0.1.0/tests/test_runs.py +114 -0
- caasi-0.1.0/tests/test_sensors_cmd.py +103 -0
- caasi-0.1.0/tests/test_setup_cmd.py +64 -0
- caasi-0.1.0/tests/test_sim.py +121 -0
- caasi-0.1.0/tests/test_system.py +67 -0
- caasi-0.1.0/tests/test_train_cmd.py +76 -0
- caasi-0.1.0/tests/test_view_cmd.py +138 -0
- caasi-0.1.0/tests/test_vision_cmd.py +108 -0
- caasi-0.1.0/uv.lock +296 -0
caasi-0.1.0/.gitignore
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*.egg-info/
|
|
5
|
+
build/
|
|
6
|
+
dist/
|
|
7
|
+
.eggs/
|
|
8
|
+
|
|
9
|
+
# Environments
|
|
10
|
+
.venv/
|
|
11
|
+
venv/
|
|
12
|
+
.env
|
|
13
|
+
|
|
14
|
+
# Tooling caches
|
|
15
|
+
.pytest_cache/
|
|
16
|
+
.mypy_cache/
|
|
17
|
+
.ruff_cache/
|
|
18
|
+
|
|
19
|
+
# Caasi runtime artifacts
|
|
20
|
+
runs/
|
|
21
|
+
datasets/
|
|
22
|
+
|
|
23
|
+
# Editors / OS
|
|
24
|
+
.idea/
|
|
25
|
+
.vscode/
|
|
26
|
+
.DS_Store
|
caasi-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 a6y3ap (https://github.com/a6y3ap)
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
caasi-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: caasi
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: A lightweight, CLI-first orchestration layer for NVIDIA Isaac Sim, Isaac Lab and the robotics ecosystem.
|
|
5
|
+
Project-URL: Homepage, https://github.com/a6y3ap/caasi
|
|
6
|
+
Project-URL: Repository, https://github.com/a6y3ap/caasi
|
|
7
|
+
Project-URL: Documentation, https://a6y3ap.github.io/caasi/
|
|
8
|
+
Project-URL: Issues, https://github.com/a6y3ap/caasi/issues
|
|
9
|
+
Author: a6y3ap
|
|
10
|
+
License: MIT
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
Keywords: caasi,cli,isaac,isaac-lab,isaac-sim,robotics,ros2,simulation
|
|
13
|
+
Classifier: Development Status :: 3 - Alpha
|
|
14
|
+
Classifier: Environment :: Console
|
|
15
|
+
Classifier: Intended Audience :: Developers
|
|
16
|
+
Classifier: Intended Audience :: Science/Research
|
|
17
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
18
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
19
|
+
Classifier: Programming Language :: Python :: 3
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
23
|
+
Classifier: Topic :: Scientific/Engineering
|
|
24
|
+
Requires-Python: >=3.10
|
|
25
|
+
Requires-Dist: pyyaml>=6.0
|
|
26
|
+
Requires-Dist: rich>=13.7
|
|
27
|
+
Requires-Dist: typer>=0.12
|
|
28
|
+
Provides-Extra: dev
|
|
29
|
+
Requires-Dist: pytest>=8.0; extra == 'dev'
|
|
30
|
+
Description-Content-Type: text/markdown
|
|
31
|
+
|
|
32
|
+
# Caasi
|
|
33
|
+
|
|
34
|
+
A lightweight, **CLI-first orchestration layer** for NVIDIA Isaac Sim, Isaac Lab and the
|
|
35
|
+
wider robotics ecosystem (ROS 2, Nav2, MoveIt 2, ros2\_control, ...).
|
|
36
|
+
|
|
37
|
+
Headless-first. CLI-first. Process-oriented. Visualization-independent.
|
|
38
|
+
|
|
39
|
+
**Documentation:** <https://a6y3ap.github.io/caasi/>
|
|
40
|
+
|
|
41
|
+
> **Note:** Caasi is an independent open-source project. It is not affiliated with,
|
|
42
|
+
> endorsed by, or an official product of NVIDIA.
|
|
43
|
+
|
|
44
|
+
## Philosophy
|
|
45
|
+
|
|
46
|
+
- **Use existing software. Don't reinvent it.** Caasi discovers, configures, launches,
|
|
47
|
+
connects, monitors and manages tools that already exist.
|
|
48
|
+
- **Simulation is not visualization.** Run headless by default; attach a viewer only when needed.
|
|
49
|
+
- **Minimum required stack.** The Caasi process itself stays lightweight and never imports the
|
|
50
|
+
heavy Isaac stack, PyTorch or rclpy — it only delegates to them.
|
|
51
|
+
- **Don't become another ROS.** ROS orchestration is delegated to the real `ros2` tooling.
|
|
52
|
+
- **Unix-friendly.** Small commands, `--json` output, sensible exit codes.
|
|
53
|
+
|
|
54
|
+
## Install
|
|
55
|
+
|
|
56
|
+
Requires Python 3.10+ on Linux. The Isaac stack, ROS 2 and PyTorch are *discovered*, not
|
|
57
|
+
installed, by Caasi.
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
pip install caasi
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Or from source:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
git clone https://github.com/a6y3ap/caasi.git
|
|
67
|
+
cd caasi
|
|
68
|
+
pip install -e . # add pytest as well: pip install -e ".[dev]"
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Either way this installs the `caasi` command. Shell completion is available:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
caasi --install-completion
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Quickstart
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
caasi doctor # diagnose the whole environment
|
|
81
|
+
caasi doctor --component nvidia # one section only
|
|
82
|
+
caasi gpu status # GPU overview via nvidia-smi
|
|
83
|
+
caasi system status # OS / CPU / RAM / disk summary
|
|
84
|
+
caasi info # CLI + configured/detected ecosystem versions
|
|
85
|
+
caasi config show # effective configuration
|
|
86
|
+
caasi config set tools.isaacsim.default "6.0"
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Every command supports `--help`. Data commands support `--json` for scripting:
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
caasi gpu status --json | jq '.gpus[0]["memory.used"]'
|
|
93
|
+
if caasi doctor --quiet; then echo "environment ready"; fi
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Simulations, training jobs and ROS launches start **detached** and are tracked as *runs* —
|
|
97
|
+
the CLI returns immediately and the work survives your terminal:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
caasi sim run experiments/wave.yaml
|
|
101
|
+
caasi run list
|
|
102
|
+
caasi logs latest --follow # Ctrl+C stops following, the run keeps going
|
|
103
|
+
caasi run status latest
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Command surface
|
|
107
|
+
|
|
108
|
+
| Group | Commands | Reference |
|
|
109
|
+
| ------------------- | --------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- |
|
|
110
|
+
| Environment | `doctor`, `gpu status\|info\|memory\|test`, `system status\|memory\|processes`, `info`, `version` | [environment.html](https://a6y3ap.github.io/caasi/environment.html) |
|
|
111
|
+
| Configuration | `config show\|get\|set\|path\|tools` | [configuration.html](https://a6y3ap.github.io/caasi/configuration.html) |
|
|
112
|
+
| Projects | `init`, `setup`, `project info\|validate`, `robot`, `scene`, `task` | [projects.html](https://a6y3ap.github.io/caasi/projects.html) |
|
|
113
|
+
| Runs & logs | `run list\|status\|logs\|stop\|pause\|resume\|delete\|inspect`, `logs` | [runs.html](https://a6y3ap.github.io/caasi/runs.html) |
|
|
114
|
+
| Simulation | `sim run\|status\|check\|stop\|pause\|resume`, `lab status` | [simulation.html](https://a6y3ap.github.io/caasi/simulation.html) |
|
|
115
|
+
| Training | `train`, `benchmark start\|report` | [training.html](https://a6y3ap.github.io/caasi/training.html) |
|
|
116
|
+
| Data & sensors | `dataset generate\|inspect\|convert\|validate`, `sensor list\|inspect\|test`, `vision status\|inspect\|test` | [data.html](https://a6y3ap.github.io/caasi/data.html) |
|
|
117
|
+
| Review | `replay`, `view rviz\|foxglove\|open3d\|attach` | [review.html](https://a6y3ap.github.io/caasi/review.html) |
|
|
118
|
+
| ROS ecosystem | `ros status\|doctor\|list\|launch\|topic\|node\|graph`, `nav status\|launch\|inspect\|test`, `moveit status\|launch\|plan\|test`, `control status\|list\|check` | [ros.html](https://a6y3ap.github.io/caasi/ros.html) |
|
|
119
|
+
| Native & shell | `native run\|sim\|lab\|ros`, `shell` | [native.html](https://a6y3ap.github.io/caasi/native.html) |
|
|
120
|
+
| Remote & containers | `remote list\|connect\|run`, `container list\|check\|run` | [remote.html](https://a6y3ap.github.io/caasi/remote.html) |
|
|
121
|
+
|
|
122
|
+
More examples:
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
caasi train experiments/ant.yaml --steps 500000 --envs 4096
|
|
126
|
+
caasi ros status && caasi nav launch --map maps/warehouse.yaml
|
|
127
|
+
caasi container run nvcr.io/nvidia/isaac-sim:5.1.0 ./runheadless.sh
|
|
128
|
+
caasi remote run gpu-box python train.py --steps 1000
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## Configuration
|
|
132
|
+
|
|
133
|
+
Global config lives at `~/.config/caasi/config.yaml`; a project-local `./caasi.yaml`
|
|
134
|
+
is merged on top. Override the global file with `CAASI_CONFIG` or `--config`;
|
|
135
|
+
`CAASI_LANG` overrides the language.
|
|
136
|
+
|
|
137
|
+
```yaml
|
|
138
|
+
language: en
|
|
139
|
+
tools:
|
|
140
|
+
isaacsim:
|
|
141
|
+
default: "6.0"
|
|
142
|
+
versions:
|
|
143
|
+
"6.0": { path: /opt/isaac-sim-6.0 }
|
|
144
|
+
"5.1": { path: /opt/isaac-sim-5.1 }
|
|
145
|
+
remotes:
|
|
146
|
+
gpu-box:
|
|
147
|
+
host: 10.0.0.5
|
|
148
|
+
user: robot
|
|
149
|
+
port: 2222
|
|
150
|
+
identity: ~/.ssh/id_ed25519
|
|
151
|
+
path: ~/experiments
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
Manage it with `caasi config show|get|set|path|tools`.
|
|
155
|
+
|
|
156
|
+
## Examples
|
|
157
|
+
|
|
158
|
+
[`examples/navigation.yaml`](examples/navigation.yaml) is a commented experiment config —
|
|
159
|
+
the input format shared by `sim run`, `train`, `benchmark start` and `dataset generate`:
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
caasi sim run examples/navigation.yaml --dry-run # print the launch command, start nothing
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## Tests
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
pytest
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
## Documentation
|
|
172
|
+
|
|
173
|
+
Read it at <https://a6y3ap.github.io/caasi/> or open
|
|
174
|
+
[`docs/index.html`](docs/index.html) directly in a browser.
|
|
175
|
+
|
|
176
|
+
## License
|
|
177
|
+
|
|
178
|
+
MIT © [a6y3ap](https://github.com/a6y3ap) — see [LICENSE](LICENSE).
|
caasi-0.1.0/README.md
ADDED
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
# Caasi
|
|
2
|
+
|
|
3
|
+
A lightweight, **CLI-first orchestration layer** for NVIDIA Isaac Sim, Isaac Lab and the
|
|
4
|
+
wider robotics ecosystem (ROS 2, Nav2, MoveIt 2, ros2\_control, ...).
|
|
5
|
+
|
|
6
|
+
Headless-first. CLI-first. Process-oriented. Visualization-independent.
|
|
7
|
+
|
|
8
|
+
**Documentation:** <https://a6y3ap.github.io/caasi/>
|
|
9
|
+
|
|
10
|
+
> **Note:** Caasi is an independent open-source project. It is not affiliated with,
|
|
11
|
+
> endorsed by, or an official product of NVIDIA.
|
|
12
|
+
|
|
13
|
+
## Philosophy
|
|
14
|
+
|
|
15
|
+
- **Use existing software. Don't reinvent it.** Caasi discovers, configures, launches,
|
|
16
|
+
connects, monitors and manages tools that already exist.
|
|
17
|
+
- **Simulation is not visualization.** Run headless by default; attach a viewer only when needed.
|
|
18
|
+
- **Minimum required stack.** The Caasi process itself stays lightweight and never imports the
|
|
19
|
+
heavy Isaac stack, PyTorch or rclpy — it only delegates to them.
|
|
20
|
+
- **Don't become another ROS.** ROS orchestration is delegated to the real `ros2` tooling.
|
|
21
|
+
- **Unix-friendly.** Small commands, `--json` output, sensible exit codes.
|
|
22
|
+
|
|
23
|
+
## Install
|
|
24
|
+
|
|
25
|
+
Requires Python 3.10+ on Linux. The Isaac stack, ROS 2 and PyTorch are *discovered*, not
|
|
26
|
+
installed, by Caasi.
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
pip install caasi
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Or from source:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
git clone https://github.com/a6y3ap/caasi.git
|
|
36
|
+
cd caasi
|
|
37
|
+
pip install -e . # add pytest as well: pip install -e ".[dev]"
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Either way this installs the `caasi` command. Shell completion is available:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
caasi --install-completion
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Quickstart
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
caasi doctor # diagnose the whole environment
|
|
50
|
+
caasi doctor --component nvidia # one section only
|
|
51
|
+
caasi gpu status # GPU overview via nvidia-smi
|
|
52
|
+
caasi system status # OS / CPU / RAM / disk summary
|
|
53
|
+
caasi info # CLI + configured/detected ecosystem versions
|
|
54
|
+
caasi config show # effective configuration
|
|
55
|
+
caasi config set tools.isaacsim.default "6.0"
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Every command supports `--help`. Data commands support `--json` for scripting:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
caasi gpu status --json | jq '.gpus[0]["memory.used"]'
|
|
62
|
+
if caasi doctor --quiet; then echo "environment ready"; fi
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Simulations, training jobs and ROS launches start **detached** and are tracked as *runs* —
|
|
66
|
+
the CLI returns immediately and the work survives your terminal:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
caasi sim run experiments/wave.yaml
|
|
70
|
+
caasi run list
|
|
71
|
+
caasi logs latest --follow # Ctrl+C stops following, the run keeps going
|
|
72
|
+
caasi run status latest
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Command surface
|
|
76
|
+
|
|
77
|
+
| Group | Commands | Reference |
|
|
78
|
+
| ------------------- | --------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- |
|
|
79
|
+
| Environment | `doctor`, `gpu status\|info\|memory\|test`, `system status\|memory\|processes`, `info`, `version` | [environment.html](https://a6y3ap.github.io/caasi/environment.html) |
|
|
80
|
+
| Configuration | `config show\|get\|set\|path\|tools` | [configuration.html](https://a6y3ap.github.io/caasi/configuration.html) |
|
|
81
|
+
| Projects | `init`, `setup`, `project info\|validate`, `robot`, `scene`, `task` | [projects.html](https://a6y3ap.github.io/caasi/projects.html) |
|
|
82
|
+
| Runs & logs | `run list\|status\|logs\|stop\|pause\|resume\|delete\|inspect`, `logs` | [runs.html](https://a6y3ap.github.io/caasi/runs.html) |
|
|
83
|
+
| Simulation | `sim run\|status\|check\|stop\|pause\|resume`, `lab status` | [simulation.html](https://a6y3ap.github.io/caasi/simulation.html) |
|
|
84
|
+
| Training | `train`, `benchmark start\|report` | [training.html](https://a6y3ap.github.io/caasi/training.html) |
|
|
85
|
+
| Data & sensors | `dataset generate\|inspect\|convert\|validate`, `sensor list\|inspect\|test`, `vision status\|inspect\|test` | [data.html](https://a6y3ap.github.io/caasi/data.html) |
|
|
86
|
+
| Review | `replay`, `view rviz\|foxglove\|open3d\|attach` | [review.html](https://a6y3ap.github.io/caasi/review.html) |
|
|
87
|
+
| ROS ecosystem | `ros status\|doctor\|list\|launch\|topic\|node\|graph`, `nav status\|launch\|inspect\|test`, `moveit status\|launch\|plan\|test`, `control status\|list\|check` | [ros.html](https://a6y3ap.github.io/caasi/ros.html) |
|
|
88
|
+
| Native & shell | `native run\|sim\|lab\|ros`, `shell` | [native.html](https://a6y3ap.github.io/caasi/native.html) |
|
|
89
|
+
| Remote & containers | `remote list\|connect\|run`, `container list\|check\|run` | [remote.html](https://a6y3ap.github.io/caasi/remote.html) |
|
|
90
|
+
|
|
91
|
+
More examples:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
caasi train experiments/ant.yaml --steps 500000 --envs 4096
|
|
95
|
+
caasi ros status && caasi nav launch --map maps/warehouse.yaml
|
|
96
|
+
caasi container run nvcr.io/nvidia/isaac-sim:5.1.0 ./runheadless.sh
|
|
97
|
+
caasi remote run gpu-box python train.py --steps 1000
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## Configuration
|
|
101
|
+
|
|
102
|
+
Global config lives at `~/.config/caasi/config.yaml`; a project-local `./caasi.yaml`
|
|
103
|
+
is merged on top. Override the global file with `CAASI_CONFIG` or `--config`;
|
|
104
|
+
`CAASI_LANG` overrides the language.
|
|
105
|
+
|
|
106
|
+
```yaml
|
|
107
|
+
language: en
|
|
108
|
+
tools:
|
|
109
|
+
isaacsim:
|
|
110
|
+
default: "6.0"
|
|
111
|
+
versions:
|
|
112
|
+
"6.0": { path: /opt/isaac-sim-6.0 }
|
|
113
|
+
"5.1": { path: /opt/isaac-sim-5.1 }
|
|
114
|
+
remotes:
|
|
115
|
+
gpu-box:
|
|
116
|
+
host: 10.0.0.5
|
|
117
|
+
user: robot
|
|
118
|
+
port: 2222
|
|
119
|
+
identity: ~/.ssh/id_ed25519
|
|
120
|
+
path: ~/experiments
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Manage it with `caasi config show|get|set|path|tools`.
|
|
124
|
+
|
|
125
|
+
## Examples
|
|
126
|
+
|
|
127
|
+
[`examples/navigation.yaml`](examples/navigation.yaml) is a commented experiment config —
|
|
128
|
+
the input format shared by `sim run`, `train`, `benchmark start` and `dataset generate`:
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
caasi sim run examples/navigation.yaml --dry-run # print the launch command, start nothing
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## Tests
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
pytest
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## Documentation
|
|
141
|
+
|
|
142
|
+
Read it at <https://a6y3ap.github.io/caasi/> or open
|
|
143
|
+
[`docs/index.html`](docs/index.html) directly in a browser.
|
|
144
|
+
|
|
145
|
+
## License
|
|
146
|
+
|
|
147
|
+
MIT © [a6y3ap](https://github.com/a6y3ap) — see [LICENSE](LICENSE).
|
|
File without changes
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/* Caasi CLI documentation — copy buttons for caasi commands.
|
|
2
|
+
* Injects a small "copy" button next to every command that invokes caasi:
|
|
3
|
+
* • each `$ caasi …` input line of a terminal example (pre.term .in),
|
|
4
|
+
* • each synopsis block (pre.syn) whose signature starts with caasi.
|
|
5
|
+
* Output lines, YAML/JSON samples and non-caasi shell lines are left alone.
|
|
6
|
+
* The async clipboard API is tried first, with an execCommand fallback
|
|
7
|
+
* because the docs are also read straight off disk (file://), where
|
|
8
|
+
* navigator.clipboard is frequently unavailable.
|
|
9
|
+
*/
|
|
10
|
+
(function () {
|
|
11
|
+
"use strict";
|
|
12
|
+
|
|
13
|
+
var LABEL = "copy";
|
|
14
|
+
|
|
15
|
+
// caasi counts as "the command" when it starts the line or follows a shell
|
|
16
|
+
// separator (&&, ||, ;, |, (, $(, sudo) — not when it is merely an argument
|
|
17
|
+
// or a path component (`cd caasi`, `~/.caasi/runs`).
|
|
18
|
+
var CAASI_CALL = /(?:^|&&|\|\||[;|(]|\$\(|\bsudo)\s*caasi(?:\s|$)/;
|
|
19
|
+
|
|
20
|
+
function legacyCopy(text) {
|
|
21
|
+
var area = document.createElement("textarea");
|
|
22
|
+
area.value = text;
|
|
23
|
+
area.setAttribute("readonly", "");
|
|
24
|
+
area.style.cssText = "position:fixed;top:0;left:-9999px;opacity:0";
|
|
25
|
+
document.body.appendChild(area);
|
|
26
|
+
area.select();
|
|
27
|
+
var ok = false;
|
|
28
|
+
try {
|
|
29
|
+
ok = document.execCommand("copy");
|
|
30
|
+
} catch (e) {
|
|
31
|
+
ok = false;
|
|
32
|
+
}
|
|
33
|
+
document.body.removeChild(area);
|
|
34
|
+
return ok ? Promise.resolve() : Promise.reject(new Error("copy failed"));
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function writeClipboard(text) {
|
|
38
|
+
if (navigator.clipboard && navigator.clipboard.writeText) {
|
|
39
|
+
return navigator.clipboard.writeText(text).catch(function () {
|
|
40
|
+
return legacyCopy(text);
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
return legacyCopy(text);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/* host — the element the button is appended to (styled absolute in CSS). */
|
|
47
|
+
function attach(host, text) {
|
|
48
|
+
var button = document.createElement("button");
|
|
49
|
+
var timer = 0;
|
|
50
|
+
|
|
51
|
+
button.type = "button";
|
|
52
|
+
button.className = "copy-cmd";
|
|
53
|
+
button.textContent = LABEL;
|
|
54
|
+
button.title = "Copy: " + text.split("\n")[0];
|
|
55
|
+
button.setAttribute("aria-label", "Copy command to clipboard");
|
|
56
|
+
|
|
57
|
+
function flash(message, cls) {
|
|
58
|
+
window.clearTimeout(timer);
|
|
59
|
+
button.textContent = message;
|
|
60
|
+
button.classList.add(cls);
|
|
61
|
+
timer = window.setTimeout(function () {
|
|
62
|
+
button.textContent = LABEL;
|
|
63
|
+
button.classList.remove("done", "fail");
|
|
64
|
+
}, 1400);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
button.addEventListener("click", function () {
|
|
68
|
+
writeClipboard(text).then(
|
|
69
|
+
function () {
|
|
70
|
+
flash("copied", "done");
|
|
71
|
+
},
|
|
72
|
+
function () {
|
|
73
|
+
flash("failed", "fail");
|
|
74
|
+
}
|
|
75
|
+
);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
host.appendChild(button);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function install() {
|
|
82
|
+
var lines = document.querySelectorAll("pre.term .in");
|
|
83
|
+
Array.prototype.forEach.call(lines, function (line) {
|
|
84
|
+
var text = line.textContent.replace(/\s+$/, "");
|
|
85
|
+
if (CAASI_CALL.test(text)) attach(line, text);
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
var synopses = document.querySelectorAll("pre.syn");
|
|
89
|
+
Array.prototype.forEach.call(synopses, function (pre) {
|
|
90
|
+
var code = pre.querySelector("code");
|
|
91
|
+
if (!code) return;
|
|
92
|
+
var text = code.textContent.replace(/\s+$/, "");
|
|
93
|
+
if (/^caasi(?:\s|$)/m.test(text)) attach(pre, text);
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
document.addEventListener("DOMContentLoaded", install);
|
|
98
|
+
})();
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/* Caasi CLI documentation — shared sidebar navigation.
|
|
2
|
+
* Every page includes this script; it renders the nav into <aside id="sidebar">
|
|
3
|
+
* and marks the current page/section as active.
|
|
4
|
+
*/
|
|
5
|
+
(function () {
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
var NAV = [
|
|
9
|
+
{
|
|
10
|
+
title: "Getting Started",
|
|
11
|
+
items: [
|
|
12
|
+
{ href: "index.html", label: "Overview" },
|
|
13
|
+
{ href: "index.html#architecture", label: "Architecture", sub: true },
|
|
14
|
+
{ href: "index.html#installation", label: "Installation", sub: true },
|
|
15
|
+
{ href: "index.html#quickstart", label: "Quickstart", sub: true },
|
|
16
|
+
{ href: "index.html#conventions", label: "Global options & conventions", sub: true },
|
|
17
|
+
{ href: "index.html#command-map", label: "Command map", sub: true }
|
|
18
|
+
]
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
title: "Fundamentals",
|
|
22
|
+
items: [
|
|
23
|
+
{ href: "environment.html", label: "Environment" },
|
|
24
|
+
{ href: "environment.html#doctor", label: "doctor", sub: true },
|
|
25
|
+
{ href: "environment.html#gpu", label: "gpu", sub: true },
|
|
26
|
+
{ href: "environment.html#system", label: "system", sub: true },
|
|
27
|
+
{ href: "environment.html#info", label: "info & version", sub: true },
|
|
28
|
+
{ href: "configuration.html", label: "Configuration" },
|
|
29
|
+
{ href: "configuration.html#files", label: "Files & precedence", sub: true },
|
|
30
|
+
{ href: "configuration.html#tools", label: "Tool registry", sub: true },
|
|
31
|
+
{ href: "configuration.html#config-cmd", label: "caasi config", sub: true },
|
|
32
|
+
{ href: "configuration.html#env-vars", label: "Environment variables", sub: true },
|
|
33
|
+
{ href: "runs.html", label: "Runs & Logs" },
|
|
34
|
+
{ href: "runs.html#model", label: "The run model", sub: true },
|
|
35
|
+
{ href: "runs.html#run", label: "caasi run", sub: true },
|
|
36
|
+
{ href: "runs.html#logs", label: "caasi logs", sub: true }
|
|
37
|
+
]
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
title: "Projects",
|
|
41
|
+
items: [
|
|
42
|
+
{ href: "projects.html", label: "Project workflow" },
|
|
43
|
+
{ href: "projects.html#init", label: "init", sub: true },
|
|
44
|
+
{ href: "projects.html#setup", label: "setup", sub: true },
|
|
45
|
+
{ href: "projects.html#project", label: "project", sub: true },
|
|
46
|
+
{ href: "projects.html#definitions", label: "robot / scene / task", sub: true }
|
|
47
|
+
]
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
title: "Simulation & Training",
|
|
51
|
+
items: [
|
|
52
|
+
{ href: "simulation.html", label: "sim & lab" },
|
|
53
|
+
{ href: "simulation.html#experiment", label: "Experiment YAML", sub: true },
|
|
54
|
+
{ href: "simulation.html#sim-run", label: "sim run", sub: true },
|
|
55
|
+
{ href: "simulation.html#sim-control", label: "sim status/check/stop", sub: true },
|
|
56
|
+
{ href: "simulation.html#lab", label: "lab status", sub: true },
|
|
57
|
+
{ href: "training.html", label: "train & benchmark" },
|
|
58
|
+
{ href: "training.html#train", label: "train", sub: true },
|
|
59
|
+
{ href: "training.html#benchmark", label: "benchmark", sub: true }
|
|
60
|
+
]
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
title: "Data & Review",
|
|
64
|
+
items: [
|
|
65
|
+
{ href: "data.html", label: "dataset / sensor / vision" },
|
|
66
|
+
{ href: "data.html#dataset", label: "dataset", sub: true },
|
|
67
|
+
{ href: "data.html#sensor", label: "sensor", sub: true },
|
|
68
|
+
{ href: "data.html#vision", label: "vision", sub: true },
|
|
69
|
+
{ href: "review.html", label: "replay & view" },
|
|
70
|
+
{ href: "review.html#replay", label: "replay", sub: true },
|
|
71
|
+
{ href: "review.html#view", label: "view", sub: true }
|
|
72
|
+
]
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
title: "ROS Ecosystem",
|
|
76
|
+
items: [
|
|
77
|
+
{ href: "ros.html", label: "ros / nav / moveit / control" },
|
|
78
|
+
{ href: "ros.html#ros", label: "ros", sub: true },
|
|
79
|
+
{ href: "ros.html#nav", label: "nav (Nav2)", sub: true },
|
|
80
|
+
{ href: "ros.html#moveit", label: "moveit (MoveIt 2)", sub: true },
|
|
81
|
+
{ href: "ros.html#control", label: "control (ros2_control)", sub: true }
|
|
82
|
+
]
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
title: "Advanced",
|
|
86
|
+
items: [
|
|
87
|
+
{ href: "native.html", label: "native & shell" },
|
|
88
|
+
{ href: "native.html#native", label: "native", sub: true },
|
|
89
|
+
{ href: "native.html#shell", label: "shell", sub: true },
|
|
90
|
+
{ href: "remote.html", label: "remote & container" },
|
|
91
|
+
{ href: "remote.html#remote", label: "remote", sub: true },
|
|
92
|
+
{ href: "remote.html#container", label: "container", sub: true }
|
|
93
|
+
]
|
|
94
|
+
}
|
|
95
|
+
];
|
|
96
|
+
|
|
97
|
+
function currentFile() {
|
|
98
|
+
var path = window.location.pathname;
|
|
99
|
+
var file = path.substring(path.lastIndexOf("/") + 1);
|
|
100
|
+
return file === "" ? "index.html" : file;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function render() {
|
|
104
|
+
var sidebar = document.getElementById("sidebar");
|
|
105
|
+
if (!sidebar) return;
|
|
106
|
+
var here = currentFile();
|
|
107
|
+
var hash = window.location.hash;
|
|
108
|
+
var html = "";
|
|
109
|
+
|
|
110
|
+
NAV.forEach(function (group) {
|
|
111
|
+
html += '<div class="nav-group"><div class="nav-title">' + group.title + "</div>";
|
|
112
|
+
group.items.forEach(function (item) {
|
|
113
|
+
var file = item.href.split("#")[0];
|
|
114
|
+
var anchor = item.href.indexOf("#") >= 0 ? item.href.split("#")[1] : "";
|
|
115
|
+
var active =
|
|
116
|
+
file === here &&
|
|
117
|
+
(anchor === "" ? hash === "" || hash === "#" + (item.sub ? "" : anchor) : hash === "#" + anchor);
|
|
118
|
+
if (file === here && anchor !== "" && hash === "#" + anchor) active = true;
|
|
119
|
+
var cls = (item.sub ? "sub" : "") + (active ? " active" : "");
|
|
120
|
+
html += '<a class="' + cls.trim() + '" href="' + item.href + '">' + item.label + "</a>";
|
|
121
|
+
});
|
|
122
|
+
html += "</div>";
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
sidebar.innerHTML = html;
|
|
126
|
+
|
|
127
|
+
// If only the page (no hash) matches, highlight the top-level entry.
|
|
128
|
+
if (!hash) {
|
|
129
|
+
var links = sidebar.querySelectorAll('a:not(.sub)');
|
|
130
|
+
links.forEach(function (a) {
|
|
131
|
+
if (a.getAttribute("href").split("#")[0] === here) a.classList.add("active");
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function installToggle() {
|
|
137
|
+
var toggle = document.getElementById("nav-toggle");
|
|
138
|
+
if (!toggle) return;
|
|
139
|
+
toggle.addEventListener("click", function () {
|
|
140
|
+
document.body.classList.toggle("nav-open");
|
|
141
|
+
});
|
|
142
|
+
document.getElementById("sidebar").addEventListener("click", function (e) {
|
|
143
|
+
if (e.target.tagName === "A") document.body.classList.remove("nav-open");
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
document.addEventListener("DOMContentLoaded", function () {
|
|
148
|
+
render();
|
|
149
|
+
installToggle();
|
|
150
|
+
});
|
|
151
|
+
})();
|