The rover models configure the Gazebo odometry publisher with frame names that start with a slash:
<odom_frame>/odom</odom_frame>
<robot_base_frame>/base_footprint</robot_base_frame>
in models/lunar_pole_exploration_rover/urdf/lunar_pole_exploration_rover.gazebo and models/curiosity_path/urdf/curiosity_mars_rover.gazebo.
ROS 2 dropped the leading-slash convention: tf2 frame ids must not start with /. The odom_tf_publisher nodes in the demos copy the names straight from the odometry message into /tf, so what actually goes out is a /odom → /base_footprint transform. Current tf2 strips the slashes on the way in (with a warning), which is the only reason ros2 run tf2_ros tf2_echo odom base_link still resolves; anything that compares frame ids as strings (e.g. nav_msgs/Odometry.header.frame_id against a frame_id parameter set to odom) mismatches.
The fix is to drop the slashes in both models. Nothing consumes the slashed names on purpose: the demos' odom_tf_publisher nodes copy whatever the message carries, and the demos READMEs refer to odom and base_footprint.
The rover models configure the Gazebo odometry publisher with frame names that start with a slash:
in
models/lunar_pole_exploration_rover/urdf/lunar_pole_exploration_rover.gazeboandmodels/curiosity_path/urdf/curiosity_mars_rover.gazebo.ROS 2 dropped the leading-slash convention: tf2 frame ids must not start with
/. Theodom_tf_publishernodes in the demos copy the names straight from the odometry message into/tf, so what actually goes out is a/odom→/base_footprinttransform. Current tf2 strips the slashes on the way in (with a warning), which is the only reasonros2 run tf2_ros tf2_echo odom base_linkstill resolves; anything that compares frame ids as strings (e.g.nav_msgs/Odometry.header.frame_idagainst aframe_idparameter set toodom) mismatches.The fix is to drop the slashes in both models. Nothing consumes the slashed names on purpose: the demos'
odom_tf_publishernodes copy whatever the message carries, and the demos READMEs refer toodomandbase_footprint.