Skip to content

feat(bridge_ros2): align REP-105 TF with Nav2 conventions without regressing direct-publish mode#135

Merged
jlblancoc merged 1 commit intodevelopfrom
pr-132
Apr 24, 2026
Merged

feat(bridge_ros2): align REP-105 TF with Nav2 conventions without regressing direct-publish mode#135
jlblancoc merged 1 commit intodevelopfrom
pr-132

Conversation

@jlblancoc
Copy link
Copy Markdown
Member

@jlblancoc jlblancoc commented Apr 23, 2026

Supersedes / revises #132. Keeps the three Nav2/REP-105 improvements from the original PR, but scopes them so they no longer change behavior (or introduce new failure modes) for users who do not use REP-105.

MOLA supports two TF publishing modes for the localization result:

  1. REP-105 modepublish_localization_following_rep105:=True. The bridge publishes map → odom and an external source (wheel odometry, robot_state_publisher, …) provides odom → base_link. Used by
    AMCL, Nav2, slam_toolbox, etc.
  2. Direct modepublish_localization_following_rep105:=False (default for the Smoother, and the documented choice for handheld / drone / no-external-odometry setups). The bridge publishes map → base_link directly; there is no second TF edge carrying motion.

PR #132 improved REP-105 mode but applied the same logic to both modes, which regressed direct mode in two ways:

  • The new node->now() + transform_tolerance stamping replaced the former myNow(l.timestamp) (scan-time) stamping for both modes. Direct-mode consumers that correlate the pose with the scan that produced
    it (offline post-processing, sensor fusion, visualization against recorded bags) started getting future-dated stamps and publish_in_sim_time was silently bypassed.
  • The 20 Hz rebroadcast timer runs in both modes. In REP-105 that is benign: if the localizer stalls, map → odom staying constant is exactly the right semantics because odom → base_link still moves. In
    direct mode there is no odom → base_link: a stalled localizer produces a frozen pose repeatedly re-stamped as "current", which downstream planners / RViz cannot distinguish from a robot that is actually
    stationary and healthy.

Changes vs #132

  • New CachedLocalizationTf struct carries the cached TF plus useRep105 and the original scan timestamp, so the broadcaster knows how to stamp each entry.
  • broadcastCachedLocalizationTf(bool onlyIfRep105 = false):
  • Periodic rebroadcast timer calls it with onlyIfRep105=true, skipping direct-mode entries entirely. Immediate broadcast on a new localization update still fires in both modes.
  • Parameter documentation for transform_tolerance and transform_publish_period updated to state they apply to REP-105 mode only, and to explain why direct mode is excluded.

Behavior matrix

Mode Stamp on new update Periodic rebroadcast publish_in_sim_time honored
REP-105 (map → odom) now() + tolerance yes, every transform_publish_period n/a (uses ROS clock, which already respects use_sim_time)
Direct (map → base_link) myNow(scan_timestamp) no yes

Compatibility

Test plan

  • REP-105 LO setup with wheel odometry: confirm map → odom is future-dated and rebroadcast at 20 Hz (unchanged from feat(bridge_ros2): align REP-105 TF publishing with Nav2 conventions #132).
  • Direct-mode Smoother + wheel odom topic (cookbook §4.4): confirm map → base_link is stamped at scan time and tf2_echo shows stamps stop advancing when the localizer is paused.
  • Direct-mode LIO with publish_in_sim_time:=True replaying a bag: confirm TF stamps track the bag clock, not wallclock.
  • REP-105 mode with transform_publish_period:=0: confirm TFs are only emitted on new localization updates.

Original PR


This brings the localization /tf publisher in line with the convention used by AMCL, slam_toolbox, RTAB-Map and Cartographer, addressing three issues observed when MOLA is consumed by Nav2-style downstream nodes:

  1. REP-105 composition bug (fix). The inner factor of map -> odom = (map -> base)(t_scan) * (base -> odom)(t) was sampled at "latest" via waitForTransform(), which only supports tf2::TimePoint{}. The two factors must be sampled at the same instant or the published correction is biased by the odom-frame motion accumulated during the localizer's processing latency. Switch to tf_buffer_->lookupTransform(..., scan_tp). On lookup failure the publish is skipped (an empty default-constructed TransformStamped would inject TF_NO_FRAME_ID into every consumer's tf2 buffer).

  2. transform_tolerance (new param, default 0.1s). The published stamp is now node->now() + transform_tolerance so consumers can do lookupTransform(map, base_link, now()) without ExtrapolationException. Mirrors AMCL's transform_tolerance and RTAB-Map's tf_tolerance. Uses the ROS clock so use_sim_time is honored automatically.

  3. transform_publish_period (new param, default 0.05s = 20 Hz). A wall timer re-broadcasts the cached map -> odom independent of localization update rate, keeping the TF buffer continuously fresh even when the localizer runs slower than the consumer query rate. Set to 0 to disable. Mirrors slam_toolbox's transform_publish_period and RTAB-Map's tf_delay.

Backwards compat: to exactly preserve the prior (post-bugfix) stamping behavior set transform_tolerance: 0 and transform_publish_period: 0. publish_in_sim_time retains its meaning for all other publishers (sensor TFs, odom messages, etc.); only the localization /tf stamp source changed.

Summary by CodeRabbit

  • New Features

    • Periodic rebroadcasting of the latest localization transform via a configurable transform_publish_period.
    • Configurable transform_tolerance to control future-dating of rebroadcasted transforms for TF lookup stability.
    • Caching of the latest localization transform to support reliable periodic rebroadcasts.
  • Bug Fixes

    • More robust REP-105 correction and timestamp handling with clearer failure logging; avoids re-stamping stale direct-mode poses.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 23, 2026

📝 Walkthrough

Walkthrough

Adds cached localization TF storage and a periodic rebroadcast mechanism. On localization updates the bridge computes and caches TFs (REP‑105 composition when used), immediately broadcasts the cached TF, and optionally rebroadcasts it periodically; REP‑105 rebroadcasts are future-stamped by transform_tolerance to avoid TF extrapolation.

Changes

Cohort / File(s) Summary
Header: params & cache
mola_bridge_ros2/include/mola_bridge_ros2/BridgeROS2.h
Adds transform_tolerance and transform_publish_period to Params; introduces CachedLocalizationTf, cachedLocalizationTfMtx_, cachedLocalizationTf_, and declaration for broadcastCachedLocalizationTf(...).
Implementation: publish, lookup & timer
mola_bridge_ros2/src/BridgeROS2.cpp
Refactors localization publishing to build+cache TFs, uses tf_buffer_->lookupTransform for REP‑105 odom→base_link at scan timestamp, adds broadcastCachedLocalizationTf(bool) and a wall-timer driven rebroadcast (controlled by transform_publish_period), applies transform_tolerance when future-stamping REP‑105 rebroadcasts, and improves error logging.
Config: YAML loading
.../BridgeROS2::initialize_rds (config loading sites)
Loads transform_tolerance and transform_publish_period from YAML into Params.

Sequence Diagram

sequenceDiagram
    participant Loc as Localization Source
    participant Bridge as BridgeROS2
    participant TFBuf as tf_buffer_
    participant Cache as TF Cache
    participant Pub as TF Publisher
    participant Timer as Wall Timer

    rect rgba(100, 200, 100, 0.5)
        Loc->>Bridge: localization update (pose, scan_timestamp)
        alt REP-105 mode
            Bridge->>TFBuf: lookupTransform(odom, base_link, scan_timestamp)
            TFBuf-->>Bridge: odom->base_link transform
            Bridge->>Bridge: compose map->odom (REP-105)
        else Direct mode
            Bridge->>Bridge: use map->base_link directly
        end
        Bridge->>Cache: store computed TF + rep105 flag + scan_timestamp (mutex)
        Bridge->>Pub: broadcast cached TF (stamp = now OR scan_timestamp / now + tolerance per mode)
    end

    rect rgba(100, 100, 200, 0.5)
        Timer->>Bridge: periodic trigger (every transform_publish_period)
        Bridge->>Cache: lock & retrieve cached TF
        alt cached TF present && rep105
            Bridge->>Pub: rebroadcast TF (stamp = now + transform_tolerance)
        else cached TF present && direct
            Bridge->>Bridge: skip rebroadcast (no re-stamping direct mode)
        end
    end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Poem

🐰 I cached a hop and set a clock to chime,
Rebroadcasting poses in tidy time.
I stitch odom to map with careful art,
Stamp future-tales so TFs don't depart.
Hoppity-hop — transforms kept in rhyme!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 33.33% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The PR title clearly and specifically describes the main change: addressing REP-105 TF alignment with Nav2 conventions while preserving backward compatibility for direct-publish mode users.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch pr-132

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
mola_bridge_ros2/src/BridgeROS2.cpp (1)

1640-1661: ⚠️ Potential issue | 🟠 Major

Direct-mode compatibility promise not delivered — single stamping policy used for both modes.

This is the root cause for the behavior gap vs the PR description. broadcastCachedLocalizationTf always stamps with node->now() + transform_tolerance, regardless of whether the cached entry is a REP-105 map → odom or a direct map → base_link entry. Consequences:

  • Direct-mode TFs are no longer scan-time stamped — regression vs develop pre-#132.
  • publish_in_sim_time is not honored for direct-mode TFs anymore (the stamp comes from node->now(), not myNow(scan_timestamp)).
  • The rebroadcast timer at lines 237-254 keeps re-emitting direct-mode TFs with advancing stamps even when the localizer is paused — contradicts the PR test-plan item "Direct-mode Smoother: confirm … stamps stop advancing when localizer paused" and the compatibility statement "Direct-mode users: behavior restored to develop pre-#132 (scan-time stamping, no hidden rebroadcast, publish_in_sim_time respected)".
  • The immediate broadcast triggered from publishLocalizationTf at line 1637 inherits the same issue (downstream).

To match the stated design, the cached entry needs to carry useRep105 and the scan timestamp, and this function needs to branch:

🛠️ Suggested fix (requires the header change in the companion comment)
-void BridgeROS2::broadcastCachedLocalizationTf()
+void BridgeROS2::broadcastCachedLocalizationTf(bool onlyIfRep105)
 {
-  geometry_msgs::msg::TransformStamped tf;
+  CachedLocalizationTf cached;
   {
     auto lck = mrpt::lockHelper(cachedLocalizationTfMtx_);
     if (!cachedLocalizationTf_) return;
-    tf = *cachedLocalizationTf_;
+    cached = *cachedLocalizationTf_;
   }
+  if (onlyIfRep105 && !cached.useRep105) return;
 
-  // Stamp at "now + tolerance" so consumers can lookupTransform(map, base, now())
-  // without ExtrapolationException; Use the ROS clock so use_sim_time is honored automatically.
-  auto node = rosNode();
-  if (!node) return;
-  tf.header.stamp =
-      node->now() + rclcpp::Duration::from_seconds(params_.transform_tolerance);
+  geometry_msgs::msg::TransformStamped tf = cached.tf;
+  if (cached.useRep105)
+  {
+    // REP-105 (map→odom): future-date so consumers can lookupTransform(now()).
+    auto node = rosNode();
+    if (!node) return;
+    tf.header.stamp =
+        node->now() + rclcpp::Duration::from_seconds(params_.transform_tolerance);
+  }
+  else
+  {
+    // Direct mode (map→base_link): restore pre-#132 scan-time stamping,
+    // honoring publish_in_sim_time.
+    tf.header.stamp = myNow(cached.scanTimestamp);
+  }
 
   auto lckTfBc = mrpt::lockHelper(ros_tf_bc_mtx_);
   if (tf_bc_)
   {
     tf_bc_->sendTransform(tf);
   }
 }

Then update the timer at lines 247 to broadcastCachedLocalizationTf(/*onlyIfRep105=*/true);, and at publishLocalizationTf populate useRep105 and scanTimestamp alongside tf before calling the immediate broadcast.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@mola_bridge_ros2/src/BridgeROS2.cpp` around lines 1640 - 1661, The cached TF
entry must carry a useRep105 flag and scanTimestamp and
broadcastCachedLocalizationTf should branch on that flag: if useRep105, continue
stamping with node->now() + params_.transform_tolerance (REP-105 behavior); if
not (direct-mode), stamp using the cached scanTimestamp (preserving scan-time
and publish_in_sim_time behavior) and do not advance stamps on rebroadcasts
while paused. Update the cachedLocalizationTf_ structure (and access under
cachedLocalizationTfMtx_) to include useRep105 and scanTimestamp, modify
publishLocalizationTf to populate those fields when storing the cache and before
calling broadcastCachedLocalizationTf, and change the periodic rebroadcast timer
to invoke broadcastCachedLocalizationTf only for REP-105 entries (i.e.,
rebroadcastCached onlyIfRep105).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@mola_bridge_ros2/src/BridgeROS2.cpp`:
- Around line 1650-1654: Reformat the tf.header.stamp assignment to satisfy
clang-format: adjust the expression using rosNode()/node->now() and
rclcpp::Duration::from_seconds(params_.transform_tolerance) so the line
breaks/spacing match clang-format-14 expectations (the statement involving
tf.header.stamp, node->now(), and params_.transform_tolerance should be
reformatted rather than changing logic); locate the assignment at
tf.header.stamp = node->now() +
rclcpp::Duration::from_seconds(params_.transform_tolerance) and apply
clang-format-compatible spacing/line breaks.

---

Outside diff comments:
In `@mola_bridge_ros2/src/BridgeROS2.cpp`:
- Around line 1640-1661: The cached TF entry must carry a useRep105 flag and
scanTimestamp and broadcastCachedLocalizationTf should branch on that flag: if
useRep105, continue stamping with node->now() + params_.transform_tolerance
(REP-105 behavior); if not (direct-mode), stamp using the cached scanTimestamp
(preserving scan-time and publish_in_sim_time behavior) and do not advance
stamps on rebroadcasts while paused. Update the cachedLocalizationTf_ structure
(and access under cachedLocalizationTfMtx_) to include useRep105 and
scanTimestamp, modify publishLocalizationTf to populate those fields when
storing the cache and before calling broadcastCachedLocalizationTf, and change
the periodic rebroadcast timer to invoke broadcastCachedLocalizationTf only for
REP-105 entries (i.e., rebroadcastCached onlyIfRep105).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 3186d25d-7bb5-4be3-ae27-0d6a0eb7aa3e

📥 Commits

Reviewing files that changed from the base of the PR and between e78735c and 484afe4.

📒 Files selected for processing (2)
  • mola_bridge_ros2/include/mola_bridge_ros2/BridgeROS2.h
  • mola_bridge_ros2/src/BridgeROS2.cpp

Comment thread mola_bridge_ros2/include/mola_bridge_ros2/BridgeROS2.h Outdated
Comment thread mola_bridge_ros2/src/BridgeROS2.cpp Outdated
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
mola_bridge_ros2/src/BridgeROS2.cpp (1)

1591-1616: REP-105 correction math is correct; one valid and one problematic polish suggestion.

lookupTransform(target=l.child_frame, source=params_.odom_frame, scan_tp) returns T_baselink_odom, and transform * odomOnBase_tf = T_map_baselink * T_baselink_odom = T_map_odom, which is what ends up stamped as map -> odom. The scan-time sampling (vs. latest) is the right call to avoid biasing the correction by localizer latency, and the exception path correctly skips publishing rather than broadcasting empty frame_ids.

One suggestion is valid, one is problematic:

  1. tf2_ros::fromRclcpp(scan_stamp) expresses the rclcpp::Time -> tf2::TimePoint conversion more idiomatically than manually routing through std::chrono::nanoseconds — this is correct and recommended.

  2. ⚠️ Do not apply the arrow direction alignment. The error log at lines 1612-1614 correctly prints odom_frame -> child_frame (which is odom -> base_link), matching what lookupTransform(l.child_frame, params_.odom_frame, ...) actually retrieves. The comment at line 1593 describes the desired mathematical form (base_link -> odom) but the code's direction is correct. Aligning the error log to match the comment would make the error message describe the wrong direction.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@mola_bridge_ros2/src/BridgeROS2.cpp` around lines 1591 - 1616, The code
correctly samples TF at scan time and logs the odom->child_frame direction; fix
the minor API use by replacing the manual rclcpp::Time -> tf2::TimePoint
conversion with the idiomatic tf2_ros::fromRclcpp(scan_stamp) when calling
tf_buffer_->lookupTransform (symbols: mrpt::ros2bridge::toROS,
tf2_ros::fromRclcpp, tf_buffer_->lookupTransform, tf2::fromMsg), and do not
change the MRPT_LOG_THROTTLE_ERROR_STREAM message direction (keep
params_.odom_frame -> l.child_frame) because that matches the actual transform
retrieved.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@mola_bridge_ros2/src/BridgeROS2.cpp`:
- Around line 1591-1616: The code correctly samples TF at scan time and logs the
odom->child_frame direction; fix the minor API use by replacing the manual
rclcpp::Time -> tf2::TimePoint conversion with the idiomatic
tf2_ros::fromRclcpp(scan_stamp) when calling tf_buffer_->lookupTransform
(symbols: mrpt::ros2bridge::toROS, tf2_ros::fromRclcpp,
tf_buffer_->lookupTransform, tf2::fromMsg), and do not change the
MRPT_LOG_THROTTLE_ERROR_STREAM message direction (keep params_.odom_frame ->
l.child_frame) because that matches the actual transform retrieved.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 9b761e45-224f-4969-9fa1-ea34f65e0435

📥 Commits

Reviewing files that changed from the base of the PR and between 484afe4 and df89bfc.

📒 Files selected for processing (2)
  • mola_bridge_ros2/include/mola_bridge_ros2/BridgeROS2.h
  • mola_bridge_ros2/src/BridgeROS2.cpp
🚧 Files skipped from review as they are similar to previous changes (1)
  • mola_bridge_ros2/include/mola_bridge_ros2/BridgeROS2.h

This brings the localization /tf publisher in line with the convention
used by AMCL, slam_toolbox, RTAB-Map and Cartographer, addressing three
issues observed when MOLA is consumed by Nav2-style downstream nodes:

1. REP-105 composition bug (fix). The inner factor of
   map -> odom = (map -> base)(t_scan) * (base -> odom)(t)
   was sampled at "latest" via waitForTransform(), which only supports
   tf2::TimePoint{}. The two factors must be sampled at the same
   instant or the published correction is biased by the odom-frame
   motion accumulated during the localizer's processing latency. Switch
   to tf_buffer_->lookupTransform(..., scan_tp). On lookup failure the
   publish is skipped (an empty default-constructed TransformStamped
   would inject TF_NO_FRAME_ID into every consumer's tf2 buffer).

2. transform_tolerance (new param, default 0.1s). The published stamp
   is now node->now() + transform_tolerance so consumers can do
   lookupTransform(map, base_link, now()) without
   ExtrapolationException. Mirrors AMCL's transform_tolerance and
   RTAB-Map's tf_tolerance. Uses the ROS clock so use_sim_time is
   honored automatically.

3. transform_publish_period (new param, default 0.05s = 20 Hz). A
   wall timer re-broadcasts the cached map -> odom independent of
   localization update rate, keeping the TF buffer continuously fresh
   even when the localizer runs slower than the consumer query rate.
   Set to 0 to disable. Mirrors slam_toolbox's transform_publish_period
   and RTAB-Map's tf_delay.

Backwards compat: to exactly preserve the prior (post-bugfix) stamping
behavior set transform_tolerance: 0 and transform_publish_period: 0.
publish_in_sim_time retains its meaning for all other publishers
(sensor TFs, odom messages, etc.); only the localization /tf stamp
source changed.
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
mola_bridge_ros2/src/BridgeROS2.cpp (1)

234-256: Optional: also gate timer creation on publish_localization_following_rep105.

For users running strictly in direct mode, the periodic timer is still created (default 20 Hz) and wakes the executor only to early-return via onlyIfRep105=true. Harmless, but you can skip scheduling it entirely in that case.

♻️ Proposed tightening
-    if (params_.transform_publish_period > 0.0)
+    if (params_.transform_publish_period > 0.0 && params_.publish_localization_following_rep105)
     {
       timerRebroadcastLocTf = rosNode_->create_wall_timer(

Note: This assumes publish_localization_following_rep105 is effectively a one-time setting at startup (same read pattern used in publishLocalizationTf). If you anticipate runtime flips, keep the current unconditional timer.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@mola_bridge_ros2/src/BridgeROS2.cpp` around lines 234 - 256, The
timerRebroadcastLocTf is always created when params_.transform_publish_period >
0.0 even if publish_localization_following_rep105 is false, causing unnecessary
wakeups that immediately early-return in
broadcastCachedLocalizationTf(onlyIfRep105=true); change the condition to also
check params_.publish_localization_following_rep105 (or the equivalent
configuration flag used by publishLocalizationTf) so the wall timer is only
created when both transform_publish_period > 0.0 and
publish_localization_following_rep105 are true, leaving
broadcastCachedLocalizationTf and the onlyIfRep105 argument unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@mola_bridge_ros2/src/BridgeROS2.cpp`:
- Around line 234-256: The timerRebroadcastLocTf is always created when
params_.transform_publish_period > 0.0 even if
publish_localization_following_rep105 is false, causing unnecessary wakeups that
immediately early-return in broadcastCachedLocalizationTf(onlyIfRep105=true);
change the condition to also check params_.publish_localization_following_rep105
(or the equivalent configuration flag used by publishLocalizationTf) so the wall
timer is only created when both transform_publish_period > 0.0 and
publish_localization_following_rep105 are true, leaving
broadcastCachedLocalizationTf and the onlyIfRep105 argument unchanged.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 1a67a933-48e6-40e9-b38e-4cec2a5ce6ca

📥 Commits

Reviewing files that changed from the base of the PR and between df89bfc and 781aecb.

📒 Files selected for processing (2)
  • mola_bridge_ros2/include/mola_bridge_ros2/BridgeROS2.h
  • mola_bridge_ros2/src/BridgeROS2.cpp

@jlblancoc
Copy link
Copy Markdown
Member Author

@robin-zealrobotics When possible, let's both of us test this one to see if it actually works as you expected for rep-105, and I'll test it works for non rep105 too.

@robin-zealrobotics
Copy link
Copy Markdown
Contributor

Was just testing it and about to report :) (in sim, not on robot yet). Looks good.

@jlblancoc jlblancoc merged commit 38643b2 into develop Apr 24, 2026
28 checks passed
@jlblancoc jlblancoc deleted the pr-132 branch April 24, 2026 18:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants