Skip to content

Instantly share code, notes, and snippets.

@cardboardcode
Created August 21, 2026 08:29
Show Gist options
  • Select an option

  • Save cardboardcode/b21aa55651d2e1af4940c0b41be39a16 to your computer and use it in GitHub Desktop.

Select an option

Save cardboardcode/b21aa55651d2e1af4940c0b41be39a16 to your computer and use it in GitHub Desktop.
For People In A Hurry: How To Set Up Zenoh Bridge on a Turtlebot4

Note

This is a quick copy-paste-observe guide that shows you how to set up and run a Zenoh Bridge.

Please refer to the references below if unclear on what is a Zenoh Bridge.

Instruction(s) πŸ“˜

  1. Download binaries for Zenoh Bridge.

Release Page: https://github.com/eclipse-zenoh/zenoh-plugin-ros2dds/releases/tag/1.9.0 Asset Name: zenoh-plugin-ros2dds-1.9.0-aarch64-unknown-linux-gnu-standalone.zip

wget https://github.com/eclipse-zenoh/zenoh-plugin-ros2dds/releases/download/1.9.0/zenoh-plugin-ros2dds-1.9.0-aarch64-unknown-linux-gnu-standalone.zip

Note

Last verified working with the above version of Zenoh Bridge

  1. Unpack the following binary:
unzip zenoh-plugin-ros2dds-1.9.0-aarch64-unknown-linux-gnu-standalone.zip zenoh-bridge-ros2dds
  1. Create the following config.json5 Zenoh Bridge configuration file:
{
  plugins: {
    ros2dds: {}
  },

  mode: "client",

  connect: {
    endpoints: [
      "tcp/<INSERT IP ADDRESS OF ZENOH ROUTER HERE>:7447"
    ]
  }
}

Replace <INSERT IP ADDRESS OF ZENOH ROUTER HERE> with the actual IP address of a Zenoh Router you intend to use. Eg. 192.168.100.50

Note

For further details on how to configure, please refer to this template DEFAULT_CONFIG.json5.

  1. Run Zenoh Bridge manually using the command below:
./zenoh-bridge-ros2dds -c config.json5

Reference(s) πŸ“š

  1. What is Zenoh - https://zenoh.io/docs/overview/what-is-zenoh/
  2. Integrating ROS 2 with Eclipse Zenoh - https://zenoh.io/blog/2021-04-28-ros2-integration/
  3. Can't teleoperate TB4 with remote PC - turtlebot/turtlebot4#494 (comment)
@cardboardcode

cardboardcode commented Aug 21, 2026

Copy link
Copy Markdown
Author

Looking To Run Zenoh Bridge Detached?

It would get very cumbersome and inefficient if you have to start Zenoh Bridge manually for multiple Turtlebot4s in your fleet. Therefore, follow the steps below to run Zenoh Bridge as a boot-persistent service daemon:

Instructions πŸ“˜

nano ~/.config/systemd/user/zenoh-bridge.service
[Unit]
Description=Zenoh Bridge ROS 2 DDS
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
Environment="ROS_DOMAIN_ID=0"
Environment="RMW_IMPLEMENTATION=rmw_cyclonedds_cpp"
Environment="ROS_AUTOMATIC_DISCOVERY_RANGE=SUBNET"
Environment="ROS_DISABLE_TYPE_HASH_CHECK=1"
ExecStart=<INSERT PATH TO ZENOH BRIDGE BINARY>/zenoh-bridge-ros2dds -c <INSERT PATH TO ZENOH CONFIG JSON >/config.json5
Restart=on-failure
RestartSec=5

[Install]
WantedBy=default.target

Replace <INSERT PATH TO ZENOH BRIDGE BINARY> with the directory path to the binary.
Replace <INSERT PATH TO ZENOH CONFIG JSON > with the directory path to the .json5 configuration file.

systemctl --user daemon-reload
systemctl --user enable zenoh-bridge.service
systemctl --user start zenoh-bridge.service

Verify βœ…

systemctl --user status zenoh-bridge.service

It should show that its status to be active.

journalctl --user -u zenoh-bridge.service -f

@cardboardcode

cardboardcode commented Aug 21, 2026

Copy link
Copy Markdown
Author

Optimized Turtlebot4 Zenoh Bridge Configuration

Use the following .json5 configuration file to minimize network bandwidth use by Zenoh Bridge and avoid potential Turtlebot4 Create4 base hardware failure:

{
  plugins: {
    ros2dds: {
      allow: {
        // ROS 2 topics published by the TurtleBot 4
        publishers: [
          "^/odom$",
          "^/scan$",
          "^/tf$",
          "^/tf_static$",
          "^/map$",
          "^/map_metadata$",
          "^/amcl_pose$",
          "^/battery_state$",
          "^/robot_state$",
          "^/clock$",
          "^/rosout$",
          "^/parameter_events$"
        ],

        // ROS 2 topics consumed by the TurtleBot 4
        subscribers: [
          "^/cmd_vel$",
          "^/initialpose$",
          "^/goal_pose$",
          "^/clock$",
          "^/parameter_events$"
        ],

        // Keep services disabled unless you specifically need
        // remote parameter/service interaction.
        service_servers: [],

        service_clients: [],

        // Keep actions disabled for now. See note below.
        action_servers: [],
        action_clients: []
      }
    }
  },

  mode: "client",

  connect: {
    endpoints: [
      "tcp/<INSERT IP ADDRESS OF ZENOH ROUTER HERE>:7447"
    ]
  }
}

Replace <INSERT IP ADDRESS OF ZENOH ROUTER HERE> with the actual IP address of a Zenoh Router.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment