-
Notifications
You must be signed in to change notification settings - Fork 26
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
Support interpolation of waypoints for Omnidirectional and Ackermann steering #42
Comments
One of the simplest approaches can be using Dubin curves, they basically deconstruct navigation between two arbitrary waypoints in a set of three of any of the following actions:
However, while they are simple and easy to implement @codebot mentioned that a more realistic model would apply a constant angular acceleration to simulate a steering wheel being turned at constant speed, since a Dubin curve involves every turn being at minimum turning radius that would either create the risk of tipping over vehicles or force them to slow down a lot even for wide bends. Thus I think we could have the planner model a vehicle through the following parameters:
Then deconstruct the trajectory into a series of bends / straight parts following Dubin curves that, instead of being all at minimum turning radius, are at constant angular acceleration. We should probably apply a scaling to the linear speed to make it inversely proportional to the angular speed so that vehicles will slow down as they reduce the bending radius but still take wide bends at relatively high speed. Afterwards it's a question of what the waypoints information coming from the planner should look like.
The most accurate (but probably most complex) bend model would split each turn into three points and probably look something like:
Where I say other acceleration value I mean that probably we don't want vehicles to break to their maximum capability in the middle of a bend since it is a common cause of loss of control. We could just output a target velocity at the entrance, middle and end of the bend and do linear interpolation through a constant linear acceleration model with deceleration when entering and acceleration while exiting the bend to calculate the speed throughout. This modelling implies an infinite jerk trajectory since we are changing both angular and linear acceleration instantly at the three points of the bend, if we want continuity at the acceleration level we can have a Edit: Note that Dubin curves only work for forward moving vehicles but there is an extension for reversible vehicles through Reeds Shepp curves. |
Here's a video detailing the curves plus more manoeuvers like reversing, and how to plan for those. This begs the question as to how much Simulation-wise, we'll have to look at the world and see what kind of manoeuvers we want to show off. Tagging in @mxgrey |
My expectation/hope is that we can provide a "close enough" representation of these motions using the existing piecewise cubic spline format that After we can generate the right kinds of trajectories, the next step would be supporting it in the planner. I'm thinking we can define a pure abstract interface for an "Interpolator" that can be used by the
Essentially the job of |
Update: I've setup a prototype in this repo open-rmf/rmf_geometry_testbed#1 approximating the circular arc into
To add on, we should consider the lane type as well (bidirectional or one-way) because there are are some maneuvers that require reversing. For example, here's a common setup in our projects. If a nonholonomic vehicle is on |
Right, the job of the interpolator will be to return any number of valid trajectories that can start from the given initial (waypoint, orientation) state. Some of those trajectories might have a final orientation that is the same as the initial orientation, but that's not a requirement; the interpolator should return all valid trajectories, including ones where the robot has turned. As I think more on this, there could be some combinatorial challenges since there may be closed loops or large detours that would offer valid trajectories but may lead to infinitely many outputs or just very unhelpful outputs. We may also need to give the interpolator some kind of filter where we can tell it "Don't bother trying to reach this subset of waypoints" or "Don't revisit waypoints that were already reached on your current trajectory". It will certainly be an interesting challenge to nail down these details. |
VehicleTraits
to supportackermann
steered vehicles. UpdateHolonomic
class.Interpolate::positions()
The text was updated successfully, but these errors were encountered: