Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/setup_hil.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ This repository is compatible with the following system:
#### Clone the Repository

```shell
git clone git@github.com:RobotecAI/agentic-mobile-manipulator.git
git clone https://github.com/RobotecAI/agentic-mobile-manipulator.git
cd agentic-mobile-manipulator
```

Expand Down
2 changes: 1 addition & 1 deletion docs/setup_sim.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ This repository is compatible with the following system:
#### Clone the Repository

```shell
git clone git@github.com:RobotecAI/agentic-mobile-manipulator.git
git clone https://github.com/RobotecAI/agentic-mobile-manipulator.git
cd agentic-mobile-manipulator
```

Expand Down
19 changes: 12 additions & 7 deletions docs/setup_single_machine.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,7 @@ This repository is compatible with the following system:
#### Clone the Repository

```shell
cd /home/${USER}
git clone git@github.com:RobotecAI/agentic-mobile-manipulator.git
git clone https://github.com/RobotecAI/agentic-mobile-manipulator.git
cd agentic-mobile-manipulator
```

Expand Down Expand Up @@ -75,16 +74,22 @@ pixi run -e local build-llama # this step is hardware specific. By default, it b
pixi run -e local download-models # or download the models manually, check the links below
```

`pixi run download-models` fetches all required models in parallel using `aria2c` and places them in `$DEMO_ROOT/models/`. Already downloaded files are skipped. If a download is interrupted, re-running the command will resume from where it left off.

---

### Download Models

For every model configured in `config.toml`, download the GGUF file and place it in `$DEMO_ROOT/models/`:
The following models are required for local inference. `pixi run download-models` handles all of them automatically, but the links below are provided for reference or manual download:

| Model | Type | Size |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- | ----------------- |
| [GPT-OSS-20B](https://huggingface.co/unsloth/gpt-oss-20b-GGUF/resolve/main/gpt-oss-20b-Q4_K_M.gguf?download=true) | LLM | ~12 GB |
| [LFM2-VL-3B](https://huggingface.co/LiquidAI/LFM2-VL-3B-GGUF/resolve/main/LFM2-VL-3B-Q8_0.gguf?download=true) + [mmproj](https://huggingface.co/LiquidAI/LFM2-VL-3B-GGUF/resolve/main/mmproj-LFM2-VL-3B-Q8_0.gguf?download=true) | VLM | ~3.2 GB + ~0.5 GB |
| [Qwen3-Embedding-0.6B](https://huggingface.co/Qwen/Qwen3-Embedding-0.6B-GGUF/resolve/main/Qwen3-Embedding-0.6B-Q8_0.gguf?download=true) | Embedding | ~0.6 GB |
| [Qwen3-Reranker-0.6B](https://huggingface.co/ggml-org/Qwen3-Reranker-0.6B-Q8_0-GGUF/resolve/main/qwen3-reranker-0.6b-q8_0.gguf?download=true) | Reranker | ~0.6 GB |

- [GPT-OSS-20B](https://huggingface.co/unsloth/gpt-oss-20b-GGUF/resolve/main/gpt-oss-20b-Q4_K_M.gguf?download=true)
- [LFM2-VL-3B-GGUF](https://huggingface.co/LiquidAI/LFM2-VL-3B-GGUF/resolve/main/LFM2-VL-3B-Q8_0.gguf?download=true) + [mmproj](https://huggingface.co/LiquidAI/LFM2-VL-3B-GGUF/resolve/main/mmproj-LFM2-VL-3B-Q8_0.gguf?download=true)
- [Qwen3-Embedding-0.6B](https://huggingface.co/Qwen/Qwen3-Embedding-0.6B-GGUF/resolve/main/Qwen3-Embedding-0.6B-Q8_0.gguf?download=true)
- [Qwen3-Reranker-0.6B](https://huggingface.co/ggml-org/Qwen3-Reranker-0.6B-Q8_0-GGUF/resolve/main/qwen3-reranker-0.6b-q8_0.gguf?download=true)
All files should be placed in `$DEMO_ROOT/models/`.

---

Expand Down
2 changes: 1 addition & 1 deletion monitoring/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ On **tested hardware**:
1. Install dependencies with poetry:

```bash
git clone git@github.com:RobotecAI/agentic-mobile-manipulator.git
git clone https://github.com/RobotecAI/agentic-mobile-manipulator.git
cd agentic-mobile-manipulator/monitoring
poetry install
```
Expand Down
23 changes: 23 additions & 0 deletions pixi.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

53 changes: 44 additions & 9 deletions pixi.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,13 @@ platforms = ["linux-64"]
# ─── Activation ─────────────────────────────────────────────────────────────────
# scripts/setup_env.sh sources the ros2_ws overlay when available.
[activation]
env = {DEMO_ROOT = "${PIXI_PROJECT_ROOT}"}
env = { DEMO_ROOT = "${PIXI_PROJECT_ROOT}" }
scripts = ["scripts/setup_env.sh"]

[dependencies]
uv = ">=0.5"
aria2 = ">=1.37"

# ─── ROS 2 Jazzy (RoboStack) ─────────────────────────────────────────────────
# The full ROS 2 runtime comes from the robostack-jazzy conda channel.
# pixi runs RoboStack's activation scripts automatically, so AMENT_PREFIX_PATH,
Expand Down Expand Up @@ -215,23 +218,44 @@ depends-on = ["clone-gems", "clone-ros2-ws"]
description = "Clone all repositories (gems and ROS 2 workspace)"

[feature.profile-default.tasks.setup]
depends-on = ["clone", "install-o3de", "fetch-gems", "build-ros2", "build-sim", "sync"]
depends-on = [
"clone",
"install-o3de",
"fetch-gems",
"build-ros2",
"build-sim",
"sync",
]
description = "Full setup (O3DE + ROS 2 + Python)"

[feature.profile-hil.tasks.setup]
depends-on = ["clone-ros2-ws", "build-ros2", "sync"]
description = "Setup HIL machine (ROS 2 + Python, no O3DE)"

[feature.profile-hil-local.tasks.setup]
depends-on = ["clone-ros2-ws", "clone-inference", "build-ros2", "sync", "build-llama"]
depends-on = [
"clone-ros2-ws",
"clone-inference",
"build-ros2",
"sync",
"build-llama",
]
description = "Setup HIL machine with local llama.cpp inference"

[feature.profile-local.tasks.clone]
depends-on = ["clone-gems", "clone-ros2-ws"]
description = "Clone all repositories (gems and ROS 2 workspace)"

[feature.profile-local.tasks.setup]
depends-on = ["clone", "install-o3de", "fetch-gems", "build-ros2", "build-sim", "sync", "build-llama"]
depends-on = [
"clone",
"install-o3de",
"fetch-gems",
"build-ros2",
"build-sim",
"sync",
"build-llama",
]
description = "Full setup including local llama.cpp inference"

[feature.profile-local.tasks.demo]
Expand Down Expand Up @@ -276,8 +300,19 @@ description = "Run test suite"
# e.g. `build-sim` cannot be run in the `hil` environment.

[environments]
default = {features = ["dev", "ros2", "sim", "profile-default"]}
hil = {features = ["dev", "ros2", "profile-hil"]}
hil-local = {features = ["dev", "ros2", "local-inference", "profile-hil-local"]}
local = {features = ["dev", "ros2", "sim", "local-inference", "profile-local"]}
dev = {features = ["dev"], no-default-feature = true}
default = { features = ["dev", "ros2", "sim", "profile-default"] }
hil = { features = ["dev", "ros2", "profile-hil"] }
hil-local = { features = [
"dev",
"ros2",
"local-inference",
"profile-hil-local",
] }
local = { features = [
"dev",
"ros2",
"sim",
"local-inference",
"profile-local",
] }
dev = { features = ["dev"], no-default-feature = true }
83 changes: 58 additions & 25 deletions scripts/download_models.sh
Original file line number Diff line number Diff line change
@@ -1,41 +1,74 @@
#!/usr/bin/env bash
set -e
set -euo pipefail

MODELS_DIR="${DEMO_ROOT}/models"
mkdir -p "$MODELS_DIR"

download() {
local name="$1"
local url="$2"
local dest="$3"
if [ -f "$dest" ]; then
echo " [skip] $name — already exists"
else
echo " [download] $name"
wget -q --show-progress -c -O "$dest" "$url"
fi
}
model_names=()
model_urls=()
model_files=()

echo ""
echo "=== Downloading models to $MODELS_DIR ==="
echo ""
add_model() {
model_names+=("$1")
model_urls+=("$2")
model_files+=("$3")
}

download "GPT-OSS-20B (LLM)" \
add_model "GPT-OSS-20B (LLM, ~12 GB)" \
"https://huggingface.co/unsloth/gpt-oss-20b-GGUF/resolve/main/gpt-oss-20b-Q4_K_M.gguf?download=true" \
"$MODELS_DIR/gpt-oss-20b-Q4_K_M.gguf"
"gpt-oss-20b-Q4_K_M.gguf"

download "LFM2-VL-3B (VLM)" \
add_model "LFM2-VL-3B (VLM, ~3.2 GB)" \
"https://huggingface.co/LiquidAI/LFM2-VL-3B-GGUF/resolve/main/LFM2-VL-3B-Q8_0.gguf?download=true" \
"$MODELS_DIR/LFM2-VL-3B-Q8_0.gguf"
"LFM2-VL-3B-Q8_0.gguf"

download "LFM2-VL-3B mmproj" \
add_model "LFM2-VL-3B mmproj (VLM, ~0.5 GB)" \
"https://huggingface.co/LiquidAI/LFM2-VL-3B-GGUF/resolve/main/mmproj-LFM2-VL-3B-Q8_0.gguf?download=true" \
"$MODELS_DIR/mmproj-LFM2-VL-3B-Q8_0.gguf"
"mmproj-LFM2-VL-3B-Q8_0.gguf"

download "Qwen3-Embedding-0.6B (Embed)" \
add_model "Qwen3-Embedding (Embed, ~0.6 GB)" \
"https://huggingface.co/Qwen/Qwen3-Embedding-0.6B-GGUF/resolve/main/Qwen3-Embedding-0.6B-Q8_0.gguf?download=true" \
"$MODELS_DIR/Qwen3-Embedding-0.6B-Q8_0.gguf"
"Qwen3-Embedding-0.6B-Q8_0.gguf"

download "Qwen3-Reranker-0.6B (Rerank)" \
add_model "Qwen3-Reranker (Rerank, ~0.6 GB)" \
"https://huggingface.co/ggml-org/Qwen3-Reranker-0.6B-Q8_0-GGUF/resolve/main/qwen3-reranker-0.6b-q8_0.gguf?download=true" \
"$MODELS_DIR/qwen3-reranker-0.6b-q8_0.gguf"
"qwen3-reranker-0.6b-q8_0.gguf"

echo ""
echo "=== Downloading models to $MODELS_DIR ==="
echo ""

input_lines=()
for i in "${!model_names[@]}"; do
dest="$MODELS_DIR/${model_files[$i]}"
if [ -f "$dest" ] && [ ! -f "${dest}.aria2" ]; then
echo " [skip] ${model_names[$i]}"
else
echo " [fetch] ${model_names[$i]}"
input_lines+=("${model_urls[$i]}")
input_lines+=(" out=${model_files[$i]}")
fi
done

if [ ${#input_lines[@]} -eq 0 ]; then
echo ""
echo " All models already present."
echo ""
exit 0
fi

echo ""
echo " Starting parallel download..."
echo ""
printf '%s\n' "${input_lines[@]}" | aria2c \
--input-file=- \
--dir="$MODELS_DIR" \
--continue=true \
--max-concurrent-downloads=5 \
--max-connection-per-server=4 \
--split=4 \
--console-log-level=warn

echo ""
echo "=== All models ready in $MODELS_DIR ==="
echo ""
Loading