Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
76f54ee
Normalize perception compose contracts and belief authority defaults
lewkoo Mar 16, 2026
5be3b6e
Refactor perception configuration to use HARU_TOPIC_PREFIX for namesp…
lewkoo Apr 8, 2026
e545652
Update .gitignore to include Python cache files and bytecode
lewkoo Apr 10, 2026
f3346c1
Update Docker configurations and environment variables for perception…
lewkoo Apr 10, 2026
303be5a
Update perception configuration to normalize skeleton output topic an…
lewkoo Apr 11, 2026
3413406
Update Azure Kinect topic configurations for consistency and clarity
lewkoo Apr 11, 2026
583e458
Merge branch 'develop' into feature/topic-normalize
lewkoo Apr 15, 2026
c02d32d
Update perception stack images to use environment variable overrides
lewkoo Apr 15, 2026
7f4ee05
Update camera info topic paths in perception configuration
lewkoo Apr 16, 2026
b2153de
Use topic normalize reasoner image
lewkoo Apr 21, 2026
c169e5c
Use topic normalize faces image
lewkoo Apr 21, 2026
3581d64
Refactor simulator command and update environment configurations for ROS
lewkoo Apr 23, 2026
e16baf1
Update reasoner image reference in download script to use variable
lewkoo Apr 23, 2026
e2dbc43
Add FACES_DATA_ROOT and ROS_HOME environment variables in docker-comp…
lewkoo Apr 24, 2026
46c90b0
Isolate perception ROS domain
lewkoo Apr 29, 2026
6bbf30c
Disable perception ffmpeg RGB decode bridges
lewkoo Apr 29, 2026
8a4a113
Change /tf reliability to reliable (for compatibility with agent_reas…
darryllam May 6, 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
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,7 @@
data
envs/*.secrets.env
__pycache__/
*.pyc
*.pyo
*.pyd
*$py.class
103 changes: 95 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -157,12 +157,13 @@ It’s made up of several Docker images that work together.

To install it, run:
```bash
docker pull ghcr.io/haru-project/strawberry-ros-azure-kinect:latest
docker pull ghcr.io/haru-project/strawberry-ros-skeletons:latest
docker pull ghcr.io/haru-project/strawberry-ros-faces-module:latest
docker pull ghcr.io/haru-project/strawberry-ros-azure-kinect:feature-topic-normalize
docker pull ghcr.io/haru-project/strawberry-ros-skeletons:feature-topic-normalize
docker pull ghcr.io/haru-project/strawberry-ros-faces-module:feature-topic-normalize
docker pull ghcr.io/haru-project/strawberry-ros-hands:latest
docker pull ghcr.io/haru-project/haru-belief:feature-topic-normalize
docker pull ghcr.io/haru-project/haru-viz:feature-topic-normalize
docker pull ghcr.io/haru-project/strawberry-ros-people:latest
Copy link

Copilot AI Apr 15, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The install instructions still include pulling strawberry-ros-people:latest, but this PR removes the people service from the default perception compose stack (replaced by haru-belief). This makes the image pull list misleading; drop strawberry-ros-people here or explain when it’s still needed.

Suggested change
docker pull ghcr.io/haru-project/strawberry-ros-people:latest

Copilot uses AI. Check for mistakes.
docker pull ghcr.io/haru-project/strawberry-ros-visualization:latest
docker pull ghcr.io/haru-project/strawberry-resource-monitor:latest
docker pull ghcr.io/haru-project/haru-speech:ros2
docker pull ghcr.io/haru-project/haru-llm:feature-eval-test
Expand All @@ -187,6 +188,24 @@ To quickly validate all compose files, run:
bash scripts/validate_compose.sh
```

### Perception image matrix

The default perception stack is intended to run as a tested image set rather than a mix of floating branch lines:

```text
azure-kinect ghcr.io/haru-project/strawberry-ros-azure-kinect:feature-topic-normalize
skeletons ghcr.io/haru-project/strawberry-ros-skeletons:feature-topic-normalize
faces ghcr.io/haru-project/strawberry-ros-faces-module:feature-topic-normalize
haru-belief ghcr.io/haru-project/haru-belief:feature-topic-normalize
haru-viz ghcr.io/haru-project/haru-viz:feature-topic-normalize
hands ghcr.io/haru-project/strawberry-ros-hands:latest
resource-monitor ghcr.io/haru-project/strawberry-resource-monitor:latest
```

`hands` and `resource-monitor` still default to `latest` because those images are not currently published on the same branch line. Override any service image with `*_IMAGE=...` in `envs/perception.env` or the shell environment when you need a different tested tag or an immutable digest.

`haru-belief` and `haru-viz` should publish image-level healthchecks through `ros2-ci` using `healthcheck-nodes`, `healthcheck-topics`, and `healthcheck-services`. The perception compose file relies on those image healthchecks rather than maintaining repo-local overrides.

### All-in-one compose (single file)

If you want to launch all layers from a single compose file, use:
Expand All @@ -199,6 +218,74 @@ This uses `envs/all.env` for compose-time variables. Optional services still res
bash scripts/compose.sh all --profile tts --profile webui up --force-recreate -d
```

### Isolated perception ROS domain

This branch runs perception on a separate ROS domain by default. Perception
services use `HARU_PERCEPTION_ROS_DOMAIN_ID` (default `20`) and non-perception
services keep using the existing `ROS_DOMAIN_ID`.

Start the perception stack with:

```bash
bash scripts/compose.sh perception up --force-recreate -d
```

or the combined stack with:

```bash
bash scripts/compose.sh all up --force-recreate -d
```

The separate `perception-domain-bridge` container is the only ROS bridge between
the perception and robot/application domains. Docker networking is unchanged in
this phase.

The bridge allowlist is tracked in `config/perception_domain_bridge.yaml`.
It bridges only:

- `/perception/fusion/persons`
- `/strawberry/people`
- `/tf`
- `/tf_static`
- `/haru_speech/speech_to_text/status_array` from the existing domain back to perception
- `/haru_speech/speech_to_text/result` from the existing domain back to perception

It does not bridge raw Kinect, image, depth, ffmpeg, zdepth, audio, faces,
skeletons, hands, or debug image topics.

Validation commands:

```bash
# Existing robot/application domain should not see raw perception topics.
ROS_DOMAIN_ID=0 ros2 topic list | rg '/perception/sensor/kinect|/perception/proc/(faces|skeletons)|ffmpeg|zdepth|depth_to_rgb|camera_info'

# Existing domain should see bridged semantic outputs.
ROS_DOMAIN_ID=0 ros2 topic echo --once /perception/fusion/persons
ROS_DOMAIN_ID=0 ros2 topic echo --once /strawberry/people
ROS_DOMAIN_ID=0 ros2 topic echo --once /tf

# Perception domain should see speech status/results bridged back in.
ROS_DOMAIN_ID=${HARU_PERCEPTION_ROS_DOMAIN_ID:-20} ros2 topic echo --once /haru_speech/speech_to_text/status_array
ROS_DOMAIN_ID=${HARU_PERCEPTION_ROS_DOMAIN_ID:-20} ros2 topic echo --once /haru_speech/speech_to_text/result
```

The first command should produce no matches.

### Perception-domain recorder

The recorder is isolated to the perception ROS domain in this branch. It records
only topics visible on `HARU_PERCEPTION_ROS_DOMAIN_ID`, which includes raw/internal
perception topics and any speech topics bridged back into perception.

```bash
HARU_RECORDER_SESSION_ID=trial-001 \
bash scripts/compose.sh recorder up --force-recreate -d
```

Recordings are written under
`data/perception/haru_recorder/recordings/domains/perception/`. The recorder does
not attach to the existing robot/application `ROS_DOMAIN_ID`.

### Haru Simulator (HS)

The Haru Simulator uses a graphical interface, so you need to allow Docker to show windows on your screen. Run the following command in your terminal before starting the simulator:
Expand Down Expand Up @@ -317,13 +404,13 @@ We recommend starting them **one at a time** so you can confirm each one runs co

**Start command**:
```bash
bash scripts/compose.sh perception up azure-kinect skeletons faces hands people visualization --force-recreate -d
bash scripts/compose.sh perception up azure-kinect skeletons faces hands haru-belief haru-viz resource-monitor --force-recreate -d
```

**Expected output**:
- An RViz window appears showing:
- Live camera feed
- Detected skeletons and tracking markers
- Perception, fusion, and monitoring come up on their configured perception tags, while `haru-viz` runs from `ghcr.io/haru-project/haru-viz:develop`
- The `haru-viz` web UI is reachable at `http://127.0.0.1:5173`
- rosbridge stays co-located with `haru-viz` and continues using ports `9090`, `9091`, and `9092`

**Related repositories for debug**: [strawberry-ros-people](https://github.com/haru-project/strawberry-ros-people/tree/ros2)
Copy link

Copilot AI Apr 15, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This section still points readers to strawberry-ros-people for perception-layer debugging, but the PR’s perception stack no longer runs the people service by default. Update the “Related repositories for debug” link to match the services users are actually running (e.g., haru-belief, haru-viz, strawberry-ros-skeletons, etc.).

Suggested change
**Related repositories for debug**: [strawberry-ros-people](https://github.com/haru-project/strawberry-ros-people/tree/ros2)
**Related repositories for debug**: [haru-belief](https://github.com/haru-project/haru-belief/tree/ros2), [haru-viz](https://github.com/haru-project/haru-viz), [strawberry-ros-skeletons](https://github.com/haru-project/strawberry-ros-skeletons/tree/ros2)

Copilot uses AI. Check for mistakes.

Expand Down
16 changes: 12 additions & 4 deletions apps/docker-compose-all.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,21 +22,29 @@ services:
file: docker-compose-perception.yaml
service: hands

people:
haru-belief:
extends:
file: docker-compose-perception.yaml
service: people
service: haru-belief

visualization:
haru-viz:
extends:
file: docker-compose-perception.yaml
service: visualization
service: haru-viz

resource-monitor:
extends:
file: docker-compose-perception.yaml
service: resource-monitor

perception-domain-bridge:
extends:
file: docker-compose-perception.yaml
service: perception-domain-bridge
depends_on:
haru-belief:
condition: service_started

# Speech layer
audio:
extends:
Expand Down
15 changes: 10 additions & 5 deletions apps/docker-compose-llm.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@ services:
]
env_file:
- ../envs/llm.env
- ../envs/llm.secrets.env
- path: ../envs/llm.secrets.env
required: false
environment:
- REDIS_HOST=127.0.0.1
- REDIS_PORT=6379
Expand All @@ -36,7 +37,8 @@ services:
command: ["/bin/bash", "-c", "$PACKAGE_VENV -c 'from haru_llm.dashboard.app import run; run()'"]
env_file:
- ../envs/llm.env
- ../envs/llm.secrets.env
- path: ../envs/llm.secrets.env
required: false
ports:
- 8501:8501
depends_on:
Expand Down Expand Up @@ -67,7 +69,8 @@ services:
- "--config=/app/config.yaml"
env_file:
- ../envs/llm.env
- ../envs/llm.secrets.env
- path: ../envs/llm.secrets.env
required: false
ports:
- 4050:4000
extra_hosts:
Expand All @@ -89,7 +92,8 @@ services:
image: ghcr.io/open-webui/open-webui:main
env_file:
- ../envs/llm.env
- ../envs/llm.secrets.env
- path: ../envs/llm.secrets.env
required: false
ports:
- 8080:8080
volumes:
Expand Down Expand Up @@ -120,7 +124,8 @@ services:
- "--gpu-memory-utilization=0.9"
env_file:
- ../envs/llm.env
- ../envs/llm.secrets.env
- path: ../envs/llm.secrets.env
required: false
ports:
- 8000:8000
volumes:
Expand Down
Loading