-
Notifications
You must be signed in to change notification settings - Fork 430
Update odometry implementation in diff_drive #1854
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: master
Are you sure you want to change the base?
Conversation
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## master #1854 +/- ##
==========================================
- Coverage 85.13% 84.91% -0.22%
==========================================
Files 144 144
Lines 13968 14002 +34
Branches 1201 1204 +3
==========================================
- Hits 11891 11890 -1
- Misses 1670 1705 +35
Partials 407 407
Flags with carried forward coverage won't be shown. Click here to find out more.
🚀 New features to boost your workflow:
|
diff_drive_controller/include/diff_drive_controller/odometry.hpp
Outdated
Show resolved
Hide resolved
christophfroehlich
left a comment
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.
Let's discuss my points first, and merge the outcome. If necessary, let's open a new PR afterwards for the other controllers.
diff_drive_controller/include/diff_drive_controller/odometry.hpp
Outdated
Show resolved
Hide resolved
diff_drive_controller/include/diff_drive_controller/odometry.hpp
Outdated
Show resolved
Hide resolved
Co-authored-by: Christoph Fröhlich <[email protected]>
|
Sorry for the delay in fixing the failing checks here! I was busy shifting Linux distros and had tried to make the commits that caused the checks to fail through the web. |
christophfroehlich
left a comment
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.
Still not sure about the tryUpdateOpenLoop method, maybe @saikishor or anyone else has an opinion about that.
Co-authored-by: Christoph Fröhlich <[email protected]>
|
@christophfroehlich pre-commit isn't working for me for some reason, but besides that I have made the changed you requested. If possible, could you clone the pr, and push a fix for the pre-commit? Thanks! |
|
This pull request is in conflict. Could you fix it @Amronos? |
|
Sorry for the delay on this! All requested changes have been made now, please review! |
christophfroehlich
left a comment
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.
Thanks for your patience. This is almost good to be merged, two minor comments only
diff_drive_controller/include/diff_drive_controller/odometry.hpp
Outdated
Show resolved
Hide resolved
christophfroehlich
left a comment
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.
Thanks for the latest cleanup! LGTM
| [[deprecated( | ||
| "Replaced by bool update_from_pos(double left_pos, double right_pos, const " | ||
| "rclcpp::Time & time).")]] |
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.
| [[deprecated( | |
| "Replaced by bool update_from_pos(double left_pos, double right_pos, const " | |
| "rclcpp::Time & time).")]] | |
| [[deprecated( | |
| "Replaced by bool update_from_pos(double left_pos, double right_pos, double " | |
| "dt).")]] |
| [[deprecated( | ||
| "Replaced by bool update_from_vel(double left_vel, double right_vel, const " | ||
| "rclcpp::Time & time).")]] |
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.
| [[deprecated( | |
| "Replaced by bool update_from_vel(double left_vel, double right_vel, const " | |
| "rclcpp::Time & time).")]] | |
| [[deprecated( | |
| "Replaced by bool update_from_vel(double left_vel, double right_vel, double " | |
| "dt).")]] |
| [[deprecated( | ||
| "Replaced by bool try_update_open_loop(double linear_vel, double angular_vel, const " | ||
| "rclcpp::Time " | ||
| "& time).")]] |
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.
| [[deprecated( | |
| "Replaced by bool try_update_open_loop(double linear_vel, double angular_vel, const " | |
| "rclcpp::Time " | |
| "& time).")]] | |
| [[deprecated( | |
| "Replaced by bool try_update_open_loop(double linear_vel, double angular_vel, double " | |
| "dt).")]] |
|
|
||
| bool Odometry::update_from_vel(double left_vel, double right_vel, double dt) | ||
| { | ||
| // Compute linear and angular velocities of the robot: |
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.
Let's add this check back
if (dt < 0.0001)
{
return false; // Interval too small to integrate with
}
|
|
||
| void Odometry::integrate(double linear_vel, double angular_vel, double dt) | ||
| { | ||
| const double dx = linear_vel * dt; |
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.
| const double dx = linear_vel * dt; | |
| // Skip integration for invalid time intervals | |
| if (std::fabs(dt) < 1e-6) | |
| { | |
| return; | |
| } | |
| const double dx = linear_vel * dt; |
| { | ||
| previous_publish_timestamp_ += publish_period_; | ||
| should_publish = true; | ||
| if (previous_publish_timestamp_ + publish_period_ < time) |
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.
| if (previous_publish_timestamp_ + publish_period_ < time) | |
| if (previous_publish_timestamp_ + publish_period_ <= time) |
| catch (const std::runtime_error &) | ||
| { | ||
| odometry_message_.header.stamp = time; | ||
| odometry_message_.pose.pose.position.x = odometry_.getX(); | ||
| odometry_message_.pose.pose.position.y = odometry_.getY(); | ||
| odometry_message_.pose.pose.orientation.x = orientation.x(); | ||
| odometry_message_.pose.pose.orientation.y = orientation.y(); | ||
| odometry_message_.pose.pose.orientation.z = orientation.z(); | ||
| odometry_message_.pose.pose.orientation.w = orientation.w(); | ||
| odometry_message_.twist.twist.linear.x = odometry_.getLinear(); | ||
| odometry_message_.twist.twist.angular.z = odometry_.getAngular(); | ||
| realtime_odometry_publisher_->try_publish(odometry_message_); | ||
| // Handle exceptions when the time source changes and initialize publish timestamp | ||
| previous_publish_timestamp_ = time; | ||
| should_publish = true; | ||
| } |
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.
Is this block meant to catch the error of previous_publish_timestamp as unintialized ? if so, we should initialize it in on_configure. If not, this block may not be reachable.
|
@Amronos, thanks for working on this PR. It would be great to add some tests for the odometry changes. If you can't accommodate this within this PR, please consider creating a GitHub issue so the community can pick it up. |
Fixes #271.
Fixes #357.
I have updated the odometry implementation of the
diff_drive_controllerto fix the above two issues alongside improving the code's readability. This implementation is similar to that ofomni_wheel_drive_controller.I have created some new methods and deprecated the older ones.
Should I also make similar changes to other controllers? If yes, should I do that in a separate PR?