Skip to content

Booster Zenoh Bridge#2177

Open
julianschuler wants to merge 16 commits intoHULKs:mainfrom
julianschuler:booster-zenoh-bridge
Open

Booster Zenoh Bridge#2177
julianschuler wants to merge 16 commits intoHULKs:mainfrom
julianschuler:booster-zenoh-bridge

Conversation

@julianschuler
Copy link
Member

@julianschuler julianschuler commented Jan 10, 2026

Why? What?

This PR adds a bridge to make the booster ROS interfaces available via zenoh.

Blocked on #2154.

ToDo / Known Issues

  • Has to be started manually

Ideas for Next Iterations (Not This PR)

  • Orchestration: Automatic deployment of the binary

How to Test

./pepsi build crates/zenoh_bridge
rsync target/aarch64-unknown-linux-gnu/debug/zenoh_bridge <booster-ip>:
# On the robot
./zenoh_bridge

Then, listen to the available zenoh topics, e.g. using zenoh-cli.

@github-project-automation github-project-automation bot moved this to Request for Review in Development Jan 10, 2026
@julianschuler julianschuler moved this from Request for Review to In Progress in Development Jan 10, 2026
Copy link
Contributor

@alexschmander alexschmander left a comment

Choose a reason for hiding this comment

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

Initial review. Will continue when #2154 is merged.

@alexschmander alexschmander mentioned this pull request Jan 13, 2026
4 tasks
@alexschmander alexschmander added this to the Booster Hardware 1 milestone Jan 20, 2026
@alexschmander alexschmander moved this from In Progress to Request for Review in Development Jan 20, 2026
@oleflb
Copy link
Contributor

oleflb commented Feb 7, 2026

Initial review. Will continue when #2154 is merged.

@alexschmander #2154 is merged, you can review this

julianschuler and others added 16 commits February 8, 2026 11:50
`/booster_camera_bridge/StereoNetNode/rectified_image` -> `booster/rectified_image`
`/booster_camera_bridge/image_left_raw` -> `booster/image_left_raw`
`/booster_camera_bridge/image_left_raw/camera_info` -> `booster/image_left_raw/camera_info`
- `/booster_camera_bridge/StereoNetNode/rectified_right_image` -> `booster/rectified_right_image`
- `/booster_camera_bridge/StereoNetNode/stereonet_depth` -> `booster/stereonet_depth`
- `/booster_camera_bridge/StereoNetNode/stereonet_visual` -> `booster/stereonet_visual`
- `/booster_camera_bridge/image_right_raw` -> `booster/image_right_raw`
- `/booster_camera_bridge/image_right_raw/camera_info` -> `booster/image_left_raw/camera_info`
@alexschmander
Copy link
Contributor

@schmidma you could review this again now. I should probably not review it myself, since I worked on the the last couple commits...

Comment on lines +105 to +112
let mut stereonet_depth_camera_info_forwarder = spawn_ros_to_zenoh_forwarder::<Image>(
&mut ros_node,
zenoh_session.clone(),
"/StereoNetNode/stereonet_depth",
"camera_info",
MessageTypeName::new("sensor_msgs", "CameraInfo"),
"stereonet_depth/camera_info",
)?;
Copy link
Member

Choose a reason for hiding this comment

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

Shouldn't this be CameraInfo?

"/",
"joint_ctrl",
MessageTypeName::new("booster_interface", "LowCmd"),
"low_command",
Copy link
Member

Choose a reason for hiding this comment

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

The existing hardware interface uses booster/joint_ctrl. Is this intended to now be low_command?

Comment on lines +216 to +221
Ok(tokio::spawn(forward_ros_to_zenoh(
ros_subscription,
zenoh_session,
zenoh_topic_name,
))
.fuse())
Copy link
Member

Choose a reason for hiding this comment

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

I feel like this pattern could be much nicer, when using tokio JoinSets, but proof me wrong ;) This might be a stylistic preference

Comment on lines +172 to +190
let result = select! {
result = button_event_forwarder => result,
result = fall_down_state_forwarder => result,
result = low_state_forwarder => result,
result = origin_left_image_forwarder => result,
result = origin_right_image_forwarder => result,
result = rectified_image_forwarder => result,
result = rectified_right_image_forwarder => result,
result = stereonet_depth_forwarder => result,
result = stereonet_depth_camera_info_forwarder => result,
result = stereonet_visual_forwarder => result,
result = image_combine_raw_forwarder => result,
result = image_left_raw_forwarder => result,
result = image_left_raw_camera_info_forwarder => result,
result = image_right_raw_forwarder => result,
result = image_right_raw_camera_info_forwarder => result,
result = low_command_forwarder => result,
}
.wrap_err("failed to run forwarder to completion")?;
Copy link
Member

Choose a reason for hiding this comment

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

Spawning on tokio JoinSets allow to poll for the next failing task, and then error...

Comment on lines +200 to +204
ros_namespace: &'static str,
ros_topic_name: &'static str,
ros_type_name: MessageTypeName,
zenoh_topic_name: &'static str,
) -> Result<Fuse<JoinHandle<Result<()>>>> {
Copy link
Member

Choose a reason for hiding this comment

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

is this 'static bound necessary here?

@@ -0,0 +1,8 @@
#[derive(Debug, thiserror::Error)]
pub enum Error {
// FIXME: Internal ROS error can not be wrapped due to generics
Copy link
Member

Choose a reason for hiding this comment

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

fixme?

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

Labels

Projects

Status: Request for Review

Development

Successfully merging this pull request may close these issues.

4 participants