Skip to content

Commit fd5f156

Browse files
Updates
1 parent b33c662 commit fd5f156

File tree

5 files changed

+27
-29
lines changed

5 files changed

+27
-29
lines changed

content/learning-paths/cross-platform/zenoh-multinode-ros2/2_zenoh-install.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ This section shows you how to install and build the open-source Eclipse Zenoh pr
1313

1414
The following instructions have been verified on Raspberry Pi 4 and 5, but you can use any Arm Linux device. These steps apply to Raspberry Pi and other Arm-based Linux platforms. Before building Zenoh, make sure your system has the necessary development tools and runtime libraries.
1515

16-
### Install the Rust development environment
16+
## Install the Rust development environment
1717

1818
First, install the [Rust](https://www.rust-lang.org/) environment. The core of Zenoh is developed in Rust for performance and safety.
1919

@@ -36,13 +36,13 @@ source "$HOME/.cargo/env"
3636

3737
For more information, see the [Rust Install Guide](/install-guides/rust/) for Arm Linux.
3838

39-
### Install ROS 2
39+
## Install ROS 2
4040

4141
[Robot Operating System](https://www.ros.org/) is a set of software libraries and tools that help you build robot applications. ROS provides everything from drivers to state-of-the-art algorithms, as well as developer tools. It is completely open-source.
4242

4343
If you plan to use Zenoh alongside ROS 2, for example, to bridge DDS-based nodes, you should install ROS 2 before proceeding. See the [ROS2 Installation Guide](/install-guides/ros2/) to install ROS 2 on your Arm platforms.
4444

45-
### Download and build the Zenoh source
45+
## Download and build the Zenoh source
4646

4747
Clone the Zenoh repository:
4848

content/learning-paths/cross-platform/zenoh-multinode-ros2/3_zenoh-multinode.md

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ If you’ve already installed Zenoh on an Arm Cortex-A or Neoverse platform as s
1515

1616
To simplify and scale deployment across multiple devices, this section shows how to containerize Zenoh with Docker for streamlined distribution and consistent multi-node testing. This containerized approach enables repeatable rollouts and makes it easier to test distributed communication across Raspberry Pi, Arm cloud instances (like AWS Graviton), and Arm Virtual Hardware.
1717

18-
In this session, you’ll use Raspberry Pi boards to simulate a scalable distributed environment. The same workflow applies to any Arm Linux system, including cloud instances and virtual hardware. This setup allows you to simulate real-world, cross-node communication scenarios, making it ideal for evaluating Zenoh’s performance in robotics and industrial IoT applications. Zenoh is ideal for robotics and industrial IoT systems that require fast, decentralized communication. It supports scalable data exchange across devices using pub/sub, storage, and query models.
18+
In this session, you’ll use Raspberry Pi boards to simulate a scalable distributed environment. The same workflow applies to any Arm Linux system, including cloud instances and virtual hardware. This setup allows you to simulate real-world, cross-node communication scenarios, making it ideal for evaluating Zenoh’s performance in robotics and industrial IoT applications. This setup simulates real-world, cross-node communication scenarios, making it ideal for robotics and industrial IoT applications that require fast, decentralized messaging using pub/sub, storage, and query models.
1919

20-
### Install Docker on Raspberry Pi
20+
## Install Docker on Raspberry Pi
2121
To simplify this process and ensure consistency, you can use Docker to containerize your Zenoh and ROS 2 environment. This lets you quickly replicate the same runtime on any device without needing to rebuild from source.
2222

2323
This enables scalable, multi-node testing in realistic distributed environments.
@@ -29,7 +29,7 @@ curl -fsSL get.docker.com -o get-docker.sh && sh get-docker.sh
2929
sudo usermod -aG docker $USER ; newgrp docker
3030
```
3131

32-
### Create a ROS 2 + Zenoh Docker image
32+
## Create a Docker image with ROS 2 and Zenoh
3333

3434
To ensure compatibility with ROS-related tools, create a `Dockerfile` based on `ros:galactic `, and use the official Rust installation method to build Zenoh, as shown below.
3535

@@ -107,11 +107,12 @@ docker pull odinlmshen/zenoh-node
107107
Once built, you can reuse this Docker image across multiple Arm-based nodes, including Raspberry Pi, AWS Graviton, and Arm Virtual Hardware.
108108
{{% /notice %}}
109109

110-
### Transfer the Docker image to the other Raspberry Pi
110+
## Transfer the Docker image to another Raspberry Pi
111+
111112

112113
There are two options to transfer the Docker image to your second device. Choose one of the following methods.
113114

114-
Option 1: Save and copy via file
115+
1. Save and copy using the file:
115116

116117
```bash
117118
docker save zenoh-node > zenoh-node.tar
@@ -124,14 +125,11 @@ On the target device:
124125
docker load < zenoh-node.tar
125126
```
126127

127-
Option 2: Push the image to a container registry such as Docker Hub
128+
2. Push the image to a container registry such as Docker Hub:
128129

129130
You can also push the image to Docker Hub or GitHub Container Registry and pull it on the second device.
130131

131-
132-
133-
134-
### Run the Docker image
132+
## Run the Docker image
135133

136134
Once the image is successfully loaded on the second device, you can run the container to start the Zenoh environment.
137135

@@ -154,3 +152,4 @@ The following sections illustrate the procedures to run the Zenoh examples so as
154152
- Queryable – for enabling on-demand remote computation
155153
- Dynamic queryable with computation – for executing dynamic logic across nodes
156154

155+
With your Zenoh examples running across containers, you’re now ready to build and benchmark real-time communication flows across nodes, which is ideal for simulating robotic fleets or industrial systems.

content/learning-paths/cross-platform/zenoh-multinode-ros2/4_zenoh-ex1-pubsub.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ layout: learningpathall
88

99
## Test Zenoh pub/sub across two devices
1010

11-
This example demonstrates Zenoh's real-time publish/subscribe model across two Raspberry Pi devices.
11+
This example demonstrates how to use Zenohs real-time publish/subscribe model to exchange messages between two Raspberry Pi devices over a local network.
1212

13-
The subscriber listens for all data published under the key expression `demo/example/**`, which matches any topic beginning with `demo/example/`.
13+
Pub/sub is a core Zenoh communication pattern where data producers (publishers) send values to a key, and data consumers (subscribers) receive updates for matching key expressions. In this case, the subscriber listens for all messages published under the key expression `demo/example/**`, which matches any topic that begins with `demo/example/`. This enables flexible topic filtering and lightweight data dissemination across distributed systems.
1414

15-
### Start the subscriber node
15+
## Start the subscriber node
1616

1717
Run the subscriber example on one of the Raspberry Pi systems:
1818

@@ -21,7 +21,7 @@ cd ~/zenoh/target/release/examples
2121
./z_sub
2222
```
2323

24-
### Start the publisher node
24+
## Start the publisher node
2525

2626
Then, log in to the other Raspberry Pi and run the publisher:
2727

@@ -34,7 +34,7 @@ cd ~/zenoh/target/release/examples
3434
You can run both `z_sub` and `z_pub` on the same device for testing, but running them on separate Raspberry Pis demonstrates Zenoh’s distributed discovery and cross-node communication.
3535
{{% /notice %}}
3636

37-
### Observe the pub/sub data flow
37+
## Observe the pub/sub data flow
3838

3939
The results are shown below:
4040

content/learning-paths/cross-platform/zenoh-multinode-ros2/5_zenoh-ex2-storagequery.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ In this example, you’ll run the `zenohd` daemon with in-memory storage and use
2525

2626
This is especially useful for distributed systems where nodes may intermittently connect or request snapshots of state from peers.
2727

28-
### Start the Zenoh daemon with in-memory storage
28+
## Start the Zenoh daemon with in-memory storage
2929

3030
On one Raspberry Pi, launch the Zenoh daemon with a configuration that enables in-memory storage for keys in the `demo/example/**` directory.
3131

@@ -40,7 +40,7 @@ You should see log messages indicating that the storage_manager plugin is loaded
4040

4141
If port 7447 is already in use, either stop any previous Zenoh processes or configure a custom port using the `listen.endpoints.router` setting.
4242

43-
### Publish a value
43+
## Publish a value
4444

4545
On 2nd Raspberry Pi device, use `z_put` to send a key-value pair that will be handled by the `zenohd` storage.
4646

@@ -51,7 +51,7 @@ cd ~/zenoh/target/release/examples
5151

5252
This command stores the string `Hello from storage!` under the key demo/example/test1.
5353

54-
### Query the stored value
54+
## Query the stored value
5555

5656
Back on first Raspberry Pi, you can now query the stored data from any Zenoh connected node.
5757

content/learning-paths/cross-platform/zenoh-multinode-ros2/6_zenoh-ex3-queryable.md

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,17 @@ layout: learningpathall
99

1010
## Computation on query
1111

12-
This example demonstrates Zenoh's queryable capability, which lets a node respond to incoming data requests by computing results in real time, rather than returning previously stored values.
12+
This example shows how to use Zenohs queryable feature to return computed results in real time, instead of serving pre-stored values.
1313

14-
Unlike `zenohd` which simply returns stored data, a queryable node can register to handle a specific key expression and generate responses at runtime. This is ideal for distributed computing at the edge, where lightweight devices, such as Raspberry Pi nodes, can respond to requests with calculated values. This enables sensor fusion, AI inference results, and diagnostics.
14+
Unlike `zenohd` which simply returns stored data, a queryable node can register to handle a specific key expression and generate responses at runtime. This is ideal for distributed computing at the edge, where lightweight devices, such as Raspberry Pi nodes, can respond to requests with calculated values. This pattern is ideal for sensor fusion, lightweight AI inference, and dynamic system diagnostics on resource-constrained edge devices.
1515

16-
### Use case: estimate battery health on demand
16+
## Use case: estimate battery health on demand
1717

1818
Imagine a robot fleet management system where the central planner queries each robot for its latest battery health score, which is not published continuously but calculated only when queried.
1919

2020
This reduces bandwidth usage and enables edge-side optimization using Zenoh's queryable feature.
2121

22-
### Launch a queryable node
22+
## Launch a queryable node
2323

2424
On one Raspberry Pi device, run the `z_queryable` Zenoh example to register a queryable handler.
2525

@@ -38,7 +38,7 @@ Press CTRL-C to quit...
3838

3939
The node is now ready to accept queries on the key `demo/example/zenoh-rs-queryable` and respond with a predefined message.
4040

41-
### Trigger a query from another node
41+
## Trigger a query from another node
4242

4343
On the other Raspberry Pi device, run the `z_get` example.
4444

@@ -59,10 +59,9 @@ The result is shown below:
5959

6060
![img3 Zenoh queryable node responding to on-demand queries from a remote device#center](zenoh_ex3.gif "Figure 3: Computation on Query using Queryable")
6161

62-
The value you receive is generated in real time by the function defined in the queryable handler, not from pre-stored data.
62+
The response is generated dynamically by the queryable handler, and not fetched from stored data.
6363

64-
65-
### Real-world application: distributed inference and computation
64+
## Real-world use cases
6665

6766
This model enables edge-based intelligence, such as:
6867
- Executing custom logic in response to a query such as “calculate load average”

0 commit comments

Comments
 (0)