Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
14 commits
Select commit Hold shift + click to select a range
1b3d025
:heavy_plus_sign: Added supplementary Dockerfile.nav2 to run dual Nav…
cardboardcode Aug 21, 2026
1c95d7e
:blue_book: Added Method 3 under Building Instructions for purely loc…
cardboardcode Aug 21, 2026
7fe080c
:blue_book: Made coherent the last section header in root README.md t…
cardboardcode Aug 21, 2026
0772c19
:blue_book: Added new section to surface Nav2 integration features of…
cardboardcode Aug 21, 2026
91bcfe3
:blue_book: Added docker build and run instructions under nav2_integr…
cardboardcode Aug 21, 2026
951b88f
:blue_book: Utilized warning highlight formatting for fore-warnining …
cardboardcode Aug 22, 2026
83d7df1
:hammer: Added specific label on what type of desktop gui config type…
cardboardcode Aug 22, 2026
ebcf16a
:fire: Removed Dockerfile.nav2.
cardboardcode Aug 24, 2026
648a6bb
:hammer: Update nav2 integration package README.md to use Dockerfile.…
cardboardcode Aug 24, 2026
ed9db9a
:hammer: Updated Dockerfile.base to retain next_gen_prototype binarie…
cardboardcode Aug 24, 2026
e1244ed
:blue_book: Added whale emojis to make it easier to find docker-relat…
cardboardcode Aug 24, 2026
c658b81
:blue_book: Corrected corresponding docker-centric instructs for each…
cardboardcode Aug 24, 2026
aeb210a
:hammer: Ensured docker build label is consistent throughout guides.
cardboardcode Sep 3, 2026
752d555
:hammer: Optimised Dockerfile.base to minimise build time and have re…
cardboardcode Sep 3, 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
26 changes: 23 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ on discourse.

# Setup & Building

:warning: As this is a project under construction, these instructions are likely to change rapidly.
> [!WARNING]
> As this is a project under construction, these instructions are likely to change rapidly.

## Pre-requisites

Expand Down Expand Up @@ -48,7 +49,7 @@ on discourse.
</details>

<details>
<summary><b>Method 2: Using a container (click here)</b></summary>
<summary><b>Method 2: Using distrobox (click here)</b></summary>

> We pre-build base containers with all the dependencies you can use `rocker`, `distrobox`, `podman` or any other oci compliant tool to get a base dev environment. For the purposes of this set of instructions we use distrobox:
> ```bash
Expand All @@ -57,6 +58,15 @@ on discourse.
> ```
</details>

<details>
<summary><b>Method 3: Using docker container (click here)</b></summary>

> If you prefer to build the base Docker image from scratch. Please use the following command:
> ```bash
> docker build --load -t ros2_rust_base:jazzy -f docker/Dockerfile.base .
> ```
</details>

### 2. Import Workspace Dependencies
Create a workspace and clone the repo:
```bash
Expand Down Expand Up @@ -85,7 +95,10 @@ Verify core scenario coordination and robust following behavior:
colcon test --packages-select rmf_path_server_test --event-handlers console_direct+
```

## Running the Interactive Web Demonstration
## Running Interactive Web Demonstration

> [!NOTE]
> This provides a lightweight visualization of how `next_gen_prototype` utilizes `mapf` to guide multiple robot agents towards their goal while managing their traffic.

https://github.com/user-attachments/assets/d5793eee-515d-49a9-a92c-9926617b48ed

Expand All @@ -98,3 +111,10 @@ ros2 launch rmf_path_server_demo demo.launch.py
2. Click **Add Robot** to drop active participants onto the canvas.
3. Select a robot and click a cell to place its goal.
4. Click **Send Scenario** to observe multi-agent trajectory generation and live execution progress.

## Running Nav2 Integration Demonstration

> [!NOTE]
> This shows users how `next_gen_prototype`'s prototype messages and traffic management design is used for multi-robot coordinations through [Nav2](https://docs.nav2.org/) navigation system.

Follow instructions in [nav2_integration/README.md](./nav2_integration/README.md).
22 changes: 12 additions & 10 deletions docker/Dockerfile.base
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ RUN apt-get update && apt-get upgrade -y && \
python3-colcon-cargo\
libssl-dev \
pkg-config \
&& rm -rf /var/lib/apt/lists/*
ros-${ROS_DISTRO}-rmw-cyclonedds-cpp \
ros-${ROS_DISTRO}-rmw-zenoh-cpp

# Install colcon extensions for Rust
RUN pip3 install --no-cache-dir --break-system-packages colcon-ros-cargo
Expand All @@ -30,27 +31,28 @@ RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --no
cargo install cargo-ament-build && \
chmod -R a+rwX /usr/local/cargo /usr/local/rustup


# Initialize Underlay Workspace
WORKDIR /opt/ros2_rust_ws

# Stage the prototype branch to resolve its rosdep system dependencies directly into the base image
COPY . /tmp/next_gen_prototype

# Install ROS 2 dependencies via rosdep for both underlay and prototype branch
RUN apt-get update && \
rosdep init || true && \
RUN rosdep init || true && \
rosdep update && \
rosdep install --from-paths /tmp/next_gen_prototype --ignore-src -yr --skip-keys="rclrs ament_cargo ament_python" && \
rm -rf /var/lib/apt/lists/* && \
rm -rf /tmp/next_gen_prototype
rm -rf /var/lib/apt/lists/*

WORKDIR /nav2_traffic_ws

# Build the Underlay Workspace
#RUN /bin/bash -c "source /opt/ros/jazzy/setup.bash && \
# colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release"
RUN mkdir src && mv /tmp/next_gen_prototype /nav2_traffic_ws/src/next_gen_prototype
RUN /bin/bash -c "source /opt/ros/${ROS_DISTRO}/setup.bash && \
colcon build --packages-up-to sp_demo_nav2_bringup rmf_nav2_traffic rmf_path_server_demo rmf_path_server_test --cmake-args -DCMAKE_BUILD_TYPE=Release && \
rm -rf build/ log/ src/"

# Provide automatic sourcing entrypoint configuration inside ~/.bashrc
RUN echo "source /opt/ros/jazzy/setup.bash" >> /root/.bashrc
#echo "source /opt/ros2_rust_ws/install/setup.bash" >> /root/.bashrc
RUN echo "source /opt/ros/${ROS_DISTRO}/setup.bash" >> /root/.bashrc
RUN echo "source /nav2_traffic_ws/install/setup.bash" >> /root/.bashrc

CMD ["/bin/bash"]
178 changes: 172 additions & 6 deletions nav2_integration/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -91,8 +91,23 @@ graph TD

## Try out the demo

### Docker Setup

### Setup
Follow the steps below to use pre-made `docker/Dockerfile.base` to run the demo containerized without fuss:

<details>
<summary><b>Click here 🐳.</b></summary>

```bash
docker build --load -t ros2_rust_base:jazzy -f docker/Dockerfile.base .
```

</details>

> [!WARNING]
> This process typically takes about **20 minutes**, depending on internet connectivity strength.

### Manual Setup

Do a fresh update & upgrade:
```
Expand Down Expand Up @@ -133,18 +148,86 @@ colcon build --packages-up-to sp_demo_nav2_bringup rmf_nav2_traffic rmf_path_ser
With the workspace built and sourced, run the following nodes:

Spin up the Nav2 simulation:
```
```bash
ros2 launch sp_demo_nav2_bringup cloned_multi_tb3_simulation_launch.py robots:="robot0={x: 0.0, y: 5.0, yaw: 0.0}; robot1={x: 3.0, y: 5.0, yaw: 0.0};"
```

In a separate terminal, run the demo launch file containing the path server, plan executor, destination server, path visualizer and Nav2 traffic nodes:
<details>
<summary><b>Click here if running in docker container (GPU + X11) 🐳.</b></summary>

```bash
xhost +local:docker

docker run -it --rm \
--name ros2_rust_base_c \
--gpus all \
--env="DISPLAY" \
--env="QT_X11_NO_MITSHM=1" \
-v /tmp/.X11-unix:/tmp/.X11-unix \
--device=/dev/dri \
ros2_rust_base:jazzy \
bash -c "source /nav2_traffic_ws/install/setup.bash && \
ros2 launch sp_demo_nav2_bringup cloned_multi_tb3_simulation_launch.py \
robots:=\"robot0={x: 0.0, y: 5.0, yaw: 0.0}; robot1={x: 3.0, y: 5.0, yaw: 0.0};\""
```
</details>

<details>
<summary><b>Click here if running in docker container (GPU + Wayland) 🐳.</b></summary>

```bash
xhost +local:docker

docker run -it --rm \
--name ros2_rust_base_c \
--gpus all \
--env="DISPLAY=${DISPLAY}" \
--env="QT_X11_NO_MITSHM=1" \
-v /tmp/.X11-unix:/tmp/.X11-unix:rw \
--device=/dev/dri \
ros2_rust_base:jazzy \
bash -c "source /nav2_traffic_ws/install/setup.bash && \
ros2 launch sp_demo_nav2_bringup cloned_multi_tb3_simulation_launch.py \
robots:=\"robot0={x: 0.0, y: 5.0, yaw: 0.0}; robot1={x: 3.0, y: 5.0, yaw: 0.0};\""
```
</details>

<details>
<summary><b>Click here if running in docker container (CPU) 🐳.</b></summary>

```bash
xhost +local:docker

docker run -it --rm \
--name ros2_rust_base_c \
--env="DISPLAY=${DISPLAY}" \
--env="QT_X11_NO_MITSHM=1" \
-v /tmp/.X11-unix:/tmp/.X11-unix:rw \
--device=/dev/dri \
ros2_rust_base:jazzy \
bash -c "source /nav2_traffic_ws/install/setup.bash && \
ros2 launch sp_demo_nav2_bringup cloned_multi_tb3_simulation_launch.py \
robots:=\"robot0={x: 0.0, y: 5.0, yaw: 0.0}; robot1={x: 3.0, y: 5.0, yaw: 0.0};\""
```
</details>

In a separate terminal, run the demo launch file containing the path server, plan executor, destination server, path visualizer and Nav2 traffic nodes:
```bash
ros2 launch rmf_path_server_demo demo_nav2.launch.py robots:="robot0 robot1"
```

Send action goals to the robots:
<details>
<summary><b>Click here if running in docker container 🐳.</b></summary>

```bash
docker exec -it ros2_rust_base_c bash -c "source /nav2_traffic_ws/install/setup.bash && ros2 launch rmf_path_server_demo demo_nav2.launch.py robots:=\"robot0 robot1\""
```

</details>

Send action goals to the robots:

```bash
ros2 action send_goal robot0/navigate_to_pose nav2_msgs/action/NavigateToPose "{
pose: {
header: {
Expand All @@ -158,8 +241,28 @@ ros2 action send_goal robot0/navigate_to_pose nav2_msgs/action/NavigateToPose "{
}
}"
```

<details>
<summary><b>Click here if running in docker container 🐳.</b></summary>

```bash
docker exec -it ros2_rust_base_c bash -c "source /nav2_traffic_ws/install/setup.bash && \
ros2 action send_goal robot0/navigate_to_pose nav2_msgs/action/NavigateToPose \"{
pose: {
header: {
stamp: {sec: 0, nanosec: 0},
frame_id: 'map'
},
pose: {
position: {x: 5.0, y: 5.0, z: 0.0},
orientation: {x: 0.0, y: 0.0, z: 0.0, w: 1.0}
}
}
}\"
"
```
</details>

```bash
ros2 action send_goal robot1/navigate_to_pose nav2_msgs/action/NavigateToPose "{
pose: {
header: {
Expand All @@ -174,9 +277,30 @@ ros2 action send_goal robot1/navigate_to_pose nav2_msgs/action/NavigateToPose "{
}"
```

<details>
<summary><b>Click here if running in docker container 🐳.</b></summary>

```bash
docker exec -it ros2_rust_base_c bash -c "source /nav2_traffic_ws/install/setup.bash && \
ros2 action send_goal robot1/navigate_to_pose nav2_msgs/action/NavigateToPose \"{
pose: {
header: {
stamp: {sec: 0, nanosec: 0},
frame_id: 'map'
},
pose: {
position: {x: 0.0, y: 3.0, z: 0.0},
orientation: {x: 0.0, y: 0.0, z: 0.0, w: 1.0}
}
}
}\"
"
```
</details>

Alternate navigation goals:

```
```bash
ros2 action send_goal robot0/navigate_to_pose nav2_msgs/action/NavigateToPose "{
pose: {
header: {
Expand All @@ -191,7 +315,28 @@ ros2 action send_goal robot0/navigate_to_pose nav2_msgs/action/NavigateToPose "{
}"
```

<details>
<summary><b>Click here if running in docker container 🐳.</b></summary>

```bash
docker exec -it ros2_rust_base_c bash -c "source /nav2_traffic_ws/install/setup.bash && \
ros2 action send_goal robot0/navigate_to_pose nav2_msgs/action/NavigateToPose \"{
pose: {
header: {
stamp: {sec: 0, nanosec: 0},
frame_id: 'map'
},
pose: {
position: {x: 9.0, y: 3.0, z: 0.0},
orientation: {x: 0.0, y: 0.0, z: 0.0, w: 1.0}
}
}
}\"
"
```
</details>

```bash
ros2 action send_goal robot1/navigate_to_pose nav2_msgs/action/NavigateToPose "{
pose: {
header: {
Expand All @@ -205,3 +350,24 @@ ros2 action send_goal robot1/navigate_to_pose nav2_msgs/action/NavigateToPose "{
}
}"
```

<details>
<summary><b>Click here if running in docker container 🐳.</b></summary>

```bash
docker exec -it ros2_rust_base_c bash -c "source /nav2_traffic_ws/install/setup.bash && \
ros2 action send_goal robot1/navigate_to_pose nav2_msgs/action/NavigateToPose \"{
pose: {
header: {
stamp: {sec: 0, nanosec: 0},
frame_id: 'map'
},
pose: {
position: {x: 9.0, y: 6.0, z: 0.0},
orientation: {x: 0.0, y: 0.0, z: 0.0, w: 1.0}
}
}
}\"
"
```
</details>
Loading