-
Notifications
You must be signed in to change notification settings - Fork 1.3k
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
Collision monitor #2982
Collision monitor #2982
Conversation
@AlexeyMerzlyakov, please properly fill in PR template in the future. @SteveMacenski, use this instead.
|
Initial review by @SteveMacenski (current status):
|
Remaining items/questions to discuss:
Yes, currently testcases are not being developed yet. I suggest to develop test coverage after the main code from the Collision Monitor node will be agreed.
Yes, it is being calculated and published in robot
Since
Work is in progress: currently evaluation of how to better us laser projector API is being working on.
Currently for AMCL and Costmap2D the subscribers are set in
The results of performance measurement are presented below (I've used PCL data sparse patch, not included in this PR):
The Approach mode with PCL works the slowest, as it is simulates the robot's movement in kinematics module with
Currently, all parameters, such as number of stop points and slowdown % are connected with each polygon. I thought it is reasonable to make it for Approach model too. Since we might not have an approach polygon at all, why should we handle this parameter at global level?
The complexity of algorithm is O(MxN), where M - total number of points in data sources, N - number of polygons iterating on. It should not depend on which dimension we will iterate first: polygons or data points.
I am not sure that understand this point well: all data points from each source are being added to the
Code/functions simplification and code commenting work is in progress |
A separate timer has its own computational drawbacks, I think having it in the main cycle makes the most sense so that as a debug tool we know exactly what we see in rviz is what the safety node is seeing in the same timestep. It can be made an optional parameter to only publish when someone wants to
I'd do like 0.05 sec which should help (a little). We should work on that compute runtime for the approach then.
https://github.com/ros-planning/navigation2/pull/2982/files#diff-a8ab77e548af62fe331c646d4df405f23654b0a652d6d63718a4c0c1f6ee1ab7R87 Edit: unless each sensor type (Scan/Pointcloud) only has 1 subscription each and you make |
|
||
### Testing ### | ||
|
||
# ToDo - later |
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.
TODO
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.
Also, missing a readme, but like the tests, I'm fine waiting on that until we hammer out the big items in the review
nav2_collision_monitor/include/nav2_collision_monitor/circle.hpp
Outdated
Show resolved
Hide resolved
nav2_collision_monitor/include/nav2_collision_monitor/collision_monitor_node.hpp
Outdated
Show resolved
Hide resolved
@AlexeyMerzlyakov any updates or questions on this? I'm targetting this work to be in by June 30th to stay on schedule for the year so we have plenty of time to work on the Navigation algorithms paper and ROSCon talks |
@SteveMacenski, thank you for the detailed review on this! I am actively working to meet review items from above. Many time took the experiments and switching to using I got the deadline plans, and will also plan to finish all works for CM before that time. I expect to finish update-after-review (without testcases development) at the beginning of next week and then immediately switch to tests development. |
There are some items to comment:
Yes, this is how currently data sources classes work, so there should not be a problem.
I've made some performance comparison of
The performance esimations shown the average time of
which is on ~38% slower than current realization. |
@AlexeyMerzlyakov, your PR has failed to build. Please check CI outputs and resolve issues. |
nav2_collision_monitor/include/nav2_collision_monitor/source_base.hpp
Outdated
Show resolved
Hide resolved
I didn't get a chance to look over anything else but just verifying changes and asking a few more questions. It look the better part of 2 hours just to do that much 😆 so I'll look at it in more complete detail the next iteration. The laser projector is doing more than a base transformation, it also uses the scan times to project each point slightly differently in time knowing that the laser scan is taken for each point with some |
I noticed that there is no instance of https://github.com/ros-planning/navigation2/blob/main/nav2_costmap_2d/src/footprint_subscriber.cpp. Do you account for a potential change in the robot footprint? |
This does not require a footprint 👍 The polygons are the safety zones, not the robot footprint. For 'on approach' that is a representation of a footprint but could be inflated / changed for conservative actions so its separated from the footprint object. But I do see now that perhaps we should just use the actual robot footprint in case a robot platform changes over time. @AlexeyMerzlyakov what do you think about using a footprint subscriber instead of a polygon/circle for the 'on approach' mode? |
nav2_collision_monitor/include/nav2_collision_monitor/polygon_base.hpp
Outdated
Show resolved
Hide resolved
|
||
### Testing ### | ||
|
||
# ToDo - later |
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.
Also, missing a readme, but like the tests, I'm fine waiting on that until we hammer out the big items in the review
nav2_collision_monitor/include/nav2_collision_monitor/source_base.hpp
Outdated
Show resolved
Hide resolved
nav2_collision_monitor/include/nav2_collision_monitor/source_base.hpp
Outdated
Show resolved
Hide resolved
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.
Had time to get through the full codebase and resolve the items I felt made the main process function feel a little odd
I hate to even say this, but we should also add a sensor processing for sonars / IR feeds using the |
Given polygon in this model represents but not exactly repeats robot's footprint. We could intentionally set this shape to be larger than actual robot's footprint. For example, if we want to avoid in 100% collisions with robot in From other side, we could replace it with two polygons operating simultaneously: robot footprint at APPROACH model + safety area at STOP model. However, two polygons operating slower than one, doing the same thing. And The only thing we are skipping - is a dynamically changing robot's footprint. If |
Sorry, maybe I am being a little dense or not explaining it well. :) My main concern is that the polygons that are created for the collision monitor do not dynamically change based off of changes to the robot footprint. If a robot picks up a payload of some sort that increases the footprint size the collision monitor polygons must change to satisfy the new footprint. |
The concern with footprints is as @jwallace42 mentions (only for approach models, mind you) -- some robots will change shape over time by picking up carts/tools or having a manipulator on top in a new pose. Anyway, if we do that, it removes a parameter and its the same footprint being used in the costmaps for collision avoidance when can themselves have some padding added to them (even w.r.t. Range, we can just say if any measurement is in that box, since it has only a single return, we only need to evaluate if a single return is in a slowdown / collision box. No need for any costmap things, its just a point like a laser scan has a series of points. Its just another point to add to the |
We can always move the sonar to a follow up PR, I think its worth focusing on getting these other items done so we can get something out there that we can refine later with more sensor models |
Everything seems to be done. |
nav2_collision_monitor/README.md
Outdated
| | Stop/Slowdown model, Polygon area | Stop/Slowdown model, Circle area | Approach model, Polygon footprint | Approach model, Circle footprint | | ||
|-|-----------------------------------|----------------------------------|-----------------------------------|----------------------------------| | ||
| LaserScan (360 points) processing time, ms | 4.09 | 4.08 | 4.98 | 4.29 | | ||
| PointCloud (24K points) processing time, ms | 4.13 | 3.76 | 77.92 | 11.43 | |
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 there a way to appreciably speed up the approach model polygon? Maybe a different algorithm or algorithm optimizations?
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.
Try to embed the getPointInside
inside of getPointsInside
?
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.
Multithreading?
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, I thought about ways of optimization.
Here is the work of comparing the performance for different algorithms about point-in-polygon solution. Among basic algorithms, raycrossing algorithm (used in current implementation) is the fastest one. There is an optimization, called as "MacMartin" used for large polygons, which speeds up the raycrossing algorithms on x1.8 times.
The best way of enhanced algorithms: is a grid algorithm, quantizing the map and making "inside", "non-inside" and "indeterminate" cells. According to the work, this algorithm gives best performance, and thus more promising as an optimization point.
Try to embed the getPointInside inside of getPointsInside?
This function was already inlined locally: inline bool Polygon::isPointInside(const Point & point) const
, and confirmed by binary disassembling.
The multithreading is another way of optimization. Currently, the motion is being simulated by small steps. But it could being calculated the exact position of robot pose after t
time (since we have theta
and linear velocity, this making arcs; and then we need to make a transform from robot's velocity frame down to base frame). Knowing the exact robot position in any time frame, we could parallel the whole calculation loop e.g. by giving odd iterations to one thread, and even ones - to another. All iterations will be independent from each other. This is another point of optimization could be made there.
The good notice here, that both grid algorithms and multithreading optimizations could be applied there at the same time, that should give a noticeable increase of the performance.
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.
Update: the multithreading could be parallelized by points, instead of simulation steps. This makes it easiest to implement giving tangible benefits on multi-CPU systems.
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.
What would a default of 0.1
for simulation timestep yield? I think 0.1s timestep increments are plenty small and are 5x larger than currently set.
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.
That is definitely makes sense. The Footprint Approach time was decreased from ~78 -> ~20 ms. Additionally checked that robot still behaves well in the simulation with footprint approach. Re-measured the peroformance and updated the README accordingly.
Co-authored-by: Steve Macenski <[email protected]>
Co-authored-by: Steve Macenski <[email protected]>
Co-authored-by: Steve Macenski <[email protected]>
Co-authored-by: Steve Macenski <[email protected]>
Co-authored-by: Steve Macenski <[email protected]>
Co-authored-by: Steve Macenski <[email protected]>
Co-authored-by: Steve Macenski <[email protected]>
Co-authored-by: Steve Macenski <[email protected]>
Co-authored-by: Steve Macenski <[email protected]>
@AlexeyMerzlyakov, your PR has failed to build. Please check CI outputs and resolve issues. |
I'm ready to merge this if you are! |
Added some strokes: changed default parameters to fit used for README.md picture ones: e8b491e, and fixed "safety area" -> "zone" names in code comments: 7f4c3bf. Looked again though code: everything seems to be OK. |
after yesterdays merge, on rolling, the build is failing, did you guys notice it as well?
#3084 fixes it! |
@padhupradheep, Yes, it looks like during the development the sources were outdated and drifted apart. Thank for the notice! |
* Add Collision Monitor node * Meet review items * Fix next review items * Code cleanup * Support dynamic footprint. More optimizations. * Switch to multiple footprints. Move variables. Remove odom subscriber. Add 0-velocity optimization * Update nav2_collision_monitor/include/nav2_collision_monitor/polygon.hpp Co-authored-by: Steve Macenski <[email protected]> * Update nav2_collision_monitor/params/collision_monitor_params.yaml Co-authored-by: Steve Macenski <[email protected]> * Update nav2_collision_monitor/params/collision_monitor_params.yaml Co-authored-by: Steve Macenski <[email protected]> * Update nav2_collision_monitor/params/collision_monitor_params.yaml Co-authored-by: Steve Macenski <[email protected]> * Meet smaller review items * Add fixes found during unit test development * Fix uncrustify issues * Add unit tests * Fix number of polygons points * Move tests * Add kinematics unit test * Minor tests fixes * Remove commented line * Add edge case checking testcase and references * Update comment * Add README.md * Fixed table * Minor changes in README.md * Fix README.md for documentation pages * Update nav2_collision_monitor/README.md Co-authored-by: Steve Macenski <[email protected]> * Update nav2_collision_monitor/README.md Co-authored-by: Steve Macenski <[email protected]> * Update nav2_collision_monitor/README.md Co-authored-by: Steve Macenski <[email protected]> * Update nav2_collision_monitor/README.md Co-authored-by: Steve Macenski <[email protected]> * Update nav2_collision_monitor/README.md Co-authored-by: Steve Macenski <[email protected]> * Update nav2_collision_monitor/README.md Co-authored-by: Steve Macenski <[email protected]> * Update nav2_collision_monitor/README.md Co-authored-by: Steve Macenski <[email protected]> * Update nav2_collision_monitor/README.md Co-authored-by: Steve Macenski <[email protected]> * Update nav2_collision_monitor/README.md Co-authored-by: Steve Macenski <[email protected]> * Update nav2_collision_monitor/README.md Co-authored-by: Steve Macenski <[email protected]> * Meet review items * Meet review items (part 2) * Update polygons picture for README * Change simulation_time_step to 0.1 * Fix bounding boxes to fit the demo from README.md * Terminology fixes Co-authored-by: Steve Macenski <[email protected]>
* Fix size_t format specifier (#3003) * clear up params file (#3004) Signed-off-by: zhenpeng ge <[email protected]> * Bt test fix (#2999) * fixed tests * undo * linting fix (#3007) Signed-off-by: zhenpeng ge <[email protected]> * Add nav2_constrained_smoother to metapackage * adding humble release to table (#3008) * Fix for costmap nodes lifecycle status (#3009) Lifecycle status for global and local cost nodes not correct. ros2 lifecycle/service commands shows unconfigured for these two. This is due to directly calling on_configure/on_activate/on_cleanup calls in parent node. This PR to replace on_xxxxxx() to configure()/activate()/cleanup() calls of lifecycle base. Signed-off-by: Arshad <[email protected]> * Get parameters on configure transition addressing #2985 (#3000) * Get parameters on configure transition Signed-off-by: MartiBolet <[email protected]> * Remove past setting of parameters Signed-off-by: MartiBolet <[email protected]> * Expose transition functions to public for test Signed-off-by: MartiBolet <[email protected]> * fix: wrong input type in navigate_to_pose_action.hpp and navigate_to_… (#2994) * fix: wrong input type in navigate_to_pose_action.hpp and navigate_to_pose_action.hpp * Update navigate_through_poses_action.hpp Co-authored-by: Steve Macenski <[email protected]> * Nav2 Velocity Smoother (#2964) * WIP velocity smoother with ruckig * a few comments * vel smoother prototype * updating defaults * adding defaults to readme * removing note from readme * updates to velocity smoother TODO items * adding unit tests * finishing system tests * adding failure to change parameters tests * fix last bits * fixing negative sign bug * lint * update tests * setting defaults * Adding warning * Update velocity_smoother.cpp * Fixing rebase issue * adding plugin type for static in local + removing unused print (#3021) * removed extra includes (#3026) * remove extra sub (#3025) * Fix missing dependency on nav2_velocity_smoother (#3031) * adding timeout for action client initialization (#3029) * adding timeout for action client initialization Signed-off-by: Vinny Ruia <[email protected]> * adding constant 1s timeout, catching exception Signed-off-by: Vinny Ruia <[email protected]> * cleanup warnings (#3028) * cleanup warnings * removed referenc * installing plugins folder of nav2_behaviors package (#3051) Co-authored-by: Srijanee Biswas <[email protected]> * Completed PR 2929 (#3038) * accepting empty yaml_filename if no initial map is available * invalid load_map-request does not invalidate existing map, added Testcase * style * finish PR 2929 * finish linting * removing change * removing change * Update test_map_server_node.cpp * Update test_map_server_node.cpp Co-authored-by: Nikolas Engelhard <[email protected]> * zero z values in rpp transformed plan (#3066) * removing get node options default for nav2 utils (#3073) * adding looping timeout for lifecycle service clients + adding string name of action for BT action nodes (#3071) * adding looping timeout for lifecycle service clients + adding string name of action for BT action nodes * fix linting * remove inline comment * adding goal updated controller node to test * Smac Planner 2D changes (#3083) * removing 4-connected option from smac; fixing 2D heuristic and traversal function from other planner's changes * fix name of variable since no longer a neighborhood * partial test updates * ported unit tests fully * revert to no costmap downsampling * Collision monitor (#2982) * Add Collision Monitor node * Meet review items * Fix next review items * Code cleanup * Support dynamic footprint. More optimizations. * Switch to multiple footprints. Move variables. Remove odom subscriber. Add 0-velocity optimization * Update nav2_collision_monitor/include/nav2_collision_monitor/polygon.hpp Co-authored-by: Steve Macenski <[email protected]> * Update nav2_collision_monitor/params/collision_monitor_params.yaml Co-authored-by: Steve Macenski <[email protected]> * Update nav2_collision_monitor/params/collision_monitor_params.yaml Co-authored-by: Steve Macenski <[email protected]> * Update nav2_collision_monitor/params/collision_monitor_params.yaml Co-authored-by: Steve Macenski <[email protected]> * Meet smaller review items * Add fixes found during unit test development * Fix uncrustify issues * Add unit tests * Fix number of polygons points * Move tests * Add kinematics unit test * Minor tests fixes * Remove commented line * Add edge case checking testcase and references * Update comment * Add README.md * Fixed table * Minor changes in README.md * Fix README.md for documentation pages * Update nav2_collision_monitor/README.md Co-authored-by: Steve Macenski <[email protected]> * Update nav2_collision_monitor/README.md Co-authored-by: Steve Macenski <[email protected]> * Update nav2_collision_monitor/README.md Co-authored-by: Steve Macenski <[email protected]> * Update nav2_collision_monitor/README.md Co-authored-by: Steve Macenski <[email protected]> * Update nav2_collision_monitor/README.md Co-authored-by: Steve Macenski <[email protected]> * Update nav2_collision_monitor/README.md Co-authored-by: Steve Macenski <[email protected]> * Update nav2_collision_monitor/README.md Co-authored-by: Steve Macenski <[email protected]> * Update nav2_collision_monitor/README.md Co-authored-by: Steve Macenski <[email protected]> * Update nav2_collision_monitor/README.md Co-authored-by: Steve Macenski <[email protected]> * Update nav2_collision_monitor/README.md Co-authored-by: Steve Macenski <[email protected]> * Meet review items * Meet review items (part 2) * Update polygons picture for README * Change simulation_time_step to 0.1 * Fix bounding boxes to fit the demo from README.md * Terminology fixes Co-authored-by: Steve Macenski <[email protected]> * removing the extra argument in class dec (#3084) * Fix for #3078, fix image path in YAML (#3082) * Fix for #3078, fix image path in YAML * Update map_io.cpp * Update map_io.cpp * Update map_io.cpp * Update map_io.cpp * do not depend on velocity for approach scaling (#3047) * do not depend on velocity for approach scaling * add approach_velocity_scaling_dist to README * do not pass references to shared ptr * fixup! do not pass references to shared ptr * fix approach velocity scaling compile issues * default approach_velocity_scaling_dist based on costmap size * change default approach_velocity_scaling_dist to 0.6 to match previous behavior * update tests for approach velocity scaling * remove use_approach_linear_velocity_scaling from readme * smooth approach velocity scaling * Use correct timeout when checking future (#3087) * Adds missing commas so default plugin names are not stuck together (#3093) Signed-off-by: Aaron Chong <[email protected]> Signed-off-by: Aaron Chong <[email protected]> * Fix Costmap Filters system tests (#3120) * Fix Costmap Filters system tests * Update map_io.cpp Co-authored-by: Alexey Merzlyakov <[email protected]> * Finding distance H if obstacle H is <= 0 (#3122) * adding checks on goal IDs in results for waypoint follower (#3130) * ComputePathToPose Sets empty path on blackboard if action is aborted or cancelled (#3114) * set empty path on black on failure * docs * switched to correct message type * set empty path for compute_path_through_poses * Ignore feedback from old goals in waypoint follower (#3139) * apply joinchar in pathify (#3141) Co-authored-by: kevin <[email protected]> * Log level (#3110) * added log level for navigation launch * localization log level * slam log level * revert use_comp * added log level to components * linting and uncrusitfy fixes for CI (#3144) * start is now added to the path (#3140) * start is now added to the path * lint fix * Update README.md (#3147) Current example doesn't work with the updates. * fixing linting problem * Setting map map's yaml path to empty string, since overridden in launch (#3123) * Update nav2_params.yaml * Update nav2_params.yaml * Update nav2_params.yaml * bumping to 1.1.1 for release Signed-off-by: zhenpeng ge <[email protected]> Signed-off-by: Arshad <[email protected]> Signed-off-by: MartiBolet <[email protected]> Signed-off-by: Vinny Ruia <[email protected]> Signed-off-by: Aaron Chong <[email protected]> Co-authored-by: M. Mostafa Farzan <[email protected]> Co-authored-by: Zhenpeng Ge <[email protected]> Co-authored-by: Joshua Wallace <[email protected]> Co-authored-by: Arshad Mehmood <[email protected]> Co-authored-by: MartiBolet <[email protected]> Co-authored-by: shoufei <[email protected]> Co-authored-by: hodnajit <[email protected]> Co-authored-by: Vinny Ruia <[email protected]> Co-authored-by: SrijaneeBiswas <[email protected]> Co-authored-by: Srijanee Biswas <[email protected]> Co-authored-by: Nikolas Engelhard <[email protected]> Co-authored-by: Adam Aposhian <[email protected]> Co-authored-by: Alexey Merzlyakov <[email protected]> Co-authored-by: Pradheep Krishna <[email protected]> Co-authored-by: nakai-omer <[email protected]> Co-authored-by: Samuel Lindgren <[email protected]> Co-authored-by: Aaron Chong <[email protected]> Co-authored-by: Alexey Merzlyakov <[email protected]> Co-authored-by: Pedro Alejandro González <[email protected]> Co-authored-by: 정찬희 <[email protected]> Co-authored-by: kevin <[email protected]> Co-authored-by: Austin Greisman <[email protected]>
* Add Collision Monitor node * Meet review items * Fix next review items * Code cleanup * Support dynamic footprint. More optimizations. * Switch to multiple footprints. Move variables. Remove odom subscriber. Add 0-velocity optimization * Update nav2_collision_monitor/include/nav2_collision_monitor/polygon.hpp Co-authored-by: Steve Macenski <[email protected]> * Update nav2_collision_monitor/params/collision_monitor_params.yaml Co-authored-by: Steve Macenski <[email protected]> * Update nav2_collision_monitor/params/collision_monitor_params.yaml Co-authored-by: Steve Macenski <[email protected]> * Update nav2_collision_monitor/params/collision_monitor_params.yaml Co-authored-by: Steve Macenski <[email protected]> * Meet smaller review items * Add fixes found during unit test development * Fix uncrustify issues * Add unit tests * Fix number of polygons points * Move tests * Add kinematics unit test * Minor tests fixes * Remove commented line * Add edge case checking testcase and references * Update comment * Add README.md * Fixed table * Minor changes in README.md * Fix README.md for documentation pages * Update nav2_collision_monitor/README.md Co-authored-by: Steve Macenski <[email protected]> * Update nav2_collision_monitor/README.md Co-authored-by: Steve Macenski <[email protected]> * Update nav2_collision_monitor/README.md Co-authored-by: Steve Macenski <[email protected]> * Update nav2_collision_monitor/README.md Co-authored-by: Steve Macenski <[email protected]> * Update nav2_collision_monitor/README.md Co-authored-by: Steve Macenski <[email protected]> * Update nav2_collision_monitor/README.md Co-authored-by: Steve Macenski <[email protected]> * Update nav2_collision_monitor/README.md Co-authored-by: Steve Macenski <[email protected]> * Update nav2_collision_monitor/README.md Co-authored-by: Steve Macenski <[email protected]> * Update nav2_collision_monitor/README.md Co-authored-by: Steve Macenski <[email protected]> * Update nav2_collision_monitor/README.md Co-authored-by: Steve Macenski <[email protected]> * Meet review items * Meet review items (part 2) * Update polygons picture for README * Change simulation_time_step to 0.1 * Fix bounding boxes to fit the demo from README.md * Terminology fixes Co-authored-by: Steve Macenski <[email protected]>
Implementation of Collision Monitor node
Basic Info
Description of contribution in a few bullet points
N
points are inside given polygonS%
if more thanN
points are inside given polygon. Working principle similar to Stop modeM
seconds before a collision with obstacle. In this model, given polygon is acting as robot's footprint.cmd_vel
required for node operation.Description of documentation updates required from your changes
Future work that may be required in bullet points
odom
speed changes in steps/making noiseFor Maintainers: