-
Notifications
You must be signed in to change notification settings - Fork 1.4k
[Smac Planner] Enable goal orientation non-specificity #3789
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
Comments
Hi, we have a use case where the robot goal has two possible orientations (yaw & yaw+180°) because the robot can be loaded from both sides. We want to find the fastest path so we compute it twice (one for each yaw) and execute the path we the smallest number of points. |
That is a bit of a different problem, but falls into the same category of solutions. The same strategy would work, just using mirrored quantization rather than all quantizations |
I would love to take this task. I would more detail on this if possible so I can start working on it. |
@stevedanomodolor this would be a great contribution! I think the description above more or less gives the details. We want the ability to not only plan to an exact pose (X, Y, Yaw) but also perhaps the inverse of that (X, Y, Yaw-180) or at any angle (X, Y, 0-360). To do that, we need to change Then in A* we need to change the check for isGoal to be OK with any Goal orientation that meets the requests spec. That gets us half the way there. Then we need to update the analytic expansion module with similar information about the orientation flexibility to try analytic expansions to the different orientations. If we find any that pass, we return it. If we find multiple that pass, we return the shortest. That should make it so that we can (1) user specify the flexibility (2) A* is aware of it to terminate search when met and (3) the analytic expansions attempt at various angles. The additional overhead of the analytic expansions should be benchmarked so we know how much compute that adds, but it will certainly be smaller than having to replan multiple times with the different settings |
@SteveMacenski have a bit of questions on how users would be able to use this feature.
|
Have new parameters in hybrid-A* / State Lattice which allows for |
I have some doubts concerning how to adapt to the create_path. In step 2.1, I try the analytical expansion for all the goals and return the one with the shortest accumulated cost. In step 3.1, the |
The two components of the heuristic is the I suppose in this case, we could look up each The former is probably the least invasive, but the latter would make the non-orientation goal requests slightly faster by having less data to crawl through. Overall, I leave it to you, but I'd do the former to keep things as simple as possible (even if it means that the non-goal orientation requests don't have a slight speed it up it could otherwise have) Its handwavey to start, but I think you can do prototypes without this feature just to check that things are working. Like I said, the obstacle heuristic is the one used most commonly in search. However, finding the complete solution to this would be necessary before merging, you're right! Good catch |
@SteveMacenski Now that we are prunning the path when we check whether the goal is invalid, there is a possibility that the minimum found using the first option can be invalid. Can you explain more about the second option? wouldn't removing the theta affect the accuracy of the computation?
What about having a lookup table based on the heading?, this would increase the loopup time but not affect the accuracy of the results? |
Heuristics are not perfect, if they were then the number of search expansions would be precisely the number of path points to get from the start to goal 😄 Its to aid search with the best we can know about the situation in general. Lets not consider the second option. It is a memory optimization that complicates things in a way I don't think we need to introduce here. Maybe after we have a working PR we can revisit it if you like. It would be a nice puzzle & involve some architectural changes to be clean (which you may or may not enjoy doing).
We still compute it for the given start heading, since the goal is what is 'we don't care about heading', not the currently expanded search node. If both where orientation independent, then we could just use the L2 distance, since the shortest path would always be a straight line 😉 |
Some users have asked for a way to compute feasible paths to the goal without considering orientation. Since they're feasible paths, there's no "real" way to do this since we need to know the target orientation to make sure its drivable
However, we can brute force this internally by making the check for
isGoal()
consider not just the XY,Yaw bin but all Yaw bins in an XY position. That gets us part of the way there. The other half is in the analytic expansions that actually computes the way to the goal and knows things about the orientation. Each expansion would need to check for each Yaw bin at the goal also to check if any of them are valid (and use the shortest, valid one).This comes at an increased compute cost obviously, especially for analytic expansions. However its far cheaper than the alternatives some users have proposed that involve multiple entirely separate planning cycles.
While this is not something Open Navigation is likely to work on directly in the near-term future (except by sponsor request or contracting) this is a good potential community contribution with a clear plan laid out above to accomplish it.
The text was updated successfully, but these errors were encountered: