Skip to content
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

Added new costmap buffer to resize map safely #1837

Merged
merged 4 commits into from
Jul 23, 2020

Conversation

gimait
Copy link
Contributor

@gimait gimait commented Jul 1, 2020

Signed-off-by: Aitor Miguel Blanco aitormibl@gmail.com


Basic Info

Info Please fill out this column
Ticket(s) this addresses #1625
Primary OS tested on Ubuntu 20.04
Robotic platform tested on -

Description of contribution in a few bullet points

This changes still need to be tested, and might need some updates. Please let me know if you see any bugs I might have missed, or if you have any design recommendations.

  • A shared pointer has been added to StaticLayer as auxiliary storage of a new incoming map. A flag is set when a new map is stored and the map is updated at the beginning of UpdateBounds, making the costmap updates thread safe (hopefully without a big performance penalty).
  • The StaticLayer mutex is now locked earlier in processMap, to protect the costmap_ variable as well.

Future work that may be required in bullet points

  • Add tests for the use case of dynamic costmap resolutions (updating the map several times).

Signed-off-by: Aitor Miguel Blanco <aitormibl@gmail.com>
@SteveMacenski
Copy link
Member

So I'm not sure that I think this is the right solution. In the case that the global costmap updates slowly, you're creating a huge amount of latency.

I think we should reverse the strategy of having a bool on if we have a new map available and replace it with if we're in the middle of a updateBounds -> updateCost. That way it only buffers when we're in that awkward middle area and otherwise we get no additional latency. At the end of updateCost, update if necessary if there's a buffered map around.

I'm also debating the mutex bit right now... it would make this cleaner...

@gimait
Copy link
Contributor Author

gimait commented Jul 1, 2020

You are right, ProcessMap can be moved to the end of UpdateCosts, however, that is a rather small optimization I guess.

The problem is that ProcessMap updates the whole layered costmap, so what is needed is not as easy as updating the costmap_ variable.. There is going to be some latency somewhere when updating this.

The question is, where should this fall? In the LayeredCostmap thread or in the incomingMap callback thread?
For the first, I'll move ProcessMap to the end of Update costs; for the second, I would add a bool to protect the UpdateBounds and UpdateCosts calls, while waiting in the incomingMap callback, and when available, call ProcessMap.

None of these solutions seem too clean or nice, but they are the minimal changes, I think. To make it look nice I would look into a bigger refactor. Should I do that?

@SteveMacenski
Copy link
Member

I'm just trying to make sure that in case the costmap update rate is low, that the map can get updated ASAP when there's no conflict. Right now, if the update rate was once every 10 seconds, it might take 10 seconds to process a new map. We could do that with a mutex or switching what the boolean variable represents new map vs in the middle of processing bounds -> cost so we can make an informed decision about which thread to do it in

@gimait
Copy link
Contributor Author

gimait commented Jul 6, 2020

I like that idea, we can have something like this then:

  • A bool indicates that processing is ongoing.
  • If a new map is recieved and there is no ongoing updatebouds/updatecosts, update the map in incommingMap, otherwise,
  • Set another bool indicating that a new map is available.
  • At the end of UpdateCosts, if a new map is available, update it.

It bothers me a bit that this code is so complex though.. I wish we could simply merge updateBounds and updateCosts, but I'm not sure why should we wait to verify all layers before updating their costs. Wouldn't it be better to run updateBounds and updateCosts in the same loop, calling them one after the other for each layer? Instead we currently call updateBounds in all layers and then all updateCosts, having a nasty return in the middle that makes complex protecting these functions.

@SteveMacenski
Copy link
Member

I don't think you need the second bool if you play games with the pointer. If the pointer isn't null or something, then set it at the end of the updateCosts function. Just null it back out every time you clear it.

The bool for if updating should be an atomic since its being touched by 2 threads.

You need to call updateBounds on all first so that as 1 layer expands the boundary, the others that might need to update (like the inflation layer) knows all the space it needs to update.

Signed-off-by: Aitor Miguel Blanco <aitormibl@gmail.com>
@gimait
Copy link
Contributor Author

gimait commented Jul 21, 2020

Sorry for the inactivity!

At the end I ended up doing what we agreed in the last comments, please review that everything is correct (I hope I didn't but I might have missed something). I only placed the update map at the beginning of updateBounds because we are not guaranteed to enter UpdateCosts every time, and this way the map can still be updated.

There is still the option of adquiring the mutex from the layered costmap in the processMap call, and that might be cleaner, but this should give us a small performance optimization over the mutex.

Please let me know your thoughts.

Copy link
Member

@SteveMacenski SteveMacenski left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see no technical issues

map_buffer_ = new_map;
} else {
processMap(*new_map);
map_buffer_ = nullptr;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You don't need to set to nullptr here. If you set it, it will be reset below in the update function.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it is necessary. If the incomingMap is called while updating the layer, and then again after the update is finished, the last call should pe processed, and the buffer emptied. Otherwise in this case the new map would be processed twice, once here, another time in the update function.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If map_buffer_ is set to nullptr to begin with (you should do that in constructor's :), then it is only not nullptr when 259 sets it to something else. In the next function, you process the map and then reset it to nullptr. At that point, I don't think there's any case when this is not nullptr where setting it here is necessary. You have a mutex locked above this so only this callback or one of the functions can be in use at the same time, effectively locking this variable -- unless I'm missing something.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, so both functions can call the processMap, therefore if we don't clear the map_buffer_ here, when we get to the update we see that efectively there is something in the buffer and we update it again. I think. The fact of having the lock doesn't change that: When we are here, this function has the lock, and processes the map. Then the update is waiting, and when the lock gets free, it would check the buffer, and call processMap again if it's not empty. I think you are seeing the practical case, but in theory, it would be possible to call incomingMap several times between calls to updateBounds, including during the execution of updateBounds.

But I see how this can be confusing, and tricky to follow. Maybe it's best to simply get the layered_costmap mutex at the beginning of processMap and leave the rest as it was..

I'll initialize the buffer to nullptr also, I missed that one.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess let me game this out without the 262 map_buffer_ = nullptr:

  • I start up (so map_buffer_ is nullptr) have a new map, not in the middle of a process cycle so it just directly updates. Do this 10 times, still never set to anything other than nullptr
  • I start up (so map_buffer_ is nullptr) have a new map, not in the middle of a process cycle so it just directly updates. Then I update bounds 10 times, so still nullptr so never gets called in the update function
  • I start up (so map_buffer_ is nullptr) have a new map, its now in the middle of an update cycle so it stores the map in map_buffer_ between the 2 functions after the mutex is released and then in the updateCosts it uses the old map since there's no processMap() call in updateCosts. Then we wait for the next iteration of the costmap to add / process the map
  • I start up (so map_buffer_ is nullptr) have a new map, its now in the middle of an update cycle so it stores the map in map_buffer_ between the 2 functions after the mutex is released and then in the updateCosts it uses the old map since there's no processMap() call in updateCosts. Then we have a second new map before the updateBounds can be called again. If we're not in an update cycle, then that new map will be directly processed but the old map will still be stored and processed next round.

You are correct, we need to set to reset in case there's something there. Thanks!

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just make the other changes and we should be GTG

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay I'll push the update during the day.
Just to clarify why I placed the processMap at the beginning of updateBounds and not at the end of updateCosts:
The line 168 of layered_costmap.cpp can prevent the updateCosts call from being done, which would lock the costmap if the reason for the error comes from the static_layer's map (if that would be the case, the logic would prevent the static map from being updated). By placing the processMap call at the beginning of updateBounds, we ensure that the map would be updated every time there is a new map, without any real changes on the performance of the layered costmap.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay, I'll fix the branch and the other changes and push during the day.

Just to clarify why I placed the call to processMap at the beginning of updateBounds and not at the end of updateCosts:

The line 168 of layered_costmap.cpp can prevent the call of updateCosts. This is problematic when the reason why we end up returning there is related to the static layer, because in that case, the incomingMap call would be prevented from updating the map (the 'update_in_progress' flag is set to true until the end of updateCosts).
It might seem like a lot of conditions should be met for that to happen, but it could happen. By moving the processMap to the beginning of updateBounds, we prevent this logic lock from happening without any performance penalty.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Beginning makes sense, no issue

nav2_costmap_2d/plugins/static_layer.cpp Outdated Show resolved Hide resolved
nav2_costmap_2d/include/nav2_costmap_2d/static_layer.hpp Outdated Show resolved Hide resolved
@SteveMacenski
Copy link
Member

SteveMacenski commented Jul 21, 2020

@dwisse please review (@DLu as well if you have a few minutes to spare)

@SteveMacenski
Copy link
Member

SteveMacenski commented Jul 21, 2020

@gimait please rebase / pull in master to let CI build

@dwisse
Copy link

dwisse commented Jul 23, 2020 via email

@gimait
Copy link
Contributor Author

gimait commented Jul 23, 2020

Then you can process the map in incomingMap and only have to swap pointers at the beginning of updateBounds?

The only problem is that the processMap function updates the whole layered_costmap, not only the local one.. then it is not really so easy to swap the pointers.

Please test this with your code, since you were able to reproduce it rather easily it would be a lot of help if you can run it and see if it actually works or some other issues appear.

@codecov
Copy link

codecov bot commented Jul 23, 2020

Codecov Report

Merging #1837 into master will increase coverage by 0.60%.
The diff coverage is 68.75%.

Impacted file tree graph

@@            Coverage Diff             @@
##           master    #1837      +/-   ##
==========================================
+ Coverage   68.82%   69.42%   +0.60%     
==========================================
  Files         218      218              
  Lines       10600    10614      +14     
==========================================
+ Hits         7295     7369      +74     
+ Misses       3305     3245      -60     
Impacted Files Coverage Δ
nav2_costmap_2d/plugins/static_layer.cpp 68.10% <68.75%> (+4.95%) ⬆️
...v2_util/include/nav2_util/simple_action_server.hpp 88.27% <0.00%> (-2.47%) ⬇️
...tree/include/nav2_behavior_tree/bt_action_node.hpp 79.26% <0.00%> (-2.44%) ⬇️
nav2_amcl/src/amcl_node.cpp 83.30% <0.00%> (-0.76%) ⬇️
nav2_controller/src/nav2_controller.cpp 79.01% <0.00%> (-0.45%) ⬇️
nav2_recoveries/plugins/spin.cpp 89.47% <0.00%> (+89.47%) ⬆️

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update d7494ec...51acf47. Read the comment docs.

@dwisse
Copy link

dwisse commented Jul 23, 2020 via email

@SteveMacenski
Copy link
Member

@dwisse you're welcome to do that - but I would not recommend it. Messing with the higher level locks will probably increase your CPU usage from more mutex thrashing & certain costmap layers might not be compatible with that method. This is supposed to be a distributed solution to enable multithreading if you liked.

@gimait anything else you want to update?

@dwisse
Copy link

dwisse commented Jul 23, 2020 via email

@SteveMacenski
Copy link
Member

SteveMacenski commented Jul 23, 2020

You have the layer locking the entire environmental representation. There are other services and users of this costmap that need access on their own schedule, not on the schedule of the costmap update thread you're blocking. For instance, if my planner was called, your solution is blocking the controller or planner from doing its job during any update in this way.

Overall, it breaks many encapsulation concepts / implementations used in costmap_2d.

@dwisse
Copy link

dwisse commented Jul 23, 2020 via email

@SteveMacenski
Copy link
Member

No, you lock the static map update, which isn't required for the navigation system to access the layered costmap.

@dwisse
Copy link

dwisse commented Jul 23, 2020 via email

@SteveMacenski SteveMacenski merged commit 0fcbd7c into ros-navigation:master Jul 23, 2020
@SteveMacenski
Copy link
Member

I'd recommend using this as we've designed.

@gimait
Copy link
Contributor Author

gimait commented Jul 24, 2020

@dwisse I'm not sure we are talking about the same mutex. Each costmap has a mutex to protect it during updates. This means that both the layered_costmap and static_layer have their own mutex. Coming from that base, the layered costmap is only locked at line 176 and released right after.

In #1625 you had a problem when using a rolling map, which was not protected because the layered_costmap's mutex is not locked in that case. What I tried to do in this PR was to add protection for that case without stopping the whole layered costmap.

I believe there should be an advantage to this approach when several plugins (i.e., layers) are in use, since we include the opportunity for the map to be updated at the same time as other plugins might be processed, but please let me know if I missed something.

If you have other suggestions or you think this can be improved, I would like to encourage you to submit a PR with what you would like to see working. I personally think it is good to share your thoughts and contribute with the community: you can get a lot of feedback and help, and you can also help others that might have similar problems to yours, and the only extra thing you would have to do is create the PR, maybe a ticket.

SteveMacenski pushed a commit that referenced this pull request Aug 11, 2020
* Added new costmap buffer to resize map safely

Signed-off-by: Aitor Miguel Blanco <aitormibl@gmail.com>

* Update map if the layer is not being processed.

Signed-off-by: Aitor Miguel Blanco <aitormibl@gmail.com>

* Updated bool name and added buffer initialization

Signed-off-by: Aitor Miguel Blanco <aitormibl@gmail.com>
SteveMacenski added a commit that referenced this pull request Aug 11, 2020
* Add slam toolbox as exec dep for nav2_bringup (#1827)

* Add slam toolbox as exec dep

* Added slam toolbox

* Changed version of slam toolbox to foxy-devel

* Added modifications to allow for exec depend of slam toolbox without breaking docker / CI

* reformatted skip keys

* Added tabs to skip key arguments

* Removed commented out code block

* Add unit tests for follow path, compute path to pose, and navigate to pose BT action nodes (#1844)

* Add compute path to pose unit tests

Signed-off-by: Sarthak Mittal <sarthakmittal2608@gmail.com>

* Add follow path action unit tests

Signed-off-by: Sarthak Mittal <sarthakmittal2608@gmail.com>

* Add navigate to pose action unit tests

Signed-off-by: Sarthak Mittal <sarthakmittal2608@gmail.com>

* adding foxy build icons to readme (#1853)

* adding foxy build icons

* adding dividers

* sync master from foxy version updates (#1852)

* sync master from foxy version updates

* syncing foxy and master

* Add unit tests for clear entire costmap and reinitialize global localization BT service nodes (#1845)

* Add clear entire costmap service unit tests

Signed-off-by: Sarthak Mittal <sarthakmittal2608@gmail.com>

* Add reinitialize global localization service unit test

Signed-off-by: Sarthak Mittal <sarthakmittal2608@gmail.com>

* Temporarily disable dump_params test (#1856)

Signed-off-by: Sarthak Mittal <sarthakmittal2608@gmail.com>

* commenting out unused validPointPotential (#1854)

* Adding ROS2 versions to issue template (#1861)

* reload behavior tree before creating RosTopicLogger to prevent nullptr error or no /behavior_tree_log problem (#1849)

Signed-off-by: Daisuke Sato <daisukes@cmu.edu>

* Add citation for IROS paper (#1867)

* Add citation

We'll want to add the DOI once published

* Bump citation section above build status

* Fix line breaks

* Changes RCUTILS_CONSOLE_STDOUT_LINE_BUFFERED to RCUTILS_LOGGING_BUFFERED_STREAM (#1868)

* Added parameters to configure amcl laser scan topic (#1870)

* Added parameters to configure amcl topic

* changed parameter to scan_topic and added to all the configuration files

* added scan_topic amcl param to docs

* Satisfied linter

* Move dwb goal/progress checker plugins to nav2_controller (#1857)

* Move dwb goal/progress checker plugins to nav2_controller

Signed-off-by: Siddarth Gore <siddarth.gore@gmail.com>

* Move goal/progress checker plugins to nav2_controller

Address review comments

Signed-off-by: Siddarth Gore <siddarth.gore@gmail.com>

* Move goal/progress checker plugins to nav2_controller

Use new plugin declaration format and doc update

Signed-off-by: Siddarth Gore <siddarth.gore@gmail.com>

* Update bringup.yaml for new plugins in nav2_controller

Also remove redundent file from dwb_plugins
Signed-off-by: Siddarth Gore <siddarth.gore@gmail.com>

* Fix doc errors and update remaining yaml files

Signed-off-by: Siddarth Gore <siddarth.gore@gmail.com>

* Remove mention of goal_checker from dwb docs

Signed-off-by: Siddarth Gore <siddarth.gore@gmail.com>

* Add .plugin params to doc

Signed-off-by: Siddarth Gore <siddarth.gore@gmail.com>

* Tests for progress_checker plugin

declare .plugin only if not declared before

Signed-off-by: Siddarth Gore <siddarth.gore@gmail.com>

* Tweak plugin names/description in doc

Signed-off-by: Siddarth Gore <siddarth.gore@gmail.com>

* Follow pose (#1859)

* Truncate path finished

Signed-off-by: Francisco Martin Rico <fmrico@gmail.com>

* Follow Pose finished

Signed-off-by: Francisco Martin Rico <fmrico@gmail.com>

* Change names. Add test and doc

Signed-off-by: Francisco Martin Rico <fmrico@gmail.com>

* Change names and check atan2 values

Signed-off-by: Francisco Martin Rico <fmrico@gmail.com>

* Checking Inf/NaNs and trucate path changes

Signed-off-by: Francisco Martin Rico <fmrico@gmail.com>

* Revert changes in launcher

Signed-off-by: Francisco Martin Rico <fmrico@gmail.com>

* Documenting Tree

Signed-off-by: Francisco Martin Rico <fmrico@gmail.com>

* Update nav2_bt_navigator/README.md

Co-authored-by: Steve Macenski <stevenmacenski@gmail.com>

* Update nav2_bt_navigator/README.md

Co-authored-by: Steve Macenski <stevenmacenski@gmail.com>

* Change TruncatePath from decorator to action node

Signed-off-by: Francisco Martin Rico <fmrico@gmail.com>

* Update nav2_bt_navigator/README.md

Co-authored-by: Steve Macenski <stevenmacenski@gmail.com>

Co-authored-by: Steve Macenski <stevenmacenski@gmail.com>

* Remove Deprecated Declaration (#1884)

* Remove deprecated rclcpp::executor::FutureReturnCode::SUCCESS in favor of rclcpp::FutureReturnCode::SUCCESS

Signed-off-by: Hunter L. Allen <hunter.allen@ghostrobotics.io>

* Update nav2_util/include/nav2_util/service_client.hpp

Co-authored-by: Sarthak Mittal <sarthakmittal2608@gmail.com>

Co-authored-by: Sarthak Mittal <sarthakmittal2608@gmail.com>

* Added new costmap buffer to resize map safely (#1837)

* Added new costmap buffer to resize map safely

Signed-off-by: Aitor Miguel Blanco <aitormibl@gmail.com>

* Update map if the layer is not being processed.

Signed-off-by: Aitor Miguel Blanco <aitormibl@gmail.com>

* Updated bool name and added buffer initialization

Signed-off-by: Aitor Miguel Blanco <aitormibl@gmail.com>

* Fix dump params tests (#1886)

Signed-off-by: Sarthak Mittal <sarthakmittal2608@gmail.com>

* Move definitions in tf_help to separate src cpp file (#1890)

* Move definitions of functions in tf_help to separate src cpp file to avoid multiple definition error

* Fix linting issues

* Make uncrustify happier

* More format fixing

* resolved the simulated motion into its x & y components (#1887)

Signed-off-by: Marwan Taher <marokhaled99@gmail.com>

* Fix nav2_bt_navigator cleanup (#1901)

Signed-off-by: Sarthak Mittal <sarthakmittal2608@gmail.com>

* Adding some more test coverage (#1903)

* more tests

* removing old cmake

* remove on_errors in specific servers in favor of a general lifecycle warning (#1904)

* remove on_errors in favor of a general lifecycle warning

* adding removed thing

* simply nodes to remove lines (#1907)

* Bunches of random new tests (#1909)

* trying to get A* to work again

* make flake 8 happy

* adding cancel and preempt test

* planner tests use A*

* adding A* note

* test with topic

* Adding failure to navigate test (#1912)

* failures tests

* adding copyrights

* cancel test in recoveries

* Costmap lock while copying data in navfn planner (#1913)

* acquire the costmap lock while copying data in navfn planner

Signed-off-by: Daisuke Sato <daisukes@cmu.edu>

* add costmap lock to dwb local plannger

Signed-off-by: Daisuke Sato <daisukes@cmu.edu>

* Added map_topic parameters to static layer and amcl (#1910)

* see if spin some in cancel will allow result callback (#1914)

* Adding near-complete voxel grid test coverage and more to controller server (#1915)

* remove erraneous handling done by prior

* adding a bunch of voxel unit tests

* retrigger

* adding waypoint follower failure test, voxel layer integration tests, etc (#1916)

* adding waypoint follower failure test

* adding voxel, more logging

* reset -> clear

* minor changes to lower redundent warnings (#1918)

* Costmap plugins declare if not declared for reset capabilities (#1919)

* fixing #1917 on declare if not declared

* fix API

* adding CLI test (#1920)

* More coverage in map server tests (#1921)

* adding CLI test

* adding a bunch of new coverages for map_server

* Add in range sensor costmap layer (#1888)

* range costmap building

* range sensor layer working

* nav2 costmap pass linter and uncrustify tests

* Added back semicolon to range class

* Added docs

* Added angles dependency

* Added BSD license

* Added BSD license

* Made functions inline

* revmoed get_clock

* added input_sensor_type to docs

* Made defualt topic name empty to cause error

* using chorno literal to denote time units

* Added small initial test

* Fixed linter error, line breaks, enum, logger level, and transform_tolerance issue

* fixed segmentation fault in test and added transfrom tolerances to tf_->transform

* Got test to pass

* Added more tests

* removed incorrect parameter declaration

* Improved marking while moving tests and added clearing tests

* removed general clearing test

* changed testing helper import in test

* [Test sprint] push nav2_map_server over 90% (#1922)

* adding CLI test

* adding tests for more lines to map_server

* fix last test

* adding out of bounds and higher bounds checks

* adding planner tests for plugins working

* add cleanup

* working

* ping

* [testing sprint] final test coverage and debug logging in planner/controller servers (#1924)

* adding CLI test

* adding tests for more lines to map_server

* fix last test

* adding out of bounds and higher bounds checks

* adding planner tests for plugins working

* add cleanup

* working

* ping

* adding more testing and debug info messages

* [testing sprint] remove dead code not used in 10 years from navfn (#1926)

* remove dead code not used in 10 years from navfn

* ping

* inverting period to rate

* removing debug statement that could never be triggered by a single non-looping action server

* type change

* adding removed files

* bump to 0.4.2

* add another missing file

* add missing files

* remove some tests

* lint

* removing nav2_bringup from binaries

Co-authored-by: Michael Equi <32988490+Michael-Equi@users.noreply.github.com>
Co-authored-by: Sarthak Mittal <sarthakmittal2608@gmail.com>
Co-authored-by: Daisuke Sato <43101027+daisukes@users.noreply.github.com>
Co-authored-by: Ruffin <roxfoxpox@gmail.com>
Co-authored-by: Siddarth Gore <siddarth.gore@gmail.com>
Co-authored-by: Francisco Martín Rico <fmrico@gmail.com>
Co-authored-by: Hunter L. Allen <hunter.allen@ghostrobotics.io>
Co-authored-by: Aitor Miguel Blanco <aitormibl@gmail.com>
Co-authored-by: Joe Smallman <ijsmallman@gmail.com>
Co-authored-by: Marwan Taher <marokhaled99@gmail.com>
SteveMacenski pushed a commit that referenced this pull request Aug 11, 2020
* Added new costmap buffer to resize map safely

Signed-off-by: Aitor Miguel Blanco <aitormibl@gmail.com>

* Update map if the layer is not being processed.

Signed-off-by: Aitor Miguel Blanco <aitormibl@gmail.com>

* Updated bool name and added buffer initialization

Signed-off-by: Aitor Miguel Blanco <aitormibl@gmail.com>
ruffsl pushed a commit to ruffsl/navigation2 that referenced this pull request Jul 2, 2021
* Added new costmap buffer to resize map safely

Signed-off-by: Aitor Miguel Blanco <aitormibl@gmail.com>

* Update map if the layer is not being processed.

Signed-off-by: Aitor Miguel Blanco <aitormibl@gmail.com>

* Updated bool name and added buffer initialization

Signed-off-by: Aitor Miguel Blanco <aitormibl@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants