Hi @RafalGorecki,
Thank you for the development image.
We tested husarion/husarion-ugv:jazzy-launch-refactor with:
tf_namespace_bridge:=False
1. Bringup/config feedback
At first, the bringup failed because the new launch-refactor image expected a newer /config layout. The mounted /home/husarion/config was missing files such as:
/config/husarion_ugv_description/urdf/panther.urdf.xacro
/config/husarion_ugv_description/config/WH05.yaml
/config/husarion_ugv_diagnostics/config/system_monitor.yaml
/config/husarion_ugv_teleop/config/joy2twist_panther.yaml
After syncing the missing files from the image install space into /home/husarion/config, the URDF/xacro issue was fixed.
Then we hit another config mismatch: twist_mux_controller was missing its type field in the mounted controller YAML. Copying the updated WH05_controller.yaml from the image fixed that too.
We also had to update the manager config and behavior tree files because the mounted config was missing/incompatible with the new image, including:
/config/husarion_ugv_manager/config/lights_manager.yaml
/config/husarion_ugv_manager/config/safety_manager.yaml
/config/husarion_ugv_manager/behavior_trees/SafetyBT.btproj
After syncing these files, the bringup reached a working state. The controllers loaded and activated correctly, including twist_mux_controller, and both lights_manager and safety_manager initialized successfully.
So the first feedback is:
- The development image works after syncing the mounted
/config directory with the new launch-refactor layout.
- The issue was mainly a config/version mismatch between the mounted host config and the new image.
- It would be helpful if you can provide the expected
/config structure or migration steps for this branch.
2. Blocking issue: odom -> base_link translation is not updating
After bringup was fixed, we continued testing the namespaced TF behavior.
The namespaced TF topics appear to be active, but we found a blocking issue with the odom -> base_link transform.
The robot can move with teleoperation, and the laser scan moves in RViz, but the robot model / base_link frame stays fixed. This breaks SLAM and navigation because the robot pose is not translated in TF.
We checked:
ros2 run tf2_ros tf2_echo odom base_link --ros-args --remap tf:=/panther2/tf --remap tf_static:=/panther2/tf_static
The transform exists, and the yaw changes, but the translation remains always zero:
Translation: [0.000, 0.000, 0.000]
So it looks like odometry orientation is being published into TF, but the x/y translation between odom and base_link is not being updated.
ros2 run tf2_ros tf2_echo odom base_link tf:=/panther2/tf tf_static:=/panther2/tf_static
Translation: [0.000, 0.000, 0.000]
Rotation: in Quaternion (xyzw) [0.000, 0.000, 0.947, -0.322]
Rotation: in RPY (radian) [0.000, -0.000, -2.485]
Rotation: in RPY (degree) [0.000, -0.000, -142.402]
Matrix:-0.792 0.610 0.000 0.000-0.610 -0.792 0.000 0.0000.000 0.000 1.000 0.0000.000 0.000 0.000 1.000At time 1779110261.477649030
Translation: [0.000, 0.000, 0.000]
Rotation: in Quaternion (xyzw) [0.000, 0.000, 0.949, -0.315]
Rotation: in RPY (radian) [0.000, -0.000, -2.502]
Rotation: in RPY (degree) [0.000, -0.000, -143.331]
Matrix:-0.802 0.597 0.000 0.000-0.597 -0.802 0.000 0.0000.000 0.000 1.000 0.0000.000 0.000 0.000 1.000At time 1779110262.528939413
Translation: [0.000, 0.000, 0.000]
Rotation: in Quaternion (xyzw) [0.000, 0.000, 0.950, -0.312]
Rotation: in RPY (radian) [0.000, -0.000, -2.507]
Rotation: in RPY (degree) [0.000, -0.000, -143.650]
Matrix:-0.805 0.593 0.000 0.000-0.593 -0.805 0.000 0.0000.000 0.000 1.000 0.0000.000 0.000 0.000 1.000At time 1779110263.570482620
Translation: [0.000, 0.000, 0.000]
Rotation: in Quaternion (xyzw) [0.000, 0.000, 0.950, -0.312]
Rotation: in RPY (radian) [0.000, -0.000, -2.507]
Rotation: in RPY (degree) [0.000, -0.000, -143.637]
Matrix:-0.805 0.593 0.000 0.000-0.593 -0.805 0.000 0.0000.000 0.000 1.000 0.0000.000 0.000 0.000 1.000At time 1779110264.523427268
Translation: [0.000, 0.000, 0.000]
Rotation: in Quaternion (xyzw) [0.000, 0.000, 0.950, -0.312]
Rotation: in RPY (radian) [0.000, -0.000, -2.507]
Rotation: in RPY (degree) [0.000, -0.000, -143.629]
Matrix:-0.805 0.593 0.000 0.000-0.593 -0.805 0.000 0.0000.000 0.000 1.000 0.0000.000 0.000 0.000 1.000At time 1779110265.582458153
Translation: [0.000, 0.000, 0.000]
Rotation: in Quaternion (xyzw) [0.000, 0.000, 0.950, -0.312]
Rotation: in RPY (radian) [0.000, -0.000, -2.507]
Rotation: in RPY (degree) [0.000, -0.000, -143.623]
Matrix:-0.805 0.593 0.000 0.000-0.593 -0.805 0.000 0.0000.000 0.000 1.000 0.0000.000 0.000 0.000 1.000At time 1779110266.443401456
Translation: [0.000, 0.000, 0.000]
Rotation: in Quaternion (xyzw) [0.000, 0.000, 0.950, -0.312]
Rotation: in RPY (radian) [0.000, -0.000, -2.507]
Rotation: in RPY (degree) [0.000, -0.000, -143.631]
Matrix:-0.805 0.593 0.000 0.000-0.593 -0.805 0.000 0.0000.000 0.000 1.000 0.0000.000 0.000 0.000 1.000At time 1779110267.547336797
Translation: [0.000, 0.000, 0.000]
Rotation: in Quaternion (xyzw) [0.000, 0.000, 0.950, -0.313]
Rotation: in RPY (radian) [0.000, -0.000, -2.505]
Rotation: in RPY (degree) [0.000, -0.000, -143.541]
Matrix:-0.804 0.594 0.000 0.000-0.594 -0.804 0.000 0.0000.000 0.000 1.000 0.0000.000 0.000 0.000 1.000At time 1779110268.497220747
Translation: [0.000, 0.000, 0.000]
Rotation: in Quaternion (xyzw) [0.000, 0.000, 0.950, -0.311]
Rotation: in RPY (radian) [0.000, -0.000, -2.508]
Rotation: in RPY (degree) [0.000, -0.000, -143.701]
Matrix:-0.806 0.592 0.000 0.000-0.592 -0.806 0.000 0.0000.000 0.000 1.000 0.0000.000 0.000 0.000 1.000At time 1779110269.562212437
Translation: [0.000, 0.000, 0.000]
Rotation: in Quaternion (xyzw) [0.000, 0.000, 0.953, -0.304]
Rotation: in RPY (radian) [0.000, -0.000, -2.523]
Rotation: in RPY (degree) [0.000, -0.000, -144.577]
Matrix:-0.815 0.580 0.000 0.000-0.580 -0.815 0.000 0.0000.000 0.000 1.000 0.0000.000 0.000 0.000 1.000At time 1779110270.514895106
Translation: [0.000, 0.000, 0.000]
Rotation: in Quaternion (xyzw) [0.000, 0.000, 0.953, -0.304]
Rotation: in RPY (radian) [0.000, -0.000, -2.524]
Rotation: in RPY (degree) [0.000, -0.000, -144.628]
Matrix:-0.815 0.579 0.000 0.000-0.579 -0.815 0.000 0.0000.000 0.000 1.000 0.0000.000 0.000 0.000 1.000At time 1779110271.563411344
Translation: [0.000, 0.000, 0.000]
Rotation: in Quaternion (xyzw) [0.000, 0.000, 0.952, -0.307]
Rotation: in RPY (radian) [0.000, -0.000, -2.517]
Rotation: in RPY (degree) [0.000, -0.000, -144.199]
Matrix:-0.811 0.585 0.000 0.000-0.585 -0.811 0.000 0.0000.000 0.000 1.000 0.0000.000 0.000 0.000 1.000At time 1779110272.521954635
Translation: [0.000, 0.000, 0.000]
Rotation: in Quaternion (xyzw) [0.000, 0.000, 0.955, -0.295]
Rotation: in RPY (radian) [0.000, -0.000, -2.542]
Rotation: in RPY (degree) [0.000, -0.000, -145.627]
Matrix:-0.825 0.565 0.000 0.000-0.565 -0.825 0.000 0.0000.000 0.000 1.000 0.0000.000 0.000 0.000 1.000At time 1779110273.489695517
Translation: [0.000, 0.000, 0.000]
Rotation: in Quaternion (xyzw) [0.000, 0.000, 0.962, -0.274]
Rotation: in RPY (radian) [0.000, -0.000, -2.587]
Rotation: in RPY (degree) [0.000, -0.000, -148.203]
Matrix:-0.850 0.527 0.000 0.000-0.527 -0.850 0.000 0.0000.000 0.000 1.000 0.0000.000 0.000 0.000 1.000At time 1779110274.570522723
Translation: [0.000, 0.000, 0.000]
Rotation: in Quaternion (xyzw) [0.000, 0.000, 0.964, -0.267]
Rotation: in RPY (radian) [0.000, -0.000, -2.601]
Rotation: in RPY (degree) [0.000, -0.000, -149.038]
Matrix:-0.858 0.514 0.000 0.000-0.514 -0.858 0.000 0.0000.000 0.000 1.000 0.0000.000 0.000 0.000 1.000At time 1779110275.532202209
Translation: [0.000, 0.000, 0.000]
Rotation: in Quaternion (xyzw) [0.000, 0.000, 0.964, -0.267]
Rotation: in RPY (radian) [0.000, -0.000, -2.602]
Rotation: in RPY (degree) [0.000, -0.000, -149.058]
Matrix:-0.858 0.514 0.000 0.000-0.514 -0.858 0.000 0.0000.000 0.000 1.000 0.0000.000 0.000 0.000 1.000At time 1779110276.559183400
Translation: [0.000, 0.000, 0.000]
Rotation: in Quaternion (xyzw) [0.000, 0.000, 0.964, -0.267]
Rotation: in RPY (radian) [0.000, -0.000, -2.601]
Rotation: in RPY (degree) [0.000, -0.000, -149.033]
Matrix:-0.857 0.515 0.000 0.000-0.515 -0.857 0.000 0.0000.000 0.000 1.000 0.0000.000 0.000 0.000 1.000At time 1779110277.511811349
Translation: [0.000, 0.000, 0.000]
Rotation: in Quaternion (xyzw) [0.000, 0.000, 0.964, -0.267]
Rotation: in RPY (radian) [0.000, -0.000, -2.601]
Rotation: in RPY (degree) [0.000, -0.000, -149.012]
Matrix:-0.857 0.515 0.000 0.000-0.515 -0.857 0.000 0.0000.000 0.000 1.000 0.0000.000 0.000 0.000 1.000At time 1779110278.576582245
Translation: [0.000, 0.000, 0.000]
Rotation: in Quaternion (xyzw) [0.000, 0.000, 0.964, -0.267]
Rotation: in RPY (radian) [0.000, -0.000, -2.601]
Rotation: in RPY (degree) [0.000, -0.000, -149.008]
Matrix:-0.857 0.515 0.000 0.000-0.515 -0.857 0.000 0.0000.000 0.000 1.000 0.0000.000 0.000 0.000 1.000At time 1779110279.532698070
Translation: [0.000, 0.000, 0.000]
Rotation: in Quaternion (xyzw) [0.000, 0.000, 0.966, -0.260]
Rotation: in RPY (radian) [0.000, -0.000, -2.616]
Rotation: in RPY (degree) [0.000, -0.000, -149.867]
Matrix:-0.865 0.502 0.000 0.000-0.502 -0.865 0.000 0.0000.000 0.000 1.000 0.0000.000 0.000 0.000 1.000At time 1779110280.488119441
Translation: [0.000, 0.000, 0.000]
Rotation: in Quaternion (xyzw) [0.000, 0.000, 0.967, -0.253]
Rotation: in RPY (radian) [0.000, -0.000, -2.629]
Rotation: in RPY (degree) [0.000, -0.000, -150.654]
Matrix:-0.872 0.490 0.000 0.000-0.490 -0.872 0.000 0.0000.000 0.000 1.000 0.0000.000 0.000 0.000 1.000At time 1779110281.547412841
Translation: [0.000, 0.000, 0.000]
Rotation: in Quaternion (xyzw) [0.000, 0.000, 0.962, -0.272]
Rotation: in RPY (radian) [0.000, -0.000, -2.590]
Rotation: in RPY (degree) [0.000, -0.000, -148.417]
Matrix:-0.852 0.524 0.000 0.000-0.524 -0.852 0.000 0.0000.000 0.000 1.000 0.0000.000 0.000 0.000 1.000At time 1779110282.501706395
Translation: [0.000, 0.000, 0.000]
Rotation: in Quaternion (xyzw) [0.000, 0.000, 0.957, -0.290]
Rotation: in RPY (radian) [0.000, -0.000, -2.552]
Rotation: in RPY (degree) [0.000, -0.000, -146.236]
Matrix:-0.831 0.556 0.000 0.000-0.556 -0.831 0.000 0.0000.000 0.000 1.000 0.0000.000 0.000 0.000 1.000At time 1779110283.551292544
Translation: [0.000, 0.000, 0.000]
Rotation: in Quaternion (xyzw) [0.000, 0.000, 0.955, -0.296]
Rotation: in RPY (radian) [0.000, -0.000, -2.540]
Rotation: in RPY (degree) [0.000, -0.000, -145.547]
Matrix:-0.825 0.566 0.000 0.000-0.566 -0.825 0.000 0.0000.000 0.000 1.000 0.0000.000 0.000 0.000 1.000At time 1779110284.488525877
Translation: [0.000, 0.000, 0.000]
Rotation: in Quaternion (xyzw) [0.000, 0.000, 0.955, -0.296]
Rotation: in RPY (radian) [0.000, -0.000, -2.541]
Rotation: in RPY (degree) [0.000, -0.000, -145.567]
Matrix:-0.825 0.565 0.000 0.000-0.565 -0.825 0.000 0.0000.000 0.000 1.000 0.0000.000 0.000 0.000 1.000At time 1779110285.532265293
Translation: [0.000, 0.000, 0.000]
Rotation: in Quaternion (xyzw) [0.000, 0.000, 0.955, -0.296]
Rotation: in RPY (radian) [0.000, -0.000, -2.541]
Rotation: in RPY (degree) [0.000, -0.000, -145.589]
Matrix:-0.825 0.565 0.000 0.000-0.565 -0.825 0.000 0.0000.000 0.000 1.000 0.0000.000 0.000 0.000 1.000
This also appears in diagnostics as:
ekf_filter: odometry/filtered topic status
Actual frequency: 0.000000 Hz
So the issue may be related to the EKF / odometry filtered output, or to the node responsible for publishing odom -> base_link after the TF namespacing changes.
Could you please check whether the odom -> base_link TF publisher is correctly remapped to /panther2/tf, and whether the EKF/odometry pipeline is still connected correctly with tf_namespace_bridge:=False?
Current behavior:
/panther2/tf exists
odom → base_link exists
yaw changes
x/y translation stays zero
robot moves physically
laser scan moves
robot base frame stays fixed
SLAM/navigation fail
Expected behavior:
odom → base_link should update both rotation and x/y translation while the robot moves.
This is currently blocking real-robot validation of the namespaced TF branch.
TF Fixed Issue
This is a short video demonstrating the issue visually: the robot moves with teleoperation, and the laser scan moves in the Web UI, but the robot model / base_link frame stays fixed because the odom -> base_link translation is not updating.
3. Navigation image / TF alignment
On our side, we also updated our custom navigation image/package to remap TF the same way:
/tf → tf
/tf_static → tf_static
So with PushRosNamespace(namespace), Nav2/SLAM/localization use:
/<robot_namespace>/tf
/<robot_namespace>/tf_static
This was applied in our navigation launch files:
bringup_launch.py
navigation_launch.py
localization_launch.py
slam_launch.py
The important point is that the base robot stack and the navigation stack must both use the same TF topic strategy. If the Panther base stack publishes to /panther2/tf, but the navigation stack still listens to global /tf, Nav2 will not receive the required transforms.
So one final question: do you plan to provide a matching husarion_ugv_navigation / autonomy image that is aligned with the new namespaced TF behavior?
We currently use a custom navigation image, so we can continue with our remapped version. But if Husarion plans to provide an official navigation/autonomy image compatible with tf_namespace_bridge:=False, that would be better for avoiding custom patches.
Finally, we will wait for your next edits on the launch-refactor branch, then re-test on the real robot once the updated image/config is available.
Also, if possible, could you provide a matching husarion_ugv_navigation / autonomy image aligned with the new namespaced TF behavior? This would help us test the full stack without maintaining custom navigation patches.