ROS Resources: Documentation | Support | Discussion Forum | Index | Service Status | ros @ Robotics Stack Exchange
Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

I think your problem is that you should have two different nodes publishing two different transform :

  1. The first one fuse all continuous data (usually odometry and IMU) and publish the odom -> base_link transform
  2. The second fuse all data and publish map -> odom transform

Know what's really important is that the map -> odom transform doesn't represent anything on its own. It exist purely because the tf2 system cannot have two parent to a frame. In fact, the map -> base_link transform (that go through odom) and the odom -> base_link transform are the one representing something. The map -> base_link transform represent the best localization estimation but can jump, while the odom -> base_link transform is the best continuous estimation that you have.

Knowing all this, your problem mighth be that you have nothing publishing the map -> odom transform.

To solve your issue without adding a node, you could go with this parameter for your ekf :

 map_frame: map             
 odom_frame: base_link
 base_link_frame: base_link  
 world_frame: map

Tell me if this did the trick !


Can't make my navsat_transform node publishing utm_transform. And odometry/filtered from EKF always has Pose-Position X Y and Z = 0 (although Orientation on Z isn't 0) - is it right at all?

Your pose.position represent your position, not orientation, so Z = 0 means your at a zero level altitude, but I think it just means navsat_transform does not calculate the altitude.


I also believe that the documentation of navsat transform node is not updated according to all the changes made and that the parameter you need to set to true might not be broadcast_utm_transform: truebut broadcast_cartesian_transform_: true (along with broadcast_cartesian_transform_as_parent_frame_: true)

What strange is that you should have gotten a RCLCPP WARN saying : Parameter 'broadcast_utm_transform' has been deprecated. Please use 'broadcast_cartesian_transform' instead.

I think your problem is that you should have two different nodes publishing two different transform :

  1. The first one fuse all continuous data (usually odometry and IMU) and publish the odom -> base_link transform
  2. The second fuse all data and publish map -> odom transform

Know Now what's really important is that the map -> odom transform doesn't represent anything on its own. It exist purely because the tf2 system cannot have two parent to a frame. In fact, the map -> base_link transform (that go through odom) and the odom -> base_link transform are the one representing something. The map -> base_link transform represent the best localization estimation but can jump, while the odom -> base_link transform is the best continuous estimation that you have.

Knowing all this, your problem mighth be that you have nothing publishing the map -> odom transform.

To solve your issue without adding a node, you could go with this parameter for your ekf :

 map_frame: map             
 odom_frame: base_link
 base_link_frame: base_link  
 world_frame: map

Tell me if this did the trick !


Can't make my navsat_transform node publishing utm_transform. And odometry/filtered from EKF always has Pose-Position X Y and Z = 0 (although Orientation on Z isn't 0) - is it right at all?

Your pose.position represent your position, not orientation, so Z = 0 means your at a zero level altitude, but I think it just means navsat_transform does not calculate the altitude.because you don't have anything giving your ekf an altitude. If you want to get it from the gps, your imu0 config should be three true on the first line.


I also believe that the documentation of navsat transform node is not updated according to all the changes made and that the parameter you need to set to true might not be broadcast_utm_transform: truebut broadcast_cartesian_transform_: true (along with broadcast_cartesian_transform_as_parent_frame_: true)

What strange is that you should have gotten a RCLCPP WARN saying : Parameter 'broadcast_utm_transform' has been deprecated. Please use 'broadcast_cartesian_transform' instead.