-
Notifications
You must be signed in to change notification settings - Fork 970
Fix discrepancy between tf and odometry/filtered when world_frame is set to map_frame #939
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: jazzy-devel
Are you sure you want to change the base?
Fix discrepancy between tf and odometry/filtered when world_frame is set to map_frame #939
Conversation
src/ros_filter.cpp
Outdated
| base_link_frame_id_, | ||
| odom_frame_id_, | ||
| filtered_position->header.stamp, | ||
| tf_timeout_, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
While I welcome the change, I think this behaviour is going to have to be a parameter, and it should default to false so we don't break anyone else's application. If we have to wait for the odom->base_link transform to be available, it could affect the latency and publication rate of the output (which is why we're using the latest available transform to begin with).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I have had some time to think. In the current form, the latency could indeed be affected in applications that have overridden the transform_timeout parameter. Rather than adding a parameter to enable/disable this behavior, I suggest we add a dedicated timeout parameter for the odom->base_link transform lookup. Reason being:
The transform_timeout parameter is specifically used during the conversion of measurements to the target frame. This purpose differs significantly from retrieving the odometry transform. I can imagine developers would want to set timeouts of these two cases to different values.
By adding a new parameter (e.g. transform_timeout_odom) and setting the default value to zero, the latency in existing applications should not be affected. The accuracy could improve even with the default value as it allows computation of a better transform if there is sufficient data in the transform buffer. Developers can override this new timeout parameter with a value that suits their application to benefit from improved broadcasted transform accuracy. Would this be a good approach?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, that seems valid!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe transform_timeout_odom_bl?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@sybrenkappert any chance you would want to update the PR with my feedback? If you've moved on and dropped this, it's totally fine, but in that case, would you mind closing the PR? Thanks.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@ayrton04 Thanks for the feedback! I'm planning on updating the PR, I wasn't able to find time to work on this until now. Hoping to publish an update soon.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@ayrton04 Just updated the PR.
f5d08a2 to
42ff93f
Compare
I found that, even when the
transform_timeoutparameter is set, there is a difference between/odometry/filteredand the map-base_link transform from a tf lookup with the same timestamp.This occurs because the base_link-odom transform that is required to compute the broadcastable map-odom transform is evaluated at the wrong time. Instead of evaluating this at the same time as the computed map-base_link transform, it is always evaluated at
tf2::TimePointZero.This solution evaluates the base_link-odom transform at the correct time if a suitable value for the
already existingnewtransform_timeouttransform_timeout_odom_blparameter is set. If the timeout is insufficient to get the transform at the requested time, the latest available transform is used (tf2::TimePointZero). This is covered bylookupTransFormsafe.The solution improves performance in applications that rely on accurate map-odom transforms. Examples being precision navigation and comparison of estimates with ground truth data.