Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
73 commits
Select commit Hold shift + click to select a range
e483ca0
refactor: pixi
maciejmajek May 14, 2026
adf91b1
fix: inference
maciejmajek May 14, 2026
27bc6cd
fix: multithreaded llama build
maciejmajek May 14, 2026
151bac9
fix: reranker model name
maciejmajek May 14, 2026
212f5c1
feat: smoke test colors
maciejmajek May 14, 2026
2791e04
chore: update links
maciejmajek May 14, 2026
f2a869b
docs: update
maciejmajek May 14, 2026
9f71a90
docs: update
maciejmajek May 14, 2026
f6b3dd2
docs: update
maciejmajek May 14, 2026
4a31fa2
feat: demo.sh
maciejmajek May 14, 2026
fce9fca
feat: single command demo run
maciejmajek May 14, 2026
8b696b7
docs: update
maciejmajek May 14, 2026
0e14af3
Update ros2 dependencies
knicked May 20, 2026
b7afd3d
Fix build: update gems.repos
jhanca-robotecai Apr 27, 2026
1c2cc1a
Fix build: update dependencies
jhanca-robotecai Apr 27, 2026
03b59e2
Remove pointless project.json backup
jhanca-robotecai Apr 27, 2026
c835673
Update asset paths in warehouse prefab
knicked May 13, 2026
336b179
Update project registration step
knicked May 20, 2026
fc2267e
Fix ros2_ws sourcing path
knicked May 20, 2026
751ae53
Fix tmux setup for running demo
knicked May 20, 2026
bde9571
Update SpawnEntity parameter for new simulation interfaces
knicked Apr 29, 2026
cca3875
Switch to o3de 2605
knicked Jun 7, 2026
e7225f2
Add custom spawn service handler for entities
knicked Jun 7, 2026
f55a5ca
Fix service handler registration in editor
knicked Jun 7, 2026
9693f88
feat: add pixi task runner to replace manual setup (#23)
maciejmajek Jun 8, 2026
07e33ba
Merge branch 'development' into kd/feat/pixi
maciejmajek Jun 8, 2026
e0960ec
Switch to O3DE SDK
knicked Jun 10, 2026
d2c39e2
Update docker to pixi
knicked Jun 10, 2026
4472988
Use simulation_interfaces version from jazzy
knicked Jun 11, 2026
96ddd8e
Revert format change
knicked Jun 11, 2026
60e3433
Link to ROS2.API instead of ROS2.Static
knicked Jun 11, 2026
f2095d4
Use requires instead of macro for version handling
knicked Jun 11, 2026
b72a9a9
Fix setup_env.sh
knicked Jun 11, 2026
060e955
Update docs
knicked Jun 11, 2026
d31680a
Fix includes
knicked Jun 11, 2026
b6c85e2
Add license information to gem.json
knicked Jun 11, 2026
f140970
WIP: fix docker
knicked Jun 17, 2026
d0e7ea0
WIP: fix docker 2
knicked Jun 17, 2026
101cae7
Merge pull request #25 from RobotecAI/kd/2605pixi
jhanca-robotecai Jun 23, 2026
e3e0b9f
Merge pull request #24 from RobotecAI/kd/feat/pixi
jhanca-robotecai Jun 24, 2026
c349086
style(docs): apply prettier formatting to setup tables (#28)
zakmat Jun 24, 2026
c4a8fba
Initial changes
jhanca-robotecai Jun 23, 2026
5262bcf
ROS 2 deps from submodules to pixi packages
jhanca-robotecai Jun 23, 2026
18041e3
Pre-commit hook changes
jhanca-robotecai Jun 23, 2026
1f78c57
Add dev pixi env for pre-commit
jhanca-robotecai Jun 23, 2026
d29137a
Fix lint env
jhanca-robotecai Jun 24, 2026
ded3060
Code review fixes (AI-bloat)
jhanca-robotecai Jun 24, 2026
f58eb96
Mirror pixi setup from amrcv blueprint
jhanca-robotecai Jun 24, 2026
a765e4d
Fix pixi issues: Editor and GameLauncher work
jhanca-robotecai Jun 24, 2026
726adce
Remove unused level
jhanca-robotecai Jun 24, 2026
6f84372
Code review fixes
maciejmajek Jun 25, 2026
c9dfd9e
Add .dockerignore
jhanca-robotecai Jun 25, 2026
f31c2d7
feat: pixi updates (#27)
maciejmajek Jun 26, 2026
2056c53
chore: bump WheelAnimTool dependency (#33)
jhanca-robotecai Jun 30, 2026
60b34af
chore: freeze deps versions (#31)
maciejmajek Jun 30, 2026
af2dee1
feat: npu workflow (#34)
maciejmajek Jul 1, 2026
2a812a5
ci: build & publish & smoke test (#40)
maciejmajek Jul 2, 2026
febc2f4
docs: update (#42)
maciejmajek Jul 4, 2026
73e959b
feat: agentic trace (#45)
maciejmajek Jul 4, 2026
449ca07
feat: agentic trace (docker) (#46)
maciejmajek Jul 6, 2026
abc2115
fix: escaping chars in demo-trace (#55)
maciejmajek Jul 6, 2026
9f08b89
docs: update (#56)
maciejmajek Jul 8, 2026
876d569
fix: adjust hardcoded model name ini HMI (#57)
maciejmajek Jul 8, 2026
e9998ab
docs: update hmi image (#58)
maciejmajek Jul 9, 2026
a9cd5d4
ci: adjust dispatch (#59)
maciejmajek Jul 9, 2026
3784e4e
Fix pixi test command (#35)
knicked Jul 10, 2026
28025dc
fix: housekeep tool and tests (#37)
knicked Jul 10, 2026
12fc9fa
fix: catch llm exceptions in ros2 agents (#36)
knicked Jul 10, 2026
480b25b
feat: Populate scene using batch spawning (#41)
knicked Jul 14, 2026
04a4910
build: install `tmux` with `apt` (#61)
boczekbartek Jul 14, 2026
55c91ed
test: Remove humanworker from scene when testing (#60)
knicked Jul 14, 2026
f59e0f9
docs: Remove old notice about long spawning (#62)
knicked Jul 15, 2026
b21dc83
feat: read config.toml in hmi (#63)
maciejmajek Jul 15, 2026
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
23 changes: 23 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Build artefacts — contain hardcoded host paths (CMakeCache.txt etc.)
sim/build/
sim/user/
ros2_ws/build/
ros2_ws/install/
ros2_ws/log/

# Cloned at image-build time by pixi tasks — exclude to keep context small
gems/
external/
inference/

# Pixi environment cache
.pixi/

# Large model files
models/

# Developer files
.vscode/
.env
*.egg-info/
__pycache__/
59 changes: 26 additions & 33 deletions .github/workflows/build_and_push_docker.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,52 +4,45 @@ on:
push:
branches:
- main
- development
workflow_dispatch:

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
build-and-push:
runs-on: self-hosted
runs-on: [self-hosted, cpu, heavy, gpu]
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
lfs: true

- name: Log in to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build and push all images
run: |
docker compose -f docker/compose.yaml build
docker compose -f docker/compose.yaml push

- name: Build and push ROS 2 image
uses: docker/build-push-action@v6
with:
context: .
file: docker/Dockerfile.ros2
push: true
tags: |
robotecai/mobile-manipulator-demo-ros2${{ github.ref_name == 'development' && '-development' || '' }}:latest

- name: Build and push Agents image
uses: docker/build-push-action@v6
smoke-test:
needs: build-and-push
runs-on: [self-hosted, cpu, heavy, gpu]
steps:
- name: Log in to Docker Hub
uses: docker/login-action@v3
with:
context: .
file: docker/Dockerfile.agents
push: true
build-args: |
ROS2_IMAGE=robotecai/mobile-manipulator-demo-ros2${{ github.ref_name == 'development' && '-development' || '' }}:latest
tags: |
robotecai/mobile-manipulator-demo-agents${{ github.ref_name == 'development' && '-development' || '' }}:latest
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

- name: Build and push O3DE image
uses: docker/build-push-action@v6
with:
context: .
file: docker/Dockerfile.o3de
push: true
build-args: |
ROS2_IMAGE=robotecai/mobile-manipulator-demo-ros2${{ github.ref_name == 'development' && '-development' || '' }}:latest
tags: |
robotecai/mobile-manipulator-demo-o3de${{ github.ref_name == 'development' && '-development' || '' }}:latest
- name: Headless sim smoke test (/clock)
run: |
IMAGE="robotecai/agentic-mobile-manipulator-o3de:latest"
docker pull "$IMAGE"
docker run --rm --entrypoint pixi "$IMAGE" run sim-smoke

7 changes: 6 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
gems/
engine/
inference/
external/
ros2_ws/install
ros2_ws/build
ros2_ws/src/packages
Expand All @@ -19,3 +19,8 @@ safety_violations.json
imgui.ini
anomaly_images/
package_condition_images/
models/
runs/
*.bak0
sim/user/
backtrace.log
8 changes: 8 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[submodule "inference/llama.cpp"]
path = inference/llama.cpp
url = https://github.com/ggml-org/llama.cpp.git
shallow = true
[submodule "inference/FastFlowLM"]
path = inference/FastFlowLM
url = https://github.com/RobotecAI/FastFlowLM.git
shallow = true
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@ _Physical AI for Warehouse Robotics_
<div align="center">

![Small warehouse featuring Robotnik Kairos](docs/images/demo_comp.jpg)

![CPU: ready](https://img.shields.io/badge/CPU-ready-ED1C24?style=for-the-badge&logo=amd&logoColor=white&labelColor=000000)
![GPU: ready](https://img.shields.io/badge/GPU-ready-ED1C24?style=for-the-badge&logo=amd&logoColor=white&labelColor=000000)
![NPU: ready](https://img.shields.io/badge/NPU-ready-ED1C24?style=for-the-badge&logo=amd&logoColor=white&labelColor=000000)

![Static Badge](https://img.shields.io/badge/AgenticAI-darkred)
![Static Badge](https://img.shields.io/badge/EmbodiedAI-black)
![Static Badge](https://img.shields.io/badge/LLM-darkred)
Expand Down Expand Up @@ -41,6 +46,7 @@ Backup video link: https://vimeo.com/1138627688/dbfa881a27
- Hardware platform: **AMD Ryzen™ AI** processor hosting robotics stack and embodied agentic AI multi-agent system
- Model stack: [**Liquid AI's LFM2-VL**](https://www.liquid.ai/) (Vision-Language Model) optimized for AMD hardware
- Local LLM (gpt-oss-20b) for planning, instruction parsing, and dialogue
- Local inference across **CPU, GPU (llama.cpp / Vulkan) and the AMD Ryzen™ AI NPU (FastFlowLM)** — the safety VLM runs on the NPU, freeing the GPU for the LLM and perception VLM
- Robot platform: Mobile manipulator (Robotnik Kairos) in ROS 2 simulated warehouse environment
- Simulation setup: Hardware-in-the-loop mirrors real-world deployment for safe testing
- Benefits: On-device reasoning, low latency, privacy, and seamless simulation-to-hardware transition
Expand Down
101 changes: 69 additions & 32 deletions cloud_config.toml
Original file line number Diff line number Diff line change
@@ -1,51 +1,88 @@
# ════════════════════════════════════════════════════════════════════════════
# Cloud variant of the inference SSOT (see config.toml for the full schema).
#
# Here the chat/vision endpoints are remote (backend = "openai") and therefore
# NOT served locally — `pixi run inference` skips backend = "openai". Only the
# RAG embedding/reranker still run locally on llama.cpp, exactly as in
# config.toml.
#
# To use it: everything (agents, `pixi run inference`, download-models) reads
# config.toml, so swap this file in and provide the API key:
# cp cloud_config.toml config.toml && export OPENAI_API_KEY=sk-...
#
# Because cloud agents use several distinct remote models, endpoints are split
# per model (chat_mini / vlm_mini / vlm_nano) and agents reference the right one.
# ════════════════════════════════════════════════════════════════════════════

# ─── Endpoints ──────────────────────────────────────────────────────────────

[endpoints.chat_mini]
type = "llm"
backend = "openai"
model = "gpt-5-mini"
base_url = "https://api.openai.com/v1"

[endpoints.vlm_mini]
type = "vlm"
backend = "openai"
model = "gpt-5-mini"
base_url = "https://api.openai.com/v1"

[endpoints.vlm_nano]
type = "vlm"
backend = "openai"
model = "gpt-5-nano"
base_url = "https://api.openai.com/v1"

# RAG models are the only endpoints still served locally (backend = "gpu"):
# `pixi run inference` launches these two llama.cpp servers and skips the
# remote backend = "openai" endpoints above. Same specs as config.toml.
[endpoints.embeddings]
type = "embedding"
backend = "gpu"
model = "qwen3-embedding:0.6b"
host = "localhost"
port = 8082
model_path = "${DEMO_ROOT}/models/Qwen3-Embedding-0.6B-Q8_0.gguf"
model_url = "https://huggingface.co/Qwen/Qwen3-Embedding-0.6B-GGUF/resolve/main/Qwen3-Embedding-0.6B-Q8_0.gguf?download=true"

# NOTE: The reranker and the embedding model are two separate models!
[endpoints.reranker]
type = "reranker"
backend = "gpu"
model = "qwen3-reranker:0.6b"
host = "localhost"
port = 8083
model_path = "${DEMO_ROOT}/models/qwen3-reranker-0.6b-q8_0.gguf"
model_url = "https://huggingface.co/ggml-org/Qwen3-Reranker-0.6B-Q8_0-GGUF/resolve/main/qwen3-reranker-0.6b-q8_0.gguf?download=true"

# ─── Agents ─────────────────────────────────────────────────────────────────

[general]
llm_model = "gpt-5-mini"
llm_base_url = "https://api.openai.com/v1"
llm = "chat_mini"
vlm = "vlm_mini"
llm_reasoning = false
vlm_model = "gpt-5-mini"
vlm_base_url = "https://api.openai.com/v1"
vlm_reasoning = false

# megamind agent utilizes llm for task delegation
# to agents using both llm and vlm for task execution
[megamind_agent]
llm_model = "gpt-5-mini"
llm_base_url = "https://api.openai.com/v1"
vlm_model = "gpt-5-mini"
vlm_base_url = "https://api.openai.com/v1"
llm = "chat_mini"
vlm = "vlm_mini"
llm_reasoning = false
vlm_reasoning = false

# inspection agent uses vlm to determine anomalies in the image
[inspection_agent]
vlm_model = "gpt-5-nano"
vlm_base_url = "https://api.openai.com/v1"
vlm = "vlm_nano"
vlm_reasoning = false
vlm_temperature = 0.0

[condition_agent]
vlm_model = "gpt-5-mini"
vlm_base_url = "https://api.openai.com/v1"
vlm = "vlm_mini"
vlm_reasoning = false
vlm_temperature = 0.1

# safety agent uses vlm to determine anomalies in the image
# and embeddings to determine OSHA safety violations
[safety_agent]
vlm_model = "gpt-5-nano"
vlm_base_url = "https://api.openai.com/v1"
vlm = "vlm_nano"
vlm_reasoning = false
vlm_temperature = 0.0

embeddings_model = "qwen3-embedding:0.6b"
embeddings_base_url = "http://safety-embeddings:8082/v1"
# NOTE: The reranker and the embedding model are two separate models!
reranker_base_url = "http://safety-reranker:8083/v1/reranking"

# INFO:
# Start the EMBEDDING model in llama.cpp using the following command:
# ./llama-server -m /home/user/llamas/gguf/custom_ggufs/Qwen3-Embedding-0.6b_Q8_0.gguf --embedding --pooling last -c 4096 -b 2048 -ub 2048 --port 8082

# INFO:
# Start the RERANKER model in llama.cpp using the following command:
# ./llama-server -m /home/user/llamas/gguf/custom_ggufs/Qwen3-Reranker-0.6B_BF16.gguf --embedding --pooling rank -c 4096 -b 2048 -ub 2048 --port 8083
embeddings = "embeddings"
reranker = "reranker"
Loading
Loading