From 7e4822d4c251ee5163035fce8e09cebe2f49ba72 Mon Sep 17 00:00:00 2001 From: Niklas Yann Wettengel <niyawe@uni-koblenz.de> Date: Thu, 3 Nov 2016 22:28:52 +0100 Subject: [PATCH] Trimmed the branch to only the homer_map_manager sub directory --- .../CHANGELOG.rst => CHANGELOG.rst | 0 .../CMakeLists.txt => CMakeLists.txt | 0 README.md | 58 +- homer_map_manager/README.md | 42 - homer_mapnav_msgs/CHANGELOG.rst | 9 - homer_mapnav_msgs/CMakeLists.txt | 33 - homer_mapnav_msgs/README.md | 244 --- homer_mapnav_msgs/msg/MapLayers.msg | 10 - homer_mapnav_msgs/msg/ModifyMap.msg | 21 - homer_mapnav_msgs/msg/ModifyPOI.msg | 2 - homer_mapnav_msgs/msg/NavigateToPOI.msg | 3 - homer_mapnav_msgs/msg/PointOfInterest.msg | 13 - homer_mapnav_msgs/msg/PointsOfInterest.msg | 1 - homer_mapnav_msgs/msg/RegionOfInterest.msg | 12 - homer_mapnav_msgs/msg/RegionsOfInterest.msg | 1 - homer_mapnav_msgs/msg/RoiChange.msg | 3 - homer_mapnav_msgs/msg/StartNavigation.msg | 4 - homer_mapnav_msgs/msg/TargetUnreachable.msg | 9 - homer_mapnav_msgs/package.xml | 22 - homer_mapnav_msgs/readme.pdf | Bin 121801 -> 0 bytes homer_mapnav_msgs/srv/GetPointsOfInterest.srv | 2 - .../srv/GetRegionOfInterestName.srv | 3 - .../srv/GetRegionsOfInterest.srv | 2 - homer_mapnav_msgs/srv/LoadMap.srv | 2 - homer_mapnav_msgs/srv/PointInsideRois.srv | 3 - homer_mapnav_msgs/srv/SaveMap.srv | 2 - homer_mapping/CHANGELOG.rst | 9 - homer_mapping/CMakeLists.txt | 91 -- homer_mapping/README.md | 67 - homer_mapping/config/homer_mapping.yaml | 34 - .../homer_mapping/OccupancyMap/OccupancyMap.h | 385 ----- .../ParticleFilter/HyperSlamFilter.h | 163 -- .../homer_mapping/ParticleFilter/Particle.h | 64 - .../ParticleFilter/ParticleFilter.h | 320 ---- .../homer_mapping/ParticleFilter/SlamFilter.h | 327 ---- .../ParticleFilter/SlamParticle.h | 72 - .../include/homer_mapping/slam_node.h | 186 --- homer_mapping/launch/homer_mapping.launch | 5 - homer_mapping/mainpage.dox | 26 - homer_mapping/manifest.xml | 23 - homer_mapping/package.xml | 34 - homer_mapping/readme.pdf | Bin 113506 -> 0 bytes homer_mapping/src/CMakeLists.txt | 2 - .../src/OccupancyMap/OccupancyMap.cpp | 977 ------------ .../src/ParticleFilter/HyperSlamFilter.cpp | 202 --- homer_mapping/src/ParticleFilter/Particle.cpp | 10 - .../src/ParticleFilter/SlamFilter.cpp | 662 -------- .../src/ParticleFilter/SlamParticle.cpp | 30 - homer_mapping/src/slam_node.cpp | 387 ----- homer_nav_libs/CHANGELOG.rst | 9 - homer_nav_libs/CMakeLists.txt | 44 - homer_nav_libs/README.md | 13 - .../homer_nav_libs/Explorer/Explorer.h | 359 ----- .../include/homer_nav_libs/Explorer/GridMap.h | 575 ------- .../include/homer_nav_libs/Math/Box2D.h | 184 --- .../include/homer_nav_libs/Math/Line2D.h | 223 --- .../include/homer_nav_libs/Math/Math.h | 129 -- .../include/homer_nav_libs/Math/Pixel.h | 59 - .../include/homer_nav_libs/Math/Point2D.h | 312 ---- .../include/homer_nav_libs/Math/Pose.h | 72 - .../homer_nav_libs/Math/Transformation2D.h | 143 -- .../include/homer_nav_libs/Math/mat2.h | 77 - .../include/homer_nav_libs/Math/mat2_inl.h | 86 - .../include/homer_nav_libs/Math/vec2.h | 189 --- homer_nav_libs/include/homer_nav_libs/tools.h | 396 ----- homer_nav_libs/package.xml | 23 - homer_nav_libs/readme.pdf | Bin 79468 -> 0 bytes homer_nav_libs/src/Explorer/Explorer.cpp | 1408 ----------------- homer_nav_libs/src/Math/Line2D.cpp | 99 -- homer_nav_libs/src/Math/Math.cpp | 135 -- homer_nav_libs/src/Math/Point2D.cpp | 33 - homer_nav_libs/src/Math/Pose.cpp | 117 -- homer_nav_libs/src/Math/Transformation2D.cpp | 308 ---- .../src/SpeedControl/CMakeLists.txt | 5 - .../src/SpeedControl/SpeedControl.cpp | 177 --- .../src/SpeedControl/SpeedControl.h | 71 - homer_navigation/CHANGELOG.rst | 9 - homer_navigation/CMakeLists.txt | 55 - homer_navigation/README.md | 76 - homer_navigation/config/homer_navigation.yaml | 40 - .../config/homer_navigation_pioneer.yaml | 39 - .../homer_navigation/homer_navigation_node.h | 329 ---- .../launch/homer_navigation.launch | 4 - .../launch/homer_navigation_pioneer.launch | 4 - homer_navigation/package.xml | 36 - homer_navigation/readme.pdf | Bin 120202 -> 0 bytes .../src/homer_navigation_node.cpp | 1084 ------------- .../images => images}/rosgraph.png | Bin .../images => images}/rosgraph.svg | 0 .../homer_map_manager/Managers/MapManager.h | 0 .../Managers/MaskingManager.h | 0 .../homer_map_manager/Managers/PoiManager.h | 0 .../homer_map_manager/Managers/RoiManager.h | 0 .../homer_map_manager/MapIO/image_loader.h | 0 .../homer_map_manager/MapIO/map_loader.h | 0 .../homer_map_manager/MapIO/map_saver.h | 0 .../Workers/PointOfInterest/PointOfInterest.h | 0 .../homer_map_manager/map_manager_node.h | 0 .../mainpage.dox => mainpage.dox | 0 .../manifest.xml => manifest.xml | 0 homer_map_manager/package.xml => package.xml | 0 homer_map_manager/readme.pdf => readme.pdf | Bin .../src => src}/Managers/MapManager.cpp | 0 .../src => src}/Managers/MaskingManager.cpp | 0 .../src => src}/Managers/PoiManager.cpp | 0 .../src => src}/Managers/RoiManager.cpp | 0 .../src => src}/MapIO/image_loader.cpp | 0 .../src => src}/MapIO/map_loader.cpp | 0 .../src => src}/MapIO/map_saver.cpp | 0 .../Workers/PointOfInterest/CMakeLists.txt | 0 .../src => src}/map_manager_node.cpp | 0 111 files changed, 42 insertions(+), 11457 deletions(-) rename homer_map_manager/CHANGELOG.rst => CHANGELOG.rst (100%) rename homer_map_manager/CMakeLists.txt => CMakeLists.txt (100%) delete mode 100644 homer_map_manager/README.md delete mode 100644 homer_mapnav_msgs/CHANGELOG.rst delete mode 100644 homer_mapnav_msgs/CMakeLists.txt delete mode 100644 homer_mapnav_msgs/README.md delete mode 100644 homer_mapnav_msgs/msg/MapLayers.msg delete mode 100644 homer_mapnav_msgs/msg/ModifyMap.msg delete mode 100644 homer_mapnav_msgs/msg/ModifyPOI.msg delete mode 100644 homer_mapnav_msgs/msg/NavigateToPOI.msg delete mode 100644 homer_mapnav_msgs/msg/PointOfInterest.msg delete mode 100644 homer_mapnav_msgs/msg/PointsOfInterest.msg delete mode 100644 homer_mapnav_msgs/msg/RegionOfInterest.msg delete mode 100644 homer_mapnav_msgs/msg/RegionsOfInterest.msg delete mode 100644 homer_mapnav_msgs/msg/RoiChange.msg delete mode 100644 homer_mapnav_msgs/msg/StartNavigation.msg delete mode 100644 homer_mapnav_msgs/msg/TargetUnreachable.msg delete mode 100644 homer_mapnav_msgs/package.xml delete mode 100644 homer_mapnav_msgs/readme.pdf delete mode 100644 homer_mapnav_msgs/srv/GetPointsOfInterest.srv delete mode 100644 homer_mapnav_msgs/srv/GetRegionOfInterestName.srv delete mode 100644 homer_mapnav_msgs/srv/GetRegionsOfInterest.srv delete mode 100644 homer_mapnav_msgs/srv/LoadMap.srv delete mode 100644 homer_mapnav_msgs/srv/PointInsideRois.srv delete mode 100644 homer_mapnav_msgs/srv/SaveMap.srv delete mode 100644 homer_mapping/CHANGELOG.rst delete mode 100644 homer_mapping/CMakeLists.txt delete mode 100644 homer_mapping/README.md delete mode 100644 homer_mapping/config/homer_mapping.yaml delete mode 100644 homer_mapping/include/homer_mapping/OccupancyMap/OccupancyMap.h delete mode 100755 homer_mapping/include/homer_mapping/ParticleFilter/HyperSlamFilter.h delete mode 100644 homer_mapping/include/homer_mapping/ParticleFilter/Particle.h delete mode 100644 homer_mapping/include/homer_mapping/ParticleFilter/ParticleFilter.h delete mode 100644 homer_mapping/include/homer_mapping/ParticleFilter/SlamFilter.h delete mode 100644 homer_mapping/include/homer_mapping/ParticleFilter/SlamParticle.h delete mode 100644 homer_mapping/include/homer_mapping/slam_node.h delete mode 100644 homer_mapping/launch/homer_mapping.launch delete mode 100644 homer_mapping/mainpage.dox delete mode 100644 homer_mapping/manifest.xml delete mode 100644 homer_mapping/package.xml delete mode 100644 homer_mapping/readme.pdf delete mode 100644 homer_mapping/src/CMakeLists.txt delete mode 100644 homer_mapping/src/OccupancyMap/OccupancyMap.cpp delete mode 100755 homer_mapping/src/ParticleFilter/HyperSlamFilter.cpp delete mode 100644 homer_mapping/src/ParticleFilter/Particle.cpp delete mode 100644 homer_mapping/src/ParticleFilter/SlamFilter.cpp delete mode 100644 homer_mapping/src/ParticleFilter/SlamParticle.cpp delete mode 100644 homer_mapping/src/slam_node.cpp delete mode 100644 homer_nav_libs/CHANGELOG.rst delete mode 100644 homer_nav_libs/CMakeLists.txt delete mode 100644 homer_nav_libs/README.md delete mode 100644 homer_nav_libs/include/homer_nav_libs/Explorer/Explorer.h delete mode 100644 homer_nav_libs/include/homer_nav_libs/Explorer/GridMap.h delete mode 100644 homer_nav_libs/include/homer_nav_libs/Math/Box2D.h delete mode 100644 homer_nav_libs/include/homer_nav_libs/Math/Line2D.h delete mode 100644 homer_nav_libs/include/homer_nav_libs/Math/Math.h delete mode 100644 homer_nav_libs/include/homer_nav_libs/Math/Pixel.h delete mode 100644 homer_nav_libs/include/homer_nav_libs/Math/Point2D.h delete mode 100644 homer_nav_libs/include/homer_nav_libs/Math/Pose.h delete mode 100644 homer_nav_libs/include/homer_nav_libs/Math/Transformation2D.h delete mode 100644 homer_nav_libs/include/homer_nav_libs/Math/mat2.h delete mode 100644 homer_nav_libs/include/homer_nav_libs/Math/mat2_inl.h delete mode 100644 homer_nav_libs/include/homer_nav_libs/Math/vec2.h delete mode 100644 homer_nav_libs/include/homer_nav_libs/tools.h delete mode 100644 homer_nav_libs/package.xml delete mode 100644 homer_nav_libs/readme.pdf delete mode 100644 homer_nav_libs/src/Explorer/Explorer.cpp delete mode 100644 homer_nav_libs/src/Math/Line2D.cpp delete mode 100644 homer_nav_libs/src/Math/Math.cpp delete mode 100644 homer_nav_libs/src/Math/Point2D.cpp delete mode 100644 homer_nav_libs/src/Math/Pose.cpp delete mode 100644 homer_nav_libs/src/Math/Transformation2D.cpp delete mode 100644 homer_nav_libs/src/SpeedControl/CMakeLists.txt delete mode 100644 homer_nav_libs/src/SpeedControl/SpeedControl.cpp delete mode 100644 homer_nav_libs/src/SpeedControl/SpeedControl.h delete mode 100644 homer_navigation/CHANGELOG.rst delete mode 100644 homer_navigation/CMakeLists.txt delete mode 100644 homer_navigation/README.md delete mode 100644 homer_navigation/config/homer_navigation.yaml delete mode 100644 homer_navigation/config/homer_navigation_pioneer.yaml delete mode 100644 homer_navigation/include/homer_navigation/homer_navigation_node.h delete mode 100644 homer_navigation/launch/homer_navigation.launch delete mode 100644 homer_navigation/launch/homer_navigation_pioneer.launch delete mode 100644 homer_navigation/package.xml delete mode 100644 homer_navigation/readme.pdf delete mode 100644 homer_navigation/src/homer_navigation_node.cpp rename {homer_map_manager/images => images}/rosgraph.png (100%) rename {homer_map_manager/images => images}/rosgraph.svg (100%) rename {homer_map_manager/include => include}/homer_map_manager/Managers/MapManager.h (100%) rename {homer_map_manager/include => include}/homer_map_manager/Managers/MaskingManager.h (100%) rename {homer_map_manager/include => include}/homer_map_manager/Managers/PoiManager.h (100%) rename {homer_map_manager/include => include}/homer_map_manager/Managers/RoiManager.h (100%) rename {homer_map_manager/include => include}/homer_map_manager/MapIO/image_loader.h (100%) rename {homer_map_manager/include => include}/homer_map_manager/MapIO/map_loader.h (100%) rename {homer_map_manager/include => include}/homer_map_manager/MapIO/map_saver.h (100%) rename {homer_map_manager/include => include}/homer_map_manager/Workers/PointOfInterest/PointOfInterest.h (100%) rename {homer_map_manager/include => include}/homer_map_manager/map_manager_node.h (100%) rename homer_map_manager/mainpage.dox => mainpage.dox (100%) rename homer_map_manager/manifest.xml => manifest.xml (100%) rename homer_map_manager/package.xml => package.xml (100%) rename homer_map_manager/readme.pdf => readme.pdf (100%) rename {homer_map_manager/src => src}/Managers/MapManager.cpp (100%) rename {homer_map_manager/src => src}/Managers/MaskingManager.cpp (100%) rename {homer_map_manager/src => src}/Managers/PoiManager.cpp (100%) rename {homer_map_manager/src => src}/Managers/RoiManager.cpp (100%) rename {homer_map_manager/src => src}/MapIO/image_loader.cpp (100%) rename {homer_map_manager/src => src}/MapIO/map_loader.cpp (100%) rename {homer_map_manager/src => src}/MapIO/map_saver.cpp (100%) rename {homer_map_manager/src => src}/Workers/PointOfInterest/CMakeLists.txt (100%) rename {homer_map_manager/src => src}/map_manager_node.cpp (100%) diff --git a/homer_map_manager/CHANGELOG.rst b/CHANGELOG.rst similarity index 100% rename from homer_map_manager/CHANGELOG.rst rename to CHANGELOG.rst diff --git a/homer_map_manager/CMakeLists.txt b/CMakeLists.txt similarity index 100% rename from homer_map_manager/CMakeLists.txt rename to CMakeLists.txt diff --git a/README.md b/README.md index 4443d398..39a46914 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,42 @@ -# mapping - -See: - -* [mapping] -* [navigation] -* [map_manager] -* [map_msgs] -* [nav_libs] - -[mapping]: homer_mapping/README.md -[navigation]: homer_navigation/README.md -[map_manager]: map_manager/README.md -[map_msgs]: map_msgs/README.md -[nav_libs]: nav_libs/README.md - +# map_manager + +## Known Issues / Todo's + +Aus bisher ungeklärten Gründen kann es in seltenen Fällen passieren, dass der map_manager die Verbindung zum roscore verliert. In diesem Fall muss er durch rosrun map_manager map_manager neugestartet werden. + + +## Introduction + +Der map_manager ist der Mittelpunkt der Kommunikation zwischen homer_mapping, homer_navigation, GUI und die Spiel-Nodes. +Das Zusammenspiel dieser Nodes ist im Screenshot des rqt_graphs zu sehen. + + + +Er verwaltet die aktuell durch das mapping erstellte Karte sowie weitere Kartebenen. Aktuell sind das die SLAM-Karte, die aktuellen Laserdaten in einer weiteren Ebene und eine Masking-Ebene, in der mit Hilfe der GUI Hindernisse oder freie Flächen in die Karte gezeichnet werden können. +Jedes mal, wenn eine SLAM-Karte von der mapping-Node geschickt wird, wird diese mit allen anderen Karteneben überschrieben (in der Reihenfolge SLAM, Masking, Laserdaten) und als eine zusammengefügte Karte versendet. +Zudem verwaltet der map_manager alle erstellten Points Of Interest (POIs), die z.B. als Ziele für die Navigation verwendet werden. +Die Node ist außerdem zuständig für das Speichern und Laden der Kartenebenen und der POIs. Dabei wird die SLAM-Ebene sowie die Masking-Ebene berücksichtigt. + + + +## Topics + + +#### Publisher +* `/map`: Die aktuelle Karte, die aus allen aktivierten Kartenebenen zusammengesetzt ist. Diese wird in der GUI angezeigt und für die Navigation verwendet. +* `/map_manager/poi_list`: Verschickt einen Vektor mit allen aktuellen POIs. Dieser Publisher wird immer ausgelöst, sobald sich ein POI ändert oder ein neuer hinzugefügt wird. +* `/map_manager/loaded_map`: Wenn eine Karte geladen wird, wird über dieses Topic die geladene SLAM-Ebene an die homer_mapping-Node verschickt. +* `/map_manager/mask_slam`: Über die GUI kann die SLAM-Map verändert werden. Diese Modifizierungen werden über dieses Topic vom map_manager an das homer_mapping versendet. + +#### Subscriber + +* `/homer_mapping/slam_map (nav_msgs/OccupancyGrid)`: Hierüber wird die aktuelle SLAM-Map empfangen. +* `/map_manager/save_map (map_messages/SaveMap)`: Hierüber wird der Befehl zum Speichern der Karte inklusive des Dateinamens empfangen. +* `/map_manager/load_map (map_messages/SaveMap)`: Hiermit wird eine Karte geladen und alle bisherigen Kartenebenen durch die geladenen ersetzt. +* `/map_manager/toggle_map_visibility (map_messages/MapLayers)`: Hierüber können einzelne Kartenebenen aktiviert beziehungsweise deaktiviert werden. Deaktivierte werden nicht mehr beim Zusammenfügen der Karte berücksichtigt und dementsprechend auch nicht in der GUI angezeigt sowie für die Navigation verwendet. +* `/scan (nav_msgs/LaserScan)`: Der aktuelle Laserscan, der in die Laserscan-Ebene gezeichnet wird. +* `/map_manager/add_POI (map_messages/PointOfInterest)`: Hierüber kann ein POI hinzugefügt werden. +* `/map_manager/modify_POI (map_messages/ModifyPOI)`: Hierüber kann ein vorhandener POI verändert werden (Name, Position,...) +* `/map_manager/delete_POI (map_messages/DeletePointOfInterest)`: Hierüber kann ein vorhander POI gelöscht werden. +* `/map_manager/modify_map (map_messages/ModifyMap)`: Über dieses Topic werden die Koordinaten der Polygone verschickt, die über die GUI maskiert wurden. Außerdem wird die Kartenebene mitgeteilt, die verändet werden soll (SLAM oder Masking-Ebene). +* `/map_manager/reset_maps (std_msgs/Empty)`: Hierüber werden alle Kartenebenen zurückgesetzt. \ No newline at end of file diff --git a/homer_map_manager/README.md b/homer_map_manager/README.md deleted file mode 100644 index 39a46914..00000000 --- a/homer_map_manager/README.md +++ /dev/null @@ -1,42 +0,0 @@ -# map_manager - -## Known Issues / Todo's - -Aus bisher ungeklärten Gründen kann es in seltenen Fällen passieren, dass der map_manager die Verbindung zum roscore verliert. In diesem Fall muss er durch rosrun map_manager map_manager neugestartet werden. - - -## Introduction - -Der map_manager ist der Mittelpunkt der Kommunikation zwischen homer_mapping, homer_navigation, GUI und die Spiel-Nodes. -Das Zusammenspiel dieser Nodes ist im Screenshot des rqt_graphs zu sehen. - - - -Er verwaltet die aktuell durch das mapping erstellte Karte sowie weitere Kartebenen. Aktuell sind das die SLAM-Karte, die aktuellen Laserdaten in einer weiteren Ebene und eine Masking-Ebene, in der mit Hilfe der GUI Hindernisse oder freie Flächen in die Karte gezeichnet werden können. -Jedes mal, wenn eine SLAM-Karte von der mapping-Node geschickt wird, wird diese mit allen anderen Karteneben überschrieben (in der Reihenfolge SLAM, Masking, Laserdaten) und als eine zusammengefügte Karte versendet. -Zudem verwaltet der map_manager alle erstellten Points Of Interest (POIs), die z.B. als Ziele für die Navigation verwendet werden. -Die Node ist außerdem zuständig für das Speichern und Laden der Kartenebenen und der POIs. Dabei wird die SLAM-Ebene sowie die Masking-Ebene berücksichtigt. - - - -## Topics - - -#### Publisher -* `/map`: Die aktuelle Karte, die aus allen aktivierten Kartenebenen zusammengesetzt ist. Diese wird in der GUI angezeigt und für die Navigation verwendet. -* `/map_manager/poi_list`: Verschickt einen Vektor mit allen aktuellen POIs. Dieser Publisher wird immer ausgelöst, sobald sich ein POI ändert oder ein neuer hinzugefügt wird. -* `/map_manager/loaded_map`: Wenn eine Karte geladen wird, wird über dieses Topic die geladene SLAM-Ebene an die homer_mapping-Node verschickt. -* `/map_manager/mask_slam`: Über die GUI kann die SLAM-Map verändert werden. Diese Modifizierungen werden über dieses Topic vom map_manager an das homer_mapping versendet. - -#### Subscriber - -* `/homer_mapping/slam_map (nav_msgs/OccupancyGrid)`: Hierüber wird die aktuelle SLAM-Map empfangen. -* `/map_manager/save_map (map_messages/SaveMap)`: Hierüber wird der Befehl zum Speichern der Karte inklusive des Dateinamens empfangen. -* `/map_manager/load_map (map_messages/SaveMap)`: Hiermit wird eine Karte geladen und alle bisherigen Kartenebenen durch die geladenen ersetzt. -* `/map_manager/toggle_map_visibility (map_messages/MapLayers)`: Hierüber können einzelne Kartenebenen aktiviert beziehungsweise deaktiviert werden. Deaktivierte werden nicht mehr beim Zusammenfügen der Karte berücksichtigt und dementsprechend auch nicht in der GUI angezeigt sowie für die Navigation verwendet. -* `/scan (nav_msgs/LaserScan)`: Der aktuelle Laserscan, der in die Laserscan-Ebene gezeichnet wird. -* `/map_manager/add_POI (map_messages/PointOfInterest)`: Hierüber kann ein POI hinzugefügt werden. -* `/map_manager/modify_POI (map_messages/ModifyPOI)`: Hierüber kann ein vorhandener POI verändert werden (Name, Position,...) -* `/map_manager/delete_POI (map_messages/DeletePointOfInterest)`: Hierüber kann ein vorhander POI gelöscht werden. -* `/map_manager/modify_map (map_messages/ModifyMap)`: Über dieses Topic werden die Koordinaten der Polygone verschickt, die über die GUI maskiert wurden. Außerdem wird die Kartenebene mitgeteilt, die verändet werden soll (SLAM oder Masking-Ebene). -* `/map_manager/reset_maps (std_msgs/Empty)`: Hierüber werden alle Kartenebenen zurückgesetzt. \ No newline at end of file diff --git a/homer_mapnav_msgs/CHANGELOG.rst b/homer_mapnav_msgs/CHANGELOG.rst deleted file mode 100644 index 324dcbdf..00000000 --- a/homer_mapnav_msgs/CHANGELOG.rst +++ /dev/null @@ -1,9 +0,0 @@ -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Changelog for package homer_mapnav_msgs -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -0.1.1 (2016-11-03) ------------------- -* fixes -* initial commit -* Contributors: Niklas Yann Wettengel diff --git a/homer_mapnav_msgs/CMakeLists.txt b/homer_mapnav_msgs/CMakeLists.txt deleted file mode 100644 index 53485c0f..00000000 --- a/homer_mapnav_msgs/CMakeLists.txt +++ /dev/null @@ -1,33 +0,0 @@ -cmake_minimum_required(VERSION 2.8.3) - -project(homer_mapnav_msgs) - -find_package(catkin REQUIRED - COMPONENTS message_generation nav_msgs geometry_msgs) - -add_message_files(FILES - MapLayers.msg - ModifyMap.msg - PointOfInterest.msg - PointsOfInterest.msg - RegionOfInterest.msg - RegionsOfInterest.msg - ModifyPOI.msg - TargetUnreachable.msg - StartNavigation.msg - NavigateToPOI.msg - RoiChange.msg -) - -add_service_files(FILES - GetPointsOfInterest.srv - GetRegionsOfInterest.srv - GetRegionOfInterestName.srv - PointInsideRois.srv - LoadMap.srv - SaveMap.srv -) - -generate_messages(DEPENDENCIES geometry_msgs nav_msgs) - -catkin_package(CATKIN_DEPENDS message_runtime geometry_msgs nav_msgs) diff --git a/homer_mapnav_msgs/README.md b/homer_mapnav_msgs/README.md deleted file mode 100644 index 47aeac04..00000000 --- a/homer_mapnav_msgs/README.md +++ /dev/null @@ -1,244 +0,0 @@ -# map_messages - - -## Introduction - -Dieses Package enthält alle benutzerdefinierten Messages, die neben den in ROS enthaltenen Messages für das Mapping und die Navigation verwendet werden. Das Package enthält keine Node oder Librabries. - -## Messages - - -### PointOfInterest - - -Die PointOfInterest-Message enthält alle Informationen, um einen POI zu erstellen, zu verschicken und zu speichern. - -~~~~~~ {.cpp} -PointOfInterest.msg - - - -int32 DEFAULT=100 -int32 VICTIM=200 -int32 OBJECT=300 -int32 GRIPPABLE_OBJECT=400 -int32 PERSON=600 -int32 ROOMBA=700 -int32 HAZARD_MATERIAL=800 -int32 START_POSITION=900 -int32 START_ORIENTATION=1000 - -int32 type -string name -string remarks - -geometry_msgs/Pose pose -~~~~~~ - -* `type` bezeichnet den Typ des POIs. Es kann eine der in dieser Message vorhandenen Konstanten verwendet werden. -* `name` bezeichnet den Namen des POIs. Dieser Name muss einzigartig sein, da die POIs über ihren Namen unterschieden werden. -* `remarks`: Hier können Anmerkungen reingeschrieben werden. Diese werden in der GUI angezeigt. -* `pose` bezeichnet die Position und Orientierung des POIS im /map-Frame. - - -### ModifyPOI - - -ModifyPOI ist dafür zuständig, einen vorhandenen POI zu verändern. - -~~~~~~ {.cpp} -ModifyPOI.msg - -PointOfInterest poi -string old_name -~~~~~~ - -* `poi` beinhaltet den POI, durch den der alte ersetzt werden soll. -* `old_name` bezeichnet den Namen des POIs, der verändert werden soll. - - -### TargetUnreachable - - - -TargetUnreachable wird von der Navigation versendet, sobald kein Pfad mehr zu einem Ziel geplant werden kann. - - -~~~~~~ {.cpp} -TargetUnreachable.msg - -int8 UNKNOWN=0 -int8 TILT_OCCURED=10 -int8 GRAVE_TILT_OCCURED=15 -int8 STALL_OCCURED=20 -int8 LASER_OBSTACLE=30 - -int8 reason -~~~~~~ - -* `reason` kann einen von den in dieser Message definierten Konstanten annehmen und beschreibt den Grund des Fehlers. - - -### SaveMap - -SaveMap wird versendet, wenn eine Karte gespeichert oder geladen werden soll und beinhaltet den Dateipfad zum Kartenordner. - - -~~~~~~ {.cpp} -SaveMap.msg - -string filename -~~~~~~ - -* `filename` bezeichnet den Dateipfad zum Kartenordner. - - -### PointsOfInterest - - -PointsOfInterest wird verwendet, um alle aktuellen POIs zu versenden. - - -~~~~~~ {.cpp} -PointsOfInterest.msg - -PointOfInterest[] pois -~~~~~~ - -* `pois` beinhaltet einen Vektor mit allen aktuellen POIs. - - -### StartNavigation - - -StartNavigation ist eine von zwei Methoden, um eine Navigation zu starten. Hier wird Der POI mitgegeben, zu dem der Roboter navigieren soll. - - -~~~~~~ {.cpp} -StartNavigation.msg - -geometry_msgs/Pose goal -float32 distance_to_target -bool skip_final_turn -bool fast_planning -~~~~~~ - -* `goal` beinhaltet den Ziel-POI -* `distance_to_target`: Hier kann angegeben werden, ab welcher Distanz zum Ziel die Navigation als erfolgreich abgeschlossen wird. -* `skip_final_turn`: Hier kann eingestellt werden, ob der Roboter sich am Ziel-POI in Richtund der POI-Orientierung ausrichten soll oder nicht. -* `fast_planning`: Mit dieser Option kann ein experimentelles "Schnelles Planen" eingeschaltet werden. Es werden nur Pfade geplant, die sich in einer Boundingbox zwischen Roboter und Zielposition befinden. - - -### MapLayers - -MapLayers definiert die vorhanden Kartenebenen als Konstanten und kann zudem verwendet werden, um einzelne Ebenen ein- oder auszuschalten. - - -~~~~~~ {.cpp} -MapLayers.msg - -int32 SLAM_LAYER=0 -int32 MASKING_LAYER=1 -int32 KINECT_LAYER=2 -int32 SICK_LAYER=3 - -int32 layer -bool state -~~~~~~ - -* `layer` enthält die Kartenebenen-ID und kann einen Wert dern in dieser Message definierten Konstanten annehmen. -* `state` besagt, ob die ausgewählte Kartenebene aktiviert sein soll. - - - - -### NavigateToPOI - - -NavigateToPOI ist die zweite Art eine Navigation zu starten. Anstatt das gesamte POI-Objekt mitzugeben, wird nur der Name eines bereits im map_manger vorhandenen POIs mitgegeben, der daraufhin von der Navigation nachgeschlagen wird. - -~~~~~~ {.cpp} -NavigateToPOI.msg - -string poi_name -float32 distance_to_target -bool skip_final_turn -~~~~~~ - -* `poi_name` beschreibt den Namen des POIS, zu dem navigiert werden soll. -* `distance_to_target` siehe StartNavigation -* `skip_final_turn` siehe StartNavigation - - -### ModifyMap - - -Mit dieser Message können Bereiche in einzelnen Kartenebenen verändert werden. - - -~~~~~~ {.cpp} -ModifyMap.msg - -int32 FREE = 0 -int32 BLOCKED = 100 -int32 OBSTACLE = 99 -int32 NOT_MASKED = -1 - -geometry_msgs/Point[] region -int32 maskAction -int32 mapLayer -~~~~~~ - -* `region` beschreibt die Eckpunkte des Polygons, das maskiert werden soll. -* `maskAction` kann einen Wert der in dieser Message definierten Konstanten annehmen. OBSTACLE wird in der Karte rot dargestellt. Mit NOT_MASKED können bereits maskierte Bereiche wieder gelöscht werden. -* `mapLayer` enthält die ID der zu verändernden Kartenebene. Die IDs sind in der Message MapLayers definiert. - - - -### DeletePointOfInterest - -Löscht einen vorhandenen POI. - - -~~~~~~ {.cpp} -DeletePointOfInterest.msg - -string name -~~~~~~ - -* `name` beschreibt den Namen des zu löschenden POIs. - - -### DoMapping - - - -Mit dieser Message kann das Mapping ein- oder ausgeschaltet werden. - -~~~~~~ {.cpp} -DoMapping.msg - -bool state -~~~~~~ - -* `state` beinhaltet den Zustand des Mappings (true = an, false = off). - - -## Services - -### GetPointsOfInterest - - -Über diesen Service kann die aktuelle Liste der POIs angefordert werden. - - -~~~~~~ {.cpp} -GetPointsOfInterest.srv - ---- -PointsOfInterest poi_list -~~~~~~ - -* `poi_list` beinhaltet einen Vektor mit allen aktuellen POIs. - - diff --git a/homer_mapnav_msgs/msg/MapLayers.msg b/homer_mapnav_msgs/msg/MapLayers.msg deleted file mode 100644 index f39bfdce..00000000 --- a/homer_mapnav_msgs/msg/MapLayers.msg +++ /dev/null @@ -1,10 +0,0 @@ -int32 SLAM_LAYER=0 -int32 MASKING_LAYER=1 -int32 KINECT_LAYER=2 -int32 SICK_LAYER=3 -int32 HOKUYO_BACK=4 -int32 HOKUYO_FRONT=5 -int32 RAPID_MAP=6 - -int32 layer # map layer name -bool state # visibility state (on/off) diff --git a/homer_mapnav_msgs/msg/ModifyMap.msg b/homer_mapnav_msgs/msg/ModifyMap.msg deleted file mode 100644 index 0db7b6d8..00000000 --- a/homer_mapnav_msgs/msg/ModifyMap.msg +++ /dev/null @@ -1,21 +0,0 @@ -int32 HIGH_SENSITIV = -2 # Area is highly sensitiv for Obstacles -int32 NOT_MASKED = -1 # Area is not masked: use slam map -int32 FREE = 0 # Area is free -int32 OBSTACLE = 99 # Area is occupied by an obstacle (e.g. 3d scan) -int32 BLOCKED = 100 # Area blocked by user (use UNBLOCK to .. ) -int32 HOKUYO = 101 # Area is blocked by Hokuyo Obstacle -int32 KINECT = 102 # Area is blocked by Kinect Obstacle -int32 DEPTH = 102 # Area is blocked by Depth Camera Obstacle -int32 RAPID = 103 # Area is blocked by Rapid Mapping - - - -int32 SET_FREE = 0 # Mark area free, area must not be BLOCKED -int32 SET_BLOCKED = 100 # Block area -int32 SET_OBSTACLE = 99 # Mark area as occupied by an obstacle (e.g. 3d scan) -int32 SET_HIGH_SENSITIV = -2 # Mark Area as highly sensitiv for Obstacles - - -geometry_msgs/Point[] region -int32 maskAction -int32 mapLayer #currently not used. modifications only take place in the masking map layer diff --git a/homer_mapnav_msgs/msg/ModifyPOI.msg b/homer_mapnav_msgs/msg/ModifyPOI.msg deleted file mode 100644 index 59786f4b..00000000 --- a/homer_mapnav_msgs/msg/ModifyPOI.msg +++ /dev/null @@ -1,2 +0,0 @@ -PointOfInterest poi -string old_name #necessary if name of poi is changed diff --git a/homer_mapnav_msgs/msg/NavigateToPOI.msg b/homer_mapnav_msgs/msg/NavigateToPOI.msg deleted file mode 100644 index 342f1d1f..00000000 --- a/homer_mapnav_msgs/msg/NavigateToPOI.msg +++ /dev/null @@ -1,3 +0,0 @@ -string poi_name -float32 distance_to_target -bool skip_final_turn diff --git a/homer_mapnav_msgs/msg/PointOfInterest.msg b/homer_mapnav_msgs/msg/PointOfInterest.msg deleted file mode 100644 index af6654c8..00000000 --- a/homer_mapnav_msgs/msg/PointOfInterest.msg +++ /dev/null @@ -1,13 +0,0 @@ -#POI types -int32 DEFAULT=100 -int32 OBJECT=300 -int32 GRIPPABLE_OBJECT=400 -int32 PERSON=600 -int32 START_POSITION=900 -int32 START_ORIENTATION=1000 - -int32 type -string name -string remarks - -geometry_msgs/Pose pose diff --git a/homer_mapnav_msgs/msg/PointsOfInterest.msg b/homer_mapnav_msgs/msg/PointsOfInterest.msg deleted file mode 100644 index a2cfa937..00000000 --- a/homer_mapnav_msgs/msg/PointsOfInterest.msg +++ /dev/null @@ -1 +0,0 @@ -PointOfInterest[] pois diff --git a/homer_mapnav_msgs/msg/RegionOfInterest.msg b/homer_mapnav_msgs/msg/RegionOfInterest.msg deleted file mode 100644 index 6b4d3058..00000000 --- a/homer_mapnav_msgs/msg/RegionOfInterest.msg +++ /dev/null @@ -1,12 +0,0 @@ -#ROI types -int32 DEFAULT=100 -int32 ROOM=200 -int32 AREA=300 -int32 FORBIDDEN_AREA=400 - -int32 type -string name -string remarks - -int32 id -geometry_msgs/Point[4] points diff --git a/homer_mapnav_msgs/msg/RegionsOfInterest.msg b/homer_mapnav_msgs/msg/RegionsOfInterest.msg deleted file mode 100644 index 73c0b1b0..00000000 --- a/homer_mapnav_msgs/msg/RegionsOfInterest.msg +++ /dev/null @@ -1 +0,0 @@ -RegionOfInterest[] rois diff --git a/homer_mapnav_msgs/msg/RoiChange.msg b/homer_mapnav_msgs/msg/RoiChange.msg deleted file mode 100644 index 7074ae58..00000000 --- a/homer_mapnav_msgs/msg/RoiChange.msg +++ /dev/null @@ -1,3 +0,0 @@ -int32 id -string name -bool action # true-> enter, false-> left diff --git a/homer_mapnav_msgs/msg/StartNavigation.msg b/homer_mapnav_msgs/msg/StartNavigation.msg deleted file mode 100644 index cff7a639..00000000 --- a/homer_mapnav_msgs/msg/StartNavigation.msg +++ /dev/null @@ -1,4 +0,0 @@ -geometry_msgs/Pose goal -float32 distance_to_target #default should bei 0.01 [m] -bool skip_final_turn -bool fast_planning #path planning within bounding box containing robot pose and target diff --git a/homer_mapnav_msgs/msg/TargetUnreachable.msg b/homer_mapnav_msgs/msg/TargetUnreachable.msg deleted file mode 100644 index f69ddf67..00000000 --- a/homer_mapnav_msgs/msg/TargetUnreachable.msg +++ /dev/null @@ -1,9 +0,0 @@ -int8 UNKNOWN=0 -int8 TILT_OCCURED=10 -int8 GRAVE_TILT_OCCURED=15 -int8 STALL_OCCURED=20 -int8 LASER_OBSTACLE=30 -int8 LASER_TIMEOUT=35 -int8 NO_PATH_FOUND=40 - -int8 reason diff --git a/homer_mapnav_msgs/package.xml b/homer_mapnav_msgs/package.xml deleted file mode 100644 index f1c2ef8a..00000000 --- a/homer_mapnav_msgs/package.xml +++ /dev/null @@ -1,22 +0,0 @@ -<package> - <name>homer_mapnav_msgs</name> - <version>0.1.1</version> - <description> homer_mapnav_msgs contains the messages used for mapping and navigation - </description> - <maintainer email="vseib@uni-koblenz.de">Viktor Seib</maintainer> - <author email="mknauf@uni-koblenz.de">Malte Knauf</author> - <license>GPLv3</license> - - <buildtool_depend>catkin</buildtool_depend> - - <build_depend>message_generation</build_depend> - <build_depend>genmsg</build_depend> - <build_depend>geometry_msgs</build_depend> - <build_depend>nav_msgs</build_depend> - - <run_depend>geometry_msgs</run_depend> - <run_depend>nav_msgs</run_depend> - <run_depend>message_runtime</run_depend> -</package> - - diff --git a/homer_mapnav_msgs/readme.pdf b/homer_mapnav_msgs/readme.pdf deleted file mode 100644 index bb76e2631376e2bda2c6ca741778247f62e4e6a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 121801 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	><O=7oE{q^9$j}03u(<B$N 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 Cn|n+E diff --git a/homer_mapnav_msgs/srv/GetPointsOfInterest.srv b/homer_mapnav_msgs/srv/GetPointsOfInterest.srv deleted file mode 100644 index e7a3c1a7..00000000 --- a/homer_mapnav_msgs/srv/GetPointsOfInterest.srv +++ /dev/null @@ -1,2 +0,0 @@ ---- -PointsOfInterest poi_list diff --git a/homer_mapnav_msgs/srv/GetRegionOfInterestName.srv b/homer_mapnav_msgs/srv/GetRegionOfInterestName.srv deleted file mode 100644 index 9bf4c9a5..00000000 --- a/homer_mapnav_msgs/srv/GetRegionOfInterestName.srv +++ /dev/null @@ -1,3 +0,0 @@ -int32 roi_id ---- -string name diff --git a/homer_mapnav_msgs/srv/GetRegionsOfInterest.srv b/homer_mapnav_msgs/srv/GetRegionsOfInterest.srv deleted file mode 100644 index f98be082..00000000 --- a/homer_mapnav_msgs/srv/GetRegionsOfInterest.srv +++ /dev/null @@ -1,2 +0,0 @@ ---- -RegionsOfInterest roi_list diff --git a/homer_mapnav_msgs/srv/LoadMap.srv b/homer_mapnav_msgs/srv/LoadMap.srv deleted file mode 100644 index ef2e165e..00000000 --- a/homer_mapnav_msgs/srv/LoadMap.srv +++ /dev/null @@ -1,2 +0,0 @@ -std_msgs/String filename ---- diff --git a/homer_mapnav_msgs/srv/PointInsideRois.srv b/homer_mapnav_msgs/srv/PointInsideRois.srv deleted file mode 100644 index 2b371741..00000000 --- a/homer_mapnav_msgs/srv/PointInsideRois.srv +++ /dev/null @@ -1,3 +0,0 @@ -geometry_msgs/PointStamped point ---- -homer_mapnav_msgs/RegionOfInterest[] rois diff --git a/homer_mapnav_msgs/srv/SaveMap.srv b/homer_mapnav_msgs/srv/SaveMap.srv deleted file mode 100644 index 67831529..00000000 --- a/homer_mapnav_msgs/srv/SaveMap.srv +++ /dev/null @@ -1,2 +0,0 @@ -std_msgs/String folder ---- diff --git a/homer_mapping/CHANGELOG.rst b/homer_mapping/CHANGELOG.rst deleted file mode 100644 index 4b7831ec..00000000 --- a/homer_mapping/CHANGELOG.rst +++ /dev/null @@ -1,9 +0,0 @@ -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Changelog for package homer_mapping -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -0.1.1 (2016-11-03) ------------------- -* fixes -* initial commit -* Contributors: Niklas Yann Wettengel diff --git a/homer_mapping/CMakeLists.txt b/homer_mapping/CMakeLists.txt deleted file mode 100644 index fee377db..00000000 --- a/homer_mapping/CMakeLists.txt +++ /dev/null @@ -1,91 +0,0 @@ -cmake_minimum_required(VERSION 2.8.3) -project(homer_mapping) - -find_package( - catkin REQUIRED COMPONENTS - roscpp - homer_mapnav_msgs - sensor_msgs - nav_msgs - homer_nav_libs - tf - roslib -) -find_package(OpenMP) -if (OPENMP_FOUND) - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") -endif() -find_package(tf REQUIRED) - -set(CMAKE_BUILD_TYPE Release) - - -include_directories( - include - ${catkin_INCLUDE_DIRS} -) - -catkin_package( - INCLUDE_DIRS include - CATKIN_DEPENDS - roscpp - homer_mapnav_msgs - homer_nav_libs - nav_msgs - tf - roslib - LIBRARIES homerOccupancyMap homerParticleFilter -) - -add_library(homerOccupancyMap - src/OccupancyMap/OccupancyMap.cpp - -) - -target_link_libraries( - homerOccupancyMap - ${catkin_LIBRARIES} - ${tf_LIBRARIES} -) -set( - ParticleFilter_SRC - src/ParticleFilter/HyperSlamFilter.cpp - src/ParticleFilter/SlamParticle.cpp - src/ParticleFilter/SlamFilter.cpp - src/ParticleFilter/Particle.cpp -) - -add_library( - homerParticleFilter - ${ParticleFilter_SRC} -) - -target_link_libraries( - homerParticleFilter - ${catkin_LIBRARIES} -) - -add_executable(homer_mapping src/slam_node.cpp) - -target_link_libraries( - homer_mapping - ${catkin_LIBRARIES} - homerParticleFilter - homerOccupancyMap -) - -add_dependencies( - homer_mapping - ${catkin_EXPORTED_TARGETS} -) - -install(DIRECTORY include/${PROJECT_NAME}/ - DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} -) - -install(TARGETS homerOccupancyMap homerParticleFilter homer_mapping - ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} - LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} - RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} -) diff --git a/homer_mapping/README.md b/homer_mapping/README.md deleted file mode 100644 index e2781906..00000000 --- a/homer_mapping/README.md +++ /dev/null @@ -1,67 +0,0 @@ -# homer_mapping - -## Introduction - -Das Package homer_mapping besteht aus einer gleichnamigen Node. Diese ist für die Lokalisierung und Kartierung des Roboters mit Hilfe der Odometrie des Roboters und eines Laserscanners zuständig. -Das SLAM-Problem wird durch den Partikelfilter-Algorithmus gelöst. -Die Node erwartet kontiniuierlich Odometrie-Werte und Laserdaten und verschickt in konstanten Abständen korrigierte Poseschätzungen über das Topic /pose und tf-Transformation /map -> /base_link. -Zudem kann der Roboter sich auf einer vorher geladenen Karte lokalisieren, sowie eine aktuell erstellte Karte abgespeichert werden. -Es besteht die Option, die Kartierung ein- oder auszuschalten. Beim Laden einer Karte wird die Kartierung automatisch ausgeschaltet. - -## Topics - - - - - - -#### Publisher -* `/pose (geometry_msgs/PoseStamped)`: Die aktuell ermittelte Pose relativ zu Karte (im Frame /map) des Roboters aus dem Partikelfilter. -* `/homer_mapping/slam_map (nav_msgs/OccupancyGrid)`: Das aktuelle Karte des Roboters. - - - -#### Subscriber - -* `/odom (nav_msgs/Odometry)`: Die aktuellen Odometrie-Werte vom Roboter. Diese werden für die Partikelfilter benötigt. - `/scan (sensor_msgs/LaserScan)`: Die aktuelle Lasermessung, die vom Partikelfilter benötigt wird. -* `/homer_mapping/userdef_pose (geometry_msgs/Pose)`: Mit diesem Topic kann die die aktuell vom Partikelfilter berechnete Pose auf eine benutzerdefinierte gesetzt werden. Der Partikelfilter arbeitet nun mit dieser weiter. -* `/homer_mapping/do_mapping (map_messages/DoMapping)`: Mit diesem Topic kann die Kartierung ein- oder ausgeschaltet werden. -* `/map_manager/reset_maps (std_msgs/Empty)`: Hiermit kann die aktuelle Karte zurückgesetzt werden. -* `/map_manager/loaded_map (nav_msgs/OccupancyGrid)`: Mit diesem Topic kann die aktuelle Karte durch eine andere (geladene) Karte ausgetauscht werden. -* `/map_manager/mask_slam (nav_msgs/OccupancyGrid)`: Im OccupancyGrid dieses Topics stehen Informationen, welche Teile der aktuellen Karte durch andere Werte (frei oder belegt) ersetzt werden sollen. - -## Launch Files - -* `homer_mapping.launch`: Dieses Launchfile lädt die Parameterdatei `homer_mapping.yaml` und startet die Node homer_mapping sowie die Node map_manager im gleichnamigen Package. -* `homer_mapping_rviz.launch`:`Dieses Launchfile hat die gleiche Funktionalität wie das obige, wobei es zusätzlich rviz startet. - -## Parameter - - -### homer_mapping.yaml - - - -* `/homer_mapping/size:` Size beschreibt die Größe einer Seite der Karte in Metern. Die Karte ist quadratisch -* `/homer_mapping/resolution:` Resolution ist die Länge einer (quadratischen) Zelle der Karte in Metern -* `/homer_mapping/backside_checking:` Wenn auf "true" gesetzt, wird verhindet, dass Vorder- und Rückseite einer dickeren Wand auf die gematcht werden. -* `/homer_mapping/obstacle_borders:` Wenn auf "true" gesetzt, wird um eingetragene Hindernisse ein kleiner Rand unbekanntes Gebiet gelassen. -* `/homer_mapping/measure_sampling_step:` Minimale Distanz in Metern, die zwischen zwei aufeinanderfolgenden Messpunkten im Laserscan vorhanden sein muss, um sie für die Poseberechnung zu verwenden -* `/homer_mapping/laser_scanner/free_reading_distance:` Minimale Distanz in Metern, die als hindernissfrei angenommen wird, wenn der aktuelle Messpunkt fehlerhaft ist -* `/particlefilter/error_values/rotation_error_rotating:` Rotationsfehler in Prozent, der beim Rotieren des Roboters auftritt -* `/particlefilter/error_values/rotation_error_translating:` Rotationsfehler in Grad, der beim Fahren von einem Meter auftritt -* `/particlefilter/error_values/translation_error_translating:` Translationsfehler in Prozent, der beim Geradeausfahren auftritt -* `/particlefilter/error_values/translation_error_rotating:` Translationsfehler in Metern, der beim Rotieren von einem Grad auftritt -* `/particlefilter/error_values/move_jitter_while_turning:` Streuung der neu berechneten Pose in Meter pro Grad Drehung -* `/particlefilter/hyper_slamfilter/particlefilter_num:` Anzahl der Partikelfilter im Hyperpartikelfilter (ist standardmäßig auf 1 gesetzt) -* `/particlefilter/particle_num:` Anzahl der Partikel in jedem Partikelfilter -* `/particlefilter/max_rotation_per_second:` Maximale Rotation in Radiant pro Sekunde, die der Roboter sich drehen darf, ohne dass das Mapping ausgesetzt wird -* `/particlefilter/wait_time:` Minimale Zeit, die zwischen zwei Mapping-Schritten verstrichen sein muss -* `/particlefilter/update_min_move_angle:` Minimale Rotation in Grad, die durchgeführt werden muss, damit ein Partikelfilterschritt ausgeführt wird... -* `/particlefilter/update_min_move_dist:` ...oder minimale Distanz in Metern, die der Roboter geradeaus fährt... -* `/particlefilter/max_update_interval:` ...oder minimale Wartezeit, in der der Roboter still steht. -* `/selflocalization/scatter_var_xy:` Streuung der Partikel in x/y-Richtung in Metern beim Setzen einer benutzerdefinierten Pose -* `/selflocalization/scatter_var_theta:` Streuung der Ausrichtung der Partikel in Radiant beim Setzen einer benutzerdefinierten Pose - - diff --git a/homer_mapping/config/homer_mapping.yaml b/homer_mapping/config/homer_mapping.yaml deleted file mode 100644 index a7e2bf69..00000000 --- a/homer_mapping/config/homer_mapping.yaml +++ /dev/null @@ -1,34 +0,0 @@ -/homer_mapping/size: 40 # size of one edge of the map in m. map is quadratic -/homer_mapping/resolution: 0.05 # m meter per cell -/homer_mapping/max_laser: 20.0 # m max range for including range into map - -#map config values -/homer_mapping/backside_checking: false # Enable checking to avoid matching front- and backside of obstacles, e.g. walls. Useful when creating high resolution maps -/homer_mapping/obstacle_borders: true # Leaves a small border around obstacles unchanged when inserting a laser scan. Improves stability of generated map -/homer_mapping/measure_sampling_step: 0.1 # m Minimum distance in m between two samples for probability calculation - -/homer_mapping/laser_scanner/free_reading_distance: 0.8 # Minimum distance in m to be classified as free in case of errorneous measurement - -/particlefilter/error_values/rotation_error_rotating: 10.0 # percent -/particlefilter/error_values/rotation_error_translating: 2.0 # degrees per meter -/particlefilter/error_values/translation_error_translating: 10.0 # percent -/particlefilter/error_values/translation_error_rotating: 0.05 # m per degree -/particlefilter/error_values/move_jitter_while_turning: 0.1 # m per degree - -/particlefilter/hyper_slamfilter/particlefilter_num: 1 - -/particlefilter/particle_num: 1000 -/particlefilter/max_rotation_per_second: 0.4 # maximal rotation in radiants if mapping is performed. if rotation is bigger, mapping is interrupted -/particlefilter/wait_time: 0.05 # minimum time to wait between two slam steps in seconds - -#the map is only updated when the robot has turned a minimal angle, has moved a minimal distance or a maximal time has passed -/particlefilter/update_min_move_angle: 2 # degrees -/particlefilter/update_min_move_dist: 0.05 # m -/particlefilter/max_update_interval: 0.5 # sec - -/selflocalization/scatter_var_xy: 0.1 # m -/selflocalization/scatter_var_theta: 0.2 # radiants - - -/map_manager/roi_updates: true # toggles if a entering or exiting of a roi is beeing published -map_manager/roi_polling_time: 0.5 # sec timeinterval after which the roi status is checked diff --git a/homer_mapping/include/homer_mapping/OccupancyMap/OccupancyMap.h b/homer_mapping/include/homer_mapping/OccupancyMap/OccupancyMap.h deleted file mode 100644 index 0235e860..00000000 --- a/homer_mapping/include/homer_mapping/OccupancyMap/OccupancyMap.h +++ /dev/null @@ -1,385 +0,0 @@ -#ifndef OCCUPANCYMAP_H -#define OCCUPANCYMAP_H - -#include <vector> -#include <list> -#include <string> -#include <iostream> - -#include <Eigen/Geometry> - -#include <homer_nav_libs/Math/Pose.h> -#include <homer_nav_libs/Math/Point2D.h> -#include <homer_nav_libs/Math/Box2D.h> - -#include <nav_msgs/OccupancyGrid.h> -#include <tf/transform_listener.h> - -#include <sensor_msgs/LaserScan.h> - -class QImage; - -using namespace std; - -/** - * Structure to store the start and end point of each laser range in the current scan - * @param sensorPos position of the laser in the current scan (in base_link frame) - * @param endPos position of the end point of the laser frame in the current scan (in base_link frame) - * @param free indicates if the laser range hit an obstacle (false) or not (true) - */ -struct RangeMeasurement -{ - geometry_msgs::Point sensorPos; - geometry_msgs::Point endPos; - bool free; -}; - -/** - * Used in struct MeasurePoint to specify if a measurement point is at the border of a scan segment - */ -enum BorderType -{ - NoBorder, - LeftBorder, - RightBorder -}; - -/** - * Structure to store a measurement point for computeLaserScanProbability() - * @param hitPos Position of measured obstacle (robot coordinates) - * @param frontPos Position to check for NOT_KNOWN terrain - * This is needed to assure that front- and backside of obstacles can be distinguished - * @param border specifies if the measurement point is at the border of a scan segment - */ -struct MeasurePoint -{ - Point2D hitPos; - Point2D frontPos; - BorderType borderType; -}; - -/** - * @class OccupancyMap - * - * @author Malte Knauf, Stephan Wirth, Susanne Maur (RX), David Gossow (RX), Susanne Thierfelder (R16) - * - * @brief This class holds and manages an occupancy map. - * - * An occupancy map is a map where free space and occupied space are marked. This map stores values - * for free and occupied space in an (2D-)unsigned char array. This array can be seen as a graylevel image. - * The darker a cell, the higher the probability that this cell is occupied by an obstacle. - * The size of the map and the size of one cell can be defined in the setup file with the values - * MAP_SIZE and MAP_CELL_SIZE. The origin of the coordinate system of the map is the center of the array. - * The x-axis is heading front, the y-axis points to the left (like the robot's coordinate system). - * The mapping data has to be inserted via the method insertLaserData(). - */ -class OccupancyMap { - - public: - static const int8_t INACCESSIBLE = 100; - static const int8_t OBSTACLE = 99; - static const int8_t OCCUPIED = 98; - static const int8_t UNKNOWN = 50; - static const int8_t NOT_SEEN_YET = -1; - static const int8_t FREE = 0; - - /** - * The default constructor calls initMembers(). - */ - OccupancyMap(); - - /** - * Constructor for a loaded map. - */ - OccupancyMap(float*& occupancyProbability, geometry_msgs::Pose origin, float resolution, int pixelSize, Box2D<int> exploredRegion); - - /** - * Copy constructor, copies all members inclusive the arrays that lie behind the pointers. - * @param occupancyMap Source for copying - */ - OccupancyMap(const OccupancyMap& occupancyMap); - - /** - * Method to init all members with default values from the configuration file. All arrays are initialized. - */ - void initMembers(); - - /** - * Assignment operator, copies all members (deep copy!) - * @param source Source to copy from - * @return Reference to copied OccupancyMap - */ - OccupancyMap& operator=(const OccupancyMap& source); - - /** - * Deletes all dynamically allocated memory. - */ - ~OccupancyMap(); - - /* - /** - * @return The resolution of the map in m. - */ -// int resolution() const; - - geometry_msgs::Pose origin() const; - - /** - * @return Width of the map. - */ - int width() const; - - /** - * @return Height of the map. - */ - int height() const; - - /** - * This method is used to reset all HighSensitive areas - */ - void resetHighSensitive(); - - /** - * @return Probability of pixel p being occupied. - */ - float getOccupancyProbability(Eigen::Vector2i p); - - /** - * @brief This function inserts the data of a laserscan into the map. - * - * With the given data, start and end cells of a laser beam are computed and given to the - * method markLineFree(). - * If the measurement is smaller than VALID_MAX_RANGE, markOccupied() is called for the endpoint. - * @param laserData The laser data msg. - */ - void insertLaserData( sensor_msgs::LaserScan::ConstPtr laserData, tf::Transform transform); - - void insertRanges( vector<RangeMeasurement> ranges , ros::Time stamp = ros::Time::now() ); - - /** - * @brief gives a list specially processed coordinates to be used for computeLaserScanProbability - */ - std::vector<MeasurePoint> getMeasurePoints( sensor_msgs::LaserScanConstPtr laserData ); - - /** - * This method computes a score that describes how good the given hypothesis matches with the map - * @param robotPose The pose of the robot - * @return The "fitting factor". The higher the factor, the better the fitting. - * This factor is NOT normalized, it is a positive float between 0 and FLOAT_MAX - */ - float computeScore( Pose robotPose, std::vector<MeasurePoint> measurePoints ); - - /** - * @return QImage of size m_PixelSize, m_PixelSize with values of m_OccupancyProbability scaled to 0-254 - */ - QImage getProbabilityQImage(int trancparencyThreshold, bool showInaccessible) const; - - //puma2::ColorImageRGB8* getUpdateImage( bool withMap=true ); TODO - - /** - * Returns an "image" of the obstacles e.g. seen in the 3D scans - * @returns image with dark red dots in areas where the obstacles were seen - */ - //puma2::ColorImageRGB8* getObstacleImage ( ); TODO - - /** - * Returns an "image" of occupancy probability image. - * @param[out] data vector containing occupancy probabilities. 0 = free, 100 = occupied, -1 = NOT_KNOWN - * @param[out] width Width of data array - * @param[out] height Height of data array - * @param[out] resolution Resolution of the map (m_Resolution) - */ - void getOccupancyProbabilityImage(vector<int8_t> &data, int& width, int& height, float &resolution); - - /** - * This method marks free the position of the robot (according to its dimensions). - */ - void markRobotPositionFree(); - - /** - * @brief Computes the contrast of a single pixel. - * @param prob probability value (100=occupied, 50=NOT_KNOWN, 0=free) of a pixel. - * @return Contrast value from 0 (no contrast) to 1 (max. contrast) of this pixel - */ - double contrastFromProbability (int8_t prob); - - /** - * @brief This method computes the sharpness of the occupancy grid - * @return Contrast value from 0 (no contrast) to 1 (max. contrast) of the map - */ - double evaluateByContrast(); - - /// GETTERS - - Box2D<int> getExploredRegion() { return m_ExploredRegion; } - Box2D<int> getChangedRegion() { return m_ChangedRegion; } - - /** - * Sets cells of this map to free or occupied according to maskMap - */ - void applyMasking(const nav_msgs::OccupancyGrid::ConstPtr &msg); - - - protected: - - /** - * This method increments m_MeasurementCount for pixel p. - * @param p Pixel that has been measured. - */ - void incrementMeasurementCount(Eigen::Vector2i p); - - /** - * This method increments the occupancy count int m_OccupancyCount for pixel p. - * @param p Occupied pixel. - */ - void incrementOccupancyCount(Eigen::Vector2i p); - - /** - * This method increments m_MeasurementCount and if neccessary m_OccupancyCount for all pixels. - */ - void applyChanges(); - - void clearChanges(); - - /** - * This method scales the counts of all pixels down to the given value. - * @param maxCount Maximum value to which all counts are set. - */ - void scaleDownCounts(int maxCount); - - /** - * This function paints a line from a start pixel to an end pixel. - * The computation is made with the Bresenham algorithm. - * @param data array on which the line shall be painted - * @param startPixel starting coordinates of the beam - * @param endPixel ending coordinates of the beam - * @param value The value with which the lines are marked. - */ - template<class DataT> - void drawLine(DataT* data, Eigen::Vector2i& startPixel, Eigen::Vector2i& endPixel, char value); - - /** - * This method computes the values for m_OccupancyProbabilities from m_MeasurementCount and m_OccupancyCount. - */ - void computeOccupancyProbabilities(); - - /** - * This method sets all values of m_CurrentChanges to NO_CHANGE. - */ - void clearCurrentChanges(); - - /** - * This method resets all values of m_MinChangeX, m_MaxChangeX, m_MinChangeY and m_MaxChangeY. - * This means that no current changes are assumed. - */ - void resetChangedRegion(); - - /** - * This method updates the values of m_MinChangeX, m_MaxChangeX, m_MinChangeY and m_MaxChangeY to current changes. - * The area around the current robot pose will be included to the changed region. - * @param robotPose The current pose of the robot. - */ - void updateChangedRegion(Pose robotPose); - - /** - * This method sets all values of m_MinChangeX, m_MaxChangeX, m_MinChangeY and m_MaxChangeY - * to initial values so that the complete map will be processed. - */ - void maximizeChangedRegion(); - - /** - * This method resets all values of m_ExploredX, m_MaxExploredX, m_MinExploredY and m_MaxExploredY. - */ - void resetExploredRegion(); - - /** - * Deletes all allocated members. - */ - void cleanUp(); - - /** - * Stores the size of one map pixel in m. - */ - float m_Resolution; - - /** - * Stores the origin of the map - */ - geometry_msgs::Pose m_Origin; - /** - * Stores the width of the map in cell numbers. - */ - int m_PixelSize; - - /** - * Stores the size of the map arrays, i.e. m_PixelSize * m_PixelSize - * for faster computation. - */ - unsigned m_ByteSize; - - /** - * Array to store occupancy probability values. - * Values between 0 and 1. - */ - float* m_OccupancyProbability; - - // Counts how often a pixel is hit by a measurement. - unsigned short* m_MeasurementCount; - - // Counts how often a pixel is hit by a measurement that says the pixel is occupied. - unsigned short* m_OccupancyCount; - - // Counts how often a cell is marked as inaccessible via markInaccessible() - unsigned char* m_InaccessibleCount; - - // Used for setting flags for cells, that have been modified during the current update. - unsigned char* m_CurrentChanges; - - // Used for high Sensitive areas - unsigned short* m_HighSensitive; - - /** - * Store values from config files. - */ - // maximum valid range of one laser measurement - float m_LaserMaxRange; - //minimum valid range of one laser measurement - float m_LaserMinRange; - //minimum range classified as free in case of errorneous laser measurement - float m_FreeReadingDistance; - //enables checking to avoid matching front- and backside of an obstacle, e.g. wall - bool m_BacksideChecking; - //leaves a small border around obstacles unchanged when inserting a laser scan - bool m_ObstacleBorders; - //minimum distance in m between two samples for probability calculation - float m_MeasureSamplingStep; - - //bool to reset high_sensitive Areas on the next iteration - bool m_reset_high; - - //position of the laser scaner in base_link frame - geometry_msgs::Point m_LaserPos; - - /** - * Defines a bounding box around the changes in the current map. - */ - Box2D<int> m_ChangedRegion; - - /** - * Defines a bounding box around the area in the map, which is already explored. - */ - Box2D<int> m_ExploredRegion; - - /** - * ros transform listener - */ - tf::TransformListener m_tfListener; - - /** - * ros transformation laser to base_link - */ - tf::StampedTransform m_laserTransform; - tf::Transform m_latestMapTransform; - -}; -#endif diff --git a/homer_mapping/include/homer_mapping/ParticleFilter/HyperSlamFilter.h b/homer_mapping/include/homer_mapping/ParticleFilter/HyperSlamFilter.h deleted file mode 100755 index c85da226..00000000 --- a/homer_mapping/include/homer_mapping/ParticleFilter/HyperSlamFilter.h +++ /dev/null @@ -1,163 +0,0 @@ -#ifndef HYPERSLAMFILTER_H -#define HYPERSLAMFILTER_H - -#include <vector> -#include <homer_mapping/ParticleFilter/ParticleFilter.h> -#include <homer_mapping/ParticleFilter/SlamParticle.h> -#include <homer_mapping/ParticleFilter/SlamFilter.h> -#include <homer_nav_libs/Math/Pose.h> -#include <homer_mapping/OccupancyMap/OccupancyMap.h> - -#include <sensor_msgs/LaserScan.h> - -class OccupancyMap; - -/** - * @class HyperSlamFilter - * - * @author Malte Knauf, Stephan Wirth, Susanne Maur - * - * @brief This class is used to determine the robot's most likely pose with given map and given laser data. - * - * A particle filter is a descrete method to describe and compute with a probability distribution. - * This particle filter uses an occupancy map to determine the probability of robot states. - * The robot states are stored in a particle together with their weight @see SlamParticle. - * - * @see SlamParticle - * @see ParticleFilter - * @see OccupancyMap - */ -class HyperSlamFilter { - - public: - - /** - * This constructor initializes the random number generator and sets the member variables to the given values. - * @param particleNum Number of particleFilters to use. - */ - HyperSlamFilter(int particleFilterNum, int particleNum); - - /** - * The destructor releases the OccupancyMap and the particles. - */ - ~HyperSlamFilter(); - - /** - * This method runs the filter routine. - * The given odometry measurement is used as movement hypothesis, the laserData-vector is used - * as measurement and is used to weight the particles. - * @param currentPoseOdometry Odometry data of time t. - * @param laserData msg containing the laser measurement. - * @param measurementTime Time stamp of the measurement. - * @param filterDurationTime Returns the time in ms that the filtering needed - */ - void filter(Pose currentPoseOdometry, sensor_msgs::LaserScanConstPtr laserData, ros::Time measurementTime, - ros::Duration &filterDuration); - - /** - * Computes and sets the new value for m_Alpha1. - * @param percent Rotation error while rotating (see class constructor for details) - */ - void setRotationErrorRotating(float percent); - - /** - * Computes and sets the new value for m_Alpha2. - * @param degreesPerMeter Rotation error while translating (see class constructor for details) - */ - void setRotationErrorTranslating(float degreesPerMeter); - - /** - * Computes and sets the new value for m_Alpha3. - * @param percent Translation error while translating (see class constructor for details) - */ - void setTranslationErrorTranslating(float percent); - - /** - * Computes and sets the new value for m_Alpha4. - * @param mPerDegree Translation error while rotating (see class constructor for details) - */ - void setTranslationErrorRotating(float mPerDegree); - - /** - * Computes and sets the new value for m_Alpha5. - * @param mPerDegree Move jitter while turning (see class constructor for details) - */ - void setMoveJitterWhileTurning(float mPerDegree); - - /** - * Sets a new minimal size of a cluster of scan points which is considered in scan matching. - * @param clusterSize Minimal size of a cluster in mm of scan points which is considered in scan matching. - */ - void setScanMatchingClusterSize(float clusterSize); - - /** - * Sets whether the map is updated or just used for self-localization. - * @param doMapping True if robot shall do mapping, false otherwise. - */ - void setMapping(bool doMapping); - - /** - * Deletes the current occupancy map and copies a new one into the system. - * @param occupancyMap The occupancy map to load into the system (copies are being made) - */ - void setOccupancyMap(OccupancyMap* occupancyMap); - - /** - * Sets the robot pose in the current occupancy map. - * @param Robot pose. - * @param scatterVariance if not equal to 0 the poses are equally scattered around the pose - */ - void setRobotPose(Pose pose, double scatterVarXY=0.0, double scatterVarTheta=0.0); - - /** - *Returns the best SlamFilter - */ - SlamFilter* getBestSlamFilter(); - - void resetHigh(); - - /** - * Factor (default 0.98) of the contrast of the best particle. - * If the contrast of the worst particle is below this threshold - * it will be replaced by the best particle - * @param deletionThreshold see above - */ - void setDeletionThreshold(double deletionThreshold); - - /** - * applies masking to map of slam filter set in GUI - * @param msg masking message received from GUI - */ - void applyMasking(const nav_msgs::OccupancyGrid::ConstPtr &msg) - { - for(unsigned i = 0; i < m_ParticleFilterNum; ++i) - { - m_SlamFilters[i]->applyMasking(msg); - } - } - - private: - - /** Used SlamFilters */ - std::vector <SlamFilter*> m_SlamFilters; - - /** Number of SlamFilters */ - unsigned m_ParticleFilterNum; - - /** Number of Particles of SlamFilter */ - unsigned m_ParticleNum; - - /** */ - double m_DeletionThreshold; - - /** Best SLAM Filter */ - SlamFilter* m_BestSlamFilter; - - /** Worst SlamFilter */ - SlamFilter* m_WorstSlamFilter; - - bool m_DoMapping; - -}; -#endif - diff --git a/homer_mapping/include/homer_mapping/ParticleFilter/Particle.h b/homer_mapping/include/homer_mapping/ParticleFilter/Particle.h deleted file mode 100644 index bd96aa85..00000000 --- a/homer_mapping/include/homer_mapping/ParticleFilter/Particle.h +++ /dev/null @@ -1,64 +0,0 @@ -#ifndef PARTICLE_H -#define PARTICLE_H - -#include <iostream> -#include <fstream> - -/** - * @class Particle - * - * @author Malte Knauf, Stephan Wirth - * - * @brief This class is an implementation of a "particle". - * - * A particle as it is used in particle filters is a set of one state and one importance factor (=weight). - * A set of Particles is a discrete representation of a probability distribution. - * - * @see ParticleFilter - */ -class Particle { - - public: - /** - * This constructor assigns the given weight to the member m_Weight. - * @param weight The weight of the particle. - */ - Particle(float weight = 0.0, int id = 0); - - /** - * The destructor does nothing so far. - */ - virtual ~Particle(); - - /** - * This method returns the importance factor of the particle. - * @return The importance factor (=weight) of the particle. - */ - inline float getWeight() const { return m_Weight; } - - /** - * Method to set the weight of the particle. - * @param newWeight New weight for the particle. - */ - inline void setWeight(float newWeight) { m_Weight=newWeight; } - - /** - * @return id of the particle that is stored in m_Id - */ - inline int getId() { return m_Id; } - - private: - /** - * Stores the importance factor (=weight) of the particle. This should be a value between 0 and 1. - */ - float m_Weight; - - /** - * Stores the id of the particle (for testing purpose) - */ - int m_Id; - -}; - -#endif - diff --git a/homer_mapping/include/homer_mapping/ParticleFilter/ParticleFilter.h b/homer_mapping/include/homer_mapping/ParticleFilter/ParticleFilter.h deleted file mode 100644 index 651f7587..00000000 --- a/homer_mapping/include/homer_mapping/ParticleFilter/ParticleFilter.h +++ /dev/null @@ -1,320 +0,0 @@ -#ifndef PARTICLEFILTER_H -#define PARTICLEFILTER_H - -#include <iostream> -#include <cmath> -#include <limits.h> -#include <omp.h> - -#include <ros/ros.h> - -class Particle; - -const float MIN_EFFECTIVE_PARTICLE_WEIGHT = 0.2; - -/** - * @class ParticleFilter - * - * @author Malte Knauf, Stephan Wirth - * - * @brief This class is a template class for a particle filter. - * - * A particle filter is a descrete method to describe and compute with a probability distribution. - * This template class implements the basic methods for a particle filter: sort() and resample(). - * Use this class do derivate your custom particle filter from it. Use a self-defined subclass of - * Particle as ParticleType. - * - * @see Particle - */ -template <class ParticleType> -class ParticleFilter { - - public: - /** - * The constructor initializes the random number generator and allocates the memory for the particle lists. - * The lists will have particleNum elements. - * @param particleNum Number of particles for the filter. - */ - ParticleFilter<ParticleType>(int particleNum); - - /** - * The destructor releases the particle lists. - */ - virtual ~ParticleFilter(); - - /** - * @return Number of particles used in this filter - */ - int getParticleNum(); - - /** - * @return The number of effective particles (according to "Improving Grid-based SLAM with Rao-Blackwellized Particle - * Filters by Adaptive Proposals and Selective Resampling (2005)" by Giorgio Grisetti, Cyrill Stachniss, Wolfram Burgard - */ - int getEffectiveParticleNum() const; - int getEffectiveParticleNum2() const; - - /** - * @return Pointer to the particle that has the highest weight. - */ - ParticleType* getBestParticle() const; - - - protected: - - /** - * This method generates a random variable in the interval [0,1]. - * @param init The initial value for the static random base number. When running the constructor of this - * class, this method is run once with the C-function time() as parameter to initialize it. - * Then you should use it without parameter. - * @return Random value between 0 and 1 - */ - double random01(unsigned long init = 0) const; - - /** - * This method sorts the particles in m_CurrentList from leftIndex to rightIndex according to their weight. - * The particle with the highest weight is at position 0 after calling this function. The algorithm used here is - * known as quicksort and works recursively. - * @param leftIndex Left index of area to sort - * @param rightIndex Right index of area to sort - */ - void sort(int leftIndex, int rightIndex); - - /** - * This method normalizes the weights of the particles. After calling this function, the sum of the weights of - * all particles in m_CurrentList equals 1.0. - * In this function the sum of all weights of the particles of m_CurrentList is computed and each weight of each - * particle is devided through this sum. - */ - void normalize(); - - /** - * This method selects a new set of particles out of an old set according to their weight - * (importance resampling). The particles from the list m_CurrentList points to are used as source, - * m_LastList points to the destination list. The pointers m_CurrentList and m_LastList are switched. - * The higher the weight of a particle, the more particles are drawn (copied) from this particle. - * The weight remains untouched, because measure() will be called afterwards. - * This method only works on a sorted m_CurrentList, therefore sort() is called first. - */ - void resample(); - - /** - * This method drifts the particles (second step of a filter process). - * Has to be implemented in sub-classes (pure virtual function). - */ - virtual void drift() = 0; - - /** - * This method has to be implemented in sub-classes. It is used to determine the weight of each particle. - */ - virtual void measure() = 0; - - /** - * These two pointers point to m_ParticleListOne and to m_ParticleListTwo. - * The particles are drawn from m_LastList to m_CurrentList to avoid new and delete commands. - * In each run, the pointers are switched in resample(). - */ - ParticleType** m_CurrentList; - ParticleType** m_LastList; - - /** - * Stores the number of particles. - */ - int m_ParticleNum; - - /** - * Stores the number of effective particles. - */ - int m_EffectiveParticleNum; -}; - -template <class ParticleType> -ParticleFilter<ParticleType>::ParticleFilter(int particleNum) { - // initialize particle lists - m_CurrentList = new ParticleType*[particleNum]; - m_LastList = new ParticleType*[particleNum]; - - // initialize random number generator - random01(time(0)); - - m_ParticleNum = particleNum; -} - - -template <class ParticleType> -ParticleFilter<ParticleType>::~ParticleFilter() { - if (m_CurrentList) { - delete[] m_CurrentList; - m_CurrentList = 0; - } - if (m_LastList) { - delete[] m_LastList; - m_LastList = 0; - } -} - -template <class ParticleType> -int ParticleFilter<ParticleType>::getParticleNum() { - return m_ParticleNum; -} - -template <class ParticleType> -double ParticleFilter<ParticleType>::random01(unsigned long init) const { - static unsigned long n; - if (init > 0) { - n = init; - } - n = 1664525 * n + 1013904223; - // create double from unsigned long - return (double)(n/2) / (double)LONG_MAX; -} - - -template <class ParticleType> -void ParticleFilter<ParticleType>::sort(int indexLeft, int indexRight) { - - // SOMETHING LEFT TO SORT? - if (indexLeft >= indexRight) { - // ready! - return; - } - - // CREATE PARTITION - int le = indexLeft; - int ri = indexRight; - int first = le; - int pivot = ri--; - while(le <= ri) { - // skip from left - while(m_CurrentList[le]->getWeight() > m_CurrentList[pivot]->getWeight()) { - le++; - } - // skip from right - while((ri >= first) && (m_CurrentList[ri]->getWeight() <= m_CurrentList[pivot]->getWeight())) { - ri--; - } - // now we have two elements to swap - if(le < ri) { - // swap - ParticleType* temp = m_CurrentList[le]; - m_CurrentList[le] = m_CurrentList[ri]; - m_CurrentList[ri] = temp; - le++; - } - } - - if(le != pivot) { - // swap - ParticleType* temp = m_CurrentList[le]; - m_CurrentList[le] = m_CurrentList[pivot]; - m_CurrentList[pivot] = temp; - } - - // sort left side - sort(indexLeft, le - 1); - // sort right side - sort(le + 1, indexRight); - -} - -template <class ParticleType> -void ParticleFilter<ParticleType>::normalize() { - - float weightSum = 0.0; - for (int i = 0; i < m_ParticleNum; i++) { - weightSum += m_CurrentList[i]->getWeight(); - } - // only normalize if weightSum is big enough to divide - if (weightSum > 0.000001) - { - - //calculating parallel on 8 threats - omp_set_num_threads(8); - int i = 0; - // #pragma omp parallel for - for ( i = 0; i < m_ParticleNum; i++) - { - float newWeight = m_CurrentList[i]->getWeight() / weightSum; - m_CurrentList[i]->setWeight(newWeight); - } - } - else - { - ROS_WARN_STREAM( "Particle weights VERY small: " << weightSum << ". Got "<< m_ParticleNum << " particles."); - } -} - -template <class ParticleType> -void ParticleFilter<ParticleType>::resample() -{ - // swap pointers - ParticleType** help = m_LastList; - m_LastList = m_CurrentList; - m_CurrentList = help; - // now we copy from m_LastList to m_CurrentList - - int drawIndex = 0; - // index of the particle where we are drawing to - int targetIndex = 0; - - int numToDraw = 0; - do { - numToDraw = static_cast<int>(round((m_ParticleNum * m_LastList[drawIndex]->getWeight()) + 0.5)); - for (int i = 0; i < numToDraw; i++) { - *m_CurrentList[targetIndex++] = *m_LastList[drawIndex]; - // don't draw too much - if (targetIndex >= m_ParticleNum) { - break; - } - } - drawIndex++; - } while (numToDraw > 0 && targetIndex < m_ParticleNum); - - // fill the rest of the particle list - for (int i = targetIndex; i < m_ParticleNum; i++) { - float particlePos = random01(); - float weightSum = 0.0; - drawIndex = 0; - weightSum += m_LastList[drawIndex]->getWeight(); - while (weightSum < particlePos) { - weightSum += m_LastList[++drawIndex]->getWeight(); - } - *m_CurrentList[i] = *m_LastList[drawIndex]; - } -} - - -template <class ParticleType> -int ParticleFilter<ParticleType>::getEffectiveParticleNum() const { - // does not work with normalized particle weights - // does not work with our weights at all (algorithm of Grisetti) - float squareSum = 0; - for (int i = 0; i < m_ParticleNum; i++) { - float weight = m_CurrentList[i]->getWeight(); - squareSum += weight * weight; - } - return static_cast<int>(1.0f / squareSum); -} - - -template <class ParticleType> -int ParticleFilter<ParticleType>::getEffectiveParticleNum2() const { - // does not work with normalized particle weights - int effectiveParticleNum = 0; - for (int i = 0; i < m_ParticleNum; i++) { - if (m_CurrentList[i]->getWeight() > MIN_EFFECTIVE_PARTICLE_WEIGHT) { - effectiveParticleNum ++; - } - } - return effectiveParticleNum; -} - - -template <class ParticleType> -ParticleType* ParticleFilter<ParticleType>::getBestParticle() const { - return m_CurrentList[0]; -} - - -#endif - diff --git a/homer_mapping/include/homer_mapping/ParticleFilter/SlamFilter.h b/homer_mapping/include/homer_mapping/ParticleFilter/SlamFilter.h deleted file mode 100644 index a712fb39..00000000 --- a/homer_mapping/include/homer_mapping/ParticleFilter/SlamFilter.h +++ /dev/null @@ -1,327 +0,0 @@ -#ifndef SLAMFILTER_H -#define SLAMFILTER_H - -#include <vector> -#include <homer_mapping/ParticleFilter/ParticleFilter.h> -#include <homer_mapping/ParticleFilter/SlamParticle.h> -#include <homer_nav_libs/Math/Pose.h> -#include <homer_mapping/OccupancyMap/OccupancyMap.h> - -#include <sensor_msgs/LaserScan.h> -#include <homer_nav_libs/Math/Transformation2D.h> -#include <homer_nav_libs/Math/Math.h> - -#include <tf/transform_broadcaster.h> - -#include <cmath> -#include <fstream> -#include <sstream> - -#include "ros/ros.h" - - -class OccupancyMap; - -/** - * @class SlamFilter - * - * @author Malte Knauf, Stephan Wirth, Susanne Maur - * - * @brief This class is used to determine the robot's most likely pose with given map and given laser data. - * - * A particle filter is a descrete method to describe and compute with a probability distribution. - * This particle filter uses an occupancy map to determine the probability of robot states. - * The robot states are stored in a particle together with their weight @see SlamParticle. - * - * @see SlamParticle - * @see ParticleFilter - * @see OccupancyMap - */ -class SlamFilter : public ParticleFilter<SlamParticle> { - - public: - - /** - * This constructor initializes the random number generator and sets the member variables to the given values. - * @param particleNum Number of particles to use. - */ - SlamFilter(int particleNum); - - /// @brief copy constructor - SlamFilter( SlamFilter& slamFilter ); - - /** - * The destructor releases the OccupancyMap and the particles. - */ - ~SlamFilter(); - - /** - * This method runs the filter routine. - * The given odometry measurement is used as movement hypothesis, the laserData-vector is used - * as measurement and is used to weight the particles. - * @param currentPoseOdometry Odometry data of time t. - * @param laserData msg containing the laser measurement. - * @param measurementTime Time stamp of the measurement. - * @param filterDurationTime Returns the time that the filtering needed - */ - void filter(Pose currentPoseOdometry, sensor_msgs::LaserScanConstPtr laserData, ros::Time measurementTime, - ros::Duration &filterDuration); - - /** - * @return The Pose of the most important particle (particle with highest weight). - */ - Pose getLikeliestPose(ros::Time poseTime = ros::Time::now()); - - /** - * This method can be used to retrieve the most likely map that is stored by the particle filter. - * @return Pointer to the most likely occupancy map. - */ - OccupancyMap* getLikeliestMap() const; - - /** - * This function prints out the list of particles to stdout via cout. - */ - void printParticles() const; - - void resetHigh(); - - /** - * Computes and sets the new value for m_Alpha1. - * @param percent Rotation error while rotating (see class constructor for details) - */ - void setRotationErrorRotating(float percent); - - /** - * Computes and sets the new value for m_Alpha2. - * @param degreesPerMeter Rotation error while translating (see class constructor for details) - */ - void setRotationErrorTranslating(float degreesPerMeter); - - /** - * Computes and sets the new value for m_Alpha3. - * @param percent Translation error while translating (see class constructor for details) - */ - void setTranslationErrorTranslating(float percent); - - /** - * Computes and sets the new value for m_Alpha4. - * @param mPerDegree Translation error while rotating (see class constructor for details) - */ - void setTranslationErrorRotating(float mPerDegree); - - /** - * Computes and sets the new value for m_Alpha5. - * @param mPerDegree Move jitter while turning (see class constructor for details) - */ - void setMoveJitterWhileTurning(float mPerDegree); - - /** - * Sets a new minimal size of a cluster of scan points which is considered in scan matching. - * @param clusterSize Minimal size of a cluster in mm of scan points which is considered in scan matching. - */ - void setScanMatchingClusterSize(float clusterSize); - - /** - * Sets whether the map is updated or just used for self-localization. - * @param doMapping True if robot shall do mapping, false otherwise. - */ - void setMapping(bool doMapping); - - /** - * Deletes the current occupancy map and copies a new one into the system. - * @param occupancyMap The occupancy map to load into the system (is being copied) - */ - void setOccupancyMap(OccupancyMap* occupancyMap); - - /** - * Sets the robot pose in the current occupancy map. - * @param Robot pose. - * @param scatterVariance if not equal to 0 the poses are equally scattered around the pose - */ - void setRobotPose(Pose pose, double scatterVarXY=0.0, double scatterVarTheta=0.0); - - /** - * @return Vector of current particle poses. The vector is sorted according to the weights of the - * particles. The pose of the particle with the highest value is the first element of the vector. - */ - std::vector<Pose>* getParticlePoses() const; - - /** - * @return vector of all particles - */ - std::vector<SlamParticle*>* getParticles() const; - - /** - * @return Vector of current particle weights. The vector is sorted by weight, highest weight first. - */ - std::vector<float> getParticleWeights() const; - - /** - * Calculates and returns the variance of the current likeliest particle poses. - * The orientation of the particle is neglected. - * @param The number of treated particles. - * @param[out] poseVarianceX The variance of particle poses in x direction. - * @param[out] poseVarianceY The variance of particle poses in y direction. - */ - void getPoseVariances(int particleNum, float& poseVarianceX, float& poseVarianceY); - - /** - * This method reduces the number of particles used in this SlamFilter to the given value. - * @param newParticleNumber The new number of particles - */ - void reduceParticleNumber(int newParticleNumber); - - /** - * This method returns the contrast of the occupancy grid - * @return Contrast value from 0 (no contrast) to 1 (max. contrast) of the map - */ - double evaluateByContrast(); - - /** - * This method passes a masking map to to the underlying occupancy map - */ - void applyMasking(const nav_msgs::OccupancyGrid::ConstPtr &msg); - - - private: - - /** - * This method filter outliers in the given laser scan - * @param rawData the laser scan to check - * @param maxDiff maximal difference between two adjacent ranges - * @return filtered scan without outliers - */ - vector<float> filterOutliers(sensor_msgs::LaserScanConstPtr rawData, float maxDiff ); - - /** - * This method generates Gauss-distributed random variables with the given variance. The computation - * method is the Polar Method that is described in the book "A First Course on Probability" by Sheldon Ross. - * @param variance The variance for the Gauss-distribution that is used to generate the random variable. - * @return A random variable that is N(0, variance) distributed. - */ - double randomGauss(float variance = 1.0) const; - - /** - * This method drifts the particles according to the last two odometry readings (time t-1 and time t). - */ - void drift(); - - /** - * This method weightens each particle according to the given laser measurement in m_LaserData. - */ - void measure(); - - /** - * This method updates the map by inserting the current laser measurement at the pose of the likeliest particle. - */ - void updateMap(); - - /** - * For weightening the particles, the filter needs a map. - * This variable holds a pointer to a map. - * @see OccupancyMap - */ - OccupancyMap* m_OccupancyMap; - - /** - * threshold values for when the map will be updated. - * The map is only updated when the robot has turned a minimal angle (m_UpdateMinMoveAngle in radiants), - * has moved a minimal distance (m_UpdateMinMoveDistance in m) or a maximal time has passed (m_MaxUpdateInterval) - */ - float m_UpdateMinMoveAngle; - float m_UpdateMinMoveDistance; - ros::Duration m_MaxUpdateInterval; - - /** - * This variable holds the rotation error that the robot makes while it is rotating. - * Has to be given in percent. Example: robot makes errors of 3 degrees while making a 60 degrees - * move -> error is 5% -> rotationErrorRotating = 5) - */ - float m_Alpha1; - - /** - * This variable holds the rotation error that the robot makes while it is translating - * (moving forward or backwards). Has to be given in degrees per meter. - */ - float m_Alpha2; - - /** - * This variable holds the translation error that the robot makes while it is translating. - * Has to be given in percent. - */ - float m_Alpha3; - - /** - * This variable holds the translation error that the robot makes while it is rotating. - * This error only carries weight, if a translation es performed at the same time. - * See also m_Alpha5. - * Has to be given in milimeters per degree. Example: Robot makes a turn of 10 degrees and moves its - * center unintentional 15 mm. -> translationErrorRotating = 15.0 / 10.0 = 1.5 - */ - float m_Alpha4; - - /** - * This variable holds a move jitter that is considered if the robot is turning. - * Has to be given in milimeters per degree. - */ - float m_Alpha5; - - /** - * The maximal rotation if mapping is performed. If the rotation is bigger, mapping is interrupted. - * This value may depend on the computing power, because it is influenced by the size of time intervals of mapping. - */ - float m_MaxRotationPerSecond; - - /** - * Last laser data. - */ - sensor_msgs::LaserScanPtr m_CurrentLaserData; - - /** - * Last two odometry measurements. - */ - Pose m_ReferencePoseOdometry; - Pose m_CurrentPoseOdometry; - - /** - * Time stamp of the last sensor measurement. - */ - ros::Time m_ReferenceMeasurementTime; - - /** - * True if it is the first run of SlamFilter, false otherwise. - */ - bool m_FirstRun; - - /** - * This variabe is true, if the SlamFilter is used for mapping and updates the map, - * false if it is just used for self-localization. - */ - bool m_DoMapping; - - /** Points used in last measure() step */ - vector<MeasurePoint> m_MeasurePoints; - - /// Pose of robot during last map update - Pose m_LastUpdatePose; - - tf::Transform m_latestTransform; - - /** - * Time stamp of the last particle filter step - */ - ros::Time m_LastUpdateTime; - - /** - * Calculates the square of given input f - * @param f input - * @return square of input - */ - template<class T> - T sqr(T f) - { - return f * f; - } -}; -#endif - diff --git a/homer_mapping/include/homer_mapping/ParticleFilter/SlamParticle.h b/homer_mapping/include/homer_mapping/ParticleFilter/SlamParticle.h deleted file mode 100644 index dc05b056..00000000 --- a/homer_mapping/include/homer_mapping/ParticleFilter/SlamParticle.h +++ /dev/null @@ -1,72 +0,0 @@ -#ifndef SLAMPARTICLE_H -#define SLAMPARTICLE_H - -#include <iostream> -#include <fstream> - -#include <homer_mapping/ParticleFilter/Particle.h> - -/** - * @class SlamParticle - * - * @author Malte Knauf, Stephan Wirth - * - * @brief This class defines a particle for the SlamFilter. - * - * This particle contains a weight (inherited from base class) and a Pose (position + orientation). - * The Pose describes a possible position and orientation of the robot. - * - * @see SlamFilter - * @see Particle - */ -class SlamParticle : public Particle -{ - - public: - /** - * This constructor assigns the given weight to the member m_Weight. - * @param weight The weight of the particle. - * @param robotX X-Position of the robot (world coordinates in m). - * @param robotY Y-Position of the robot (world coordinates in m). - * @param robotTheta Orientation of the robot (radiants). - */ - SlamParticle ( float weight = 1.0, float robotX = 0.0, float robotY = 0.0, float robotTheta = 0.0 ); - - ///@brief copy contructor - SlamParticle ( SlamParticle& slamParticle ); - - /** - * The destructor does nothing so far. - */ - ~SlamParticle(); - - /** - * Sets the three members m_RobotPositionX, m_RobotPositionY, m_RobotOrientation. - * @param robotX X-Position of the robot (world coordinates in m). - * @param robotY Y-Position of the robot (world coordinates in m). - * @param robotTheta Orientation of the robot (radiants). - */ - void setRobotPose ( float robotX, float robotY, float robotTheta ); - - /** - * Returns the content of the three members m_RobotPositionX, m_RobotPositionY, m_RobotOrientation. - * @param[out] robotX X-Position of the robot (world coordinates in m). - * @param[out] robotY Y-Position of the robot (world coordinates in m). - * @param[out] robotTheta Orientation of the robot (radiants). - */ - void getRobotPose ( float& robotX, float& robotY, float& robotTheta ); - - - private: - - /** - * These members store the pose of the robot. - */ - float m_RobotPositionX; - float m_RobotPositionY; - float m_RobotOrientation; - -}; - -#endif - diff --git a/homer_mapping/include/homer_mapping/slam_node.h b/homer_mapping/include/homer_mapping/slam_node.h deleted file mode 100644 index 5e4081a4..00000000 --- a/homer_mapping/include/homer_mapping/slam_node.h +++ /dev/null @@ -1,186 +0,0 @@ -#ifndef SLAM_NODE_H -#define SLAM_NODE_H - -#include <vector> -#include <map> -#include <sstream> -#include <vector> -#include <iostream> -#include <fstream> -#include <sstream> -#include <cmath> -#include <stdlib.h> - -#include <homer_nav_libs/Math/Pose.h> - -#include <tf/transform_broadcaster.h> - -#include <sensor_msgs/LaserScan.h> -#include <nav_msgs/Odometry.h> -#include <nav_msgs/OccupancyGrid.h> -#include <geometry_msgs/Pose.h> -#include <geometry_msgs/PoseWithCovariance.h> -#include <geometry_msgs/PoseWithCovarianceStamped.h> -#include <std_msgs/Empty.h> -#include <std_msgs/Bool.h> -#include <nav_msgs/Odometry.h> -#include <nav_msgs/OccupancyGrid.h> -#include <tf/tf.h> - -#include <homer_mapping/ParticleFilter/SlamFilter.h> -#include <homer_mapping/ParticleFilter/HyperSlamFilter.h> -#include <homer_nav_libs/Math/Box2D.h> -#include <homer_mapping/OccupancyMap/OccupancyMap.h> - -class OccupancyMap; -class SlamFilter; -class HyperSlamFilter; - -/** - * @class SlamNode - * - * @author Malte Knauf, Stephan Wirth, Susanne Maur (RX), David Gossow (RX), - * Christian Fuchs (R12), Nicolai Wojke (R14), Susanne Thierfelder (R16) - * - * - * @brief The Simultaneous localization and mapping module - * - * This module receives odometry and laser data and computes the - * robot's position and a map out of this data. Then it sends a - * geometry_msgs/PoseStamped and nav_msgs/OccupancyGrid message. - */ -class SlamNode -{ - -public: - - /** - * The constructor adds the message types and prepares the module for receiving them. - */ - SlamNode(ros::NodeHandle *nh); - - /** - * This method initializes the member variables. - */ - virtual void init(); - - /** - * The destructor deletes the filter thread instance. - */ - virtual ~SlamNode(); - -private: - - /** - * Callback methods for all incoming messages - */ - void callbackLaserScan( const sensor_msgs::LaserScan::ConstPtr& msg ); - void callbackOdometry( const nav_msgs::Odometry::ConstPtr& msg ); - void callbackUserDefPose( const geometry_msgs::Pose::ConstPtr& msg ); - void callbackDoMapping( const std_msgs::Bool::ConstPtr& msg ); - void callbackResetMap( const std_msgs::Empty::ConstPtr& msg ); - void callbackLoadedMap( const nav_msgs::OccupancyGrid::ConstPtr& msg ); - void callbackMasking( const nav_msgs::OccupancyGrid::ConstPtr& msg ); - void callbackResetHigh(const std_msgs::Empty::ConstPtr& msg); - void callbackInitialPose(const geometry_msgs::PoseWithCovarianceStamped::ConstPtr& msg); - - /** - * This function resets the current maps to the initial state. - */ - void resetMaps(); - - /** - * This function processes the current odometry data in combination with the - * last send odometry and laser informations to pass on corresponding data - * to the filter threads. - - /** - * This method retrieves the current map of the slam filter and sends a map - * data message containing the map. - */ - void sendMapDataMessage(ros::Time mapTime = ros::Time::now()); - - /** - * This variables stores the last odometry measurement as reference that is used - * to compute the pose of the robot during a specific laserscan. - */ - Pose m_ReferenceOdometryPose; - - Pose m_LastLikeliestPose; - - /** - * This variable stores the time of the last odometry measurement as reference - * which is used to compute the pose of the robot during a specific laserscan. - */ - ros::Time m_ReferenceOdometryTime; - - /** - * This variable stores the time the last map message was sent to be able to - * compute the time for the next map send. - */ - ros::Time m_LastMapSendTime; - ros::Time m_LastPositionSendTime; - - /** - * This variable stores the last laser measurement. - */ - sensor_msgs::LaserScan::ConstPtr m_LastLaserData; - - /** - * time stamp of last particle filter step - */ - ros::Time m_LastMappingTime; - - - /** - * This variable stores a pointer to the hyper slam filter - */ - HyperSlamFilter* m_HyperSlamFilter; - - /** - * Scatter variances in self localization. - */ - double m_ScatterVarXY; - double m_ScatterVarTheta; - - /** - * This variabe is true, if the slam algorithm is used for mapping and - * keeps updating the map, false otherwise. - */ - bool m_DoMapping; - - /** - * Vectors used to queue laser and odom messages to find a fit - */ - std::vector<sensor_msgs::LaserScan::ConstPtr> m_laser_queue; - std::vector<nav_msgs::Odometry::ConstPtr> m_odom_queue; - - /** - * duration to wait between two particle filter steps - */ - ros::Duration m_WaitDuration; - - /** - * Broadcasts the transform map -> base_link - */ - tf::TransformBroadcaster m_tfBroadcaster; - - /** - * subscribers and publishers - */ - ros::Subscriber m_LaserScanSubscriber; - ros::Subscriber m_OdometrySubscriber; - ros::Subscriber m_UserDefPoseSubscriber; - ros::Subscriber m_DoMappingSubscriber; - ros::Subscriber m_ResetMapSubscriber; - ros::Subscriber m_LoadMapSubscriber; - ros::Subscriber m_MaskingSubscriber; - ros::Subscriber m_ResetHighSubscriber; - ros::Subscriber m_InitialPoseSubscriber; - - ros::Publisher m_PoseStampedPublisher; - ros::Publisher m_SLAMMapPublisher; - -}; - -#endif diff --git a/homer_mapping/launch/homer_mapping.launch b/homer_mapping/launch/homer_mapping.launch deleted file mode 100644 index d268a336..00000000 --- a/homer_mapping/launch/homer_mapping.launch +++ /dev/null @@ -1,5 +0,0 @@ -<launch> - <rosparam command="load" file="$(find homer_mapping)/config/homer_mapping.yaml"/> - <node name="homer_mapping" pkg="homer_mapping" type="homer_mapping" output="screen"/> - <node name="map_manager" pkg="homer_map_manager" type="map_manager" output="screen"/> -</launch> diff --git a/homer_mapping/mainpage.dox b/homer_mapping/mainpage.dox deleted file mode 100644 index 054b63cf..00000000 --- a/homer_mapping/mainpage.dox +++ /dev/null @@ -1,26 +0,0 @@ -/** -\mainpage -\htmlinclude manifest.html - -\b homer_mapping is ... - -<!-- -Provide an overview of your package. ---> - - -\section codeapi Code API - -<!-- -Provide links to specific auto-generated API documentation within your -package that is of particular interest to a reader. Doxygen will -document pretty much every part of your code, so do your best here to -point the reader to the actual API. - -If your codebase is fairly large or has different sets of APIs, you -should use the doxygen 'group' tag to keep these APIs together. For -example, the roscpp documentation has 'libros' group. ---> - - -*/ diff --git a/homer_mapping/manifest.xml b/homer_mapping/manifest.xml deleted file mode 100644 index 2c9977b6..00000000 --- a/homer_mapping/manifest.xml +++ /dev/null @@ -1,23 +0,0 @@ -<package> - <description brief="homer_mapping"> - - homer_mapping - - </description> - <author>Malte</author> - <license>BSD</license> - <review status="unreviewed" notes=""/> - <url>http://ros.org/wiki/homer_mapping</url> - <depend package="std_msgs"/> - <depend package="roscpp"/> - <depend package="sensor_msgs"/> - <depend package="nav_msgs"/> - <depend package="tf"/> - <depend package="roslib"/> - - <depend package="robbie_architecture"/> - <depend package="BaseLib"/> - <depend package="map_messages"/> -</package> - - diff --git a/homer_mapping/package.xml b/homer_mapping/package.xml deleted file mode 100644 index bb664fa5..00000000 --- a/homer_mapping/package.xml +++ /dev/null @@ -1,34 +0,0 @@ -<package> - <name>homer_mapping</name> - <version>0.1.1</version> - <description> - - homer_mapping - - </description> - <maintainer email="vseib@uni-koblenz.de">Viktor Seib</maintainer> - <author email="mknauf@uni-koblenz.de">Malte Knauf</author> - - <license>GPLv3</license> - <buildtool_depend>catkin</buildtool_depend> - - <build_depend>roscpp</build_depend> - <build_depend>sensor_msgs</build_depend> - <build_depend>nav_msgs</build_depend> - <build_depend>tf</build_depend> - <build_depend>roslib</build_depend> - <build_depend>homer_nav_libs</build_depend> - <build_depend>homer_mapnav_msgs</build_depend> - <build_depend>cmake_modules</build_depend> - - - <run_depend>std_msgs</run_depend> - <run_depend>roscpp</run_depend> - <run_depend>sensor_msgs</run_depend> - <run_depend>nav_msgs</run_depend> - <run_depend>tf</run_depend> - <run_depend>roslib</run_depend> - <run_depend>homer_nav_libs</run_depend> - <run_depend>homer_mapnav_msgs</run_depend> - -</package> diff --git a/homer_mapping/readme.pdf b/homer_mapping/readme.pdf deleted file mode 100644 index 07f93c8ff0f8b7c478d0e93269eb5df0febdd4ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 113506 zcmY!laB<T$)HCH$y>R8|4K5=~1p|frq$~v+8!mmH)V%bP3<V<tLsJDX;L>-?%qdAN zQqXtHNi0cqNlngAN#(M$<0>vGN=?k=s<^c`BC`LsnLyq7^&b}VT-j35vFKNTf@9w@ z-&wAk9U98ITg#4q<=Up|JVhv_zBb)riH`L>nc2(yADw+@em}-5eRZT&^+yff`|8j8 zr=54Tdfer?^yr&EX~&kP>@+i;`_$(|PFdX9e|~wl*S^);{xmP#eDzQJ=ld_}o$J#1 zy!+BkCy}1jbFS^rc{WMC_WC*T4{O_A@5__Eb^Pm^gjTUz@y9NiG@mWF_V1BM%f*6^ zVtiFmRu)dnPTq`p;#p}ct`<36+q=0v>7aoBx@X)G8L|2Kg}MHVp9=JCEKRnSiq3r| z^Xq!Whuq-2*Hd#dF3KyIy;-X>TYt)<lb3H<dC$(e{@6I6pireejANNaXKk@!G3$2? zy-BOKU8%Ub?zHdQtlPXAx_rF8uD$n9ubb}|axL)j`Dt-izHQ@nzP)StvGre{9Xs~* z;Wl&8giGZG&uf!rO<AdP!29}v$^GjET_@-!h#iZY%J*#j>1C4B@A9tOKf%j1bT8AM zqNN_0J3hZ%eSE!mdTjO9jnPqm7rtAiA^G3MBsW4N=f$3N`JT$5A!jA|l)|z@X5Woj z5|r!k?C9gOtKPo)CswlS=*krzMAuA=+I{b}k!!5qlsSh_HcH%WFWB-n^T>UMHLhY; zeQg`6%t{4b-4jolmFjg-+AUP)-q~Icoes9;haVQSu!~E}U0n6%FLU5Ki;ws01-@G> z(zv_#UFNR57rT!g+*Vk7^TDc*bB>1x>Xz*ny0>}9baAhZXGB!0u3y!zSU){1+i2f4 zM(zryLk}+gmA!CvKA-o54+p<lNv+)T(&@2G{QY+hb@yZ6?J3==Cu3()pk)`;{KNc0 z+yS<VvYR_*Z@WG1Ug-tD4JG<@r@9XHd}_X_X?gm=>ePn1kKC^U)J|(Rd@l+%&t6|Q z^^a+YhwGeZ=I)iDl`~fQwk7OQyue{+RlzAE@W3Z8BdtV@X)9~>uG>2}Gs2lZxkMY~ zTX(JNTPUu1xw4_oxQg@kpO)RBkD_e;G8=~f%w8F~?)Skwv&0?Fp4BhDC(g=SIyGGT zHAjWC2hXdemi{#g3v+EetSX;nG)<WC<I?XHlclD0Gwdxd5BmJ%ET3t+|B1_gUtGDE zC@;5pLD-h#eY+lPI=EHfovICI>*<t<HXFZA3)`dBdAr2x&i3|M{zq7jui@go#5QHG zywX$QHJ<{ET5=pLqE!~$ULC(Ep+PmVqp307QdD5(nKL<!OITWJ0&M1spSs=1E#2j* za)f~^gUd7fe4Dlc<0Z~%eGjXC#w@%1LQ~>=@ePjYGXz%Zv-tOa|8UrLXA9^4ik+Xs zW_0T8^w?aIy7%y}ik+p}+ijY6Zm->W_a>LxPuq*uvlLm})f^;_7BA!W)cD_1GwDIG z;U%`mH-p8FS#_iyxMAm0_5R+mh}(_4x_qWHB@L$JEW5-Lm-u4RzB>P|ozi_7`hQoy zN_c<%xm#2C%{I*vwSTb(Sy|4>vmRPdFiSf2xCz%xPm!egm#;M~IPO33V|&JHg}afv ze0Lr_7gz85b6&{zXTPd$Og;PcxOnVe$)~Q?VVR8APt0uLQ8WL!!g{h-*Hg*ofra0e zIH{<Jx^dmIJZOKQ>P48W^}+wG0c$)O&j{5nTqeF>cHN!Q@c2Xq?|lcwt~g)FRg9T` zXwsq|$Mp|u_#6~*QQ+9`^E9btB6ps~`x6TV3v*Uf&rzv(QE=#Z{e%}cp1U2XJZ2<U zVyddU!;^1Shi7)&iO%NZ`y@68&-wh0pI!4Hn_u%<Io0qj3NFku@(dQgdL8<urhS21 zQ0g4VTZI}ggo@q&t7wR;WcW1ORxFn^VLM@cd&f5A54B}q#J<(A{@U5Nr%WyQq>(M7 zyouuj>8Wo$-&FtmvbL13#_q^UrSlwobF3Twb5sWwEDQE6zw?~C<2&OPK|`sdFFx=8 z)x|j3r@Hv3YW@GO`<NbH+t}kUXJ^>S>@_|mji&rnHR=AB!VleaayD3YcJh~i#)K); z61%yUXD0K=-RPA1G<V|O_A5*G_;Jd<K6EbVL0(S2y0xv&KejV(H$0rYraH$zrR%BI z9$T3=o8K?o?>y&Ykx!O0+gc;mp9?nsjrE_~+;aMZP35cA+kNhR?=grjd${SAxMqb& z?ClFSVr}X_S2ai-oiT5xhu@^d|CSw4-8a7{bhrLZWzob3Lb`%p)!S=s?OXP9{Q~7B z=VXMk6uCGY(&m>vX}h5@b)k8E)~R{z6V^#6yQ`gwSRo_EvAozta&!0z-b4D#OKQbG zA75-!$YrJZpL@aSIraVAA7)JBb-1N#{Y3uIyKggg?^8NmzwPeVc)|M%9FhYRx<r(= z&Z)Q|Q}HAFZLwv+A~*I28$z!x|IEra(`_O<|E}^=f=SZCyZDqvukKyUDmz`r{z|W( z;hil31tI@)PaRb(^g7ynSL1ry()qsv&-w;1ZL_KVs`B+foLu8K?LYU$;vXhV=kkdO zHVf!)brmsOv1aKJNq7G#(SgTjrp;+zUYY#jwBn7!KeEr=c9xqYJnv6}y~)*Q+e%)0 zpIIos&gX@DuGX~1q8&|h-2A)bXR7OOOlx2;nYXj!KVy%j8&CEM6AQyVQi5FXP6tX) zk;(SBfBe>*I-?m+QjP!VbMEKsO3-L{qbBm#gy(odhw^OWg)iDZdKPs(o*$^EKjXxc z&iSQ9D!kk7FZABZ{`H1$`s=;tdqn@+h2Odnx?lgyf*6a`Zx65gbZ?TI#5QGtf}qL2 z_AQ1Bzdd8mo;TP2m$)y($5~vdc`4AEJ~b~TKPijL#0YD1!4TY9P#~hY5E)&3+f1zP z{Q3vVrpX6c7~>{vf4ik@d2hK<U%K_?*Rr}gPD0voTNEVCe|@!OXJ4Wl-FMgOqqEbC z2mj{2zw<yNf<3U{pWdhY^6T!+op&_wfMu|!5PSIQ2JVBKO!zOUByaR+TCMcM|A!<0 z*&?-y9W&3mPHRa|P2F{~etq4{Fe_W(zy&kB9$#52WIQkR;GE|^PrAf*_Eml<;Ip4I zne#<Kvw3drn?=`l$KG5M+4?)b;L}S<|M%w;19^fUusP1*5_?`ap=-`lp{neNXMc0f z?L2c>-uv>w&gYqWe^MXm+=+2_I#&@P`D(?w)+w(3_Fb2}?H>i?mgZI^bKjjk>0Dt& zSv|+RCpu>*F&xnepTk#JF<pPxx_LV}9rUj}lyVL}^DJo9hSyu)^2!9M3CapB{hyOw zY>}4eQMY07{OgZw^Nw>`2=jgX@gT-X)ut-%>YcS(EgXrq5t}b&Cwm55`!V(5E+!FQ z&jn@|u9faI<1J;Xt6VYt$A7V9o7P`U^OHHy?_{;F&y4%`&O7#J=XR`&>6`Gp%Tux0 z<dL7(lb`oJq!m9+H0#O;mYkGV;?KLBD`$;%J4;FB!J9h%4)wS9<;?yWctKdS@tf$| zRjW6-D}8JEsJmACuv588W<J9m;rrdvTh0A^9emV{>+aOOxMTJE)cp2qjsY1B%Y~G4 z`0gICVUu%7IQW3?lZk4H{UUA&--G9az6+LKc9|u+`JukCVEeq^_s{0ek$Y2lYijl9 zf0o-PZr1Q_ZsAsYc*u`^eu7+r%H$8nZccs4;h24D_B<<(`xh*>Usv*7?>f!0k;T^J zoWp|mlQpaD*C@>7sdv55f0^Ngx?r7+)6EH!^aNhFExfAs;Mj!=9{pSRZYDlI`RTu- zc-Z%)_V2oVd-uy_W$)T1HR195{@b&JlplF*^f=mhrkE{!+3PsJ%OBNFRxB;qvRdU& zLrUJYwj;_XE)>eDUM%_em`!c-6jh^zYxfkI8T1S1{5K0Vjhe~W@;14Jf6K>dJMO)B zx=ovVb41>mBJN4)KX~NWo7y>4S`NEZ`hUBv)9-xQL_#)XMZ2i!y2Tc+-X=Ua?YW7q z{`&js4|+jIA5`Z&{NNH^$sfcy`*h3Zkc#<VB^6D}n!n_5HGh6=;y9gkp9b5bf84bR z*#|kEX?SSPOFXaY$NGArh@#adi8mj$j$L$pY4d*Cwu2{{nClL^n(9uuwD!?OqrgpO zTi=~beSGAfpef5eXN_rna{s59Y5083nIR-u?>eVy!IN)nH6J$_bxXGgexJhm(etF> z<bn)NO((TSo+l?w(Q$DrSg=$^OLF(SDLwn=Op483(J#%vgeCHst+GaHZWVXqo{!5u z7IR8%_q|yfm*AFsGi>tIt`C<qxuTt$E1SyKMDwz{Jq@@r>EX_un!V-e*};s>aSM9# zGYhs}yqj=#(dDn}4(Tj<efAw^Ymb}aB#|a|{s;1>ljqyUPVtS*F45UI>A^0?qi5&U zDLDPu>yY0p_w>n(nTkII*dpI;R1ZI~xuE{F%^oLxGq1E{wgYqDF;@0gMQ#;MOOlb9 zEnk(mE3f_K35|kCnHu{Sd@HtJiF=c?Ype8MmrG2H{hIG;wbu4o9$oTRYO77jhSGAU zRkB(3%f9$TF1%Y^Cz3qx@u#EPjOQs_3yA8RcXVwBr|weoFJJdP7qjO5Ip4hWg6N@b z4tE+}FW1gKb4V&yp_ps==cmP*9U`0>ass}J&%K^9f3tY=p3VP*dXwwK@B4*!F6j>~ z>I!{v>hi`QhL!8AvU1dRw;E61C)~3;^YyJCsu#?EuyWi#RxUE-zpYwp%VM=d>6>oX zNhq)0@p$g_y*EPy48N?}e>!pB>T6{JXT3jcT)l}Y#;<ql+Sr<FR}*#x-~J|5+|TOy z^7-b4VQP~;n((>IF_x>;ui-47Zy+(xNN=z1<2>2Kf*FZ5Ti)KA;B8YmXHvyt32yxx zYnD{J@X0vyN59tf!Xeka95GJ$r}zC|clCPwL5U=f%c1&Bl17s281{GUlY919;ds~P z8?y!8mWw<sUfn%eaO>k6^AattN?Tvs_=JD9=CPT-;=F#CJN|p-GB2Q3^W5i-PM3p) zF)!V%W6l-{-qUT7`@`q_Qzckk!_`7;iQJ-M<^pNklGU8&r#F8+<??#{!mp;M>sdo4 zYyXq-YCq;vGW)FI8`~u^o4&tq`f*k>eEa;fkIF5WT@K#%<@C(4cZjHL{N59JWU~U> zd(N*j_4ia~x2fw$-+3M(<L`N(B{jK?S-UKgc}ivPOMbaUx86m#x}Tk!Tgzwl@b_ZV zb!7*5?_XMB9$z*iBxKjOro;bSjjx<PsI7VH$OF^KSDthJ&-hjqEZaK0`LWMVnah^^ zoVNE4UW*q0_i^s|y>(xO58JBN|J$T&c6+Wo-`iLJA|7&meYuiJc$(AgMaMSD#rvQ7 z>XMmN@PCKL)vndo?i*F~+Q&C+ebAt&!eq1feeIg(oaZ^tw>*EG{E0=tb7Hr}oATfV zo%f|H?ub-yrN*123h^JT^ImlASN~Cwo3iO=H|2IcXE+@swzNX=;HH!{)4#~?i}SK5 zuN1Lmf4F{Ar569Q35CxtYYRQOduuA^38SNXJ)Iv<zR5S?eUg!M>b@HRcZ6d<Hc#nP zxqEl@%C5tQ9-WrH8vR39e&^d$y6lt9&hD63{qe)v$Gf_(-kq<mcTBuWsqXnsyM2Ey zy*|A}e8=h(qm#@xL{8PO-}fWojDPt1e=N2K_w2;dR4~JADp(krLs|+%G!?c^yPYL% zDA4x)vq<$$w&-h-tM6^y!YRU}Xee?^WO16PdkKG9xL=Tct-JQkLYd(9Nim+YWY0$2 zx0jMk@8(HQSFgzbV`4pXp3$7lC8|?zzA;mdQ8??W*6K8+Gbb#~{!_NshZoP^ye^Z^ zQQAFQBZ$Y2=iKF`FZb+T`DX3vJ#UxsAN#qpeCuBUCm;XLJ2yKg>Ln<j^KdI|e3JJ} zs%h@-V^^1LTFm*>_1|49`?i%Kl`kjd{(bOkwxI4O>)SaxiJ7r6b7w!jWZLcN!55jN zr=&2wDW)JQ>PSeqq1W?0{1YXTfBqF%@w)c;ydZ;PpYQE@62$&{)%))s-x$qxu}i$r zw1@H1)lDY%&ShUe^ZMJpbH1Bb^gT?Sq~Q1PM30i&SMEJcPo}RmU(9)Ouk^${ye6z? zW2Mep1@|etv~=EM_cToEI=-UWtf$FiwOjoaBjYOeqM!6*{MAa-dAb5O+9gDeWi zGgq&?`#|UO38@_MgQ^pL*uDsgO+LolzhHmYDOdN+uf)Zg@+ZH`KHo6u2<s!2&i@Z~ z2_3w-a8sM(p#qn{Whbn?qITVr4-WBAnQ^K`tixNBU#M>Hp=xJtp;voYln%&nT-<Yy zOFnGA;>^rzg^XMHV?_fER5*M~lOLL!KdxY1bSKfsrTul`&3{cjTKRvEZIU=*wv;t< z5$l$Rj<a>&vHaiqy<;Eams>XHge$H$JiHguKEwIoW!>T~j;AvNBshPz#B8$oaCVg} zgNxFJI}dd;|K)~E2slwDyUOItmgXaeJA#$(e3^aZ$NUY|?^kJ6eZ6<D_4K2Qzs*+M z3)>!AovgLp?B3S1TlO1XaNqrN@5^WX^?iX)r8YLDFx}cHva&no=ec!ZXOm1WMjd}F z)bp`hZ^9Y&Q`4O74oXb2+PeGr%lRi$vz{_fRjhH?c2Jtz`W*AM4}Dh(D^vegeKv6L zzV%|lo>>oN8T!|4S*UM%uIzUC6Q!D*>S`b6eYu)n&bodmzczcZY^#FSf=>%(Yp?rO zn$WUjQ}fB=KR)p4FRp7du9Vfue6iDOxtdWxrP`BqLerO(q%C+Aug`w|aqJI%%LnuM z-D5;<wg~g;FYOArX}ny2^W^=Uf>FAd8PL=eBLf;L7+M;d!v^|{6pW0F4J}|?V+8{k zQ^CmC#M}a$RSCE0x0EMW$h_KBcIn18wVa&A8*|O)+}Jkz*tXow8*^`aUbe`5qaXYF z&F1U(uK)ZUTg>~e{rm3+b0v$CSW~SWlcSv%%vjqiEGulQZ0_I|cJkV-18toX{Z3pv zC2_##{D~7>-hO&-7)%O`wr>?QEMO{PwwQB<;gg%6d><b}nwy(mL{Wpq1-2I-7Mie0 z>|#!7^kdU{SLUF`u=HTO!@+A8JI`G>@X?ufi=pXu#-Q3A9Jg=nw4O10mgV2hgHG<> z)i25CD^@j3X`Hxp?dru#Ee{+xCZXV}@6A79bLn4!S<D)_xeRR%#?0En4Qn|aSXVFx zgo=d*v2|#lT&<-Me6gM-tZdun&80u&^$wlVTJ>lPgP^0OXdpvCub9HRRck&y4`t2x zeDMAhF@@!y7XF|7{P2hV-D_5KE$CX-q#=BGzA?iL20aIM_s{m3|GTA+vKt@Rzp{46 zEQ=da|EDrIWIlV6a{TOp2d`dv<-dCK!X^K8f>(a}S8;n$<6`%Q)oYtoA3VOxn8EsI zwZS>FWAaZ+jF|t)KJfQuFnZ?ZAnpD@UfuBa{;AjGm;NdEHNpC?{>FYMi@%+jU$<Kx z5ajsNZ<5B=SO4>rhQ<koHN0nX=QNnHnYqcg`LX$(>tp!4KSkbu!N=$OIhhy_o#W%H zFFNth`{{@Mng3j4PkeivVih*;9^1PAcMX}P)7|^)uROEw&rQjGobm3(lON?S3I~qd z;rh|O_woFBGjIP<oh&+KvWReK*uu#_C2XXvB5(J<x^cmJr{&+&zv}ZAbnuurOr9uv z;K)&~gg+8Nfzru|(b=#0uk~%HKc$}ZFHl`Qn!UX3|Ew%;>F99j^Z%#KnsHlV_Merz zHg1+}Ue&vEuW>-ollmNcmks}?&19O((8I96mf=NO%CQgXSK}vtazFFM{ZAlMzQ1*} zbwg+4ROJh|@38#%$oBeW#sel63rh>;y|({X{_tlxeT31#%)IEA#HW7O#=qLTmh^V& zHoVUN$UeD#<-g^Br_}3eUOnC>b^BJtPUfCQwGBK)+x+AYJN*2ge*B;I^ckC{PMy<e zI^mN&_pke5Y}cNJz5Ac}JznkA0s9cm|NQC2?uNzY3pO_GoILU7{m{SBdM{Hx7=CFo zTNZYpzweJ~(BIAOVe-ts3t!IozjHG~iO-rh|Cj!r;i~K{y<o9&!{2=K2kyN8y5GA$ z{J(+KKtsFJYsJdTf3ENNld6)HoRXcBm&}!rmdq|;VIi^Ouu<I^24iXI1Cw7SPw8#U ztLNoxXuNmq+RMYN3D4g=;WgM;+VJ<Xho2im^C9_*_dA{{U;nS9$H&loaKE5>!@&>t zJGc)deA(a8Ig#@K!yooP9m&7=PjDp|{AN#KHkk3BxsGMqFZMqjIe+s{d~v++O#XxN z#JBbe#tjGG)jxEfDEX#=@7cCv|2O<N@%97%kBPTG%71v=aqhp}mG)2Ty)RrmaqXe} z@x*@~ul|YuInSo~XXng+Q8vfw%iq+md$WJTrpe7~RRiwc`SJMmD|xj|Y<_&t@^1CW zM<4#8_`l-M>&frxRTTbzKlJ}_w8x2SXD9bfoh<8c{LjG|opUEXeypIQbMODd>@VNn z{=9yyuIJkR5A#=ZGqCJp>`e$4%k8ab(wQ{7$-CC&^YYUQCw9K@*EZOn;c>KS{Sx2p zj}yC}yqU!CllxEokEOvPH%@sJy#A%~>$XVd1op&;y}8>|Lj3MZXmh=h{Bh#f1H~?` zzSPwhSF<fSt@nFs>7)Qz&(!CcVw=w`+kR}D5L3wUzSf<$cFQTxRKFisr#|t;l&$NY zJM9oVXKcFII%452UFFAR4|M&@8?5%)FLHO6_`<a=;QY(ytjT?zj<>#+C}v+&dA{<6 zX^8GWqqd$E?+zZ{9JXvrV|eN3_4^Kc#IvoQqLR{E{6gGmfqJ17$6T=)3ID<->3w!s zo4qw`e*QCNO`F-vpS=l9s50^wxWO;EZh7DKg)&cHdj6dGy=C*|2^tKq3!*~#ebyz- z$$rcB&eZz;LNzN%hFuaW?QXr5y0Y&M>?-)Tf^Tx{hfoRbeP^EioBY7fa6$XbT>=>f zRzig=sY0(V<~HQ@NXBW{Bq*s|32iw3T<DN{OU;webrqLSS{W)eM;uJt`1(1+`Ax49 z4#+!-ABbJbSE#-5*!K+&riU!CWnbm+@$Izg?q=R;Ke<`oE31osP1`U>fX6T2H2Gxu z>2H5mRvFI>f5^CMj~#>cGmCRY{U>6RPIy$-J3AG{ne7c;623+1_^A_@mR4D>IUbU; zTAF9a8u8S)`10Ck+UkkU7OGx#u^PKeZWUP^S;^Y_yE$QYM%Fy<lQQ?LjsG2!<vN?1 zf1a_xVv9od*|UcF>fC$>zP(O(-|^<6(N0CX2Te25!ng(NUv}+GG(21T>vm1;;o6<` zuO^*xSf8wS?sN7_<y(5Ej$KJna#H>0!|)_X@yMCGsqWGD7g*;0O6<$I`2CxT&uw$g zCB5@bwd+3X*f=-p$@$x}UL9}xJN<6?q$c}fh1SYDX?v!=J#es8%|kAF&0ogg-yhDp zuD__Q^09c%O{dD6pV(ACA7$LxlrSsja(A{#s8p1eu;PL#W%?(p*H5kJQg~oBm+$Ns zM%Uffc=n29{hrOWWY68V&aIbjE<1O>N8`<-cAF;c`H^3KzV?o3d(-yt$d)Pf|KmQm z*WUHa)@(S{)c<qYVvlLQ-bxory1q{pyf@vLqo_W>L^17u-j=NsUrzDtJm4WM+x%H8 zuW!Pe46`R~)|Mh}7MGb1C;hm^-Q%)W*Yu?B&xYE2>i3`QoNFewC^Eu<;ndX)J7Qf$ zxtk_w)W4l^?&RlZQ!?Bo&j^Tjf4qEv|5(_Su1#Mg?r6XCy0q_#_`cxKTWb%N@|lJ8 zYjvvnToaLZRe2|``$R(AB<0DfmVF7_j=VFi=KTDvKg;;L%th0@SG<{>=UFE&m@ljC zAOA&PK(y{;x@wWSqx<BISN=$Cly8>Wa`3YopP!1_!&3^3yRS5#)|zD8m7EsgId`dG z%sYkVY<r<&1&z11+O2tgAlK)H^N#tVMiRR%m5RF>)p8H3Y|gN|eRoSh&Y?-i1B5G^ z_pIq$KQ(gu?xXz$Z5PAW&)TwU!AzlxdXCxePTWwR!D}MH`C{9FdC}O&bxUnxZk zN$qE`iww7vU8gE8wwhP}zR=`98QISw(_fYA?yD-y@o2r1rI+_Y(_`iHv!*k8DwAxb z!jkQMrWe}TX&;-rS;0kJa~t2j-&;OE*%H&ay{N+c``njJ28-0Lx&A$(8CH}oC@vqq z;IFl$i?Nyf%k4&y%WKtp96EgT-)Mxs=ChsZDB*hlUD0Pwq1v*-3!j&rIz81TLdN!S zc-oAEmHr#kcE8BqC3^dGwU$NH6Ss3S^A|K8?w+UAIpg`-k70jOjY``%{6rLvu=O{F zcCtIE3(k4succD*Crf%GtHJiW3hR#cPQSY^`0tF<Y^K#2?sN3gj(L=RTf6by%^Pob zXK$$7c<}ArJXiK4{mCl7JKwFm<s)7FV880(<Py#~d?B+w?A~i7I>W`fg8S`d=__fc z{?2N982ZqB_vP(hjy;(srmVg8!)2q#J8EJREDz*YdZ*>8q@KBbR5E04_RY0SnOQT6 z4E8>Ly>G(9?K*sqPpiGGwRYRjd1k`XxY}9!1Nc8?iQH6U_-z)a_JGN`d1lgrCSCc5 zZ}gHm+)w>j_4o0%*v%X#GtS&qZk<$;y{qRz;}YF6hdUG5tJk&#%u08X`D}1t?#_Rr zoS}=>zn``>f6By0$#>@tZ7lOU{5;rZR_CG*8z#&WmC%!2<+XP2h9VVFzil;Qx7V{3 zukdCTx1Gz%e{;S06Ia$1*_Y$)bX@+oNkmWc{?d0sKAoSYdgw2;&0BxC^Rk<ypy|cE z3+uDXYi~YywdFGJWvk1Ft1DNqefV)urgDeV)xPqZ`)1D(`nO@aN5knPHOHgM*&p-x zwsl%8_&8rEGW3-6siiBv)i9bAUI~?~PK%sXv#j<=gwmm>vFn%vw!eFG`-)QCeaU4B zdFpK{|JrzNx$M<Gymv{ug7+kDhgZc);nR`=m!IO9TzS&$b>kepMExnJ<oDcM|KN1I zYRH-8ECt&{@9)2{v|`14E4e3T@)<=r2iI?Wv-^38)mGlzBWpSG7_3jab^kh2q-5Q= z^{&=kDY^4GCkmLSuedeIyI910roz@Z?L(i0H%W+2kGrL}<3q)~-8)sElyvO#<?|Lh zwPU}f0f%PKBD2-4M)SOL;!6aAe=ZNu-t~S?#;Qj@oAg7@GO4$Vuo<2^c5M3&C#~6M zU*xSh#Bi~;{Va<GN6LjaXMLP}Cv&|KnGtdRnu!05(@S-)YRAS*kiDC}wbd{8-4pMn zO$#oac;yv5d(r%&!r3|7TP~*lRu3waeJ?K;v1r3a!I?#iAC{SvPPqMszvgY<xo3CH zJD;zK>g9R1<)LDo+rz`mBKtS4*>%nPmBG61+Kmy<?lovf7d=P{_N|^W^WV<Ts$Ngt zng0wH-m&Y}Ii;$SUwTVK+BZ7BiT25N@{-&9+FJ26mv~gZ)TQ;y@=JdosF})kD<EB+ z?fJK5?>-ibd=rmv)neMe>5#Zwb=~YpZWsOq-}N3$>0j7rcxCCLuVQDGtD8-;n7irX zq$M$n+M8JSDb6fDDSx`@{`1+(bbh9vGbyjs&4|6Z`Of^Jiw1{g=+v_Bv|SsVpZaVg zb57~&I~O>2D7*`5W;vpN>9lz7y>I>bi;RR`Kh0U}()@dq#p_KgE~m^1@Y4<IJQ`ib zI`z|a*U2_&zeCs=z0O_@op4mICHaM8_n~jjN^kG&?_Lp6!MKNITbg65ai)9Cvh5;e zxql8_sa9!Pyu+RQQ;W=r@QeOD8+lHv^g2DrmR<Je-D8%$74uKepOU}o1+Qe-FRKFw znHSIIxt@Gv*?HlFK;u~jQU?PJ#U7>Bw+kIm_i|o(Ud@_qYXrL_?<R)msL+1J<V-Q{ zCEL%+C!2_P9((LjW+AuW`u)gfiZd0N3M+UV%jNPNt*+H(6kRvl^?u5}{~>m@tL>+9 z{8=Kj{`!2Cuczl1_q@*8$@%}wxtw(uZ$I-&jW086@JpC&a-DBwbxmYb9mhV6<qFp) zOjdC4-@<-A+<j_8bJfG>*$FFlzq{~C%=B4Y(6*8y7d?(8SJkdb&dfV-@=?*b^SPqa z&aYf_Coe?&+pU1Jg04>96Plh+UAX9)_?gA|=}XSv{VpnHack|Atr?v9>P@=uZr{&~ zKl#P)-nGlw7hPKJ%WrJI^1VRp;>Bl?0j4(T={cHTrWJ(7YYBFky^~sUVrrG3@rHHl zjw+x1GAZ-<&G_Ke0dKB_UH<iIwx;9uz^uM$sn?#cmTq~~mHA7q`$zlH>nB|#Z?9o~ zelT`LW>w}CPs7xYk>)k;wmOxV*RjecUE6T*{ndM_3c7&?#;#XhyfoNcT+^ql_IIho z_soNdGtU0Wv{<CIQ@LTI+0w)?OU;vouNT&QI?Ka-LnC2U`H71$S^5W~ghD2~=u9%( zT%4@6#qa8yyY(L@YglWkd@yF;W_SFtqorD$#MP*0i}zapxqK*B_TsxQb)Tm7uHc`$ zs`%K$7Zq2d*12l!P4&n>_S^f>T1GQg*|nFpzMFiyh&}Z#Tbh0^*PS=_g8C)qch;CH z9$Qm?%VOnKIT7I;#X0lEt6e5=CN8n4`SRq-ciDro|5Lk?Z`_+*AahdD;l$5Hb6&W0 z1q-sh)Cs<JZ*uv4*RPgB9=8>npP#tJEZy_S(|Pg9E86=G1^)Kw$V(FLIP%8TRpsrK zUu)<1UYcn9V9ueoA2vrg1uKPD=&`(ATCp+se)5L7OMIIux^=$qTYYhDxt+;Wt-smE zHy9sqne|RcbrfrvrjhzNsq=wSa_R4x-t1GQ<7dA5epHy_b(G0bjn8KSWAtBd(Ry`s zjrg?(b38U5^X^fro{_ZXNM?uyi|XMe96AU3y~~z+Y&w6xL3u*dTKg)CV@saieZig+ zuy<{@-<}Yy&9XL4=DRmrrK~rWtACjNsOwCK%k8YkI|b&L&U#zL^iO}z!JB>lR|*79 z-U`eXb`ReCc1`rJH0P2(w=YDW(I`({{(EZlL3<PFEx*3#oM5Xo=dHMWXHoW#ESq&5 zKKgf7o_xOA?)Od)6N5{(`)7LF1?>MEuQ~5)jLN2z)kY@`^XB}PwVWQtsry|oU;S0n z617bqwz50D(Yvaq-M@D4+{)A9_Trx$ue@t|`eflQt++kkj#%A&W-xWdhKQ5z_VJg+ zZ{xM;3zeKUH@g1$hYwqKhu#(XD=INZ?a?>0IjUmfSA$L-Q@s8@(VXq8!lat>dpBn^ zX0JFH@m!yI!Q^w3cL=$aC7uf3{)@FOGTrY`_(`!THZM0`fAwwU`c)0K-NmvlSqt`F zdTxG2ZeqS&MqrENlH}s|wn>M@l7zN$Mu#4b@H-JB^LJ<MQKfgCKfA-{x!UBrYZV%J zUq1U|soFH7T$}Y5ug!T=X5ITXIDY=aa=|07Su&G&@4gpn-J*9mDLk0v$jRC1Tf^GU z3SR1exMXeo;^Y10(|wu?^}5eo*FN;-==YU3nKm;<v#x#A*ZJ@U$EKw}Og<zeRnJbe zo?e$TE5B01;Gt36|Km%P)wk9(XSXGoew)x3nP+qE&%v45A78$i9@DwfZP$?vZ}e|> z@<!%l%J6+-6yM2rEmrKtvTy6REbo4}@?YuP@X*tjH{5AozTh_dA?s`N7ag(kihj+b zwCYoL!i+iYlRixS!E{7z?*sX%+yBaY`pY_H*@&#ZvsohZ{iolD_Dy*G;aFq6_pP3d z|Cg=(@p^{qzfM(&R{zpH_ScWBb2g9Il=kZ1>kQi$8+<Jf{+%A|6!FW{$n3q-lmI4! z`)QurN~G=vI+}m?nO8ogvt_0E;pg3ZxsF$ITSt0(RbMH8_DJNUzia#gK9?sayH4g7 zFy<OwX}#s;F;_6T@7NlK-pG@&-!vcc#@YtOyF6~u`&P4N?M%VbU1#1NoPW3=CHdzm zHO^PhHa^@b*u3t8THY?T9Tv?79J9o>OSG+=q_xp4DfQ<Sqh0ZGEKxm1Sr6}sIC;)r zDyN>yb0%Yg{Di5xL6^g&&+MC0(3N75vi9DA$n}4U{y)n+S-Qh7WQx|FO$kx=Ug`*6 z`C}}2mwQ%J<W1M(x__SsUZ`9vd}_H#r3RnnHKm*8lUd47=xk|b)!ui1-dCT=JQJn{ zN4DjO?62s1s&ZiW-3#yc?TDVSz1)E7R*ksNiP!qV*AHFrFZy59{=vvXJ#ymG&%0S{ zi<F&DPT8x<CVg_!j~U{RdgfmVxfb+w`~ITPo!|D|c`!j(^ZWTPJ>H*$ye=o&Tq>4T zt;l9&XZahs_Q%19EmNnz<h;kqyziBF*HqcB^R?V8vUZ8omF_y)a=m}S*51RvYZ`x? z&YqYe@q)4F<emAUZ|x7iGx-;DW%o{H&uuw{p}X7r`TfP3oV=r!O)P4yx*A$u@Laj! z``>A*zqOlx^1L>_@m;ED4UhKujoVJ7lx*5!qW{d}K3}Vy;TDN%rz2;4yFRX7vR?1~ z62I!O!zWtIl@~gHJ^E<A_R4OFwNB~I#U%$G#z}qM_?ml?dv8YlBJ1;<%O-DOGm$l# zzU^TDS_5&OgsoMzlPr5|e=T*ak;?1HNjvve{nzhp|JMq9i<x@zQ_A6<)6&hWnI5%w zxV_u5AX6faU-fRlg}TKYZQJ{2Y?(TB$@+WN7t357%f9taUA~4n^Bm(x=`&d-ldekV zzlmhl`<iCG>}K0-{X<O!ORd<KT`c21sA=%(WVCqvrYA?ven}Eon0)`K;NPROg3f<; zF`O*1I_l{nznAB~%M@f7MZf>!e94#RVs5$A_G}+-L8+<k`#(z6EQ{vI+_bPNOyuK- z$?Hl#B{4r17VNC~qb%CF(&5y%O&Z1p_ZPo9sx<p~%|`dc^S@o$dUmv#FKm)ao5OL{ zeRXNpM30QZf(f^To=!-={G+a;?h|unqh`Y1gIOQAcPo0Bnw`?v-ZXpNoV#Jl{HMLY zJiglQ)WxOx&9y#6PW;<ro0)#u>znLf?>&^TUV4w8yM~>~<%^1j3p3dpCcf&q!4gy- zH>Y~ft$FMFZ}nBi?&IYD$Jkr3^w6RRVYXy-?I`~Bu~{$Yc&V?gHw~4VC2SjQ6nb}0 zN!EwlhuOEpS=pE)f~H!ih%s86)VV6-%b~YziqLMkeczZJ^py;@eKVYXtkCY({>QhR zug`e$<?_XtpUQDlIbTc5-L-7wKc#mlb(fA@hm6nRj1Ac<)7E@{%yvm{N7u{lynVN> zy`OUW?mC@~8|P2@(-(1A;Y?w>`mTq4Wt-op_O3mV(V+6FJMhPw>n0Af96x+Fzhl#T z%ar+!)W4|4!rb!*o=LvnakTH)tfN)Gx15T#IOE=Gck2n4(`$iQS2?&ow@dxzd31{P z*D|~C&4*Y8HkIm5IqEX6T_fLEl`Wpl&S3M+eXFNTP%jpKZ@_%%^{+dcQaYQ$l3J$E zl|1+2s!U_hgw6@7>n^6Zc3k9o{oO{R(|vF6L-y^e3zq%5dZtG7_enm{tXiA&K=#j1 z+G1uT>0g!MIaZc?;DWQ)R<|__XBoHh$jq{{6_35dW&4YN@6AoNM~!6ftbZz4+Z)%( zwNNNJ@5jwue<r-lYvgKM;dFZI?l)~>p}8MB1#)+-<jwfmdUPkpOW)-w>*sB{ePo-^ z{QPxQ!Oxyp28x+=t^di^e_`8GvEI6OiybSciRU~nStK+m)@;k7JGyfoPn~({v|hdm z%iW3PX1@ZsUNoILdg+JhkuUQ)J?45nF+QvPWADcgxq%mNb)FVZ(Pi4kSl}llyu9Nc zpNMPchebTAUsoQPbpA()X4j6tf9`xsb~56-dd~LWMKP8=XS**Rj9HKo%UL8Nw4wOD z<cV1y0yuumSor*?gsJs4x6EI&ti<wc*5qyrn6Egg*5kWHcgV>-BA0|7rv27hc5K<3 z`|6ucY@ElUohF&RT|KtU`S;7y3$xxGDE)Nq!L<{OKO%p9ZN2=EDJ|UEYlYnGTTSN1 z{CxBF&HteGb9To1>7n;e=5OzweDu_dbLp3ZLqh6>)h4~D65nx9HmfBtX}O)%zGcN7 zYgw*sNlmnx&bjT*&H9ONeHNVP;SkdZD>va1z321mVttL5-qqhzrQOXkR(Kw2p7QXv z{;ypVTjMyQB^}E5^j!EJ6>qvFi#y|y=6|DkqIG-b$}d%%y|Ac#{Y$>at0z7(-hRK< z@P=(id+}wDN7trl?H6}2dAI!FyidR7m=YFb>+a?LBeeMmv#LXBr;>28e5cL|PbZ@; zM>|==*JnS~`&KTnp5l`!D^bauc}6GDGd^I))plLR%`z<$qh`n{y>(Td@qP2BrvD<d zZqJ&onG{tXHkn^7C!K$<g4)xo@@}q2eIDt3-s;TSA)qn)bxgt2dk@7b9raFLU&Q`p ziB!=&QF~?n8+Fr`-VTmRne48UE5M<|t$VJ$c#ij-NWql0#aB-*|1hJdzc{~ZFaPaB zrh$7`2INew_KkNkPv*Y9ZNq~5U+ZoaU&xKNvHcW$Ak%)6&<>})QvxG93jaQg7q(iu z@~5O!e#6C}MY8%kuQV)7uPSzJ)mFJATV1fxX<uA|kI{@1>h5><GM&k-{Oeo%<<hsA zoBmt#Dl5h?eoMQ{S(`nVf9J&N&WS6(t3<B*(tSzLux5rO>zb;nj%B>sb<OLG7$z?@ zUcNhL*@B$Uvhtee%|Gs(6#r~)>e1$q8%0}~Lxh%We0k~pEZ)$ZYb;+QcD=qLwtm8M z_fCTokAHlso3&78dFti-E0KHsj2x9?9B-w3couYK*ZMV0U-GZcxIba${+>sy%CQ2$ zAKzG;hdy7C`{A?p%V&~|pSRV>syP`6Bv@Nsnssf{CG!n8!dcWlbj%i<bN!XeMjf{6 zoRV)ck8C*_HQi9<g!`*Y8(;s){*|Ft98u5xW<t(O6|>g&g1edz?)<pykCH0Gk^e$0 zU!^BJI-zqd@8+6AcJ~BRz7)RvY4m*2tNg{$F@GD@DFyA>Cps^uLno{Io6+Jga=%a7 z31uEgU$AXn-XR-_$4)_pe@@T%q-mV9^y<qkABCqa_2~b$W}T9%Jlp;6`O-VO&-}b_ z|K<0^o2CBvg-l)<HDC14+xSQ|k9jeU_qzqs<kmc#c&L?IZh7b3M*+8P#B&;)pX;%x zgY72&!l$C*@2?+={&a9v<)mmf&6mMp>A$u3!{@A@Wy1B>^zP!X!iMuA#MV9TIq$Q; zQ#EDt!M_2zGlDN%yAY~x{Uy#OU*hORp$s+ALS@dFbMrXed#zIqcDP><UGHHf)^_69 zACJi8IbK$)=cm8@vgQ1%+f(Nqm1?kGyl~2y-8XXh6oh(semv_*u0LJ%QPOkr_rAq9 zwdTm4*~L;XFMeEA=FqmZE}l~jD{k6#Z~n%9ME0Vn&uJ(1YZbF}Hh8f;w^6Y7&XHa% zV<0eL;RE%*dS~K4msh?~{$D%ydqZ!>>vN9+RzxJ6dvhpS+R5dZ(e-}AYw<R@TW8d? zUFdt^W70UQ@k|BFB7^JB8y-Z~?l*fjQSjBtk7ut(UtI0}Yfhxa2c|iT7kmr<+Uj_H z(UKMFdp{r3iO}txa_zL(M9V1F364gQyWebKx@f)N(CgC34;R<To)7(?yDs8%;*Mnu zpEf&Xsm$_mdArvxO5@7qoi>p_!)3I*CbzqVZ7OL=Jo)L^9&;P*Hxaik%kNfN+Op&H zghQ_sUU1w#@4ETlo%iS4vYL;EoGWL4dSppO|8ADgAAaQsuKN8rP$j+n>;C;cYuP@( ze7VnV*-h1@V#`*!HeNb(qDy40#^wT!9@RA74sH*zqy2M5a;mqQ=;hb79!{U}`IC-r z?v=`E9sz~#{l4rjyZw66^+_A*L%GslOwMwAZz}yy?|4<G^k3H3g?48bT)SY_^35#b z<(6gNYmA@Sy_7T!zHnb}ll+`XzBwo3cTM>JfphYUJ|~{vHybQZf4z|Fbyc?Q@UxZH zI<en7`COK~^PX?$Dy3s~lYbTG^u1iMC)V^B%a{h<-q;j<b;*vjH2+`+b(0GP1#1*T zlvf{_toL}0w6lxyzQ8%FEK*KPc(ggm-~GAYw8S{;8m*`qhaA7J-Tj*DYL%P*o#$6| zlKQquv8v1GySDKJYpqV(R@dXw*1DYef9^}sKGT=B3(GIP&G>TWjpmIRSC;7e>#n-; z_S1{0#*%Dz4ob4`ek9=Jw(rKV$xeTwANGH}+IQ2rW=(+HxqY+C8ay^H*rsl^GE~R# zqTa{a&a@3iUql=J@91gy7jfR|b-Kroh&RrmJlX{|!i(q4pYY{L>p%bOcIEk5JFa}K zn3?uwwK(JB74ve~1thQ5{yn2JKTW@zr+1Cmg<NyysCl=%y_?VekU##S(BhHpybV8B zxETiNeX%X)`114dt1o+5f7=~3@SfO~doY6i`A*e~Yc}=Herk4@!>RaXmFJmRpB4l< zp0jU>58T|f>vaE`kB?15_NK}@2d8U1S+P56^XJ)bFUuWDX54tMRXpYjgHMx1+s!>1 zoOzDM)zUi_>PfEmeI#43vL?zYZ1K(?+_#qXy`2B{xVKgE#AcCJp9vwkXOnYI7|ae8 zoMPbpIdxUm-F+%vX0pew+KCtKk5}2V=@QSw`G;R>7PepBz3|;c`Fd{U_ggbwzrWfV zu-N3t%13q~ek{!TX}$e>&e=;V$S^2Y=Vz9A>^se5SSwrlT<uKKq78RhT8`f2h&=Fb z#eZ96!=3HTFU(i$Opd=i^`)bk@h=UVy5J?{GFICpc3w&5o%KXw=~9cN=Msxos~48b z|I&LNF;mvrA@G0at%GKU%r#MY1vLc=;{y-o{Xde__Q?0=ySB;qO*IRbT&W3OT)gB( z<$`YI-_aXBJ6(!gW2N{ar1RV-fBtRZK32PC-TyP`pXB3@YFFDcg?_$Wy35yW*Ngmu z*!PCh12cX%7OShc?H8JVgT++Cr@Q%{Rp1*_u6f!EjxOvLi+a9-f1}c+oKH8LI&}_Q zYI&z*tNz1#&z0GhpP%G7>oH#2P|fgT>aqEUrriF@a%lCckX)~csgasWRkaKq2mK0p zQ<wPLa-`OM@K0-5zH!Ovj-(gaoXXx>wPrIm^iK|sT7E1kq3EfAy6CQ;{FB}RKRR9S zuClzMJZItC5b+P)lcMgq+|Vz&5oDSnxN3W#eeX1nD9;sb+0VSUC(L-i%9s6TwqH(O z>z*f9UF|Bha#Yz)H)fgb*mfd(Pui?qqE^$qz4d&j&JJ<7!Xz|(-HJtjr|4=p1PaQs zoYagk-je#0|IEX@z7wZ2t>e}tPW)*RXLMJ;zpEugWBW`0ll!hu%(Zy8cj-i(qupv{ zOVSFA*G}5CFXO(X+xmUNUS}n~e0ft5!@SSNXS0F(LyM&$ueS(Bd|CEJ;{I2bD|>&w zy0U(8=IPnzFTZQBXJB^^P8GNi@s=ff&rad`IZl67<PN`anW3Ar$|?7vNJvNMMX#(r zv)gU!^%*6jsvWeqrWHP2H-p`AgM0hkZN1Gob5uVpyd84J@?OU79D6S7ko4Q9{EvQb z7OP+KapLv2r`OJVZqxp5m5;u=W_!`O`YrC?S#Q5LKfZ!-u~y5@8Ic!PmS0ZJJf<h_ zG<(9AZrA&{y<Y<#xpV!Hymww8*VA;1ErXU(!?(k8Uniw@ubh8t1NX5@_djKAKPB!V z%YF2GKrM64&9Hz;%e~ZRUN)+Fe@%1ig(-jcoa#Ph=&>QVB0AlAPKsLnN7-FrTD2AP zriQNh_ri{&%wTWL6<_b)ogDXN^lvLYxU$kNbpDgjDL<z@-Jz%F9e26^?``Iavk93~ z^o}nMTxVwIbLznIbu-`XzP|f<NbaO}I~fl+%vtcJ@A!fW<~zQrsUKRuRW|VbH@BEw z+rhW)!HxB1y@|JNA{e<2Jd%v(><OG=ptN&CyjO8WJKyW=Jf<m!-+ZbF_T2Z}#8EqV z?qlbksOhZlavqc}k(u_3-}p`TjGap!xd$@eTK(vp`u4Xes)eTPr#y>w6??nfSk&8J z%1BJ*JmDn%`J~w6-9C>?Bg(ArUf&t0^>5!i={cRz@7(9I-Q;SYrrP1|)bk);Y?V^* zd@1AUFRcIgtH|wD%MLr)BJp(nR7JrS%>zqH!u%G`JsPyWe(lPtldc<%eR%qy`RG~C z_}!~c>}tz>&@Z`<H^j1Ig}kJjL*)VM1oQf>0riQ-{i-f)tebcCTDDili@C)=oV0QY z_t9ym)3rXne{Q*S_c=`uoAPs}+CgW}s9(Aw5Ll~e_TjJ2p+<$8-M5R@b$b7N(fjD& za=Cfw2Ab*DYTuu(m>v51slWXlhpcB`r`oYgf7WrmrMO_Rd!_pQ8##%+2@*kD3RV}- ztyF0EBH1Ie>Fe#bX)_x*ly<Xi3)Z{V{JVNmV(hd<t{-b&Eb5u3@Ob$ni<8#swyi4v zG^DOw*khjm`-ato)OpWh-+u6pV`*lRf3xzFX45P|S%)LyzAAwRlW(kE^u1}uEe$)d zU5gq#@3Gy>WMS2LWbs&9-q!2*k3QxouKOo%yq1_=d}7_syr1sVJUg|Tjn}@>5}bE9 zr9gR?yD58Z6_05{y2#tFS3_);F>G}`YR*2@ka4N=oY$vcOk8^Y<sZ{U5@&SV<5e%a z1aYsd4Y~BqyrW2ZKI74zu%;v1n%{2gI_|qyrR`4m$5&Fuzpm*$UJx(#P3Gnl$p@Fu zXiw>K>YAqIb4qcI-Si4s$(;Nt;)!0<1ihY5s(NTS`DtDG9O(m%@(v#s#67mj?voT3 z+-taN?kC+JxlPIYo^deDTPmiz<|E(kCLZZT(=_4Mh0*E_-#WeS$(#K@(^1cJQ#^V9 zx{$-_g$?cHyB!6p<5&D%$>z6Y&8g2TC9hPUFxALhCLyV)8#dkQS2)-G@IQY~_`K)J z=QVjFx_=6L@n2a^D}(K;RliNE-LWmuGKD#5;as_?g?vBHM+tm&w$gnwvFvH@wD+E3 zzK4%&?LGC^Wv^&PH}gG{`<aSSArF3*?pIZ7>wI5fl6ro!s?M2hU*`NY{@^$7QR(jg zk8Wi2K6N%Znmu1im09(N<jyT>5@r)#thL$@IIk?`%Jt)WZ!Y_^bV`3;#jVnahTscr z(`PQ>=((UHrg(qjyh)4W{*^AcSU&4ofbwgN35gTDUi10)C>DK{k#GpQ+x(}%Zb#zr zPn}C^EGsoXxQlR3xngSH;`+kMqW|Qqf4r0IN;exHzI^16(fYhot%p~A^VzSr)@o|E z@f9wAmZoLAMOiFqsYZ?mxF4Q>@M3S~Uta&UNt6HSrtZA7Ct)wc<%ino(t8&y6x@4t z`-Z*=599VMSRhf?wXbq<b@iI*2jiYsc_~(x+eLnOTK8?sv+9*5n?L8@$>ClRYn0A^ zE^hXwz$ZVxer+{f`olwbU+!^l)fL-a-jz7z+xo~{DLKdb^u|>4bP+|bn-kA(-0|R> z1@DEPpDPU}6&(!SJ%dxFX1o2zyZRdi|F|0aJ~+Mf)&6w8e?ec&Di1g7XFgi7^^uQx z@2AQ2QSTSsVLShhYdgzc55CNhe}<FmrYj}<Gd7=n@WU^Q>$QKrFJF6<`@>@eUFU=4 zTv4+*B<rkra<3SLC7oCFchb;(IW6L1^3|0yC2vW!ZJ4yCX<@qO-0a}LGXr(E8qWXq z#BkCZ!GfSqdpfVrJG<M`MYq>=t;Xwc-Z%?G*)L{$124~v?RmWF$eQz(ENj2z9&0@4 z6||~Juqpam>Tb(*JC8M*+>N!rUVGur)VymAX`8}6ho+dRK6JR8mp<uW${$IdZpFZb zVhd+ARa-p%J!y@6@j<We6_Pw}`nPO-X1aap(nGb9`8P`W`$f)pNG3gZ?YrI*7!Yc8 zkjKJI)=#4Mfi}lc!B2ZXyZ@bJ{b<))1<#xOefPI&Y|ESfGdwGj|9$i;Rey(lmv*my zAEc+o5}X?!#H&+y;s3OnUn#eg8>StdWAD=&-LX~R_OGkbKYH%2yPM-9C+|PI)j;c? z@Y;aF{6EFaO_?=qCa?bXdu)zu_rL!j#pCDo$H(uOANi_TwfS>waHI!^(;~Z-&axt@ z5pn+fvlOHvqt9eDi*l@vmbPyCF@I9{YUX6&FR=p6X7K_{AEyX%^v_S)zUI%{1To$} z;`_at_b~lfweb1=&vvWa=GGs*_0a9=jk7UkRz5->o*&LUu3Ax+{o6N+#dBLTTTqUf z0ekf-!Qjk;p}Q6uz4QN88DX&0>(7J2+vg|pOzWO){;IIn^qs7o$rH(Mez(#cMW<g? zJMWtzxKHu?p>q)r45DXn23j@OZLT}B<L%y@&mvd9e*C%ATS}O7YyZMixr!$;eyfM~ zy40yOrLyh0u3sZ;ppqljbLlKM3rnM`M;?3oCCh{7-pMUG$+BPUqyFZvh8q&a3O=rX zm+l~9A<#GR7_-T<J+Ed2@3P};E_f2)$gxlT=;<aGv3wSjxgj&>eLKJJcUR5c6D2{{ zCQWBh6+OW9)@s9{6CHQ#-u#QOIrvI;Rk`fTPwm}YC3=x&lRx|WCTA46$6Pti5qBW+ zp|PE(tA<__r``ODu2l`oYoq>OVe-G|a<OFUp-T!Ee%8F|y*J0EvrgOaR9^VOq$Qh= z>?zn_bs|sf$Il7r>cx6NDr*0y1#<9pgr4zTclD9g{|Hm|)2F_0x<(l&O=f>=ncc>^ z?WuRvk{M^kdJ;l{RQtCk>1j(C&r>Z{@v>)e)&HOJi%IHDZlT@E+oe~3bo%G^cQ0(@ z{q@IYQFQ9l%~D-&jnm^#EN(1#UCz<>@q>O<3a8vNtrM$SRHtwJ!eTKwMd)HzhvCip z%a4D|I-i<;>cF-(?Y7;^;@#%v$0>P5H1^m^p14r$_TtkG2d8zHck0BLDNlX-F)G%$ zYc|ifi`NUDeShBlB<S5=nb;Hhx8EL`w#ID1CSHTc*UR1>`toQ)Qe0&A-SrCLWixh} zD?a&d5&9x({t2#$&(u%IrGBV0w3GJq^JQIMC0WpRTy(Cvxai{t?_Mu*__y!zN6)4m zo96N^V67INzcunq))GlZ_m>Qloqzsh?p{0R<ML&XE~edS<(alpK;rQF2_kywcTX_< zS*m_<F;Cy)_!T107{wnOo$*RNUv)@)X}Naf%xBA{3e?OKD%x%@{Pj}wP1D|D%_$Lu zzCu@y9977^$moBRz4N5Ympihyyh^*J{%SW$7k=7)ihb*rvN(aw`dcj)?AW~j(UnFo zjeWmg=v@2r@#lo;ZC)EMU)yQ%RMX*+CcDikjYY!Sm;<6SeOb*c-V|r?S~G3Apd~$Z zL0$dFu8^*#=7qUNd*7~j&|hDw^!8Bp^X5s{tQq<9En;ryZxm$saGKS!`o8|$bIc#A z?0kOw6`9I6nOpyXQ2FY>H;>}){d}K&|D1aIq@uk~SxcLb_`iSXbN!ib%k5WTZW9kB z7V3)c>R80{{7+kx(KZFuOuxHsF{fQh`i-}-M_Mr3?h=@Pb^p6*hhjSo_SXo{e#OR{ z9sIoP^;Z6441HFSr;}&Bt5Cnea?dLE_D<!yi*;izHgL_$R{s3zW600b*GrRm-8<de zFFkm{HpSRWQ?hhI?QZ2gZo>9CTSEipy<j$NTk~4w@&f~%O^crX?D`pXF{nn|sd8em ze(a;yCDJv?r_NQb`YrXlR_S2P=RcgMtQCJ=5xRTk(!aOfmsW3j-rREYSELH_w$gPs zo+|V%NzTqa70%Vl{&4%R>-sDW&f5-z-@f-Hw(ZKFEetbe&8>Kl5PzHLTjPF~aJ`jQ zsikXf-RLRMX6>xLzWX5Kj|2I|TEC`Fb&33)wWCFU&$LGS7wnl<H{SkVe}D3<V{fbC zCmVPR=eh6LkUR4gW11@e6tT{PjM*vQoYmWvT6Z0IogNq7wR^>*<B#tgJk~M!bHmOh z_kVt!zqZ++|K&E9H?`}!c~o}YU95I{b5*40(vI!d8NLOk%JEb_a%401ku*R1K2^v5 zt#kK}d$*k2&PZ+dQsa@l^ziQY-YpZBzuH_Tsx`4p@9LCAx3*4BdYL@`N3_wJn*lQ; zXX*c5t{dV1!+441<LysQ%>G!sw^gQKTY3HW`7f?6mQH`@Ij6UF<`<8SGQRbCUe)(f zGn1<dUfy9#T#}^y=hjwZN$n>AMX~Q#7bmSLo)WlS?!b{-Y?jfwRnFV@XU)8=rFG}E z)1O<frboPJ+%ds(OO5``Ma|W9eYf|OACNiuzCWoUz+d`L-t3$Iy7p(xH@oEh?(;ME zxHp@>XBAE3KCn9W%-SUzC;1qzZ1D2AzL8(l-uSV~4sJ$qyA2WdQYJOj@ujVwFirf# zhs{y8Qx&FZ`>dOITj=Sm<*P1D`N(rpWqWOb!kT~f>7On>dZm)s%jmgjm+VuH1tqN} z-+kw2xd<Kpn0|UDTd)1am8%xL=vaBFX+tH~Zgs|+C-)^}Io-M{-jV!k<N2b;e;)t5 zJwtM1det#&#rx_(cY<f1Q(_KVwl3CJqt#v2I^<mSEJmr>%OqD9OJC&EKax3f%0|PT zFU-0cXGp&)tJ890-ud^NFK=gAfKdOOdx`PP#}9{jyz;X0Tkj+?<?`{K@QR9)HMgd& zkyvx+vHpv{C-k#cT=~1;>h+5o5AiaHwUsYY&wPB-{a)8|qgNN6UilH`y!rUg1vm60 zYLwE`nr;~=|6VGz%)WB>{xhQADsFD=)p)gS=8R`2efaFZ?B9}q`ZH61va=BD(LJt( z`@`hJixbx{3T!>bKXsY9W3qS+-+YB*SIb#%Na$C+zxQR@!O62e=s#J1^#uF7vZ=M} zpY8qbEZg+zp8VEBB8LioX>_V&9~UZ{GWGA}7ROKX_I*|H@BWZda;(aUZ+jJkaEQz9 z!0(^WX<AfD@3T4<u3s;%wORL)6JON#DgW}!zfZpQ+#<5LZ*fq`U3Ra7UxlNlJD#vI zJFRYVdw1a*<2S*#Z=SvDr_SWF?Z~8uoVWJvHT{zAe>U{&zSBM%<;*Pi&Qsdw^Y(_> z=_B{1WXioe$8()|{`Dev^;*8ekB!=Au^q|UUZn9_?A!Uw&2IlBn`eru?+eRoTaXgh zWO94I_TFvxzqw5h(e{}9<aP1AN!1>8|5La&c>GdKn4@IK|4^iV_Vcp-$Ww_=>#yuf zcd)(i#Wg{SeREQ1!gbrUrHx!lkIT>A>9DT6C4TsukUqamgbvFkztF5i&%Utvp7T_0 zH`Tl?X82v*)+b<p@<yChY2))*o%`4F&E#0EyEb%jzoXl_`bj@8@Vu!E6Fuuwe$A0# z*PJWNJK6Ym=pEZRovVFy{Ml^vWiiGK|BeK7cNG@=J=0{wyv63p?yU<&4^30~U#@y^ zU;g*S&MrlU&nK|CPno3oR5M(<=z+<vtnFp5n3|t5Og|*OT%K$4F$HEN;j<4Gb*0|Q z=jG3zYo00Ec6aL5bAQ>FvK8;BES^4R&hGuIYqqZ4v}np9j^Gzl16oct9kme(G38}R z{To;8r1tst^uu!*60gKay>4=d^i2PKJ)U(p|E`^t8T>&r{kse0?;kmMO=0TA_`N2P zTGqA!vr<-le3qK@Qg^fDCC$eRr)^Wcc6ioqg-KGvjQb?+rfCU$eVx)S+!uZ)U`EHa z(~sl#&EWXG<ILJi`LQyMN1nd6QIh1^E3n(7;O_j|t9i>`2)#|rzv3#D_t$cf)r7mO zi`NFny`OyW@0JzYdUoafo$J3h{90`r?^3hS`pa?J6HTT?ZjswHQ-S4F`$f)Wm#;fZ zC9-e)QssR<=H@p3lk@#Lbyz-GFRGnvB+PVjbEwo(5vSiDx1OKuu*3iAn!8Vrl!fxK ze_^)0)7H(Byyom%p8Cgb;%6T`nzrlgr1)ayfA_=<?Z1RNX?+qDwDSJ7Udb=;lIqdS zH-9wOeC=h~_GQI^V^XrIf8=%T&LzHosc-tGN<l<Q>3T(gHPgiup+jP`{k^yscU2Z| zNxOFDRpj?W3T~D+pD8A6xH$PAmnz5cC$kRiJ(jThAd`RPE#5iLf6kh+vMQ?C@<(ob z`MgiF<_1L-r>|UHZpArmwUM3j<Pc$*CqHu!7k!V2w!2!Dd~2=2vc@Z)te#5m|GO>8 zB%r;1%|z8>3o;zO1(&^en{AP=+<RXjFLJL_qYkri>lx=>4Spj{|JG?QdPQAMUDM0u zxc^1fbc<2)-;ElQIq%imB&BoQbKTbWS@9q6o;+>K`W%nUY5jb5*Hz<YPyQtO%%|Y$ zvfWi1`X}FfD|TK>^4;Tr2``$(8T_MueBElYcFL2L6ZD019Aq|q{1MjnYU1-7GX!kT zUTO*}Ui?($<l^rZ&yM>E#+mg?+~0X3g41T@nyvgzt#`8?t&2G~d+r5(3zu*<u~!NE zEKlv^tq@x4to=JM`sl@LS<y>WI&yrLXZYI`%-dHKqidL$vMc<?^i<<n&4E)kg^7CI zz051ScfG<sdv>Q%T}#b&aXq(7o=&HC?Ozm~5gRDw!C5c9YpTn}kG9!+!rkq|mS0Lg z@7bs2ueN_vkoZkyF*nWLMLyG&YFj#lWwxq5n)9>KtM~3X&qFsHyrc|XKAHacL7hm) zf{r|u;LGz5T-&vuvukBrX!xeC;}Jc7qBc#Qc*Ry#cBj$H2bUYgk1u24GgS6GEg`+Q z^IVLoRU^A-{Q~E*V_#-pxgX8I`X!9VdKuSgAHSx(F3kTdB2)bom7ZR47nJxgL1KYo zhWPW0mZvOUMpCbpv@YCsp6mbegq`sG$)#(4Pd&YrD_lxsq0OCwYsa5Xe|oLa#3CwS z@y^MCw%c-_t*ST8XW2J1RJ9<vdXLw+4=(=uCshiyJpACb+|=sQ3<C`(^>&^8N4EZ3 zoBUKf<;<krs%?uUYZsnL{5mJ|)<>40+m&*jJCtpli`IqJH`}DXRDC-q&!mcTF6;cI z4HNQp3O+|=sO{<aAMx+<?lW%cvjPGhbc6-$v)6k*@AC%bUsHExU*5Vbuh~F7H$mjG z*`+mm(@K`Cbu&ECzgTAFTMx&b=0~}_AF~%Tav07#^Ep{oINe-TRfo%>T3q~?VTXZ> z(bFq?|9Je``}StthVm$3`<EA=ZB3laRJ)aFRdgobD*vtbJ}@;2ocp7{NqCM~)iZy_ z%_?fAc<vupwtj!!ddd~wvRB_(4`u#%?5A#VG$L!cm9XH0R)Lk;vnPHp6uT2w`9$?X zgoY#Q4Y#9W-C+wGr##_|){4KmY2}RTcG9~Y+jvwL2zjkkV^KMG_S3H=KRyNuKAXNq zN%+X@=P_6NEDaOBpLvsir6-_LK;_uX{wsx*&uzS2-z>Q*aQ)?elSvxQNx5#C;;&CH znej^N-G!5zRvqqY^Znh^z9fqyTFTVwdHu9MUD|<FU$13fOlN7@)4j$yR&B+fU%}lQ zR+l=7>^ySQJ)M*J`)zHZnx%o4rA_5IO{}~cl*(tEoU?AH!@tc<5&ZLBO|@L2cxijY z^`jYlpAJ1w^_*%p?U1nDx<AvdbN7TQ@pN=rhKH7~Ze6~+jF)>!`RSV??-VRHyKWWl zQLrk$IlaTq<NlmxQLUf_zh5~8T5l?wqUd!$^~wv6r>;Fs8&93t^zQr0?FFZK&6Vm; zKAU@Kc`EPXlk=7}Dty1w%eLXisTa3;1Q+Q9-&!1UNdB)%FSFCD<^v5O^BEkuZ*5uk z`a$kKo<CpyXwR9nb8cXg>7n0OOLDTmrrl)NeC}+f;zlb^uBE*@cOKSZcJ^#MxnAwg zwwnFt_VeBHmV2(iCvD=eLrKkl*`s|`mZjOdluH}c?R)%-Vr+g~U10KcLfy3#j`nRc zek_dt?YwQNsL>4mGpAagHZ7Qu?3M7~)VrL$`vMJfs!ZN9nf{)V61MnDoz{}b<d~Lx zp;w}R+A2krT*}Pizs!8U()Cu3f@gp28g;Ri9!>ljng_UQUBV-xCfBtbX0&?pOJhE} z&CC}G4gNa2uN!Xvy6W>ztNc_4tH%3nDZ(G-=`XuBr_=jPc#dy=<fi;pi%u8s;VoHM zw7{n&rg5#ffmOpf-dR3P)oGIs&pvSJkDrS`$){rqL1}T(l`r@{-QT}_eg21Oe>UyA zTsQyW`8mxCdjvfNwmjTD%Y1jZqV>_`Q$Bp@Gw)$K?G(Q0$W43KgA3>Q$x1c1su;{F zTy^%eY>SPDq6f$0ihX;ZMREQAc~7_O!qHBHy9GNM`#FqfpFQ&F!`x+6>Y8P>+<8Hd z&XiUCw#km{KePANv(q!WW_a1>7p5oLy5v^hdw=-PW-+F$<+54rp{kiG@3tKh3c7N| zfA18-jt@uw`4-Q3eD+h;xs}GTf2Yj;t-5yEolqIR!&mO6*Ew}u63*KfX7TRqht;uW z)Bb#3v)=m5OL2C~!$mRc&TRbibN9|O+tqkZ%I^L1?j8SpF%^$v`Zco;zTh?OG}tuj zfy%;Axu>&VJjjr&mfx{+#*f)PGdHY%5!1k2a^58P#2w{Rl2Z(?hD$yYzcjOEiIUot z1J@YR9?a0-j%3pcHn#6sG5cBMSEYrkC0FK_GcI0IvHQ4WQH0};j}bY)o^w{Os1({I zrKa(6vC+@6OV<v?YzcNVe>i2W^<AY~GxqYtz3dVZUb5qj+U^J2yt7o9UiizT^8U<9 znYT_R&%|$1T=|94kLS{|43^D5aAD&9y<$gY?m1cK-?{NeC`RF2{rjzXZyS5fZ>X)k zGJjF5?S6}y3wbJ+&shARu~cN2!u@CG=GJ9R(c(EUeWl~NL#NDy0vwXI-!OaR;JG|k zxK`IGXw#-kJo%do@4wQ~&oJE9x$69~e8F0Y<cg)+|MUKwnp|UL6moD?(#)C5A74Le zT2`tpFm1l@lt+FS`ukoAuJ>7x&pOYLJ+|oAFBOmaD0Qh7wf4ylU0aW?*c<Xc*KVSO z@$KX<OQ*&yJ$@%=<4V!zJ>Rc|L~IZIromVny0)c$Nt7|;zL>N6=h-GTINA&LeP-;n zQ(8Ck)hE3}Y3$nD?HR8rK9Dt3*EHi}{#s`|@96ZCe6D}za=PUHE4GnaXi;+WYO(v3 z+R4J_-uoov_g`$0bks^Qo>zB%&V>$xla;xQSB&==-l}-Ynr3&t`1InIRcmhvpG=MV z(C<_$aLOZK>!;QarPD&21Cpgq{1GYYVwSV>vV7lI>wWz_lk^7TLq`?8ZY=-h_g7JW z@j*M@pQ-Fld>b!r+5h``+lrKnUls;wvaVR^VcvS`!wg?Om7|YN=cO!bsu8yfcDXBB zTB=ghJV`Yn%1Q9?JC|)j|5ggiFQ4stBUDP|;>_%&?gg7BH^#rxWs#abdD=<W?N$dD zZ7$co$an8pufHvG-?QQ?p#i6sgzI_~zWt!0@@vAEPNj)lH|IU-47tb0^GZ_Cf_L(x zKwa6GcRRMX&*ixP@`vfK8?VJGu1@)={BgJX+?xWIwXRnmRD5}~WgBnOqF3dAjUFk= z3QZKsx$woWe%+U><^<hu3zoh0eqTN1cW~CqSywf;2%jli)$_7x^3`KO>yCe_T)lH+ zaD}<^%-?0D@g~Y=N__2gwkk~dQ++P@$D6oq9lEErinae9%u-xxndzKi+xqv*2DjRm z51svV>cnG`Cq4h2mbyF5d&8U0jZ;oJsvRg?yk^&3#U;YY4_?QbX#Ab{CZDnX<exdS z9h9f)#QKSaoKf}Lurv6;iN%-K1c<+RwZlWF;g{5`mYCwL+^dwsR^2s{p5k|G-C583 z@=s?h;aRHirJa2}tAf_zWpXDM-xhsRcFT3LNYT!@h7;1+{&T52Z4_RXH}UBDiuLWY zgqTB3&C>$hS1&)_?xJt&>cjDqHJoeJqRTQ1rBcs)URysS?e6jkspsZdxd>0(D<{KK zCfZol<hHja)!x)Q{<4FU;F|8~d3rC?4{(Z{mA2cW|0U+$XV0XY-}4<+pGLO`eh-|x z>S=aO)60Y92Q;06m(B2E>7MF6L(Binx)qA2&P_7a`4FyWe?i_rc#_6DUh$0C;;GxO z-<p3zbb^qLljPt1nu*F2woYT=-kG{e=*P!KiQSnooVf)`yo{ND{`&lnmwtXDl=JY0 ziv~Bhy`2@4ZsfPku<+28Cu+B!ot&3*y=AiHO*6l3ANR$-%Rk@0<Jzt3QPsIx3xAd* zwp3QlTP`5dp4wm8Uc?>p+U><{>y6h|9e1C%Aynb-kDT`*9;eK&*dA?LcH`KcEY;f{ zj!H{+g>RXA=hyUU{Z5mQO>hiJvI?Ia5uJ9jqab|dx+(4ZH)|$Nvlif4n%-@7eeQ~5 zGxC>8eb&G8?M-&%w*$9s-V*#4;&@{_lgol*CZT%otQG}5j5%?wU*}3!!?CXX(3#J4 z|5jUfOq4N^Uq7XZbNRPuo8uqE&)@F1)UC=~Ufi)e+=#344F8qmpE;YJ2h}I@I4E9l z6>iM@7LpX|tiMR@Sh|MMn_4fU^J^rFCK@H{&OZG;x*+L;lH@_R{~K!W*f;ape15yQ zW#6Y4Y%bx-a;t909!_qO)|6f@ELv8%S=dl*e(tC9$6s7y=PNX6IT~~~V5!=H|Hr1; zrI@j9Im6z&rQ^$lTN<+++5|JUMVN0kn1AJgaLVDuhZjsU+MD_{@>%c1Wn3qCzuJA2 z5LH*<*S#0d?!8(sN5Ate!}3HaL5m|fmw0ZU-eTf%!@WTD`WBV<>?J0ixuI3gPJh+I zCI=_wOgaDVskms9(&FIT=_TpR-)p2qnldYnO_gYk6p%cj->qd;vX6bE<>^0B-3hfR zDy-b4R~daI61gqJ9A7R?tv^-RzO#3}1KWqY>lIEswwZN$f_|h)@j0`b`tSE|bLi}t zeeR#KpN{?QtzU!g-dV5p;7)=5$0ae@9!r182kkh%XzkPI3;)&`m~7-)Ubpx8`RagX z<H=72um6&(2><cq+rfzcD_6T$@Lk+C-O{i;J?U+3V}#`Glvjs!^PJwZ6v@eP-)1mh zI5#^(>vx92l&^0yrhk_Iuu?W^_oE#~JXa(4#5-9h8p*W1y%X;t&-aNX<b<80Px6I3 zGyQIKpSZ;Ky!pkVm4Bx$F^qp1W-1U6X|-fSn9rloby8(>l3q%%`QH>+zM-l4RHRJM z8?_Y|O8L0VmejMS*trDkkm65Xem*;_I5h3Z>!7V0C%C)YpV>04OOy4pRojilM^`Uk z>x?_3X>^kH;eorw9xM#&wPvNwQcm-Yd=S*|XG3i8S-JPjT}vJI=QnM-S$}8$3&~wf zI^ic4OR`#A)7Mh!-sY{QVl>k<CTP=%J68)9N4}S-ik`dNR#3(%YmLytdv8zMcAcJa zjOkIylczd67p~T0+If0*(EMfx=eM3euFqAhn-*rt?k@a(o&DyWDJ%Xx3^-6Nzq!Kk zVYS!gtOKtKeBPRN1<(F-r7v~$iVmj*Zo6*0@Gt+7u(N&3{hvIOJg;AyxGm%8{EZ*2 z_bFxw^m%MHN^?|XjkoAwyVSPZb^c1fMZX02O3kxwuZre2Th951E7ktB+Ve|KGnEB? zFrIGQ{zLGnxUNL-x%rXjk1W{xG$ShhWqrm*nYFb)Y$B6?-CA~Q{<-&}ybO7V#Z7-E zE`5-*B&)v5I{rGl<=%^*!aH+bpPUri?0=1o)8WjyLc_+bzgk~>@K{^cq(1H8*^2MU zmlrZ#xE#LGb<vLg4Wi$YRIUYlvD+}A^2)E{e+$IF=A{d%?%OuMWc#Z0D<v-HlY_)_ zSU)Uy9BAK@R5QCNSbO4q!!3P3cChNWe>c?Ia#kSXh|=3FhkMjg93&OP7qMJvYg=H> zGjY4~%-riCQK9+KzoLqNv$Sr_Q@!<Zm(Fd!{t(_(TOTjEyxH)Q`7ZZ=sV#R4_pUo| zN^5JT(4Ln<u^ZE~OpJP^4rpX6Wlfd)>YQu)A@}>@i|&E;S0?R0e(-I+Y_9i((^@+P zzQ{%X<BVRWmsBZoN9+Hm-h`|#FT!J`uY~Iq_$1!05tuvA);jWW%PGZ8;b~jWoLqXM ze;e~#y(OV;VaCpXR><YD9*o(s(&)YA&s&dH>1I5bu*Un5zj@#e1KS9h785T9J>Iio zZa4am{;8TOk#~BTv%Tk@uH1bmr>m8xXWesU{hsqX;m%j*6G=CZI=O1EcYL^n=PA?D z6CY-7P@XC6{HLaHRgI&K`f2C&Tb{OVpSpMJy*S3LySC~2{SPm`_BHV;|KtOwUa~K} zw?=kfL*e<O?w5}*_!==I(qYD#3kI7UwQ4+Cw!MqJ|6J$&zUWsgeI-N_f=ZsR*15gw z|G_gs{}=4%zY@a~#-7@_(~`G8t?*fK_`UgBUo`jC@qB+3{HD0_<Nj!wnOQS>D{_xz zUA=u@*GGMil^kn^1lRo4nyqg&qTGWo{tgz~U0HP^lOwK&@#FG+_cA0LtlQ?L-*NUn z@#%}d%;Nm8gA41u*X-<8eblzdLZ`iNy6NNvhin9xUfn%XcJbJAp*n8OI{P=f1!Fm{ zuUYcTX~WOSj|!^xK4aHy{@tOr<m9JKmppG;Sbtc)_;Ay5XZtfkmOR&Nyaj*GNDwmO z`cidC_2~hw$7dN|ExB=D_fE*s5+2UQTYWdLVD?RrTK&iLo$_+y)gKM|4i#xC_BfxE z+tH)aIGtnBv`hV`bypusYm$@iYBq4u{6AZGmaJn|yr058(=$H>?|)h}^RcPvwTYKb zrS0-QFvnTmtwdh?uUiOnmrmyEvg-P#$&Y>)9$}o4Sny8nnlX14r^%<ElNGf3nYEt< z+0Jod`q{N&IsX|?gFWoiS6fY3Wcuy#URB3{nwv8>^fPhSD)~H=nb=VJtyoAgaIXCe zUHi5LyIyF&ID2bi$fJnl$rl}u?wXQ$J8A77FRQxq2J;OHg>#d-;}VoF_AxueUf@Zn zJ3hzzt}*8v%jM>5x%(&TT0MUy{UR%*BE41o<pdscMtjwcvo3kZmG_pJ%@>NAd1USH z;K^-MIaUP)DzQuztxyh`cUsr_e&gp^ErAb9)YoREiR6WrIWo<&v$*u+{NmjzH`VyL zw#;Jrl{Cx6;-Guog8Wb;u}uaaEi7+tYr9!=*lAVBXU^WkA6}ny{<qXE-u@87CXe=u z?`@x4ziG2rRdCh@V?!3xwl5}3n|MO?%nkNQ8f*&_Ihf|<<x}doSc1p2m+90sA-%e@ z&t^K!sXy9V_@U{Cso|jwrAnQG@o9~E|0C{(RmOx#H)ZbIr@xu?gRcF_={%n6GFR9p z70AVMJ0xl31c+VmWdC)wz?@%j0e7dA{Dl6=nj#S@J`o33zD!)BEuB%a@kOsccWN%% z<rUAFB+m%-i(02JT&olltKE8f`IJ7tk6r(ImY9{Rhln4FE0vbteex@hqL_BbqF*vu zURxJGmSLa2e{1mXwH&dj1<PJ&>1Aw{$(g$TLcu}FwCj=Ix5hlPYEgAcb#r;eEy!#Z zZ@X&xZo7uSi{7qWF(Mhk$=g@C>{p(wn#&ev*;27;p<mOXT!|fDo^5np;AQp8Q~AI6 z^cXkhCyykaxUB#As3h%~RbBZsOVKXjW!I-|+v&9`bM+bd&3l%K*nE+mtn`~z_8*_b zWVJI<daIuQEeO%Q=@BPWZt>dH?Cf%*NZ;9ueLQ0P)Ltr=GN`&<@$Y$WKUttatZ1A2 z4fkVPOoW4++a}zYyl0v1omt=9-^iVHtE+mnB6Z)k?UT&{w>lem|3Bh2bNh0?nbqrh zy1VACobA{zR`dU{_e?9E)b+mK4%-;!{!P2{F4_OZ^fkw0<*G}cDhgEZce=mj{K-TX zIibo=%<K7GJkHn%3fPL6Yh|C;KBm0hJ~}Yr#3wt2VxOnCw=ZA#O5}7z;`wzC`cDOK zKN>EU^5OQvM?&)#2kgA3{#a4}|B3c9daJL0^H*4`aJ1@J#>oH^!G8zbm(QDEm~>U; z@KLQD|J-LV|2i1cbo%zClXDwIPW||OpYd4lyC<H{3-154kNmRp$^)@HL-(~t!pBP< zC*&l#{5WK;Q=c{at%2s`^PHt$Dx?-K-KTm<@I`&eyeE$(G{paXYi^U+RIq%vU+m-M z51wu~r@iHV^XiS<9bvvdlZ9n+s&$1b*Dm+VQ7(AUd?R6xsB>UyetsF(u@H;;N1Ltx zeYC%p=OmToGizxM`+mI(UXr`h;?JtOpWpoCO>X2pxf?+W{PA!8T$p<OW#BhIo_n%K z6T}ULS1MgN<^Jj1IS0;b&hzg4x{?~T$lBqcQum3Ib9FwsE}N4b>HVKc|Jt^vb&ctP z2CUgf=du+&5i{4|D&4jG%#3~^dzO2(#vdCS_d6Fa*rwNWcE;Csq4iePrJ?uO#l-g) zIUjXn-kzU+aDSKA6#mk!CS@DCVwj$O+r*Oo#(UbKoVtg)t0z|dEf=_YKjsgI<VE3= z?q;bHFM=0ukBJQVus_@;g(GQB^((P$*S1Tua7Q>U+Z1igFFW_X&jJ&LS=Sb?xmfDk z`~T8^eWgc#B<}_4u77V(zVm|A*ZW?J<yYBED;K}Ikarm`^X9kv!uB>aM1{p<C1#jQ z?{Sa)vNtHF^Djf^ukR*;%U{0djqKo_y=xBd=ZpMh*PnAU#HO>##B%P^|Ml(h>y>-# zGU{C`^<Q_y&HuH&*DzqqtnAPCzL@XZC^6+-#FhBCcPkR(b}QFxnJ)C{>Uvr6NfEiH zT~~#Fuu=`F6Dglr%&ND{M$~4WifXaWJd0y`6$&>u+|6z5KKGef`^V%R*LoQ4tSJ;( zxkxMjSoaBj-gka_vz|rYy<S`r{mRck&*`5<7H>ht+D9!H_3oV6w6{E)`%?evO-l~P zbv$#D($#sF@qOZYnG0H0^8~N$-?I3l)9F<#``$-dieFw=mhty>Ptx`&l1k6GJ1to@ zn@;|oZ}=c-^9psYpUc_}8}9!3)AH?rrPI-?T5XO7&!aZTaAbFt*cw|OyR))1?d_fA zQTc}s{66#V#FjI1lfN<wbDw3I`fc&KJ)TPrX4l5r#zrjNBh&e|H_dYSJSo=}^(EVm zn=L5LIAmlWR2k9IpMU$+)wy5xE&VTa{H^%fYtEYSi(-R=4jP+yxITNmYx<deM(q#Z zr=-uDdGwayXA#wl%sIOw?eiWBKKg!}eVO}&@|4(j(wa(NfBj<o`o!1a$KALe2D9e4 zvDEBYv!i%T(xD%BuKcrU-G6TC!=(opWD6z#)*YPl`uo+Vp0Y(|hE6Fi`6<b16-A8> z!i(ir8J16zJ5=m(!(`Tq((^wQWJLROD-@5u{Q7$PT!9-xC(?I>UcB%*%sBh1o`0lf z?!@?(shhpH4|tmFcUz_NRib)J%!7)1%Wv*kxn1#^j$1w7?i<h6mlvAxFh#%H>iHw_ z>Q0qyO-HW2HlHJB_KU6j^3Jr2@volCq!b5QO`WNlzw6D+NTu_93KMGIJlOeox(lQ5 zv&-$znp=}I1033mE@n^KkakPebcTP`zNGUK?Y&!C)-2hmZKSWAVjFZzRODq=?nxmw z1^H(iTh6n8)n)G6dgiqM`IfJqX37ud#8mz0_HZvw<IsG5$8U1w^kZk&=oOYNTNc6R zU%|;0?(x5L%g#<U(>#BX^HG<!oZP*$Mef)4$A^CXczEaBi5BKt4gFusDrf4poms_o z!E5qH&o%WitK#jQC3)?q_$|6^b93X9z?QG<_Ah2W)!FoEo*UaF)31M1?;D3NS(duX z{@sjMTqa_7-;1AG`}6BpGusvAeqK)kB91ROJ(>T(E4j5Iwkr<DxAol4`fRBjulvv7 zkCD-XjbE#$JDqX+=lX8#6cM|ZPekN96fWIVlx$E{*d;Mp=ZH+>!Zf?fh51W<6;Ac% zoqc)#$=Mc+)h_Y%PSfnIr`s>sKTZGeQTKBZPxqV%XZE@j=kFsJev~<7PhHW(b3IQL zeS&zFpDC~8iCvle-e89Dg&b`SduiqKhR4?~bu+njMLj##Z~l6l%&Rp)M+{c1s);K- zez8I~rbm(e$<f%Q;sIX!OrE_t_fN9JxjS%L+ali+SKIPD_MG5Y{9uk>)$hn>TZLMK zjIGMwvPvqt2`~IGMb=}>J<(qu<37~XMSQyUJ4ISywUYOZJ&Lcq<Zou2jeNMrMy95H z<%Bu$8@5gUEO&7R<BBV)-yS!9i?|ZFacvu)QuH}t-Qdy%{SH?3@!LNzb?oO}wqtuy zn}5jLlPfZ-F09#gP;bHS4a+mKre&tREAX!fzxwQ_uYiQU<3WbkeV4RVW~&q`udZix z+MZlyHTQtG{nMoW^*i(z9a<dbcF_LK%`<16GV8D3J>{1-x4YT?TWyKE>q7Hwj)xvS z?J`?&k;TJTD_FW#{gS(}uFVXoZTu!%^FH7CyDdvata^uFufm%|roGn>-<zHooc->5 zYU}<bY8toCsyxhmxJ_^J*ZtuiQ|EHblxkn&H*?nFH$sP}t+wU3y87C2XJ^LHbkj<y zW7n_zpJIC8c+IzadX<7j(N6DPt(>8pz&UB}n*^JU?voa1-d)r=UFPM|P$4J&>F07> zgZ`QORvs3e{M=w|@bcnwtEQ_ens_)>A67jz_udqhhST3TTaFm5RJ!ic(zNX5%;*;x z!TZ+jzNWfl`vp7yxf{AVdUW(xur_bZk&~C(F>BYqS?cc(TvC6YvWs)gp|o|2&m`X! zThQBNzHhro_x<%^>VLJid3nz%f9vv5WDdK6c<c7wOGgXUCfQw^^ibr{WZuX6r=QDo zoOmYev;J|`x!GnB!r>2Zci3%sdMJ$R?X6d_{I58FmOBe>YZ23Aa#9c14!7cOckgL? zXQH(_*5=ePAEEdDH7C5Ee3*LKuu!v4@vZP)U-NsbH~&1fb#aEJ_`Aa*;p-VD|A;={ z@z6K=W4O<$t>+Rq&)y&NI8(jKRcxDi?jBCw>!D7Imh9YUv?_b;tDs{lk9vifEw;_c zkk-1CYxU;l^ZdZw>2kWJe~x~4X}UP^d6<f*Aor42E1t#1-F|rGb^FnGZ?Ye%e>y$o zZ`BkF>;0v^1tp(Vv$H#PE)cVodBwf#p;(QUiqu+RRf`PX$#3@aE@}H{%093E<0a#Z zKO@d>m|9<09<)$=d+(wdYgXH(736Meoq6ium!EsLecSl|kjAPKA>l0(_hua0ecw;Z zjqUQU$v>ssf4H&b-_yR7ufN}2Sa|*&?Ust#=w<wh+jj_C3OBXAn(ybv!~QSFkz*py zfz4-s?u*v5?cFei`&!qt&8;idg3?~88~wI<zJ9|Bme;q^h1E7^Gb>5_`>4SGVbR$- zq3$X6wwvR(+jt$i82)zmq5V#?Pl|qgFiB%VaD3y7z6{n0{VUFQAKv;sUdTD@S7y4n zbbgG})84CnKd#(P)R}d0-oHTk2mIfX;$O4ys8#>5?fb79q&-O?M)N_ZoS&viU$9G` zu4C;6&3Yf7zWCE?E17v#%dGt`|JKk~y8em3nUTdCgU<^L_wio7^runs9Y-qP&a2y5 zo7cTFmeT$4eyjZPvWrXKe4Zd!t1>HOA4h0s<bx|y)ET_e{FOTooSb?8=95LM-=+7I zww{`s*=}pLV#gZCav{BWkDglpXsbJ?Y8<$A(rTqIK7l&}MAsNwM7;2=P`Ldn^n18m z?1`@$AB8e%)LD}6)ojpy;%3M;Aww^$|C(ruN=U_z^ADeXtJ@&0IM0ChAVc{BIcZCc zrfa7oJdF3ed41N`k@c!r!o5c^(SP30d0@}sJc}`M?NJuvS8q;gg#ODj-(kjj=h~a- z{Fh!%Cb#b9UC|b?*!5zy*#0@ym9`Q6r9q{^cKq|7)P+fD$)8R7xMgv7dd$X{Pxk#+ z<X`3es&Dc-8>jAke7$9W((k$dyzgDfQny%Et|9qlYj0)p(&8tL&w5Q3-P<+ORC&99 zu*Q29NzWyfO>$FCb!uw$Wh8F?S-aR~&Zf8zduC>Bt&5u{BCxH!Zpq&rrXD9Q$;dwF zD>!NYN_}rHZ}!1TyEk3`T7*pQU$OjfaPi-7L8eNgqFf1y7G6tibYneDPISx*+52_T zg%!<4D>eyD*UI^+eEUv>>$a^1#mimu&pu?6yI68$j<itDmU~&#VpR4_crf9v>C{fv zO@ZR=Z9g}69MS7fDEoN*+<g1L0<W)g9)2FaKqCB!>W_@lQwxeyRwRCZaNyrlE7zP4 zt-)7Q<{Z6{`Qzj5@OyPT&#iE2e&brD|M5c9+dDfBHg9wme-?Um(sThWD}kVsh4v>m zn$CTF+xDf}!rEWOyfX^pcg7W+3T$1l`g`lyWR1IB(<S@D?=Px-eY|($)!L5tr9U>* zI(o(YEYuWM?syXR>G}FqUmuDmB->4A*z!-_&z0ZqTo%XjcJXODzi>2LXM`Jc-Km#Z zJ~df=@5XyR`n&#Z<4D^%J$18*a#UD`+fnaBA~p%CSH+fy9^kyS@rS0=!<c!h0UmGm zUaej))oUH<@X6zxhEGxSmd$I|yjv`3`J?%-72~2=&EH$LwOw{s-|;z7cddTjr-SF6 zy7q0@a=HIE^GR9VOJ7c%P^b`+^>R>tvBF03wzgq$-n8Ub92K?a<)$XcW&HVV+}&;b zee3t9GMiN_GCy2>v&4Gmw}-vYR!Ytj*?O7h>~Z5SR+9By>-u>&mY>?P)jx8|gnbb| z9~JQ)=w6d{OQ?<UwA`YYRymVD74x6WyD6&VsdqCoe6H%rZ3h-{=PX#W`{+@5-g~`M zk{4dPyHINOIk7%3#_YFK?+dbC-~Zxc{#vX0u4EO1#rLPhWPf+G`c@+Gu5_XMF$YeC z7w>f5t_}A0lfQOXVM>yxYrp;9)km4%`uWw}IzFe+)W6hk-K*#+`wtsGI+hb25*0rE zs|M$#$*TNwW^8+VWaHMOliY5pxkO(7;i5NJ(U4(UWLKHmLrd2$!F4M>X6Ln?m+C(@ z<Ad?{cU$J9P5$N4T|Sw&y~sxQ!p04mEAJUNP0!!`gL~?F2FoLJf{p$QtvSEOyKjT) z&kE0$?C<w(g_p|*#_jJvW~wtQ^<K^SJLQGJi{`#bc>VkD9(j2t-&t-;<37B(_e))1 z*OSYtPo1@e?&?oZ<H`(Yc=#j9T<-8h!z=H1B#3|e5_V~4u!GS{F1hwRmYcC#8nd?9 zS?}K;%5!q#+bP>0Fx@%wDlIYWj&_OkWr2|H#<E$wKQuQ5-(DsgSiRaa>Os<}569L^ zhrC|0&Zy+Zfr%Y2s^7j*{CQx5*^kHfrZJcW9IkiVxZ(QrNr4tVFT%MMCLii<Gd2$_ zE^MosG2u@4h23dWzbs>mvOU&2?{A{O!3{}=51)<TeqQByUS4Ij<cIA2S35+1eAi85 z+C0nn`Z>|$y-PG6?ht199KD4%c*d*%!D~BzpFOQ*8(Q#-?PcmqcIRjL2Yw#1_}<#I zYQrHnL6giNOI!VELGzm41~o`Mo4KXePiI!wcO%B1(|@UP+&kEnloMXJ-Pk2sVaM<P z3{QA(q+>ZP+#Ks^;U<Q#Gr^4%j0`OhT$IzojVvu8HwJPMyfAP}b!tfT?OkT?-uXo> z*s)uLKhL#W#J8ZlOQgKKT>srs&3EsP-qn0pQ}Vw0{mth+pTA2>o;>yWS54}=scTwZ z&7H)xnB&AT0iDF;w<k`VI&z48!sPI68;v%kr6!AP-N?dtV@5=T#e@|rj=VX@)|X~> z?GamFf*r&5#hMNmPki*fD0kr4p+ns+tP@zGo8R7_q0q2U+ClD3#)4OA+-a;AB>u2Y z$&rzf<mHvQcOxNN*f`tZ?d+}@y=!Oho!PnavApz~o}PN0zZb<)nNCPZMBdn85ix_2 zXN@C+q*|p~LsRc*>5DuL$;rG1EVHE|q?mJh7*{<w&tNLLU=x=^P-LL5XX~_=XE$_B zUc0vU@Bbr8%NDItJINp*9vHyNbl?>agQuzJRr~d;5?*ir;VZ$wwJQIQece5l|0_;2 zhq{KCPHk9orv4g30;@&yTiG-JcKq$XVYkPX?MHY<{;Ff&%);s|87|DQvby!j(0KQb z9R@QkEG>*~-k5E0GwPq{{8cMwG9Ng4>>ksHvMub<P5-@mCY!#{o!htU!G7L9nw$>j z&T!<sW%##PCGoTQ<yX2>^S$y*j{oO=qbt}~pA+>@m#=`K`TyD8m5qnvcNKYg6)|Wt z8)v(3*xI=D;_L;B8y8PzcKEM<>$Wh@qJP#71`cOV-uu_j|MP$9&HwXf|L2Xp@+>#i zYTCPbY<mAA4Vkmm+t>d;adyA{?Gwjt9XxaJ;=}yzgoceXRe$(@;j7O|OZzMC8|UH} z#k6A4DUI*fDz5c>GRwcYF|DYi^pE$iep|spOFIUBZt;ex)0q!^y0*k2d%}#~saK<~ z@Oji<QqTJ~P2F9(+Wgu77g^ld(&E|Q|1Xi69ogLTKSlOQ%IP&}xoOW?riuNRziBRX zX@7=Vf;$5@Lk>H`ZmF3@{|mo{FaM*s`Jdwcr3WtGy>?72At&J_!#5LSw*9gb?#S}Y zImqB%t-fLTZ+prAeG?*fGAbA=AK$K4FD<fU{~GUT>Dvqy|JC-pe%in0zoz}!cxSKQ zW(yUhv%Sq3IC6T9tVwwM;~J02|N68y_BEaskx^O_5sjJuY#095Oif5ld-?5s(SOB7 zjQ@nS&ejK-6;CiIW^JBwMyA*2|G8K9OETS?w=WalXtt4Mf9MnaNw?-(ZmP+?vEBFh zoAdKn6H=Z&`@?@PT3;$MqFGjkAtt7N<AHq3AN>{gh5oBYF>GG3WY@G^9DnP#oQ`*L z$X1q~Fmo$sL+@nngoOP32W>|_U1QFfGl!x4+V(KE#@PQ^LJY=}xAs1s&2`|~$&11X zIm!KBmQT2&!;sc#zhu9lbwlK@_zvy^I^XL%p8E#9jPGDRu;y2N$8_lfIUn?oa3`4k zvOjX_(=v`<>?y1U&Howi$ISY}yzi#zU-l;~2DAS%e`1)S`=9Z?OypngP5Uf2{bR2w zPWjA#f-Pa&Ul8*@|Bq)U9?E~necAWFA^&ypuj{|=rTo98E!&gx=6~F&{o;Nv&-Z=3 z?y%|4>Pi1MPyOE-D)Tm1=YUk&g6)@Y*t<O8m3ezMW^3fVWu0Gp|9$&$zdZimS;njT z&6?^ny1Q=e*kxR_C$x8BZ@c(`Qzy^<6|=P7{(S#SslR(y|1&+Auls%fkMq;m7@A`b zx_NXLo4Nh@_so;GQ8n(sp3a~Mt+-{6jcg8{H!?KnUMalx2+O0Jv)><d`f2BTFH`<g z?vo`y_Eo6<h!C$^_UZW6n#jL`@pg5rzf|_5K2Uw{+QTLyc`hhD=(F$S_z!xy_5Rfg zlc%nZJYqQYn#^S%wg726k;l1jcl0MnS0CNuQL{ey)*o&5YfBT_whA7<Cv>`$v3W&r zMdBjfOCP_=scYSNu>6G5-7R%_3imef%*hRBZ&Q1z>dM3VGwEk#Q2+DF$?m@;HlAlM zT+bB~5FT#$Ig+_kF0ZmzXeryCKR2qHvaUUHdY!&J{}2D^uZ>ZWMPgicL_O|Ytj;uI zvemO#acg}-)!E#R?@V>ZuNO`!*w=Ni=2Wfsx%6(S&EBEzR##^nscTh##r@jEA^Oqs zW6W2>=Vl(UGuPPrS^U)f5R2>=>5a!5PVL~Ad;X8j&n786I+ZCX>{)f-g^QAc`bQSO za_}wI^o}|GJMyK7>f=RR-@or|IUXG(J7-JtuAY>`bv#r2uNVC*d#KK~peX-b;HDi0 z)A<j_9F~<?-K=N4Wz}!RkmDEMEVnpY`@Q%p7vtRaJ?S;aQf~Y9m<gVee8il^yJ+?8 zr)nHij+zyi%!_v1c%SKf@?>Gnc++h)uA2)M{jA&*RKKH2=c)Y1!?9kUB(F|-5bboI zcaxaOweJ;cat~GBp0ByMXw}9Si!U9>IOU$UKPu6A<2Hpo<<qsxuN5fs2cGSE`+m-c zLroL+#@Gm1erTEe{`<?jGq+z1&RxG^*^9p#NoV?<M9;50VQo8m`@!G2S<<1`9b6~t zy??dDV(Hc!ZPPw){H$^4I!n6b4DsUvhlOP|XYovTe}04ckoS^byoZasAJhrnkSx+j z$cm{`?SA~urgoylOcvvSnNPhxa;tabcNO*Au{fOd_IJ#>qnFZj-(_)1PAJTjI(O`O zz$0Vk*)kH=fozUkTH)Vi*&gj{vi-c;aet)#CzIUZ72lq_v&H?6xo5+>CTI42R&!>t z-(}Gvb-O2bE_33U&B>hM#Cag)TaepMCkxqM=QkB42kt-e>_H}zWxD6g)+gaC7oP3( zd(~*Y#d*fe!gx`U*jIv;N}uO#E_yKeRdKl7$JCQ2!gIEsv;PpXu}yYU=-CHXcc>rW zX(_SY_+)1Ml^p`JvrbprE^lx-u6kAJe0k6G0RN3PMw9Dhc|PPv-#Zhc|1|84fvo1C z`;P2<H?FU~E>&CPCa_dZHbYip)r^X>)@~2hwym7|?5sdVy8YkJTH6a)e=W9L#VUR| zG^VkE!O-0O+H$eGYG&{L{Yj8h`m^@a+0)aw_-1%LY-(GO#To7NWf}`>&&m)*mCNhq z2bG*yyuO>QX0EN7eB%DA@s)<_?p%*9dbt0|JKMuri<d?yadXZMt9iqAaN)JzZ#27? zslE=BN#$qD^j)DFa-YM0ky)%_`2j<3spE5|Ogi)}Ytq~jQ?2?}J1%cf^nCyJPUUg$ z<2|dyXNb<qkB~l-erS4%%jUv;Q@r2XzB#nl>*(I_^((s7x3Ma2d|xOzkxQqrpy>Uk zH?6IWX-j8m@u+%AIb8`{KX>sr@0RcDj&@%*F|FQVwphE)K&*P!{%c$N`xD+=tqM9+ zoibt784iUd9j`y<KCu;&j(Sli7PfMx=#Jx0QWoj|<J#Bl?_8#AvE}=nbA1uz+aF)* zOFEixb<fX3K~vl>ux1w?Hs;C*jNedMuM}}D`EiThn(&!F6farJ7n+p(y>w`cNlboL z?ftyUQwCoo4(=)X5R*5-xnl8-Rcl^{S1w*XzuB%@D>Plj{?t58Rja5U2eV_A=}Z*7 z5%FyIOyiH&OTM?5-CDK9A|>R0_q#P)&dGDVvK2i1Ui@6UPVbL$Wz*O`JGNwwu1#N3 z+ppR#S|fJWqae}1tFHgw!8!lqbmBIYoj<+F`q7fsjVtdSH9dFeTVnIdD&w~MH;uOM z{O#zwyz*tzk7b79?=}5|!loXS58pDi=I7y0VJB{++)2}T7*S>X;-$x?^o{l`@hP_L zk2czN<^-NN%lzsB|GBAG10%ck7(RNs)2*93;@oSq($KE^?v^2|WhZDPlzwV__vG}! z>g(P~YP<_sA0IiIz)`5Ut<d<b-QUV+&IvQ8&DXrL+b&Lj-So)tSDhQ>=5Cbe<2^8! zukHA`b-GL5yl{6BEN4pouJYEpef2k?7298n-%Z?jr7)*jcl+iSMMt$N7T#a<c<Q2y z;&1)4UnQ@+e4qI&SMt5k=uQ2{(!b<>e|W_wZGJ+n^-oo?EkT<b%YGh^E-*@PJegNz zE|Q)nxIIf=zWmbnDz3Tv-l#WB3jaFq{0d3toy*SoJ!`)uRI~kYWzd$N86_eU=SR&p zFumV@z}n<*d9=k9(d!ZKmrmu`_rxh(<4RaN`__HY4Q%s58Xxif3HGTomK417DpAAc zM(M>z>t#b)S6Z#9IaM8h@5CK3k@#v~muYWfM2hBq3;cX~i%Lye->e>%L*9D|Ue;%} z>Fim|x3-Qqsp9&%X3eSRy$eiNWX}oL5V5#Wbt?A3ABh7x*0N?N798sqagi}zV#D*T zdctPLtrul(|43Cmqirx<S8L&}h|(D~&wlRwX*%^t=EbYa=G~Mvm%hK?l8MdHS*H%1 zRMMK3?|p6i*Gl&7Tb^_qJ4NjXt!SSj=zU0dJ$D#8%O<7XPw(TFd7AP)d~u+3_Rg?4 zj_BU3gV*M^{#EYzP`<tLjNl4syVeMKrTo&m>9e{cYxV?uc%%LQ;O!}%-j;!fY<_J{ zy1z8HfJJ%A0RwK)D>?r|f2(iI_$wM2vcTv4WtU0nuWzn6^5Y8ctH(a2kF9ua`exLo zM(sIkJAI$H`n8X`LHzY!dxUo$Q_p%?yn=VmhTlC+itC?hrTq0hT~x#3y>jE8@Xh+W z_RZWq$w}iu{<*ByzS1?PRx_Kj$K1a7^Rim;K8vkEXXjsQ>iBc)SXhzXbO$k;D<)fP zGxfY*ao;^~WwXWCA7@rx`;f$9dw<IspA=R-kB4VBUy#k;pS=2y?UQECsk231KFYn& znUbOMWqX!cxKZUlrzb3b^;xad_L`^1n<pB5UglT6-_YLE-u!B*K<4V!CAUg#_@Wq( zF^25F@A-}IOy1Ih@Qtg_uh0>wbGMeeAHB(H5eIM8J4L3-T~FUeoXRr2!tnjU)SFB1 zzm9S-tFyDadHgy5D(#~iU)Kg$G0R-fQ(W*}_lnvIqgP%UQ-oKQybz!KaL%TU74f?F z>r_jG@Bb)$C%|#><A$xdm*OsM@)qTaxRZ2<J?W>`gtOlkaB&>3I}`Y-)A+QL@m~c4 ziL?h2zxf)c9C>N9cX3#jio=5+qUuY+A7m^xaNEtoG$(kGNb0Grrl*d{SKRJQ%>MsW zDRJeYi?dz_2xOKA$|%N%pJ&pZcH{P$p!RyV2`4|lPFQdAYW>Mmxom+C#Q!8dKYrb9 z!q4kv-CcH>=ho&eu}yyWZo<PD9lZ*d`Ia-~n&K`^pA&NN)ZLhCAL0-0m47KC{k-Z? z)Rfd?OfC=BU(M^XYcJF=ZhvDY*Y`K(klwrugY)n7_89QpQ8J5rG3$Q3)|Y83e{4Fq zd4Bu)C6$sI|2{6xY|3qJx)^)-b#iu4^wr*?=yU7MEY40}uWKK>bXDcmyXsR;-u|_` z!2ZYCJr!T3p4?=eB%yyq@OjAT+kMl0eyH1M-#1*omuFv*#Iy2yySyu>$@V=C+<Mnp z_xpj1@74Vj3bP)**{YeRd!=LE9gm=gzvo2cd9D9<O8>M`cqG$;>(O6-Y<)6UtiWl> z$JTGzymvZp@?B1NyMAf({P~ah1Uin}My@jzNdInW`{aex{(|2DM@}bZUJ`A6&2f5) z&yTyJMZtI8-O-w>zchNv)8}tblnX8JRhVm<eR1b<+3eHy-}IL}%DwFsro(TxLTc)R zSO!&7&J_=4{IQ<$?CY#$!qeDQj_*GGWQWlHW5NMj>&;(S_#S-3w`udc)@jBU#h-1B zHnfPDmk}AEc4+Il1tu&BQy;J^Ufr2(^|I%z9(&s*cSomN|0U82>MEJ6#3g^a&%R$1 zwa2!wtFJNHY9V(|OMt+~FNU}76_tBm&1mZA@AmDpTV?y+XsVB~m1lbGD;4><s`H9n zrpGR2`8MxvRo@b()#>i*SzXI@_d8e{FH_ey72e4`bIMf3OG};eUnW{fybWvf*SdIy zi#>k%hT<maIVEv!TW!wDZ@0L+a<S#1rRyB!HqDc;+;XRV*89oKVKeLRPtP-2+~Tup z@)ed(K7J>s#MJ54_WoX|cRAodW1RMP-&vDx@4dEYPe}TMM~AD~9xt-8*~dSX$9?9U z%x-ITA7*pQi^smI^qi>N*_Pz3{I6Eearv{@l$L;#dvgwVI2XN$u@0T^u;G1Df6@CA zp#zeiKQs7Ct^VpJ&Ji5)eBP9h^|y|fJYA5NK9l$B(=Gc7{>|#(_bvY+^ytq4-S<KB zvy=Rq{@SqGetsGn+j8yJ(U%vKZWX6*_fNG|OnMT2HM>J6d=dB4;|HWKPQ8$zebUA0 z<JZ<(%KL01C;1lfPdvDYeJ_`l`PKPmKd!Kb?9X*Ib}wdnSm?0)!*b5OHy%7N-OI04 z%dz|}_kpamxaIc_A9wk%-S)>OE&ZZb&0$ltM2x};UT-_;b0Ol@<YfXZ9`{sqx&ME4 z`QxP$_LDo&aO3jA_U@uLQfr<%M;4|B#HPPKf2o(dZvW?;!o)puBytp;LT|AsbAJ*M zTQTpqSg)OP?xLu`?gtuN+P$f1x=U~6b4O3NWcJwo&st4>-OSV_o9|b%A2(gkI*(=d z<1g#J)NW=e$X{LRpi(0sc6+YufnCB1A5*Ig^e(mP@cjBS=Zds+Snyu9CPnw|qMfeC zCaOrP3Wt3Rc_hFe^6;<EV@<aG+rEd2<zKRQ^17R=zU{TOm+iB+H^m}19{P9n(V|$@ zQdP!`rUz>t-fa##r&;oD!ogK9YF<b#=`0aYUwbZl;&!g{9J7z|*7I2xT4nz7j+&4c zVzbz=ZFy^u%Y~SqvR#wQf)Cwn|7>yPm?Kxs6%obX>lZ6ucs}72^JEQ!Q#<a;EM3~W zwL<5S*PONIT9|5@%32j&t(OTU$M@BBhUIRU>M1hil>g>S{jODJQ{3fWSMSKm+Zv<E zYQ4d;YpeRKm^lqqtb(1BL!8ri?aya;RZR#wePNza`J{lOA)1ALPa+pu`zXmg*LR<J zHu}@{jyXo=-*jbOKfmg|(1rPZu+!#v&$WAPFE>nG>KOb?s_+l*@ePe9^>enUn9p!E zns|Jxm?U!_SBQtET6OOU>6KA_Q4`CJcP*0ZDUb9Id?WWzc>aZlT$a7t&Cm02+`YB# z-u7QtuTB<H%<WA)$R%&0kvrdPd)NC<wb2WoS*C5sPjlJxws~v3dejpYGoJ(ld%xA~ z+ACsW{%}s6ufD!T*hDv%&!1s_#8PjeqU#Su%$RLz`sd$a%GP_^XYVVbzU^(gd-%uC ze>kdM?{H3L`te}ihE=MOCM9D0+gqkzPFrYk&8?v=)7L0mUM8%3Q=N$LUNx5emfsbP zw*;&)QRMloqH*kM15fYHFF$SECv3lel4Gy&G~u}kJB_;fTC{^s3Ar|2dHzK7s^s-2 zB~?c`?<h}t#(DczcmYybIJ{OPG>dAV!{cOZLEM24pF$~Q3%8Mlkl8$X`XO25D; z9l<TOzCrirxtGhAniy~6wRyFFv66IYeu2r{3>)^OtyjYO&d=OYq<QaBa@0bN_cA}y zXPglD`Rl@kvwn^arW#(e|CL!)F8}QEvgMwHcEz(JGw$rW<#x9A!Os5MX97+1R{3@B zQ0C!jS)uoDmn&PI&F$54Z9&KHJuE0$V-zz#rXuk9(qjov+pa0kxw2h@%i~@758vf~ zJSKd$a9*#~b5f0CwprJrg!eAeX<2LK+N1+wt{pkx;$<G7)pdbq|H`s$R~!%B&<$<d z^7_+RmB}{^tlyhFJFLGbC04reFPm{LBg4)$$LFv+J<96knKtov@XJNFF3r3$A+zGQ zbI_5}RTFO&E&Pyk<lhYbCtpq4Umey6tBpVLDXh)8xWa1Dg{7)4Kh~|=7%X`F=r-G# z)-6WoOuU}O+~xNXW4`ima$)+NHGW}1Pw!f>>Rz{gmFTCtHMQem>D(I=X3Dfqx!-ms z<SFZwl*bD)r@VQRcIwT%q=3o;Qa`3e*p~0#IepnLx5mE1?+!oI*lxS?m&+XK{#oZ$ zr|Y<{|M>H?vf!7bG_6Hi7ebGFys$lY#8hwd8NtOb?#<e0uzrVog!*>Yo01o1^jG`7 zoo4m&kLC=W4cD0tRxS(TdE~6a)A=Yj`Gs$-Wf#-=r0Q;y7F#uwnrmOG<$b5RZ2$i2 zh|BHk>>1PD8(e2?d=Rkq;aj;M3-v=5Yc}uWt^9X+)uDT{UcRyt{aJUBeH;H%_BY8E z>6<b&4c<G{zOj$%jgoFLzO=;5eUJBt*)2jP3bzs^>h&rN7x<=dr%dZ*sFx7iwc*=r zezslLv?D$z*7SIkC^<d7b|K=*EvAoJ|E_FxYkl>(eY;MbOnQ>tzN-}<_gqrGaa+do zi^mRyT*>G)TrQhm9y65rtm4xXqi|~W{pwIt*BKXG6buCAL>OoEnO=XqZsq&W+N%Sj zR@~}3=G}Hua`GvSl&351hJNXi`;oF|UfsoY1qY59%hX>L{k!V>QrEw&H80vYueiD- zxy?y^SN-M$pS9NAj=!gO8m?imy;Ac+cDvz{3frKRJ$IYudLLX^H!D!@?yR;NQ_qJc zU8<R->Cs%54EihQ{)@UWLGrSotkQf%ch=c@XS-@^7OeerB#g!INW~#Hfom@^|M165 z3Y<N~=xl1mAxC!Wz6htyF~2#Y%RX#7ubdb>q53p$U-c#(MSJ(yqr3HIX%|lToM(DQ z+d7Gny{>{earyUX$(Y|lvl(q~#JSz{aPpK$N*8W9|E2nJOR4+p&rYqW<)!*FH*Ym$ z4bJ`$KmX@an+<`7P2ZPAPqdr0U;Apf=%Wp}i&XPxlvlT&n0)u?MOMZ9-h0zDKeDV- z4Lac0Cv<1u3(-aHp1H5IcUf#LyV}F&s&RP35#4?Vdqqb>EzKBJk!$DEgw17i*80B7 z%+lR4<J56J@t=MQ5gleJ^KBKkdG5V_v_)7??c)K}($F0nvke}f3B1AMEF00fQiyq@ za9;b@U!T7Sawu(@r{Ns>%6Z4a2@{ku=YN;@r2g2<_quLjOXT^3Vi9NKH&#TI`2PEH zdioX1nwh^!jy;{-RwWw0?+~Zq=UL`P_huZIV&YcZ=4Yyz^j)C4rbyj!x#z;?vfnDy z7c>?|zI$o!cy^hCg(}w>$L8Y)cVBTXXl=Q5y!l@PS4-E{Gn;qSYBmSWx4N>m<kIdo z{SB7ha+f#AEY!Ue{<?S?^Yj(n&2gQ*PM5MAmmi!I`ew5w&(kGqKb_ouZl=dIo0Y<* ztdlj2ZCws^#BG1|qGaa=Sv~2nBNrV1F<o9+^89$_e4m{4!PA!Xo(%h<`15C_>tCih zH$TbPgfIy6F*tF~x_R9BbhdVhXlGm7I@L?9skv3>(#qq4?`)hXBj4#LeB`6`;abzE zz}W4-zJL1Dd%42yv(~CbaTPHWk9>b0`PFIVosTT_8TO}-tUA4R?Lkwnc`XI%ujWnI z$dN8){b$>swS_l?o{K!xyPKiKJnd<mXvCX)zE(%xoz%2de_zXAtsa`u6ZwCUbc$pa zoB9HU)tyalPx$2jU9#@5sPih82srNJnHd(mSw`Sx$G+TOPEH%V9q-Sdll(tHqWSx| z6mGXWFP6@Dz3;BYGQ(PP$1?dHUhfocbSH<@w#}cl<Nnp6FFVfr8_y4!n-_XC?!LQr zaK+!pj~`xG-{04%dg-xDxXrrlpRe8e@W?fm=ZPoRqP16NvE01llehA_q<h<b`AVOw z>#hoQs`TpVtNZ?_m&~o-!&c93S6J(k**e+J=!)^{(sZ}X$1+!x4i-Lnw`zffSHAzl zw3nCjWM12R=PXJuHH<s!+H$OWV}SUJrW0oMO%oEXd!MRhmFc>FtbFa+(8E(zCRhH+ z`*Ec5UFgbP8gaK?<OPJ5s3<Z%tY(^PJE5&iIeItCKDC&M%clHMy0!Q3oZSu@D&M-2 z?VNJW1->6n<NoH(`Fk1fjJ6|PNn)QDb(i?AxWaMexS2uzpU0KEEl;(*Ti)0wmAa@v zS1fRT=_d1FUT<E$j0+zEe<rR!I`_p6%W1xnX6C&)aiX*Pf9>^_*x)!pTB$v4eeT;% zw?(lVjLxq;wQKH{lh+R&`}=Z&&m9i4r_1%3=PF<6@V1NZQ|O*)J<H#zW%>LY4IfsV zJ(Te)_NZpBhhzVe(_TlLt9o;L(j*=)_SP1Aw@O5$SKZ@koptNiUFkJ5-zLxQ)O0T7 zzV&-$RgX_@RFcDFw=><+S3K?>-u%Dqr%9_rL(lPjUW@X}X0>Z3?CHMt`}xO@i>xd} zm%ou+t=br1B^du-RC(XY^D$Q*yZm#%J+VpnOV-ipjF0EA`8`@ap|C^l#YNAMrqh~+ zbvKN;ivs$RRz44|ep6(y-RR(qJ#JcyJsLtbL@|^)=sfBy`psv2y06USF30n%3v#di zo$Ow|-C=X1hv_n<EOD*(yXI#9xWd_Db&ciNDfQLot~NB>zcW$nQ2d^Vb4ITwf4(5^ zqoMWf*E3Njt@XMWgd^jYKD%OEwY%qZ^-cRm7T+@)OSD}0C3Z{hef!p8ZtvWg8Vig! z-w4<BIQsJ4TK-pji#MLKPmB9zT;>1q%8e#d3+X0X<%cXAe}~n+yj7~qE4%84&$p`B zq!U%*4gMES?T^@P<TUB0@+{AlY}04fKiwKQp{&s2b9=sv==WQ@eU7FEKKqdWU3=Fj zjhfkhk`r?lURrps!CQ4l)1vUcW(8C2xP`4;XLPq)nR!3$lbJr>VE>;LfhP}rm8;lM zJJZ#}|G2?jQ})_Zp0&%u9*O*aT`if%^)ylC&8m<sM_WHXeSaoDe08IEzxCw}mmHi+ z+H#U+yKPB4Uw)7`xz<;=(D}s2_0!eZVtFPQMRUj9UT&&1W$hh#b?1yruG|*ugr|PH z8Bnov?V{O?Z&odpzQ!<_b={5My&l&RG`!+Y+<$G8rg*l!@BE)6%XQ3VD?Jz4?6}U) z({VORMviyq`TNI&j!nFERfprmIWOL#*5{1-9#0j@%-kWCvV(OANA*P0<BhB<(kI$T z_iJTDq_12m;W{~Uzd)V^_sXDhE2fkA_Wg%lZgDP{AuOoW@^;gn@0YxP-DL4Oxw7Tv zD?9h%i{;v<JgOCaSh9XyE}7Y9&s4r$b>aMd=Uh$Fm&fM1_O!P2EHi7H;=3oqu(^5G z*@w*8$DI}wa%|LDWb41%zTNT}$0LL2n*V)A9&NCDsW5TfqZ88~)gN<JUH{&xz0BxI zuZN-|$IKOL-CYE$HP)KQD!Y~!1ZwVCa6j+E0X1iJJC}goO_K@_g(a1qytdo7chXm< zO*3}yl6Vz1S82=D`rdg_ZE82BJw0LidBJ;&tT}C}kB|RTc~oE|;K8Tp)$*Q2bhiBx zJ&vYz!FPB3y7AlC+U()u3vMsnDxN#+G2nR-+q8Orp+kw$hx9Vz4e^(=pU*V-xUNM1 zndqMtMbdf6Q<jGK)_7lcUc0^Mgle~#Vc3q%D|!#jKWY2mOim#8#sV$N`J5ZHSL6yl za+tUMPigyQea*V_+r_rZsfll!mEvkpkX#m4bd~%0)^C?@$0o=w4L)y_{!qJfK3A4O zKi|Br{K<Rn>dx@_XYTv)_fIJvUH32NZ8c<b->5O&Vx9OUV8^{;rgO3_ZX3VeF<v&k zu$9Fxz_#09r`XP(Cf3GnhuT&CZuh9@nQ9&N*)E=YrR=c}7kV$KvoEvvtkcYU(Qw6m z^1+e~DSs{HcPnt@TuFT{ckgi+kJ@IgJ;@G>GSWla+FwPd%U`}R)hMdnOV$6PeW13U z=@br&tF22{vfll3q3DcZ?1SkE?{W@5ShK9=gtuKq8{g5bM^4$quQ;OY>g;`^rq-kV zDtlUS>fK`z_t#wYbhi>OyRo${Cg1g;;B+T0+wh8r--{&PGOy!1azi_;Yu4Y5etPbV zTbHmebpLQ>x!|pEl_@i`9k@;3vt4wZwXmkU&A6qJV_l<lsX&n44~>V9!_p>duM)b+ zZS_5FN5r<<t1VYfYdt63tij`yH)+OvS+(FjR_?Et>t-_9o%k;yD>d`Wv|jQ5FZZ9_ z@Uw99{zpgerOj$JeX_A_{;HK{FYMf-#Q1A}%<Rkjtxo!%{vBZbqWNEK%Q_Xgl3QCo zUfXf+_YyURnN!Q^0=fmmGk3q4e0X2<_8$iXHw!#JvC(v8?*yaua;{ug+5f+bPW5$j zt&ZMqeLs0?$3&%7|0llOz1&13GSsuHQkr?Mz`FZx{NLjjxhmY-7?E6a?uMAt$%WTl z&N=DNb)7p!@}FSk@1O$RYj5iO9PM7p+LpiaS!4Q_b7|S_*FLKG#p<5RZcS&`eNk3F z@49$#(wXSV?NTdMeU2`+s=CZlS5muJt@oe%`Khuq45r)fOTBe&!NGd&INsKnx3iZX zEQxi#y7}a$O>?dG&E+!v9&rBjn@8+B;_ow?>@&I7etvCB`NG7)$0@CUo7CKs!a8J@ zpOM=nAofh~gvXU>ZPt$krdS=(ouhfZCB$HX*Y*Ea=XTf5vt2a(i-~Tnx=<S5&c|*V zag!w^idr3CrL@NV6E?HHo@60oSaQN>lE%NZNaO!3p52W{CY(Pd@!jcTi`f;Ci<}`k zIuU2(oaYJLZn^%y@kP<cs>60(7CM`bKYQvvIdYL#sZLsU_m)uUJ}sf04}AQt)c;gD zGykksR_Xe49IieN^QE;XZ&r%mX{+M7e!`CG53{d6TDZrut=R8a@mBkm58c8miW)NA zvsb^_qgWUnQ@6KO`PtF^6GC6}y}DI-ck5f`d6$2uPZPLxfuBYE{g-N!$Ffrs<24>B zZYjO1d1&iS?ZB*ng(hOWi}rqEj5={QDXa6Opo-d|XP56JU7qA|ZCaQmSIv<Ff4dUz zvnYgY*sT&Bzayh1D*L>q`jNs{wsl)LXKr4qv3J#5UrqkgooROQleP2Yx9TUqz0<bq zryZBAyWM)v)0Wp8j6?kTK9)b)wJ4TPGUR3Da=GWW=2gAHXNs2<uSiwQ?2xKjwx_}W z)OjxRq_;EY&U@^&GW^cY<KnGR-|l^RbZDpjs!a+GtZPg+sdr==s|&Q|Y<xdOz~d8V zOv<ZAO539wm}9@pUwEpah=2E|oa0TUygQGck(o46?uum4?`?0BrhKd6JoGK;TK2E$ z8r)OApJG2-TVVG2`9{h3gz}b+PdNV`6P;nj%P3~N%8hBeR=nDjnTr!lRFgbQmmkfq zx7exK{_fNymBbmBpGD98@{!SFseG39c~K^-HOHQ@9*W)2xV(Ro#ww;+-M`*)iTJRZ zJiVxXR^fKs*^71Ftt(vF6YnkfWw7*e_pT4!*B|fup{adUv(4`!@BeG_H|^28t{Qpv z-t*Z?Ca(>mtirsTCwcL1&~i6CQ7pi9Kk@s9-M?Q5hE#N1?eskVx!>&bRO8FP`FAHJ z-kWV!tvvhw)tRriBrj>qFEcrDXVSj=&%C$AW^Z_RO|p7@XPTRf_x~A2r6*4>s5RA( z-Z=lG|JwZ5y-ypPrA=nOTED}5>+W;K(pnc)9j$uJTCZFvf4cM4%@s{QJl^e(XH2lV zCgAETUbogHA>)*+l(QM1TyC?e;ip+P$EUs(^z-(W`Z+J~LcW5i%+Vmm%k=?ijauhR zCa-q&&|TVdlQAVSpYcoY>kGZtr&>5Dr*7on-?uv_$z<h)(r*D%AMxLxd+GJD2}irm z?tFYCf9b}v4;Xnrp88<Ee#TqtMK$LxOusoTfK$Bg;^s$QbCupMT-~Ai#p>5O9mQKO z9<rY<yR%-ZAt3K%3;V&ozUKWd_arMF1CB1MTIpACkH!Au#*l{(xR)PzH6`z;?&`$E zNs%9RD<*&J_bCgQ<s+d|nK*yLwoBFKN9Xv&o<E<Q_3Dnw)aU;DmmJkTeSg-p=LMXz zI~~<MmcG(^WtN+JaNpJ?3|}LU=KP!4;vaVJMX}7u4oR1@&#zv5XWKua*CR8ZyKnxi z>NQJ$IxoL5A<1LU@f}jzinhfDy!*MRdDWv+yMDhET)g7f)Qil|tB*>`+};vZ{>Spy zC&lW|cX!VB2nd&+?EUU&?y|*u7r+0au3@dnGsU4twvYdexR|f)4fb6}d9`bHb6<1s zUbtwA&FY#hA*X#c{)7mpnSKrxou-y^VBdqymXT*NGVX5GUv3t#c=EcI8L#CWk1%Jb zP5SWr<|W^=+VcZy>^bK8eBhoX{~$CnuVjk%lGphyi_R>nIJ)!xjPTokFPNRkm>}s9 zm20#<^wmc5n$o@}XD)Xgx$(nnpQFIXjz<qdW<(~s*hus$c}8#d_|$k|{yCOe?D^|h zmu}m&Z$b5=@V$o@q_y9^e*ExtpEt}qUL;+Sp2OYB6Sw8IL-3vaDXohp?$A5se?LBn zaWzNTpTL@1=Y-=s1ReS1-=yEYA0BsGTkfk-db82ocdZ4U6PLGqJYN*{+{EDZ-D}bp zRLg{}-qVXKn=i$l*>K{#aai_20V9q~(Z%i0%x)ar5@H~}q>#t;i-AkCbymfs!W>S{ zU<2!GM|3<xg%&P9%V9VxY56C%`F}G6A6aFa@(0e>7Tm5m=VZ?5brWXok7US~wcELS zq5Y~w<+bM7W#10(cs6fK)Yp(rQl>(?E@vfOzqe_5Rpi8<QhG5`hg>8RH<ul15G;%@ zRbH6a8`9XdYDfP}j~hI#FWx`8>3h^Ja_uSSIpNzbHI@p<)P^>6#JzRwv%l=*YVBaO z;x7B4Y>~D7hhFu|E}nB|I(Pj3x|I>97H3%`zU681tqK=7P#w17f?V(AeNV4P315hH zxl_$|@^1LgNQqOc43r+7OAfmmY4d&m-GAn?j87_0wdb7FOG)RI(DnEAY7&!pp_cOH zs4(-*$F<&^JD4w+KYy{~;o19|adJQWlZ(q%l$TEt`K7Y)++s<oh}`8nroTA-FwZ6B zT^(b!VBX5Dn%O&5((8(2S8vQ*CGQheyhQkCP}io5PgWc}y1LZsvdwSN_b)$Q{*s*j z)osnYw#_oXyrz~Yw{FS$^7c&X@@F?bJbud>wO%6bO!@p-J~lFY3;ka`%)c=`F#Nvy z+8OnA0sD9FlM5`^nfdeR$sI{&)ptmK@w)q>!NIOuaH6c~5h1Ul=9#l2-{&=k1UxRD z!>{@#dv(^Y+ebJqt`q$v&T;>T_|%%TRU+4xO#3E#mbw02SRB)oB|nRf9`9Mg7FF}h zRqV#6xjnNT7d_a1x@yXOf!W5FFNSzHow4Lzm{Vxfe|#<D71ukn<IaB!44b}Pyu?dG zYthX8hwY0jHa#&py6RxPoo{WVe)J!gFwK1*&+!ER*1CPXv4QRAI;SVHL4o^rWE^R^ z#r0fC@FmX-_Ml1DS2Sn5I?}Pk{>bI@#K`GCrpGm^Fvp)^WbElTD*5dsBs)2$Ci<-K z9$n#s8h>}5cYc0Se>c0n=e8wh_&0^UP8JW(RZ=-tnEdlvc->@!Yc7$y)A_GBKRh{q zEmMN*pP(}*Hhi9>F@0&X^8O<R-|D=LW^}ji$xc1k^mMnql*Eb6iZNjkwU&lq^&gMt zO)*>-Z1Sh$kfo5Pf<bNHgeOXFKKJ{cy_Z@qrt?hmch=8`!n2R?o$`!YH_>SQ@#As2 zUoNs_8SKlR;b#7Os;K#z1>x767!P-qUip3Eqryd@U209z{I@3Pp3w@MwrNtrwDbEa z7rvHm*&+HgI%7}eW6}L#Y$Dp~`&YNkYSZ48CADE&{JQ6^U1f?VJLi<<OwW@1vt_en z!_)h@Ila|6ziwHsbauXA6Jxc<K{{&g9q*rKxTF^EI)Cy|)3yELCHJ{%*Yqa`+~u!) zzP(Cx(T0zg4k~iQEZFck^Y@aSi)uyE1q{qycH0;zd}gxj$>Q)@B;q$cWWDws$9Pu7 z52C$FuAB>GqoS8Oc{>Z;Z}q!rGH=<Y<XitmYNc+>`g-<sn(yabGH<)$i-l%RbD!X( zu5@x^Vp89ZQ`4@t^=FiCJ8vNDZSq&c>8kjxl6^f(qn7WMb264G6K$5%Exl@ds?FzW z*P~LVRi}D71HB8omwgkuDCg(C_rZelk50k2wiZiSgnYVRH`Cx#Np)Az>tno4&QJF- zw>n%|FIl#767#x8&y~*`{nkn@T$#x8^3!Z#%R6Vk9i7YYBe!ru<FOCUw>C`v^sBMt z{>+zNUQ*{<LlUk$|1{6a_u1-v3ki3N+u40g+FMpFKc=B~zp%kebG@xxN!wrMM>D3z zR<fDbv!_3ZHn3lNWVTAnfjtX!n%BSFY<h&X`o((TcN3gTom7OE%+X~!a>&qS#-+|| z8|J66+!I=|H|^S&w)mR#b(!Pqvx<5QV@)S6xgRVSvE|<#iO9pdg5RBZyKchAyIcB7 zozGoc`ZLu2;-}g1p})^fdgS>`b6)R?d6v(*gzG}?oMdlhoW~yjQC#Np*{2NMj^^qu zPm~k1f818TdEWE9c*wH(k`en{m$w#bdsxfXoSBtY<8W)b$ILIXMk%lO4@tJIiIWKO z&eZLnzV`YHwQ%=;b5H2~GoF3m;|lHzAuh!{jW;*UJh-d>ed_{2!5_W5%+%lW#jW4o zlOB+}YxgbAl+v%ds&AiNT_)rH@|U6SmNj#@ADTBuUzulACwi}Pfxkgk+BfT~kFpov z_++hc>a%8t3b)0lU!3aUQsT>WeY$`BtbQWMuybj-hi1q<!54SmFMIw^uy6g!hjXQl zpHj)P;jjKC@~!dK6e*#b)mg&wIYvBdTUl-`zLv)Rroo!iZHj8pOU0|qoW8sFy_&J? zrLcO`<?61khv!XI`Z+Iu+0@FAD|=`|<SebfH%t|m%9nAaJkD!mn&~x}<7fc8%Boq{ zll{-0+wgXWx!JbUdJ});L{E`9=i4W=C@qy$ma#u&_Qp5+S(4ZP-kBV`Tw&UVH7eV$ zPxQ{+u0Cz5#_CO>_ct1JZq^CerCR^z$ph&&@3UtEU!G!levC^$*)+}|Fzv|)DXAds zo^_2;S2K!A51jL8tI9dGei>J1WMt!_`@5E3){fKgd?Xt$C3mzl;<B<?*Ws<56K~F` zGB>&{y-aFr_gUT??UgP&U-Y_quKK6*n)M^+;q3EUrQW9NKYgIG)k}3*xAPfx!L`+n zp-<jFaF?#!DIyyvRP}mql>eU%GbN7CjlEZOMWeO(%l9SmZ|x4QiS1pmG2zacpR&{L z%=6H!dpdFAO?OXAzvd3}mABgq&hkvIc_b9Md|oHlzqRX&pKz24CbzT4|H|Zvyua(@ z&)}0CPkfuYO4r@|lKDs6G-hUI#tu*a-fJ0eLtccpmKV)vWaLZd=$QY|^)z3tSJ;!o zO~+n)v9>A*Oz3N!P$aT^%h{fVTk3y^3)s!=P|ttfFSSMYWuxRysn^>!htHOAUv2uJ za&>XhMtg&kr?=?zc#5W{y=!CM{qp4N&1*W(#CkGs{@o)NeJa@NwCv+h_v(OK`y4-? zOK4sFt|;SV=TpvS%eG(s%P~LU=cW@o3+if5Z9G2j3d@|JwY%OIl{U=$JuAL+Z9o6) zo|#u`kB9^d?$i}we1Edh%J)t8Gf(R+U2dH-_<f{h%9raKW#``f@M&jQUc;#v|MZ`; z)>!GE{(L(9fWepYh9mQiaQZrEUfdNd-?Hslf6Kd`<3Bel)(if>7-7^Zm9j}>+Ldkd z%CE+BFH4zwQP!g9)A|#4E@e;WzH7*OK3jyveDj9i{HLC{ybXA?_l9rYp7ieQHMS*f zvK?Y}V*ATkJdVg3Pkip|xL)}3rYkP3>t|N)w0)Mf%Qv)Q`DD?O2_mssjK43f720>J zZl`ziZkd^HZNq|YtPE@xxMgbjL37f)7Ka<JR%naHF5nP+bnM$@9^;#xoO@pGI%Se^ zY5t5#?-!51vhTXlykh-)*}RFur{yNez3**ta<R$CscX6B<14NtaMhXNJJTL<J6G0o zMXc&u9opyD|L%PL>&hZ$wf?pD`)Bs=`@TqI-<xGe|Jx)zlIpjVKQni!m|x&$<InNt z!W!J{Ev|nr2c)RJTvyW0_Dj&bmUp*}zy|k@No5Sl`;}wZEOVH1?4O@o(=L9_=*#41 zyjR`CgqKW6vHq5{{cQ83d6N^%UOL!Le11szy8PueA6)hwd;2#0k$2tl)&t#Z@AMQa z+-82&qv2CyzquqMVpezZhNE5!pE@1ie^4uBO&fQ||JKuAZq8r-HM!Kar7z7)_R|KI zq>`*FGn!uVU&>i`nRiyhgTSYW9@llN-zZ1k;hvvA&*|tK`LDm2d%3sG=~azdy3<wl zOHHQxz4C?2?5{+>yYJg|+noLLhIPAI&k0qlHJ?*`P_HT$#m?|)_Ul@gF6~RA8CL0c zI22}adL6MzI%iO~+_-Pvq_rWYF>h>l9$jtz=FbZO)z6|AC#*2->gJJqB=&K8<m`C| zm+C1cN=iL&Ug>eXa;8A}I+p!iT^=)Mc=bGAZqj{&Ge7*<?Un6sUvEjOjQWtEc>AtV z*)E}zSJn5NIl%g2;SROs0_id9#4hm1ekk2>&009N_Q91dL5<e@F9L;nPJgZ$O`qYv zJlfj(LbJ8gvNboH6ehoV&+a~rT|KlfX~OAv(~nbcMjzPwDEg9a-zi@HT(;Dsl5#F= zDzO`TKCP5(l#Sjg{;wc!*=D0_-c1vNuGQ3JP2JA<^23*Q*TmBr0V@>q1eH?LlB6=O z<cQ_vR|&)~{>He^|FDuF=Zn<h{r`TS;Q8|T<M!Pzb6X7Lb{Cur_t9T<Pi}FxkIv3L z@7dhe^sP-hvh~oiEr*-$RB6t+UcaxbbWv!@-p2hmD_djM#=hLi`|Y3KgA=zlIEepy zDZJ-kk2m||xsg^~6<w#h@0@i_c_MV`p-*GVu5RV-ABHkVF07OMR#MpW@P+CL?kfAq z=?i}E`*hK+cgD56pF6LKoLnQQn#Y_fRr6eC>yzsWhJW9BpObC<S@Pq^Cc)>Edsx4& zi?0*bz84a-Kk!2R@3V~e{u(iz`)b7TwDO@XClC7p_bs2<-9p$mTrE=FZO`E8d!YHx zw8lANS(3jw{T?1xIaQNsAA9QQa@JGU+TSKlFuN@}k$bJ&YO9Q8Z_YhFHqGy2>ngj$ zZ(e=LT`=X#0gZF(%np>e%y5p=`fHf>DM796jE?`roF(R$SMT3mzUF5&n{DTlv(sX# zFLOU@cv0)G{{HSlv$D9(Sxt+we{t7ukK=ax{IhP~|1&WgRz3)syn0g4kID~KT{mxh z<mjwcKCbdq(BuyL$*0Z?LaAk5?@qM8IuPG^;oSZ9rpw=cu0P<`D0q8Y=ZtK}y=M>E zzu(2*p(0o4x4ZMojjX@N-bOx%=-<BBcJ|C0k21_Ew@s~?rmi}p+ui=*p@yWHN1Phw zitN=`a`pXOzP5_>S6}L!4Vz<<@-lq6Nm%~F3r%q+-#J}Q_nv-Ul6&jx5B~mNe{<i{ zE=w<*_HttPOX2>S$9K=qnr~~7qtj#(rxGCjQB3RaL9;7*jz?3^PbtXXw8=ekt=`5% zd!igRCYab1cd=iwT$0HD|IyaYuqn+m_0`sH*q1+h&pfN8^2cuX$gsz}dKRE`Iy{5z z5|d2tGX5J6588Z{pY-t0+}EWBF1orr6YJX*EDx2&o)O7dJoB&Fv@4<wXBw{+#Kshd z?{_mi?7hj>ZMNrG<@3AM#gjId7RIz$c(HhiCrV5?FDqTRK;lc5kzYmb-hWoSyTqlY zeLp(;$*Yx)el5YpDO(e7EkClKBW_cK%>mVETc@(Uo$*qu#;e;)(%9JN)BmIP{ns39 z69d05)wpwXS=aFg#<@q5Z<vJTs;}wY$8H>c<ot0dF~_~@T57T~{ibc6Z?0d(ZP3Z9 zlHN7_RmfiR=o7EE&os)luI}n&zS4K*lG2}J=MvUyZ@jbOBg4(y8!4wMCk48OSgp;P ze(K@d)x1Ubo9;~VnQtH=lDogq_v`r^i|;*Q+!Dv5_tsg!V%_^I%AfRPmd$(Xb#3N- zKa~xg%XeMB8YZA9=9}nISL(E_tNVP^--21Qsy)|c+`KurE7N>uUWGz|MvhABj!e;? zW_x~hT77j}Uh=->iNe)7^`f`yG8VcpTsXAolEGF^M{Y(pzf3>bJ$!Ld`;J9A^-PX_ zQvI>fJ|UWK=2p9V$tB%?pWb^Mr>3&%cp8^P^ol)v?<DuL7ix3{+HICBS@2<1>xxOn zg>4fgU;Gu5z7h2(Qu2bd&Wkfgk1r4PRSpq6)cT-vwfw^~(O1(_!qR?4i7D*fRF`Aj zwX9^v<!!>RH>{p~L&nv*{^k3cc!^r)W!k&uT{3#U^7V;}k^j#!v9+0t6lZZ=?@6n9 zU=nb;W8FG|;*3VNjUVq`-|Ounx_gQCq1ftU#hXqyZb<v|v3=fSEvI>@GnZK>uRGT@ z-*CrOOM%xPkL=Sr_U*j#l;!tX-rHZ>?UNgHHCWO8%gxAN^6TSohboukRh)YH!RAc2 zDrdy8BL$_^N2GpSUKvogRqS@~r4yxmB_>``sjgmH3)fYss-LeHJ^aJw(ZZ~#&!W5U zYfViG6#4aJ=`sryUOR)Cp@NE%)}6-Tsxu<43bd^~W?|2ye?`{3b@p!Avxm5EG=1fL z6Mm^GJ?ibJYA%_(xv^PUOc&Q!T{maDvC@0r{(a}4%{>>pggLs;(T4k?#+M1F-#k2D z?^tXS-)P!mqV{sp?xNY8QKvNfY_|ITe3jnzBkxD3{Qd>WW?{3qgXh$qT)eBrKh-uN zA|~|XsfwE_|4QfjC!Duanz12vVN(@@0JHSZtzO1&KD{bF>9Tk8opPQh4-!jtd|kXZ z{NCpEZW5<i<G1Sng7?$rwy)|~_wr$JUbuOZ{I5;dXMgb4Nq<>WBEI{C_1=w%U%u!* zb9L`hZTpZPX&zki_`~dTSNV&lpE_bHC>b%iV(ymv*9&gX72<vK?Z@GbT{_iV`Es`& z{1DL#QsVol-h1z`@?|xLd++;N+y7mXyyH3V$6OD2b|$xlQI-cEDAlk9t#vrgr2aj7 zhoap>vrLIaA(P|l9@Nch?QJTTcby{o@1xa0(cjLCH$=A|yZdhAtjeTE%d31p1?_m6 z=fe7Sx^SUgq>0$VBllgs6?!J>JN-Lu70LE$)wP@It*g%7@;v@{!c>E-z5k*N4oexY z>0PjK`Zl#GVa$9rQ#l-V|EjQ4vZ!J4Gy13<Dbp%<EXFlAdGl{Zg@hb~?ju^-Dc^qU zUcAVml9R6faPe<e+4>-{<XGhitY$?*KE|ReQ(9O2l=f9}?pUaGEOKk|j1r%k)Qg$% zZKq=Xe>Fa$K3k{$$&^J-mtUqW$xz@^bb9&bdgiZ^SM!#sIZ7Pt;tLTDowSa_?qbiC zyz}QTEOdGB!R5%Jm@7OY^~#bvZT?^S^f)*Bf7Aa@#|6aSevZ7CtG;ukUD}@)yK64G zwsz)Mo!s-w@m^5bnoscxm--Hy+IJci9NBi9MS9Nm;;8orj!8?_%wankbE3M&WYW@K zmN|<~I58=)>bWlDo|(z5T{Owv&(K}M+tHDE4b!JImCxd;x28n!go}SJU;p=q`E;@S z+ru~b1*r&HMW53QHCpy?^_8-iho9E;1mCrGTUPDS|E*rm>*Y$LMI5d>%N}&4_W!6$ zc{;zhcdo~Z%KQa$w=b1^(RI~j!p7&{OK;ss^Yv&ndRk=ruu|#Rey*+Ag(*4x>#r{? zO*<a<QE}sZl@q_jxpfVj9UFISczJo%(|g7I`&wd_dzWVX4Vk<mIe*^bowFAdwYMgo z_7*t(LGMSX*soW6ZtmWge<R^dqQT*%jWZmLR1~Y`PRQ%oCX>vp-w_k~@N|CKURRf% z@^E*4o^2}(U%3eXbkA7K#blnxv^wp~6Z-(cz9|LirX6QK<fo)os(U27sF7{?G)vo7 z?fZ(xX@$G&r=(=&U7g@v`$*Ts<+9L&tUyJV@3wzVZnCdPt6QtRZfV8y#=|RScj@p} z9#~jgp)VOI{HQh5TH?&(r)8_x^yE#6yk}Z6?UPEq`6Ra|YZ6Y>@Tc|edk}r+-oyWP zZ5Q_H-HzIF?7sK!hZ~RlvyPh3$ncYQrtrt4oxA4#SMH6>sBuftUQ(T|yZDdP_VY2% z7OpY;QnleaOL?g=zouE$v-ZmlF?T!tFF#y;N7d8s;p?O~AFO%*C2Zz+tRJ5)ru4{) zeP8mjm5**G{BH5<-ys_|(?jajzRjF_9d9R8OO`*gEv(mz7W8#0+1U7U=G}P{*1xzg z@ybVmHI`FF`I59+t#^c~7V}JhQgqJyNN-5mtjZfjtsAr-zTZ}Lr}Y$9*DGIE?+3eH z*{J9p`FV(;xpVQvGnq!hDfRizo6j_^$SNsdWxM0OXp0LI%QANUTHVPhPZLd8HcaN@ zjPkm7IYO;pbh&D_-W!+amomHm6tHV@E@~~=G;c<g+<U#Oi}j-UQTNQ4suufk9dMY) zAH>%p*mmI7S4D=lV^?*Lrp1bI7M(Km;;^|P=BdhixbRZZS|*X8tuOaBFaB(wR(JWx z1Woz!&1bo!U8nacIz2KtS{J8id*j4ICyUuSWf7YS0u`k8X>?3IXMgaxB6rcg)qJt) z5}dF0m$4uI^+u$&U%>8ewS(t{ipq(<%eK_yKQbsy5AD1cX0)~Z|J@mp?$>{xUYz@F zpY+!S_On|Yt7{_fCP?OeU;9Ggx##iED;FF&mF_yjf_v&a#z{wQS69?eo0@yzN5=ej zGFNnS*UtMOVc^>w_%G1$+2^*kX$yB6nkg^W)JgfbJ)N;__C3cC8AjXLMUIk+@8|n} zd6x3?R>~xaTi4kNmdEj*SS`FI_=--BG&Aes50Yx?mF*LXx97f4USAhC-{-Z@Ik`g3 zS6$}IcQ}0iVBW)UZC`O&>V|+--cfc+>Urvtd3q~<B-@{qJ9yFHFZ*xxmhaos^@`(m zO;HKg6g+hPoq$T)T@@qKgQi!%$cx{+y~#3LA=0JyoL(N+$qj429m-reXYPa5*S;39 ziO2*eE?e(A`*r=t6Bo6VugURT`Ni_;5_i^#l(ahY--)xeobDSX`0ZQ#U161X+}hnu zlFHu>O<EnLcE!w9=Wn*YO7hn(Dbw!rRh*NX8qOI#$hdGt=|ad=TcvtO9d~PXGybRH z^ON)z3I2SR8{MpxGcowti(|#d&nvO+)cg1R%=*G>&v+ah?tD6LnDZ=KW|c7S*@Bx( zug%tdqwae>xSai0SkKG;Y(w>^sE0LGkM5Sg=U>Stryl0F=yjx%+>8At8qxK=segK- zZ?FEmcI`)-&1R>R_uMeDP1*SNKWl=-{O9?lhmILAE)l&pz3&9i?neQ;Sd&)g>P99! z&6}{K|MshlzJ_1Uy%nr=E4Y64@Q4>4sf^<A+kS5QmejwK8y4p6J}&0fpz}9bo2fs* z*}Pxpo&M#eKO<H+wEpMo@Upulcl2j@{?FCtxTl`JEE#k6g?qsB^mlF#eie&W)oQmb z=!oTgzFmH0yGjrH0lCLE{7dCNFY~DDuj5>&TNltV&m;2rf}Dt>9|S6&o>GfH#1pCh zLMXqf`f$hJgN80X=i=+7X6&|VE&9aw@yH)f;b;%*6QXgoYv;D!RX<ZZUGr3B{n2v= zqf0m*g}+{W)OKo4{p~`|<Wm>+dC0!zxpSm*&%)cUrmW95XDTsyq<7L#m`{&)w`-A| zMMQ!2%^?5x4e2Kjye)88w|WiNv1P2s<UAD&=j=3@AhqZQ*UifE<TZ~JAMgIOB<At# zhTm$vAyyiHUE5#PJxZ9@JpIruJAMl-pN8-|jT)Z5&A-?U>oVT!*oQ`0&v<LV&hylp z|FZ-82`)3U&)e6Se-Ztw-?!Z4*OW<}w~p6vi1I1>TE!SGd!ryY>Hm#=$6LM#YsD#h z$z2Hf^}5D!L2Gl!7In6DXK$`sa;AH)z^U^skLNtz=%_L4gS5tS!Bt*$krSm8;{3(u zn^kQ%Qk5Z9zAy3UiNYHTj$dS+@oKf*mt}n04(%zp7rRRHX5;j2v8SERW%J(o6D#Po zH_~%mu}z0nK)2h9lp6=Rm^)t`iBw3Ie;;&udn|XuG-t*~FRg1?G>=={cKZ7IbClMT z<#s<g8kqLWhSWLKE|Jw(s8HZ~+W4Z!7H_rY`yF4r=g&D<a`4SvtK_F0*1v;RtYg|* zHdF6PqbpOkqVN*&nPHDJ59hiYd-YzMu_b?pIm;V=+Xv@m%nB-_c*6d@Q<2_&V)xId zj-uDp-s&7+ald;$<;4warW|`2mUx%#d$*alHM_2K2@2S-@g_%EqIaMQN4D)n!_fWn zSIxc6Z_aS<a7g={V6iWE^#e;BqI5UQSDm&qd{yCMUH!%Xhxo6)Mu}CiCH#?rU%w<o zrQOt;@}g933d^q9FN_p3JHJo0cNBGbntz6~_u{c#Q<iNBSswoIhRvQ;jcb<HIxb}U zALesz7ORMa_8f<_pEgNu@<uzBHQ$un`p`;;-(;cE1#_Kiw={a@J?kp_e#7j-y5e6! zGnbjzM<{w1N3Qa)->=Jd_DUF6LQA;&da-q<Uw#hSH>t4b&eaLqR&=<o=uXN>x&I+g z<f6zb55Jq49Sg+_T{xRIb8S91|NMlAJoQQ5s%j?AdS90BQWN^@Tq>3ED(A@G_ybCe z8(oZS4m97q`r(Z7aZlUnGF{g#_q-|ooAsmk?=_XT89gVL-C_H(L89hF^^X%-dl+U3 zElpA3-R<dC@JE8>lH)_4_h-KFH7fkrWZCZjPoZeJAv^!?fT=%uKdtlYaLPSmY$>%( zDd75%<4g;##5xN|vpO*T+Ohn)jI=;b<2OqQi4zMwh0FHr-DR}uMc7`ar$>bB%r!O! ziW%?e7MpUcP4A`MEWQtmb?3VMIK{lH#ZX#aagpx?^HbM)i+Lh{Ow7F`{`j!1hh(vh z)01PBp>LlWxHQVW>Mgyw(#kxB^=5r?rSS1-rw&X_S9Iyvab{DIWYPH<yEV!Te!lv* z{gg|gb5J1*XW7!XUblBIbqe3g{Pg?15A!EiGB7_(UYIsPr{PFw*^xKJe<WlUu;?l6 zKUfsK=-9NgwGsEdogeJW^SyjL@bTZQ6}tmw2ei6GrEQiinKJKKlHa$ucmJ6FJov<- zb+{<V`^Zc-l^roNm%i+daqaI|)#|G+`h9KV8Mfck0`#B#ZOHh*bnW5I!~dT@b+9+^ zKXy1*L|QS0SvFD1@lK{Sx15_yh|$`ZrNzlnix&3r-z*W14}Nl7Yp;{st3z48J#Wl; zV%I<K?6o(_`p$Do&Na+k`T4;FUGpFgwjy!M)L82iCmk6rw&!RHRjaH&tQE4*pp<K6 zdd}wQ9=;6XMQe6)Eq!u?=X;;-gS;RA_r@)d<k=#ebZAB@+na;?CTLFcY^>UTkG11O z=%rVUoKm6oU#eb*J}7yx{O!4K-vtFKe&s!@K4#_fEJIQ6x9*HKl~;EpmWC*;Qi={& zxXyXNOrq;Y=8NkS|Jj~D{BS{?->OyaSzkJBQc9PUgh?m22J<@X`Zdqxn#=9Ywae3Y zJz#Gtn<_X-v(4tr?WdYH+1stG+#EH!{MPT*ecFCZDZ}u?;fKq-)+_$ZsC+zIG@w0y zs^3qI<x{eKdGa(KNG{lEp?y*K%Av1E-n@;tZ5>^&e0Ex7O{`M1PnG>mhppRhU6-8p zd2dV0l_LRvb&lH2jh$@UYtm8tX<t!bP0g+7O{+F6F+TFUvD(;SW&h%fqDtK=YwX{Z z%-;1+b*EF7xU~A2dy_<$%s5?N=V`tB-JIsNiweFRJnU@R*1AXeDkD>UP|p#^T3)98 zD(!z)NXQ3XneF;vi|d9sN4f7axH&Dh>PjeTc~5`$a`nRvM)CjRyKO3L*=5!`RIPa( z;ul;XQz1Dim)YlaTJmiF+kvcmw)*G>M{#9&JeVS;vDEJS#?{LUMGGdEmKv<Dx*QZ{ zki2l&_LOfq&t!!cNxW?2@m;#kaoeB3jD@8YhPyM`tjsn{UvDZ@VdP|@$<k@d;=8!z zNpr6H;}cwEzfM>y8XMnw7O{m{p;klX+snE>3(-@--~0L#XXSdo$oEg*w1+J!Y_+b* z3#oF))u*){G0%CJC;!~wP&(7I{+hLNaV)+K0sCu0#RC6NQnP%@UL!ouLUYH|D-{P0 zFg~;6xK-sH)o)TG*AwVDAwx<<IQxeu?}9_Ni@1J7HS&G>?Y418mErFE&B+Y08|GX8 z(}~xc<gESuQDmn?PY3e>6YZCaHb_6K`?B5n{Luz9J9abd3k;Z_5m@|3v}T!RnNY9C za~+`oXU58{wOS`$-aRJ6H~U@H)w>RLb5yo(>=WFnH2d!jfyqku|6H1=WpRdS+1rcJ zt9=-3tzMKL+Pv*-nDEUv2ND7!UzPB*^gP-tFwt_ymn_#jllKhzD>Yv9Ugi2b-J!Jq z>i@PA%t@C+Cz}Pl>6!HStXTTz_-SeTwevRb^Zcw8zNE~LXG(*~P5%BJ)2@ozi?b|R zKCkHDgSNG02dB3L)zv!BK4j|dFhA<tjP<Rz<Muo&{TpH^v(c?FTs(lUw14BnwSV@e zX#EPzn#p!;`Kd{N-Hq-t&%LhQ=+$Ga)A6`jW%s2kEP6)4npNLa-`$Ry$N43bU3$YO z=C3!_Y+oV9bR}Ljs5bZb<X0E!v-gOuX#V@<fS25lbD>i`YU;nuU0voIB)8yZf5xBN zCIKE>d9Qbf@;1F&8O$pY6UC_Q_2U<>^NnRC&a5Zybzb<S`(I#Y)xJ%CJC4md`fR;^ zG=u6_u}Kq|=0BUhSIBC~dnW0r@+`OQy#;qmh6H`PxG-au_O1sEB_1DoPXt;92yR|z zebHs_uT}f(>}P3<nTGJ}_sqPtkayPcojHwFmxHz*v8*V1E64R~_PImTx5-a#&wuTl zlNGmdM$w1PACBc|R|GdK>pSSXH$3xQd8O{QH(%mjwti~MX5Qu0bE8Q0_<xOBgDCIQ z=U#kxQZ<$J{^Gk8_ri2``))10Ahm*LzgFhjzZLr@Ds%s{H`}q`XBW>2hNX-VJZr<e zyB`+wAF&YV+xvpEW~Y$R6E{Dm`HOG$KK^#kY~?=7>mMFGU3BWet=~sDg0@|1U+dx| zuz9OOw0Np_kiAe^;E($!mR;4jx}Tq4&XP5*O@gPkAhWu7|Jv6LH?p~z9TsJ5xVtI( zV$0vkqc!tZPI<Q?YKioeU9<1+f4p5f^_h5*%d9oGm<)m~HdY_$t+kL}KWWDkdHzki zS(NJ9RMel{zMXjT{$IA#yT|okn8!@~eUmxDv8*U!uf|u#kZm9KE0<_bb>B68(*}`8 zy=<)Z9%)P_f-wSH&mNt`Hq*JfO3IKk-$W#I?ag2z=~eM_C#fD`KgPuvpQ5*j)yK;~ z=0P!^qQ_b@TZccTukEM&{k+_uDphdT6n>Kp5g+=~e)i=jzMn3A@t;MO=zV(`*9=9= zAMscGT@|YSY9H7h(lzzm)Fr%OYnJYj<V=5a@2v0kr-AniY@feub69cs`_0;;FFmF_ zd}dYKkib19KEJS~uZMr5$kO-mnyk{!x0b2j;cq&+W8!;PmYlas7oG5YzawAqr)QyJ zNBw~-<x5=Mc0D<xta>->bmWaawyi6d9Z$5gRFcY3oc(Hvtw!=BsT%Lf$!i|<J=*_# zLqxCsJ%wGOoGC(O%Wt^sVDj{kdE6TQ*{1i|TI(M>Dwn99yX<dp(`fx2z2j;Z>OQAP z?0&U(Mfo<-z%{DEUnC^wwpAKE-ym;t>d|HQg)dFpUQhjd`Qq)u@J(_ZpCj*E_@57( zvs{K{hG5-uy$9iM{=Pc4&LR1*x0mUcLt1lV7dJ6pOMKSzr8hMpFZ1P;30gi*(JRYd z?bjA8kJQ|#CF8JelfGZOc<4mg{&makOkY=+{*uW|)movk?aJH}H-2>X9P+ewa+cM4 ztg63UjQvynmSv||g!gwIoEpxvJ!046#coo5{bhPb*%$9ByqPcYC-qP99uJ>P5BI<4 zX1Ko;ZM<@hf77Nnt`qsW&blqg{QT5u?X9_uhredETPXDZZaT1Ds95RXv4*Nf2M*Er z{a$zdb^Dfx&6(DenQhv{(0la0pYnqG96sUpyCGjs>}8knn{(;sn~h3=w_WxmAAQR6 zoulKi4p(U6F8PHViu?hO?w^i{X?EW9b=Q^`y;74V%=&eEWpGz?R;7E?pTAeD|DNG^ zD#DcImZ94qwXSUT^Dncn1!d3pq?UKw`0ML0n=N-L+wNd%I5SzIO1C>V`u09;ex(oh z`hM(GzmpU4=5vEwjPm86OKWbQS2sAwSbWg^?yPdION+!kAJqJ<*u3axQNekw6>rub zpS}Bb+Bq31_r*(0Zmf7GzgMX7Qsk?Yotc4aj~{as`0gcr@%rkPLwC=|t}NNa*3z-g zedUK*ozo#tEN02ywm0~HUs2IK=VpQAL+*;qYYWZRTs&F9wcu0yO7_fIQ!*S?7dPfM zyL{L-(UkYVlg)kJ(GeMo{Zi}_3Ok}iSG)60USs(D&rFTp`CDI4oFzMHgJABNxs4e? zR}Tm77YW<A-g`mvxol%w4dLtUQIZ@_y0sIm<$pxnuef;I?eLptL5HNcUr!U>ePS!a z_k0%dbUw{cmG+!-E@fsu$!j08NX(jPBK+N<F_?evin_Gl4wIdDc$SB4=wjx4ZJOM# zvLyKB&R1uy&Fj7taq-v`w%L2<-e5`l_my+z<gFQXu6e;-25J)e3nZt17Z*5oc~z@; zU}Zu0w6zcR-f>}AT$?9fSbHr#OWkwIsYlPXvX5-oDcpMY<lfM_F7E3qm*3ph&3b;X zRQegon)K3z;@h{e?^{*#vr+$!{H+a}bhocePLtGC_gJc@@nN%1t19n<Nqee7PES|7 z$+mIM;*UpVy9+M2o%_!9&n>a);H`PLt@N(OdfvVFEAf>)<DCuXoE2u;Y`uB<PJgQs zgM8D%oX6}Ri;tYp4V}l&y>!l*-*d~px);Yi_`<6u+h+G{er7{x*xsMh4l@him%Yvt zeI@plZ$958r|;EgJZ+g5w7wAd75cTyK>J_HqpdS4cD=554WHq+JIwWBX+YF(siWt* z4H+#aaV#&D=`*(48Oe0-^PCLxFS1A1`PCIW1kRUMoe}a?*1B=gw93<!J5HSr-C#B` zb&~nJ6K^;k`YSqYY$=JVZ%f%?)-g*fXHLY^CF&;^zI*k!lRq!w#=*Jy6V_i;U&_b2 z|IJ^Q;tZSTK`v2YpHBuq;Na2EvwpDPTCm8a-I<r;?K$R`MlbM<WnN+bG;-!zdDfga zo<T}gewRhMR(xXQmyA)E&l&dNLR#XRZO7C;%~<PrX3yMuYx!l2-zpEjPe11zb<?bT zJL{fC5q~|`R^LaeTDl!>cFRpyEaYpScKL$!!qA2HYT1?ed>>@5zy5UZ^303dHy+T9 zxfpsX_-221S#8%szhkU3LfVrKx-?0OhwbhP^Y^`RcT3AR)qPv*G#p|X{U&NRY?=1V zIp`bz9Q_@K%eEG!zqdcV?d8Ov=>>sP+1EcR_mHmGc<W!KqZ(`NUL806By%N2CZpxQ z0<S!X<ufj6=5A=;9C2w^hrvn~OSTf-`mG6$#VT?SjvrfL7q{rvnYbUOTGl!|MxO0_ z@=Yn)8Fh@6?C;$Ca>Z3=>*zCn{`a)UFgkbZr<ALY?WB)9HUB?1=iO8F{-1MxI8NT2 zRPn@dzRE8H!`VF<Kfd4jJTLzHn_G`Nd~ZB>wl5@AAl4-?c>U#{rxHX~1*|G|t(hd| znQlM#WQ53Usi+jQD&v)(r3GgkyIpwDQ0x4?o;6o(r%h1UxRXKSaPeiA?#IQI|LxW1 z1bx?Meqy<;!!&5&2d62OGfzo}e#~S`;%}W;ey!hJb?NULo*_G<CowGFvn=_DQD^$e z@+}72Y@VI{7qDR4-23f+W{O$-|Cw;%a+Ap_nVAd+CLLYZ<azY)3f`lS&#k%Q`M&j9 zpV-!QT&FUB@4I(*S7`^&Wp4Eeb50!0x4*Pjt!iRxv~qOH#zj^QN)>O@Og}HtefLn- zDfjfkzUv!J4;%3M<#cCcd0tUJbK#cv?RT{{7VR_sw)gH_ZFIeGS3m3FNj}p;=DThw zoEO?_pXM9twKM+VJw28i_eCnso$}pYW;pwkQ_T94S;sQfyaM%4PB_=yY{|?s+4%~K zqS&kuTRo{f``<C%VOwH6rdj95XiO=KZeQTsbhRvbdCK-#SJyix&ff2<R?X;HH^-sr zm`FhMOLsOS{d(1;lbV}r&r5f8WuN8a7dw93mf@V*znee89?AY%zt#N4&2Its*SMtk zv2Bz*#kKf}eD6Nj8u9WqrKOY4H!iTX_t*Km>fVNB|F#GS@#*JqN8Y%;_uV?(hbM$N zPdUB5b>}v#o54Qy><fm>ML(p10(;~2=X{zi+gBXT@4bF=`ne*h<&(BN)OV2EJmtvp z4u#fyroYF`vKOshBQ<lTiuI$qu-nPu{6;3vmT3q_yw1&EyO;T`_}0IZoe#P!S7Y!# z;G=W)$(g#zr#Lv2I}LlMO#OS~OLyB24nFUrjiv1BbFQD7{P?9n=nP&Lqn1~j@*9@v zYkisI{QV@me#`oew?9QBiLidz!hd_MbljQ7##t{v{W`g7+w7R#0kK;WS@c{c@E%WS zp1ShTu35}_shnjKtWB6pt9=56d#m3Bn;a{&R9?}l_cLC1wM^{3*cp`!iPZ;J6-4AN zoHB`v<!(uIy3Xo%Jat7}nZiC!TW|ekeo&@!JwHL^&6FAGpHIBI=(={Pv-Hx738m*A z-1OhwelWaz$MxG+A2&zG-kCJNdR~n5_S;{V6)bmX)$C+!ZNFJ?-)rhOZsxs5yeDt{ z+wb#AN`A();BRvZkDi}AN4L&=Mz`DhqtorrSMu~~=C^v-KX$(Qfn!<Q)@FILsJE9d z&Od!H{$#bPZvA@ZlGh7@el0Z=VdrrV`g!bc-jd53?kYQQNK4Mxzev~YLjQ!7_hs*9 zU)}cLh~zo{>)f?Q&6RRSqCb-N*_gU7-yNY@{&wQ!g@;{l6-=7J@As<rQTeslxFZ^O zUZ!?&?D!hZo+nzazT0-cr6yC+nzKgF4&TXFT`*0}()x??POY!k4$dhK+*Z9%;*<gF z1Z~YP3jX}DzblW=IxykI2b;4KnPhMND(l+A;_!8{*X}C<U8Z?Vi(C}vGc1jn@Ri?s zOI?@AyvnAt@0i6zxy$+gm2KMaq5Ybx-mWhq?_aaYvxr0<D6rXi$KJiB_ikx`i`L@@ zKdR>k_f{G|I6C#Ht$wZG#e(TAPu)BIsB}O7P<n3KQnQVME-STsl6D<8eztLM{l{We z-q)#Csk_S$CCe`B+oB^8_@ZAq<l5J~>eWjsKQ_wjejLKDyi#WE)wesI#YJhaF7&E3 zzp`q<i|>5xo<`FPA8V(c6;EnBW|w@O!IwE`4eRQSa(7ea7qvG@RxtdxXpY=^WiIDK zgG+kh8tW&9oxbSI5ZHB3?Dvhky0>O%PF-j|#US%kc*c~=Z+4~ZZ3+~AwkCd2^#A{E zlDlfJ{GOlrHo<b+@|9+HY&=9#xu=-_bDDp+{^fz4i<aqdHy(f5`C{4p-;dJHYp<2h zt^NCbz0IvVkN)L8Z3_LOz{T)k<;)_k54ZbGI?{WjzkOJLMX+^#&ABTjlI7Q@{G6z` zqIl!w#}7_EnD|&z>h!*Kx7L0Ce&5Gy@|#^h+kX9@bUAuu?x7$1xwk!I@Si#L`&QMH z29MXZg$TXtJaG^<w7(%qqNM(RiAc)s%Wp1Z6&cI>Td*81-!Sc(L+OD|<rH0xw|v|A zg0&Vd>e}=!v0#bZq!sJB&MNIywY>T*jlrrxmH)w)0@IYszQr%KSDXHMcec;rhE_?m z()z3SW~tog2!FKO#G5%qkE3XbI{)P<e(YlJbDuK2Ulm|m;gKntfaNG@O9cak{G==e z8ync+(S`~}=0=t<o{@sFp|QCsjEj7fw6T$;fw=+*5OI|BuGEk@XSbPl?cRM^;LcnI z#T~nMU*54hy5WJ?9oZ(9a_)EU<V<#Wf4E)w-O~Ez@0$Ae2@b~7*GH~iHE-EMmEe#> z5u>f<Y+bi+?=;wCwDAK|%F`)tb9>)JL`qC;e74Ta&5yxMO-ziB#mh@jeZj=;rF-YD zn8-ar{J`5J#sGst#-B|(5fK#v8jL~?)(eC^GPw-Cv7BIx?Fq4!ZCJw~wYa`v(caD6 zi#JX*_Tb%OynPGvrKT8{H?lT!b<XO>)E!SqPx&MJa{G1zVTW5Mj@-I;_vS63gp_oy z32Bp(nNHl^-P|&bL8{ui!SKSN6UTTG^4S7dvzV@g9GMczAasf=t4nK(&w>M5>-hM- z`TY;>?&w-Ii-p-C#3L@0han`L!DGeB761ON<l4e~HUAvLgmBiE_0Jh4|CLP_4i*i% z8YGgO`tL4tgXjaclA>*Y=6>6swU{ZC?MJZGiK}N$-upJ6g+Yp2T%0{FEv>w~T&*}f zU0khNy;zNXcKxg1ts6?%cHFj(WOi8Z=OF#S{>YA7Gn-zNY-ISSec*j4<B6zQ3~%Q& z?w@<)?f<1)SOYnWm`=w2i<Ri$n10_d_g^Ys0UOhQ<=)nbpY8W;>gw9W5UuQOExusx z#JQX&E*w2^^r~dSkA9vnye3Qkg*Q4hbgZ6y`Mpfh|J6mm%4hx8jlCgvW#+ox?dvE0 zu3tZ6;@s7nugBl{lYU$6TiLm3=k(6~@8V#Y5qXQDKK%Wk>a#j;|4lr}dD6SHd*uqF zQ%!8=`vT9&9qE&u+}(cK{@VV>oSmmWG2Po-z!*_!!JxB1QFODh=*I0^Swr9Ue3)$) z=q=!{_swtKng8V**1mmn_wAnl@?6H=*1?<a-<iG3%3$@)NUL2;OI`jSmr-&0p=`{) ziy?x+!JXm4;Ui5y%MaB*d%Atb*X<H6E$g>8?`1x4=EO0{7ulI?EPE9ytfhA{GV1xQ zbBKSxU-W;cK*UbQWz*F376h{Ainr7+^1eCqCUeC<RkqMi`&a#!WSUjKO-nap{;XTK zZ&on*G^TN!`SeY1!NdhW|EDki8?ILvE-hWD9IbHn|HCi)d3$qob8Y@#{<7c4q+$Q+ zr4zT8Z!+EVQ-AK#%{!K|UkJH)>FAM1@mKzN>pe|knN_c7T`aAT5&2JW<==ZjW(#hz z&b6Pmzh9q0S)2WO{Y!`B%%oiQk}|e}Kc{&)lpgKZV%zwCcO1j!J)1V{>0tW%Uv_r= zn<H<0-uUXiJ;RtYCx$^;U0vCqMeKskhQcDIJ&}&hxm;g<q(?BE@hSVJry$<Yyt-Te zz?plT55G4R6*A3et?T~Rx`W}&q52Ee44YrbA7M@q`)&RxjnSa{zvCLvanl{V2Xub2 zZ)Bda^q)e2-AsFqDgNL1AF&yn{_D8l&8K<+jopX#U#t!&I|`Ed$<OpO_-C^P!<kj} z0vhvw$+MhV{xSaubJxnh?2RRE|J`zO79{of=r;N}Tu}UUoI}O*pLx<#hN~Govpg=O z{n^gyk@6}32<ImAjoTT|9{KNOVNvIully;3QYz!s#9!hpf!u$%o2pEIGv9Rhcvk0s zQ1dMF|Eu5J7vPY}untb1ZC_g4*fit+zF0^0H}c^Dnqu`_%xfpNE^lVN@J^q5!khOo z3Px-HH7Oih^S^09T<*W71x~sD9l`=8*Sn^%nr8lAo^zotaod0Uod3(N-+QO87vY#| z@h7m^$x5Q}9l!K~oAX&8B>a_sx&Pdv`ff)_nFhaU-|7v|aw(nuxc(~3*T*li_;<<m z<o;7u(LVm$e%61U)4yhKs}K4A@*vlvZ~Chu9mDFsvU)wqNq&;^aXRCQJ@)VBERc)Q znbS}o^_=DFt4DeNr!#A`y_RRPbUd@;-~B??rGK9vD>vI%{%f{-fPG%Qqrmxh^}P}r z(~rjsg!DX*7npMLwfv9y$EQDful;BK?#`#@E5F&FH~XI;Dz09gy`XKW=8K*0^o1>z z#nrv}WyLNWJ;XJsdEdY9=6nBpIQ)F>_vdtU#EpB0XHRUN%X;7h+pY6!WEA2Yk`KN8 zEx%9gf7O{E&x4p{_x$g!zyFaz;R16;(}q0>`G>@Fre2cxb=7}O!YZCwliFV{VS2uJ zS&7Y+qF*7_it{qwnOO!bFxX(J(7ftGT-c=W^ZJ?>)<sM<lDPe>bg}BjqEE*{JPVGW z@ITit;OdiM;y%|?SHn3^bHSR)bG`*wsmHHwNmg5Ix^F7W0<$WWLznM;6*z15v8`^Z z&${SqyQZ<fjWaoZtL14*^TUlTZWkPPm|SIi_vu@MsC4QT<t;wu*)!z3jJ0?lU%1=4 zlUpuS<%5jp=Gg~-a|ic4J6M?P`c@!J{mxG2i5xvQ<~OZ46T{^2*HxVHxb5C>K66f^ z93fVleHV6KHZ_RP@@ldAeOa)M`PY|A%KX2#_D@^zDl4Gt#>uSnj$Nj#`LouxOfPa< zQ90XTGQ0gE>v*BL5(;|C?<0173w-ytg6;6y*X!l=x3b^b7PXjT{q2JNQqy=JDhYYM zG3whrL&1&PDgNAyrGiH)CQoE;JJ|YKq)y<T@$AJfofn;cC>Z_mh+|f9Y}lM`d6wyq zHZrsvPHjot^z3j+&??n5(Oq+nn7w-__3c32q%e{DS$p5h{X587*Lm$y(sidMrzMv2 zBYdCxNy#YW?SJ+u&P8V8ci!`JPG1iZEZ?1SLu%_=?YOX6ah4{LPg##9TkmH5o26m0 zZJ(UnGqd?6S$8IV(z>g#c=d@)lj9f4s%B)Lab=#avrW`q@_xmfL<{Eaulg76oxHR# z*LO-xX_Mfj9bC5Mx6V$Qb#mjw7iqWN-BR`n`N?+k>@1J3PdlF9Y?&>(^7@=J&s}`v z&m9*?f4F0Yr=>xSLeEMj(O<LoRF*Qau2a7Hj(_dZdF!2aws@~wKh<Pm)1)KPua5Tl z@AYDtSN)vnhWtvNX)LNKXJ$pZZFzXK<nt=4Y>j(28mBsLS{==?<Er5vArqe85gi}W zijO-kwwh4HoLyx$x6CEeqQlgD>AIxd+?&<wbYf5Ke|On__k%mBTV9GETBV>Zw^yw^ zvUY!wzV3yB!;f$I?pD%{vtQ%Tux5@`fBM?3!imYsp)<~hWE}`|v{717{Be)knQh*8 zCObInX=|#<RCw3(sr8w<$&P+aS;qbIHYj&q6u4mjf-^~ZO4g(Ezh>OL&b_Q$CwhXs z$VmyyIK|S>Z!ZeUM9CY>i{clU?40mn;={yz{xuGJ6_mne8OCK?i_0l2aGe#kBgiFE zcljI9`VB@)PC9Q+)%h2}a(lCemg%MDI~&i*UC^IodaBf6`P(hJYf4|FIi1%1;rB?C z)gkAEQ1kvkf#ZJ~yH^y~eX^U;_A+iy#)ZePb}w+b_#!JJq~K|Le9@|(%DQFq?{OtA zDDrIMW16V8b^g(~7VWyQOjCvLTosJd6S(3|1TS`7SmCqxWik8ht;VNpCh;cMFihUb z)|cL4ckh{Z^ZmRz9($yxuZm-13lNR4(wdwf;k%@$Jv-NTZJEpu9U-Ys`zzDAYx$O0 z?|;Z_u>Fhwwz75Q!BxI9`roM^aXMr0c`?rhpJzr3(oRXg6Y1O~GmBkhW9<E_f2x{Q z8|UOLmec6c-~Br0D8~|qUwO}tZ<!IZ>%zQB3GeqiWW3reCp2F;DA2s+hBSM6lI7~} zfzs~|A75~|>}$b9UMB9fInVmbeOygS6a7utSG?HPcFe-+rhU{zJLM~<uS9$(xN@FT zUF(@}>T|BtPid*#NxcvAekwjSKmM3&;qoaLPc2P6d4HdAt~I;&xigv*ILv0Ho!ygJ zrJa1goJapzeJ;0jwdq0?qt8cnG(R)pU+sLkD5XYrxpAa@P?o&HkynYfndR@?w<|=P zm^jfPRm%1K)t|d=WZa5Wl1k)#Tz@0(nEOZPmtTuz7j7+Aex~`OL*|3s<@D>@C+Qk9 z1nltm@pxa(nsved`}#fZZMJ)SCDLJMN4(92&4;YwBUG2&|Du%eGE0j2u9|Y|+Vxr? zOfPnF_DHNaTP13dy6f|@lhMoPx_z>X{@EE?==t{b$$Y*1ipR5s?e5y9m!4K~D&;@+ zg_HdrXV}7zj8-WD<?~Xe?%CJl{lz`_vqo%<O(nyQ<h|ViVSDa8JEna7rM~XUSjR5; zImM3ztDALVuJajLJV}}NR)TG7Yr<sSn(rw-Ti&EF+xSiXacJlF@*|J<GI?(-pYc`c zfj?KF?bF?lYrOWYpJB6`S@@!)S9!~Wwey80{k9VAzU!O&<n~^{?>!<9{v7t(xN7_1 zz;jD)^ldNS6L{$Ux*41OfB2iKDlcdGQ>4Ui@ouT`5&P3#E{Dv&{E#g7DYH>7?_KOz zdW_G)LM-l6na83vXS*!!OitUgNqM91!th!CFV~5lk8}L(|9R)k<GZR#=UZt^-yC}Q z@)UtxwS{Y*ZjzJVc~)Uj{=EL&Ttm(!O(MlxKR?;}LR>JnReGPtIxCG(=~+|Cf4i-H zGWDQ!p;}F^o7OB@>%-|=FSWC5>)m1a!)9`s{{Nb<O>Qqkr*HR5UHV?9HMK$a;&eON zLw`1JKJ}m7_ruw3XDiH~inX2ho1W2ZIn^OceTGi@8~;Z;%Oxl7&=CpJxo}3<J(R<B z&62BK^X4l*d$h7R^m?qSvUpl<<rG!^ja^G~rdhj&**u(3W@^;_P=3|YiGK_2Wv8-l zD6-D4wdN``vyETXcTjYpW{%^(PaexS?(`gbA7)u3?clI4wQQ+!LaGa&nOxoc);CYA zF8`9stZ2N()x0bJ&(TZr+h#E3&;45cASd-zWIp?x8ION8%ja<xF1OfWqP{pr?a1lL zQTrcp&#%<mBa#+mva_x3M0ESB>B(W`R=@Whh%MRYZSVU=L@KTEySitzJBzxW+0SPj zEWJ!+&%b#6o*$wszS{0wr_82U*NNLED|cjjv}oxI|12)Ia{bqGY4@{2(|YTQ$4=Y4 zW<L0CH$l2Oib+b=I!}=Mfs3$iO_)d4>80;<EQ>>zGOT}gZe{-*Q3ai}v_7$ea(DRV zdHm|^Pg}n91LwmN|KvQoS#qaOSsS|Q*n~grQ>7UTzDyEazIR=)`##3wA8(8E#zeo( zGc5S?VV7IPySk5uW0-U&HA!uHrBI?Wd)36Bjyu)}`C9ol&VQA}BA|TFL!c`@Gl|i> zjx}~uVN1GE!MdBCOP}#9_PYQ5=W#1{gISe+61(pGY1cM*Z_p-hpUAXg-hE;BdNnt{ zu<h;>oo1J@^jz~fmo7j3&N@Q@GwG9mf~Fl@^sISvTS|=jnTUHAxYzrz{s<26RoJ@R zX3M=>cU-J(mVTR8x9k1NHELcP)VI#O-SzX;+;xe%TKwPksu|xFovdy1tTIl?u&wI# zE5i?=TQ9pkw&|MZDI<E$AWZ!K$*BP~2Ca3e&v(D*-?no5$ya-&=6`+}&GBomRBh7r zrA;a)rtB>~og#X8;!hq)yS|E#esje1Hh6orUfU~Q#J(_hh5*ad!=4&G)BUGa&*?C6 z5lt3f?EOjq=G{r5hmvCLnYaCXbs|heb78t&<)gRzloo5czfsw<<DOq)^WmfYX{?U1 zU(U<i>i*?=_5)|arM%b&t@Y7f6~ezRZBD6uo*}iExoVPT-h)rK1!C;ql#2^0JTi#l zG^x68cIC|5qopF*QZD;`Mly$PJJ#{fCjZLDxi7A+?oRou#4|BN>+Q`?LP@M=XQa5T zDp;1X;IPZ4qkVR^S3<5CyKpJ9PdzzBU%!ga{J@WdT@Q6{I6EjDnOphSG3_Sn-_t@( z^QP(wb589JP3n9;Q^9db9Iv2#H!I__=Uy?UmyVl#xy?QGhILL}VX|<@k9F^B<UfU; zSrPDMYUTXu;-I+5bqCX}`=#V%dSm;Yi@zq{b&a{u88#)UL-W?3pKB`~Pp`b`X}n=+ z`jah9Zg=^M%lG8*@Bfke&qL{P1Uu7<<+HU@d--(jOm+yU9CzDSU9w+sb>jW7=$U2> zi&Ji0`SfO*==s$Wx!eCwtGe>|ck4o44T;)g>YS=GH13>cJ?|N)_P@k(>jTO6bG}Ml zpFCsM`Dg#!4(&VBd~<SN)ddN&Stp%aYb5su-Cd<SBV%>ji-WW3kBK}~YAme&?-zY) zwfJ(jH-8yo{{B*mP^b}>*>O4eQ?Tw6SLc>5QEgj(Iqb1ckKaAxv9+11vGwXN<`3AP zMW(mz`1Ch&MgAnQ2O>_^W}p0<?`!096`KX;GM~y5I%F=Q^7hBadrMkpMAaQ|SZA>2 zW8z%N%d;|KI?hd8A$axNy;o(ty?%OjA*Pp3f0=c6*M<7uhvci)rG3my3MgdwT~d-W zS^0(cjgwp#k4&vw_vWvb?Ux(Z`<~4;xxU#<RN?Cv_kJJCrsSnT%2Km>BQM_l>K7%> z^WnACD!UgEUEfb{dU@jLMCpR_ow;9E$41xOS-<zs^{q_JvCCPbf331L`y~<M<(^xa zbxql>C0jLp-bslx<JTu_oX$p^ea(L2kxy-YzR9_1vhFi3-)GuC@53*t0=2uBOjH~1 z+pui=Q+5BW=XV3w$MH)~<?0-LeoaK-=*O@Ez23<s+08Sw6U1DuSvzxhFSn`Q<CI=? zVe_Y%7o9KJy2#&N(;{&0_SCn3{Z>R@{gJrzm--*m-xL07bqAlexRe;TI%i@`n8%#o z3SUkcHLdsD6zEi``oLh##1D6?wtPQ0dDmo~ySbSRlNekj{!9{Z31!^Op|sAbcEzjZ z*4x;hoquAXapC?dg{LCR|GvyHl&+i;kbmZCP>i%^qgGhx1tZ-XNo$U$Ki(y1byso4 zb1$X&O^^8m=G``6{e7P|&pV*lIrQcKQ`fzs9X6Y;Tzt3o@vN}i-LBu`50z}QmVB8d z^)dIf*@8vd3*>Gcf4k?)xm`PtX>Hg!?ZcP7yb+F$0S9V!IW4)fhhO!@Z^4v5Xa6kL z^}XW5xaXZOxBb@7zUE5b9~T82vGEdqlE^2td-ML6`;y*Xu3+<=Y|B)*PKd80cZwFv zEeE?9{(%d!!?spM+-~bld$~A(Pur=O{mhh~Z`~Iz|EoV`M%}}0v(<GhW^}M$x3Au| zf4%l>>t7#&PH_9}`TXb69hHYE4s}}}pMUo>wqxJiiap29+g;I^up{Z*1Xk97s!Qz; zt+OU3JZ@e6VV1SZ=ha>59I{(y=HLF4b3VE6%}>4RozD+n)8JdFWE0i2(f{3#q_VG5 z`xv5LiTr3P{~6?JcKnmftC+=6mf6orSrXMJ)u*qsnmu<yr|i2=)mu+Z*yGsoVj9!Y zIU=kF=iCvi{Vua?M~b>dn?TXz9?f6B7yLe>dVRH|c<7#U@%OHp)U11;k#&gmq5B!R zxJU8ZLWMaFYd?)~-Fj!Xi_Nk9w`!^s#KZm8Ub}W<-^@#{GG`d;PBxr1pHy~F-kl@V zCU(a!)9Wh^{9MdeS~EREyXV}}s&Bz|F&f&d_cl3(7QV5nTx!t!v`m6`S%0(XrE=!` z#_55TI~FUfDJ<k%6?3DZa<0t{qn?SZ@vJldEl#{NUr>a#CVQr};^_^uN@fJCJybpW zkAa)k)8mtFGwna3HubB_-@*qs(qEY`oG8sIq_RlpeWjg<Aydt|&EA^duNy9!ZlckA zW0O+ZUS**d@mc<fJ`0>yc4yDNv|VFoe7A>m!0r!)d|egC9_Pd;J~$khz%)1K$&OmD z%hnv{?NW3+o!2k!zp(si-g&`KYa=?74tt)7NuN1y>Exf1%lJLwudFg$Qc@~#vq93k z&a86fw<j;>1u|SK+aTNj#4zLcd-h`I!~bu**njZ-xn1XXUHklL&W(RL0h(2_QeVHg z{czWc)oOfp)2&@P*os{}8y2iCQNFq?%k7}D>5XYtPyI`#%{aC>%Z-8cWpm$rD<#QO zo+6ybMJm|J4XpX^Ed9GD&Xe=leG~S!ZT|lqk{Z^3zx#u^Z({I0+xhpWO_{m;=h6ti zd0}VTudOXLa9LXP(jj*55})ZYXBQv8keasij=QRc=hEC&bDrOD>aBR-psLn<m}%ST zg`sjjb58iSugYG&N|06R$czuNMKcAHViy_wEDt*JDJp9Bro#I|1ueZRTZ0%^ynfQ@ zFTQH!#v{3gAA{R|vzliv?UwhwVR`fHr09jN8S8H?@H!#2nmv5`sWq-rL01kaWXUc& zx9z#mbL-b9f_6=bK6L%#7rE%)RTre@tln(6BlLZ&W}^9>_E#mJx!x_md+o!w$t#y@ z_09gZWz)l3P5Jf`Giql253|^6l71+0ji}Bu4UYy-B}qoL)GM1_bj-0*V7_YQ+#kQ^ z_tt>ve~!)3X|m#askI_7cSQ&rqk)Ov+lzhqL9G*vQWdPYs_Ty_X>DqD3A{L6ibd{S zs?WK7$+mA@YR(;H*I{3-62H6T>Vv#c&&2+FTP7Q)A88T%vUN}Led(N2HeafrWbF#~ z*^nuI_DhGzx7n?G<XvXFcZz20*w(b__N_9DfcL$<dilXAuksDc7B)_uUL!C5;L7vE z>b{Iq*+1TDJI%=UyK&8y6YOW+1>U;!os~x{Es#<CQu^i<o2JI@_1yfx<bzn-UFqoL z@M)*#&M??&)}(nkki+8a*EJtb8oi#8#>;c=rdQUljT!a~-!xk|6(3%?=E(S)*L2F{ zw5u=Y$UJ+uIql9VSFyPF8+S3=iB2r|FQfbN-wUB!`K5U~8g_@=Kkw$xy*2ksZFtPb z2Bs}idk-n+R9ZFh9u{p`H2nzURHIpa599+@e2HmWn|pV*{{bV;R!@dyQ(xaMH=h~p zH$yW1>QTN!M?4N0R<1rh_r=3|C(krDACJDgF{s%>QM8}qu+f>9-A_zQ@6EJo+|t+H zb7%7Msj}M{8Dq4J?uD9472oO1dHiW|W=1i;hK*2X{L;UMUdudl*ZW@i9ei)iu{Q1K zUPbxT7t{DZGPhKSoOjv5TQXxRFW1hmem%>r9`FBDv3c#EsA&apueZvT&olez#HKaJ zQM{~KRPmDF!Jks$-1z~)`7G&5fiHfYcyLxJ=77S!bPYx}p}E}B%g&obFMsYQKhO1( z$l5}O&NEA@rN6}Q5?H}|W%ZkbrOq>*v^09At>>6;p(3p8R~Mc6Xwlhd=g2?nB0GCk zmT$KIWMg6N%Wpho&Ze~b>IYq^`YH<AdsG@rtmm!$E*su@etDP9O9l0xTkn|f3pUS} z{JkmW#j?XYvktBFoyc{JgDH)xVO{jePgy4;=3clQdGbnq{MBV`@=LiHC;Z>F?MCl9 zBj*L#rT<mEHt3s$?w{@3?p|k5t|RM~!84)g-<0I;uXBDG<{q=3mt9*^bk|m;;>uN} zGu|7otV%Xox@fm$>Djs8imiGjo}6=#Sru7sddkvj&4;P;ua+jPH{QP9-6>uuS^Qw} zwP)o=lsy&a=G<#rd3%!SzPaDcQw_}9<j;BensgjCFS6UYX~J_Gw+gKpi!VRYj65-m z_cZ(bJ2BF-r>kWOe3jc5$IMfUQCq!$^~$4<^ZZiR7?(WjpUAN)+v3cALG`#h*5+rs z?`jJhDmZc7yAZx3#b-;xu7nj%ir<*yI(KlXPO_FV3ta!|f=K+~RVP@l&hxHk_0h?B z(=X)kQBJ()<gN6?wX@e5drk1V^5|IDwryIW)`4+X%-0|9k6P7Q(DPQ{&z(y%R+;^I z6Z(TK(xc5YM%VvbOqHCsgz%!-a@kp;F=eNu&bFNqh*)MWwlUytV}63yN4?B?j%}G- ztjRi?S#1Aav7R`eb!Ba3!FyqYM}IF0+<dll_bsPs6})XlSFahY*7j}RCGfqw?dPw) zhH16!9rl3-Wgje9tl?N^o4Qr(@HLAk%VzmBCVwq>aNJjWx!pUJ+57VJUQXC|>-n}_ z8M|jrkBZ#ANq%*ZxoPe6y^LEHduREJ8qfOnr*BcuT%AL$b#sj>^SA1~K32FdeebM^ zdX@4UXRJMaS}<Zxy^nRb!ZNqXM<s7of4ZKyXsY6ouEd3J?B+RcIll2om*eUUE>RW5 z8<!e!-R0G*cRwVf?&<%<;lr+rMzbxPS6}s<zU*A)>^uJh4$I4N`Cfh?@=~+suv_i3 z6~6oRReH92MX$G*#dK1BH{Z73CwuSDyYTF9jvMzA%e34ni?>Sdcs7^Gv1=CZp$eb4 zkG{dhZ)Pk_*rfdBuGU@l)kSFrEoUMla`(^ie<GZaIae+<xB7wY;{M~`*gqJ}GTh=` zsP*^y^Q-PUdh_czzkb+xQ|Rj23!2lmsjg2k-Lw6QC@YUUdk>f29;0Ip-CkaGr}ieS zTmM<1>azN=Fr5Q2SMF|_x6rUItEHrGN!jdoYD%Yi-vr7SPd=SiQ~F`;HCNrr?R!oK zJ+hSKJ6Iel<s*1tyRVh-*0}we>#hey`Q8khe}=L0`;p11K0@D(zYE1>Fi%~VE-4ds zOFe~i!KK{(?}pM6ib)^W>a+gdnw)VdLG<H+lkeYY+@1aVA7f`gx!6MPwK-S6{Aul& zw#Kbman&Ww8~Yfa2|sgmlS`b%)?e;;A-scoN739CuGiisl5KXSf;AQ#zq5n?2e+69 zeN#UZP_{7hRc8>BN<ZuSqYoo8JZrxFIJb#sugc|V4elO?#M76qPZlco)GGTqZF72O zRo0D5n<pg5XSMG+C3$O>ckP499VbH;a+gm(a_O7I-l%JQoLl)Nb~SZO{8Xv3!9CwM z{8CI6>-ryt8)^hTEiH-2JIr*D!(A)wyzlvh;Luwq+mw=&rX9M$%*5+0%2Ff|yJSJ` zt+R`F<W<e{cNaQXbV638DJbD(B=@OnbzBk+>}4#g->(d@Jf?6rG$Oz6t9)JRwVAec zQ>-^k{PgEd!=&IJr`FE88n!9lWi_|%rm1^2>`4*+;pgR7b6+yq&zAQ@^o$3pT<fn& zP2yp(^*%SP!^YyNP-fHF{lWtG=f);k%KW@?Yvu&Q<jjM2x`G$%dh#b#DPmVxjoG~9 zz8^;)e_ms=w4l>u(YpWVWzK)hi>~9%{B@{j+uAKc#eMm;^KWM<c!%yi@JP=>LUnpI zvx4Hz`&)(Nc{Y{J7v4H~-I+yon@Z&F>&^Z%(c$~S$OWnE82<e7dA7hPF!sW_9A%#m zG7seM2O9o4ncS?gG1P=3pzW=9rln;6@pIMdSf*uZI!Ao@YAnuuF1vlf+Q-tDHSYzl zx^p4Yu4>;;&11V4dfpOW?(_O!n!CZm!e1;KUzNY#x;FUntaTUVUH4@M{m^Xod~X+A zyXodHljElhgKNrcZ5HiT64_&LW3JKk=-=zu^u4z%3M%4kw_y0s_V?H;#cyr>KkjON zWm)xV_bh3jgO8_N`?Ki}Yfb8Ul~~_{cf*Wz&pzJWzvbJ<56|Y^Sbm(<;U`y}zrE2( z{e;)|I96PgKhC*utwptM%Wt7;KP6WeE3a6k$P{P#&TZnX7u9d{{H{q_R&rIIxvjUO z?T*5yPiIbXzV`lRxn$y|iigGWC-OFbur@m<oPF=Gma?nXf^YKYmPF3q`cqJ2f%?hW zsktYQ{G8H#jN{L*sMIM}^%wZIi`*-VTz7MK)eJoY^@m}iuWQ~jHNLF4_1?OV{mK2} z_lKHWE8c(SI{Rwo<~w^+VlRA>O}MbQv&gyhN@h^^qHiWl$v=Nx+{E+7_=ghH)MZsH znQvP@Z@nQE;ut-nbZvNp0)w?_2cO|~M(wigraQdO2_)uS$;os$_i4$DBfRWFCj+E+ zo~W|lR`PE}a%=e)nbkq3VrNb2G)O&GyW_`!U~AEYpfatFi7s28Suff6+FxR(jM>s_ zq1U*Jd#dlQ+UBEov!Qw7Qo}u-hg*-8DTd^ymd%<KSL9uC<<7Yxsl#t(PHW8xu&(7y z|F$GeEp}5txKc^WmN4csUlhem?YO_M&ONPLy3y))&6?dWEL7dJnbKEH{Qb4zskMPc z%8?JIbIxU4;AIxtsQ+H()?8WtEqaeWGPONTPiJi2UC8=%P4fjN?GH2Fr`z><WQXJ= z{@>8bE&AlFcWLS4ITg8mCMH+X!rw{lZ*%&bYoD^eFVF1wIj{6{m0@ZVr=4NndhyA> zqb+a0PXF<f^_epFUjyA&eWE5+x7jO`4@z+5%-qD7UDf5|eRh}H&+=9+=Ce;`C3I|? z5cf36_+rD?(CI#YLUyIudk%>3+_{)~@9g1I-!GhacaV3^{hYbhzGr^)ZA{dd-soAf zVuoXT_{TkZr;-+j9j)*#-<Gy5<an`@Vt{N^fM=$rQg(cZvZ%6NX8QSXGm%|E-;zBK zF~za|$=oI{q<3#~s6t@5mu~V((GNjKpR(3Yx0EhPmvKB_%rt@R=bZ<grAq%+{rcwl zDJ*;8q%?Q4FOxPayLDMy6Fk{4mCLjGVn+Sv!=IxIYL2ULMWp4wd7*go(U~`ss<*CK z{zKyIDht6i8Be*zo!@B$tS)D*mWYg9SfIhj{BQQor9Yo2ynlZF6?5F9`y0L)#?`L- z8u(`C{HL4!ldf?rDLA4L%l<mg#WQ-Z@At*a@)mCs3ov<nx^&+sL92(8TEc2Y{+LY5 zt!iG-!L`)a_FqL@&gmu1s%LIbaHuJ`lD~D;&z9?tRZSNDSQwJEb6>uDY^{#^uDd;d z&S~zRY1TPIjMs6p_Y}qrs?(}2hF-YA>?h$P+tcU9C@(&(Kl{^FYljbEFM2;dN>}xi z>Q0I^ICAY(OYC#iTOP$uE^@C=PQ50VvM}j+r#a)z+?@ProqyOTdtOd`Z~Ax28h=jP z$j`UR7yffH6_)xqE%)=bIWs(?<@>coPh6Q9w>55q=Ml~{C85GN3DcGh{fcsK-JH9a zLYUc3Phj`>xYtO!P2j+dlTE%gIV~;Q-kUZ@thZte(Y$nInb-QLi#;k=Z!Z#e`7ZBQ zVsj_)Z;PRDhGk;aW7#dst#i{>sK!M!iSD=Dzy9&}Eq_jhs28kGlIqkB<DA$%{l@Z0 zIreCmjn#K=&T*M}UO6P^!Jpj7z?IE^owGzzJ#L#+EEB#J+PZQH+iW2TuHN=Lcl@rL zKYTaK@p(~dP-Ebwh2ny5D-#8KrgME@JoD7$kmI`qmGr1q)+|P4uKhfIE^}9HPIaBH zv4$zB{JC0WWAdS?O^@eHIhTL&OZ!Uogw81;)29@A|Fk(P%4hu}q@=vnMg7m!*$;#i zMG|K0WYY~{=z44LX}-)p`ALr|l&@L@ywK>m{4=X)y0iGhn-3!O?JqoWip}eDto}0T zsW#trPgBFbceg~2_gGvn*4(YWRqSYM-66C3nd`H+rcBKcpSH34^M=HS*PEsq^z4v} z*H8*^|18ORoUgyvz4pJ8C1a(&Mb6JXUvhp(>df<PTFh&FzKkn;woCLL{kuKpI%Z62 z>rdxy{*^U{t$M+RcA@ndW}Uu!?N)1C`=_0E_e!&;MYH%0llSXO`O;p$ysaVC_&B+} zhwb>q)=H%fR+_6`$iEXWYu0dYQB%B_R&YJQ`mPO^Q)20pbJxBLRdAiJedi$){BC#p z@~*oYCe!-&h#45XerqdVA8X}odntb|M@IDCk46WBGvCeQsD6K9&B9-LovYJovR53v z@n@Ilk%iN?eHIl`+HkmG#r=>-_igWXTq<5<)ce5Z7nAIAv&E11i3@jj|33Ut`tGyU zGu3RQYB}3-=ZCN@Zf;Ng-~C|I18d8gR@+o32kCDIue8Zuua1vtsd}~~zJqJ>oOP`; zIvU&UN+fM>{JhO-bo|!dkE>^GklJi_w%Bg7`0cQ#PlY}m-~4s0$@`*^(BeY&Q|w<- z*>37v#1}2z)%?1-RklW8ljSCF_YYbt*NGQzbb4jl`*P)(fAaNt(if)QlwFW6b@P9b zukGULRxzFW6MoElQ7!g8rT5(V`8UI4w43)Xmy#*ykc!T+x;Mpf$I9DvD`uI+_MEJH zG||T}Pv%B({QU*;3V+(Rn96)wyGzYTYJK5y;Xmddf`YbO(ti3qWM4!2e95_|3)Jt& zF4X$FWuI*Qnxvz1xZ-6lUB9yHQ{TJS@kWv*J8p(gI)66m>B?8f*TrmIURB+7_06Zd z>eZ7H-nKgh?@;J?wWEK=R@36XuQj$?FK0~+eR_BH^BdPE1vLnsN{RQq%Pg{iQ(ST3 z=at&eybK>@m44TVmY8Xu^XrGS(4vBe)%INp-s|>0Zk#b)yQ#wXcY=NX_IoL}`3<Wa zW*xovmVNcU2QM>=IoI#ncqk_)D!2YXpQq4<-Z@3TSBLvH?wNaYUuXuW)bvZdxhm4{ zsxM}!d}C0*nA7>8quKdp*!|;II#xfFP3L>I`i~^{;i|nRT}!<qXE2E^&SQ_?yvf`* zf^q%!uDTpMmznQQXuZ0#YW?0YSxt$QUi+Mzm*1><Kh?0lC8O)0lHd&Pw>PUkeLAdq zD`<PXw$@#)Z6ygGm0vke+aqnRdTrW7%V`_7R+_}l>^uB$yK~`j$uCx#2`*RvIZC}r znQyyjcHlpYoLj4oY`?RaE6*TD@$tm4yyBYoR!iHJCh)GFBpEQpEaI7Cr(#I{OLZdw z-Qz+(b>B+!%vzf`r@*6rqSL>;sI4CqqTC*(vb*jr$U1UQ>;9?jfk9H;v%EwtEW!+2 z-Y<9?6<8j!CbC~B-|qGLRWi?6(_0cN3)2iYhrGSVt>|@l_YGtFN6qZb1tJxk3m zw71(;oIfwRUZ_`p)-ImUYXo%f#lC)#Y<K5;L{-PXii4q<CKpeeJm;3VqGoCK_;=Ud z3$luD=2d-<@vseEkrZ+24BPYb=Nf+0*goG`UVh_qqU9BXy~3?0e%$Qm^z~3_eBYPe z<D2m?Qg!(e4~v(RN)^_>vXs5~KX27{y?Mg=oTk?}Zyq<?CzjK>J~LYV(<A0hfeYpD zrTkQRD7DJx=<4%bhgQG5wO35jFWlbqT~?HtjI&1Sv_#&BHOmf8amajiRGIfme^`x6 zJM)P?ar-dN4*j6i#gnyDtAjo*wNG4sr}t@1S<N|LTc?$RCObF`Jj1?-Iu%Y_8yd^H zQp9NaKDNuMi=MW<zMCy2x!-y6&OL`1{4HBf%z44sc6-->zW-9vzu!p3aZf&e)P3Wh z?CFo+MqFI4F>Q6<{*&eLn@&v#ZgG&=wPamsgHJ89^^=PN7uOp6oVwf3Z_dfhk2{ye zO{mBV^4u9YWpDD#4J@h>vEAEv^Y}ija}ASUccNuo;iul#nqRpyuFN|)OHJXGMe@TJ zJ8M_^I9Gb)B=-uPdXV~oRa8yGbMwU$tiAnQoa^d$cP4z_ajrIR!lqYWN=t0d&8?sE zEOtYD+>w)_U2X=xQ~&+)H;(!d-@W^zr$_S!vvhmUEyi9oE-Ga_6Jq!9mg-$)xxR9- zzDUg{$^EmOB3ISF_#j;=x?rA6Z|=n+58ota^@9~>t>>;;l%t!l%sb}U75Uw#4g6fU z?^V7iAlN$p(>(FRMoZGyIeUr6NIq57n09hUnf<O5<!c<JTib;M{@t2C@Af~p^yY+} zab9P9um3FSv%h=wjI+eW`-g<@{J)?no*ua9Eqiq%<HtL9#2xfLJh^jl!n0$~CpvYi z*~UM)?p$&{F2ncU?8_@Nm+s<z={vc_jP?4S%v-xB^~%NP_RqaoHskouZ8xqTU(|fw zBhvobr&2G=4>@Yb?_WNk+B|pfr1#eRwkAoF65LPf?F%?qoI6F=?9s{M%3lkLc*>nV zPx#I}S@it9A8v02s_&mJJ$Rsd!ZKTyrB8Om?-4)fq2<Pxc>30w8*%5aB&w$Gd9QiY zY?qwh+ja8)Clp0+$16WSe9$DcY|EQf^@sSya-`SKO87GQeA0GRE#t|%i<kV965sXw z{cjCUua#w=(_%{&Y587y%r{fPS5L~TOIXrrO1{=(x3=j;Ny3~x!r5EcCrt>Jdb+iQ z`;YvMLpd*(U1D<=Oz7}k7Mu0yGh4#9pibe%UN)IuJM%cT4{GjepR8|Td+*J@7|Smw z&wCh~+`YKxUjF}{l&Hda6C!>a?P9vybT!4w)8^p(FQ?}xY-0b%v3%Q(j8%7^^WLo7 z{H-#<g;P>}Y10=a{mHZST8%Hs7;8LywTrn!>8MGP-TC5d5$BbRo9mN#8+VwkX!e}( z;i^iX;M#bbq-D8vhOXb2%dw=`<ee+JB*&7K+q^Z!WYf)ndmDLkG?cw#TwNXrRUB(R zDyc20@_6^+I2W%O`X}<Ad_7{eZra6)<u~Nl9s9eVt=F{F^8R`sg<Ynn57($fm`ZCL zxVZmj#6%Zm`%`-J-7`fkl&^%#tyJz+Y`kbX?SNrZ><hh`njdQS>cVvvDvOl+Y}aJA zl9Vtw`|wSm9q)7Q?*Vn5eV)dLpNDAZAFcU$>Zimn+r(<)=Fi7A^<0=fJL2k^pSprd zr)T`snynZVQBr>TQ}_AyiCW*M>1BxMB_(c8(~qsmx}KM|>b0MUfmW5}(e+!V?e{tM zMDo|IpeTtoy31#)JkC-qN(ryqnz4ERS@ZqU+b1~$pSGTQ`FDibf5z|2dUHaBwb>GG z@hkH&N-7*UoG8CuE@fTBqn#gRPw_r_ekO;RCG=*m%JDA7`x4x5wfOhg&Dd*kmM87k z7uS=ovVL5VlxLkU7f>mv@BK?sTr;@C_V-+#lWw{;UwFb79na%9;8AKc;~!hvR;OzY zzV$cG@oIYLtT%Eulsa{1bw5|)#qCm6otvZ9O?MOAIr*f{_15{Wx~p&0`QJU--E*z& zib_i^i{06)8>;_Q=jCO)B;-6l{v*p|ZkqL!S$;qKzr}G#OYW}=UE#K8PvR1Rof{MT zswc2jyt25aqV<#Y@DYznkE3UccDIP-pU<BgGbu3G{Z!42g&{$_N?hx0eKc~PJD*-_ zd3m~Dqw|f0^2^E}hUgq#xt8OL=*p@$B}<PMy5!$zv|pDq%OXc!akFCN$7GeQo`L^P zW|oWG{?nXYe!sBaC}(@~lqYrq!fCf2y|&w2u}R}(N)qSg^aK0E=Dp5-koZS{@A{Gn z79}jrpNibBvqwC<yTg6K?>`g7V;-CS4m%%N$<L%yQ|meN$*0*bzh7G7b8M>zGpqVv zSCiRM!A~7#ZTx0=NO#H)?iKwa%Q*7>iD(uEn=#B-yu~UeaP9n9$Ei{JF=g-AzRZ4F z<ej%l?9rE(Q%~=|!(CDD@`LU8i|f<H^lSg#FYiqZRo8qn;Xu0Lsw+3AdbKc$>&|iC zV^$ykWTWTfl|L#^t-ciFdHc4waCuOs`PGHf?<swYWnJhQIlo%wK_v6%;Giwc2ksQD zdc2o&v)PPm+n3kZr`&gwb`ILJxj5|T)=T*^M^t7Q>$(OR7EE-={>rwk<;?UX#Xs7T zN{8n#{O{h-$<C@Mefr*SWhuAv^2fG^*qN=0E3T{(;kxlymXo)Ib>E{e^8cDnf3+2s z5DvVxAwB+T&C)H)OZVKl`&qPbU-b_Qp2ouwZ=TEAo!~vmJ++=I;09B;;P?M=rfaTf zY-=_Ovs<w3yqaue`avHxW$W2awvLy7<OnTRQ(RrL{O)|y*`m5HX4OVq-?<{{%>1cm zT-Lq+@|iK}M*)8{*BRpgafWMa?&;n=`yyt`#M$wGT+6$4Ql<p|zJ2L<q{y<DlGCoo zAMExNFR!q0c;T{5^6L864@^C_Tw;2`nZ(r9CEc3&O5SOz{Q+KWj-MilzDvUP?+xsf z=c+unsN~M)plwH{n=$T~a-Wq;VBhpxUZ>tQO^H=I|3u{CvCR`?(;Y7!`qaAn(#u~v z&Ru@FKzw0smctK|Gu+a33Xz_xAMd}ZZ~j5mw#@0?qShTsYy#;=C)fOqQa;0Ad^K-F z{in;xO`7wrowU;w&hn~D$Vu4e?|Cut`;9EA4Yz_in`=Hij6TG&t77Hp&TEp&!O!+& ztXZ|;&d<zSDfid?`J-8)>AU~Si+_oeBTsKXy266%glnnW3NLA6MeF!Tlf6-?FI@N+ z<hUH&vRtTfw&`u3)55;K-9_dX`QIev%xL(Wpj$6=^@8|$>%;p>7X?i&{(b%IN1rz3 zIGfwY^Uf3$$ocFDx_0;f@#DpnTq*gwzJ8kJHxr)eE6>}ba&t|{H|Y@BYhRoTxmEwx zW`ySM-@<n#jbr1Ry~3TxFU>xry)16)%*OfAYZIJbs~u9@=+WLJ$#-d{w;P|f!legI z>-aeyKT^A2di#o{+X9Uui5({kY$eN_CH$w<W;S#;+;S{-bq>3!8CKW-@2=<X&k_BO z+>&n_gZkz?436)2o@UB;Fa7)b=T#vVQh9fd&19MFox(0;(6-I--H&xoMP`@3wfkuD zXx1sCgg)L`J*AWU_NHv-UdmImBHv`v$G4~MC5jz#GOV2ca<{Jhi$jSufA_a;7QMZT zy-@hGH=Fr_1eLFk?N*m>tPDGNxogV|$>2TRY2B0dL~9Ae3-}A#t?bGO5AK=h;1+pb zJiIQve3ozM7LnN-Pj3zAov1YJ5ktr+p{lc2Z<n24Z>M8$eOAjk{}blN*YUqfWU1a0 zw?{YZ;S<@~y;maFY_GdD|BSEd;@k_%{+-;bWOrlBr54M{yHB28VDaMVtQ&Tj{(qNV zih6kP0RKfB;hPWGg)ceJoKZL<W8#L*xe^xHXSVm<yzoZ#%=NP0Z{v+Mq`li}qR*E` zUnsem7<5p5oo<EsuG1$~9^AON&qQiI&kgH7?T+Xkp=m+~u1W8lD`sEtcY$NCMEu<g zb9euJWvl+^pU3fke<N0~UEC5KQ5`%ZIdH#&ue8?cs@`9FuJOxFKX#*R@0^*wqFc{? z^Ru1!ws=9(u60Z-r=AKq9(;7(eCfT{4Ow4~y(_;Gb!K8g*yFQpre}+EbMKT_*sORK zYr+3@vC`Hs-LvZEXIy8gG+%X%7hkM>VbQ01LI=6bB#ynDb0H<(MttYBWmC8Kyk1^; zyxrjA0$z6QrOq9-Miy1pJ@tGK)hyaV?_DgbxpX2SV7h+k`H35ZFEh#qWSlD#;$9*D zUFz&M*X^g;4|3dF&lI0kX=5y|l<&JCHAgV(MZZj8#V6knk5Ap#-8Zd#YHys?q7s>< zyWY3F{`_6_m(PyVORA${LS-wnI8QHm&85w${QTb0b&lV@EeYH4<mR&5oW{x8Njp<^ znzsk3?=rvayC{djTytTK*U6{LcU@d|N96d+hrwDre;IA7lYXl`uXxjbMclx|LZ!!W z`eTi!8+5zZuDEa{NseuG=JJzkUOwCUru_1{9Vz`=YHlCf%;ov0R;eblgJbKn&GY|+ zt}@@ZWqrVgnGaK!*n1zEaIb68j9nH2zwS&}Q*pg?qsQf9n}1TKQP<t~gf8e;{B*k7 zR>83*`oK*8fL%MKD+|&U&jn8id+_AlrYZ%KbCp^%Ih<piMBl7EuzFW|=f@ovUJE=_ ze<0DmMQCzzxG(3%e)(ID9a93$uKfr*I5$dfN&aOHJ=y-%Qx@4qJn{c2Ta|c3#Z%00 zv)#5e{d__<pWohibI;8WZ8uYA7p2)moSk$$%4&^%WJBGLps&&w-IuL>o24@K?34{v zTYpR`|H%3BNK(GPBZqXQe(&<1KKJK`UdpetUFiRa|L1+1k0#sx7`YU@7VS<x*>&R0 zmN}VwnrBVC$s~63NLRu^%Wc~2Tz6xnlG{Fn_%&DGP+ER}`P`+ylmZocrMs>#ez`e7 zNK@zO+Lu>OOzvfP8uY;Q{4qHdDIV2=);@)9F&P!64PWd2t#Rw{`F%1jElU04|6k^; z;>%2~h9u43(qnK|Vqb4iU(+k=jV=3DEQ*)y=VQweoNDCXTYF+-k)OKS)k6gq-2NLa z=Fhs%W^`vY*QYa4Z&GtY%R0+bET`~9&t38S^RFx}QGOlWS+)wfZ>o+3UpeCTB>l_k z$=nLl4lSE3Xu#)hH{*=|z6<=vg5}jkx<l{C2!8s0Ufbit?CB?!n-VwQDKoF%eYbnX z?=On|#t)M<MSnz`koaYAldVuOR4C=t##38ATe@mqzV)&tDXi)1AHVx|%XUnWn%b=X z>5$~xY*%6L8*0103$FQhgU9`i>lrD-rC+Ygnyy%JUePXm%bl=ubAIMa+4ct<iJi0L zw7A~k1?BQ9k6jJjDY5S6?H)@n?d99&-+#<tua*41$oHFLVfKaGtJ|Iw$EeFmr)uiV zpWpqZ_NPba>cc`mtfn7#xVy$WV1s&CgW;NNf4k>PpL~v;C)K|)c3sw~<lXkGUL`X$ z7PEc59r<@bU2rUC&c``NPE{(aI%RJ^`gU9XkGo8hWZk;%^c@Mh`)-2Jmr2jFR!y;R zs*tt&&9i4^TF4L2vK?Jbv8i`v_X*@D^CaF5;#U<q`~BSft?B#TGpo&Dw)wkSP<BO{ z`?p)^!BL*qxqikwhpGN~r55sS0oyLE7w32S=v7-x^tHWMy5*30jMdHv&4tt6z1LdM zxy|pe#Oo&;t1eYuSL}@W(>+(iGRpE2$2$Gp5tqy(q~<SHwNQS>qsFj1yz<LE86)G4 z8=S0a`@^`WYM;DsSK2bE?{MBmgQ$;X&Jjm6)#h#c5w~n*+RC;IQz!lOycV|o+Tr*~ z<$H|pFUVMJbZp;u_GV>=E_GGQFBS3`o7*}5-g<mZVT0Q?#?@up>boy2{I&T`#qq-A ziS_*T`$TkFT>8U$pWQfoyl}I?Q>D8r)igQHud^s#G@9L4aP!R5HvM1U9v{?GI}+#B ztG8J*Xr-<0x)XPQ-geIF4!wIW>_VAa!nsKo<!rC;PtoN$#%-V@823m*!Y%d2&$&11 z(hhDe>s<Fyx9$D<E3Ma#JGBchoc})Hv~qXK&QGf!`AJl(_9|UG)VkoO{8T-z$v0}Z z1Rn@Ct-GlF-GGbx`DwO?f|gI}zk0qh%)WF%@mAM!)!iHT*R7a;X=%*fki`|oTct$Q zY8UG@$O^QSbRNHY{q4il%5PVe9xe2~Q}xZbu9?}JZ>q>-JKZPeGN<<y@fiJ|uxwA! zm!<A2W?BEM<moQ`xi@+5uGGgK%4*Yg8CA{`;XZ9=c;U5)jfN%fzu+r2b!QL%{%CMD zE6O4LhQ6gd`(NJT#YbH~U0ra!Ba5@tTRwZyhxhOIt=CM*eX_IIcjXHgHg-qLJ`s=e zMdb&5mzFQt-FCyFwP*Q_{-t|auTK9kF@Lf1Zi{;gA`evgb1tlmTbpvSf4g(*jb$&s zF0J3!$J3)69jSI8@Y44W<umTQoY&Fz$V4ah)5^bx9!^y`W&7la0$=jWy#A|v4lh55 zr&$y=$GH|c-%wd+UcYtL$?PRoaW^tqsyv*NE7ULa)}72#TRM;1)BVY+;%=`*0g>Ri zPjiDZ?xY_UOA(K~>!BxTbVA|DRYRGz`aAw!GSR#jdipKbWA(n5M`E`8%(yEYkaG0f z=gXG4$M-b-KDyXTbAM)K_{GB^`+Q#XFFm#@=7YIm#k;vrw@wuN>uIyy_^Oy-+Rg$A zm3;-=JN4xsUYru%61Ml~m!<nFoLy5hmhcCxJDL}g=q|PWsN%hkA?nqA=Pg*?ch_t; zQ_AZ5R?qt3XYu@)c`-SqqD$_^oV;L}w`RBF1AXh<^10DUb3HPaW}d6GvodP=(Gtub zw4mMMl(G97H}6$lv)NWNnp!q}VYXfQa6`o>r-zckE+&?7p2p8EZ7NvJAGF6ceDb6O z-M7bPO^~X&V#>&|cHxugj;C3dHrk(4WnV3Rio@)F{rk9#Z4w_0|9x7t{Yk*hkIIIh zM3R1;JooeQw;fBqeD;08n=*&{__-~7F}EHy*#}Q_YgU(j#WK-9`CSS}Xu0yglD?JZ zdP+w(@Se1B{_*q))BKFjJG5*Mx7|p6DC+w4{F-tr&AN?m{1<ZEUN`yTMV|D@I!>js zi8n4<mi(9zw^_w(j^gbfyRJs3G>X-BCuBK!*Decvtt-`b|LDWIHqQ9}9hVoh2yby* zadcW~US;bW0Zpyv*=n0KcWS%xpXQ7Yd$B=unfl*`H@D6{@46-%z9c+dYg+u04Lg@T z4_)W=_~6}*VwL4$rm{~w?=20U%XI#O-)pa<3i-P@-g$n!J4K)W^Dnko{TO|J)l(|r z`m3U!8XjA@CE&GM@h+if4Y#$n{rR%-&SjNJUkmy!ye+=(#=A+o_O0-KlljXFo37=g z79U;C%B{Aqp`+YK*C(+!JY>&v=9Z|UvmSn2ys;}>Q`Ix2tN&P@dz7hF;`MdMv`={_ zBzoO6V)au!tv;WX^FB0>FRt@Ym%!Pu2isiVe{g$c^mqfm#Gl%|rEeP#e|@&X>S?ZI zF;iUjyZ7aqUAw)EIOpD0wb)-~;}hShf2QYCJulClb;jEz;x`BFxYFn{;jhMr4ex4K z9ey|Izun~7)=IBJe2-dlZNByE*|CntD>zflS~mXL{8j8@&*oQ>_X_94>n~Hi>rfv! zO=55F-|u&A)Gg&_%)fASbz%SeuS+b#AFQmObL8dqb<f!r&GX>AE$cJkuf$h7?v^PF z_*=x9XJ$`5y!QS%+owF~hSqzwU)>yX;n5M%&-~y2y2@^poXGq0+2x;_H?Et>-ro?p z@ZhA^Ntd2mOk5YAxM*5pZ;XOP?B5TP>Yo-K$rhMo+NbUk7R|1&(4V1e(fsj*)QPLl zk2?FeeA@N6x}e2ut(HRTcI}MTi`^5CEuA_4xKO2+YDS8_;M1KsiqUal)%uYikHuY# z4O?&Ysb*>4&X6|ewabH!9kdNsTzYq9&k4=+BO2^Cwb$&tXD;3FRMXOOq1B}3gmRzj z{~KCaRijLWn*MdJyDHQ9U-__hs&eb2qZ1w}mVe-y)o$72^P*%@3%_&hhjR7XtvWh$ zqz=y#{<7dlWoy>rDJ%4SM2in)9%-w{NLE={Tcg5tGSTwIgbD@^otL^|?>pjK*o_L$ z+3~JfvUcI*8K+vJuAY;;#`1a>(@Cx_;YS%u3V8SIR<Zk#vg?i9EXKEHjYpiyj(c0# zf357YvHrGw&$BBF(qDgHx>zvNB~n@7toO_;om%xfThG}WZLhU2cARB+yzJ!dh9#f% zO@my1eEDHp*qmC!IP-B$)0?CvdiKfd{nkh9Y^$uRlrNAym9^mPEyJXrzqT^@b(gn^ z^-lbHCr0%o`{Fg~=O4ywo5ucoft*{!x9WwN^`{*2H{Oq3@jN`H_P&6$cyqG~%e5t^ zzV$t}%?~*`uex+)n#uG06^rGMv-CvgZ@nb)`S9lZI$lk3mLC@$U&)j|)8@muz21o* z?fs?sTITmScY3@zG5tcRUEK$57vB%@zdz|sSSst~<9)QFxcU9vqKywsE`2y2&!s0F zbHB#tD*u5!m4AG99-1uE&*?MwwaA;iDNoNVUQ}+DU@OtSAU>4i-+r@miJl^^+?!Hw zZ_9<F$5V1|huuH<dfpfNlp|d|d&`2<ZaonZo6MZHJwUNXHnZktRF#=d+&cG)ySyKM zYz<tc-}g*w-ORfVCqK)^J03JxbCk8W^zQksZyKd0E?@7{$u4zg?<BwAY@hrGC%Ruc zNlyFHe?Vo8Wo_cj7Y`P9o#c|AHc_Gc&?6&N>jVAX%>|oIPrvt(Ctk^Orgp}(HIKF4 ze3LHAHt;y}|INgSS5n$iHfS6ck@3#ddA*{@CV0-PBXt5H+RR-0vNR%3-pDz_GhJGi zQLg*YK9&PhInxd&MTX3hIpun}=g5u+%NNDI4c{A)p7X0pRg~N9Cfj}it6N54@%K%; zmYJ3J94}H+F=+hKy7kfq!RLw%!otONwd*a_yo~(6N`E^1TwK2C)@t*Jg~A+%56VqA zzTz3z!rO7D6c0>29~&8EeW)*{?NMAx+pV}41$KW#KADsq_-VPLKglG}<xbt~FAt9V zvQ~;JYMAHgz2}FOYF2vCk|$qTHMev#E!pJHUo^X{ca!1##hVWnT>WIZ?xEAW`}d+8 zL%TQb>AKgx?$cq1vsd^N7$dI4-uPIx(e*+v6X&UD>7{-mTT?R(G#>DAXFHa>=Q&rr za2n^K#pg}g_8;VOT7UKXS<T5JtLL_VRnZVEdOGFU0;i8V1m?_9yEyHS_L1d}`P0pQ z%rABheNoMJV0MVp5|aySGy5L>2y?3rOgsGRJJTUGKW~{G(Gz6P+V)PceSO4ds*qpV zgS&DUA87bAOj3#1Y7_g9cUMmIy%h^Z869@SI@aBBQwfPXD5q_{mpg1i#L{Mo^7B=v zXG$)bFR&?>XV;Ivoc`v^?nzd3K5omX<6NTjKqey1dEGseFAFl|zO%S4_usqnj(@O0 ztA4%W9<R^x0(l*KUPn&-xmi>G>B7i&KRS;+X{r13uXX00giE@*R+io8R-E?kJL{(H zxK=o~IpxhFGq%!&Sx=K0m)3WN&Zt><TBYm1^eL8aUq9Hg=aiH@c8e^3o}=;dUx1!T zv}?Ej2Ft#enHxK~cKMsm|96Aswru#eDoKNh6XK>Uir|_p<dt?-@TBQxi`m)#9Aqb} zp9r5Nzha7I!lBHs_EY6oI@ESu)|uM6;C=V5Egxg;uHW4kU0E0NP%yTqc4__Vxrd_z z4ythFP0A?{^=Ga)x%5ch|CcP06GT40FY^1ed?wGW!-|P}|9+H>nS4+8drE~G*P^^D zNB{M$322g=v*6ryPrI_ese5$;_guT*n720n*#2!ZZv6VJwBlUJ3~{B`69SEurr+vc zzgYJ8#K-@=zl(_MOi$dl!liwm-S>FMobLupy;z<vUte$b_g;9wq~&MSqAnSQPP;02 zXyMPNf0Y;oj9(YUe-&JC)@$QI%~&pL*E7<u4%cy*UoBgIU3RA&n=Ie`*0yp>&oI+} z^Oo#6@Y-s#d-ley*H^DSrNtMrFEi`o+4u)*ZkSF#`*G!L{oVz~=Wg#hRCr)@;{$$q zyM<k5Th`{870Ge*CM({soWdA&^XHp+?2lG|2sHfgf@}W`230SO8*M(hyH2}3$d)-O zJkzD|Yv}>T<Lj=oA1{^Ie0@m^hvKbS>kjeicdHd=>}Oo?K2Ve0aBcjY39F2Krf+Ot z-jL2A>#*qN*)4Zl|E>JSQhe@?P14d*iM3^#>*tw#-zKwqclo{IK&O4?MFBsyIn*4F zdpv3BJdxh_QrlF|2rl^Id1Cbm!z_Qfm>$Q<2FJ8`CV$r34OwCac8x1S<xgEV`Q)<H z=g-{DGBFt%F{V)~JaoQ)W>WjU<=MQZ|5qGN=igcxU056R?lq%Ca^T6_o6VjYnOA0J z`*XZ)zLvSM!-T;oR#GV>d|gd`QnYyB<`WDDJ>;alRYhlO%<Sgqd273vwXL^%Lh6<9 zV6$C;S_ePc$)$O&JSx2A07Fv92|nI?(_@#m`K1MY)q3l#llIq7eBq_$Elf*)vZO@# zBrg2U8<_pX-u2Sncd8~Gn}jw$%xsz#zM+rv_R)_E>VEvmlD#rzL!n<c=Y<)fLYb>o zxDU@>8TZO?;*OIQ$3_1gbnVoAv$%WPw#hQb|71#OJ^#JksziQXpW3#CXKW3O3r)>u z?b$nZpWGi=y>HD*iN}%_+}|QQ;e&;CS|(%rUA5;@n|{kje-=?~_7VJC{PO4KZ_j@A zZaFMj?I?ejkL~_VX-D&0yEcot9=+O=oYcX8Oz))b6!B}NGVvl33dZu)vGVc~!XJav zcDpn&*&H}#{vg@o(|^a=6Ggw>O)QS$Uy!5BFROo8<#17V`lrOJccV^!-ox#c+2=Hi zCFbJ>BM!kdwVd!qwf6x%vvOWZDruLLKD^}ibam<Dl@%rvL=*40&bOIvSJ)r<=Z5hv zS=YCFbNP1Z)*U(YDOTy~-9r<m9sg62wQoj4`oHsWb6PgV#?L=^$E0iHrMBtzN92P8 zv(w8$<v1dAb!JH^?wAuL;^O+Hm$y`8zf<e;=96ZN+}Sh2|MTo}O*xVLU-8!Yv!e5t zO8X?v{yp#QHSwG4`l~+f{Wvu=PUfamsa<l*<xoq7_0n&X7k@dedv}vOm$Q;X_HWKT zH+WkQe`mH=skl|jz4^G{|3a1vM;@<k&HsKvK11$%_7sQk@;RUXPrcndBU#=3ScXJ$ zuk^*gbDR%t3ROD4lEXwmu=$0DW_z5`!ztNYXS_Ng|NhaD%1ti{H6<$w({6KcePXmt z*7swco2I*S+SZHfGom;+>)Hbr?F-A<H7Dlr@<ML+8&`yHDEApyUE6#{sY%pHVb<a0 zw_ohx=1_S2ddbP!yL+@`tu&VY;R!EY@OMIbB-?T0+%ql*Q?6A;KCrwU{6%rj%P6aj z40n|7cxPNJs#|(}xpCm)Guo#mbiUv2%T&m1Y1GIKd%OSs#Pz$jzi41w!gXh9q{m+U ziCSeJzfF36uT9xc=V1^32eWs@4aa_c+OyugR@raIq<tUsug&F`uxYf>pWgB^E1V;9 zjzvjg#oO;9EkcXVCDe$C?YwyQg*KN%VeR|u75!pwrr%u_D!fLWrMl@1Q{0E2-hr_X zSUMg)-+d`dTE1E@KUtz;vH62OrmHb62CkD8AFtiSpB~Ns^lFpbX%3q;xw<d!X|CeC z_|E>(*1bK!u`gn0^u!93Wd$GlvhR^kV*RB;(Twow_g^NQHpp$T&Ohk4NLw(kNAcB* z^wM*aj~r#%TN>n0^m9YR>MI{#m?$sRxm$8SCf#zC<Fkdwk8Jfg9~;)mqPXS5*EY72 z@@49kho7D<bNPP#{Kt>;+E09c@|ef5afd<g!Xp)D++Q#LVyLs(xplSGq#sTn%k~_v zo*lZv=o(Ak%2sYak6mxlfBoEcM&N(B#tcQZo;RN(cuMQuRhRNU;n=1y*WUTAgx1rx zCiz~LA{&v1M}jvvuD!MIW`FaH^XXfv6HCpH^|~LN=Bwk;-o$jAwerKFg6yucwBz3e zrRDy-XlabljW-dpp0x2;g?7zm>8d|lkL~<g)OpG1@%hSm`?nPp3aXu0wtCYwx1X79 zN(MPA%+^d|>{$}BySj*#<;3HvZ1>sAw`opt{oS!(xhrGU?#b1)>fd(db1K=cKeN0n z{Ctj4x3Owj^xUNZn|jW+*D2=Da(3LX=g<=Uzl)FAv`1(*PKmy^dFGq#pR1c@+ElPE zE9zPj$+%1`s!3k)ep11c|342r_uu=4bNV+P70J@0O1tdji(l?%UnBNa$Gv<{sriRA zx7n!+Rh3T%_V4q!@b{BX_T2bu-hOB2nEq6k+mUc<SFP9MaQE*Ye<-^x(Nbh?UKdca zD{uF&$1}osE^QQTy*7)vvOm6HkAk9fsuT0_+{n{A#bj<AyX11hwMXSRtGS3+tb)Md zrS?Zw3a=MEDKyvbZP4DTjQR&+?7NQYZduzVZC<!6N^<7md37xk{GVDBm^1W)!zFc9 z3M}H*-D!N~ckj(hZLUytGmbBAXBlt(yms7gvj%U@i)QbZ{`U*?9-Q0or>Z@Df$zfT zXQ#U7%`j>Ax-;S5X`{{wzjL@tcBq_K>3*;xp3!mfYz?RI6ItB_9KRQ=U1(V%H{-dW z%`w@w`b{bU;{Tq$YjZBY^ELQ$Iz#o$XpLQBQ=68T&r@#hHQf5sY=KfO>ydpEq-vH0 zF{?d2DfK+^KF7SNhuF5;?|bvN=f1h1g8r^YR!)&uMa`--b_dL{?31&So#_5A$Y$b; zk}C->&IoHCUbWKek+5tR&uq3Jzh8V@OE*2e5M$*SXmlyd#Z7Z}l|!K7CI)}AOI$@c z`XUl9x}-n#z7h}F(crl$#5UoJ^V7yDJ09%OQ}5_oVZVy^nEAZrFQzCvy8p^!cp}(! z_G8-RAGhwiOWd1dyMMd?!KcknTOvQ*JGC_QsjKsqXBy9wd^Mf)C&&vqtChu0%sTN) z<%`XF*?R{2+itwPaGTfG<h}ec=?(W4+!x7zIIh#?_fu|v!`?rx-@@Ylwp)JfzofHp zg5BK4!;B)PGxWbNI=cPQ_YXNYDs8!^ty#K$<)>56OnDA{Z<v*B>w6<bA^O0_;wgoR zRX$aQ-<&S8pSpGa(HfSH>wE^B+0)z~HQO@X3M=o3*G?_ZH7MI^Fv-y?y1F@1NpyCo zzzgM~)aq!bUb}!(sh2aYrUvh~UebF&+95Sm_Sm<qrkj((xPBJsPMx9Wx&NtE_Zr@1 zs(mhRcE}aZ3D*>qTl)UqpTJU=7}n@{;cv`YcE+As<9bg+O1|WZ{hceJsb1~cGv2G3 zs7?~z&+{YmOUzbblgK|dCvV&;pE+Hwz3w#2f*-{@vdexmnoW9rh`&2e!y$}wp?Cih zqn{rZY&@sDXTL?A>n+wV>z6IgoEMs%c=GWN_g(j1?Gt=jU9(7SzS=3i_xC+?S2y?l zQtY0X`PA+7IfH~vQ#F}tR-1=q6&^Kso)M}Y=FVXltH(ISA#zT|vwzpCEf~}pvYDLL zPO^yI#mITm=LSnBS6kW4S4+HZ80xJ!CSi~wd66l>yXGg4+SFGajAxEt-}hlIzwEDb zZPN=M+Zst}Y+ST{`Ls(uu9b|ecfLo=lRLG@xqqhG>+jdkJwCmqb!P1fiT9N{?R7dz z(vkYxiVFnSe~)N8(<8ufd|9-k=8>w8TyO52z4<zi<FssxG2?<MCC}y0S1>w%S<6>` zC*Ib$u4d1q=hmJ&nUA7ddky^TFF#rT>3iGaPX{7jDjHQbzJ2-J{yCfU&NO4ARuj{% zmoX8ipS3Qo*gW6t+P2)SQ(nD%lc?OeZiQ)9@$naelV{#Gz51b$Eq$R`;~SPeX^URI zwQaP>4Z0HFb)LDSW!k&#E|<A_9@X<2haa5A{7Tc4>9R=jUg<WCW0xCG=1mh`>Ym~v z)8+Z^%?qtN$GG3|O<Xyzc4oNo4F+{VZ^!&E7r&nWbnIoSmmg=yDXZoj#a;V!9kj$G z{aN1LXb8KQdv?WczlHqG%!g+0UbDN5xoyYW>eC+OnpfTiE3P_V%XW?B_X+vF#Mwfp zXSiP4KW)#`S5|IUmwt5p*;^b{FeUb@i+%Lo9l0wV>=thDk^R%M{#!P0+WB7=d)%)$ z9u2%H+WyqosxGs-t+ei{MS>=e#D4R?5!3z@cK3T<4b0FplKSbZVaT0!!1T8KhL?-D zJ6iTcUVHZU#)+qkUwv88c}&muT~S(NW<&H6kJoRaPjM^X<2P!ouzt`mp=0?|(`j>W ztY9iI4V>8(@uYi3XYaDAQ&*kBkNbSB{I)tz<NiXIcsKVYNl}Z;8*DSad%H9hdIqk~ z=GJ+)U3gdK=_j_!X5}lNG<tRFU}Ra8u=q@a_KX6l0MSl0qxiia8(QBv>{MMRa)5c? zlZKsVw`^+MmlL4;eDBMgbs|MClD;o~Z^TtoHdk=R1rO~FU;a##FWlww>ClC4BTwbT z{rQRl?~ht<Oxba|G{3lc;WeB89!ugjyuW<hZQ`pqF(b*Xo2NBoaOK7+c^ParQSScp zq2Ue3QklS?_J6+2-SPR*4sI=p!1J%K*{VFrj#Qbqdw=-XXX__w8}H%NxcGhAgcS2b zaaVtBc=96eR&u-FO>2e?yEUe;MAu(#dGzg!w3YL&;|J{zzQ3AQG<VbMHy`&+n%KR! zdc{(6#phyo_Putx#`oI)RsW+kn|QuDtY5Sune9udzk>X!w`!&Bna*`K?zNw^g5OOs zdMuSC%)BHfVYOD^lm}&;mn4f$erkDtt@&yd#}~t63Q2jp>Rq$XooN3Zw%V^P*6m{E z6dUET^6gWlgtA*NJyZMmS5^5yjMc4G-}q-Qu$@;vQ8`0iQl={M{)tNg3%~XDC1%Pc zy!5t6KRF})lt8+{*IVgdCaycJxcRla>ds)bdE)uYtv&`8X&fqBpLb>D7TY<@>EGt9 zoOSr~=hW*5EA379E;H7dbN7P%sf3TF=Ta1Bo}S{nL((&3LJ+6ZaijMse|@smpIu0q zb(`D!bnUEXmQVjmnMn!8UiSO{?Ma7!K|!w5-^ZF~b}RGDx_Kly!e1~zb<xUm{(tu+ zH7S)8|BYQ2xxL=%dQjT?5AO~LG<763PW)X{xzzty6su6#WEJ<<*K|L%rd<?mZ>U@s zx~gz`OG=EDsd)1X7P+QdcOPxjEi;d@SUIcPR&s%Ij8Z~g(&UHRl4{@1xj89HIlu0& zNB+4!34v9?Eww?#C!TJ+eqFeMPba_l?h~<phF6Rfwk}_N;Z2R$DT&F`f8E=D=800< z%--XAtm_41FRM)IPn`N_HM?Kvv;|jUt3vpHy;G3cwq~c=4`+)wMfnL&Z>I8Uc68f` zsP)ekxE1!qe4Xp3eHT`Jzm*WVn`6S6{>-b!jkl*>3o_aMX7&9TX>0BO@n+neB`?!7 zO|+6%ZMqtHlePYElg~=Mj(sbCcDU|#`sq;I_U_ba*SSVb&sK-~I=R`U99i4>W$x?C zGLo}}O*j8cFcMW-qjWl2n0?iH&wIX+?He851RpQ?tpDbFXZuXy>X*kluf!!?mZ%ci zZufr1`ycf!5w_;SAO6i)$KoTgMrN{ZL%)*T`!%I=<-XJ|*{OGZ>21N}R~iSo|L-#T zYaNo{FfBUtLTjpxW61TV#j`rKSAB7HeR@2hjrqCrkEUg2ynFdGy$^UNZ@Q<mPx|Wb zsFxoCCJ629Z|mEk|K`OrbCc9-3m1#(e!ib_)AfdjN%ZM-%cfS<%5zh<uUnlQa{5r( ztpt;QUl>{DS!4>f@_2Vh_k|sww83&yb)HmAIopz>$2<2(EHZM<Sj8-I|Mk8y{Wb1h zh7sSMy3N-L(4Vy2+b4H|LesglZ@vmEBi_&RiYd>!^XQwk+qM19-zS8v%sl#erq$&V z9>>7d=O><iw)^F@oqtc<Q~2;YO1Q8(v@$|yXHI3eQ^cXyby{}p-#<hrN%E~X)Z5|x zwscLhsPC(`c#bF2+#I((KCpZ?_on~<E96e4UNv1PpyTk@O!rdCp>j1fqhHak!J?;k z|56qCW2t`Re}$8bWWIcucH08!l054(HD8vUU~THW8@snoR>NCFN!fF|<J)bogH@bX z|NJK@v{dzToanS}lVF8|aYn6QRu}G)S@U@AsXL!7+Pb69cii3}=(*;&&cikT42t>6 zbv*pH#b$_mY0R0kxZnPB;I(DUCc+t<=~H>SE{C4`k+U~xk-ftHiN#mN(_9a|Ui)F? zwu43Av%D|Po#Vc={%*=mZ<AwBRCGhwzkdpUTvsI;cy9~;=^tB?GEVV4HLzjX^WOAK z?~I83GZJoR<gT;o{VMqJ(rU?%>C5&i?9y7iV4=Xb@=%cw|J8Q>;&*p(R~WOXR^R)y zFg@_d=1@MS^?wp>maPk^NUIN+)a`LY{7s!*okqZoje_n{m%pyPI!AS>=&qN{OFfQ9 zKIt!2Nd5TdC*RZ$;k?oLlJj|`H-757U-(Yy$dusMb%qn{^0i+2o$svs_ds+0+E=Gi zzkL6j*{#Yhdg%d|h1~sx#>W$9ig>qGY)vdLn6utfYiC4An2n{r#G3$y)3>%*ZqD}j z=)z|0oY?ScZS#Fri)znp0ZqqkGL^nho3n6-YRi<P-EETlOC3&L<7d!)a$v%nYohJx z<-7rpU$d%yPyPO4_2)$#C563aN9DNL{Vz^$?eEXB2!2**&DE5_eNWD~%0MSnQ>=aI zp+&F1Yi$YhOH;UWDdx;IQOis37Zt?iO{?`?dgE+)X6|?IFGj3O6{>Y7Rae-4pQyFw z*6zLYWb{=;muUE3x1F-C`s=ommp#jwS%2tpT$ua(u~+ra>$mmAj4OZq-EYiQwc%^U zWB%m}e_L(8y70&3y*rr`F2A<8UR{{*IetxxS!>#b6}M+!_&njT-u#`BPrshEx%%i! zm$vklFTcJ-zVP3orIESY@4m*}+8IYD{7nkGy>rRpZ{MF!XwP9<d)Df#Lk+)%YLlVR zf=upevuSUhwEes$%)-Cm4D-5~?7K@1L(8q6UUy_@ZnyvKrMon}`nVbMG|2{EBX-AW zw|Lf0Kk_)l<#5aV@X`Rq6VFyzy-bxqc<q4gcH?(**7tm?_`-MVpwUrH&gC0(7X+Kl z^*R1XN~~IF-rY4%P6SnX_<pQb&uDQn)ZUZ5c5PRvr|8tQWjS|KJ|=x}bNHwGqdy|g zO={JKIakHZWGbKZgs?Y9FID27aBG$Hk*yM!Rh$d$RJMFN%)OEC+lrKCcV(MO?FjEP zcYo}^sxwda=h<Z&tZp=!EuOM9@}Kf=R^^Vx8YhL%seFraFnDv5d)N0H%Wu9h(YkEk zXpq$#`<~I=!P)1<^SjqeuFuyC_xgO>>x)_P+7)Nd`*5*n$5bu5sq5D`>)Z4EC2POD z32|Ta%1OL*`t5)KmF0&2*mVRwxcrwlu3NHHbl-8oD_<@Y-_gHNpe@X|`vHsU%}~*c zS6WYpcpaE8`t9H`>#5Ao(thS?+&B=;RC(g@ExWhZ?tT8+W}c^MVYsI=?`^)c*OoxD zmf-fBvr-4+EQ1~km)h;%ZJC>9lb@Lxe5!KS`JJAbpJvYvkhx@Kw)c}z;L}E?szQ5b z?=ai@-)0&3tlbv%Bx~N!?8jaQPCYw!>0-KAxYF9W>2o{o9@DvWi+{D(Drx&o@1DJT zwd>=pNk<sM-QRu@dR%F@x$4%^`nw;?K7QTVxRz&j;^bhKNiF5u`De&_SttsGZ=3S( z%kKwmD?%==jxu$bIeDv?|C1*DbNy9w_(d9Q&WOv0v?WMoEr{$te=ym>x2-ex#&wze zXFo*mMK&H)`MG%kllflF%sk80)jBCM6Zodp&0BhY{jb|S9~RD!?$7@{$Nx2Ri>}Gf z&hrwDN5i(c-_BilYgwo&=bTGddK7=S?Rab2vG&J(&2-gd(|4QSIG2kYpVnUgVEIQb zVG-LevFR(He1FVfRr-ZV^IBugo%X3bHj;||s#YbH9?>T_x3CHYSo2SrVA>;Rw`0-t z^y!izO9CFIn>zfddfl8cH&*d!`9r@9{xsFC8}y`V_g&o?8Sj3gJ#@wXmuydZt5mLE zTqtH7<1AX0!;+zxkhi;Y{gXF$wUoc|CT^)JIb4}Ndw-m3==-xC9rEul*;xq8|82j| zPk+@GMi!@v-5dTr`?BtlI0u`mW4VF<k}l~Fd*9mpideC#bm|FBbFnL{11D!x7p5*g z6u+Zx_K~SQ3GO<{aRTP8$-54kNt|p=vdR4FXSr@|?Ei(oHrx_lf8)(DMeepMpMPcV z`+J6yzb2?LdJ~Ip<aDRsDg0|$9Q)Q6YHrsoc`N4KB*mJxS1>$%?$OWY*FD!9X)n39 zJKZUqdEd&rCf`hJHr*+GJn8t!7%$$*pW7d7KYMN4gnJJzIcO%bF*w{|>-d^Et?bGb zZ^nGK$NOwd{xq0KbA~jPo!-=V(MgBXbL(2`q|eO@FCX-H?xUD+V~fnGKT!!5VmFNQ zJeFy%l*+vHu{i%^Q23$q^6g)uL)vEC__y<Hg1o)`qdT@!&%RMVpO<RLbjayW?s8rE z5X+4`*Q``l3G|-WV-hnxXZx`}t=v-e`Ps^AO6)G>%NO*#zHcELH+$DnTc-PxSD6L% zBM$MoGjF$D@!e(9dDCwPJi||9O(_3wdCy*UZPNbe@<Ynm?RU?|nMm*b@xgrN`V%`_ zmrPq6z41-vhq|^4|G4UT<~3@nZPw2JezZu&_T%N~cMfjb+-JA%tBg4j`l<beGW*xq z7Z=se=V)dxK6Ub4<sZhPI!2+|?YS+vD~?AW(^t8mc`exMlH?NeYOhIV&hE>mc)j&p z7r>g{*{BfWu+P=Ih$ZZop>%cm!JviRHxF-7D-F;3sF;8LS>mf}(z*7m7tH7N=UxpK zjalh-=k9^xKO5dC=%+uNwlOXFtT3;>VKd7u8FrS+p9$=&vM*yEmZ+`1^3&#j-mXyR zz+EeT`K9*!nDeIN+qFY~92QS54a}ThzEnNy<I{xQlASZH{(M`Tx7+mgJh2_p$s0Jh zt>4(}ygIwP)c*MEs?J3!4u8Fi7JPcgE0h>?d%|HKPvgQ^p|;M|8i88*D^A|JH`AG; zgG+qv#LF)>J}H!6a`sJGPG<9=h>0BEp02DjaPA7Si-?{kuKZFbt#wv}b@$1n6D8B` zyxiaa*LG{If705FbD!iGB9sqlxUX|jT-;oIyd!7t-Y$EugUPZClX%y?wRTys?zWXI z&-Jy*QjZoFI4yc5@W128pOxt!Jf+t)Epx9p5yy6d|NkeGAg8T7f)1~;beOk1D{7Jq zoM2nJ>gS0MQSThedVXg_+Y2~k1%%Xp$Y+s`dUo61Y{@h2PYX*^Pu$gW)1Nc1IqI~P zUAaQ#hhA~%_YJSBRM#`+P8Uy_l(9$S0)I*6(bT=uW?%odJap$bp`e!yj_%W3+q?y} z&suG`_esjL)sS`f>$=Tn7T@KzFTekre<hD%?kh=-y>8r1-)1u?JelAVHE;bpXU~lL zvdy;~qp~zyZX68E3~=QxW4qrcB@?mWmR07Ar3ZJ4EIv1D(-Q3yd)xfBicKgq{92~< zUHP2X%=J_9j3+TnnOWFZXC2ww%)G*+bLt%Tbrb!91Q!ccIYwOFCeHZDk=HAE`PV4F z!q9iSBELRgeb(rCl*PWO+l@I+XYM>Ae?Px?iDmq(S<O1rb9{b%C|l(@D_&cRv41Ah zwa{OSS~g~^33f^?c>b1YRs1S7tD^ih(_K{NcP-j6?a2HIF5eAr%&7fm@QO`_&2)B) z?TMCIXMcs=J(73I>gfLJqaMG-);KTPtMU0J!`?vGrp}(F=Z$%nK9rk(FK@5=zmq@a z?~{D5-??+8fM5NLSB^npEnntO__Flfjv4_~oy`Fk4m>Hj*gy65>y9mPc7|&g*<61W zR=j18&HBDWvouS#9yP6sSm_|}>!$b$Ro!<V_7u$e!20jb(i4*$>b|i3_#?E~Fo&yJ zYLotvH---Xz0Y{RzcOd_TCFYV*3$0gWzIUPaX)8@Yj$i%d;R%3cllbC`d!MW(~c~% zsZ8x>Tks%VE|i(~<LgHG?;HMa3Tt914$S$uOTG5>PbQ~WyBo~sY?76?HXU*AKlIUk zvf=sVh3jJ1asJDa)IYH9ZKgG6`+Eyb;l=-6`T5yzyC>IaCz|#B_&(M8nBBT{621m= zZ{(ISI%Eq>O;HFec)Y?P>C{z$72?9hJ0?asCJQ{7A<VsM@uKDHYa?t0xV{_Ru-m6{ zaf05v-*#p`M#l4(9e(-s!oODzJ$cJ{Kb()1tLm2T%kce~-g8wTyK3!?=>5J6&Mi%D zeq!M#$!#}vYxAs#50Z=R`N|~zP7&1!+nC%@5Wg$q%bSeQWY$G%F6`cPdQ$k`8wtq= z-YbbLa?R*bZfKd%b#ZP$`T4*-lOyUrzq;3JIHOwd-jgeiy$`Q-{n)ZZs>blf!8G3M znVpQX*_S8t2~H8{QdTH@+xqv)tD|Y#e>`08-oNnA^<&@m_$K{e)_2Wat2oQcO-*!~ z@Il@nyOQa`jbfoXmDdGs2EV@4u;|%t{RCHUR=vkt)8_5xnBUHLK{vB7FsaD2FfXGm zG@E_h;l4Fjz6x_HGMSftz4SX#^yd`WGk;4ByH%^4<<_pUztC>1`|z>D?*1*oA<zE_ zoD_>XH_P<z9>1-Ywe#3T?!7Y>Ioq^<$B)g&f7=Egu}c<k41K%aNVC-Bdc~L5;oqzZ zD@+cxI^FBknYH?wzj`|FWmd-fZI8QC<_ff>wtNicefl!a>12w~0dfB$o3>ZSTe25L zzqGiue~UePr|q4Kc_I;N^}N%#UMu$OV^wv|dN%W!_T)p$b?4-5KFE+2&%Vg(;U@hB zOQSUc`2I6KT%xTr*S7o4!PT*GVaM3+atQyQwmmKLmwD92$PWP%w!GP>`1P0N)yESq zd#sz7*mnPX!{4B%)&Hmbz92ZcK&*Y!%lF6Sv?G%0ew6pBbml5dR@$l@^QdiS6~9c( zmM4=-t~nXFoqx=JCvkqaPx#?DCyuomZq+mP$W}i(G{-e5=MC5Pv+VO#r~h8JO4)Fa z#=FLkGbV}5e-=7T^VW-;8C{bmu3zOWr2Aj#-{Q);{^h)dn%l#F8JssV_g}L2jZ(H= zF}G{TcCYWJC6i}9n{KmA=gcozS!KrXpI^5){<(U5=EXgkx3+V%v98ko$UjT{q)l_` zmECLaF}QtW`@Est+e(ycV*bD2T<+c~uVS{R3Vu_gHU4V<^ZQ{H|Jg87ROR9(tt_?K zJ(qm`zKPrO{|n2{6CDdnDxG;)`S-2Qu0E81K`(6mQP#~VX4iaky;PnY{&e8YmMPCS z$KEe(TQo(rVqW0ftA6LN>g2st(sa!I%@O8dQSZwxF0nIpL8r=DYgR|?$4j=^w|?(_ z9=EfWJ@Ae<gX)XtZK0}fL#6kuc;*=PM?pySiR;UWjJ3D7d}G)*>k^k_vf>F(hogxC z?|E)t$T+|5(0sNjAIt;a8902txM{5+^PE<`k1O2*x|8N#Zm7!Ldikg4Qsb$)g6F+8 zm&kv%p8Bu$=Jn3<S2^=H9$$9qm%{GDPk)u$Z=PANBCd2mw>Q?yYtgbr=hkY^{Zc=< z=-J|xZkt#RUJ3p(f40n<YRPopvs13BWc0~QRXJ7Oz0_>R19SD2db3@ptUrG!<G`OA zYke*4XJ6QJ?nqID!Ne}sS98mD`0!p(6D-=1Rw49bV$@tGoyAd~bq+S1Ig!e4v5uR~ z#qHk1s*orKvok#%3%|;A3I3bC>A?G%+uu?o?mwR5IH&qh|NV}qXFkeIc%t6_VcBvH zAN4!`6Y7%pRRwyt^m0AC82sHffn_C6&P?_>lT*B;R_Hmn8~R1Y-L1%v|CD{+V-aWI z{d>t5+e{Z#zukAP>GY;`wo?NAZ>cwJPn*DPP>^=a>_LL^tG(ZR-e`$yZnk$^b9LWO z&$_p7+8B?^G(38LVez@I?>_Mf^lFr^T6y4k^5pE-a_6O{EPA0(($CzS#b3n|l30Dz zl);(l@;{U74&2vfI^3Ja{>;*5vVI23v&f3*d?CJtPx%|-4O{+qRc^n3`GT%On_kqK z&093P?@bb#{dT>6GK+9w^PK;UcRahKEvI)UCI5BsiQe#YN58{?&Iu>IU%Y!cVR7TN zex3aZ{8<y<t=h0;?n1LR-z)u}zb$SF^(l{4W11G4E2SCv&fv*0f4hrs<C@kVUbyk; z4e288Cwd=u->f_)v}wNC6$Kl;hx=@G1&(~WaMfx3m1Xl^Tv2eCE3x_{|GUXYrB+YO zTF@&~<<1-N<jYL9FAtYav;OdMV!-d^%N;zIEU(*KvGbu->a0td*L8oFEOk#kus>Up z$){7NX2Fv99}_MKZQf+FTSzWKXOi8_HS4afub*Ygz*V{b%h6Ade>4Pnv#|I12W*#e zb&@;D&bfI0?#MK~A6H$16)p$$Yx3Tnz39*T{dX1K-_olIR|=dMR3@=L=GNarqh(cb z4EGjZoMR%r%HiR?Q%`)Yg}y~@v0p26^>^D8qXQdbY_*L_cRV+rzN6x6$*b6-(fek< zk(LlRbn@f1a-TJVlaswyJ-*wMyC6?PaO*~a1bbHNe@yQ;o=6kek}j7i$LFFac)#_m z(T_hDbf0Y55Gz~z{?5@!0VRwD%N>&z3wSi9FI+rJm1)WEOp{d$?=9;z6bw5nbs^$N zS55I=j?yXT1=Idi-04>Rm-Zm&#EJ{*Vzq6b*i@DkD0YbL?_ti^=M`LTx%L>xrg~PR zX_E^Ne;4?va_IO{FQvnO`Ia$E2xjm!Q*T$jlkMVi_4R@T(b$I%u6dO4|5|XryrOaE zqpI(sq8HZ4TL*GSH7sA|z@<Msaq%m)DV$BmLwWxer~BSm7=71KGh6(Rm5D`Ta$4D< zJFbsAgicOU$um)Q)VLWY!6Eq}euK90$EL}$7aLqwO|)-dThUndh>PR>?u2(WEc2#V zZ8~>QH-AcC-^5>+N`6he5Pju*#3F__Asu^9Y|mg9y&QWoHj7o@;Cf-tKY^#@W6lMv zebCtXV0t#2cfs+a%JMgEZCkF!r!TvEt5|Ka$%(gWlQ!<sU!%RSO>*Phe>Va==70IN zUbL~%B<)10u_Mph71y>i-4gG8aAwxkz*!6vrzCxu?EYG3rnKI@oJD_sBu&b64E79o zwD*yi=#``ursl`5KQt5GQ61h?HCMmn++t>t4LMtCetvF^`EYCDfqN3tR_pWbeeN)8 z`Mx2>=G1rI>P&Xeod>U1U3Yg-I~>L0{j*4a{fDB-q7(ab+@G&jb2$4|s-d`U)s<5< z_S02v9yN0Hp2l{RPtJGWhbtL7y^VM2%-lQS%E9H^jc4wO&Xlsxv3fD3gKyJL@4eS^ zbke>~S(2!hXKC<w|BV|TJ!>57Za6Xbe(@KdTa{QAlhr)0e#yf?<xO*coO!*%bm!so zPA?;6CKygXwKi<ZEH%zM=cRJfVh-vqIK<TO=tybxF~-=8Dw}P8E$b$imi6igs=KH% z?A><ak2-@+w@}pKN1Ea$f6tfqUNg;;oLnk1*}>3mZE{yG|6~5hzLnyhXLqf#GVt5; z|A+l7&R4I0Z|{|Gi&ILIG<u)#w3~afSIa)}9S8d@wa$h}&pCd;ug7xttD^6+=XPA+ zjXZEn(0b)NrbxS>s=1oSuH1_(@(A*oHtjC^lslCg8nIJZ|4k8|@i<MT*x^USnv~sV zZsqIE_!qY0wSi5;OfRkK$yb}s+yBwXnqK|;{%yxd!^T#7_l1UkLge<YSiygFp2Kdh zWaV1cT$|XxO7mMEhrXy^y2DgnT>s&n-!oOUe!Y(f`W0u%^24}CT>oqT2FI@=d7CfY zRd~p?&FaZv_giJx<G(qu9*|hGMS9crQ}6jJAAOx7^RIB5!@356f|D9@DfzD_mPce? zW$yX&BYwVw$kF74Tc-~`zbP2I^ZtQY8QF%6vapS>R4>H@)So$U;KTIGE|xjFx0*#? zj(vA#r@;B$^)F&oL+&hIYSi>)vVdvX7XD@PuK#zt5$~tHb6H!GvM9e?jpqN9%@H%^ zT)Ta2<+c}Z-GhAG?bVgkJZ$>U7&%V<#<1i@B-3%RmHEOF(+|ZxJEG%oGAV9--A%pM zw%rnsxg84J-Ss?03^Y89{HpG1^_u0~n=jgAQ63?|oN;~6BDOUPn%3-3F#P%Na!kQ= z<@STqtvJhEQy6dEwQ2A^uzK^Q!&$#1e(ieTeZIFabIr>mt2Dj*X4|s=FWzzIQff2v zQQa+ylcFw6^DXsXe$|4_WyOh{F6X|*xxBLXmYkLT>|3+=%&I`{N0INmH?>;Z&2OEy zTjQ|#_thMdIwd;Gf9&k%VOSaRYTj!3TuZa*HV^gpJ=W|mymord72e~E`9Drq6}44f z-KuL^=QH`CTVDI(E!7$`Gag&K$VmzN@Xzj}TK(%F+eSfASN8ShyeEx<Cvz1q)OVSy z<rX0tmOaUPwwV!EmyX2GmVdP+chzMb=VnW6e|b~&P|llMrdt}`eA}rdeN2V#%+)D> z#rChh{C=nAB-<C>FV*V*uiAHZ^(s5*Eo$mYhLOj@wJXntZ`U|?ZI;;f52yb<OAaZF z-Yr#q@b^q-VMX=rR>zGu_v}%B%5fwp)<HbrZ*rMG<Js3PN<l)8y_YHM3bK`YzSZi` z@rWjw{4?k4Y#uy1udpG1gN){J^So>+=U>;#OFjhpCglm_?7e)cF{f+o$v)m-O$$@C z`2SO{T=DpSwAoo~*&Tz$4AZadQTSAGXj$;{^1`#Tx|WAOoqgWzPgC)g|10}@wGQ$| z&WTxh=f<<0M>;;g$ZOyB;ANnRT91Q;;0(j<tru&Lim1tCd9G|s6uYZCW4+}?<wtDO zZ>T<eIz`R*c!X!mDwDXHiWC11*AyQAwlZp?ITM?jw#eU?kK-~vZjk#|^nBCN6b4oC zhR_~ImJ1(6UfP`7_U-v>k7%{6Kf+m#TW1${%hvTavFoHfGm>n)P{pP#u&MO&?|Hq4 zrv`~kyIELwtohULXI{E93_o7^DIg{`(O*c<X?~13hjDK02DL9;OV3ObJkY&@Dg1oz znpMYYpB<cU!Iko}!>~E0#3KHKb2-0sy5h=^78cEu6TRlyY&bNR?faGgG5*h2`CgQ~ z@5tS}oI`boVCPHohksW6IJ`kW?WNn9XHW0GyK~Yv;)mMnd$W&7DipTwb-0`s!y;*+ zzx-!E|Go{I`;%q<hn1W<aCH5yZ;Y?C7FNCVj+1z;e1E6U>!{fiL?&C;y}eW9^-R1o z|MQob@)hB8`~?5}Ie4w(R{Y^(bCwyDuV$0ll3+eF_=eflR=4vWUPr!7x#E96Z-dR+ zD;v)TN`JJ<)!SJ8=8%N<t}mjyRkr=PoA{mK`{C7@r#{T==;(=iFR{t&p@^G;`P<*0 zjeaB@<Zv!|s<Mm6Prk6JM3Q|&^`<vb`${=<j0J11#xKmW<T;Qt+jLo@^XU>R>&0r5 zUv4~T^u%YYY}T5>hScv?t?iA)?1p!La=eiWH*L{riqXu-+9|8)bz|B^6+6z_=tYLr z%e#a_9dy$?W|#Ra>|<N>C2HCqAr^@)y9Zl-&VFo`|NZQA)n=`qs&YB^Ec*EVaxAN! zb?ZQHP~>&D?$~Sm8Xw|>GIY6=nJsqhj=e2qR=ap<PkPj*U7HWf&5=_yTDZkEH~+A= z(xy|5XSbw=S-+GLt9^6j&R*Wxn|oRO^OlO7NX`1Ss`_T_3p3rF4EFQxa`Q8oo(jAr zw5Z_U>WaxVH&T!08MIC-iS7Jcx$u8h@#z&U&u?5l(kZ>+R;jc_u6+ZSOYK({ot)Rk zZ(mQmT#|OFkgLJF`g<{ta_Ehnw{qM#ZdFzq{$_feFD@0c_sSCQcg8g*lhyVw-8@kv zYpui6X*}9eUw&8i`iF;vJYU5l!M5<-{p)7`jDnwU@zIr!yL+i@w-sCMBCebt*LmMn z_j<jO^PIK%?3b<X7X7OQ8P5Ehwf6rF-&K!P>n>dte<%9*-cOd<wL9NT``LTWMr;n3 z-I<R;&kI!o-o*)&*er>AS~GXLi`i%2yYJcpixaOdvDvVopD`evr&#{(uLZyEPuOMP zed%&OQ%KIC_XQV|m~(jM&+j_puxsI~f`iwVE(rU;_c`sJ*&7qV7IC&x9i0#P6aUY? z7s9qlFDlsP(z&PocU9#-Tq)@l%w0ZlzF?@9ls8{M<lXke`toOXEqwdt=D`*IPnO0> zWmvp4au(gDeZ^kv#=HO@_1Aw7l&=r0;8IZ9Eh7~E{=MpVqxrj|iZ7(xJeauQdG)!A z$F6LX>RWj4*PiqZXN!xr?vl&Nzvl8p%JQk|-ERHmK4n|o`14l!IqZC1aPXMW-ikYK zkGfu6z14Q>i=4jH%&lR!cBU;((_$z&|3ydigY;&GNrDw;0)ju^oVM=1Z1U^VvGbe{ zBpS;})@5*?FWp}>&miiJP>)-iw`j|{gd^=Y@2T9+o8W6(S|-2yid5e84P7hepNd;A z@k`+6qw^a&-l%i?&d!bTUh^O<u#A6R^u`<&_OHvXdc@}!dSp4f%(mL|;etn6w~$1V zo4odPqaQnW>58_w2rTg^NXS0>@}=VMl`=23c5hiX(`~DP^O_Q~lYK6E_Dg(z^>(CO zHcgq4J~u7yww!8_y>!^-KUe4QGe1w9!xy6-6e7iRL(9xR%Hm)Pqi+6I+r?imyRY37 zH}8IA+NzFEt~!@f{zO)6{h-_~V7N;3Ltu_fcB_qPwbD$#EqYhB{gc}guKKoW*6El= z@16s9mafhEt}W!Yxyw#(^Gtgm4vEm*lbSzEEj8qN65FKX1#ho4sr$Tr(+hz+y7@b1 z?zi0AbtC^u`mvdx*&|OMJo#Mb)iDv5))$#6DwpDph;8>gTBiE{XEe`?BO3z$HaLE+ zNesGsLjS_@KP!4<wz$})tgL0%&N|$9{B7QjYuPGcPc-CieZJ6^*skBwZGI^v<MKj< z<}$ftHg>1Z+&T4cFT3n+5L;01Ren?LGFt<~n>m|ZiY>qFxfPuIYW4psX&1%suDj)B zu9@yp<>h+od0>x<$O&KB^Sc>Xte8cYbU!xsX*{R9Ltw{Z{%^9%Y|atg=l+Fc&sjIE zGkWWbjD+e9)u!6ZRo1gen%m@l{b3$?YSY?PCvvooh*&Yni+*1-$?WjfX-rl69Oj}K z)-5Np`viOzuimQUs_oEsWqws}&z8St`>pGaMqKuaYd5V>aCm!Wr>Ha|D`y#_$C-%b z6D_(AJ=s#;vP09ie8<*9Ul-cQ7e>!#{I%p-<cpU(<6Y9GaR2S|sh+43d1}?JBg;<9 zF1}q~z3`;jPT``2qR@Mq2f8E-1nj$f7Bz0Md3<hyh2-s?49Q1D#^J?Z<NQr${M?_t zU8j%v@XQ?v?_y*WW*y&h^>0qwq3fC-8gB~z&N1Ixk`VfN+nm|ga~(|PL^;-^USZ#` zX5|LuS%SU?<J%92IyFig)piP}PfGNR6P)mI>I=@z^;+vP?@6&YpH;A$b?sWgl787A zQ=V0wFAd4OYd!I&g8v)$J7K+7#KKbMf2ro-6Fj<DpgzM=?4N*WPQbcrZh=KL(VQo` zdRI;Fo4G#!#IFZW9gnwU_f|FPy0Wc{__Q;EW4)`zfg`eA=}D!RoWIOAnfBB}U(6?M z`NK5_*F63I^{x66(~wI&Ibph-+{*m<vr4v{JEbnLCc@N0!LmW6@`kqEvS|*!*JL*E z85QolEqi0vIkO{@n=c;~o0+q_rs-(J&4j4A(;QZ`yY5q2l(v?galMsvT;g=iX>;aE zJk}Im_WPT5%HqGw@^@Er@8c=_?Ha)MCorbJ{r9hAW#^=A-_no%+*tPN=i99I*4=&m zo#CtY`Kg3U&OW>LTer$4<r79R?AxMey#K!Ogmb?3t15>#k-q#Z<eT5cxrr@4Id$f} zWuFfJ-M7eX-2$ltae|xfxbN21X}!8yEc@~mhcxbLxw%%C{wr#j9#$->yUDa*-8#K< zt?KG`?`v&;TgdSKaM4Nqo<jbdvn@gDM>QVL6xY5O|MNzC>+L5}!Ut|WEh%sPy!o5d zHL;5y`=6<83V774zqjp;7oVbtuL#fE9;S-*)8y9tOn3b9dg|N5qGEiVOWw#${kdxC zlf2vIzq{T)xpU;>(p!a69l8e%YbKcnyyIX0<=G<dh%I%iF8`WR=$}(8cVO<i4bhpp zbGCdB{m)|e>peR+%k{>C3&iwS#b=wnu=YDuzjfYWjR)N4mmj{k;r%(uCFgkgRiEDI z)QCD~Tl~uCX7lvvA^An-OvxV;w3Kve3NEPMeR@Umf>5UGVeU1Ro6X9l=Khbm`Y3hN znz&^;_D7BG+iW~HZK(sZ^6D(_wx8b?-fnt6i$$mP<M!R%6_VT~eNX52%kgj>l-o2@ zM<udU@3PSn%j9CWTi!cmc{W+g{rVVIvExy#aZI#e`=OiZzDz9j%c7HKeJVJAMO|$2 zHxXHJW3!^%i$c3KT0#}S9KZj1o{>k)l!y<@9^Pc1VOVbVoq3;5YK4a7^Jh$gYz+T@ zT(d4(s{2{xUZkGhv^8$bCth@ITBp`%x#0DEokbOQViw<7uWR?tdQZVs4tepld$0Rw zoiSr@ma?BO!MezJZ}_2?_c)duWOUnD|2$%;u6*^3Z?|UbIw%=ueMNFk^Go$3*?m%h zcKJ)4_6c7!n0@m0zPH)SLXu491_aLg%=y!Gri;j-oVK&xQYy9=6yJ)9+UP3&nS0@* zVP)2<rUiv%y{z&F+~=v^@L2o7dT#nXul@NUr<k7<r$yP#Jh=PrH9wsPYm??F{bme) z$+=wl{<Y~d&ugS!W-$*o>h-j)ce9>eoW47vEywp<RprjZBJ1<@?`mDPaTYz7!Sa2} z@w;lN5?^|E$Ef5v+j5rny9Itwm~o%^%7*8{S0mC-Za;fD!6Yj%wk%L^;lerFbRNu^ zxqxpex8<|`gEtmWHe;N-<7c5|(#uyG?1>)HR;`k@R~v87JstgO-qCO!hA;1~w7*+l zKk?y?>+Yd5MVFPI+W({K`HM{ooL5Z(at)g=t-Dg+zCvopEE#XduR>-U&&$_M?ko~e zm$rN19Wa$IB<NU=*6Smer&-6x-flDSeP6X&ZkK_q@Rbm6gC9L1YqxJ(u(EpX#5aFs z^!mk2LTaKvxtGoE+AQJ3dG6SKj<)KDJ)b=%s;<0Jwf*RvFy+z?SA#`u3o>JF-`=!X z#W=Zb!{=R(Ce?0@ERO3oJ|VV;cf;g>bKWc2rJH;%=oqZJr*`i6ldiQBqbu^WRi93h zdB17zw<jrgyn<)QFG)^6dwtX2tk>BhRUb~qq#j$m`@U4lk{D^Vi@T%b^~K)>tb6Mp zapItFho@Fr{oIT1T6DL4E!s3!t07?Ldpo&rZvvOkn~=YKf41ntZJKhc{dFrvwq&am zyG$rQ6Zk$cmieD}nc6qQbGqMr6P5ZGJV=?%-Lhc9Emh^2Ql~msJx+2t@aXNb1$iaz z2SqoYn8N4%)3yIEE3?rni<c4y>u)XhdpG~@x`^zu;vElp_eF#kgwB5ZCyMj!<l^nt z0@ep^Zt;%#c-&o*UHIdwz&67+>$Y{~1zHc}Ik+~&1}nCx9MG?gH<vv5|JJd?8eamd z7srTk-x9dyx~n=WaZBxgMFFj=(?eI@54D>ceCo`r)?fDyvd>6btu`~yL@;mB(IY1= z7j)E2;g;KW`tS8xvq^%J=kvZkd{MQ`D#>S79*g0e<*bVHmWb&_9QD$1=%1dx#m!3A zB;ngsTe-(^eg#FQ@!GXgY3^&Bj&M&uKSe}!Wogf$y$k*rd@GyVe)XYVtg(r$cJthW zrJ-fM`vpr)v<_>U>zw4gVJWfEVz0qUvnR$z0iG|#wdb!EpQ*T{o9ErqxEZfIGH+(& z1<w@nGE#dHJS{_8qhg`X#arIl;qzzZtmM1>=f~$4vxPpr-uJ}Gc}9~K`<27V8>5xy zFIqjL;<JF3%k+ve<32rs8ExW0aocXmsB<q{USD75G4aFmUspBq<CP{e1u(^0Z$Evl zQLcX})9Z@zK4T{3^ZzT3R^EBj;cuE8vg>C{*kN&b`y{4CRXj>hR;^p?FZbZG!G#mY z%%A%!H9R-+JniLwKiltDTjh@Gu2XN%&(E?h=ReECvDiv<iuW1I<IbJ4A1Q9Ft=Yr5 z_n_Tf#}J=sS^bZ=y=MlVPoMMuQrxa>a|#ay$|w7JFa2065q;u!GqdWWKn3;_A_X#~ zn?3q6j_o<>&@*XXVy?pXB$WyOFC|(=C2>snrtj+a;cxMyo3Rt`H_2*ye7u^R{r-Pt z>pSye<pz@q&qe{okZGOo9PWGA#|FF$JW}esIX_<Mi^jeKrWRhMd)8LFS}J_L!YpK@ zx}c&^LO^tb*D3D*;Tmn{m#S@*Yy5q=bp2xn)#h`j4xcv?P2gU!@L|BCzF85k?(fR2 zn5TF>_uY<b=jvxxJj@n8kQ6libIp#X->LE<kx!Dox^)<T>Af$KpmqPpT|H?JNsa~Q z1^LTDZIqT=7RXavV{vq`p40q_N?rHLf>616KIh$euNJ&6JTN0rP)gMN<F;L5YFZQd z{OX(YPh526_^^`g$HlpYwTm|%e<7hM`*L!S9Jg}nrca*t^BQf8|MTx>NSVr&nwL^s zQk0sQ3u5IbWpSAqDi|o_CuJ$v*l_9lq~@iUWEd(K85x<uct#3FCI*JaFs`wJ0gS0& zWNKt-sQ?08`fiyyC8<RU`ffRiC8;i{$@wX%Ty}O`P|GTAZP}F?GUxUtQ=fwA5AHcA z?AX0~_il5(-rc*cIp2vj?Y2I6SGLLeplMCY{OWV}zTf%&-dy6snM;vdv#uJul~10m zvFZZn%%+~kM+(;IR%%slc@1mk$eiFia>Qdfk4gDP!y*=g%f?2V4o#liZNbz#N7u1z zk=r?kJcjnotPTf{{Ji`1Zqvkx-1B4<7`HH6?bG&UJSN9rxnT3eRqeJDI2|&-hzGD( zT3(ivw%ohAvFzEjGKW>=;(`<Qwl7|~v-R_Q37wLXdZoV~#g?&qNY9LDzB6ZyE~8u7 zGKS15%c=&O6K`WPI2W+oWbA1ab2Ce0m>}sOx`HzxSTHz@(L+Ofh32Y&i~HHb3O8<N zxBSO1E+`sm${E$LV#1zP5)3Q+xF-Yz2mbvWE}HTE-2FLX3hRHZ`#<^l-4Fe{=ge3& zVb!!n62gb)OELH`gfCb;`RV*E|Bv=Qnk)GrKkNOvv_6H~`-K=Zbmz={yHir)&Ye3i z&c@D}^U|^J*_Ur-^&f+`ZYW{e(I~T)@%{Qf2k8g#y@eZ%Yx9?HX8jP)_)mt*;o2pZ zjOQ$W9;@*Enttiq-l^~X-WNUpFHoJ|@_GIYv;Riy7L1MmwR>A9UXI_lsjF)fL$tED zb^3z26X%}Xy>Roy&E3KWKIq^4t$*Rm=lvW^j7oZaef32r{zgCjG2i6>GCiKE^*+~+ zoj!iz?SB6=C(a!``B{GN&-<yf8{W*(nLB6hKT$yrgUwqQ|0TZv^8Ad>+kcZza-Q_= z>|VLz(#d`N^JM4Byx419_T}8WbM=w`JJnURe%p1)%wb4NOJjKadqUUEnOzMzx%VTj z5B|@bzv5~2{5g(&ay<Xj*R6f)kXIJ>KRhojGd=6u^3TikzVT$0P2<yZ(7gD6W1aZH z|GLKPR?HHN4(tpU?jC7+=)Y_KvZwtsUiSak%WD_+O`*DB=EPp%3&$_<{P@T8{%Oh+ zE*1;xT@1B*{;m9RpJQGpb3#_;qd#^p-cM)!xBf*?S(*aF_5DZQ`}|w`Yrf!uKd%=B z?Y$oqJYjAx`vH**w(|=7MRoEVr~cQ!yIKEKsC?tbiRPPFgZ`C!|G$0i#I;Mu9@j_y zo8HRyfj``<a>C-Z6VKMa)R}uk_ip2|u4(7g#Og~w#wTf}FaCZ}e3S8Z#(nco#w%^L z-+uC0ZO;Ah{-^WLvMxwYdj3QI?r)b_5w{uV&S7{HQ@^s|ee4hYeec))KP+}YK}SnT zeU-!Kdbel##)j6y6IL#rYuPZfS2p3vi;O3X=YQC-pUKH#&|mg_q8aP1|E3xYY*p41 zKJVr}aPR0%_5`+~mjA^w-ppZOyJ)|tUQv&s`9{3}yKsZ!qx>U$2^0QG7cxjZ`RDe& zj_beUoE`?Yqx%K98yuh7cf7uP{zd+md3S&0e~~--#J=NgY&z4X%J=v8tNQf3Z}k1o zc>gEkf5w@NJZb+M-dCRe<(bBlf=`hk@;M{eka~*8F3<9~t$Zd0+6xpX@cyGk=?> zRHc9ApXBp?jl=(j_iNt#XO6s|`?mMq_1U}^&iu^Ry!_wee`(}D<vR6L{*o;$e;21M z`)(xjpYi_bf?u~E&fPY-cj9IHS1DEf5C8E0$b0yy{P6v~|D*o-sVN+<FPZdmZ`}3z z1K+Fe{%bq)-gL)*=6#dD|6s3KfBm!mkNw9ZKb|-HpB-rU&-VWR&oh2=uePvmTGJ>s zZQ1+&AN4a%NLpG)?RssnFJE$5`On|y_y52AJD&5z|F{YNKZuF3?X14Iag!nAi->#C z2M-?llAd#;_TTi?C-=)))a&l}Ui~BgPx@`<28Z$moPRzsooG?N@hUs{g?aqOrj<q- zMS8z37wOdbzGOM^^vlY!8kviC<}Yz*Jk*f(pQp=d!WxzB^YXnKVmGQ)8Z0~ezIWP_ zu9MQist0A2<1OQBQVbVflqs#+dVpuA>i<oCL93Ks&Z$`|bZutOwU#iYhFdQ-a)ei3 zPv-f2MEcfM@u0h#u5Go^*uKbenHrD#?EZJ&D=K7vcn8bM&$%yW_-IjYRqM2s>Aatv zH@Yod__lgiz}C!t&sJy2l~*q{`~S<%$3%SN%ClVaPacX6QJt~2rY}Baj$gzo;i<6= zKM!i!U%GV6s`OMq*~&`{O^G*F_e7}fY)o=p={WPk2gg>9$mk>f@^4lcdN6$Rx!!eT z+PCQb{Z}`dcE1zJzo8*LOD=V4QFvFQeD<$`^+A5&VJoJVe=jc!o4Eau!k#%=iZV^| z=VXk1tad70EJ;Ze?*4bxIbL(ONc^)Wo15poQaLhvzo7KPN_HWOw`n(}P1&wYJ#=f+ z;Q$Hw?TWQ`jwDZYH#=o$6?Nv?uK%v~a{f$){PD-u&vv@=v?8UwcJDTy0OjY$PXzGo zUg(wEw*T#}6`iH3Ti)I;nzq~T`L``SuPlsLO^9UXSL^Au*_7|6scTfA@pZ#3{t%y? zPoiuql<s^#lXciL;y|T!o$>#*av^?J#*a9Qev1@rylZzPWS04f>+9=QbUtp#{v8t$ zyHNAL^^zM_(dVYJwEcGedu5%HcgddUjr9#y(;OClTdO%~WygoK+swkdf@4zhR#uhG z7w{5MOL3m~c-697AIfKc{jkL6Uw*LmZT3IyHm-_^>C%tZuW4?L-Y)zi^>A?!OVq{t zU$Ua|O_(NXOyS)*<7MK`)4y7`w>&Q2sm{(?l&*AY&IwmbIrU5W!q4~bd>5eAkbAjd z?fSkSOU@TPbEtVd_fcPLz~>bk+dh71&u`t!u+J;GKlsJ!@0VhYXYB5prTuHB{DHH{ zS1<K(FEpJReEIF7cHzPs`wy(BQSi`R_VG$tc=VD>Pw$3$iT>JnX5CyzT}270J+-`j zSHgq1bHx|l{UX`VV0yhS?2Tg3)`<*xPt|V9)vQgeX;>Zi$;<!r6QOJB7q{|fv@PC| z(LE_JA$m^L?GBGSFCXYG&|0*3!#m5F#}}Uu+G8T?_^Hybc$uFn*X`R&dQ9y5Bx`<E zl^UqY|GOnU^~r@bY<uIrZJiP9`LjBwD>VF(%FzUljtd7jax$!Jl6fBCWSaYDk>q@_ znb%VNb~Szy`gi43+%4|^ys_W9>=oxTw#h9`Uv#7LUQctVUY)km_R`A-i_6${o%EMD z_Rgl^(t_UbykpyDZxLcys%K)rzf>xJiBn{lZ`(7I-7aU@&zi}sy!gTDt#G$%e7w?@ z?5#5n&XD_JsJw4}zU|B-wQe^LP5K@2JH0~Ftm1IZT{eX*os_fBk7|DM`5RRw&fFy9 z8>W54Z$^cyihkZ)?+-1zbt~RW@a~(%Zg@z_Yy0uTaUbsd?T}t26x_OQGE2$smqyI} zQ(l;NyFCm&uHJN5&oq!_+V_XA%ayDz73ZEkxU0=+b-<KAS{%$<C8XxA?`Xc%zH{Rg z)_*~3@>#_%MQEC*t}W-gx@Dnr(?PFuQD$XFZoZ!PMsnd3JIPijXOl1A=60Gr?h7d4 za{TzwMcO~1>AQv3zO9wYcP>Xy7tz0C?4)CKRQ=PvN}*RX@AsDUZo6M}+Wb=9iB9Xp z`HNGRvE1CfmMb<R!J+8miIwilMOwOFANzBv`R3GVi|=345Ui*yd{88{PFd%WUbx_7 z!Drha^71|L-7nA*aQ_DX$2s@;*6dH*^gDB%gqeN&cir-UN-fDhJmRU0u3xV>$FDa( z(K_c%b%Up?@sdqdDgk+y96YrC7g)XJzWDiXXUwGbFbyTu{iPZ6cTKfRme|X^;h36X zxPG~0>-N6ckFQQ~y4LbDm2vi*EtgFqF3gN`|I;<)$Il&?JuG)}y`JTe^&o)HR=11a z=EC~pP5q~|PCDCdT)V49t7@9ac7uIyO}0F-bGR}4W8{X9x0e-IwZEClezRZb%$bYq zM|SY)xjeJk(ZBmg-rg^FFJHa>Vx_4K6KkCQqYwLYwybX6aoIskbMMx76TDruN?*>3 zPf6iUU47);j(nqt2d}R=|J<fvJi$yRx=t}heV+MTmw6Xgh{V5LP<bsvR!61No@?fR zhaVq5WZqi$c}1<7@_m<?r)TFoNT=F7H5RyS>$SMwboz(nGyD&mr{+I(65V?>+wfQ5 zu9ua~GOLssSwx=cCWeS_{kOC#eFKl#SG~=P>&(TUw#dKT@>xSV$l*k)FX!eBhaJ{z z-|{Pg|9$?K1CN7dCVY2F*xt*Pc=}Oh;*It;OVvm0#uvT5N>3IM_|Pl*QN(BEhd=8K zR3~VDJRtugt8Lbmp9>{i^@Nu_cpla;>$~Q>)F+>Rs?TBNeR!SihXT_N)s0EXTlPri zH6BTmo%PMfrQYB})${l7cMB}nbm9`dn!NCY`ua?jAAdf*bosMspQXaav#XA&a;Ze! z-k&}*{OQzZ&odT=U;BF5(9BAO&;9t(OBR2{cK(%{JdZh;bLr_1(|0DtD{*uQRKCwq zjQPO6tEM=r;G=#-u_N2N?!H&OHtQ<a#XqX*V!k|^uX&o^t3?{OPVbM32~0e?S^ehM z8TCCe0=5%h?C^HkC;9#D2BR-gQ!~#+&fmB4YtFti1=o+MT#S!-`Qqk%jYld<=hY1k zyj~{!pm-;%!SZ90;VZWbCNxa^CzTR$Kl=BaocG2a@eD>+rw85A^wd>|{QhEEPENbt z6ye~Y%=~*dolMs=mtW=Grns-P-~Y<7rORRu*2gM+OZlOg_vKdXrKPKFWACUNW!F{s zd^i~XxbUuWvCX3TV+ngM_v(F^sI##(WLnR&@cSmemd!}n^6|>lWy_*&J8tqwJW_hc ztCXWkc>W9tqkxan4F{s0N~v3OePeJ}wVh<Ek#zpX!xKVg>$m<4=~4I)R$iwPI`8z& zvvc+c?a%b@e(&z<eWK=s(3YoMx0wH#GQW^9Y(BnqR@SUpQ9EYO>vwn&8q<5vdi^=6 zKkNcoT3O+`KXi8K+VBZZu--O%nbX<@n(w#q3p;I{=%W_F5pR6UF0PI<^T$k{zv^nv zQ}q)sx3|k~WNy8`J3PhC>h;N`R!rqAyV7j59=?luUhzz6t+Z!>s<L_E<?`0mGi2|I zD6hS$Co)|*e!1E1rL8&Mo~>3<>lAc#g6dQo=j~W5UbUKqSLIHc>u>G6BNqBcA6(!u zf3Ed*_Mh81w&5KsKAZ{P)K+D8?$e@au2+_Rz8H5)&TZFDIgX?QzUz-O`t<3auFT;m z4=wncuX?9!jzvfcUw`DZ;4gKeAJoLRthuEpmv)yYB<Mte7?TN;_>0{t)f3$=$7O2i zh8(gHTCj=Ra>I9<Z%fXLEO=dK>&>m8_<3r>#W#`CrguE<v8Y7P=Gpk#U9s!^{rTbY zQFFIfEI+^-d@`=**epZMS#M3<Hft<B?j2+Jy)ERh&*Imu8`W-erBv^nbxF5k;=*mG zFTa%BaLCc?r)giu*0V)AJ{+?Y-@1QUBj<V6-7a9yfyRk1zMoWF6S01Ez#lVfS!rck zUrv+qO+w4>Zq#{DwAEwQl&!WG+CT7XU0<tpa{aO=m%N33i#`0ZxpqeU^i|W6Z>bzU zp|zmQ+9T`00cW+NGrk!{HHUocRGk0!ql?$3cN11D(CS;cEY0z$w)X8kV%xcSHXcvu zd!~Q)$fM`K)g(@uOnbVfPSf*^#Zs3a?|1^s-7@C>-Ei$xYG)zy{G|@TKUedvH3@W- z++MgmK2m7+)a_F%!x?UdeV!?N)%?9)<nGf&g?zeV^Ulxy5Huq`vF&o~i-?n!8TFRu zBBRy0FIL-M;p=dFqd#TYTgd|&_UHdz(tW`4{N41ayAMPxTiRwTk$oUy<6WbaE=``x zdUN87VwHt<hcpYwX?=@&f8mpsv(_EArU@GBv%If5wY@(O$$2r#WZ_KZBm8IjC*9e& zeMgbKl6lRx1wS3y9?q7vof>MobXNA>Y=()9+h06Q445|a)!APC%e!Z6SW<0xZOXOK zs>KJU*j~8V^;vW3yVr~E@UMzG`E$2r!T!>T{yf39EYqr)#n@X|WSa|Oc^2Gb@8Vy7 z>`K66!-OfvUP!H3d+)Q~6JFL$wfzU>liC{J1idrM5U;Idt6gmRTf*X4XK_(-*tGsl zGww!4xWuo#wtU|t7w>objxA)}xL71$)j`dJwVMiNZP>-KJjT7SD)Lu`tN4wwZCiSR z8Q8A6_q^>pn)EhCbn3AyH}9seyxn%}ac;BLL9u_S#V)~9I~6uA?!I}a_sB&5Pe<aK zGz}DtF50^6`%=1le}DBNZ_f9hn<`T$e3|a@HN;>u|34ln*KLNP?ELZO%*Uj(_uAd+ zFtu+#G_m|uzEYuIuJu}p!h_$O?uwns;Hz3bFVWxoP1lNzr}OQ87B`umX|sryn!b?n zv06vCK-GhN?l<z%kG4t#l{GmYIj)uy$2$G>>Q^3xUwK|{^Qcwx|J1W^<;`^6Y>rzS zB|Mb1e@Ld)KD^KS=LmnI)Gf6gYcFmoQQhKFps;(-+?_fd>#7=L<nPQs>vu5Rzv*sc zv%<Vi$D02lYE_b#y*)2aU)gBCe8opD_SFY7R_^^MX6eeg^1>TuO`$yjjNP{sUUW+Z z8TV_wSK8@eqi(Zo<%WVe3la=|>dv3IxLNXZZlC0(|MwW%+b2E@yE}*bUl#jfTd~X) zM-?}vul}R-_lNpk$Bka=Q+2LfoA$S#VTR$)U3<4#cRQSa+4<&Xj{8H!)|kW-9>tU5 zf3}-l&g61xn{~ykE8btUdaa|?#}6^qjnAYd;-xqI3_QgbV*g;dt-hZJm*~pKQ%7ZE z!pk1ri=Mc1fy=?ADZ3m4=PwefS+M`3UgbyMqw6F}l_q|eu&c;XbM9lOYN@6+TYDF_ z?;j3zbP32yJn7#X&2nU^m?wA8rjG(Egk`?{pLK$3)sLHBFMoX<y(~2A`{F<9CIyU_ z3RgW)WRJ*OSzxZ;qI6ob%#+Ko%s$@#&u346siqfP(kqP;j@#Y;{KT_8&u%rV`I3oC zbE4K~6y~RxUR$#8WXR_;4&2wXk8e)j*0HI!H~d%rukF_iu3g!|Hgkhl?&UQCEY=Ky znU|-3oxb$;-}9QfA5A>;E0;>z|CS6ibmZe<jGohVHlls$wT_#`4=<=l+Lb;vx36*S z2=tfm&RNcM=IMi2@y{FH?6#M?@+IiZ?ygr^7I#)|YFJum>nzIA^Dy>Y%7RaKXWf(y zb=v=D+ts(6UneXIVEC~vF+TtKMkNV_8%&;8gYKO9I<K(GwpC4}a{v7MlP|Q+n6qY@ z^^W5qsX~iCJJ+{9_+R)iN&afxoAt}XpB=j7@~6#-F*egb>cFn`o~_rG<xg>nC=D$r z3CW+k&UtG6d_(44n|3B|_kU3kVdJ)SPp9YChvm8M_an8R8Xa|CGxyCO*3QRsZk_SH z@?p*SIR@#;yhSG?MHkmIEml&#b<Z(9ss4q{LHVQWd;i=No$dTE+2_fU$N<rm+R~=# zc`yHnnz!6s<@;Rj*{qBrk9*4)kLP`Q)_qD*<z=oj^NDG7dzYtNcz5siImuHy>tBD5 z^Vr@dr2a}Tym@b&%MG1e*@~m$%B|h(xhHououALU=d$aL+XBH^4^M7?ZOy#-XUWee zcV;kcTsuiABZB92ML_kp%H^~2EM<!)|Nd>6X81<ml7F><)AWX|((>trDQVk3%PsY< zmol~xdK3JoWodV&XV}_3YZ$o8A6k3*OzG6Q|94aK0(;qmru+XotbKm$g>vqP%=rar z0qI5C76?2s*;bzN;N9&z-bLBFE+486;P~8J$(NTJ{6=*8{deCSx$bjH9%=jY$JOIt z<l`egZC5O=24)@DprV&^jal;J<Kuo?Q;y^voc!tMw;kU;uzBx^nsnK+$JXZAny?M4 zr)aCa==YlX++yQR!*dKP`M1S>nJeIDJ;Oiz_gBl87b`uE{N{ZA_Kz52SLnL-&x;n@ zi`Vao`6AK&VELnu2EEmOtxobucXx`4F1n&5GJkr&oF}PMANfhBS<F_@{NeZHRq9;Z zo&$xGJhd0(O^-cQ!`55Eyf`rBZ~W%;gdd;Iv3Ktiv{^7G=|cN083}>yhd65-^S6bb z-<`9FxnTc^+2=ba?C`6wJagT5rqbIt8XxsupYzyRH-~r6YL;k;hfALDH}@a8e&lSy zho5RQ&(z%SIk7!-wVsy=bM4oay2dj$Yp$_uaa?vq?HO;xf^?@`KA*>1PTdSB-!Lg6 zV7g<<gNv8Wc6OyS>3xsqooSG~dQJPLNuLhQJL)ZTlecKWx;J}m8gE$Uo^;h?jrsa~ zeo*d4@s~@(v<!AEeb;p-t<p&Qn0d;~k4+YvGq(D_sB7L^+fg4YHGfLZ|Fw6YFz80F z&tA};Id50<{m1QVIp-@~w76GdY^EKrx~y#N1OKqa?@uf#j*!uoSa~9r?faq){JM1? z?s7)@2hWx=`xu;gq)mD4m%UdFVq02P2lL-m)f5(+nGtHbv+U69<u77|uXLC*U0vNN zwYS>J?((q*4?o!?Iuvi;E2%s^?bC}JJ#%dR4&6F){NeMu57R8Oxi<9OzTKX^C#fSe zUt!7F*Lr4qg|crizUR29agDjJ`MH~cFGMCaxPE`ZAi}viG{R2r|Mf#%6@6O#nadQm z`srP<*lSyTvUr9Ed+tfU<0sxv^4@HhGSRb2>d;(Al}`a{C#LwbH#)36F5UfC(O&NM zkFD~ab2R7cG;!97PY4om+26gtm6vaS#FWzM$vJHIrd_S7TV0kh?Ge-W<@*>VR)5KR zb<s?9&7+mOs}4?%+dNeywBTjr1IMMpyKa@oNxiJ(yP$US{r;VT7n_Y!pV-IN-8WHt z$8qeDtA5xbpUK5?GZmL<as*`<K6#z%(a<_sbj#}N1!*FdmTBwGalPFf7}=KcQtZKl z&VcaEi{z9J9QHi8`*Y#W(1U9p$U1&iTzG2<OOk<%pRrQC-n%^=J++cS7gEkJNpYQZ zPu_Ejb*;?@#~|IC&UHJdg_mC4=hsrT!~1!uU)hd1&rLpBv;XqezyIT`|I;^`e}()m za)y52EvL+{b9&{kJ{xPn4GIf>DRnF{n|W&1ldqCaA>L2+WJm4)^Xv`Fv}IODTsWd~ zR;=-sKIANNZFgDSu>!S*RT-)oo9`xk+UIKgJ6va;$?c^q%99pumbR->%l&)ZHYPCe z<LUX~KPUIcSM+Yt?orT=nDwJLxcc`B^G~av$=;HdJpXi`YE6)OzvWJiWBRNfB^SB^ zUW+&#IW6{Eu*P7M#8y!?W?^d$VUD=Z!7NVmb3;9i4?ZfgDEr4V@uGsCe`xd033<mq z@BZh~sq?~k%?;lpTY7#TmPk?W(cJWGS)P~Ge*R#?l_4x*D}VFy@xDst3v1`QJENQH zSj*u~)0g7hY)$LqubAqtk6rfYD$CK9xmT?&3+LKA&db|UKmEM>w3_PfHT8F2m2%t0 zxQWlbaoVorhw550+aoK*-JcZ9KJPUBU9X~`|Gz)ZCQX3{gBGebOFx~V*0p?zb<&%Y zPdnZ#-wrQowGg)55bJI-?e$WHHS52(@;_j|=00Q9-rrucUY_DME0#~Q-m9}X+jr-t zN1dGOGYxbsR%-2Qy2`l4Rbu15N3ovsCRhg@{SqK2m{%6Y=)Xtfc}Ml>dU@S5+2Lv& zt(o86oSNU?wf)-N*PY91&+<i_UsZDAh0Xu1mb|M}H9l}oe3vH_zrfbwYt<yv$<7bb zj888S&~bY*;c3U@dF_)<N_-5L%<~9%vH8UI+hKA4FV1{D`-(e<Nozs-gJtznugvcT zKmGE|{PjbdZu?k~t$tF~IwxvGtGR3Dv3)!LHeA_8qhwZ4mSug&L0<opY||C8&$k;F zS6H9_Fs-r6Drbhtr|T;@ckPx@m>KGkduHd$<ZMF$HQn6YB2%uQ{WTT$*6OAAZ(ncy zUTktyv_sCS)X;z@k+T!DF8Dlpn)PE(VMxs3v+Ip&bD#X%yDzP*Lu1F@^V>^a^`)Dy zo~!2ba<{Xy?Lw84RxF*{G!&ow?U$}<2|bnl+H=j;pT;kOS^u7BasSlHcB*WONcF2H zm)G%_oAEu``zQLNzfTn7>YGt2cO>4eJJ+{&dgJ0v{!@KrFF%v|!=_Tgx#a2EFUxFR z8<e-meNTMEoN_U1g3~pZC-yns=j%6?UzYyEke0gP+e#JBw;?XfX799W_2nK~)Y()k z)yZuTTl@LnuKr!C1;TWu`)|nh-XfgLaWPWbZgqU~*$CaxZ074b->0ur{duIw*tp6~ z?W4;wpJ%U6%$%NK`{=1I!_2emotI5t70^&v61y>X(PFt*T8p=zx#c=b&PjUqd!JUL zbFTsq?l`5oywT*ztZe4p#wXwVZ7Mhy^6LNN6;nQPD06A*z6lS%(^2@bzk1_bmuD{{ z8s>jmaMO^nF5~wUF_wEdrs2Ozo-JqmWAyU;v9kWVexDD&xc_?LQvFqnL*`za%H{Eu zb-9AV^XiX1x5}ng@;=)izurwsD}!sr_nLc#n`<X*xZ1bnrQRw*H@;n&Q|q2gyewo} z|4Z<{Tf^Q%>dCf3nXG|Awkk6w{wsY`9X4@|(yY20CA*}T2^gI5YPq5I+3f!fd7}+G zitQ^xb=7>18^r#*@apk#u~`*nUmN}8J<fhQZINGY7*RHRU189_&Ti?uw~}|SXP^1f z{nVYKt8-6H)3m+IdOpzRtH?99?eWdFOAa1h_|;iF-+N{@N2z)4KHbhAA-9%h-1t!$ zG?{%9d#Q%*4zIXZcG8_&*sagVsNN0AToAu~4uj_1bg}-f&q}VG=g)0j_j8k7q^w<A z?R4{ZHqzC0%cX84Z4dsQb3QoyZPSWw<D*kgZIJu;en-`udqusQYYfXYSMl5Y7TnME z_&NX5`!?Z+cNm)mZc&`9vMJu`$7YEs9k&Y^H7-^>lDZ=o%bU!<Gw8_Xx`m9UuQnXo zdy^;jdu!1lts|O0rd$i3r(d6^yy#CEW5F8VkDg~2e-tdSnJs#cQ{jq4zmyjLiTYLD zJQoTdoNrwoweN>+vFk@3j<yJI0eAKNzb!f)i+HD7zMJ?{@-n+~;<r0_AqrmHzDJeK z|L(Z>PVRJrr1i4drWbwNj}<QE;3;#u)#Iv~zx4IDZw=av@tnm694=>__}fu!^l|e8 zb`I9#w*Dukdc41zCcS2A_Rbsku6bu3nc`Kt_H{s@on5!cZ@0?H?Z>u1|F&M1*E-^^ zV^P6I1`|yVALgDW$#iqSY-5>SG6jM!I~|<3%3d%%cYDciUuwKp=2=7wAD76UBaek& z6=p>2;^>Z_W!Rg!H#&1|+KLW`rDBhEBvsTDOyOU0@L1bfpGlSz`or1w{W~=2VCck2 z{0Z+4UOdffw`)teo%OZg7dxxI{*VuO=wq<?=X~oQLasK!9>s>wIZUo^O9(Nof1PK& z_^60YdBVR_Irpnmu4%o~m!0YE!SVKx!MvNd)I{%XQ#Q)HlO`Bl_+D#OO3k52`!Ct4 zJP*%x#NYq2r!0r*?NYzx-(Oa`^xH4E?5=JW7<<q4c5d?Xuj+@b+3cRMr@!~+P+<BS zbG2*k>zPx`+p_v^ly953y7s(=-^2S;-kT)WmYfwosJ&a@(Y1SXn%dK^d471RdF^P) zqN5Kik9N6CSuj)n!amd5w)gt`<kOV`L@U{Rg4`C$M|C(X@mTg+|F!x1Hx6sLJU-U# zTQO&MWrveN_dGMl+dkg2Rt9)%l*|08Twc|6{*h+&x$6bxd?_ck2H4${S+zN=Ns8O! z`rL>~+fV&)VUDabdYn<Qvb6JJ*5o}m9_hbTXAN0!Qs%~frp>G0E#CdBic7mzXO6q# zVuoi*X)-r<m?ht_KNK#(;cscDb=+jj_Wi3?dYcO`<z_U^xwumD=AxLFO+UD}%iQAK zDvY;ow)meZkiFEd(Czo(h}{ue0@Z$}nHPk+UYhc{$;MM5@vO{^Df|b;MUKz^cGRl; z-*1J}%l@W^X>t4(SlzLF2CM4rH1=R=T~1LxyLidGnuM!*J#VG!Q|Ihg+jU#!*R0Pc zlMOun=j>eG6Sa85I@i4gTso!xWzXY2KM(leB*1jzoAE~D{CQbLEn4#@R~2ZV?_%F9 zy>jl=Qyk$65<;b(2euU?XzAWFS?#V|#-r*uQ|sdy37#F_3upWa_T2eJ)H<-&Cs2Eh zRy@Os>G}&5tn-&&%<O$;*ZK0qUN?8v^3S_ZDP6nO7MQv-H@c6}RsPP((2se?ryhIp z_M7-e714!!et!%tVjl8LlIJmbxBN+0(n;~iM9Hnyv-uuo+s!Vz*XTFD(j&Uyb)eVZ zVEYGVH}Xo>U+%tWf5GeHb&i6AbFAK8wKrS1@_Oc-zyrt9f1Fy?w>1CwO0G+SQNQ~d z+V9BKYAsxLea?~9DL<ad7uD=>S9$(4IZVIP`C5n2!?hc)*gmW97XNM;?X`OEHm%<~ zvk&nG-!j^HG;6`BH*br1L{~`qy_<D^`rOVd@_`@xyjRxr{4bYc6V*s%u>KKuPWrT{ z-{&3P>B|pzJhj;KL|e2Yk^N8C-IT{MQ+Sq_YZ$rS4k*=?iw%~$m8P>&<J^}dsStKw z6|HUSgyr(rZmr~ax$wRili?wkwR<;Qtw>sWQDwifj-c2-&bWDZ-)O%-=W(88-Kh^t zgxSR$;~$)GIM-<XR?qV)tKJNz{v7X=(i*n(0=29&eN(u;6lhKSz&wk`MYT=xXCBA7 zGkp#PH7fR-ot%p9oS4RN-*j5!`dV)DTV7A!Os*HV+VUdcPon_;EpMxyO9dJ2JH>9! zjwrF%JN@<QPaC*S>P<-C-|~6VnOFz+_0pZCvS;=GJ<U4d`1IZG`8|2QZWjbhzEAwW ziup=$ia}6I!*Nr|B_~X*ejW1U?q1AqFY$8SVYelU{EWu$9B1En_>R3V`P@zI$jRNV z$7dQXs5y1Mh+%sn-?eAA;{F{nIvg?i_xtnfc+cwi%Rl_S-AT8r&*}9q`;c!BWnFKV zyfnRku*`dr_DsuQ4vF*c&P&+;>Nn=@^SKt8&hK?gfBH)EX|BK5eC5nt>m0BCJ#+uk zozau8ZsvCh>Ra5i<CbqkpQkk2GHK~r%V)>D4NW@!aPUWN5KY!Ab=}Z>Z{b_}ri>od zma4T=MYAs#9cgb&HOwwiI<@?nL*BYu{Br-3_U^D3&#ly~iEo*kn81H5$3Nz5)epgf zZ5p?1)YX>layQ;$$hNP=JMNa$r{35Eg+QGr7ee-`zVv;#*?!HXY37lxS8sUoE|*GP z+q_?L-n13F6>n(AoM>3De1D!<>GLAnN!RxoM}0|7uC83DdS8{jMoVSyrt3|0=NtKp z|Gk>xD!Gww=kse{&*(a7Y8tK)_A@OxJ^4<!-gRyxw(Ad9=J9`f(7Hoeb=5w9#e&0~ z)!+1D7IE%wdVA#QvvVc-lN5J^of3&qEOODC_oTQh(e!3hVcy1#>ywqbUn!^bc&7TV z%6I*+C(r7UoX4}|4*eGEiGe$%HcsMu@zH<EyTgxV=3gprz06w2+4rMOecRpMvw`wa zPbW`{Ph{V7sdnb1cQ?NNwe?VWTH+o$-QwV@rdht<bZl=qZ}ZkjeOhN7`QD>#2b0+G zk2c8<X6<uawz)OK&Yh*LfotbkkMyH=nJtTUoSNh<BQwpV*VTGjx0>p#aK9xN#q}NL ziLdI4OUkgfi2C>VSxLjgSEY`}|LJjXXU|At%$`*-ZKBK5FE5?F1ss^)1UJucIm&K$ zeS$~VS^bj_?n`c$W6wGD;l{O&pIuX%mt0YiD9HP>v?Hp5%ZGX1vb&yLg6Gdn(mz>$ ze#uvUyO7;q*WD}OcziEKp3ki&`@3<VOHawA-N&@}c4;&-7{8p|d){2!Bzo<E(@#|Y z)k;qCKOYd&mlAfRDZ(|r&d%iD(S{kKc5VKCYp(sABt2=r{Hu0H!<tuzE`I;m+IjKL zQC(qo&snJ@>ehcZzwj|so$+U8V&cD`UX};_TqRMzS$&=>ueNznF>yBE*Ue#OuUGxs z))4cNmBqKOG9oH(w$iOV5n<eq17t)@_&%TVC`b!0nX&8d<qhF&GX$>r<Q;GPUBzD> zwIO)Uv<VwF@H>g_U0QfSFz&O+%}L%(p^J3A93-rzz0xnYb$|6eap>r;rt`*AicRG| z>fXH*yHJ~JqUG#sC&ZIicALLgRA?o~{mA{KxV*tW_0!4)o?EY3bUyQuys-1pZ0SSu z-K9LXopmWJ(U9d2I?>sC*~EO&?h6U_X?G2#dFbk%`MY6_DPK^I=7ltGm#5CZU%54i zUK8W(=$o=F$H-CsWmv**!RPY?d&@Sbxo(mDs!}T?ZQjW_#YILVNvz25l7)twrHNAs zoAk7YtWVOH7+6k~7LUKy`YZ2%vtoSav^!5U*#7+LH90Zy@TTUNri+Wrn&*{o*x7#F z@~wfFZ|qjFB}QvvJ)gXr)FFDOEvSHLPF+*K?w|Uv-&3ZYT3qAgpe*#zo8fWc+N1L> zezdSYbR*yR>mB2xR;!GUpEc+CQhRvM`^CD7+H!v;gei32t`-SYdi!$c1{QbD`sQ^D zjTINYI&GHC`$10WT7>(%@HZ=cBSNog<fvqaiaT<(o>`fH@XE;*I|Zx0&pI|kHS6&4 zRSK*b|MlFqT}ZV$yQQXl#g7!W9%Dy^e3xHudU&gM-CrVSX=QSDd5Uk)>6~TJCbi{P zYuG-D*eumH>^fbh`Z;8W0%Oeb01<WL178+QZR5$~OXHfl#&l;|x%Lk>k$n^6t=|1P z^>VL%q>at&XdQpwvp4e=o-*~5h*>G6(&J;G-Zo`f(%n}fhaSl6+Z{GR?v2WyMA`Ml zj*p6>TMHH+5b3<B+^rMaDe3vls4)7TRJUWj^O3A1-MIEf6F$|MrMpjl_5Lk$#9+y@ zmXrBQ=ZZ%pbn$z49xM{<jomS&(ZKL_=Z)gE){a{r9XZ8l@OhVcnp&5}cjnZ$2a*J* zNbE4P?%Q^6K|nWKr0v%SU$|S^#IEnrSTz5TMHV-2Z{q%-V9|feSNNX2zViN+Co_Ki zdg-5asFhD5|0Q4Qof#K$<He`lxEA#{G`29Y?tq)lf|oI;XFG0sXSj=T%|cz>JKL2k zN>%n4oLJju?)m2ntMKyWJB~|gso9_EEx75=GCxXvv(1Txtwv&3CKcA7dFJ~iXZPx> z)57f>zLn<Au*shvyms29-xiaW@=m!}G1X^6dCkNPkA#oR?NYn%z5IjCy|T$49dcBb zy7&5>>`*FmvU#@G-nAh%ZSnW1*P|Qf_U^lN>DmvAxf>i(E>$1XO8Axhq&-gIT;snA zPEk`X=h-O=n|B3v-O+cJ&|eeya{7c{`&bs<c(~~JhLY6F#rlWz%pN`Ue*Q2c`b@~< zSNV<-Q?zsHPV}6<FTCu1<(j^{OY0YO%nCjlwxTMxUhCLWmHNb1#iZ6%w~yKgZISKD zzY=Jr;o17T?0S~M;a{^(Z`!Q4MUHW%@qs7WZM7<MkFK}g@#~1kQrWZ?#~t%3G82QR zs%_ZTdTjmdd1}@9PyS84x99L3(@QT!u2!a<-E?F^W$^dR&<e#nA;KE3f7mp>@^CnO zq<HGA6EiyY{(k%GOPT)ROUo<8q~9nUmRl;&QoMm_OZcapHAXH|tPlUaxlwB}Q~xph zpG)@rD!e^~Zz^*`q}4q6%5914`ySu?ntIUAS1WpZAm8>fxrybWaVhnZ#~YNli`}fR z-EYa6n=$R<rbB(&A*!xNn~GGEY~)PrzKC6rGl<x%?Q%wWVR-A($!GSYy?-WteT!c0 zk>D97v#JUcdNXnk$sXD;$#=yf_m!KscZPOoosT!39V)%4qEG!YL+$MJx?gY2A8J@R zzI(HGXW{>^zD*AneONTb^+9?g+iCV9OH+YFW2xnLrY(s}4iQc$(LUyX+063Cqb%)z zt5(i5{pu>Ycv&Sc^Qt}_yOwF8CUvLR2v#gR^Jd@MNeiZKb||{ua_i}~BTw$DDTe%M ztrwlqwIKG_B)6ZNuO5gzER?@*>#d}jUAcEQn?!|Nm?3caq~2>!mSQ<gt(VE{lgxK& zK5I!z>E34S{&`}z;mxbF`?7du|Ja*+cwXwA2U$}uN#$N=@o{i6+Y$OrL{3&yaQ@3F zPgqu4IbCnBTRgv2w@G;OxBDF{x!h$^gB~hm_GO*#yP2C(wDN4n<}<NVqCXhD7hO^K zRr`GShPJ;aA7;%KyZdEl30L%cd5Hwk=YFioJlFgurnw6k-M^P`P=8XD(m{rMFJ$%N zjOWi@!dIUk`oQ7My3jSxCd%C8eI=FuF0<VIM1L@E&%d16XL)W)OnoR__9CQn`jn!D zdlc{1JS{x4*+S&-+-Gl6f7)(0IH$p~z2NU%_Cw)@!RtTF)|$EP*wb7sN#npB&IvOP zBx#&bkof$hBktt`-l%haoLlY|ugi@pPcs+DI?^qhE4D~dLy|3gk^Zk&>9I*m8lQSD zYPjZo)2+wvVH|hk{ik=#xtBX%Z;&dTrD-?o)9<vMlNQc1-PYCAY|q&|C+GZb!O6Mj zJC@86?Ja4VQMdEyq5Jcj_P3h7&U?CKMLGMK(gXi;b21Lb>SfhT-!RX5!Fq>>M-(Ml zRZ^~LK3eCtH7TtA3#Y?7wKvbw`I7TR9{5G~8&8(^ahDZV&}HzwCE(R|I7R8~Jh4|j zpBzl`mTWq5aqcOvtQ*g{&&_!vyVt7ORFhNfSBC3^=G1o1Uy&lY7f+e57Hch4*=}&l z-MQoF89C-~xxV&O;Y`&>kJ>KX@<2Yw(MZO^qi0W!@t6NUES{y?c7FEZl6ZFYV}$1= z#|o39JC*nU{u)r@@U|c;^u(&V-}_Fl))IE?t!QA|_UYQ^*)QBeZZREr@I`(8<L%Zu zch;Uc^5v!9rpQ(%x1DR7B_0QSw2L}4<=xb$v-u6z$cWBObG2cg^p}0w8t!?l&otSJ z<?_rk`c*fqIe9m8<@p<?HHm(g6PVt7dA-BP;)ZMS+1H!DoKNC?CcU9z-c3=PEU~6V zC*I7mI9GXtUoJnsCwueMHAS(?x5A{(wF>53bj&`<(!Rq!&Fa9)iNU*aEX^K7CFR*Y zOHtk-zD42$&jcS={vC?*D?dftUwCoT*JT_YyZ1>PnO@uB`fgSIgrl>&yNv>`t(#Q& zG_lun{m~~6E#kgR=KfyOWSqHGDMR^RpX)=$<lq^H+qzS(I!*Nbb1MCmkDEr|^BIq) z3(wlqXTrJ9(9(TZ(Bgl!movAdH1i&Ry6dUP*>eul8~1o5>gV{2A1V(vTbv&GJL&Hk z58+4q9vweozGqq0-ASuvu$@=Z(O}E>)?iwlvM_V|PP?mi*WaC&cp>2{A=mW5aPn)B z@T`x*&h{#i@yB+q-~aKEmLQMxd(r9Z7bn;6Ro>m#RA*x)Id{dWkn+r%CbhbAW=y=( zRmJ<e&1~)op3HsU|Nlt3W$P22-!eZ{!QaxZ>1V)>qBmX3@+NS}JDoAVq!4hkz4FMm zo_=1X&?^h?7d@HsJbxnBs)UNo=M;2&9k0Ea_UGjuj@_Iy&&=(-m=K+|^Nti_>y0~y z_h`(#7Qj76W3l)uuG|e~B{ysDq_nSQZSKkXoyc~VW5yKOMMamdifflYyI-*3qR#X) zm()H5vTSnSt6nkx=l{B2k8`GM3gf%=LoMn}$(oH`rsq#>3cF(P%^>)!d1rHs_s!%- zK`ti}7PiGya+!Nd-&^vlW%UH}2D91wqK<RtNv=64oaVS(xb16{G26oj59FtOuhU-n z=@qwdN1DTd3yCog+UxHw5k8uF`t8YYhVmc2i-d14>9?Mu&NcJSX6Nr(UzQ!4(Y7zt z*C&~kb;*Jv*%fwmlQ<J&MSEpm=T4LI-%zq-kH3esx5SSJF-Z$I8d@IwpyugYpWf2c zB;L=|!}{!aFT=u@Z}Z<&#_9N<Q0thHJ~wOr4!h^uSnm}_FKtYJo&SHE#)b}=XWmmD zKHkfk?D0a`JYrcZm;Em1y3?#(v0o(AgBM<%sCcB~@--#3<=)ZtZp%;DuW+`1_-Ce> zc4cPL_ZK0>S?muV@6Cu?DRCyYXVuBu?Vk_#{h9qv@BXC;$&9kw{u#V)R^Ipg2j9*- zIcNJR&GGs-WL?CTI5c~^oqKkJwI<1=|IDVS#2?4hw;i@EmG`V;dK&os&+dxGn_;DQ zwo66*-fk?DVY2aBs+z()o{NhgNE*H@cd#h$xhH<WEwE@|&dn88cV*klUzBe-_w4S~ z7w3;ZXgpPSJiejLQc*T=@+|LM?HNY;o|BGF5M{Z%EJ@y8nM3E2p6%!Puhb@I9owPW zuw}W*WR)b=2UFMa9KLaEW$22<JKj5QIUe;RW$p3YS#Ox4=M{3?me0yNEo3>#e(V3J zs@@ax(z(BdcyRHGAK??r`Da?k<vKGtxU$+fk<&wDi702N*}FEE+|`G>S14$Ix4qOd zx8;*;{#?!p5kDW^e)C8s)N|k5H|p1QXNJz2oj23Z!|K~YA&obWlC___m^ahmPsMbT z<yRN0ht2n9JbrXCQ~bB?g~c=X{&P}r;FsPmul8mYTVeH#SCZi`%B3SSG!|==Y9@Y7 zkoHSv|G*g^WL$hcbZ+C@!>^VZw<K!w%UZA&2wYP<v~azY+HbX*`n~VxIsWio^LUrz zF6(s}T5I%<W?hJUd+Wzy*ZeFmEltnx|Blav!alrz^D?S%)8++RIZK!Jx^I7Xs5M8z zUNl|D_@rR_y8Ev-FPyM;kJT~RB~EH<lsLa1DJ(hKdqXJ3sWN@XY#y_$yU!jra2KC; z`%}B}^w~loqn@VQe{26dKH&c?-0}p+ua#Ejjxj6l-`@PdS0dn%M`Fk(vrU&59^5bg z{$|jTKdWR71H2OdwAsyJ*}Owvu4SdPP1Lk>37u7Dm3P>dK63x1=Dl&V-^m}0n<dUI zmRgt=UdR~z=hfHZkF`H6);Gvqmhp3&tQh27f6Lo6--B-w`!3u4x1zmQS2%x9Nx6S< zQ%*_TxfA!4Q#QzVeEV>7llJrOuuUyO66OWZXO@evIs9j_K~vAK2de8hR>;M0ByUaM zxti%%ka=IO{-J<J1(8RVd7OUzWBZ1#vXUQ<*Q>05zG3=_?6|2?KmUbAn}of)*)}sM zcxAv+#%kF)?b{dhv$@>ve3jg#_25;+bMYzRT$=h9j^6OyZzc7S?{C3Eb?q`ewTD|i zAL^T8r?<*`@gxq*HBV-JN%^#9$5zoJSslCvH{Nw<7YWryPWv!dE_LCv)#(XE&pnR6 z+)_K?T=uS4Gi+_<dK?pb`+WbOO^3UkjQ$?u5Q^HtzPWzO4`0Eb(I=w3!|OM4a=PaJ zXL|KcJyv1U7E5WzuZbGo7S&Nc(k|6C=Bcy3eyroV)a75jV(sGX^D@`-*-c!rr}kho zqwhA$yBp8%<@zwIX`Aa-0jb{>r_T!7zn?50T$(0$wePv!I_XuDPPazyv#$MUc1L5; z_bvXPChf{N`_nWyB%s%;*SyiZT%qV*`m@y9xJeT)9iJArfAIpdcIn6OXNqaPtvIQv z5pn(cwi5wg4>|7Itfe?lXHIGROABUJt2FzyH>Rrf$i7_q;>DFEY_2*Xu1g!=t<7AW z^-<nm>&Z69cOtj6I*#?XICq?r@7&2$VR&Yn`Io+rS6gQb2YhC9>|Oc!-QtevtL@zn z8E%NP>J(`y{8V;n|Hg>pA7n&ton|(_E1ShLFP8D=>B!=oi@lML-~BsxY3Dz4T~@KU z)7NWuoLTp1`Hj!g4*EC6YAsx&XC+^Det7zoaAC+MJ;VDi*VcYfc-;9r-mAR(=PA|i zy$7o~_<#M%T~ILH+B(|wjs81>$3>k#nl*dBB&=C@?vs0E@$9V1tvlPing3dE>w7$7 z-!r>bwvG3i^1it#Dw&_-xZ;!Y#p|i!<ptTR6cml?j=d`W&==nIcj?=O)eF<tF@O0S zEO_wKj-BZf!dzZ?A7xCDYgrebY^ZrX=lk;`ffs99-bV+#xYnz=pl@^Cl<H!$HvTe` z&GXiC?7QrK%H3S*Tga!Pujf~{EmZX}uYTD!N3l0Gf1j<-)+lbd+dnijRP1aaJx zV&BbmrL{$zQ&9S-YtoCX+q$85y^^-<`QUi|i$(Dl;XK*c8ug^PjcZkAY~t9lu47+s z)35!~-wNl3+lVkI3K>{h>F;9^Kf=q!C;L-xvLx@P)Ws~eKTo~A$@JmtoV#W0C1+yv z3`$}ZbYiDZwy2og^2#<t<4d&M>Ql=r&$(Spk$SzJ{au2G{rXdx9*g(O)=gc<`NV~9 zw|&eLE|=M}K3sqFr)NtWcjr^#ZwKe4ZHs=JIOj#4{8PD&%4s3rziwZ(E@eNv66@mc zTfa^e*l@aE>xcp06Kxs(#yM?`M~?2Pex2d9nI-Rk?#j(aWzuh_sW(PPU+~IF3kiJB zae2emRja<R*c3ahWZHeY^JoUU<xYOBhwCbzeFztLBirHlS-tCoH>ZQ#wmP$pmW_hk z_kJFpxg#&g+xKPFG~HDvSuTY)<pe}8z47zb*YB}^=OqX8tX?j7WAWtlm)1uNofMZo zTvztmXs%I{sh;GCI<DFBbBt?iO`Lwk=bZZOIc>Yxhi9AP;{?BZeo`r_zqI-M!I`gP zl=Rns?|M<Asl@rWhH<Um$-7S&=UR5IPK|VXox8^I{|Z0HhDkXb#xXB`PJHV3RjE$C z?-a+|NS!tHa~j^72Oi+*WIgGhcT{4fPtmd4*WWuPoIdCFPNJp2dxpt++2*=E;ZEO| z%LOK#m55&Qt5rViXo?&E?R8BO><e<t_9jjCoq5<iFa2i0=EFzNt`zZoVEZ`ZecxTb zej}-EFK;N!%Ada8UC&ZVQe%oV>%PA>E-$m6{w+D|aD40JMD@hG@^2c>d)+epI>&VL z;%Ay~G&fD0zrgnNq~lC=8{6`B-*J;TsQF-byyuJ!cMHUM_GO*Z6#inZbju;`uk$sL zyFt}OW{Hd51f6R>|Jh;k`z>kTS#@MzbJ{)-pOvZ`RlBL}&w8K5cEU~7b-Neu`r5Fq zbJwgmm+5n7EEFr&c(9p8Qsuy|+wUK&c&V-I*<T;IMD6yi#xHfL-<m&edba+yVd$hv z)xITr`koy&IQt`>A#i5(u1Ov2&Vh6NJ#I{T^!7ou$B!*`*`;Ai4g0G(4V*po=Kq;q zv??R*pvR&^M%#Ga=5i%+p5r?{u{_ZuD6Gb}=}_;c=%vRUg}-0_vVF3d@}fymGufBD z{FJ@BWBbdAwl1AFquh8xfB)<KwZgtzy0FIY{Y~$ke2K3GWF_4<uieVyeADuPi9yJp zwVPKO-r>mBw6+p;zLhMh!1QUegi~Ebh0#u(Ej#42H|82CD$h$$e{zET-*4HaO;LQp znG^jy@6J#BmS9k2vadM*LGP^dC7jMROuY+29=QkK^2=zJU!1R8-K6%wBrE=N`Lf^p zP8@BU>#^j(GTw{710piNsP70pFxl7au3@esUv&t_LKcIEd_}9n+Z{MNn=ZeRR{s2E z%l?BU!Dksid$fIzoLZA2Ygkv7C%2_0u&6?L?=d^$!wmXS@4vo$*eQB1^h?zY=0*P$ z1V!JSX%Tz%ht-C!$MKrwyjeY&(uD{8y)y&0CG%!Yz0b0FrvTSomVGOqJl)@;|18=5 zM%*zmEf0UYA2AB4FOAj&soiTdmHIB*GBx-&-`1tCxIQ$0U&C&Bk24@<)y(#*#=9<O ztG&#*d~VV1drFnOy|YhBTPT0_{<=Jy$0{XmrQMchi=YH=)2MHbC*<vOT-dH&%YAo7 zW@``MkIgw9pT2&)ZNHm;^0S#Hw`Lj##=Q1rTEBGV)$3K>5sLkHqCOeRp7^Zl{6mxF z@><OgZ<x<>tkX0;J#X?Y?UpU8r_Cr+G_5e@<-cne*u3>2`wHJqf8MRKW|g0wXA3fZ zEdR@VxOMYQ{-gD6Ul#wK_2dwDjjQO+8HZ|97jRzYPiQUcR(&OTcuVzSM(w+9uI{P_ ze`<x!S?{}X^U4dYdB0y(Ury^bOuwVd%RK$*?4H;YCp2`rP75#HU7u&P@lW)pr`{a; zH>2-}<g{y4Ff}bXrfebexb=F#CG$6%_O>6|CYo!$^Ln@0Yx8}V^sn#TCwo+AzFx7z zefd|dQzlm>$ge7yTF!d@gwWoyiRoV^_PIQ5yRjv{=Z5{wySh6hzp_aNe1E;mIqI5- zim6`n+@71SLnX9tT*#U6WJRt?uBP^>8y5c8CuF=|q)@VO;RcC6*UFz%6~DPKKll3? zhy2I=wucj)N_9<5Hk~w;S$K2mn!JytGoIh!y>RpU?*&h0>x$L4bZyEkt+uM<)?MZ2 z{q~#Z-1!?K)kKb$e&zF$nbZ5^(1{ue(}<XzzEAS5B`sTJ8nypbugkKh-~Ud^tzdk! zCi+IlJI!VWk-di>_MOtXQ&k|Bnkp3kqIH(*ggqiPQR|oG8a)g#o^QQXBW@a_d)<_i z+g&bQU~y`X$hx8w>D}uckS*}~*E#=bS)La8QZIE?SX`S0)xw0=Ch9+F^(k8JCUe;Q zX0AuR&%F(dcVwJGGfuylHYMxd;WY<BUY@ei@Tq!v%p{pZ{q}_wI}ACev~O??dG&ii z=}dQ)?|$d!{N=pdsJS>%?{@yrqfSnn7;?nLT+&>kE=)cg_$@bc%?*)HvsGK)sIS&l z{`%~!JL}9m=9b2Ti+V16ZT{eCc+u74<H^YAbyj^ZIZpXJRJwLszpMRBM~uw2k82si zYEI1eNwwf+Zi(Ey+2FqXPAiM1WAYcRlGLu2?TUC*xbOe8gBR+b-aI|wRa!&1)C9Y! z^E;oO_%YRN*46#5Uw?7d-h97cMwX1rWA8mh#-})p?@V|w`$^D;hX+`SHMLHie89T4 zdCjh@SB2+psX190A1_KR(llFgwWBoq-P37W8L~##d`~U7W~}U{t8liaV9}1}X8e&d zqFw5Xzj%1C{x#2Y)0q>e@Z<IouG0*64qV)KGilQc2ET%i!#ZC-Y`ePYX14Q@0NaA% zSsM4hZLn|HbuN_EXZP|C*C+6vwL9p;8hS&vXralqopKL%IBnFK(ebm+W=FE-vnWx< zX+hIuw<QJ}|33fpPTLwswXA!Y7SF`>zcQ^nyJpHy$w<l9=QU3oNnf4O?32EJ$$6h? z^W^8hn^bV;LUY>sh|BEt>MK)rENp8kmzzJ|!65kUjHvq7C9N$Ln}URH9uK*5xV|T4 zjoOd@w{|RF=Oxk3{lIsd;Z;sy|8238XU{q_IoG^$(_1yaZMnPEq}6X*{H)FYSAM?y zhIsYct#z~SDra4*oLzrA<AR*el?7#I+fKY)ySni~cvU`UmD$}Jtsgl(yjb@zX1&tP z`Df3xRG!oEcW&VRT}wXLye#uokqQXEQaPX3?f=C4>iWmyp7Mmh_o$pV)$o3tR@LsD zODlIYiGP^CD#m4rq>0XAk#EaOHQcsK9EuiLAv-Hg=5SluiI+Vp`cGm4&gAnjN43PR ziQQv<Ins&gc<`-BrP&|Dle71yd@|JOY1u3!C+K+e0oxjtm10);=lZkkmY({a)~eYu zx5ZepWDoDRQoi5(SvNHHw|0ka^F4Iok@ga~HZED=7^OYlsmqr?>f}<d<2v){+NyN! z?AEPw(o$DCTJT(PpMUs$nxYb;j&eqc;C99xe_H206yZ0$%(B;T($-F~n$>OGZl6xA z&diRA2u_OFZ+z^@oSygva^+t#Ssm7DZpv8@dG}2DS%d8omoD}T?Vl8M=C^>)5&o@* zFZ2q3`XW<ZzAdcl{QLd>nL1e$+PBJFKb*$f9$H%;@;xqO(dK{BlXqX47P4J{!RG%0 z3!gJehCS=Mj%zzE%+8(ow!~nu<Qw6+IdAXwD*so!={otS`LZoSaVLE|+nwjW&#rHp zk$(79N1EwY#WeGSMavYMXH?!=^DQCg`I7s538oXzF5R@oJBOWzy)N0~XI5!~$-#ax zpNX!H%B^2?9(sDs=rexo=(6det#P8`LFISZs&D(fO#dnTdK(y!^Xm7K*x5g?PTM4W zJ<aOwIp45F*HhL+K3rUV!e@)giRxzm>IP?@N;UCqKIzd<zTbVY<=g4avy4plebepB zQZ^2Iws%U#1(B|*?B_pHczPZ_-}u)q`iqkF{DU?(*}l&=n&f9>b2aGumo~}l9dVlR zG1n9Y6OOn_#TrxxcQ$O=Wf#um6Z_|#?A4uNYria7T+sA;kI8=TQ|Ea4Z!cc5$z$`Z z|CVdquIBk|ZE&wDKc#tSdWuI$iu|gT4ic5eE>=ulq<U7i=4#-n{{2(lr|oj7D?TVW zZ%O&HJ%NuG^xtQb30G47ch`mS`p>npN^WT~RcCxA9sQR*Cwj)}PL}tplftW*7<?A^ zd*8U~?3a<uX`5KpU3E>atm{p{r#%d>#WsC&TXwRbVU;Y8U(okA4n~#!2VLVFEd7;k zTX{@qzPWGq^1GM!tW#LA`G4$(eJ>l1c|J)ki8(gups?lU;tSI*23;%Q3Ho*X#R?6% z>Eimu*A&)obeym36_w4*Uc9!i)^VaHdnALq`1ZX)GnDslpMP!NqfF(?JR5Hq{}Vs( zl_8^bn#G%EFaK%VUMQVa$9_v?w(rB@=il>9+}5%>C06ar&so2+mg}13m7Lga$BqNu zy^EP{U2mJ)x?02D=U9*M+$k-Ye{}7XH>)Hq*}Ne-FYwd$LyqkoOb<?+K7Z@2m2XGr zpH(bz*}s4JhG?p&%}TJkt9@bCjKHOL))knkPZiN+Yj(2p;paP_9#?tTkZq!-arvS> zbw=k72})0Mv*7)GeW#kZp8Qr<O<UD@_vR}IZZy3ZS$;K)B`i``qQa<Pk=enkDOd8` znjONG{!4RzYGhjTO<e5O376`^>?haSZb#01Y3uam{^45*%Ws9<^D;P|S2usZ?-B3! z`==hTmlRrPnwR%lLF2>J&ajtdUxJf+&u-1WIaO9sId{r~=-thx{|Z$9HoZ!8uDr<* zE5@hm)i7i0UDKr&$3>I&-4A*adOYJ0zsSt|;v$ojzW;eg&fHti@Z-b})~K|tv;3{N zsu!1QJ^W|5)v51%d*^jm)*tZ(%U%9&xEK7V(r4}Eb&ZM(7w>d9>yz?Za*OUi^=yH} z_-%hU>cWm_h%Acye@aQKpzeLVsEF97(%+#!Oq4G?3axbev+30Cr`_v9H`Xov-P-@7 zHs=0!Z@K#nQzlhZX?o@|ZBOTpsn}@#<Av;X6M=+}9K2ba7sV$C%wKV{*Se5>_cp<A zW-d=}&HDfE;g{xW?jsHiKZO?^syXr_EVtK)w}{zS_6`3F;kl1zbbMrbC@)mFOhWU} z!zm#X-(Ow7^MI!S|K*6gq0UDhshxZB>u?q0B-86bhs^W^Pjz2EaIr&wc3^Apf5xU0 z5hh*|7VFt~G`_GsW`6shF{FUeHK;u9+KwkzB)_pvh_iA`tNOU4=P^fw%;8zCRTmo9 z*!*jeF%8m-_@=|X^Jv{V-oNZKayz}6BTgUaSoAb3;9y(CqsZl|Mz>{NMrUyZyc7uB z`_*xc_$pKW(>GrGobi5~`uXeC&<$&vj>S&8mcldXMCGoFYj^Y>{qLXRTc_@M(6aPq zo^J2#()bsTVqAMGT^OUjo%WHhvDW{_$n+)ONiBdy(xX27eE-cUHy>U~u&ZYJq?z=) z>nQ8DKEHGhua(U)9xvYgc)9mv*|Fa%>RKGy))X2RyLmp|sgY1CA$~@^FZRjiy17q} z%4iy#e!Xn(f!UGE602DbzWm}Lb!p=LIkAdnZ`U^Jdd)tqzf0%Eu9@}!CR%Tls^2s_ z<yfQghqGNd_a=SJI=_2L-MX%Q|5vI<3N-IH_s4v;;HuvBFQ2j}7RVoZQJr+6^v;15 z>09SoY&mc))lDq5wcYN>k=&J!-<w=}FL3@yzd_fm=zrPKe@gmz{+brH%sU(t6f7^$ zXJg-Kmv4L9!tTa9@z$(uayKJC-SZO+d+qwz&GhMtjr$%<4BE0#>zBITtPk-VdQWX` z390o|l;}*AV0)91Hg*1@HU4rjtgHNt({|-f2)guLB2Q-h{cV1hawe-*`CcwN;B{Q^ zAA_aBQlCv_*_G<~9FB#0UjiQ&g#Fax`^A`cf6AXf!l!C_y0as1uuI$$lAazMmfVu5 zW5cd~$n1yd`seNc{v|)YnAW~B#lL6bY^R+k8GWrbF_(GGpZ9td^INuwHYbBkD@qJ+ zC$fYxSFE}xF#YTYyBYt|KmJ)Cv~yzM-RCm4(f8H!9<?r;m2hCs{0Xzd1hVU+COnGk zwYpPfqAo7;Tc!MDx-55cj^i=s*W%|cILGa{=Xd+el8KT>7regy@Zdb{59`lKSxKGp zes%SxL9;@>c2Vo`B;UuY=iErH|H9#~>@nS@Ig77KmCf~FS#J9Eibq8+?58_=${%f? z<?w%b$EMzf_Fbz2DtGX%`+ZkgHtuBxPiN-7jhi;_*s*B-6Zx(0kLs_uQT!y`uQcxL zjcp%T{gm<+Z7i`cydT2B!SPKpeU`A~Ob5Pbr-D_FzZyhGpUPa=Hs^$mbLK7Q?i+gR z)v9#2sBAQo=|34gtwD(6b)@psxuySt?yTM#V||cQwd_0B-pz8VZ7ao$b{9@yzEb|^ zjNz(S(IX4RoBzCU+_Yx7gVfoUsQqdmc|_Djx8z^YTi4of=I@iD>qkvh_e3PKYR&tl z^Xt!h{W$YrhnX2hMSc5aR;zrhaoDVUo+UIc=F*vGF_Ck7%uJ5(-L?9Bv1)$C?9H1q zI$!SCp0mhU?@-@wjdweDRbEbrm~&r#1M}05%~@|!A3aW#F*?J$*gB<BJE_aZOee&0 z@-chIPO&bh^R|hvI4aBh-YvX!{mblt)HL>qd3hge<s<DsDz5UC&Uvze&rSWv<EFp7 zUyd}*oag)8<>k8h;VK1eJN_Nt94H&TKX^-<-ifdO)vRVc42v&F^q9Bv_NiRs?=^b^ z=LdeBefvzfx|i*XcI^;}J71Tu&E@>qD|art=U~c0`{IK}8&9=W1x#D6QLlIG)F$8e z{}%`?JG;)y{d2MOZmU$bkBdEJKWXuWcO-QB^eu1c-(xkKEBwe!*LmmGEw;<H_`3FD z5C5K8IbQ4IPYM(mfAcAv@BhD0#z@`6b5fB6&(B0Zjs+JkCtA(3y0&V4`jnM6t<`#u z7_xmfofbROvdiP#yOLVh=T_eYGh~mfUVC-MZtopVQhQp`U1pnf&MB4QOwsII`$O5p zrF=Di!gGs@D^{#~x>>x_`QMB4ff?(s%k8~=abB<PuRBUhl8o17PO%hAF?-g3a#imM zeWrAN#Ybo6%xIs}_8^9RQn`ZQs+i;FY~Gv}Wx4oVGvr)rfOC-`V>i3d4euMbR?T|c zvglgxdG$S0wL<s5(iDE2_H8xa@9f{H$r;C<p8F9Sf4#=6Aww|auBU17>JaYP)4oM> zykB|$<ahDrm>8Eean}Q5r+<6!>Z)ns4w)}k<HNQF1kS#a%)Mi8clF28iaN)vT$Y6= zRyNPktNgNGLGICM<r^h?>piDxbl;x(=X&#%zkSQ@y|D}A|LL$cU*L!A>9QXy-c5O- zaP-qhhea>Vx5wo!jG5hWMPt!~`L6Htmh`Rqafko)lBCQN7KZPACa<|1wWIIbrR~wV zAL2L7Drk`SyQ3q2dD%KUS??vsy<C{DEj$=A<9+;%t4YFtdzS5gr?+`hn3BI}aRIx9 z&goT8zU*}>{cdy7;@f=@&sFtx5g9K`a)YM{Y`FO1*u$xtUm7#}nCvU7nbYCto=~m7 zYRlV$tk3yRU36aQ9eL)80~hDBC3%bWADbpJ%~I<)FMjVqrA6NAzX>+)_aEBMbLQiN z?+35VsH^{DV(tIRRmm^7JHq7JEd9&#Q}|cK_RPvOlQQ^!OXQk|X3kNm*G&!|OyqkO z-}^k{cB=SYrrjwYkNlDRAG)BUVUAao!=k;J$IczJ-f(Nb&Z~1xH6r)Q?{>Bv__KQl z$L?2#d%mo`bHVd&3;WGUKa?kGmH*0L7+zJxRjvEX|KC&BJ(C1POa(uCFqAjj<-C2Z z{M*=DqVyz3hjL5yDdx#Z-wbrz&Fxkz6)UZoCedE-^||NoA6It<K7T$%iF^L-3oo;q z#E;o*-~A(Xs}%p%Yo=|>*IbYg4W4v=effe#@;5FqDqjEjNl0|Allk$Z*ADHx^6yLc zz6qC}G|MDqILo}row)9;sYCnMhwFvfpY<jm?)=kIcJ%-|%k0gu1(y{&8*(qPYWtZ4 zL@OFu*xjqrvg_0E*y}xI+J0S;ro11y{Ms3_<C5#E9<+<izM9}PM}1lAjQ?uV?%}06 zE0>E{ZhI#$->4*;fBE_wHp5qUmMZlvON?}_WxON4M0@oCE3OnL^FK`@`VzXg!gl|g zvBrtp_9Tzt$=aJMR5NaNc`MFK4xaQ_Kl2;w-|EjMZf9)I>FLbb&LLd5VcXu&nEdyz z{d>>;y&Lx9wPm2nZvXFMtxHa~O7LBp|3s+p`tf6xEt58JxACkE>t0&LzC@a_jiFuB zIOF)*o+Sp`=I4L=cxdAZAFkZs2JfDCnc1!9k2*~L%W&kCLB_;Kao#m=4blyiGku@G zSn+iASMRHpl5uZlL@-@y;{Q~#Rod^_9oyIWr^TPw+AA+w=@Iu|R3`iV)pHjO_pT3R za{H+uJb$jJ^8T+XPODW7V(#=W)c>=@VTHHOv_8HMD_*I675mq{@a@$FWnVkP`kAkI zTfW)8dH)B~Dpmd8FPIKYv^2iOZQhjG$tk_bRwg@#<y~R6)2{hmlO9)EU*RY}vZ_LM z$%FvT&9jgC?mv`%YyB!YH~uw^A)LC~yv*9m|D0Btd-XGqfci)EWCNeY1^FCVzH9kE zNHE{AeZ|g`UCA=-&Lj5KikX5<aj#y+rZz29Yuc}3e)C#hxc+&AJ%-C%w|@~kySTEz zuwoX=v1Fx^zt#3@-vxAD=y>QU_GiP#yC>r;mdSdZ-S(v8`SQ)CtUX*$u18+AOrI`s z#oM{cwrWPt+kK9@|9%Pb`gwd$h>_F0UnSb{`4QWcAKd@H)lXY9z0}71PicTe&DK1R z{Klx7MFOUrf~(ekd1jpGDE!;!>dGDW{wX^?yJ2%8jQNSX!Gy$X0ZgB+JXm~Y)03ZZ z+ut5t{HJ^Es}nD$sc*`9>%GnHV8`N$2SOR?E3K714j%H>-Ep$+LHg&U>{)`sS2jxC zw97mH?cR4O<qn0fOS2kdl_j~}2^yvguuTYfE;(D~W==>;xr*Md^HQQWT6eenywhUj z&SuN<_qc&4=ftkRhB_VWmFj;dyq?2i(~`_1y;N@IG?ReX*Z-6s#wG6KlJ%dO^v3xd zL*3M)C#Qe0^U<84c<C^I_s@H0yI&rEcRjvvv5X~$>+VUN0av!!zp9rJJ9KqtQa}4& z`M6hJv1OB=W=+YB=l%3P$iDsefd|&6&2d|7e^uW2ssHA7S*-o$OPx|VtE|~dT)*AS z@LPOL#q8`2$=TVv>t0!fBzM<)?OyY5TTyj)L`U_SZx@&+eeYd%oo$Keg~@hi+oJNT z?WHz3KbBYiWsq^`OW^T)HyB?gIqO}IZGW}7sy@a;*TeZ&a9!>!rfq?VTMK8)Wn8^; zkHK*(=W>>SuE*vti;aIBJoW3D!CT&fr0a4|tB&%rbTF40PLZqHsQt?4R=8#4g$i%8 zLsFZxZr<m+eqhxz>(fiJvXrbp9sRDEch0aPKr`ZEDeIJ15i=#4Q-h!VdVEf9$He2D z)073YH?2)KKK{<=@+bMeiBZalMsJO**PF6$T>aSJ!>Dx=&&!4Xe~au8S-MB7*87QP zSMv-b9j*M^!eTm`a`HcC9Gj8MHG9?d`ux`?g<K_D&;3?&`{NUMe*c*>Vrje;)*XgS z$4?e5wkVc%*}i$h)`&QUm-CpuEPNOBEuJ@lhq+LB+W&B-W!(YwSCsVh7KqRCv3Hqx z{PnbDW%I)ObrZh|K67NL@N*FJTBD)cApc<}Cr4|%yt8>GZ|~me#~x@0-F-Lb(u9;{ za}FCH_*Z$JBY4j38^yPedNc|rOL%^Gm@HIs_ScU79SLV9J+-XZ&n(@4%<$dy-x9YJ za#mXkC^?4w2w8ee^^4$wt1l#19T#DZsoDK3%TToF=y(2~zs~*7ms+406LaZI-tpIA zZ<cQKJrdBze_4O?&sFwrOaFH0EPvNGtHqv?_fv3s)uNv>H+-^jvwl+?zA!4IaOMru zb3)~EA8WsriBCVUKd|&z3F|BI<(WcCi=H-b<vS&K=j1K9$qP<=Rt`FRo-cHDuP4hs z=E;d4*q?pm$YH9D2x^%-#bw%Sjt3VQ(|$0&Fm8HSQ1!dCQA=fJ-r|pc?v(3YI1<Id z81`<SPU-p0dvf#l>Y2`5`RuaI_uVnRQR#*%hhNYBJzcc+(0pCzH=zynvX@VH`3AQ> z>{>nZ+9aNAyWKY}Px$Mc5Pf!A_G01Q-IjCr<jec~?lKQMXZ2dG-0Ez-IPW~+`SGhy zvrBcUF=pOhxl_lhDWRuwhGX*N3o|QurrnwPZm($Tx7k`;ymM}uNV&~Ay>@HT#1~z& zN|~MsyKG&?u|H;$SyWQb%?q^;rlx$J!>c{5+D&Jt-bY`H+d@Xu^<KR)$XRoSyTVYX zs=5BAAd~Q~N56^%XV-a#ukSZqJ#)&#`(9qz^-J5*`Q8~Oguf|v>3_o>|LIh6gyI^< z&EGXvhs{jk4qhUrxp>1}yF>$SgFZW7-yhxK8db}dn$La2^G9p7?uy0c|839Te0^`L z%-b^oZ2GMp-=_c4cD?6Yxb_Y|+d=<ji;mnE{MN@4@u~OHrN5k6d~p*G+x&A{6T{rA zQm;~O);RB#OmTKPd+7J5R~9bf3sm#(S2OKeB3p4@WtReH+jE<%yLhAdg{RwdUfA&7 zfU)PxB<^(uSG*@?dx<W1>i#HnmDRS-cK>oGbmgdeZS}BPaDI_wx)w){^5lS7bN*Q* zH5gg`t@&>uIq^r~%GBi?Z$B^ir`i{AtCIDn^==*swPhE(IP0g!?Ec4X&Dp)S-ASNT z%0}?8*Fl;6Zg1DIPK(qr-_Bv8`&HtZ{K<yr&mPP=c*615(RSavi5G24&cA9(xcf|* zbH?=zGfZ~Y7s+|Zt^dl*u++kX{bSK?xt86E#@qdt31`fYzp;h=U5EPC{OL*;ZL^+d z1>{VPKhq`Md?|Rcyy%|~Z+8Uky(OvNmRisIa<Q6Ay^v<Z;)&HawnrvyamuProDk?e zZK2ZLtLkj5Olu@}Th2TpE?IeVQp}Q`hmPH8O&%$pKMY>aH|*PXl>HBH#HYExPtExK z!t$?6{+bXjkB`9$QkI_bBKJK+K5dBfkq-FI_tfQC%>K99y}{hVa=Nchv2=d3NOe1S zJ#gC{5e}anKJwM_e)CdiP2M81tz}cX_sL5O<g`5k=i90`22XU{akL@iaBTaQ(0z3t zD~@}W*gMPCH8ebyGML32DRQ8CpX4-aPREDK<lFgPygtaraiBL`afiOj{fg!%Q40?_ zPVGusd|iFZ43<gh&c|&Rlr`K}J+)YO=iFHV>zX8zWt(p)o!GZCV#D9?GuLmKSnp`K z{K?pGy7CQio92v}mDXi<Eq8h8*eX2}zHYDh>o3C*j^kOCCuMAp-Q9nFQeM{+nceGk zzBictk61gcTr~83<+F<$E$p4|e_-YFmEY4eo%yfZHCu@({ps#P`_A`QOg^ySJ=dDZ zKYF=eyC*K1IpIy;-eVy(C*xWlpDX$J^JZ<3s*UFM{B33BmW@YSj?A6)XVIO95{b>9 zW$qart5@E6L~F^eB=2Xlx?ZYXVbEKZ780SWCwAau<%%oPrt-Rbqp$5`Vymu~*l1$D zr{hMs)^n>Xo3&;Id{n=uweMccrj)~lRg$g}^0T_V{uutNDa_N)|NlNRb(h=KI}_`i zW+&Dz5xB>AsaW(>|7GLL58E}xyL)u^DLpay*3jQt<8~{|wl0=oiud}vnOmJJdCpFI z&lIO2msz`H=FXg{X)Di7T=@3%qE%7ct4@^J=-$6^bkh3WQl=?iYmDB8ZJfw*L#1q~ zb8F$D_^!Q^dDiz$n)Z~_y8X|royl60<=*6|H*a*B{C>HVzC*=|Et)s(Z|pFcyXxls ziHUu4&79_ETD`9ol6xRi8G2iwg43F3(z4pl#z;>upEJFypSvx)FjFdS;qEp!*Id_a z^Ntlc>is;BrS8-t<bS?~EqdFA%NLov{RGusM@~IbvN(8=#n}oiUaz}3f~oH;jh~g+ z=k<AZ1hY#8KbRu1uR=BXtIEF{7bTbMYL@%5n``gx)L6CV*3dJiHd62Y7G4Tp`mfgR zywU`btPRUq^fcZs`R;X5`ua`ji;ZDXiMhHJ98;J7>x^055Yb?HR`&0PJ>B<GmHu!` z#&z7@R3F=t6?;`Xg?-gud9~c~^>3?OD_*`xUX)m9E;HX}mhwK$xjkMhFIgO#us@{o z#P+HCB5F6yYK=BsyRCl9sv``KBKF;Htw?z_*){*u7cTu%r_7V~tn`+evheGPp5IQ| zOXpcj%O(FakNg?0U+*uNc0XW8=ffqxr+KHxox59P(mL^ynEK<#Z+A~^ynJ_3N0C^8 z;0N`*wx0d&A+Mah!qv95hfcPsU^^!GaoWDf|9^|_?SAC7g)4_qYHFxDi_>HIZ_i8j z|Cssb)`Z_X_6uKf_^8!?G^(l6yZhpViw`*s#V>u<@|mrZl`wOz;rD|U%+Yg%&5tij zjPA&sbZc_&y5rYtHZ#jF{=DJTn~5fic@1o0bcMT)lrJ(nkfdq+HhIg-In}FouRpbe z`Cr{0)^poBxle9se&Qt5{5o`9cE#^4=E0g<E6+yd_u6N!Db_FwIF$M@bISeO;?57# z7hQ|uz8o}z(Npri;?c0}`Jek0IOk}7{UTWX{`u_8H#%b7D;M^4o?PYcJ%cUCyry=G zj>MVD?*XE&UE0R&uV?M&`)aT*fqf-^f>yxQrzg$rEW3ls|E+mpnUk=6x8VHavsSHD z{ij#N-XEgwG9hl=v;G3!m0D9T`yMQq<apBm{`;nHaplgv#=8@wHU+#}@aI&y`iV)M z$7Oh?yWD&EQgT(uL30_;cgaegx^Xc~S8nPa+53OuDcu*BlXHUS6o>9_@z1`}uDIf> z%p&#Z?dJ;EHhuZJ_T6+Z!FM|AYhuH!%~$U@{()IkGsj$NR>NP3o~ko>jXU&~OlajT zlb?9vlkwRK&(P*xOKp3F<%REWnA=uOwX#X>(2=<&yEs{qGh4G$?HJ$b+lQM>Yg29~ z3X5If7Tf1}bVpT>_@0a0so%4{tDY-qxa=JK{dL0QYWDf-9_@HgurWHU>!g3$X6dA} z^;7&d-K+QfI(yFJtwv_6(r4||*u*E}X>*D5mzt+m(CUvDs;0lrnyg=MTockhHR68% z1ZH)|V_!H;87IxFu5{a;zh%B)8b|6Wfvw^CT6+b1_j;cay2_$lnD%wM=gT#J&#w|R zovJ_irFQK>*26y=rIeP=n3i}hcbUIC-)B$7BjPDLBSZGK2&~^YDXjGN^`%FT%FWqa zzT0-M(ayhZug-)TJI!&F>k~}1KP>igP8>sT^Mplj^;V{tn#w#cletvde$L{UiE`*V z*^c*{0#3a2kN9sN@8?sMWx%a7<+$vctNlR+`nR@r2F`LlU~(kS@~E|}Zv&rmdUSB? z?4w(IbAEQNbn;y?|CjL$mU(@P^AdD&@`_!{H^ens9AtPS`*ADd`xlF}Uka>@SX1L< zv1o6y?#)@+HqGvyeaW9UpRD@*tNH!fMRPvSJ9f+Y_#uTyL4I#%CTISVy>50x(_!bL zvu!zHQ6E&6xanPU`^mR`>I|c`zTp~W%#v-V%zIy~;4Z%<Ft_AI5W}RV<mBVpZmx}G zpVHa=nPffI`z7Dm9+Q78W2L3Bis(0)6-%dT81!7w-L-3SoAI|o$;tX5)!)_~v1Zs& z|CMi{tZvNb_2Dh7Qfy+Y7i{0Pz2iF1AJJppZtG@ls?iYNu`lymP4?cZ^)CG>N}c~V zKU<OX$L<r8yG+C<rKpU6e}7vYicfNVHeD;e>UhP0wc+7`FT{^@PkhFbcxL4W5r6Hq zH6h|rJkN@9lbpZ2`7ozn_}EHECi_)QUJq;U?VLW-fw8bIJV|27RmPb8bK_e*SGCy~ ze7HO{-}hr>#O|cex+Y0Ivmd>=KKCQrrI~M!zq!Z7zewxF)UK+d`euGkKmDp3Ry_NV z{z-Q|d&fa(hk2%q(GUBk*nMGoA!Iv^-FW`SgGTF>-c}y^%Av3S%}JZfO?$(OjvL|2 z{$Ac!{)}DFr#a~OTFEJIS$+$s9Tw@FJGIUDpK@ix=DLf$-~ZW1-Zq?_kn`cI<&-9Y zyGFD1a*~8Ts5P!!-<{oiXzQ9*&Aykr&v5kCZ0BZvd+LF<#L9yz_ut%^eAKptsk`Fz znNzi&W*uDgTgOwOc5mt~lkzXjVFrz#&N(oMMa}EhDtG#vRdl_ouWwy;Xi2^Ijpxi~ zC$!vIzWdlr2UW%o`j;|9Q?Dva>D!~cSpHl7?%I1*M^#0QCO+{~VE>)9qTxVF>xbTn zLNgakneLk2@^OVoTXURQ$#?aJ+MP<v+*Y-{kDA+i!S4R@XqB_PoyPlvDy(HEJl$Pc zFPHhKZLaH^Rd#G|_D1czUh-$orJKR23bT|v=4l6=Np9D_5<BCFW_zT<pWgoMCL0=$ z{wZ!^UaTuH`%{N@q?~DXN{(<x&5<)7YtF7Xa6aa>(cCoMryZLt_gs9UE~ozE^4_mM z*EgK|_Cv(p)zc#J-khGfhvL2jytUftTi5DSSgOhsuHq1#zAy2fpTgAzRe=n=abDf6 z3{e+lv-Rig{A{r03iram>;tp!Y|}E~R0(st{qnSCn%N4gKU14-FPn8NEK$qE`~Pmq zs=HcOZoX;vj`r`pcX;)Zc-3=tyJ~N)nArOubk4Tq*E7AjJJ?k|xqPkPW|5`@x<CVZ zyG3eV3iv7wOQfqb97{_w@{2Sy^+PgCa#A%k^@B^3vQm>vG&J>{i&7Iy@{2Tl5<^lW z6v{J8G88f@3sQ@UQqvR)5|gtN(^EC|1B&ufN|RHIGzwDELQ*4i4fRY6^bCzP^}SOo z%kzs;iZwL3ASPwz=eZ=7q$+5*SQ!}@ni!ZG85)`yTbNjC8yKk@7^rJ<>HFrV5K<CS zlvq%ZnxdfZmY7qV%B3F=;u@jnR+^KOl$e*7TBM*6l95@gkXft%agUBdSZYymW`3T6 zv7Vucp{b>jnXZwZ3Cx)a8X&LvWR|5W7#SEE>AR#RWhUlnDr6TVmShyCCMuLcb(`rK z>KSNq+1V*T1JMX63_~glQWf<5ld^(Ka=G;V6wC~`^xZOxic1tsOf0ydx0NUu8Cx2G z?jTW60LkLNh2(8ybiS~+P~G?SFWfh+-tm6=#0wLJoET)8G)^9hRNy}*Df8ZHUPAx* z#=l>Ghkie^<9J`QqsQ+}la}9^{%X~$^{aMOSE&e}G18rx9K;o7kg4MA=y`NW+Nq2! z2BJKZ<#MK-JW!%>;e3w}^U@g~`!r9l`QT&uY)Q%~<MzTRgY}DZ-WztX8dQtPWG1ne zWE|$oX0zI`h~om|UbasQ;-wCIY`&Dx=JzyFqAu#7%9iZsGX+z$&p7OFU3tv-Ws7XW ziV`&g<~sgv9UdXR%^_dpXDp3mJ-R0GR`6X%kuMQE7nvM5I!dNlZs2&!-qvO@OJTE| zTY}d$=lyQ=jteq)7FwmP6-i?i*b?p|ekRh1<*(U<pl5UR*b)l+KDdZ8GA{_^)iH2? zbRaZgi}4xm8GJ|O(vmq2d<l3s(|m>%&-Y`U2Ol5ri8uJSX4e`C`^5ffPj}1<`@Em` zDdX?A+Yc`8pP?-GKaiu)d5Kby_Y##&3ZDYA?wj^^+$l}*O7Tl6+7Lba*0pboq$A3^ z7JbTA(pGxBuKd>5bMhA!ZQmMG#(e#n+s4!EPj=*5>hE5;-fH)8*$nws!7uf<Ud|}x zuv>B>U%TqEW>m@2t=6x$Cd&y(*X_;k<ms$=9c_Bs=rQx9=ncik{Fi?fz4`IS$A<X2 z-P)4%#<Qj{|64Na`qMpeMxg?a8|F_xowZeBy7#G%H;TgI{N0aV4gco2;GiOF&BAqT z0vir^c*!PZr=)BB|M9#!iluGJc8`8Vq2ztD&aNxl^y<W`Ir3gQhSeXdtf%Dp$1QH# zQu5|-c8vtr=J_$nR|Aq`Z?=b9n@)*ftKPG`fKhq>+)GVMr0NroHeLt`D^&DOl@(vR zOea%uv60J1^X{ygz-w=qYpRP*{Yd?}HEr&+>bZGWmR;`sVYxh6`Ns8^wb!mqEYfJc z*L}TeBkv=<xaRsCwQ7bs`whEgK5lN<t$X0CKU3a!<{I0Z@BKeK^sL=bQuO2hXYF~b z53;}iYw#fcbdtyNDSzjiC|wMgvG8ReSLMxZJDOJTTv>GV!bX878xrnCP1$>CL92l? zYuDr{We+w>WCl)mwz_*l(JxEspP+ZatTy%}pQjC~ywCMzSNO;r<f&a8aY|tJWYLLL z3)>pkKEE?%k!|PVTurHkVM&=8r@5+`gC^uGzPNJhLFH{$4`){;9uC<4*edRo`MhVj zIZKWue|x>JMQG}W1J=hbFSN8hd8#dGl~A<aCpY&Jk)6WFU)+#133>j;G1z;N$(Dz0 zii+93OC=<9-B}C*AHDeM`YvSIzFPUICqG1s2(v2qa`#<~6X=OMdhJD_xRT2>nU{;V zcluiw37`8WB44=0d4>2T)4#saGPgbaA6{!on&MwGts!)7m3OydXPo~Q&83ZDPXvyb zCHsg6ue`Hk>Ejoc-fJIb#3cT{)2X~O^7xw!nMq%laV{xZ)GL~F+wP@Rzzfgd`)n4D zqKs-9x0g#_Z=BU|=HZ!4|2i|Xg|jYC*raJ`w6HyVzFE$tnr$2J&PkV^6Mc>2dP`+@ zN?W?$=LzSJr?1Gnz39_}vx2uOx_10iF)5l;JWJrlvXj=5@2ppdM2g)>XW1#JKBMDv zpNg+o-g&d-miH{rDt)&*IosxT$lA}`HCw_tqf|39*}t;>l+(X%rjXV!qyKrqo`a9i z?n>q`5R};AFgrwtJyzg_$RWq0ya!$EqSh=uB3+}U_NuABdd{nFoLldy`)qt?+-Kyr zl%wbWq@sw+2m5bsv0OQAccyN~vT07g+mg@D{?)6ibZO(AqS#b-Ypck)Q%-+OstOP9 zF1b`?y36(a(Vv%}=imSP_vy{bQtMgXg%vSp*BvyF_APkeJ?HqxHRTyi$?dB)l*l&C z6?+~w=V#xvWUJ3R7ah1*Sn_?(9KXC-TAEAtIY&BN=&mxE-PiwYa^%S)4e?i=zKz~B zLGpwBEXNL!6FVezU-*3Q*#A(x=7{}AL;asE_djUP{}^reTy+2A@~25rv7cGvKZ(Yl zU4Qy$QH-wFzqbmJHCC-+*`JGFd~dL*`}Xbc?Ztc?Uj+o_HE?t&y;c^mV^*3WClGR% zog?rK%cCj#ALuh4SA8Jy`E~UJ1({cJLbfu0`X79F_2<Xc$=4$t=1iY_HD}8WMpnO9 z9i0`aZUHNJxF#|yUNh*BmDnM}q+86<_ruWsp+DnM<9{**fA}2E{m}j=wPB93pWe^t ze|`Je9TvaN+^I4BvZ~T^;W)ihQZss2N1C$l-7D+*$L{m_;06m#@fnZ4F26a+U+n1$ zJ@ErypWVLeYstRn|D*r!6xLa-yt-$}kHzM5BY*DnTgrO#4%<`lf2pBYRgbu}ZJSh) zq`PhM`DvRkeqx)qI$tdH<m>%fpAwgAb-%X%8UIK7|FQp<KWBe*{#g6z$(xoxRbgjW zzu$G$t89hpUEWJ;*Op|jzg4&FcHA=UrFD09KDm*8apC&SOZ@G;?|FTkXZ<8m{K<`V z`??oTzHMPQxBubipDe|*>;CbypLxmpqq&6NV*1L49Z7C?vZXie>O7!!NGf{q+%qDE zn>1LG3=$4|aU`hbHw!<H@M2k`S*e#W{oLh7)~QBJ)nclweu95&;|z*Kt~t(FaF6%X z^t{ZM6Oy?uzuDBI`S{w+gHu9ZGq{~ivn<;xf9RHJW%X9sn;groF1HF>DHvE{6E*GQ zt%T=p*StA)P3aGpSbq8Frey*t$9R974h){iWpv+n{p;DPcVD|-yB09V;QjgS?Q3pr zU7ZslYPR;1(sr+3TSK3TM|?dXb>I9<r|;nuK5>~nW<LM9c9iJ_NtdnEHUGx2ICaIw z(<1+q50vO1SaD5B&0J@5(ru$%Q=%`ez0;L<jqT6(mtQyS-jKUa@bceVZu|DcUETb0 z&M~*>2x0RS&uBlVRP(&3WYdtBSB~^gc(L+I%<Gl=N;@OBoiX|{Lz*{V?CJb3j#<5& zwd<m!7gbG@$(x~6tA6**w0jXhyY&9Q+Z_1Huj_`UYKoIob+uDhSle!Y7pZ02+Dju& z-7{ET?Bc}N@q#fas&GsD;rIQ1t3Ez-wT-&M{^jrFIsaeq2|C3;-E!j9tA>5W>t6qA z*q3~)>Yu8AzDeQ?|BXlD{qmQ8Z96sRW7g#@f3jyyk#0K6SUdIY_Q)-*y=LVO_fvo8 z{%hEG@!Rb~jJ50UZZO%dkp9-k_vGVAis#;$Ue2-jBvW%PH~r;g!E-iOQzl&6x|i{N z(T3uRL#KY4NvS=JERFqCuXDO|*S>w)&)owpYrp4({1x}$TE&3b6gD@&XvReZrKWM| zd*-F2RwzUpD3}|@a_I+WR;4PK8*=G~D?}SA7%PCpg7WiA6wE9X3>1Pu%G2@{%s}mG z5XVI!+Q!Mz(%IO|+{Mh;+0xm?(b&Mv$<@T%($vt%z{JVP$<$7Pu##AK+tJY65Ylv1 zAl!D8y>Ohf$x*=J;mrGUiqBa-Uz5N*O_Af?8lR6E5sgbD8p6N6efoGK&*2S9O7Y%D zgs$FpUtyr*c(92>=Kxz-#~~S+2Q4ON4zT8(I3Qy4pjF4`0DB#WgOjV%vmS+(1?;sQ zj^b?w4Hi8L?4F|E@9B6r3VzahxVci>LE7s=qfy8LF4L(uZu49Z)yoX#oqGLZNbuJJ zqpMAZYZ7>+ZyfUbTJ`_`%g37bo39H_!i<jMlEk8tilWpsE<;0O0}B%_RaIAiH!cAE CwC<b$ diff --git a/homer_mapping/src/CMakeLists.txt b/homer_mapping/src/CMakeLists.txt deleted file mode 100644 index e5e17710..00000000 --- a/homer_mapping/src/CMakeLists.txt +++ /dev/null @@ -1,2 +0,0 @@ -add_subdirectory(Workers) -add_subdirectory(Modules) diff --git a/homer_mapping/src/OccupancyMap/OccupancyMap.cpp b/homer_mapping/src/OccupancyMap/OccupancyMap.cpp deleted file mode 100644 index 5ab3b94a..00000000 --- a/homer_mapping/src/OccupancyMap/OccupancyMap.cpp +++ /dev/null @@ -1,977 +0,0 @@ -#include <homer_mapping/OccupancyMap/OccupancyMap.h> - -#include <homer_nav_libs/Math/Math.h> - -#include <cmath> -#include <vector> -#include <fstream> -#include <sstream> -#include <QImage> - -#include <Eigen/Geometry> - -#include <ros/ros.h> -#include <tf/transform_listener.h> - -#include <homer_mapnav_msgs/ModifyMap.h> -#include <homer_nav_libs/tools.h> - -//uncomment this to get extended information on the tracer -//#define TRACER_OUTPUT - -using namespace std; - -const float UNKNOWN_LIKELIHOOD = 0.3; - -// Flags of current changes // -const char NO_CHANGE = 0; -const char OCCUPIED = 1; -const char FREE = 2; -//the safety border around occupied pixels which is left unchanged -const char SAFETY_BORDER = 3; -/////////////////////////////// - -//assumed laser measure count for loaded maps -const int LOADED_MEASURECOUNT = 10; - - -OccupancyMap::OccupancyMap() -{ - initMembers(); -} - -OccupancyMap::OccupancyMap(float *&occupancyProbability, geometry_msgs::Pose origin, float resolution, int pixelSize, Box2D<int> exploredRegion) -{ - initMembers(); - - - m_Origin = origin; - m_Resolution = resolution; - m_PixelSize = pixelSize; - m_ByteSize = pixelSize * pixelSize; - m_ExploredRegion = exploredRegion; - m_ChangedRegion = exploredRegion; - - if ( m_OccupancyProbability ) - { - delete[] m_OccupancyProbability; - } - m_OccupancyProbability = occupancyProbability; - for(unsigned i = 0; i < m_ByteSize; i++) - { - if(m_OccupancyProbability[i] != 0.5) - { - m_MeasurementCount[i] = LOADED_MEASURECOUNT; - m_OccupancyCount[i] = m_OccupancyProbability[i] * (float)LOADED_MEASURECOUNT; - } - } -} - - -OccupancyMap::OccupancyMap ( const OccupancyMap& occupancyMap ) -{ - m_OccupancyProbability = 0; - m_MeasurementCount = 0; - m_OccupancyCount = 0; - m_CurrentChanges = 0; - m_InaccessibleCount = 0; - m_HighSensitive = 0; - m_LaserMaxRange = 0; - m_LaserMinRange = 0; - - *this = occupancyMap; -} - -OccupancyMap::~OccupancyMap() -{ - cleanUp(); -} - -void OccupancyMap::initMembers() -{ - float mapSize; - ros::param::get("/homer_mapping/size", mapSize); - ros::param::get("/homer_mapping/resolution", m_Resolution); - ros::param::param("/homer_mapping/max_laser", m_LaserMaxRange, (float) 8.0); - - //add one safety pixel - m_PixelSize = mapSize / m_Resolution + 1; - m_ByteSize = m_PixelSize * m_PixelSize; - - m_Origin.position.x = -m_PixelSize*m_Resolution/2; - m_Origin.position.y = -m_PixelSize*m_Resolution/2; - m_Origin.orientation.w = 1.0; - m_Origin.orientation.x = 0.0; - m_Origin.orientation.y = 0.0; - m_Origin.orientation.z = 0.0; - - ros::param::get("/homer_mapping/backside_checking", m_BacksideChecking); - ros::param::get("/homer_mapping/obstacle_borders", m_ObstacleBorders); - ros::param::get("/homer_mapping/measure_sampling_step", m_MeasureSamplingStep); - ros::param::get("/homer_mapping/laser_scanner/free_reading_distance", m_FreeReadingDistance); - - m_OccupancyProbability = new float[m_ByteSize]; - m_MeasurementCount = new unsigned short[m_ByteSize]; - m_OccupancyCount = new unsigned short[m_ByteSize]; - m_CurrentChanges = new unsigned char[m_ByteSize]; - m_InaccessibleCount = new unsigned char[m_ByteSize]; - m_HighSensitive = new unsigned short[m_ByteSize]; - for ( unsigned i=0; i<m_ByteSize; i++ ) - { - m_OccupancyProbability[i]=UNKNOWN_LIKELIHOOD; - m_OccupancyCount[i]=0; - m_MeasurementCount[i]=0; - m_CurrentChanges[i]=NO_CHANGE; - m_InaccessibleCount[i]=0; - m_HighSensitive[i] = 0; - } - - m_ExploredRegion=Box2D<int> ( m_PixelSize/2.1, m_PixelSize/2.1, m_PixelSize/1.9, m_PixelSize/1.9 ); - maximizeChangedRegion(); - - try - { - bool got_transform = m_tfListener.waitForTransform("/base_link","/laser", ros::Time(0), ros::Duration(1)); - while(!got_transform); - { - ROS_ERROR_STREAM("need transformation from base_link to laser!"); - got_transform = m_tfListener.waitForTransform("/base_link","/laser", ros::Time(0), ros::Duration(1)); - } - - m_tfListener.lookupTransform("/base_link", "/laser", ros::Time(0), m_laserTransform); - } - catch (tf::TransformException ex) { - ROS_ERROR_STREAM(ex.what()); - } - -} - - -OccupancyMap& OccupancyMap::operator= ( const OccupancyMap & occupancyMap ) -{ - // free allocated memory - cleanUp(); - - m_Resolution = occupancyMap.m_Resolution; - m_ExploredRegion = occupancyMap.m_ExploredRegion; - m_PixelSize = occupancyMap.m_PixelSize; - m_ByteSize = occupancyMap.m_ByteSize; - - ros::param::get("/homer_mapping/backside_checking", m_BacksideChecking); - - // re-allocate all arrays - m_OccupancyProbability = new float[m_ByteSize]; - m_MeasurementCount = new unsigned short[m_ByteSize]; - m_OccupancyCount = new unsigned short[m_ByteSize]; - m_CurrentChanges = new unsigned char[m_ByteSize]; - m_InaccessibleCount = new unsigned char[m_ByteSize]; - m_HighSensitive = new unsigned short[m_ByteSize]; - - // copy array data - memcpy ( m_OccupancyProbability, occupancyMap.m_OccupancyProbability, m_ByteSize * sizeof ( *m_OccupancyProbability ) ); - memcpy ( m_MeasurementCount, occupancyMap.m_MeasurementCount, m_ByteSize * sizeof ( *m_MeasurementCount ) ); - memcpy ( m_OccupancyCount, occupancyMap.m_OccupancyCount, m_ByteSize * sizeof ( *m_OccupancyCount ) ); - memcpy ( m_CurrentChanges, occupancyMap.m_CurrentChanges, m_ByteSize * sizeof ( *m_CurrentChanges ) ); - memcpy ( m_InaccessibleCount, occupancyMap.m_InaccessibleCount, m_ByteSize * sizeof ( *m_InaccessibleCount ) ); - memcpy ( m_HighSensitive, occupancyMap.m_HighSensitive, m_ByteSize * sizeof ( *m_HighSensitive) ); - - - return *this; -} - -int OccupancyMap::width() const -{ - return m_PixelSize; -} - -int OccupancyMap::height() const -{ - return m_PixelSize; -} - -float OccupancyMap::getOccupancyProbability ( Eigen::Vector2i p ) -{ - unsigned offset = m_PixelSize * p.y() + p.x(); - if ( offset > unsigned ( m_ByteSize ) ) - { - return UNKNOWN_LIKELIHOOD; - } - return m_OccupancyProbability[ offset ]; -} - -void OccupancyMap::resetHighSensitive() -{ - ROS_INFO_STREAM("High sensitive Areas reseted"); - m_reset_high = true; -} - -void OccupancyMap::computeOccupancyProbabilities() -{ - for ( int y = m_ChangedRegion.minY(); y <= m_ChangedRegion.maxY(); y++ ) - { - int yOffset = m_PixelSize * y; - for ( int x = m_ChangedRegion.minX(); x <= m_ChangedRegion.maxX(); x++ ) - { - int i = x + yOffset; - if ( m_MeasurementCount[i] > 0 ) - { - m_OccupancyProbability[i] = m_OccupancyCount[i] / static_cast<float> ( m_MeasurementCount[i] ); - if (m_HighSensitive[i] == 1) - { - if(m_reset_high == true) - { - m_OccupancyCount[i] = 0; - m_OccupancyProbability[i] = 0; - } - if(m_MeasurementCount[i] > 20 ) - { - m_MeasurementCount[i] = 10; - m_OccupancyCount[i] = 10 * m_OccupancyProbability[i]; - } - if(m_OccupancyProbability[i] > 0.3) - { - m_OccupancyProbability[i] = 1 ; - } - } - } - else - { - m_OccupancyProbability[i] = UNKNOWN_LIKELIHOOD; - } - } - } - if(m_reset_high == true) - { - m_reset_high = false; - } -} - -void OccupancyMap::insertLaserData ( sensor_msgs::LaserScan::ConstPtr laserData, tf::Transform transform) -{ - m_latestMapTransform = transform; - markRobotPositionFree(); - ros::Time stamp = laserData->header.stamp; - - //m_LaserMaxRange = laserData->range_max; - m_LaserMinRange = laserData->range_min; - - - m_LaserPos.x = m_laserTransform.getOrigin().getX(); - m_LaserPos.y = m_laserTransform.getOrigin().getY(); - - std::vector<RangeMeasurement> ranges; - ranges.reserve ( laserData->ranges.size() ); - - bool errorFound=false; - int lastValidIndex=-1; - float lastValidRange=m_FreeReadingDistance; - - RangeMeasurement rangeMeasurement; - rangeMeasurement.sensorPos = m_LaserPos; - - for ( unsigned int i = 0; i < laserData->ranges.size(); i++ ) - { - if ( ( laserData->ranges[i] >= m_LaserMinRange ) && ( laserData->ranges[i] <= m_LaserMaxRange ) ) - { - //if we're at the end of an errorneous segment, interpolate - //between last valid point and current point - if ( errorFound ) - { - //smaller of the two ranges belonging to end points - float range = Math::min ( lastValidRange, laserData->ranges[i] ); - range -= m_Resolution * 2; - - if ( range < m_FreeReadingDistance ) - { - range = m_FreeReadingDistance; - } - else - if ( range > m_LaserMaxRange ) - { - range = m_LaserMaxRange; - } - - //choose smaller range - for ( unsigned j=lastValidIndex+1; j<i; j++ ) - { - float alpha = laserData->angle_min + j * laserData->angle_increment; - geometry_msgs::Point point; - tf::Vector3 pin; - tf::Vector3 pout; - pin.setX( cos(alpha) * range); - pin.setY( sin(alpha) * range); - pin.setZ(0); - - pout = m_laserTransform * pin; - - point.x = pout.x(); - point.y = pout.y(); - - rangeMeasurement.endPos = point; - rangeMeasurement.free = true; - ranges.push_back ( rangeMeasurement ); - } - } - float alpha = laserData->angle_min + i * laserData->angle_increment; - geometry_msgs::Point point; - tf::Vector3 pin; - tf::Vector3 pout; - pin.setX( cos(alpha) * laserData->ranges[i]); - pin.setY( sin(alpha) * laserData->ranges[i]); - pin.setZ(0); - - pout = m_laserTransform * pin; - - point.x = pout.x(); - point.y = pout.y(); - - rangeMeasurement.endPos = point; - rangeMeasurement.free = false; - ranges.push_back ( rangeMeasurement ); - - errorFound=false; - lastValidIndex=i; - lastValidRange=laserData->ranges[i]; - } - else - { - errorFound=true; - } - } - -// if ( errorFound ) -// { -// for ( unsigned j=lastValidIndex+1; j<laserData->ranges.size(); j++ ) -// { -// rangeMeasurement.endPos = map_tools::laser_range_to_point(m_FreeReadingDistance, j, laserData->angle_min, laserData->angle_increment, m_tfListener, laserData->header.frame_id, "/base_link"); // - -// rangeMeasurement.free = true; -// ranges.push_back ( rangeMeasurement ); -// } -// } - - insertRanges ( ranges , laserData->header.stamp); -} - - -void OccupancyMap::insertRanges ( vector<RangeMeasurement> ranges, ros::Time stamp ) -{ - clearChanges(); - - Eigen::Vector2i lastEndPixel; - - //paint safety borders - if ( m_ObstacleBorders ) - { - for ( unsigned i=0; i<ranges.size(); i++ ) - { - geometry_msgs::Point endPosWorld = map_tools::transformPoint(ranges[i].endPos, m_latestMapTransform); - Eigen::Vector2i endPixel = map_tools::toMapCoords(endPosWorld, m_Origin, m_Resolution); - - for ( int y=endPixel.y()-1; y <= endPixel.y() +1; y++ ) - { - for ( int x=endPixel.x()-1; x <= endPixel.x() +1; x++ ) - { - unsigned offset=x+m_PixelSize*y; - if ( offset < unsigned ( m_ByteSize ) ) - { - m_CurrentChanges[ offset ] = SAFETY_BORDER; - } - } - } - } - } - //paint safety ranges - for ( unsigned i=0; i<ranges.size(); i++ ) - { - geometry_msgs::Point startPosWorld = map_tools::transformPoint(ranges[i].endPos, m_latestMapTransform); - Eigen::Vector2i startPixel = map_tools::toMapCoords(startPosWorld, m_Origin, m_Resolution); - geometry_msgs::Point endPos; - endPos.x = ranges[i].endPos.x * 4; - endPos.y = ranges[i].endPos.y * 4; - - geometry_msgs::Point endPosWorld = map_tools::transformPoint(endPos, m_latestMapTransform); - Eigen::Vector2i endPixel = map_tools::toMapCoords(endPosWorld, m_Origin, m_Resolution); - - - if(endPixel.x() < 0) endPixel.x() = 0; - if(endPixel.y() < 0) endPixel.y() = 0; - if(endPixel.x() >= m_PixelSize) endPixel.x() = m_PixelSize - 1; - if(endPixel.y() >= m_PixelSize) endPixel.y() = m_PixelSize - 1; - - drawLine ( m_CurrentChanges, startPixel, endPixel, SAFETY_BORDER ); - } - - //paint end pixels - for ( unsigned i=0; i<ranges.size(); i++ ) - { - if ( !ranges[i].free ) - { - geometry_msgs::Point endPosWorld = map_tools::transformPoint(ranges[i].endPos, m_latestMapTransform); - Eigen::Vector2i endPixel = map_tools::toMapCoords(endPosWorld, m_Origin, m_Resolution); - - if ( endPixel != lastEndPixel ) - { - unsigned offset = endPixel.x() + m_PixelSize * endPixel.y(); - if ( offset < m_ByteSize ) - { - m_CurrentChanges[ offset ] = ::OCCUPIED; - } - } - lastEndPixel=endPixel; - } - } - - //paint free ranges - geometry_msgs::Point sensorPosWorld = map_tools::transformPoint(ranges[0].sensorPos, m_latestMapTransform); - Eigen::Vector2i sensorPixel = map_tools::toMapCoords(sensorPosWorld, m_Origin, m_Resolution); - - for ( unsigned i=0; i<ranges.size(); i++ ) - { - geometry_msgs::Point endPosWorld = map_tools::transformPoint(ranges[i].endPos, m_latestMapTransform); - Eigen::Vector2i endPixel = map_tools::toMapCoords(endPosWorld, m_Origin, m_Resolution); - - m_ChangedRegion.enclose ( sensorPixel.x(), sensorPixel.y() ); - m_ChangedRegion.enclose ( endPixel.x(), endPixel.y() ); - - if ( endPixel != lastEndPixel ) - { - drawLine ( m_CurrentChanges, sensorPixel, endPixel, ::FREE ); - } - - lastEndPixel=endPixel; - } - - m_ChangedRegion.clip ( Box2D<int> ( 0,0,m_PixelSize-1,m_PixelSize-1 ) ); - m_ExploredRegion.enclose ( m_ChangedRegion ); - applyChanges(); - computeOccupancyProbabilities(); -} - -double OccupancyMap::contrastFromProbability ( int8_t prob ) -{ - // range from 0..126 (=127 values) and 128..255 (=128 values) - double diff = ( ( double ) prob - UNKNOWN ); - double contrast; - if ( prob <= UNKNOWN ) - { - contrast = ( diff / UNKNOWN ); // 0..1 - } - else - { - contrast = ( diff / ( UNKNOWN+1 ) ); // 0..1 - } - return ( contrast * contrast ); -} - -double OccupancyMap::evaluateByContrast() -{ - double contrastSum = 0.0; - unsigned int contrastCnt = 0; - - for ( int y = m_ExploredRegion.minY(); y <= m_ExploredRegion.maxY(); y++ ) - { - for ( int x = m_ExploredRegion.minX(); x <= m_ExploredRegion.maxX(); x++ ) - { - int i = x + y * m_PixelSize; - if ( m_MeasurementCount [i] > 1 ) - { - int prob = m_OccupancyProbability[i] * 100; - if ( prob != NOT_SEEN_YET ) // ignore not yet seen cells - { - contrastSum += contrastFromProbability ( prob ); - contrastCnt++; - } - } - } - } - if ( ( contrastCnt ) > 0 ) - { - return ( ( contrastSum / contrastCnt ) * 100 ); - } - return ( 0 ); -} - - - -vector<MeasurePoint> OccupancyMap::getMeasurePoints (sensor_msgs::LaserScanConstPtr laserData) -{ - vector<MeasurePoint> result; - result.reserve ( laserData->ranges.size() ); - - double minDist = m_MeasureSamplingStep; - - //m_LaserMaxRange = laserData->range_max; - m_LaserMinRange = laserData->range_min; - - Point2D lastHitPos; - Point2D lastUsedHitPos; - - //extract points for measuring - for ( unsigned int i=0; i < laserData->ranges.size(); i++ ) - { - if ( laserData->ranges[i] <= m_LaserMaxRange && laserData->ranges[i] >= m_LaserMinRange ) - { - float alpha = laserData->angle_min + i * laserData->angle_increment; - tf::Vector3 pin; - tf::Vector3 pout; - pin.setX( cos(alpha) * laserData->ranges[i]); - pin.setY( sin(alpha) * laserData->ranges[i]); - pin.setZ(0); - - pout = m_laserTransform * pin; - - Point2D hitPos(pout.x(), pout.y()); - - if ( hitPos.distance ( lastUsedHitPos ) >= minDist ) - { - MeasurePoint p; - //preserve borders of segments - if ( ( i!=0 ) && - ( lastUsedHitPos.distance ( lastHitPos ) > m_Resolution*0.5 ) && - ( hitPos.distance ( lastHitPos ) >= minDist*1.5 ) ) - { - p.hitPos = lastHitPos; - p.borderType = RightBorder; - result.push_back ( p ); - p.hitPos = hitPos; - p.borderType = LeftBorder; - result.push_back ( p ); - lastUsedHitPos = hitPos; - } - else - { - //save current point - p.hitPos = hitPos; - p.borderType = NoBorder; - result.push_back ( p ); - lastUsedHitPos = hitPos; - } - } - lastHitPos = hitPos; - } - } - - //the first and last one are border pixels - if ( result.size() > 0 ) - { - result[0].borderType = LeftBorder; - result[result.size()-1].borderType = RightBorder; - } - - //calculate front check points - for ( unsigned i=0; i < result.size(); i++ ) - { - CVec2 diff; - - switch ( result[i].borderType ) - { - case NoBorder: - diff = result[i-1].hitPos - result[i+1].hitPos; - break; - case LeftBorder: - diff = result[i].hitPos - result[i+1].hitPos; - break; - case RightBorder: - diff = result[i-1].hitPos - result[i].hitPos; - break; - } - - CVec2 normal = diff.rotate ( Math::Pi * 0.5 ); - normal.normalize(); - normal *= m_Resolution * sqrt ( 2.0 ) * 10.0; - - result[i].frontPos = result[i].hitPos + normal; - } - - return result; -} - - -float OccupancyMap::computeScore ( Pose robotPose, std::vector<MeasurePoint> measurePoints ) -{ - // This is a very simple implementation, using only the end point of the beam. - // For every beam the end cell is computed and tested if the cell is occupied. - unsigned lastOffset=0; - unsigned hitOffset=0; - unsigned frontOffset=0; - float fittingFactor = 0.0; - - float sinTheta = sin ( robotPose.theta() ); - float cosTheta = cos ( robotPose.theta() ); - - for ( unsigned int i = 0; i < measurePoints.size(); i++ ) - { - //fast variant: - float x = cosTheta * measurePoints[i].hitPos.x() - sinTheta * measurePoints[i].hitPos.y() + robotPose.x(); - float y = sinTheta * measurePoints[i].hitPos.x() + cosTheta * measurePoints[i].hitPos.y() + robotPose.y(); - geometry_msgs::Point hitPos; - hitPos.x = x; - hitPos.y = y; - - Eigen::Vector2i hitPixel = map_tools::toMapCoords(hitPos, m_Origin, m_Resolution); - hitOffset = hitPixel.x() + m_PixelSize*hitPixel.y(); - - //avoid multiple measuring of same pixel or unknown pixel - if ( ( hitOffset == lastOffset ) || ( hitOffset >= unsigned ( m_ByteSize ) ) || ( m_MeasurementCount[hitOffset] == 0 ) ) - { - continue; - } - - if ( m_BacksideChecking ) - { - //avoid matching of back and front pixels of obstacles - x = cosTheta * measurePoints[i].frontPos.x() - sinTheta * measurePoints[i].frontPos.y() + robotPose.x(); - y = sinTheta * measurePoints[i].frontPos.x() + cosTheta * measurePoints[i].frontPos.y() + robotPose.y(); - geometry_msgs::Point frontPos; - frontPos.x = x; - frontPos.y = y; - - Eigen::Vector2i frontPixel = map_tools::toMapCoords(frontPos, m_Origin, m_Resolution); - frontOffset = frontPixel.x() + m_PixelSize*frontPixel.y(); - - if ( ( frontOffset >= unsigned ( m_ByteSize ) ) || ( m_MeasurementCount[frontOffset] == 0 ) ) - { - continue; - } - } - - lastOffset=hitOffset; - //fittingFactor += m_SmoothOccupancyProbability[ offset ]; - fittingFactor += m_OccupancyProbability[ hitOffset ]; - } - return fittingFactor; -} - - -template<class DataT> -void OccupancyMap::drawLine ( DataT* data, Eigen::Vector2i& startPixel, Eigen::Vector2i& endPixel, char value ) -{ - - //bresenham algorithm - int xstart = startPixel.x(); - int ystart = startPixel.y(); - int xend = endPixel.x(); - int yend = endPixel.y(); - - int x, y, t, dist, xerr, yerr, dx, dy, incx, incy; - // compute distances - dx = xend - xstart; - dy = yend - ystart; - - // compute increment - if ( dx < 0 ) - { - incx = -1; - dx = -dx; - } - else - { - incx = dx ? 1 : 0; - } - - if ( dy < 0 ) - { - incy = -1; - dy = -dy; - } - else - { - incy = dy ? 1 : 0; - } - - // which distance is greater? - dist = ( dx > dy ) ? dx : dy; - // initializing - x = xstart; - y = ystart; - xerr = dx; - yerr = dy; - - // compute cells - for ( t = 0; t < dist; t++ ) - { - int index = x + m_PixelSize * y; - // set flag to free if no flag is set - // (do not overwrite occupied cells) - if(index < 0) continue; - if ( data[index] == NO_CHANGE ) - { - data[index] = value; - } -/* if ( data[index] == OCCUPIED || data[index] == SAFETY_BORDER ) - { - return; - }*/ - xerr += dx; - yerr += dy; - if ( xerr > dist ) - { - xerr -= dist; - x += incx; - } - if ( yerr > dist ) - { - yerr -= dist; - y += incy; - } - } -} - - -void OccupancyMap::applyChanges() -{ - for ( int y = m_ChangedRegion.minY(); y <= m_ChangedRegion.maxY(); y++ ) - { - int yOffset = m_PixelSize * y; - for ( int x = m_ChangedRegion.minX(); x <= m_ChangedRegion.maxX(); x++ ) - { - int i = x + yOffset; - if ( ( m_CurrentChanges[i] == ::FREE || m_CurrentChanges[i] == ::OCCUPIED ) && m_MeasurementCount[i] < SHRT_MAX ) - { - m_MeasurementCount[i]++; - } - if ( m_CurrentChanges[i] == ::OCCUPIED && m_OccupancyCount[i] < USHRT_MAX ) - { - m_OccupancyCount[i]++; - } - } - } -} - -void OccupancyMap::clearChanges() -{ - m_ChangedRegion.expand ( 2 ); - m_ChangedRegion.clip ( Box2D<int> ( 0,0,m_PixelSize-1,m_PixelSize-1 ) ); - for ( int y = m_ChangedRegion.minY(); y <= m_ChangedRegion.maxY(); y++ ) - { - int yOffset = m_PixelSize * y; - for ( int x = m_ChangedRegion.minX(); x <= m_ChangedRegion.maxX(); x++ ) - { - int i = x + yOffset; - m_CurrentChanges[i] = NO_CHANGE; - } - } - m_ChangedRegion=Box2D<int> ( m_PixelSize - 1, m_PixelSize - 1, 0, 0 ); -} - -void OccupancyMap::incrementMeasurementCount ( Eigen::Vector2i p ) -{ - unsigned index = p.x() + m_PixelSize * p.y(); - if ( index < m_ByteSize ) - { - if ( m_CurrentChanges[index] == NO_CHANGE && m_MeasurementCount[index] < USHRT_MAX ) - { - m_CurrentChanges[index] = ::FREE; - m_MeasurementCount[index]++; - } - } - else - { - ROS_ERROR( "Index out of bounds: x = %d, y = %d", p.x(), p.y() ); - } -} - -void OccupancyMap::incrementOccupancyCount ( Eigen::Vector2i p ) -{ - int index = p.x() + m_PixelSize * p.y(); - if ( ( m_CurrentChanges[index] == NO_CHANGE || m_CurrentChanges[index] == ::FREE ) && m_MeasurementCount[index] < USHRT_MAX ) - { - m_CurrentChanges[index] = ::OCCUPIED; - m_OccupancyCount[index]++; - } -} - -void OccupancyMap::scaleDownCounts ( int maxCount ) -{ - clearChanges(); - if ( maxCount <= 0 ) - { - ROS_WARN("WARNING: argument maxCount is choosen to small, resetting map."); - memset ( m_MeasurementCount, 0, m_ByteSize ); - memset ( m_OccupancyCount, 0, m_ByteSize ); - memset ( m_InaccessibleCount, 0, m_ByteSize ); - } - else - { - for ( unsigned i = 0; i < m_ByteSize; i++ ) - { - int scalingFactor = m_MeasurementCount[i] / maxCount; - if ( scalingFactor != 0 ) - { - m_MeasurementCount[i] /= scalingFactor; - m_OccupancyCount[i] /= scalingFactor; - m_InaccessibleCount[i] /= scalingFactor; - } - if ( m_InaccessibleCount[i] > maxCount ) - { - m_InaccessibleCount[i] = maxCount; - } - } - } - maximizeChangedRegion(); - applyChanges(); - computeOccupancyProbabilities(); -} - - -void OccupancyMap::markRobotPositionFree() -{ - geometry_msgs::Point point; - point.x = 0; - point.y = 0; - point.z = 0; - geometry_msgs::Point endPosWorld = map_tools::transformPoint(point, m_latestMapTransform); - Eigen::Vector2i robotPixel = map_tools::toMapCoords(endPosWorld, m_Origin, m_Resolution); - - int width = 0.4 / m_Resolution; - for ( int i = robotPixel.y() - width; i <= robotPixel.y() + width; i++ ) - { - for ( int j = robotPixel.x() - width; j <= robotPixel.x() + width; j++ ) - { - incrementMeasurementCount ( Eigen::Vector2i ( i, j ) ); - } - } - Box2D<int> robotBox ( robotPixel.x()-width, robotPixel.y()-width, robotPixel.x() +width, robotPixel.y() +width ); - m_ChangedRegion.enclose ( robotBox ); - m_ExploredRegion.enclose ( robotBox ); -} - - -QImage OccupancyMap::getProbabilityQImage ( int trancparencyThreshold, bool showInaccessible ) const -{ - QImage retImage ( m_PixelSize, m_PixelSize, QImage::Format_RGB32 ); - for ( int y = 0; y < m_PixelSize; y++ ) - { - for ( int x = 0; x < m_PixelSize; x++ ) - { - int index = x + y * m_PixelSize; - int value = UNKNOWN; - if ( m_MeasurementCount[index] > 0 ) - { - value = static_cast<int> ( ( 1.0 - m_OccupancyProbability[index] ) * 255 ); - if ( m_MeasurementCount[index] < trancparencyThreshold ) - { - value = static_cast<int> ( ( 0.75 + 0.025 * m_MeasurementCount[index] ) * ( 1.0 - m_OccupancyProbability[index] ) * 255 ); - } - } - if ( showInaccessible && m_InaccessibleCount[index] >= 2 ) - { - value = 0; - } - retImage.setPixel ( x, y, qRgb ( value, value, value ) ); - } - } - return retImage; -} - -void OccupancyMap::getOccupancyProbabilityImage ( vector<int8_t>& data, int& width, int& height, float& resolution ) -{ - width = m_PixelSize; - height = m_PixelSize; - resolution = m_Resolution; - data.resize(m_PixelSize * m_PixelSize); - std::fill(data.begin(), data.end(), (int8_t)NOT_SEEN_YET); //note: linker error without strange cast from int8_t to int8_t - for ( int y = m_ExploredRegion.minY(); y <= m_ExploredRegion.maxY(); y++ ) - { - int yOffset = m_PixelSize * y; - for ( int x = m_ExploredRegion.minX(); x <= m_ExploredRegion.maxX(); x++ ) - { - int i = x + yOffset; - if ( m_MeasurementCount[i] < 1 ) - { - continue; - } - // set inaccessible points to black - if ( m_InaccessibleCount[i] >= 2 ) - { - data[i] = 99; - continue; - } - if(m_OccupancyProbability[i] == UNKNOWN_LIKELIHOOD) - { - data[i] = NOT_SEEN_YET; - } - else - { - data[i] = (int)(m_OccupancyProbability[i] * 99); //TODO maybe - 2 (or *0.99 or smth) - } - } - } -} - -void OccupancyMap::maximizeChangedRegion() -{ - m_ChangedRegion=m_ExploredRegion; -} - -void OccupancyMap::applyMasking(const nav_msgs::OccupancyGrid::ConstPtr &msg) -{ - if(msg->data.size() != m_ByteSize) - { - ROS_ERROR_STREAM("Size Mismatch between SLAM map (" << m_ByteSize << ") and masking map (" << msg->data.size() << ")"); - return; - } - for(size_t y = 0; y < msg->info.height; y++) - { - int yOffset = msg->info.width * y; - for(size_t x = 0; x < msg->info.width; x++) - { - int i = yOffset + x; - - switch(msg->data[i]) - { - case homer_mapnav_msgs::ModifyMap::BLOCKED: - case homer_mapnav_msgs::ModifyMap::OBSTACLE: - //increase measure count of cells which were not yet visible to be able to modify unknown areas - if(m_MeasurementCount[i] == 0) - m_MeasurementCount[i] = 10; - - m_OccupancyCount[i] = m_MeasurementCount[i]; - m_OccupancyProbability[i] = 1.0; - m_ExploredRegion.enclose(x, y); - break; - case homer_mapnav_msgs::ModifyMap::FREE: - //see comment above - if(m_MeasurementCount[i] == 0) - m_MeasurementCount[i] = 10; - - m_OccupancyCount[i] = 0; - m_OccupancyProbability[i] = 0.0; - m_ExploredRegion.enclose(x, y); - break; - case homer_mapnav_msgs::ModifyMap::HIGH_SENSITIV: - m_HighSensitive[i] = 1; - break; - } - } - } -} - -void OccupancyMap::cleanUp() -{ - if ( m_OccupancyProbability ) - { - delete[] m_OccupancyProbability; - } - if ( m_MeasurementCount ) - { - delete[] m_MeasurementCount; - } - if ( m_OccupancyCount ) - { - delete[] m_OccupancyCount; - } - if ( m_CurrentChanges ) - { - delete[] m_CurrentChanges; - } - if ( m_InaccessibleCount ) - { - delete[] m_InaccessibleCount; - } - if ( m_HighSensitive ) - { - delete[] m_HighSensitive; - } -} diff --git a/homer_mapping/src/ParticleFilter/HyperSlamFilter.cpp b/homer_mapping/src/ParticleFilter/HyperSlamFilter.cpp deleted file mode 100755 index 7265b0ea..00000000 --- a/homer_mapping/src/ParticleFilter/HyperSlamFilter.cpp +++ /dev/null @@ -1,202 +0,0 @@ -#include <homer_mapping/ParticleFilter/HyperSlamFilter.h> - -#include <vector> -#include <cmath> -#include <fstream> -#include <sstream> -#include <stdlib.h> - -#include "ros/ros.h" - -using namespace std; - -HyperSlamFilter::HyperSlamFilter (int particleFilterNum, int particleNum ) -{ - m_ParticleFilterNum = particleFilterNum; - if ( m_ParticleFilterNum < 1 ) - { - m_ParticleFilterNum = 1; - } - ROS_DEBUG( "Using %d Hyper Particles.", particleFilterNum); - - m_ParticleNum = particleNum; - - m_DoMapping = true; - - m_DeletionThreshold = 0.98; - - for ( unsigned i=0; i < m_ParticleFilterNum; i++ ) - { - ostringstream stream; - stream << "SlamFilter " << i; - SlamFilter *slamFilter = new SlamFilter ( particleNum ); - m_SlamFilters.push_back ( slamFilter ); - } - - m_BestSlamFilter = m_SlamFilters[0]; -} - -HyperSlamFilter::~HyperSlamFilter() -{ - for (unsigned i = 0; i < m_ParticleFilterNum; i++) - { - if( m_SlamFilters[i] ) - { - delete m_SlamFilters[i]; - m_SlamFilters[i] = 0; - } - } -} - -void HyperSlamFilter::setRotationErrorRotating ( float percent ) -{ - for ( unsigned i=0; i < m_SlamFilters.size(); i++ ) - { - m_SlamFilters[i]->setRotationErrorRotating(percent / 100.0); - } -} - -void HyperSlamFilter::setRotationErrorTranslating ( float degreePerMeter ) -{ - for ( unsigned int i=0; i < m_SlamFilters.size(); i++ ) - { - m_SlamFilters[i]->setRotationErrorTranslating(degreePerMeter / 180.0 * M_PI); - } -} - -void HyperSlamFilter::setTranslationErrorTranslating ( float percent ) -{ - for ( unsigned int i=0; i < m_SlamFilters.size(); i++ ) - { - m_SlamFilters[i]->setTranslationErrorTranslating(percent / 100.0); - } -} - -void HyperSlamFilter::setTranslationErrorRotating ( float mPerDegree ) -{ - for ( unsigned int i=0; i < m_SlamFilters.size(); i++ ) - { - m_SlamFilters[i]->setTranslationErrorRotating( mPerDegree / 180.0 * M_PI ); - } -} - -void HyperSlamFilter::setMoveJitterWhileTurning ( float mPerDegree ) -{ - for ( unsigned int i=0; i < m_SlamFilters.size(); i++ ) - { - m_SlamFilters[i]->setMoveJitterWhileTurning( mPerDegree / 180.0 * M_PI ); - } -} - -void HyperSlamFilter::setScanMatchingClusterSize ( float minClusterSize ) -{ - for ( unsigned int i=0; i < m_SlamFilters.size(); i++ ) - { - m_SlamFilters[i]->setScanMatchingClusterSize( minClusterSize ); - } -} - -void HyperSlamFilter::resetHigh() -{ - for ( unsigned int i=0; i < m_SlamFilters.size(); i++ ) - { - m_SlamFilters[i]->resetHigh(); - } -} - -void HyperSlamFilter::setMapping ( bool doMapping ) -{ - m_DoMapping = doMapping; -} - -void HyperSlamFilter:: setOccupancyMap ( OccupancyMap* occupancyMap ) -{ - for ( unsigned int i=0; i < m_SlamFilters.size(); i++ ) - { - m_SlamFilters[i]->setOccupancyMap( occupancyMap ); - } -} - -void HyperSlamFilter::setRobotPose ( Pose pose, double scatterVarXY, double scatterVarTheta ) -{ - for ( unsigned int i=0; i < m_SlamFilters.size(); i++ ) - { - m_SlamFilters[i]->setRobotPose(pose, scatterVarXY, scatterVarTheta); - } -} - -void HyperSlamFilter::filter ( Pose currentPose, sensor_msgs::LaserScanConstPtr laserData, ros::Time measurementTime, ros::Duration &filterDuration) -{ - //call filter methods of all particle filters - for ( unsigned int i=0; i < m_SlamFilters.size(); i++ ) - { - bool randOnOff; - - if(m_SlamFilters.size() == 1) - { - randOnOff = true; - } - else - { - //if mapping is on, switch on with 80% probability to introduce some randomness in different particle filters - randOnOff = (rand() % 100) < 80; - } - m_SlamFilters[i]->setMapping( m_DoMapping && randOnOff ); - m_SlamFilters[i]->filter(currentPose, laserData, measurementTime, filterDuration); - - } - if(m_SlamFilters.size() != 1) - { - //determine which map has the best/worst contrast - double bestContrast = 0.0; - static unsigned int bestFilter = 0; - double worstContrast = 100.0; - static unsigned int worstFilter = 0; - - for ( unsigned int i=0; i < m_SlamFilters.size(); i++ ) - { - double contrast = m_SlamFilters[i]->evaluateByContrast(); - { - if( contrast > bestContrast ) - { - bestContrast = contrast; - bestFilter = i; - } - if ( contrast < worstContrast ) - { - worstContrast = contrast; - worstFilter = i; - } - } - } - - // set best filter - SlamFilter* lastBestFilter = m_BestSlamFilter; - m_BestSlamFilter = m_SlamFilters[bestFilter]; - - if ( m_BestSlamFilter != lastBestFilter ) - { - ROS_INFO( "Switched to best filter %d (bestContrast: %f) -- the worst filter is %d (worstContrast: %f)", bestFilter, bestContrast, worstFilter, worstContrast); //TODO - } - - if ( bestFilter != worstFilter ) - { - if ( worstContrast < ( bestContrast * m_DeletionThreshold ) ) - { - // replace the worst filter by the one with the best contrast - delete m_SlamFilters[worstFilter]; - m_SlamFilters[worstFilter] = new SlamFilter ( * m_SlamFilters [bestFilter] ); - } - } - } -} - -SlamFilter* HyperSlamFilter::getBestSlamFilter() -{ - return m_BestSlamFilter; -} - -void HyperSlamFilter::setDeletionThreshold(double deletionThreshold) -{ - m_DeletionThreshold = deletionThreshold; -} diff --git a/homer_mapping/src/ParticleFilter/Particle.cpp b/homer_mapping/src/ParticleFilter/Particle.cpp deleted file mode 100644 index 1d64cf73..00000000 --- a/homer_mapping/src/ParticleFilter/Particle.cpp +++ /dev/null @@ -1,10 +0,0 @@ -#include <homer_mapping/ParticleFilter/Particle.h> - -Particle::Particle(float weight, int id) { - m_Weight = weight; - m_Id = id; -} - -Particle::~Particle() { -} - diff --git a/homer_mapping/src/ParticleFilter/SlamFilter.cpp b/homer_mapping/src/ParticleFilter/SlamFilter.cpp deleted file mode 100644 index 628ae187..00000000 --- a/homer_mapping/src/ParticleFilter/SlamFilter.cpp +++ /dev/null @@ -1,662 +0,0 @@ -#include <homer_mapping/ParticleFilter/SlamFilter.h> -#include <omp.h> - -// minimum move for translation in m -const float MIN_MOVE_DISTANCE2 = 0.001 * 0.001; -// minimum turn in radiants -const float MIN_TURN_DISTANCE2 = 0.001 * 0.001; - -const float M_2PI = 2 * M_PI; - -SlamFilter::SlamFilter ( int particleNum ) : ParticleFilter<SlamParticle> ( particleNum ) -{ - - m_OccupancyMap = new OccupancyMap(); - // generate initial particles - for ( int i = 0; i < m_ParticleNum; i++ ) - { - m_CurrentList[i] = new SlamParticle(); - m_LastList[i] = new SlamParticle(); - } - - float rotationErrorRotating = 0.0; - ros::param::get("/particlefilter/error_values/rotation_error_rotating", rotationErrorRotating); - float rotationErrorTranslating = 0.0; - ros::param::get("/particlefilter/error_values/rotation_error_translating", rotationErrorTranslating); - float translationErrorTranslating = 0.0; - ros::param::get("/particlefilter/error_values/translation_error_translating", translationErrorTranslating); - float translationErrorRotating = 0.0; - ros::param::get("/particlefilter/error_values/translation_error_translating", translationErrorRotating); - float moveJitterWhileTurning = 0.0; - ros::param::get("/particlefilter/error_values/move_jitter_while_turning", moveJitterWhileTurning); - ros::param::get("/particlefilter/max_rotation_per_second", m_MaxRotationPerSecond); - - int updateMinMoveAngleDegrees; - ros::param::get("/particlefilter/update_min_move_angle", updateMinMoveAngleDegrees); - m_UpdateMinMoveAngle = Math::deg2Rad(updateMinMoveAngleDegrees); - ros::param::get("/particlefilter/update_min_move_dist", m_UpdateMinMoveDistance); - double maxUpdateInterval; - ros::param::get("/particlefilter/max_update_interval", maxUpdateInterval); - m_MaxUpdateInterval = ros::Duration(maxUpdateInterval); - - setRotationErrorRotating ( rotationErrorRotating ); - setRotationErrorTranslating ( rotationErrorTranslating ); - setTranslationErrorTranslating ( translationErrorTranslating ); - setTranslationErrorRotating ( translationErrorRotating ); - setMoveJitterWhileTurning ( moveJitterWhileTurning ); - - m_FirstRun = true; - m_DoMapping = true; - - m_EffectiveParticleNum = m_ParticleNum; - m_LastUpdateTime = ros::Time(0); -} - -SlamFilter::SlamFilter ( SlamFilter& slamFilter ) : ParticleFilter<SlamParticle> ( slamFilter.m_ParticleNum ) -{ - m_OccupancyMap = new OccupancyMap ( * ( slamFilter.m_OccupancyMap ) ); - // generate initial particles - for ( int i = 0; i < m_ParticleNum; i++ ) - { - if ( slamFilter.m_CurrentList[i] == 0 ) - { - m_CurrentList[i]=0; - } - else - { - m_CurrentList[i] = new SlamParticle ( * ( slamFilter.m_CurrentList[i] ) ); - } - if ( slamFilter.m_LastList[i] == 0 ) - { - m_LastList[i]=0; - } - else - { - m_LastList[i] = new SlamParticle ( * ( slamFilter.m_LastList[i] ) ); - } - } - - float rotationErrorRotating = 0.0; - ros::param::get("/particlefilter/error_values/rotation_error_rotating", rotationErrorRotating); - float rotationErrorTranslating = 0.0; - ros::param::get("/particlefilter/error_values/rotation_error_translating", rotationErrorTranslating); - float translationErrorTranslating = 0.0; - ros::param::get("/particlefilter/error_values/translation_error_translating", translationErrorTranslating); - float translationErrorRotating = 0.0; - ros::param::get("/particlefilter/error_values/translation_error_translating", translationErrorRotating); - float moveJitterWhileTurning = 0.0; - ros::param::get("/particlefilter/error_values/move_jitter_while_turning", moveJitterWhileTurning); - ros::param::get("/particlefilter/max_rotation_per_second", m_MaxRotationPerSecond); - - int updateMinMoveAngleDegrees; - ros::param::get("/particlefilter/update_min_move_angle", updateMinMoveAngleDegrees); - m_UpdateMinMoveAngle = Math::deg2Rad(updateMinMoveAngleDegrees); - ros::param::get("/particlefilter/update_min_move_dist", m_UpdateMinMoveDistance); - double maxUpdateInterval; - ros::param::get("/particlefilter/max_update_interval", maxUpdateInterval); - m_MaxUpdateInterval = ros::Duration(maxUpdateInterval); - - setRotationErrorRotating ( rotationErrorRotating ); - setRotationErrorTranslating ( rotationErrorTranslating ); - setTranslationErrorTranslating ( translationErrorTranslating ); - setTranslationErrorRotating ( translationErrorRotating ); - setMoveJitterWhileTurning ( moveJitterWhileTurning ); - - m_FirstRun = slamFilter.m_FirstRun; - m_DoMapping = slamFilter.m_DoMapping; - - m_EffectiveParticleNum = slamFilter.m_EffectiveParticleNum; - - m_LastUpdateTime = slamFilter.m_LastUpdateTime; - - m_ReferencePoseOdometry = slamFilter.m_ReferencePoseOdometry; - m_ReferenceMeasurementTime = slamFilter.m_ReferenceMeasurementTime; -} - - -SlamFilter::~SlamFilter() -{ - if ( m_OccupancyMap ) - { - delete m_OccupancyMap; - } - for ( int i = 0; i < m_ParticleNum; i++ ) - { - if ( m_CurrentList[i] ) - { - delete m_CurrentList[i]; - m_CurrentList[i] = 0; - } - if ( m_LastList[i] ) - { - delete m_LastList[i]; - m_LastList[i] = 0; - } - } -} - - -void SlamFilter::setRotationErrorRotating ( float percent ) -{ - m_Alpha1 = percent / 100.0; -} - -void SlamFilter::resetHigh() -{ - m_OccupancyMap->resetHighSensitive(); -} - -void SlamFilter::setRotationErrorTranslating ( float degreePerMeter ) -{ - m_Alpha2 = degreePerMeter / 180.0 * M_PI; -} - -void SlamFilter::setTranslationErrorTranslating ( float percent ) -{ - m_Alpha3 = percent / 100.0; -} - -void SlamFilter::setTranslationErrorRotating ( float mPerDegree ) -{ - m_Alpha4 = mPerDegree / 180.0 * M_PI; -} - -void SlamFilter::setMoveJitterWhileTurning ( float mPerDegree ) -{ - m_Alpha5 = mPerDegree / 180.0 * M_PI; -} - -void SlamFilter::setScanMatchingClusterSize ( float minClusterSize ) -{ - minClusterSize = minClusterSize; -} - -void SlamFilter::setMapping ( bool doMapping ) -{ - m_DoMapping = doMapping; -} - -void SlamFilter:: setOccupancyMap ( OccupancyMap* occupancyMap ) -{ - //delete old - if ( m_OccupancyMap ) - { - delete m_OccupancyMap; - } - //copy - m_OccupancyMap = occupancyMap; -} - - -vector<Pose>* SlamFilter::getParticlePoses() const -{ - vector<Pose>* particlePoses = new vector<Pose>(); - for ( int i = 0; i < m_ParticleNum; i++ ) - { - float robotX, robotY, robotTheta; - SlamParticle* particle = m_CurrentList[i]; - particle->getRobotPose ( robotX, robotY, robotTheta ); - particlePoses->push_back ( Pose ( robotX, robotY, robotTheta ) ); - } - return particlePoses; -} - -vector<SlamParticle*>* SlamFilter::getParticles() const -{ - vector<SlamParticle*>* particles = new vector<SlamParticle*>(); - for ( int i = 0; i < m_ParticleNum; i++ ) - { - SlamParticle* particle = m_CurrentList[i]; - particles->push_back ( particle ); - } - return particles; -} - -void SlamFilter::setRobotPose ( Pose pose, double scatterVarXY, double scatterVarTheta ) -{ - // set first particle to exact position - m_CurrentList[0]->setRobotPose ( pose.x(), pose.y(), pose.theta() ); - m_LastList[0]->setRobotPose ( pose.x(), pose.y(), pose.theta() ); - // scatter remaining particles - for ( int i = 1; i < m_ParticleNum; ++i ) - { - const double scatterX = randomGauss() * scatterVarXY; - const double scatterY = randomGauss() * scatterVarXY; - const double scatterTheta = randomGauss() * scatterVarTheta; - - m_CurrentList[i]->setRobotPose ( pose.x()+scatterX, pose.y()+scatterY, pose.theta()+scatterTheta ); - m_LastList[i]->setRobotPose ( pose.x()+scatterX, pose.y()+scatterY, pose.theta()+scatterTheta ); - } -} - -vector<float> SlamFilter::getParticleWeights() const -{ - vector<float> particleWeights ( m_ParticleNum ); - for ( int i = 0; i < m_ParticleNum; i++ ) - { - particleWeights[i] = m_CurrentList[i]->getWeight(); - } - return particleWeights; -} - -double SlamFilter::randomGauss ( float variance ) const -{ - if ( variance < 0 ) - { - variance = -variance; - } - double x1, x2, w, y1; - do - { - x1 = 2.0 * random01() - 1.0; - x2 = 2.0 * random01() - 1.0; - w = x1 * x1 + x2 * x2; - } - while ( w >= 1.0 ); - - w = sqrt ( ( -2.0 * log ( w ) ) / w ); - y1 = x1 * w; - // now y1 is uniformly distributed - return sqrt ( variance ) * y1; -} - -vector<float> SlamFilter::filterOutliers (sensor_msgs::LaserScanConstPtr rawData, float maxDiff ) -{ - if ( rawData->ranges.size() < 2 ) - { - return rawData->ranges; - } - vector<float> filteredData = rawData->ranges; - for ( unsigned int i = 1; i < filteredData.size() - 1; i++ ) - { - if ( abs ( ( float ) ( rawData->ranges[i-1] - rawData->ranges[i]*2 + rawData->ranges[i+1] ) ) > maxDiff*2 ) - { - filteredData[i] = 0; - } - } - if ( fabs ( rawData->ranges[0] - rawData->ranges[1] ) > maxDiff ) - { - filteredData[0] = 0; - } - if ( fabs ( rawData->ranges[ rawData->ranges.size()-1 ] - rawData->ranges[ rawData->ranges.size()-2 ] ) > maxDiff ) - { - filteredData[ rawData->ranges.size()-1 ] = 0; - } - - return filteredData; -} - -void SlamFilter::filter (Pose currentPose, sensor_msgs::LaserScanConstPtr laserData, ros::Time measurementTime, ros::Duration &FilterDuration) -{ - // if first run, initialize data - if ( m_FirstRun ) - { - m_FirstRun = false; - // only do mapping, save first pose as reference - if ( m_DoMapping ) - { - tf::Transform transform(tf::createQuaternionFromYaw(0.0), tf::Vector3(0.0, 0.0, 0.0)); - m_OccupancyMap->insertLaserData ( laserData , transform); - } - m_CurrentLaserData = boost::make_shared<sensor_msgs::LaserScan>(*laserData); //copy const ptr to be able to change values; //test - m_ReferencePoseOdometry = currentPose; - m_ReferenceMeasurementTime = measurementTime; - - measure(); - ROS_INFO_STREAM("first run!"); - normalize(); - sort ( 0, m_ParticleNum - 1 ); - return; - } - //m_CurrentLaserConfig = laserConf; - m_CurrentPoseOdometry = currentPose; - m_CurrentLaserData = boost::make_shared<sensor_msgs::LaserScan>(*laserData); //copy const ptr to be able to change values - m_CurrentLaserData->ranges = filterOutliers ( laserData, 0.3 ); - - Transformation2D trans = m_CurrentPoseOdometry - m_ReferencePoseOdometry; - - // do not resample if move to small - if ( sqr ( trans.x() ) + sqr ( trans.y() ) < MIN_MOVE_DISTANCE2 && sqr ( trans.theta() ) < MIN_TURN_DISTANCE2 ) - { - ROS_DEBUG_STREAM( "Move too small, will not resample." ); - if ( m_EffectiveParticleNum < m_ParticleNum / 10 ) - { - resample(); - ROS_INFO_STREAM( "Particles too scattered, resampling." ); - // filter steps - drift(); - measure(); - normalize(); - - sort ( 0, m_ParticleNum - 1 ); - } - } - else - { - resample(); - // filter steps - drift(); - measure(); - normalize(); - - sort ( 0, m_ParticleNum - 1 ); - } - - Pose likeliestPose = getLikeliestPose(measurementTime); //test - Transformation2D transSinceLastUpdate = likeliestPose - m_LastUpdatePose; - - ostringstream stream; - stream.precision ( 2 ); - stream << "Transformation since last update: angle=" << Math::rad2Deg ( transSinceLastUpdate.theta() ) << " dist=" << transSinceLastUpdate.magnitude() << "m" << endl; - - bool update = ( fabs ( transSinceLastUpdate.theta() ) > m_UpdateMinMoveAngle ) || - ( transSinceLastUpdate.magnitude() > m_UpdateMinMoveDistance ) || - ( ( measurementTime - m_LastUpdateTime ) > m_MaxUpdateInterval ); - - if ( m_DoMapping && update ) - { - stream << "Updating map."; - double elapsedSeconds = ( measurementTime - m_ReferenceMeasurementTime ).toSec(); - double thetaPerSecond; - if(elapsedSeconds == 0.0) - { - thetaPerSecond = trans.theta(); - } - else - { - thetaPerSecond = trans.theta() / elapsedSeconds; - } - - m_LastUpdatePose = likeliestPose; - m_LastUpdateTime = measurementTime; - if ( std::fabs(thetaPerSecond) < m_MaxRotationPerSecond ) - { - updateMap(); - } - else - { - ROS_DEBUG_STREAM( "No mapping performed, rotation angle too big." ); - } - } - else - { - stream << "No map update performed."; - } - ROS_DEBUG_STREAM( stream.str() ); - // safe last used pose and laserdata as reference - - m_ReferencePoseOdometry = m_CurrentPoseOdometry; - m_ReferenceMeasurementTime = measurementTime; -} - -/** - * For the probabilistic motion model of the robot we use the following three parameters: - * - When the robot starts, the initial orientation may have errors (a few degrees). (m_InitialOrientationError) - * - The distance of the robot movement may be wrong (a percentage of the moved distance). (m_TranslationError) - * - The orientation of the robot when the motion was finished may be wrong (a percentage of the rotation) (m_RotationError). - * [cf. "An Efficient FastSLAM Algorithm for Generating Maps of Large-Scale Cyclic Environments - * from Raw Laser Range Measurements", Dirk Haenelt et. al.] - * We use Gaussian-Distributions to estimate the error. - * The expected value of the errors are zero. - */ - -void SlamFilter::drift() -{ - - float rx = m_ReferencePoseOdometry.x(); - float ry = m_ReferencePoseOdometry.y(); - float rt = m_ReferencePoseOdometry.theta(); - float cx = m_CurrentPoseOdometry.x(); - float cy = m_CurrentPoseOdometry.y(); - float ct = m_CurrentPoseOdometry.theta(); - - Transformation2D odoTrans = m_CurrentPoseOdometry - m_ReferencePoseOdometry; - - // find out if driving forward or backward - bool backwardMove = false; - float scalar = odoTrans.x() * cosf ( rt ) + odoTrans.y() * sinf ( rt ); - if ( scalar <= 0 ) - { - backwardMove = true; - } - float distance = sqrt ( sqr ( odoTrans.x() ) + sqr ( odoTrans.y() ) ); - float deltaRot1, deltaTrans, deltaRot2; - if ( distance < sqrt ( MIN_MOVE_DISTANCE2 ) ) - { - deltaRot1 = odoTrans.theta(); - deltaTrans = 0.0; - deltaRot2 = 0.0; - } - else if ( backwardMove ) - { - deltaRot1 = atan2 ( ry - cy, rx - cx ) - rt; - deltaTrans = - distance; - deltaRot2 = ct - rt - deltaRot1; - } - else - { - deltaRot1 = atan2 ( odoTrans.y(), odoTrans.x() ) - rt; - deltaTrans = distance; - deltaRot2 = ct - rt - deltaRot1; - } - - while ( deltaRot1 >= M_PI ) deltaRot1 -= M_2PI; - while ( deltaRot1 < -M_PI ) deltaRot1 += M_2PI; - while ( deltaRot2 >= M_PI ) deltaRot2 -= M_2PI; - while ( deltaRot2 < -M_PI ) deltaRot2 += M_2PI; - - // always leave one particle with pure displacement - SlamParticle* particle = m_CurrentList[0]; - // get stored pose - float robotX, robotY, robotTheta; - particle->getRobotPose ( robotX, robotY, robotTheta ); - Pose pose ( robotX, robotY, robotTheta ); - // move pose - float posX = pose.x() + deltaTrans * cos ( pose.theta() + deltaRot1 ); - float posY = pose.y() + deltaTrans * sin ( pose.theta() + deltaRot1 ); - float theta = pose.theta() + deltaRot1 + deltaRot2; - while ( theta > M_PI ) theta -= M_2PI; - while ( theta <= -M_PI ) theta += M_2PI; - // save new pose - particle->setRobotPose ( posX, posY, theta ); - int i = 1; - - //calculating parallel on 8 threats - //TODO: ERROR ON RESET MAPS -// omp_set_num_threads(4); -// #pragma omp parallel for - for ( i = 1; i < m_ParticleNum; i++ ) - { - SlamParticle* particle = m_CurrentList[i]; - // get stored pose - float robotX, robotY, robotTheta; - particle->getRobotPose ( robotX, robotY, robotTheta ); - Pose pose ( robotX, robotY, robotTheta ); - // move pose - float estDeltaRot1 = deltaRot1 - randomGauss ( m_Alpha1 * fabs ( deltaRot1 ) + m_Alpha2 * deltaTrans ); - float estDeltaTrans = deltaTrans - randomGauss ( m_Alpha3 * deltaTrans + m_Alpha4 * ( fabs ( deltaRot1 ) + fabs ( deltaRot2 ) ) ); - float estDeltaRot2 = deltaRot2 - randomGauss ( m_Alpha1 * fabs ( deltaRot2 ) + m_Alpha2 * deltaTrans ); - - float posX = pose.x() + estDeltaTrans * cos ( pose.theta() + estDeltaRot1 ) + randomGauss ( m_Alpha5 * fabs ( estDeltaRot1 + estDeltaRot2 ) ); - float posY = pose.y() + estDeltaTrans * sin ( pose.theta() + estDeltaRot1 ) + randomGauss ( m_Alpha5 * fabs ( estDeltaRot1 + estDeltaRot2 ) ); - float theta = pose.theta() + estDeltaRot1 + estDeltaRot2; - - // save new pose - while ( theta > M_PI ) theta -= M_2PI; - while ( theta <= -M_PI ) theta += M_2PI; - - particle->setRobotPose ( posX, posY, theta ); - } - - -} - - -void SlamFilter::measure() -{ - if ( m_OccupancyMap ) - { - m_MeasurePoints = m_OccupancyMap->getMeasurePoints ( m_CurrentLaserData ); - - //calculating parallel on 8 threats - omp_set_num_threads(8); - int i = 0; - //#pragma omp parallel for - for (i = 0; i < m_ParticleNum; i++ ) - { - SlamParticle* particle = m_CurrentList[i]; - if ( !particle ) - { - ROS_ERROR_STREAM("ERROR: Particle is NULL-pointer!"); - } - else - { - // calculate weights - float robotX, robotY, robotTheta; - particle->getRobotPose ( robotX, robotY, robotTheta ); - Pose pose ( robotX, robotY, robotTheta ); - float weight = m_OccupancyMap->computeScore ( pose, m_MeasurePoints ); - particle->setWeight ( weight ); - } - } - } - m_EffectiveParticleNum = getEffectiveParticleNum2(); - -} - -void SlamFilter::updateMap() -{ - m_OccupancyMap->insertLaserData ( m_CurrentLaserData, m_latestTransform); -} - -void SlamFilter::printParticles() const -{ - cout << endl << "### PARTICLE LIST ###" << endl; - cout << right << fixed; - cout.width ( 5 ); - for ( int i = 0; i < m_ParticleNum; i++ ) - { - SlamParticle* p_particle = m_CurrentList[i]; - if ( p_particle ) - { - float robotX, robotY, robotTheta; - p_particle->getRobotPose ( robotX, robotY, robotTheta ); - cout << "Particle " << i << ": (" << robotX << "," << robotY << "," << robotTheta * 180.0 / M_PI << "), weight:\t" << p_particle->getWeight() << endl; - } - } - cout << "### END OF LIST ###" << endl; -} - - -void SlamFilter::reduceParticleNumber ( int newParticleNum ) -{ - if ( newParticleNum < m_ParticleNum ) - { - - SlamParticle** newCurrentList = new SlamParticle*[newParticleNum]; - SlamParticle** newLastList = new SlamParticle*[newParticleNum]; - - for ( int i = 0; i < newParticleNum; i++ ) - { - newCurrentList[i] = m_CurrentList[i]; - newLastList[i] = m_LastList[i]; - } - - for ( int i = newParticleNum + 1; i < m_ParticleNum; i++ ) - { - delete m_CurrentList[i]; - delete m_LastList[i]; - } - delete[] m_CurrentList; - delete[] m_LastList; - - m_CurrentList = newCurrentList; - m_LastList = newLastList; - - m_ParticleNum = newParticleNum; - normalize(); - } -} - -Pose SlamFilter::getLikeliestPose(ros::Time poseTime) -{ - float percentage = 0.4; //TODO param? //test - float sumX = 0, sumY = 0, sumDirX = 0, sumDirY = 0; - int numParticles = static_cast<int> ( percentage / 100 * m_ParticleNum ); - if ( 0 == numParticles ) - { - numParticles = 1; - } - for ( int i = 0; i < numParticles; i++ ) - { - float robotX, robotY, robotTheta; - m_CurrentList[i]->getRobotPose ( robotX, robotY, robotTheta ); - sumX += robotX; - sumY += robotY; - // calculate sum of vectors in unit circle - sumDirX += cos ( robotTheta ); - sumDirY += sin ( robotTheta ); - } - float meanTheta = atan2 ( sumDirY, sumDirX ); - float meanX = sumX / numParticles; - float meanY = sumY / numParticles; - //broadcast transform map -> base_link - tf::Transform transform(tf::createQuaternionFromYaw(meanTheta), - tf::Vector3(sumX / numParticles, sumY / numParticles, 0.0)); - tf::TransformBroadcaster tfBroadcaster; - m_latestTransform = transform; - - tfBroadcaster.sendTransform(tf::StampedTransform(m_latestTransform, poseTime, "/map", "/base_link")); - return Pose ( meanX, meanY, meanTheta ); -} - -OccupancyMap* SlamFilter::getLikeliestMap() const -{ - return m_OccupancyMap; -} - -void SlamFilter::getPoseVariances ( int particleNum, float& poseVarianceX, float& poseVarianceY ) -{ - - // the particles of m_CurrentList are sorted by their weights - if ( particleNum > m_ParticleNum || particleNum <= 0 ) - { - particleNum = m_ParticleNum; - } - // calculate average pose - float averagePoseX = 0; - float averagePoseY = 0; - float robotX = 0.0; - float robotY = 0.0; - float robotTheta = 0.0; - for ( int i = 0; i < particleNum; i++ ) - { - m_CurrentList[i]->getRobotPose ( robotX, robotY, robotTheta ); - averagePoseX += robotX; - averagePoseY += robotY; - } - averagePoseX /= particleNum; - averagePoseY /= particleNum; - - // calculate standard deviation of pose - poseVarianceX = 0.0; - poseVarianceY = 0.0; - for ( int i = 0; i < particleNum; i++ ) - { - m_CurrentList[i]->getRobotPose ( robotX, robotY, robotTheta ); - poseVarianceX += ( averagePoseX - robotX ) * ( averagePoseX - robotX ); - poseVarianceY += ( averagePoseY - robotY ) * ( averagePoseY - robotY ); - } - poseVarianceX /= particleNum; - poseVarianceY /= particleNum; -} - -double SlamFilter::evaluateByContrast() -{ - return m_OccupancyMap->evaluateByContrast(); -} - -void SlamFilter::applyMasking(const nav_msgs::OccupancyGrid::ConstPtr &msg) -{ - m_OccupancyMap->applyMasking(msg); -} diff --git a/homer_mapping/src/ParticleFilter/SlamParticle.cpp b/homer_mapping/src/ParticleFilter/SlamParticle.cpp deleted file mode 100644 index c0024dec..00000000 --- a/homer_mapping/src/ParticleFilter/SlamParticle.cpp +++ /dev/null @@ -1,30 +0,0 @@ -#include <homer_mapping/ParticleFilter/SlamParticle.h> - -SlamParticle::SlamParticle(float weight, float robotX, float robotY, float robotTheta) : Particle(weight) { - m_RobotPositionX = robotX; - m_RobotPositionY = robotY; - m_RobotOrientation = robotTheta; -} - -SlamParticle::SlamParticle( SlamParticle& slamParticle ) -{ - m_RobotPositionX = slamParticle.m_RobotPositionX; - m_RobotPositionY = slamParticle.m_RobotPositionY; - m_RobotOrientation = slamParticle.m_RobotOrientation; -} - -SlamParticle::~SlamParticle() { -} - -void SlamParticle::setRobotPose(float robotX, float robotY, float robotTheta) { - m_RobotPositionX = robotX; - m_RobotPositionY = robotY; - m_RobotOrientation = robotTheta; -} - -void SlamParticle::getRobotPose(float& robotX, float& robotY, float& robotTheta) { - robotX = m_RobotPositionX; - robotY = m_RobotPositionY; - robotTheta = m_RobotOrientation; -} - diff --git a/homer_mapping/src/slam_node.cpp b/homer_mapping/src/slam_node.cpp deleted file mode 100644 index c80692b2..00000000 --- a/homer_mapping/src/slam_node.cpp +++ /dev/null @@ -1,387 +0,0 @@ -#include <homer_mapping/slam_node.h> - -SlamNode::SlamNode(ros::NodeHandle* nh) - : m_HyperSlamFilter( 0 ) -{ - init(); - - // subscribe to topics - m_LaserScanSubscriber = nh->subscribe<sensor_msgs::LaserScan>("/scan", 1, &SlamNode::callbackLaserScan, this); - m_OdometrySubscriber = nh->subscribe<nav_msgs::Odometry>("/odom", 1, &SlamNode::callbackOdometry, this); - m_UserDefPoseSubscriber = nh->subscribe<geometry_msgs::Pose>("/homer_mapping/userdef_pose", 1, &SlamNode::callbackUserDefPose, this); - m_InitialPoseSubscriber = nh->subscribe<geometry_msgs::PoseWithCovarianceStamped>("/initialpose", 1, &SlamNode::callbackInitialPose, this); - m_DoMappingSubscriber = nh->subscribe<std_msgs::Bool>("/homer_mapping/do_mapping", 1, &SlamNode::callbackDoMapping, this); - m_ResetMapSubscriber = nh->subscribe<std_msgs::Empty>("/map_manager/reset_maps", 1, &SlamNode::callbackResetMap, this); - m_LoadMapSubscriber = nh->subscribe<nav_msgs::OccupancyGrid>("/map_manager/loaded_map", 1, &SlamNode::callbackLoadedMap, this); - m_MaskingSubscriber = nh->subscribe<nav_msgs::OccupancyGrid>("/map_manager/mask_slam", 1, &SlamNode::callbackMasking, this); - m_ResetHighSubscriber = nh->subscribe<std_msgs::Empty>("/map_manager/reset_high", 1, &SlamNode::callbackResetHigh, this); - - // advertise topics - m_PoseStampedPublisher = nh->advertise<geometry_msgs::PoseStamped>("/pose", 2); - m_SLAMMapPublisher = nh->advertise<nav_msgs::OccupancyGrid>("/homer_mapping/slam_map", 1); - - - geometry_msgs::PoseStamped poseMsg; - poseMsg.header.stamp = ros::Time(0); - poseMsg.header.frame_id = "map"; - poseMsg.pose.position.x = 0.0; - poseMsg.pose.position.y = 0.0; - poseMsg.pose.position.z = 0.0; - tf::Quaternion quatTF = tf::createQuaternionFromYaw(0.0); - geometry_msgs::Quaternion quatMsg; - tf::quaternionTFToMsg(quatTF, quatMsg); //conversion from tf::Quaternion to - poseMsg.pose.orientation = quatMsg; - m_PoseStampedPublisher.publish(poseMsg); - -//// //broadcast transform map -> base_link - tf::Transform transform(quatTF, tf::Vector3(0.0, 0.0, 0.0)); - m_tfBroadcaster.sendTransform(tf::StampedTransform(transform, poseMsg.header.stamp, "map", "base_link")); - Pose userdef_pose(poseMsg.pose.position.x, poseMsg.pose.position.y, tf::getYaw(poseMsg.pose.orientation)); - m_HyperSlamFilter->setRobotPose( userdef_pose, m_ScatterVarXY, m_ScatterVarTheta ); - -} - -void SlamNode::init() -{ - double waitTime; - ros::param::get("/particlefilter/wait_time", waitTime); - m_WaitDuration = ros::Duration(waitTime); - ros::param::get("/selflocalization/scatter_var_xy", m_ScatterVarXY); - ros::param::get("/selflocalization/scatter_var_theta", m_ScatterVarTheta); - - m_DoMapping = true; - - int particleNum; - ros::param::get("/particlefilter/particle_num", particleNum); - int particleFilterNum; - ros::param::get("/particlefilter/hyper_slamfilter/particlefilter_num", particleFilterNum); - m_HyperSlamFilter = new HyperSlamFilter ( particleFilterNum, particleNum ); - - m_ReferenceOdometryTime = ros::Time(0); - m_LastMapSendTime = ros::Time(0); - m_LastPositionSendTime = ros::Time(0); - m_LastMappingTime = ros::Time(0); - m_ReferenceOdometryTime = ros::Time(0); - - m_laser_queue.clear(); - m_odom_queue.clear(); -} - -SlamNode::~SlamNode() -{ - delete m_HyperSlamFilter; -} - -void SlamNode::resetMaps() -{ - ROS_INFO( "Resetting maps.." ); - - delete m_HyperSlamFilter; - m_HyperSlamFilter = 0; - - init(); - geometry_msgs::PoseStamped poseMsg; - poseMsg.header.stamp = ros::Time::now(); - poseMsg.header.frame_id = "map"; - poseMsg.pose.position.x = 0.0; - poseMsg.pose.position.y = 0.0; - poseMsg.pose.position.z = 0.0; - tf::Quaternion quatTF = tf::createQuaternionFromYaw(0.0); - geometry_msgs::Quaternion quatMsg; - tf::quaternionTFToMsg(quatTF, quatMsg); //conversion from tf::Quaternion to - poseMsg.pose.orientation = quatMsg; - m_PoseStampedPublisher.publish(poseMsg); - - m_LastLikeliestPose.set(0.0, 0.0); - m_LastLikeliestPose.setTheta(0.0f); - -//// //broadcast transform map -> base_link - tf::Transform transform(quatTF, tf::Vector3(0.0, 0.0, 0.0)); - m_tfBroadcaster.sendTransform(tf::StampedTransform(transform, poseMsg.header.stamp, "map", "base_link")); - Pose userdef_pose(poseMsg.pose.position.x, poseMsg.pose.position.y, tf::getYaw(poseMsg.pose.orientation)); - m_HyperSlamFilter->setRobotPose( userdef_pose, m_ScatterVarXY, m_ScatterVarTheta ); - -// sendMapDataMessage(); -} - -void SlamNode::callbackResetHigh(const std_msgs::Empty::ConstPtr& msg) -{ - m_HyperSlamFilter->resetHigh(); -} - - -void SlamNode::sendMapDataMessage(ros::Time mapTime) -{ - std::vector<int8_t> mapData; - int width, height; - float resolution; - - OccupancyMap* occMap = m_HyperSlamFilter->getBestSlamFilter()->getLikeliestMap(); - occMap->getOccupancyProbabilityImage (mapData, width, height, resolution); - - if ( width != height ) - { - ROS_ERROR_STREAM("ERROR: Map is not quadratic! can not send map!"); - } - else - { - nav_msgs::OccupancyGrid mapMsg; - std_msgs::Header header; - header.stamp = mapTime; - header.frame_id = "map"; - mapMsg.header = header; - nav_msgs::MapMetaData mapMetaData; - mapMetaData.width = width; - mapMetaData.height = height; - mapMetaData.resolution = resolution; - mapMetaData.origin.position.x = -height*resolution/2; - mapMetaData.origin.position.y = -width*resolution/2; - mapMetaData.origin.orientation.w = 1.0; - mapMetaData.origin.orientation.x = 0.0; - mapMetaData.origin.orientation.y = 0.0; - mapMetaData.origin.orientation.z = 0.0; - mapMsg.info = mapMetaData; - mapMsg.data = mapData; - - m_SLAMMapPublisher.publish(mapMsg); - } -} - -void SlamNode::callbackUserDefPose( const geometry_msgs::Pose::ConstPtr& msg ) -{ - Pose userdef_pose(msg->position.x, msg->position.y, tf::getYaw(msg->orientation)); - m_HyperSlamFilter->setRobotPose( userdef_pose, m_ScatterVarXY, m_ScatterVarTheta ); -} - -void SlamNode::callbackInitialPose(const geometry_msgs::PoseWithCovarianceStamped::ConstPtr& msg) -{ - Pose userdef_pose(msg->pose.pose.position.x, msg->pose.pose.position.y, tf::getYaw(msg->pose.pose.orientation)); - m_HyperSlamFilter->setRobotPose( userdef_pose, m_ScatterVarXY, m_ScatterVarTheta ); -} - -void SlamNode::callbackLaserScan(const sensor_msgs::LaserScan::ConstPtr& msg) -{ - m_laser_queue.push_back(msg); - if(m_laser_queue.size() > 5) //Todo param - { - m_laser_queue.erase(m_laser_queue.begin()); - } -} - -void SlamNode::callbackOdometry( const nav_msgs::Odometry::ConstPtr& msg) -{ - m_odom_queue.push_back(msg); - static int last_i = 0; - if(m_odom_queue.size() > 5) //Todo param - { - last_i--; - if(last_i < 0) - { - last_i = 0; - } - m_odom_queue.erase(m_odom_queue.begin()); - } - - static Pose last_interpolatedPose(0.0, 0.0, 0.0); - ros::Time currentOdometryTime = msg->header.stamp; - if( ( ros::Time::now() - m_LastMappingTime > m_WaitDuration ) && m_odom_queue.size() > 1 && m_laser_queue.size() > 0) - { - int i, j; - bool got_match = false; - - for( i = m_odom_queue.size()-1; i > 0 ; i--) - { - //Check if we would repeat a calculation which is already done but still in the queue - if(m_odom_queue.at(i-1)->header.stamp == m_ReferenceOdometryTime) - { - break; - } - - for(j = m_laser_queue.size()-1; j > -1; j--) - { - // find a laserscan in between two odometry readings (or at the same time) - if( - (m_laser_queue.at(j)->header.stamp >= m_odom_queue.at(i-1)->header.stamp) - && - (m_odom_queue.at(i)->header.stamp >= m_laser_queue.at(j)->header.stamp) - ) - { - got_match = true; - break; - } - } - if(got_match) - { - break; - } - } - - if(got_match) - { - last_i = i; - m_LastLaserData = m_laser_queue.at(j); - m_LastMappingTime = m_LastLaserData->header.stamp; - - float odoX = m_odom_queue.at(i)->pose.pose.position.x; - float odoY = m_odom_queue.at(i)->pose.pose.position.y; - float odoTheta = tf::getYaw(m_odom_queue.at(i)->pose.pose.orientation); - Pose currentOdometryPose ( odoX, odoY, odoTheta ); - currentOdometryTime = m_odom_queue.at(i)->header.stamp; - - odoX = m_odom_queue.at(i-1)->pose.pose.position.x; - odoY = m_odom_queue.at(i-1)->pose.pose.position.y; - odoTheta = tf::getYaw(m_odom_queue.at(i-1)->pose.pose.orientation); - Pose lastOdometryPose ( odoX, odoY, odoTheta ); - m_ReferenceOdometryPose = lastOdometryPose; - m_ReferenceOdometryTime = m_odom_queue.at(i-1)->header.stamp; - - - ros::Time startTime = ros::Time::now(); - // laserscan in between current odometry reading and m_ReferenceOdometry - // -> calculate pose of robot during laser scan - ros::Duration d1 = m_LastLaserData->header.stamp - m_ReferenceOdometryTime; - ros::Duration d2 = currentOdometryTime - m_ReferenceOdometryTime; - - float timeFactor; - if(d1.toSec() == 0.0) - { - timeFactor = 0.0f; - } - else if(d2.toSec() == 0.0) - { - timeFactor = 1.0f; - } - else - { - timeFactor = d1.toSec() / d2.toSec(); - } - ros::Duration duration = ros::Duration(0); - - last_interpolatedPose = m_ReferenceOdometryPose.interpolate ( currentOdometryPose, timeFactor ); - m_HyperSlamFilter->filter( last_interpolatedPose, m_LastLaserData, m_LastLaserData->header.stamp, duration); - ros::Time finishTime = ros::Time::now(); - - m_LastLikeliestPose = m_HyperSlamFilter->getBestSlamFilter()->getLikeliestPose(m_LastLaserData->header.stamp); - - //TODO löschen - m_LastPositionSendTime = m_LastLaserData->header.stamp; - // send map max. every 500 ms - if ( (m_LastLaserData->header.stamp - m_LastMapSendTime).toSec() > 0.5 ) - { - sendMapDataMessage(m_LastLaserData->header.stamp); - m_LastMapSendTime = m_LastLaserData->header.stamp; - } - - ROS_DEBUG_STREAM("Pos. data calc time: " << (finishTime - startTime).toSec() << "s" ); - ROS_DEBUG_STREAM("Map send Interval: " << ( finishTime - m_LastPositionSendTime ).toSec() << "s" ); - } - } - Pose currentPose = m_LastLikeliestPose; - //currentPose.setX(currentPose.x() - last_interpolatedPose.x()); - //currentPose.setY(currentPose.y() - last_interpolatedPose.y()); - //currentPose.setTheta(currentPose.theta() - last_interpolatedPose.theta()); - for(int i = (last_i-1<0?0:last_i-1); i < m_odom_queue.size(); i++) - { - currentPose.setX(currentPose.x() + m_odom_queue.at(i)->twist.twist.linear.x); - currentPose.setY(currentPose.y() + m_odom_queue.at(i)->twist.twist.linear.y); - currentPose.setTheta(currentPose.theta() + m_odom_queue.at(i)->twist.twist.angular.z); - } - - geometry_msgs::PoseStamped poseMsg; - //header - poseMsg.header.stamp = msg->header.stamp; - poseMsg.header.frame_id = "map"; - - //position and orientation - poseMsg.pose.position.x = currentPose.x(); - poseMsg.pose.position.y = currentPose.y(); - poseMsg.pose.position.z = 0.0; - tf::Quaternion quatTF = tf::createQuaternionFromYaw(currentPose.theta()); - geometry_msgs::Quaternion quatMsg; - tf::quaternionTFToMsg(quatTF, quatMsg); //conversion from tf::Quaternion to geometry_msgs::Quaternion - poseMsg.pose.orientation = quatMsg; - m_PoseStampedPublisher.publish(poseMsg); - //broadcast transform map -> base_link - //tf::Transform transform(quatTF,tf::Vector3(currentPose.x(), currentPose.y(), 0.0)); - //m_tfBroadcaster.sendTransform(tf::StampedTransform(transform, msg->header.stamp, "map", "base_link")); -} - -void SlamNode::callbackDoMapping(const std_msgs::Bool::ConstPtr &msg) -{ - m_DoMapping = msg->data; - m_HyperSlamFilter->setMapping ( m_DoMapping ); - ROS_INFO_STREAM( "Do mapping is set to " << ( m_DoMapping ) ); -} - -void SlamNode::callbackResetMap(const std_msgs::Empty::ConstPtr &msg) -{ - resetMaps(); -} - -void SlamNode::callbackLoadedMap(const nav_msgs::OccupancyGrid::ConstPtr &msg) -{ - float res = msg->info.resolution; - int height = msg->info.height; // cell size - int width = msg->info.width; //cell size - if(height!=width) { - ROS_ERROR("Height != width in loaded map"); - return; - } - - //convert map vector from ros format to robbie probability array - float* map = new float[msg->data.size()]; - //generate exploredRegion - int minX = INT_MIN; - int minY = INT_MIN; - int maxX = INT_MAX; - int maxY = INT_MAX; - for(size_t y = 0; y < msg->info.height; y++) - { - int yOffset = msg->info.width * y; - for(size_t x = 0; x < msg->info.width; x++) - { - int i = yOffset + x; - if(msg->data[i] == -1 ) - map[i] = 0.5; - else - map[i] = msg->data[i]/100.0; - - if(map[i]!=0.5) { - if(minX==INT_MIN || minX > (int)x) - minX = (int)x; - if(minY==INT_MIN || minY > (int)y) - minY = (int)y; - if(maxX==INT_MAX || maxX < (int)x) - maxX = (int)x; - if(maxY==INT_MAX || maxY < (int)y) - maxY = (int)y; - } - } - } - Box2D<int> exploredRegion = Box2D<int> ( minX, minY, maxX, maxY ); - OccupancyMap* occMap = new OccupancyMap(map, msg->info.origin, res, width, exploredRegion); - m_HyperSlamFilter->setOccupancyMap( occMap ); - m_HyperSlamFilter->setMapping( false ); //is this already done by gui message? - ROS_INFO_STREAM( "Replacing occupancy map" ); -} - -void SlamNode::callbackMasking(const nav_msgs::OccupancyGrid::ConstPtr &msg) -{ - m_HyperSlamFilter->applyMasking(msg); -} - -/** - * @brief main function - */ -int main(int argc, char** argv) -{ - ros::init(argc, argv, "homer_mapping"); - ros::NodeHandle nh; - - SlamNode slamNode(&nh); - - ros::Rate loop_rate(50); - ros::spin(); - return 0; -} - diff --git a/homer_nav_libs/CHANGELOG.rst b/homer_nav_libs/CHANGELOG.rst deleted file mode 100644 index df486cd2..00000000 --- a/homer_nav_libs/CHANGELOG.rst +++ /dev/null @@ -1,9 +0,0 @@ -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Changelog for package homer_nav_libs -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -0.1.1 (2016-11-03) ------------------- -* fixes -* initial commit -* Contributors: Niklas Yann Wettengel diff --git a/homer_nav_libs/CMakeLists.txt b/homer_nav_libs/CMakeLists.txt deleted file mode 100644 index c3682171..00000000 --- a/homer_nav_libs/CMakeLists.txt +++ /dev/null @@ -1,44 +0,0 @@ -cmake_minimum_required(VERSION 2.8.3) -project(homer_nav_libs) - -find_package(catkin REQUIRED COMPONENTS - roscpp - geometry_msgs - sensor_msgs - tf - cmake_modules -) - -find_package(Eigen3 REQUIRED) - -catkin_package( - INCLUDE_DIRS include - LIBRARIES homerExplorer homerMappingMath - CATKIN_DEPENDS roscpp geometry_msgs tf - DEPENDS Eigen3) - - -include_directories( - include - ${catkin_INCLUDE_DIRS} - ${EIGEN3_INCLUDE_DIRS} -) - -add_library(homerExplorer src/Explorer/Explorer.cpp) -add_library(homerMappingMath - src/Math/Line2D.cpp - src/Math/Transformation2D.cpp - src/Math/Pose.cpp - src/Math/Math.cpp - src/Math/Point2D.cpp -) - -install(DIRECTORY include/${PROJECT_NAME}/ - DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} -) - -install(TARGETS homerExplorer homerMappingMath - ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} - LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} - RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} -) diff --git a/homer_nav_libs/README.md b/homer_nav_libs/README.md deleted file mode 100644 index 4c31e40e..00000000 --- a/homer_nav_libs/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# nav_libs - -## Known Issues / Todo's - -Im Package nav_libs ist eine Kopie der Robbie-Bibliothek Math, umbenannt in MappingMath, die nur von homer_mapping benutzt werden soll, solange es keine vernünftige Alternative für die Pose gibt. - -## Introduction - -Das Package nav_libs enthält einige Bibliotheken, die vom Package homer_mapping und nav_libs verwendet werden. Außerdem enthält es im Ordner tools die Header-Datei tools.h, die Funktionen zum Transformieren in verschiedene Koordinatenframes enthält. All diese Funktionen befinden sich im namespace "map_tools". - -* Die Bibliothek `Explorer` wird von homer_mapping und homer_navigation verwendet und enthält die Pfadplanungsalgorithmen A-Stern sowie die dafür benötigte Datenstruktur der GridMap. -* Die Bibliothek `SpeedControl` wird von homer_navigation verwendet und ist dafür zuständig abhängig von den aktuellen Laserdaten die höchstzulässige Geschwindigkeit zu berechnen. -* Die Bibliothek `MappingMath` wird von homer_mapping verwendet und enthält die Datenstruktur Pose, in der die aktuelle Roboterposition innerhalb der Node gespeichert wird. diff --git a/homer_nav_libs/include/homer_nav_libs/Explorer/Explorer.h b/homer_nav_libs/include/homer_nav_libs/Explorer/Explorer.h deleted file mode 100644 index 2d349912..00000000 --- a/homer_nav_libs/include/homer_nav_libs/Explorer/Explorer.h +++ /dev/null @@ -1,359 +0,0 @@ -#ifndef EXPLORER_H -#define EXPLORER_H - -#include <vector> -#include <cmath> -#include <iostream> -#include <queue> -#include <sstream> -#include <geometry_msgs/Pose.h> - -#include <homer_nav_libs/Explorer/GridMap.h> -#include <homer_nav_libs/tools.h> - -namespace ExplorerConstants -{ - static int8_t UNKNOWN; - static const int8_t NOT_SEEN_YET = -1; - static const double MAX_DISTANCE = DBL_MAX; - static const double MAX_COST = DBL_MAX; - static const int OBSTACLE = INT_MAX; -} - -/** - * @class Explorer - * @author Malte Knauf, Stephan Wirth, David Gossow (RX) - * @brief Path planning & exploration class - * - * Usage: - * - * - Call setOccupancyMap() to set the base map for path finding. - * - Set a start point by calling setStart() - * - * - For path planning: - * +Choose a target by calling setTarget() - * +To correct a target to the nearest approachable position, - * call getNearestAccessibleTarget - * +Call getPathTransformPath() - * - * -For exploration: - * +Call resetExploration() - * +Call getExplorationTransformPath() - * +The calculated target is the last element in the returned path - * - * - Call sampleWaypointsFromPath() to extract waypoints from a calculated path - * - * This class uses a couple of "maps" for computation and storing data: - * - * - m_OccupancyMap stores the occupancy probabilities in double values. A value of 100 means - * totally occupied, 0 totally free. - * - m_ObstacleDistanceMap stores in each cell the distance (one unit = one cell) to the nearest obstacle. - * This map is computed by an eucledian distance transformation from m_OccupancyMap. - * - m_FrontierMap is a bool map which has 1 in frontier cells and 0 in all others. A frontier - * is defined as a free cell that has one of its four direct neighbours in unknown space and is "safe" for - * the robot (m_ObstacleDistanceMap is used for that). - * - m_DrivingDistanceMap is a double map that stores for each cell the distance to m_Start. It is computed - * by a flood-fill (seed-fill) algorithm. The values are therefor only an approximation and not exact. - * m_DrivingDistanceMap is used to search the nearest frontier when requesting an auto target. - * - m_TargetMap is a double map that stores for each cell the distance to m_Target. It is computed - * like m_DrivingDistanceMap. This map is used as heuristic for the A*-Pathfinding algorithm. - * - m_NavigationMap is used to mark the cells that are touched by the A*-Pathfinding algorithm. - * - * - * The coordinate system and units that are used in this class are based on map cells. - * @see GridMap - * - */ -class Explorer -{ - - public: - - /** - * @brief Default constructor. - * @param minAllowedObstacleDistance,maxAllowedObstacleDistance Range of allowed distances to next obstacle [Pixels] - * @param minSafeObstacleDistance,maxSafeObstacleDistance Range of distances to next obstacle considered as safe [Pixels] - * @param safePathWeight Weight for safer path - */ - Explorer ( double minAllowedObstacleDistance, double maxAllowedObstacleDistance, - double minSafeObstacleDistance, double maxSafeObstacleDistance, - double safePathWeight, double frontierSafenessFactor=1.0, int unknownThreshold=50 ); - - /** - * @brief Destructor deletes all dynamically allocated memory used by the maps - */ - ~Explorer(); - - void setUnknownThreshold(int unknownTresh); - void setAllowedObstacleDistance ( double min, double max ); - void setSafeObstacleDistance ( double min, double max ); - void setFrontierSafenessFactor ( double frontierSafenessFactor ); - void setSafePathWeight ( double weight ); - /** - * @brief Copies and sets the occupancy map. - * @param width Width of the map - * @param height Height of the map - * @param origin Real-world pose of the cell (0,0) in the map - * @param data GridMap-data (occupancy probabilities: 0 = free, 100 = occupied) of size width * height - */ - void setOccupancyMap ( int width, int height, geometry_msgs::Pose origin, int8_t* mapData); - - /** only update occupied areas in current occupancy map */ - void updateObstacles ( int width, int height, geometry_msgs::Pose origin, int8_t* mapData ); - - /** - * @brief Sets the start position for the path finding algorithm. - * m_Start is set to the given value. - * If startPixel lies outside the map, m_Start remains untouched. - * @param startPixel Start position for path finding in pixel (map-) coordinates. - */ - void setStart ( Eigen::Vector2i start ); - - /** - * @brief Resets the internal state of the exploration mode. - * Sets m_DesiredDistance to 0, such that getExplorationTransformPath() triggers - * a frontier exploration if there is no prior call of setTarget(point, distance). - * Call this method once before every exploration. - */ - void resetExploration(); - - /** - * Sets the target position for path finding. m_Target is set to the given value. - * If endPixel lies outside of the map, m_Target remains untouched. - * computeTargetDistanceMap() is called at the end of this method. m - * @param targetPixel Target to reach from startPixel - */ - void setTarget ( Eigen::Vector2i targetPixel ); - - /** - * Sets the target region for path finding. m_ExplorationMap is set to the given region. - * If targetPixel lies outside of the map, the exploration map is set empty. - * @param targetPixel Center of the target region to reach from startPixel - * @param radius Radius of the target region in pixels - */ - void setTarget( Eigen::Vector2i targetPixel, int radius ); - - /** - * @brief find the nearest position to target that is approachble from the start position - */ - Eigen::Vector2i getNearestAccessibleTarget ( Eigen::Vector2i target ); - - /** - * @brief find the nearest position to target surpassing the minimum obstacle distance - */ - Eigen::Vector2i getNearestWalkablePoint ( Eigen::Vector2i target ); - - /** - * @brief Returns the map-coordinates of the nearest frontier to m_Start. - * Uses m_DrivingDistanceMap and m_ObstacleDistanceMap. If there is no frontier left, - * nextFrontier remains untouched. - * @param[out] nextFrontier Nearest frontier in map-coordinates. - * @return true if frontier found and stored in nextFrontier, false if no frontier found (nextFrontier - * remains untouched). - */ - bool getNearestFrontier ( Eigen::Vector2i& nextFrontier ); - - /** - * Computes the path from m_Start to m_Target with path transform. - * The result is returned. If the returned vector contains no elements, there is no path. - * @return vector with path points - */ - std::vector<Eigen::Vector2i> getPath( bool &success ); - - /** - * Computes the path from m_Start to the next frontier using exploration transform. - * The result is returned. If the returned vector contains no elements, there is no path. - * @return vector with path points - */ - std::vector<Eigen::Vector2i> getExplorationTransformPath( bool &success ); - - /** - * @brief Returns a version of the path that contains less vertices. - * @note The nearer the next obstacle, the more waypoints are created. - * @param path List of vertices to be simplified - * @param treshold[0..1] a lower threshold results in more waypoints (default:1.0) - * @return Vector of (sampled) waypoints. - */ - std::vector<Eigen::Vector2i> sampleWaypointsFromPath ( std::vector<Eigen::Vector2i> path, float threshold=1.0 ); - - /** - * Getters for the different transforms (see constructor for description) - */ - GridMap<int8_t>* getOccupancyMap(); - GridMap<double>* getObstacleTransform(); - GridMap<double>* getCostTransform(); - GridMap<bool>* getTargetMap(); - GridMap<double>* getDrivingDistanceTransform(); - GridMap<double>* getTargetDistanceTransform(); - GridMap<double>* getPathTransform(); - GridMap<double>* getExplorationTransform(); - - /** - * @return Start position - */ - Eigen::Vector2i getStart() const; - - /** - * @return Target position - */ - Eigen::Vector2i getTarget() const; - - private: - - /** @brief Delete the given map and set pointer to 0 */ - template <class T> - void releaseMap ( GridMap<T>*& map ) - { - if ( map ) - { - delete map; - map=0; - } - } - - /** @brief Delete and re-create given map */ - template <class T> - void resetMap ( GridMap<T>*& map ) - { - if ( !m_OccupancyMap ) - { - ROS_ERROR ( "Occupancy map is missing." ); - return; - } - releaseMap ( map ); - map = new GridMap<T> ( m_OccupancyMap->width(), m_OccupancyMap->height() ); - } - - /** - * @return true if the robot can stand on the given position without touching an obstacle, false otherwise - * @warning Call computeWalkableMaps before - */ - inline bool isWalkable ( int x, int y ) const - { - return ( ( m_OccupancyMap->getValue ( x, y ) <= ExplorerConstants::UNKNOWN ) && - ( m_ObstacleTransform->getValue ( x, y ) > m_MinAllowedObstacleDistance ) ); - } - - /** - * @return true if point is approachable from the current start position, false otherwise. - * @warning m_OccupancyMap, m_ObstacleTransform and m_DrivingDistanceTransform have to be present! - * @warning Call computeApproachableMaps before - */ - inline bool isApproachable ( int x, int y ) const - { - return ( m_DrivingDistanceTransform->getValue ( x, y ) < ExplorerConstants::MAX_DISTANCE ); - } - - /** @brief Releases all memory of the member maps */ - void releaseMaps(); - - /** - * @brief Helper function for computeDistanceTransformation. - * @param f 1D-Array for distance transformation - * @param n Number of elements in f - * @return Distance transformation of f - */ - double* distanceTransform1D ( double *f, int n ); - - /** - * @brief Fills the given map from given start point with distance values to this point. - * The filling will only be performed on cells that are marked as free in m_OccupancyMap and - * that have an obstacle distance value between m_MinimumObstacleDistance and m_MaximumObstacleDistance. - * The map that is passed as argument will be fully overwritten by this function. - * @param map GridMap to fill - * @param start Start point for the fill algorithm - */ - void distanceFloodFill ( GridMap<double>* map, Eigen::Vector2i start ); - - /** @brief Compute map needed for path calculation */ - void computePathTransform(); - - /** @brief Compute map needed for exploration path calculation */ - void computeExplorationTransform(); - - /** @brief Compute the distances to the next obstacle with eucledian distance transform from m_OccupancyMap. */ - void computeObstacleTransform(); - - /** @brief Compute cost function based on obstacle transform */ - void computeCostTransform(); - - /** @brief Compute the frontiers between free and unknown space. Depends on OccupancyMap and ObstacleTransform. */ - void computeFrontierMap(); - - /** @brief Compute the target region (a circle of radius m_DesiredDistance around m_Target). */ - void computeRegionMap(); - - /** @brief Compute the target map, which is either a frontier map or a region map. */ - void computeTargetMap(); - - /** @brief Compute a map of driving distances from the start point */ - void computeDrivingDistanceTransform(); - - /** @brief Compute a map of driving distances to the target point */ - void computeTargetDistanceTransform(); - - /** @brief Compute maps needed for isWalkable */ - void computeWalkableMaps(); - - /** @brief Compute maps needed for isApproachable */ - void computeApproachableMaps(); - - /** @brief Start point for the way search algorithm. */ - Eigen::Vector2i m_Start; - - /** @brief Target for the way search algorithm */ - Eigen::Vector2i m_Target; - - /** @brief Desired distance to target in pixels */ - int m_DesiredDistance; - - /** @brief Occupancy map */ - GridMap<int8_t>* m_OccupancyMap; - - /** @see computeObstacleTransform */ - GridMap<double>* m_ObstacleTransform; - - /** @see computeCostTransform */ - GridMap<double>* m_CostTransform; - - /** @see computeTargetMap */ - GridMap<bool>* m_TargetMap; - - /** computeDrivingDistanceTransform */ - GridMap<double>* m_DrivingDistanceTransform; - - /** @see computeTargetDistanceTransform */ - GridMap<double>* m_TargetDistanceTransform; - - /** @see computePathTransform */ - GridMap<double>* m_PathTransform; - - /** @see computeExplorationTransform */ - GridMap<double>* m_ExplorationTransform; - - /** @see constructor */ - double m_MinAllowedObstacleDistance; - double m_MaxAllowedObstacleDistance; - - double m_MinSafeObstacleDistance; - double m_MaxSafeObstacleDistance; - - /** - * Weight for safer path - */ - double m_SafePathWeight; - - /** - * Factor for minObstacleDistance that determines if a frontier pixel is valid - */ - double m_FrontierSafenessFactor; - - /** - * Real-world pose of the point (0,0) in the map - */ - geometry_msgs::Pose m_Origin; - -}; - -#endif - diff --git a/homer_nav_libs/include/homer_nav_libs/Explorer/GridMap.h b/homer_nav_libs/include/homer_nav_libs/Explorer/GridMap.h deleted file mode 100644 index 64b3469e..00000000 --- a/homer_nav_libs/include/homer_nav_libs/Explorer/GridMap.h +++ /dev/null @@ -1,575 +0,0 @@ -#ifndef GridMap_H -#define GridMap_H - -#include <float.h> -#include <iostream> -#include <sstream> - -#include "ros/ros.h" - -#include <Eigen/Geometry> - -#define GRIDMAP_SAFE_ACCESS - -/** - * @class GridMap - * @author Malte Knauf, Stephan Wirth, David Gossow (RX) - * @brief GridMap data structure. Implemeted as template class. The template type - * defines the data type of each map cell. - */ - -template<class DataT> -class GridMap -{ - - public: - - /// Initialize empty map - GridMap(); - - /** - * @param width Width of the map. - * @param height Height of the map. - * @param data Pointer to map data, must be of size width*height. - * @param copyData if true, the map data will be copied - * if false, GridMap takes ownership of the pointer - * @param cellSize physical size of each map cell [m] - * @param centerX,centerY center of the map in world coordinates - */ - GridMap ( int width, int height, DataT* data = 0, bool copyData = true, float cellSize = 1, float centerX = 0, float centerY = 0 ); - - /// Copy data from given region - GridMap ( int width, int height, DataT* data, Eigen::AlignedBox2i extractRegion ); - - /// Copy data from given map - GridMap<DataT> ( const GridMap<DataT>& other ) { m_Data=0; *this = other; } - - /// Copy data from given map - GridMap<DataT>& operator= ( const GridMap<DataT>& other ); - - ~GridMap(); - - /// Convert map coordinates to world coordinates - void mapToWorld ( int mapX, int mapY, float& worldX, float& worldY ); - - /// Convert world coordinates to map coordinates - void worldToMap ( float worldX, float worldY, int& mapX, int& mapY ); - - /// @brief set value at given position - inline void setValue ( int x, int y, DataT val ); - - /// @brief replace content with given value - void fill ( DataT val ); - - /// @brief Draw a filled polygon into the map (world coords) - void drawPolygon ( std::vector<Eigen::Vector2d> vertices, DataT value ); - - /// @brief Draw a filled circle into the map (world coords) - void drawCircle( Eigen::Vector2d center, float radius, DataT value ); - - /// @return Value at the given position. - inline DataT getValue ( int x, int y ) const; - - /// @return Pointer to given pixel - inline DataT* getDirectAccess ( int x, int y ); - - /// @return width in grid cells - int width() const { return m_Width; } - - /// @return height in grid cells - int height() const { return m_Height; } - - /// @return center of the map in world coordinates - Eigen::Vector2d center() const {return Eigen::Vector2d(m_CenterX,m_CenterY);} - - /// @return side length of one cell in mm - float cellSize() { return m_CellSize; } - - private: - - void drawLine ( DataT *data, int startX, int startY, int endX, int endY, DataT value ); - void fillPolygon ( DataT* data, int x, int y, char value ); - - int m_Width; - int m_Height; - int m_DataSize; - DataT* m_Data; - float m_CellSize; - float m_CenterX; - float m_CenterY; -}; - - -template<class DataT> -GridMap<DataT>::GridMap() -{ - m_Width = 0; - m_Height = 0; - m_DataSize = 0; - m_Data = 0; - m_CellSize = 0; - m_CenterX = 0; - m_CenterY = 0; -} - -template<class DataT> -GridMap<DataT>::GridMap ( int width, int height, DataT* data, bool copyData, float cellSize, float centerX, float centerY ) -{ - m_Width = width; - m_Height = height; - m_CellSize = cellSize; - m_DataSize = width * height; - m_CenterX = centerX; - m_CenterY = centerY; - m_Data = 0; - - if ( data ) - { - if ( copyData ) - { - m_Data = new DataT[m_DataSize]; - - for ( int i = 0; i < m_DataSize; i++ ) - { - m_Data[i] = data[i]; - } - } - else - { - m_Data = data; - } - } - else - { - m_Data = new DataT[m_DataSize]; - - for ( int i = 0; i < m_DataSize; i++ ) - { - m_Data[i] = 0; - } - } -} - -template<class DataT> -GridMap<DataT>::GridMap (int width, int height, DataT* data, Eigen::AlignedBox2i extractRegion ) -{ - m_Width = extractRegion.sizes().x(); - m_Height = extractRegion.sizes().y(); - m_DataSize = m_Width * m_Height; - m_Data = new DataT[m_DataSize]; - m_CellSize = 1; - m_CenterX = 0; - m_CenterY = 0; - - for ( int y = extractRegion.min().y(); y <= extractRegion.max().y(); y++ ) - { - int yOffset = m_Width * y; - - for ( int x = extractRegion.min().x(); x <= extractRegion.max().x(); x++ ) - { - int i = x + yOffset; - m_Data[i] = data[i]; - } - } -} - - -template<class DataT> -inline DataT* GridMap<DataT>::getDirectAccess ( int x, int y ) -{ -#ifdef GRIDMAP_SAFE_ACCESS - if ( x >= 0 && x < m_Width && y >= 0 && y < m_Height ) - { - return &m_Data[y * m_Width + x]; - } - else - { - throw; - } -#else - return &m_Data[y * m_Width + x]; -#endif -} - - -template<class DataT> -GridMap<DataT>& GridMap<DataT>::operator= ( const GridMap<DataT>& other ) -{ - delete[] m_Data; - m_Width = other.m_Width; - m_Height = other.m_Height; - m_DataSize = other.m_DataSize; - m_Data = new DataT[m_DataSize]; - memcpy ( m_Data, other.m_Data, sizeof ( DataT ) *m_DataSize ); - m_CellSize = other.m_CellSize; - m_CenterX = other.m_CenterX; - m_CenterY = other.m_CenterY; - return *this; -} -/* TODO -template<class DataT> -GridMap<DataT>::GridMap ( ExtendedInStream& strm ) -{ - short version; - strm >> version; - strm >> m_Width; - strm >> m_Height; - strm >> m_CellSize; - strm >> m_CenterX; - strm >> m_CenterY; - m_DataSize = m_Width * m_Height; - m_Data = new DataT[m_DataSize]; - strm.get ( m_Data, m_DataSize ); -} -*/ -template<class DataT> -GridMap<DataT>::~GridMap() -{ - if ( m_Data ) - { - delete m_Data; - m_Data = 0; - } -} -/* -template<class DataT> -void GridMap<DataT>::storer ( ExtendedOutStream& strm ) const -{ - strm << short ( 12 ); - strm << m_Width; - strm << m_Height; - strm << m_CellSize; - strm << m_CenterX; - strm << m_CenterY; - strm.put ( m_Data, m_DataSize ); -} -*/ - -template<class DataT> -void GridMap<DataT>::mapToWorld ( int mapX, int mapY, float& worldX, float& worldY ) -{ - worldX = m_CenterX + m_CellSize * ( mapX - m_Width / 2 ); - worldY = m_CenterY + m_CellSize * ( mapY - m_Height / 2 ); -} - -template<class DataT> -void GridMap<DataT>::worldToMap ( float worldX, float worldY, int& mapX, int& mapY ) -{ - mapX = float ( m_Width ) / 2.0 - ( ( worldY - m_CenterY ) / m_CellSize + 0.5 ); - mapY = float ( m_Height ) / 2.0 - ( ( worldX - m_CenterX ) / m_CellSize + 0.5 ); - - if ( mapX < 0 || mapX >= m_Width || mapY < 0 || mapY >= m_Height ) - { - //ROS_WARN_STREAM ( "Index out of bounds: " << mapX << "," << mapY ); //TODO - - if ( mapX < 0 ) - { - mapX = 0; - } - - if ( mapX >= m_Width ) - { - mapX = m_Width - 1; - } - - if ( mapY < 0 ) - { - mapY = 0; - } - - if ( mapY >= m_Height ) - { - mapY = m_Height - 1; - } - } -} - - -template<class DataT> -inline void GridMap<DataT>::setValue ( int x, int y, DataT val ) -{ -#ifdef GRIDMAP_SAFE_ACCESS - if ( x >= 0 && x < m_Width && y >= 0 && y < m_Height ) - { - m_Data[y * m_Width + x] = val; - } - else - { - throw; - } -#else - m_Data[y * m_Width + x] = val; -#endif -} - -template<class DataT> -inline DataT GridMap<DataT>::getValue ( int x, int y ) const -{ -#ifdef GRIDMAP_SAFE_ACCESS - if ( x >= 0 && x < m_Width && y >= 0 && y < m_Height ) - { - return m_Data[y * m_Width + x]; - } - else - { - ROS_ERROR_STREAM( "Accessing map pixels " << x << "," << y << ": out of bounds (0,0," << m_Width-1 << "," << m_Height-1 << ")" ); //TODO - throw; - } -#else - return m_Data[y * m_Width + x]; -#endif -} - -template<class DataT> -void GridMap<DataT>::fill ( DataT val ) -{ - for ( int i = 0; i < m_DataSize; i++ ) - { - m_Data[i] = val; - } -} - -/* TODO do we need image representation? -template<class DataT> -puma2::ColorImageRGB8* GridMap<DataT>::getImage ( DataT specialValue, DataT clipRangeLow, DataT clipRangeHigh ) -{ - puma2::ColorImageRGB8* image = new puma2::ColorImageRGB8 ( m_Width, m_Height ); - double maxVal = 0.0001; - double minVal = 0.0; - - for ( int i = 0; i < m_DataSize; i++ ) - { - if ( ( m_Data[i] < minVal ) && ( m_Data[i] != specialValue ) ) - { - minVal = m_Data[i]; - } - - if ( ( m_Data[i] > maxVal ) && ( m_Data[i] != specialValue ) ) - { - maxVal = m_Data[i]; - } - } - - std::ostringstream stream; - - stream << " Min: " << minVal << "Max: " << maxVal; - stream << " ClipMin: " << double ( clipRangeLow ) << " ClipMax: " << double ( clipRangeHigh ); - ROS_DEBUG_STREAM ( stream.str() ); //TODO: was TRACE_SYSTEMINFO - - if ( maxVal > clipRangeHigh ) - { - maxVal = clipRangeHigh; - } - - if ( minVal < clipRangeLow ) - { - minVal = clipRangeLow; - } - - double range = maxVal - minVal; - - puma2::ColorImageRGB8::PixelType* imageData; - imageData = image->unsafeRowPointerArray() [0]; - - for ( int i = 0; i < m_DataSize; i++ ) - { - DataT currentValue = m_Data[i]; - - if ( currentValue == specialValue ) - { - imageData[i][0] = 40; - imageData[i][1] = 220; - imageData[i][2] = 120; - continue; - } - - if ( currentValue > clipRangeHigh ) - { - imageData[i][0] = 200; - imageData[i][1] = 200; - imageData[i][2] = 128; - continue; - } - - if ( currentValue < clipRangeLow ) - { - imageData[i][0] = 40; - imageData[i][1] = 40; - imageData[i][2] = 180; - continue; - } - - double valueDouble = ( ( double ) ( currentValue - minVal ) ) / range; - - unsigned char value = ( unsigned char ) ( valueDouble * 255 ); - - imageData[i][0] = value; - imageData[i][1] = value; - imageData[i][2] = value; - } - - return image; -} -*/ - - - -template<class DataT> -void GridMap<DataT>::drawCircle(Eigen::Vector2d center, float radius, DataT value ) -{ - int centerMapX,centerMapY; - worldToMap( center.x(), center.y(), centerMapX, centerMapY ); - - int radiusCells = radius / m_CellSize; - int radiusCells2 = radiusCells*radiusCells; - - Eigen::AlignedBox2i bBox( Eigen::Vector2i(centerMapX - radiusCells, centerMapY - radiusCells), Eigen::Vector2i(centerMapX + radiusCells, centerMapY + radiusCells) ); - Eigen::AlignedBox2i bBoxGrid( Eigen::Vector2i(0,0), Eigen::Vector2i(m_Width-1,m_Height-1) ); - bBox.clamp( bBoxGrid ); - - for ( int y = bBox.min().y(); y <= bBox.max().y(); y++ ) - { - for ( int x = bBox.min().x(); x <= bBox.max().x(); x++ ) - { - int xC = x-centerMapX; - int yC = y-centerMapY; - if ( xC*xC+yC*yC <= radiusCells2 ) - { - setValue( x, y, value ); - } - } - } -} - - -template<class DataT> -void GridMap<DataT>::drawPolygon (std::vector<Eigen::Vector2d> vertices, DataT value ) -{ - if ( vertices.size() == 0 ) - { - ROS_INFO( "No vertices given!" ); - return; - } - //make temp. map - DataT* data = new DataT[ m_DataSize ]; - for ( int i = 0; i < m_DataSize; i++ ) - { - data[i] = 0; - } - - //draw the lines surrounding the polygon - for ( unsigned int i = 0; i < vertices.size(); i++ ) - { - int i2 = ( i+1 ) % vertices.size(); - int startX,startY,endX,endY; - worldToMap( vertices[i].x(), vertices[i].y(), startX, startY ); - worldToMap( vertices[i2].x(), vertices[i2].y(), endX, endY ); - drawLine ( data, startX, startY, endX, endY, 1 ); - } - //claculate a point in the middle of the polygon - float midX = 0; - float midY = 0; - for ( unsigned int i = 0; i < vertices.size(); i++ ) - { - midX += vertices[i].x(); - midY += vertices[i].y(); - } - midX /= vertices.size(); - midY /= vertices.size(); - int midMapX,midMapY; - worldToMap( midX, midY, midMapX, midMapY ); - //fill polygon - fillPolygon ( data, midMapX, midMapY, 1 ); - - //copy polygon to map - for ( int i = 0; i < m_DataSize; i++ ) - { - if ( data[i] != 0 ) - { - m_Data[i] = value; - } - } - - delete[] data; -} - -template<class DataT> -void GridMap<DataT>::fillPolygon ( DataT* data, int x, int y, char value ) -{ - int index = x + m_Width * y; - if ( value != data[index] ) - { - data[index] = value; - fillPolygon ( data, x + 1, y, value ); - fillPolygon ( data, x - 1, y, value ); - fillPolygon ( data, x, y + 1, value ); - fillPolygon ( data, x, y - 1, value ); - } -} - - -template<class DataT> -void GridMap<DataT>::drawLine ( DataT *data, int startX, int startY, int endX, int endY, DataT value ) -{ - //bresenham algorithm - int x, y, t, dist, xerr, yerr, dx, dy, incx, incy; - // compute distances - dx = endX - startX; - dy = endY - startY; - - // compute increment - if ( dx < 0 ) - { - incx = -1; - dx = -dx; - } - else - { - incx = dx ? 1 : 0; - } - - if ( dy < 0 ) - { - incy = -1; - dy = -dy; - } - else - { - incy = dy ? 1 : 0; - } - - // which distance is greater? - dist = ( dx > dy ) ? dx : dy; - // initializing - x = startX; - y = startY; - xerr = dx; - yerr = dy; - - // compute cells - for ( t = 0; t < dist; t++ ) - { - data[x + m_Width * y] = value; - - xerr += dx; - yerr += dy; - if ( xerr > dist ) - { - xerr -= dist; - x += incx; - } - if ( yerr > dist ) - { - yerr -= dist; - y += incy; - } - } -} - - - -#endif - -#ifdef GRIDMAP_SAFE_ACCESS -#undef GRIDMAP_SAFE_ACCESS -#endif diff --git a/homer_nav_libs/include/homer_nav_libs/Math/Box2D.h b/homer_nav_libs/include/homer_nav_libs/Math/Box2D.h deleted file mode 100644 index fc6a5478..00000000 --- a/homer_nav_libs/include/homer_nav_libs/Math/Box2D.h +++ /dev/null @@ -1,184 +0,0 @@ -/******************************************************************************* - * Box2D.h - * - * (C) 2008 AG Aktives Sehen <agas@uni-koblenz.de> - * Universitaet Koblenz-Landau - * - * Additional information: - * $Id: Box2D.h 44313 2011-04-06 22:46:28Z agas $ - *******************************************************************************/ - -#ifndef Box2D_H -#define Box2D_H - -#include <homer_nav_libs/Math/Point2D.h> -#include <vector> - -/** - * @class Box2D - * @author David Gossow (RX) - * @brief Represents a box given by the upper-left and lower-right corner - */ -template<class T=float> -class Box2D -{ - - public: - - /** @brief Creates a box given by top-left (minX,minY) and lower-right (maxX,maxY) coordinates */ - Box2D(T minX=0, T minY=0, T maxX=0, T maxY=0); - - /** @brief The destructor */ - ~Box2D() {}; - - inline void setMinX(T value) { m_MinX=value; } - inline void setMaxX(T value) { m_MaxX=value; } - inline void setMinY(T value) { m_MinY=value; } - inline void setMaxY(T value) { m_MaxY=value; } - - inline T minX() const { return m_MinX; } - inline T maxX() const { return m_MaxX; } - inline T minY() const { return m_MinY; } - inline T maxY() const { return m_MaxY; } - - inline T width() const { return m_MaxX-m_MinX; } - inline T height() const { return m_MaxY-m_MinY; } - - std::vector< Point2D > vertices(); - - /** @brief Clip the box to fit into clipArea */ - void clip( Box2D<T> clipArea ); - - /** @return true if the given point is inside the box */ - bool contains( T x, T y ); - - /** @brief enlarge the box by 'size' units in all directions */ - void expand( T size ); - - /** @brief shrink the box by 'size' units in all directions */ - void shrink( T size ); - - /** @brief expand the box so that it contains the given point */ - void enclose( Point2D point ); - void enclose( T x, T y ); - - template<class OtherT> - void enclose( Box2D<OtherT> box ); - - Point2D centerPoint() - { - Point2D center; - center.setX(m_MinX + ( (m_MaxX - m_MinX) / 2 ) ); - center.setY(m_MinY + ( (m_MaxY - m_MinY) / 2 ) ); - return center; - } - - /** @brief area covered by the box */ - T area(); - - Box2D<T>& operator/= ( T div ) { m_MinX/=div; m_MinY/=div; m_MaxX/=div; m_MaxY/=div; return *this; } - Box2D<T>& operator*= ( T div ) { m_MinX*=div; m_MinY*=div; m_MaxX*=div; m_MaxY*=div; return *this; } - - private: - - T m_MinX; - T m_MaxX; - T m_MinY; - T m_MaxY; - -}; - -template<class T> -Box2D<T>::Box2D(T minX, T minY, T maxX, T maxY) -{ - m_MinX=minX; - m_MinY=minY; - m_MaxX=maxX; - m_MaxY=maxY; -} - -template<class T> -void Box2D<T>::clip( Box2D<T> clipArea ) -{ - if (m_MinX < clipArea.minX()) { m_MinX=clipArea.minX(); } - if (m_MinY < clipArea.minY()) { m_MinY=clipArea.minY(); } - if (m_MaxX > clipArea.maxX()) { m_MaxX=clipArea.maxX(); } - if (m_MaxY > clipArea.maxY()) { m_MaxY=clipArea.maxY(); } -} - -template<class T> -bool Box2D<T>::contains( T x, T y ) -{ - return ( (x>=m_MinX) && (x<=m_MaxX) && (y>=m_MinY) && (y<=m_MaxY) ); -} - -template<class T> - void Box2D<T>::expand( T size ) -{ - m_MinX-=size; - m_MaxX+=size; - m_MinY-=size; - m_MaxY+=size; -} - -template<class T> -void Box2D<T>::shrink( T size ) -{ - m_MinX+=size; - m_MaxX-=size; - m_MinY+=size; - m_MaxY-=size; -} - -template<class T> -T Box2D<T>::area() -{ - T width = m_MaxX - m_MinX; - T height = m_MaxY - m_MinY; - - T capacity = width * height; - - return (T) capacity; -} - -template<class T> -void Box2D<T>::enclose( Point2D point ) -{ - if ( m_MinX > point.x() ) { m_MinX=point.x(); } - if ( m_MinY > point.y() ) { m_MinY=point.y(); } - if ( m_MaxX < point.x() ) { m_MaxX=point.x(); } - if ( m_MaxY < point.y() ) { m_MaxY=point.y(); } -} - -template<class T> -void Box2D<T>::enclose( T x, T y ) -{ - if ( m_MinX > x ) { m_MinX=x; } - if ( m_MinY > y ) { m_MinY=y; } - if ( m_MaxX < x ) { m_MaxX=x; } - if ( m_MaxY < y ) { m_MaxY=y; } -} - -template<class T> -template<class OtherT> -void Box2D<T>::enclose( Box2D<OtherT> box ) -{ - enclose( box.minX(), box.minY() ); - enclose( box.maxX(), box.maxY() ); -} - - -template<class T> -std::vector< Point2D > Box2D<T>::vertices() -{ - std::vector<Point2D> myVertices(5); - myVertices[0]=Point2D( m_MinX-0.5, m_MinY-0.5 ); - myVertices[1]=Point2D( m_MinX-0.5, m_MaxY+0.5 ); - myVertices[2]=Point2D( m_MaxX+0.5, m_MaxY+0.5 ); - myVertices[3]=Point2D( m_MaxX+0.5, m_MinY-0.5 ); - myVertices[4]=myVertices[0]; - return myVertices; -} - - -#endif diff --git a/homer_nav_libs/include/homer_nav_libs/Math/Line2D.h b/homer_nav_libs/include/homer_nav_libs/Math/Line2D.h deleted file mode 100644 index 9761be66..00000000 --- a/homer_nav_libs/include/homer_nav_libs/Math/Line2D.h +++ /dev/null @@ -1,223 +0,0 @@ -/******************************************************************************* - * Line2D.h - * - * (C) 2008 AG Aktives Sehen <agas@uni-koblenz.de> - * Universitaet Koblenz-Landau - * - * Information on Code Review state: - * Author: SM; DevelTest: Date; Reviewer: Initials; Review: Date; State: NOK - * - * Additional information: - * $Id: Line2D.h 44313 2011-04-06 22:46:28Z agas $ - *******************************************************************************/ - -#ifndef LINE2D_H -#define LINE2D_H - -#include <homer_nav_libs/Math/vec2.h> -#include <homer_nav_libs/Math/mat2.h> -#include <homer_nav_libs/Math/Point2D.h> -#include <vector> - -/** - * @class Line2D - * - * @author Susanne Maur - * - */ -class Line2D -{ - - public: - - /** - * Creates a new line. - * @param start Start point of the line. - * @param end End point of the line. - */ - inline Line2D ( Point2D start, Point2D end ) - { - m_Start = start; - m_Vec = end-m_Start; - } - - - /** - * Creates a new line. - * @param start Start point of the line. - * @param vec The vector from start to end point of the line. - */ - inline Line2D ( Point2D start, CVec2 vec ) - { - m_Start = start; - m_Vec = vec; - } - - /** - * Destructor does nothing. - */ - inline ~Line2D() {} - - /** - * Sets the start point of the line to a new value. - * @param start Start point of the line. - */ - inline void setStart ( const Point2D start ) - { - Point2D end = m_Start + m_Vec; - m_Start = start; - m_Vec = end-m_Start; - } - - /** - * Sets the end point of the line to a new value. - * @param end End point of the line. - */ - - inline void setEnd ( const Point2D end ) - { - m_Vec = end - m_Start; - } - - /** - * Returns the start point of the line. - * @return Start point of the line. - */ - inline Point2D start() const - { - return m_Start; - } - - /** - * Returns the end point of the line. - * @return End point of the line. - */ - inline Point2D end() const - { - return m_Start + m_Vec; - } - - /** - * Returns a vector from the start to the end of the line. - * @return Vector to the end point of the line. - */ - inline CVec2 vec() const - { - return m_Vec; - } - - inline bool operator== ( const Line2D& line ) const - { - return ( m_Start == line.start() && end() == line.end() ); - } - - /** - * Returns the gradient of the line. - * @return Gradient of the line. - */ - float gradient() const ; - - /** - * Returns the length of the line. - * @return Length of the line. - */ - inline float length() const { - return m_Vec.magnitude(); - } - - /** - * Returns the minimum euclidean distance of the given point to the line. - * @param point Point of which the distance to the line will be calculated. - * @return Distance of point to line. - */ - inline float distance ( Point2D point ) const - { - Point2D pointOnLine = getRootPoint ( point ); - return ( point - pointOnLine ).magnitude(); - } - - /** - * Rotates the line round the origin. - * @param angle The angle of rotation in radiants. - */ - inline void rotate ( float angle ) - { - CMat2 rotMat = CMat2 ( angle ); - m_Start = rotMat * m_Start; - m_Vec = rotMat * m_Vec; - } - - /** - * Returns the point of the line with the minimal distance to a given point. - * This algorithm may return a point which lies on the extension of the line and not on itself. - * See also: getClosestPoint. - * @param point Point to which the distance is calculated. - * @return Root point of the line. - */ - inline Point2D getRootPoint ( Point2D point ) const - { - float t = ( point-m_Start ) * m_Vec; - t /= m_Vec * m_Vec; - Point2D pointOnLine = m_Start + ( t * m_Vec ); - return pointOnLine; - } - - /** - * Returns the normal of the line. - * @return Normal of the line. - */ - inline CVec2 getNormal() const { - return m_Vec.getNormal()/m_Vec.magnitude(); - } - - /** - * Returns the point of the line with the minimal distance to a given point. - * This algorithm returns always a point which lies on the line. - * Therefor it is not always the root point. - * See also: getRootPoint. - * @param point Point to which the distance is calculated. - * @return Root point of the line. - */ - Point2D getClosestPoint ( Point2D point ) const; - - /** - * Returns the intersection point of this line with a second line. - * The intersection point is element of this line. - * @param line The line with which the intersection is calculated. - * @return Intersection point. - */ - Point2D getIntersectionPoint ( Line2D line ) const; - - /** - * Returns the parameter t which identifies the intersection point of this line with a second line. - * The intersection point is element of this line. - * @param line The line with which the intersection is calculated. - * @return Parameter t which identifies the intersection point on the line. - */ - float getIntersectionPointParameter ( Line2D line ) const; - - /** - * @return Vertices, e.g. for use in a VectorObject - * @param substeps number of linear interpolation steps between start and end - */ - std::vector< Point2D > vertices ( unsigned substeps=0 ); - - /** - * @overwrite - */ - std::string toString() const; - - private: - - /** - * Start point of the line. - */ - Point2D m_Start; - - /** - * Vector from the start to the end of the line. - */ - CVec2 m_Vec; -}; - -#endif diff --git a/homer_nav_libs/include/homer_nav_libs/Math/Math.h b/homer_nav_libs/include/homer_nav_libs/Math/Math.h deleted file mode 100644 index d1ce8e65..00000000 --- a/homer_nav_libs/include/homer_nav_libs/Math/Math.h +++ /dev/null @@ -1,129 +0,0 @@ -/******************************************************************************* - * Math.h - * - * (C) 2007 AG Aktives Sehen <agas@uni-koblenz.de> - * Universitaet Koblenz-Landau - * - * Additional information: - * $Id: $ - *******************************************************************************/ - -#ifndef Math_H -#define Math_H - -#include <vector> -#include <homer_nav_libs/Math/Point2D.h> - -/** - * @class Math - * @brief Generic math and statistics functions - * @author David Gossow (RX) - */ -class Math -{ - public: - - struct WeightedValue - { - float value; - float weight; - }; - - static const double Pi = 3.14159265358979323846; - - /** @return mean value */ - template<class ContainerT> - static double mean ( const ContainerT& values ); - - /** @return variance of given values */ - template<class ContainerT> - static double variance ( const ContainerT& values ); - - /** @return mean angle of given values - * @note there are always two possible choices for the mean angle. This function returns the one with the smallest deviation - * @note Works for angles in [-Pi..Pi], negative angles are treated - */ - static float meanAngle ( const std::vector<float>& angles ); - - static float meanAngleWeighted ( const std::vector< WeightedValue >& weightedAngles ); - - /** @return variance for given mean */ - static float angleVariance ( float meanAngle, const std::vector<float>& angles ); - - /** @return minimal angle needed to turn from angle 1 to angle 2 [-Pi..Pi] */ - static float minTurnAngle ( float angle1, float angle2 ); - - static Point2D center ( std::vector<Point2D>& points ); - - static float deg2Rad ( float deg ) { return deg / 180.0*Pi; } - - static float rad2Deg ( float rad ) { return rad / Pi*180.0; } - - static double randomGauss ( float variance = 1.0 ); - - static double random01 ( unsigned long init = 0 ); - - /** @return ratio between one dimension seen under old viewangle and dimension under new viewangle*/ - static double angleToPercent ( double newAngle, double oldAngle ) { return tan ( ( Pi / 180.0 ) * newAngle / 2 ) / tan ( ( Pi / 180.0 ) * oldAngle / 2 ); }; - - /** @return angle under which the ratio between dimension seen under old viewangle and new viewangle equals percent*/ - static double percentToAngle ( double percent, double angle ) { return 2* atan ( tan ( ( Pi / 180.0 ) * angle / 2 ) * percent ) * ( 180 / Pi ); }; - - /** @return horizontal view angle corresponding to diagonal view angle and aspect ratio (e.g. 4.0/3.0)*/ - static double horizontalViewAngle ( double diagonalAngle, double aspectRatio ) { return verticalViewAngle ( diagonalAngle, 1.0 / aspectRatio ); }; - - /** @return vertical view angle corresponding to diagonal view angle and aspect ratio (e.g. 4.0/3.0)*/ - static double verticalViewAngle ( double diagonalAngle, double aspectRatio ) - { - return percentToAngle ( 1.0 / sqrt ( pow ( aspectRatio, 2 ) + 1.0 ), diagonalAngle ); - }; - - template<class ValueT> - static inline ValueT min ( ValueT a, ValueT b ) { return a < b ? a : b; } - - template<class ValueT> - static inline ValueT max ( ValueT a, ValueT b ) { return a > b ? a : b; } - - private: - - /** @brief The constructor */ - Math(); - - /** @brief The destructor */ - ~Math(); - -}; - -template<class ContainerT> -double Math::mean ( const ContainerT& values ) -{ - typename ContainerT::const_iterator it; - it = values.begin(); - double sum = 0; - while ( it != values.end() ) - { - sum += *it; - it++; - } - return sum / double ( values.size() ); -} - - -template<class ContainerT> -double Math::variance ( const ContainerT& values ) -{ - double mean = mean ( values ); - typename ContainerT::const_iterator it; - it = values.begin(); - double sum = 0; - while ( it != values.end() ) - { - double diff = *it - mean; - sum += diff * diff; - it++; - } - return sum / double ( values.size() ); -} - - -#endif diff --git a/homer_nav_libs/include/homer_nav_libs/Math/Pixel.h b/homer_nav_libs/include/homer_nav_libs/Math/Pixel.h deleted file mode 100644 index cc58f229..00000000 --- a/homer_nav_libs/include/homer_nav_libs/Math/Pixel.h +++ /dev/null @@ -1,59 +0,0 @@ -/******************************************************************************* - * Pixel.h - * - * (C) 2006 AG Aktives Sehen <agas@uni-koblenz.de> - * Universitaet Koblenz-Landau - * - * $Id: Pixel.h 44313 2011-04-06 22:46:28Z agas $ - *******************************************************************************/ - -#ifndef PIXEL_H -#define PIXEL_H - -#include <homer_nav_libs/Math/Point2D.h> -#include <vector> - -/** @class Pixel - * @brief Stores discrete pixel coordinates - * @author Stephan Wirth, David Gossow (RX) - */ -class Pixel { - - public: - - inline Pixel( int x = 0, int y = 0) { m_X = x; m_Y = y; }; - inline ~Pixel() {}; - - inline int x() const { return m_X; } - inline int y() const { return m_Y; } - - inline void setX( int x ) { m_X = x; } - inline void setY( int y ) { m_Y = y; } - - inline bool operator ==( Pixel& rhs ) { return ( m_X == rhs.m_X ) && ( m_Y == rhs.m_Y ); } - inline bool operator !=( Pixel& rhs ) { return ( m_X != rhs.m_X ) || ( m_Y != rhs.m_Y ); } - inline Pixel operator *( float rhs ) { return Pixel( m_X * rhs, m_Y * rhs ); } - inline Pixel operator /( float rhs ) { return Pixel( m_X / rhs, m_Y / rhs ); } - - inline Point2D toPoint2D() { return Point2D( m_X, m_Y ); } - - inline std::vector<Point2D> vertices() - { - std::vector<Point2D> result(5); - result[0]=Point2D( m_X-0.5, m_Y-0.5 ); - result[1]=Point2D( m_X+0.5, m_Y-0.5 ); - result[2]=Point2D( m_X+0.5, m_Y+0.5 ); - result[3]=Point2D( m_X-0.5, m_Y+0.5 ); - result[4]=result[0]; - return result; - } - - private: - - int m_X; - int m_Y; - -}; - - -#endif diff --git a/homer_nav_libs/include/homer_nav_libs/Math/Point2D.h b/homer_nav_libs/include/homer_nav_libs/Math/Point2D.h deleted file mode 100644 index fdbf6fd0..00000000 --- a/homer_nav_libs/include/homer_nav_libs/Math/Point2D.h +++ /dev/null @@ -1,312 +0,0 @@ -/******************************************************************************* - * Point2D.h - * - * (C) 2008 AG Aktives Sehen <agas@uni-koblenz.de> - * Universitaet Koblenz-Landau - * - * $Id: Point2D.h 44313 2011-04-06 22:46:28Z agas $ - *******************************************************************************/ - -#include <iostream> -#include <sstream> - -#include <homer_nav_libs/Math/vec2.h> -#include <float.h> - -#ifndef POINT2D_H -#define POINT2D_H - -/** - * @class Point2D - * - * @author Susanne Maur - * - */ -class Point2D -{ - - public: - - /** - * Creates a new point in 2D with x- and y-coordinat set to zero. - */ - inline Point2D() - { - m_X = 0.0; - m_Y = 0.0; - } - - /** - * Creates a new point in 2D. - * @param x x-coordinate of the point. - * @param y y-coordinate of the point. - */ - inline Point2D ( double x, double y ) - { - m_X = x; - m_Y = y; - } - - - - /** - * Copy construcor - */ - inline Point2D (const Point2D& p){ - m_X = p.x(); - m_Y = p.y(); - } - - /** - * Creates a new point in 2D. - * @param v Vector form origin to the point. - */ - inline Point2D ( const CVec2& v ) - { - m_X = v[0]; - m_Y = v[1]; - } - - /** - * Destructor, does nothing. - */ - inline ~Point2D() - { - } - - /** - * Returns the x-coordinate of the point. - * @return the x-coordinate of the point. - */ - inline double x() const - { - return m_X; - } - - /** - * Returns the y-coordinate of the point. - * @return the y-coordinate of the point. - */ - inline double y() const - { - return m_Y; - } - - /** - * Sets the x- and y-coordinate of the point to new values. - * @param x the new value of the x coordinate. - * @param y the new value of the x coordinate. - */ - inline void set ( double x, double y ) - { - m_X = x; - m_Y = y; - } - - /** - * Sets the x-coordinate of the point to a new value. - * @param x the new value of the x coordinate. - */ - inline void setX ( double x ) - { - m_X = x; - } - - /** - * Sets the y-coordinate of the point to a new value. - * @param y the new value of the x coordinate. - */ - inline void setY ( double y ) - { - m_Y = y; - } - - /** - * Overloaded operators. - */ - - inline Point2D& operator= ( const Point2D& p) { - m_X = p.x(); - m_Y = p.y(); - return *this; - } - - inline Point2D operator+ ( const CVec2& v ) const - { - return Point2D ( m_X + v[0], m_Y + v[1] ); - } - - inline Point2D operator+ ( const Point2D& p ) const - { - return Point2D ( m_X + p.x(), m_Y + p.y() ); - } - - inline CVec2 operator- ( const Point2D& p ) const - { - return CVec2 ( m_X - p.x(), m_Y - p.y() ); - } - - inline Point2D operator- ( const CVec2& v ) const - { - return Point2D ( m_X - v[0], m_Y - v[1] ); - } - - inline Point2D operator* ( double scalar ) const - { - return Point2D ( m_X * scalar, m_Y * scalar ); - } - - inline Point2D operator/ ( double scalar ) const - { - return Point2D ( m_X / scalar, m_Y / scalar ); - } - - inline Point2D& operator+= ( const CVec2& v ) - { - m_X += v[0]; - m_Y += v[1]; - return ( *this ); - } - - inline Point2D& operator-= ( const CVec2& v ) - { - m_X -= v[0]; - m_Y -= v[1]; - return ( *this ); - } - - inline Point2D& operator*= ( double scalar ) - { - m_X *= scalar; - m_Y *= scalar; - return ( *this ); - } - - inline Point2D& operator/= ( double scalar ) - { - m_X /= scalar; - m_Y /= scalar; - return ( *this ); - } - - inline double operator [] ( unsigned int i ) const - { - return ( ( double* ) this ) [i]; - } - - inline double& operator [] ( unsigned int i ) - { - return ( ( double* ) this ) [i]; - } - - inline bool operator== ( const Point2D& point ) const - { - return ( fabs(m_X - point.x()) < 0.001 && fabs(m_Y - point.y()) < 0.001 ); - } - - inline bool operator!= ( const Point2D& point ) const - { - return !((*this)== point); - } - - /** - * Returns the distance to a given point. - * @param point The point to calculate the distance to. - * @return the distance between point the two points. - */ - inline double distance ( const Point2D& point ) const - { - return sqrt ( ( m_X-point.x() ) * ( m_X-point.x() ) + ( m_Y-point.y() ) * ( m_Y-point.y() ) ); - } - - /** - * Returns the distance to origin. - * @return the distance between point the two points. - */ - inline double distance ( ) const - { - return sqrt ( m_X * m_X + m_Y * m_Y ); - } - - /** - * Checks whether two points are equal. - * @param p The point to check equality. - * @return true if points are equal, false otherwise. - */ - inline bool equal ( const Point2D& point ) const - { - if ( ( *this - point ).magnitude() < 0.0001 ) - { - return true; - } - else - { - return false; - } - } - - /** - * Returns the vector which represents the point in 2D. - * @return vector which represents the point in 2D. - */ - inline CVec2 toVector() const - { - return CVec2 ( m_X, m_Y ); - } - - /** - * Returns the angle of the corresponding polar coordinates. - * @return polar angle. - */ - float getPolarAngle () const; - - /** - * Rotate by angle (in radiants) around center. - * @param center Center of rotation - * @param angle Angle in radiants - */ - inline void rotate ( const Point2D& center, float angle ) - { - double x0=m_X-center.m_X; - double y0=m_Y-center.m_Y; - double xRot = x0*cos ( angle ) - y0*sin ( angle ); - double yRot = x0*sin ( angle ) + y0*cos ( angle ); - m_X = xRot+center.m_X; - m_Y = yRot+center.m_Y; - } - - /** - * Rotate by angle (in radiants) around (0,0). - * @param angle Angle in radiants - */ - inline void rotate ( float angle ) - { - double xRot = m_X*cos ( angle ) - m_Y*sin ( angle ); - double yRot = m_X*sin ( angle ) + m_Y*cos ( angle ); - m_X = xRot; - m_Y = yRot; - } - - /** - * Returns the string representation of the point. - * @return string representation of the point. - */ - inline std::string toString() const - { - std::ostringstream str; - str << m_X << " " << m_Y; - return str.str(); - } - - /** @return "invalid" Point (used as end marker in vector drawings) **/ - static Point2D invalidPoint() { return Point2D( DBL_MAX, DBL_MAX ); } - - bool isValid() { return ( ( m_X != DBL_MAX ) || ( m_Y != DBL_MAX ) ); } - - protected: - - double m_X; - double m_Y; -}; - -#endif diff --git a/homer_nav_libs/include/homer_nav_libs/Math/Pose.h b/homer_nav_libs/include/homer_nav_libs/Math/Pose.h deleted file mode 100644 index a4b47b9a..00000000 --- a/homer_nav_libs/include/homer_nav_libs/Math/Pose.h +++ /dev/null @@ -1,72 +0,0 @@ -/******************************************************************************* - * Pose.h - * - * (C) 2006 AG Aktives Sehen <agas@uni-koblenz.de> - * Universitaet Koblenz-Landau - * - * $Id: Pose.h 44313 2011-04-06 22:46:28Z agas $ - *******************************************************************************/ - -#ifndef POSE_H -#define POSE_H - -#include <homer_nav_libs/Math/Point2D.h> - -class Transformation2D; - -/** - * @class Pose - * - * @author Stephan Wirth, Susanne Maur (RX), David Gossow (RX) - * @brief Class to describe and hold a pose of the robot (x, y)-Position + Orientation - * in world-coordinates - */ -class Pose : public Point2D { - -public: - - /** - * Constructor which initializes the members with the given values. - * @param x x-position - * @param y y-position - * @param theta orientation in radiants - */ - Pose(float x, float y, float theta); - - /** - * Default constructor, initializes members to 0. - */ - Pose(); - - /** - * The destructor is empty. - */ - ~Pose(); - - float theta() const; - - void setTheta(float theta); - - Pose operator+ ( const Transformation2D& transformation ) const; - Pose operator- ( const Transformation2D& transformation ) const; - Transformation2D operator- ( const Pose& pose ) const; - - /** - * Interpolates between two poses and returns a pose which correlates with - * current pose + t * (reference pose - current pose) - * @param referencePose The second pose to interpolate between. - * @param t The factor of interpolation. - * @return Interpolated pose - */ - Pose interpolate(const Pose& referencePose, float t) const; - -// Pose( ExtendedInStream& extStrm ); - -// void storer( ExtendedOutStream& extStrm ) const; - -protected: - - float m_Theta; -}; - -#endif diff --git a/homer_nav_libs/include/homer_nav_libs/Math/Transformation2D.h b/homer_nav_libs/include/homer_nav_libs/Math/Transformation2D.h deleted file mode 100644 index a2ba0d67..00000000 --- a/homer_nav_libs/include/homer_nav_libs/Math/Transformation2D.h +++ /dev/null @@ -1,143 +0,0 @@ -/******************************************************************************* - * Transformation2D.h - * - * (C) 2008 AG Aktives Sehen <agas@uni-koblenz.de> - * Universitaet Koblenz-Landau - * - * $Id: Transformation2D.h 44313 2011-04-06 22:46:28Z agas $ - *******************************************************************************/ - -#ifndef TRANSFORMATION2D_H -#define TRANSFORMATION2D_H - -#include <cmath> -#include <vector> -#include <homer_nav_libs/Math/Point2D.h> -#include <homer_nav_libs/Math/Line2D.h> - - -/** - * @class Transformation2D - * - * @author Susanne Maur - * - * @brief Class to describe a transformation of poses in 2D. - * This inplies a translation in x and y direction each and a rotation. - */ -class Transformation2D : public CVec2 -{ - - public: - - /** - * Constructor that initializes the members. - * @param x translation in x direction in m - * @param y translation in y direction in m - * @param theta rotation in radiants - */ - Transformation2D ( double x, double y, double theta ); - - /** - * Constructor that initializes the members. - * @param vec a vector which represents the translation in x and y direction - * @param theta rotation in radiants - */ - Transformation2D ( const CVec2& vec, double theta ); - - /** - * Default constructor sets all members to 0.0. - */ - Transformation2D(); - - /** - * Default destructor. - */ - ~Transformation2D(); - - /** - * Sets the values of transformation. - * @param x translation in x direction in mm - * @param y translation in y direction in mm - * @param theta rotation in radiants - */ - void set ( double x, double y, double theta ); - - /** - * Returns the rotation in radiants. - * @return rotation in radiants - */ - double theta() const; - - /** - * Adds two transformations. - */ - Transformation2D operator+ ( Transformation2D t ) const; - Transformation2D& operator+= ( Transformation2D t ); - - /** - * Subtracts two transformations. - */ - Transformation2D operator- ( Transformation2D t ) const; - Transformation2D& operator-= ( Transformation2D t ); - - /** - * Scales a transformation by a factor - */ - Transformation2D operator* ( float factor ) const; - Transformation2D& operator*= ( float factor ); - - /** - * Scales a transformation by a factor - */ - Transformation2D operator/ ( float factor ) const; - Transformation2D& operator/= ( float factor ); - - /** - * Test equality of transformations. - */ - bool operator== ( Transformation2D t ) const; - bool operator!= ( Transformation2D t ) const; - - /** - * Compare transformations. - * (attention: algebraic signs are taken into account, if necessary use fabs()) - */ - bool operator<= ( Transformation2D t ) const; - bool operator>= ( Transformation2D t ) const; - bool operator< ( Transformation2D t ) const; - bool operator> ( Transformation2D t ) const; - - /** - * Applies abs() on every attribute. - */ - Transformation2D abs() const; - - /** - * Inverts the transformation, scales every attribute with -1. - */ - Transformation2D inverse() const; - - /** - * Transformes points by first rotation, then translating. - */ - Point2D transform ( const Point2D& point ) const; - std::vector<Point2D> transform ( const std::vector<Point2D>& points ) const; - - /** - * Transformes lines by first rotation, then translating. - */ - Line2D transform ( const Line2D& line ) const; - std::vector<Line2D> transform ( const std::vector<Line2D>& lines ) const; - - /** - * Returns the string representation of the transformation. - * @return string representation of the transformation. - */ - std::string toString() const; - - private: - double m_Theta; -}; - -#endif - diff --git a/homer_nav_libs/include/homer_nav_libs/Math/mat2.h b/homer_nav_libs/include/homer_nav_libs/Math/mat2.h deleted file mode 100644 index 45365d81..00000000 --- a/homer_nav_libs/include/homer_nav_libs/Math/mat2.h +++ /dev/null @@ -1,77 +0,0 @@ -/******************************************************************************* - * mat2.h - * - * (C) 2006 AG Aktives Sehen <agas@uni-koblenz.de> - * Universitaet Koblenz-Landau - * - * Author: Frank Neuhaus - *******************************************************************************/ - -#ifndef MAT2_H -#define MAT2_H - -#include <math.h> -#include <homer_nav_libs/Math/Point2D.h> -#include <homer_nav_libs/Math/vec2.h> - -class CMat2 -{ - public: - CMat2(); - CMat2(float rot); - ~CMat2(); - - CMat2 operator *(const CMat2 &mat) const; - - CVec2 operator *(const CVec2& v) const; - - Point2D operator *(const Point2D& p) const; - - float& operator [] (unsigned int position) { - return fMatrix[position]; - } - - CMat2 operator +(const CMat2 rhs) const { - CMat2 newMatrix; - for (unsigned int i = 0; i < 4; i++) { - newMatrix[i] = valueAt(i) + rhs.valueAt(i); - } - return newMatrix; - } - - CMat2 operator -(const CMat2 rhs) const { - CMat2 newMatrix; - for (unsigned int i = 0; i < 4; i++) { - newMatrix[i] = valueAt(i) - rhs.valueAt(i); - } - return newMatrix; - } - - float valueAt(unsigned int position) const{ - return fMatrix[position]; - } - - union - { - float fMatrix[4]; - float m[2][2]; - struct - { - float xx, xy; - float yx, yy; - }; - }; - - void transpose(); - void loadIdentity(); - - void makeRotation(float fA); - - bool invert(); -}; - - - -#include "mat2_inl.h" - -#endif diff --git a/homer_nav_libs/include/homer_nav_libs/Math/mat2_inl.h b/homer_nav_libs/include/homer_nav_libs/Math/mat2_inl.h deleted file mode 100644 index e3f77e16..00000000 --- a/homer_nav_libs/include/homer_nav_libs/Math/mat2_inl.h +++ /dev/null @@ -1,86 +0,0 @@ -/******************************************************************************* - * mat2_inl.h - * - * (C) 2006 AG Aktives Sehen <agas@uni-koblenz.de> - * Universitaet Koblenz-Landau - * - * Author: Frank Neuhaus - *******************************************************************************/ - -#include <assert.h> - -inline CMat2::CMat2(){ - for (unsigned int i = 0; i < 4; i++) { - fMatrix[i] = 0; - } -} - -inline CMat2::~CMat2() -{} - -inline CMat2::CMat2(float rot) -{ - makeRotation(rot); -} - -inline CMat2 CMat2::operator * ( const CMat2 & mat ) const -{ - CMat2 retValue; - for (unsigned int line = 0; line < 2; line++) { - for (unsigned int column = 0; column < 2; column++) { - retValue[line*2 + column] = valueAt(line*2 + column) + mat.valueAt(column*2 + line); - } - } - return retValue; -} - -inline CVec2 CMat2::operator * ( const CVec2& v ) const -{ - return CVec2(xx*v[0] + xy*v[1],yx*v[0] + yy*v[1]); -} - -inline Point2D CMat2::operator * ( const Point2D& p ) const -{ - return Point2D(xx*p.x() + xy*p.y(), yx*p.x() + yy*p.y()); -} - -inline void CMat2::transpose() -{ - float t=xy; - xy=yx; - yx=t; -} - -inline void CMat2::loadIdentity() -{ - xx=1.0f; xy=0.0f; - yx=0.0f; yy=1.0f; -} - -inline void CMat2::makeRotation ( float fA ) -{ - xx=yy=cosf(fA); - yx=sinf(fA); - xy=-yx; -} - -inline bool CMat2::invert() -{ - CMat2 tmp; - float det = fMatrix[0]*fMatrix[3] - fMatrix[1]*fMatrix[2]; - - if(fabs(det) < 0.001f) return false; - - det = 1.0 / det; - tmp.fMatrix[0] = fMatrix[3]*det; - tmp.fMatrix[1] = -fMatrix[1]*det; - tmp.fMatrix[2] = -fMatrix[2]*det; - tmp.fMatrix[3] = fMatrix[0]*det; - - (*this)=tmp; - return true; -} - - - - diff --git a/homer_nav_libs/include/homer_nav_libs/Math/vec2.h b/homer_nav_libs/include/homer_nav_libs/Math/vec2.h deleted file mode 100644 index 39a72c8e..00000000 --- a/homer_nav_libs/include/homer_nav_libs/Math/vec2.h +++ /dev/null @@ -1,189 +0,0 @@ -/******************************************************************************* - * vec2.h - * - * (C) 2006 AG Aktives Sehen <agas@uni-koblenz.de> - * Universitaet Koblenz-Landau - * - * Author: Frank Neuhaus, Susanne Maur - *******************************************************************************/ - -#include <iostream> -#include <sstream> - -#ifndef VEC2_H -#define VEC2_H - -#include <math.h> - -class CVec2 -{ - public: - - inline CVec2() - { - m_X = 0; m_Y = 0; - } - - inline CVec2 ( double x, double y ) - { - m_X=x; m_Y=y; - } - - inline CVec2 ( const CVec2& vec ) - { - m_X=vec.x(); m_Y=vec.y(); - } - - inline CVec2 operator+ ( const CVec2& vVector ) const - { - return CVec2 ( vVector[0] + m_X, vVector[1] + m_Y ); - }; - - inline CVec2 operator- ( const CVec2& vVector ) const - { - return CVec2 ( m_X - vVector[0], m_Y - vVector[1] ); - }; - - inline CVec2 operator- ( ) const - { - return CVec2 ( - m_X, - m_Y ); - }; - - inline CVec2 operator* ( double num ) const - { - return CVec2 ( m_X * num, m_Y * num ); - }; - - inline double operator* ( const CVec2& vVector ) const - { - return m_X*vVector[0]+m_Y*vVector[1]; - } - - inline CVec2 operator/ ( double num ) const - { - return CVec2 ( m_X / num, m_Y / num ); - } - - inline void set ( double fx, double fy ) - { - m_X=fx; m_Y=fy; - } - - inline double x() const - { - return m_X; - } - - inline double y() const - { - return m_Y; - } - - inline double magnitude() const - { - double sumOfSquares = m_X*m_X + m_Y*m_Y; - return sqrt ( sumOfSquares ); - } - - inline double operator [] ( unsigned int i ) const - { - return ( ( double* ) this ) [i]; - } - - inline double& operator [] ( unsigned int i ) - { - return ( ( double* ) this ) [i]; - } - - inline CVec2& operator/= ( double num ) - { - double inv=1.0f/num; - m_X*=inv; - m_Y*=inv; - return ( *this ); - } - - inline CVec2& operator*= ( double num ) - { - m_X*=num; - m_Y*=num; - return ( *this ); - } - - inline CVec2& normalize() - { - return ( *this/=magnitude() ); - } - - inline CVec2& makePerp() - { - double xn=m_X; - m_X=-m_Y; - m_Y=xn; - return *this; - } - - inline CVec2 getNormal() const - { - return CVec2 ( m_Y, -m_X ); //? - } - - inline CVec2 getNormalized() const - { - return ( *this ) /magnitude(); - } - - inline double sqr() const - { - return ( *this ) * ( *this ); - } - - inline double dot ( const CVec2& vec ) const - { - return ( m_X*vec[0] ) + ( m_Y*vec[1] ); - } - - inline double getAngle ( const CVec2& vec ) const - { - return acos ( dot ( vec ) / ( magnitude() *vec.magnitude() ) ); - } - - /// @param angle Rotation angle in radiants - inline CVec2 rotate ( float angle ) const - { - double xRot = m_X*cos ( angle ) - m_Y*sin ( angle ); - double yRot = m_X*sin ( angle ) + m_Y*cos ( angle ); - return CVec2 ( xRot, yRot ); - } - - inline bool equal ( CVec2 vec ) const - { - return ( m_X==vec.x() && m_Y==vec.y() ); - } - - /** - * Returns the string representation of the vector. - * @return string representation of the point. - */ - inline std::string toString() const - { - std::ostringstream str; - str << m_X << " " << m_Y; - return str.str(); - } - - protected: - double m_X, m_Y; -}; - -inline CVec2 operator* ( double f, const CVec2& v ) -{ - return v*f; -} - -inline CVec2 normalize ( const CVec2& v ) -{ - return v/v.magnitude(); -} - -#endif diff --git a/homer_nav_libs/include/homer_nav_libs/tools.h b/homer_nav_libs/include/homer_nav_libs/tools.h deleted file mode 100644 index 112c22f3..00000000 --- a/homer_nav_libs/include/homer_nav_libs/tools.h +++ /dev/null @@ -1,396 +0,0 @@ -#ifndef TOOLS_H -#define TOOLS_H - -#include <Eigen/Geometry> -#include <geometry_msgs/Point.h> -#include <geometry_msgs/Pose.h> -#include <sensor_msgs/LaserScan.h> -#include <tf/transform_listener.h> -#include <ros/ros.h> -#include <vector> - -/** - * @author Malte Knauf (2014) - * Convenience functions that are often used in the mapping and navigation process - */ -namespace map_tools -{ - - /** - * @brief Converts a point p in world frame /map to the respective cell position in the map - * @param p Point in world frame - * @param origin Origin of the map - * @param resolution Resolution of the map - * @return Cell position of the point - */ - Eigen::Vector2i toMapCoords(geometry_msgs::Point p, geometry_msgs::Pose origin, float resolution) - { - int x_idx = (p.x - origin.position.x)/resolution + 0.51; - int y_idx = (p.y - origin.position.y)/resolution + 0.51; - Eigen::Vector2i ret(x_idx, y_idx); - return ret; - } - - /** - * @brief Converts the cell position of a point to its respective position in the world frame - * @param idx Cell position of the point - * @param origin Origin of the map - * @param resolution Resolution of the map - * @return Point in world frame - */ - geometry_msgs::Point fromMapCoords(Eigen::Vector2i idx, geometry_msgs::Pose origin, float resolution) - { - geometry_msgs::Point ret; - ret.x = origin.position.x + (idx.x() - 0.5) * resolution; - ret.y = origin.position.y + (idx.y() - 0.5) * resolution; - return ret; - } - - /** - * @brief Converts the QT pixel position of a point to its respective position in the world frame - * @param idx Cell position of the point - * @param origin Origin of the map - * @param resolution Resolution of the map - * @return Point in world frame - */ - geometry_msgs::Point qtFromMapCoords(Eigen::Vector2i idx, geometry_msgs::Pose origin, float resolution) - { - geometry_msgs::Point ret; - ret.x = -(origin.position.x + idx.y()) * resolution; - ret.y = -(origin.position.y + idx.x()) * resolution; - return ret; - } - - /** - * @brief map_index returns for a given point in the map real-world frame the respective index in the map - * @param p Point in the real-world frame (usually the frame /map or /world) - * @param origin Pose of the point (0,0) of the map in the real-world frame - * @param width Width of the map - * @param resolution Resolution in meters/cell of the map - * @return index of point in the map - */ - int map_index(geometry_msgs::Point p, geometry_msgs::Pose origin, float width, float resolution) - { - return (int)(width * - ((p.y - origin.position.y)/resolution + 0.51) + - ((p.x - origin.position.x)/resolution + 0.51)); - } - - /** - * @brief point_in_map returns true if given point is in the map. False otherwise - * @param p Point in the real-world frame (usually the frame /map or /world) - * @param origin Pose of the point (0,0) of the map in the real-world frame - * @param width Width of the map - * @param resolution Resolution in meters/cell of the map - * @return true or false - */ - bool point_in_map(geometry_msgs::Point p, geometry_msgs::Pose origin, float width, float resolution) - { - int x_idx = (p.x - origin.position.x)/resolution + 0.51; - int y_idx = (p.y - origin.position.y)/resolution + 0.51; - if(x_idx < 0 || y_idx < 0 || x_idx >= width || y_idx >= width) return false; - return true; - } - - /** - * @brief transformPoint wrapper to transform points between coordinate frames - * @param point input point in from_frame - * @param listener transform listener - * @param from_frame input frame - * @param to_frame output frame - * @return transformed point in to_frame - */ - geometry_msgs::Point transformPoint(geometry_msgs::Point point, tf::TransformListener &listener, - std::string from_frame, std::string to_frame, ros::Time stamp = ros::Time(0)) - { - geometry_msgs::PointStamped pin; - geometry_msgs::PointStamped pout; - pin.header.frame_id = from_frame; - pin.point = point; - try - { - listener.transformPoint(to_frame, stamp, pin, "/map",pout); - return pout.point; - } - catch (tf::TransformException ex){ - ROS_ERROR("%s",ex.what()); - } - } - - geometry_msgs::Point transformPoint(const geometry_msgs::Point point, tf::StampedTransform transform) - { - geometry_msgs::Point point_out; - tf::Vector3 pin; - tf::Vector3 pout; - pin.setX(point.x); - pin.setY(point.y); - pin.setZ(point.z); - - pout = transform* pin; - - point_out.x = pout.x(); - point_out.y = pout.y(); - - return point_out; - } - geometry_msgs::Point transformPoint(const geometry_msgs::Point point, tf::Transform transform) - { - geometry_msgs::Point point_out; - tf::Vector3 pin; - tf::Vector3 pout; - pin.setX(point.x); - pin.setY(point.y); - pin.setZ(point.z); - - pout = transform* pin; - - point_out.x = pout.x(); - point_out.y = pout.y(); - point_out.z = pout.z(); - - return point_out; - } - - /** - * @brief transformPoint wrapper to transform points between coordinate frames at specific time - * @param point input point in from_frame - * @param listener transform listener - * @param Time to look for transform - * @param from_frame input frame - * @param to_frame output frame - * @return transformed point in to_frame - */ - geometry_msgs::Point transformPoint(geometry_msgs::Point point, tf::TransformListener &listener, const ros::Time & time , - std::string from_frame, std::string to_frame) - { - geometry_msgs::PointStamped pin; - geometry_msgs::PointStamped pout; - pin.header.frame_id = from_frame; - pin.point = point; - try - { - listener.transformPoint(to_frame, time, pin, "/map" ,pout); - return pout.point; - } - catch (tf::TransformException ex){ - ROS_ERROR("%s",ex.what()); - } - } - - /** - * @brief laser_range_to_point converts a single given laser scan range in polar coordinates - * to the respective point in euclidean coordinates in the target frame - * @param laser_range range of the laser point to convert - * @param index - * @param start_angle - * @param angle_step - * @param listener - * @param from_frame - * @param to_frame - * @return - */ - geometry_msgs::Point laser_range_to_point(float laser_range, int index, float start_angle, - float angle_step, tf::TransformListener &listener, - std::string from_frame, std::string to_frame, ros::Time stamp = ros::Time(0), float time_inc = 0) - { - float alpha = start_angle + index * angle_step; - geometry_msgs::PointStamped pin; - geometry_msgs::PointStamped pout; - pin.header.frame_id = from_frame; - pin.point.x = cos(alpha) * laser_range; - pin.point.y = sin(alpha) * laser_range; - - try - { - listener.transformPoint(to_frame, stamp, pin, "/map", pout); - return pout.point; - } - catch (tf::TransformException ex){ - //ROS_ERROR("%s",ex.what()); - } - } - - /** - * @brief laser_ranges_to_points converts a given laser scan in polar coordinates - * to the respective points in euclidean coordinates in the target frame - * @param laser_data laser data ranges - * @param start_angle angle of the first measurement - * @param angle_step angle increment between two consecutive laser measurements - * @param range_min minimum valid range - * @param range_max maximum valid range - * @return vector containing the laser measurements in euclidean points - */ - std::vector<geometry_msgs::Point> laser_ranges_to_points(const std::vector<float>& laser_data, float start_angle, - float angle_step, float range_min, float range_max, - tf::TransformListener &listener, - std::string from_frame, std::string to_frame, ros::Time stamp = ros::Time(0), float time_inc = 0) - { - std::vector<geometry_msgs::Point> ret; - float alpha = start_angle; - for (int i = 0; i < laser_data.size(); i++) { - if(laser_data[i] < range_min || laser_data[i] > range_max) - { - alpha += angle_step; - continue; - } - geometry_msgs::Point point; - point.x = cos(alpha) * laser_data.at(i); - point.y = sin(alpha) * laser_data.at(i); - - geometry_msgs::PointStamped pin; - pin.header.frame_id = from_frame; - pin.point = point; - geometry_msgs::PointStamped pout; - try - { - listener.transformPoint(to_frame, stamp, pin, "/map", pout); - ret.push_back(pout.point); - } - catch (tf::TransformException ex){ - //ROS_ERROR("%s",ex.what()); - } - - alpha += angle_step; - } - return ret; - } - - - /** - * @brief laser_msg_to_points converts a given laser scan in polar coordinates - * to the respective points in euclidean coordinates in the target frame - * at a specific time - * @param scan laser data msg - * @param listener TransformListener - * @param to_frame target frame - * @return vector containing the laser measurements in euclidean points - */ - std::vector<geometry_msgs::Point> laser_msg_to_points(const sensor_msgs::LaserScan::ConstPtr& scan, - tf::TransformListener &listener, std::string to_frame, ros::Time stamp = ros::Time(0)) - { - std::vector<geometry_msgs::Point> ret; - float alpha = scan->angle_min; - if(!listener.waitForTransform(scan->header.frame_id, to_frame, stamp, ros::Duration(0.3))) - { - return ret; - } - for (int i = 0; i < scan->ranges.size(); i++) { - if(scan->ranges[i] < scan->range_min || scan->ranges[i] > scan->range_max) - { - alpha += scan->angle_increment; - continue; - } - geometry_msgs::Point point; - point.x = cos(alpha) * scan->ranges.at(i); - point.y = sin(alpha) * scan->ranges.at(i); - - geometry_msgs::PointStamped pin; - pin.header.frame_id = scan->header.frame_id; - pin.point = point; - geometry_msgs::PointStamped pout; - try - { - //listener.transformPoint(to_frame, (stamp + ros::Duration( i * scan->time_increment)), pin, "/map" ,pout); - listener.transformPoint(to_frame, stamp, pin, "/map" ,pout); - ret.push_back(pout.point); - } - catch (tf::TransformException ex){ - ROS_ERROR("%s",ex.what()); - } - - alpha += scan->angle_increment; - } - return ret; - } - - /** - * @brief get_max_move_distance searches for the nearest values in an defined area - * @param vector points: laserPoints in base_link - * @return float distance to nearest Point - */ -float get_max_move_distance(std::vector<geometry_msgs::Point> points, float min_x, float min_y) -{ - float minDistance = 30; - for (unsigned int i = 0; i < points.size(); i++) - { - if(std::fabs(points[i].y) < min_y && points[i].x > min_x) - { - float distance = sqrt((points[i].x * points[i].x) + (points[i].y * points[i].y)); - if (distance < minDistance) - { - minDistance = distance; - } - } - } - float maxMoveDist = minDistance - min_x; - if (maxMoveDist < 0) - { - maxMoveDist = 0.0; - } - return maxMoveDist; -} - - - /** - * @brief Calculates the euclidean distance (in cells) between to points in the map - * @param a Point a - * @param b point b - * @return euclidean distance in cells - */ - double distance(const Eigen::Vector2i& a, const Eigen::Vector2i& b) - { - return sqrt((a.x() - b.x()) * (a.x() - b.x()) + (a.y() - b.y()) * (a.y() - b.y())); - } - - /** - * @brief Calculates the euclidean distance (in m) between to points in the world - * @param a Point a - * @param b point b - * @return euclidean distance in m - */ - double distance(const geometry_msgs::Point& a, const geometry_msgs::Point& b) - { - return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y)); - } - -/** - * @brief findValue - * @param map Pointer to the map to search - * @param width Width of the map - * @param height Height of the map - * @param center_x \__ Center point of circle to search within - * @param center_y / - * @param value Value to search for in given map - * @param radius Radius of the circle - * @return true if the given value could be found within the given radius around (x,y) - */ - bool findValue(const std::vector<int8_t>* map, int width, int height, int center_x, int center_y, unsigned char value, float radius) - { - - int start_x = int ( center_x - radius ); - int start_y = int ( center_y - radius ); - int end_x = int ( center_x + radius ); - int end_y = int ( center_y + radius ); - - if ( start_x < 0 ) { start_x = 0; } - if ( start_y < 0 ) { start_y = 0; } - if ( end_x >= int ( width ) ) { end_x = width - 1; } - if ( end_y >= int ( height ) ) { end_y = height - 1; } - - float sqr_radius = radius*radius; - - for ( int y = start_y; y <= end_y; y++ ) - for ( int x = start_x; x <= end_x; x++ ) - { - if ( map->at(x+width*y) > value ) - { - float sqr_dist = float ( x - center_x ) * float ( x - center_x ) + float ( y - center_y ) * float ( y - center_y ); - if ( sqr_dist <= sqr_radius ) { return true; } - } - } - - return false; - } -} - -#endif // TOOLS_H diff --git a/homer_nav_libs/package.xml b/homer_nav_libs/package.xml deleted file mode 100644 index 7f2a2eaa..00000000 --- a/homer_nav_libs/package.xml +++ /dev/null @@ -1,23 +0,0 @@ -<?xml version="1.0"?> -<package> - <name>homer_nav_libs</name> - <version>0.1.1</version> - <description>The nav_libs package</description> - - <maintainer email="vseib@uni-koblenz.de">Viktor Seib</maintainer> - <author email="mknauf@uni-koblenz.de">Malte Knauf</author> - <license>GPLv3</license> - - <buildtool_depend>catkin</buildtool_depend> - <build_depend>geometry_msgs</build_depend> - <build_depend>roscpp</build_depend> - <build_depend>tf</build_depend> - <build_depend>cmake_modules</build_depend> - <build_depend>eigen</build_depend> - - <run_depend>roscpp</run_depend> - <run_depend>geometry_msgs</run_depend> - <run_depend>tf</run_depend> - <run_depend>eigen</run_depend> - -</package> diff --git a/homer_nav_libs/readme.pdf b/homer_nav_libs/readme.pdf deleted file mode 100644 index 98fc92ccae14a8a818948ce4c73a8926f6ad2028..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79468 zcmY!laB<T$)HCH$y>R8|4K71-1p|frq$~v+8!mmH)V%bP3<X1DV*>>+;L>-?%qdAN zQqXtHNi0cqNlngAN#(M$<0>vGN=?k=s<^c^Jh1q-8Bg8&^%rhG**$BihnI-_<)v?T zt&7h8dVAC9lY+^gm4fX&^QwM+W#%|FaZ1YT({VZiEGPOOus1wAsrT??d$>*A{k*un zmHHKvG}S^CC!Nim<ax3rP|bDS%n6m7R!-g@6u&lQTHWrvJKN&_?)^D+j#1ht8;g%A zx;&TFlt26LbNyYtKgxUVa{1r?QmQB2zmUG!NGsP-Ec5O^k?Uu=ju-@YC_PAsIk0QP zS!ESH$?K_`EDy-Z^FLTy@+(#K)RtY5oOADmT6=pP;7&fU`&3Yi%#?NV9vjZF?^gQT zlJ@rE(ZpQqO+Pl@&6^v$zx4L8t%vX3yZGmM){XsahT<<@HmtjSRjO|7`aSLv%=4Hh z7H@5sH@hd*NuZ>?u<=LDx<2>k<&Re_Sjj9TaHwc`AKU$c3vSD6t2f;J+87gfl(|bN zfMx!}M1{lEGPl-kySOob_Oq{%YyRlvrB*xbby>rEn#;H2{h=rkGfhE(IlH)}<2={? zdHbNO@ZBQGgk@4O4zg3XXIz~qbAH8(XSeKTy}47CpkKhPFxA!Z&aW2}qnz8HG&ao5 zV`E?VQ}N%ECgbKQ$CP8k9J+&^aX6pnXz@}BuoSY(FxX=y`z<_ZWm<>T^Sdt$A9As= zcRW|TwXB2PO?cPw!=G=vJ+nD@#yf3`;+gK<;X%vQ<0l)q_spvB{{HZBw)KQx6UB43 zUTgK!zwm&i;o&3`KbaE+m5&y5XYW4DVR4!J$f*pAHl-u=C0qGDTeY_;M&DYt+)$9Q zB|e9B=JtJS*j`UtrnBVOm0y2XwS4(pUh%&1_JV2)S&thJQo?`!+xC|4T-oAAZV}H1 z|9tHZ&Muz3!YF-DhoIV}vcJ4_-_JQsVX`mQ5mgP-`SUi5ooD;MZL9efZg8!e@;t*a zL-fkT?qvsWGF|*Gkm#*!(KJhz@lUc)eBsI(Tdit$hYS<8TFC<4$Z1C#s$ELf<Ryj0 z79MQWzwYdE@5_RdVKYrKJ+>9AH>}ZKep5MOnQ2JrSubJZ_g*PA4~<V-aO7D!o%RlU zVH2p8uGB61TPQyu!_ZgsRJrk8OFhMw2GvtPh2HOzpS_LQ$@c8`lkXN?VElXL>%CIb z+<Lv`7BiNJEPKPZ)hMNT{c<tGy?540y*{fG{csQ01C1R*fhUZoC;glH{LkaaGZ6yw zo`}E5%88ivM1Ol|ZHtrarOWSst-85&uJkwdl=eq9dn4+PMtNVW?JoPi*m&9L9-YU% z9X+0M$wA?l57}&+s2wR1aK7C`(Z~Bf|J|2)7QL!>+#WhV&w7#c-)pI9f#>NDhLztQ zhZuQ33E)g!ryesYpkso!#OD9YCMWH@@;P*$+}gGEdA22!pRs!NYP39D!=QKePiOF? zthYB7bw8IBPD`qs8RT?KN$&Jzqvj==GafxYthgs(Q_UU=iwgIy_F#L3{+hRCOIB|C z9dK!C)Y^}>6CK-ogZmSVrv|NcWZw~g+r;cu{pzY0tQFr2PYV>zxS?#{przJ&E9FwH zz0Dk{JImwkPg_K4Eeml}e{ueO3%{9I<e#189CNJHpFMQYZ)v~WGjpygfB)Lo^$B-` zpI9ZIdJ=q0^WWmD-j2Z+KdY*}-z$EjtgL;8q~h~;6LT3JO0(I;DDX_<KU7%fXdKXf zN_pXz=>2sQ^LHjzzESO8>N#T)N5i2-3JYF&GhB&&bJeCKx@hCwL**)xy$@#k=5n68 zF>%Sgz-<q<eEv{&BmC^Q$~eulpNx(@i<wxr+%3F+y;nw?%e)(&x#kym+=|aB{SasI zIqUtRY6Gj?wTTut&pf;P?5ch4llT&@)VvgE;hCD3lAn~tWo(F10vjqAS{hrz%3~u1 zBSRB20~ps>0nSt~GBUF;A+n_2Ql4C*@@i9A&h3{H!ne2Os>|NqrdFnArnb%U;E|Im z#vhMt>($@<eed%(#n=A+UK`iD{KuZJVWH*06Es#{;+}0egF#j1P3+5=k~1n8iau%a zl^y$bM(2wX-?lUcF*Y?dGYc-R!1M(hS5Ix;J7c5v1oi_jvp54xO8*v=ux&6fEIb^@ zpwjrw;W__O$pc5Y75Ga`!#)?W7%{Kt{m<mZr?>8l+A%%(tOa{pr`k?<cG&gG!HcJF zo;q~tt3OXz)i3*r|0=o-7*cwCb7gE|a@H^$`<BKa$yUkM(A0dq{Q{T6+XQ|C#we-V zvzTShFlIUEHtbrpqf5&n$Tcw5b86c|<qfN5FJ9dI`G0|6XlU^CCCnY1+ABJl8>C7Y zJWE5j+ON-Y_|5-Mtb~DeEC1j5Hu7!tcb*=-+H!Tv)FU$`|IcAOz*E3(wL9Xk=kNGC z8ul|7|M|W>eD%)FgYVX}Fl2d$hr7$Ux$*P!vvHe?hqJM#bF;bM-v47|WYkUu8<{z| z4D#>KIYd8*Z!O$x{##@DYSj<#8S2-uD5R%yZ7FB`S2(HQM|9@*z*GFo`FFnF-%%@a z=&Qfa?fqvN^&B45FWG2P_VaYOpQk5ZLV8Z>d#)|!+sywOl$e&47BfoxRsCJTbaur* zH4c`JU6$7WPb&W3ul2ls>CgCAN__I_mp6a?X#DNRduiis<;5TWx##}-d}A5kH@z^u zb$a#gEKFzC<}}vd*!^dxvG(u%DW48;T@re<D(g#;d~dqH{`(Jsvej(i{@3@f`F})M zZ1Q8q0>eUv89Q$>_{jTe<>jlrN=W~H@D}Sk|DQ+J*u8r4>cN|%KjLF^lixo`eE<1= zP_cHk@n`!`^Wx%^knP)xikQ8+|MtIa=XiJDh<kx{11CcX6N9a<uH^qEzg7qT>zMh! z!`|z`^T#h9a2S|xD`or@Ig{D`-h-N$p1X|<;pyfJ=AXA0{onauh9zTK*s^u<zW)q0 z3hG^_Z!<4vDEP1YFX7YvRsVO^z1rV4<yo@RS(!Jvdl}LkiY?q&*{}DfE%^7}IQjon z??Y#=g&n-X=ka$w>)(9sWNYo{_5Zj0)))4DAiwI$|MtyOyIZEJU+_73>gttG?^pfP zonB`8FQY24nmhWz@!mhGLH~{2x5@MV-dM8c-y0nUTVwU#^)KzJE?zk%_u>)Lg9ksn zS^um!SpV^_#vl1@3~rL1teL!1{r_LptC#G&J=<zV<jrV?h#Qs+$IhKQ7FXaSZ+qa- zIld2x|1wgI7d(&mWlBidP+su2fYD;t&R>jYWam8m7o(!C-4OVz|3&^0zJw`%#UCXx z8?5@vU0BQ{(fhx52SbnAf44gfZkOv7)6~=$7T>g2Fm4e1!T)38kyr8`lqbF2ulTur z{a^bB?duQkSCnRNxOnpHLD3)O-hXeuX<qf&{((E!^m@l_{Ll2Z9n+ik-{42bXaDc~ z+}rEtKRf(;ee8>*R}cR1KRP4tbN4@^J>T1p;(yL(2mji<{-2clvikdv|Lc6(zhTwt z&CR?4mruQU?EOYw?bES!=fdXg@{!+s<d5S2ia+nw|Ni%I`1s!R1Ao4tAiKYOm6;zO zgDtnXdBe=PlRq~rX)nKD|6|s_y}|!yJ??M&9sehNA!CDs{{qcBm-aMk=C3HN^8OKC z|8dbwE)TA}w#iyLjJh*jI+mW9saGSj@sDoMf`r0==mfFUjm>jJ`uEjmO{iTd=Blym z?d_;)udiQvXKuQ%ZR7qu_I8tYe5jbm)?8IE?N3sIE5GL1g+6f$%Or2-gt;fN3p&*P z@tCrE^>@Q*sjp<eYW0S!UzEI+;nLzK>c!e^n{{VBSK^8@|M$qpe8ubE%5F71AI%@C z-m+YLs9;T@q{i`oaU!{gvNyRHJzDyz`-|iLZnOLIH2)}g8UB~@+5GQc(Xr2BOwMOs zv8fjMX8c^)8?trJ(xZC1+ZpaHpZcs|u8pNM>p3Zlb1i>$B=<S;^SInCf1v(WRv>8K zg!$5ePXZ2hO|;QEeEQvU?^*k&z3%(^D)6JTm%pi)`HG{mALFC=uipFmETMhx0UrH( zC-gN9u1!3D*q>qR$tnB97aq%tS!8}Yv?i$R+V77KI4w8k|ClWG=+?EMZ8Ns@?_Xj( z<;>}<8jtn@|7}aFZf3gizUVyW{NhA>-czT!Nq)U&S25pI@0_&QR^zzkvFe-G+-&PE zt&pu*X5pD&d-#P!-JJX|j@Q<Y?4BE{-^yHE-Vu6IP&zPQF!J`wZ4HY0<qeCz-R|?? z;@I!;Ym(c)bvtEsCbdsIaQf-|o9|xkj;T4rU8;LB`IbjRF84o!Q!$rr*}T}jk5%+V z&AO%&>&~ULc<?UNm7o4UubuDM9Zu(0%HeO<y>$H(sjL68`hJhSRLh&Mmo|P_C_m-T z_XP{@va&mGoj0p$lVV+BaU4sRNSW)qo$;=-?=Wt*?qEB%>ed!l^W{$^W1sSwyg6Tc zeB(he3GGL&CrdhGI182H7j$LBvY*{>NkdO@$GgOub%%c2$$yNT6@LFj(vKbIW0xLX z>fCeX8SCV=NiHAGO!60;{rtw-@N?p~bn;D;*43&CEsvkqT*P5D>B6GqiOh?ZpFH5v zC@M8!!2vl93*&v#_1mSI<}c3dzI3%}+2b<3CwiA$PM7b{*(trzvf!2)_s!oE(=<J{ zPqk`NnW6Qsb!$`HIuWn;lc%k@6Y^)(3mcPCi{JWAZjL|i*LZNtEI<2bw@LDfohR>c zb;+IG5L4*7zLNFA%d@Tf=Wk5y?5MYX6%$Z&)zDpj<CVWhvOajWO8mU@|4>Lu?bQd3 z`75>G|DTnpW~94Pu6$$mzMhJ<XS08&el2JzKmP4q`ro3&vwDX&Dt%$D_|Z|k*=_O4 zP1Zdeq7OZ;dqkc+Q+<(>r`*=%u}nFieCOvo+h-rTbpOGhYaM1XJmx1=YifSX$*DXw zmn~Ok&i!uXogX%AU%h>ub@mN~tX8imrB|vlg%hoVMFY}|Ss&{B-tT$wkpDh?$<JSS ztv)!jncV+z`F~x`wx<W`wC~inhB%(u&?+usv-+XDL9<g1->q=LlfRNY%I4ThEi_)d zFQQ)k3-iXeZ2QE!0x#Ko+|nda<T3ljmi?iwJHI<#Zd9mVkw3j<_B6qZ1~&SuZY(jJ zbi7IZ?v$#}NjpCTKiI+kT#EI1-R4D%(_WZ$9BF)CnzQUjxVZWJy4#8#90h4zH!o>4 zeKCx%?LAhxYJ$m&18!?la=lkCkJi5RNxk^u^wwzR=TjnnDb5vFU6XFL^41)Km`zU} zJ_vi4d~xH^#&E@}ZSghzE8g(TKee}!Uo-MUoQ3<jI_sYsrS1G=c6~gfapqR}FP~Ib zi@y`h%3~%s`1QK7UkYwq<;ZTHqIme0$*CO&l5U(_(VH!Ox=Z5l&0gl^QzIv@5SDm- z>mv8gK(mEsKkZue@9L|t^8(_^*L=G6S;V!}dKaZEnQ{30lbA@G-~~H<mQJ<aSH8_Z z%iK3M%*ZC`!&Qg4u=w3g#}eLHynJ+Y##+tyadWmEH>_9bYT&qBP*-x<_)yeMe@;G; zs*|T$%8n%kT@-0NR$G6&@y2DpU)$vP&!<QqU+&xXYpqLM`Rzk}jq0U)`<|};xci#Z zn&~N?9;Ukjd?xBW5<NBb?fGE)N!u3{EZ<~(CazDFefqxoV`BF-6sq5Osz(WZ`NV3? z)%Yo;EOeq$UT<x6?uCZ}>z{p_wRhzKIW_t0E4<#1H(M`VVtdtI<?Ehf=@&#|O#Gv} zSOkSrW^TLmmR*09R&Pb#o`tnCo+`ilxEHA|6U{T+;1e6|bggj9yJD|1tJklsf4!uQ zWAVQuFTbZqR(J~vW}oes{_&T6$*wakb|qH@1(l}mTy%Hy-)a|~IZG#66fC>`*0iem zP3PnG$ZY<jkD0SJ{uDW~T~n67HTRW9k?-nj!ONzrix}<rd67B7?9c63=C#?cDxT|q zZdjt?mSG@1RqwvZmY0R@bKLS~{x)_m&tvXxe5tcsZpE3s4;{C#XJ=N&^XJI5r2gRK z^tRhnG9k0;jrHkow=cGsKHFk;^Y4;qr5xRZ^PirX7k_C-m(6AEJH;{PQryOM%T1DO z%4{r?!!7mn&IWW$?YQr%G<Q>BdfSR*pDopevH1(Go{Ij)&FepLVS?Vrx%?CTvgb^T zOa4(Hsjl(OZT?NubMKNXd_OgOZQx&do%I;k*45|cWw=P}6i=A@lf8Au?#Zk!d=Kr` z#60JdcqdThm&~~Re)=Zc`}r$Yuh^wGBRO%&<gFfSi)Q8r^4eVGl2i@)IA#42&G&^5 z3#BfGZ`G2>^8L6(YkTmSWEl>=>{atk17zpzWK)vwb+uMfuvA~f%Jb6xmab&xp^%{M z#>WhT=ctr9`yXs%x*6wtkK^mP2Wke><U_cxl^>lawN9eP<npoN^`|0SPuu*OdN%9Q z9NU%Ryvg6^FkB7WcT)XA!^IQKSBq|COQlZT_h*&5s?Fvjg>$#5^sv-+JWyRz&n}$p zHDev;Qt2}-mEC65&(7r>?DJkPFMVk5z4T2H=Xo5x1+pa{c=Rq<$~iqvDrn;K-Lu~; zTa;y*wsu}=A4{d@hp*PUp*$^mimjhH&q%TTT*I-*YDN3>q{mVI{_6}<j?Q_cnx|TM z!o}`(_}p%`n+`csj_G^1$4}jP$f#K;z_nu5WDfqmwl(2f<`wR%<o4J6c-82~^m{w! zNNtM!cK(obYLd|!U-2lb@{dPZE+r-D^X?b(>{5?=mceyJ^S)NPLX)xiny+FHwHI>C z+H^r-<%L8(_0<bB7idgREJ`nZe6!H0q%?1z{gW)8bnZKjb$pF~?F_nq{OQ`17tx|K z<z<|(2h+m))8|@6DX%U#AE%`A|LBE-+^i=9_ss1yVtA?XnqkAqNgaOG9bKCr3!l2w zyZu9{(Zr9Jt34hrSj_j-JKbT<4~xe^tcR~#=-FK0vt&&RSKp*<VUeEm`S{YH?|axQ z6e|`@ovw9R(<h7Zxv=5<SMhhFN>{P|;O@J#^UV1@e-im(%Tsn;J<<^qz3q)fe%gv~ z)%8IeY7;}hxcQ%HS$wn0czx*`yR#`xe@>`nh`+e-<?dwO@Q%Yr8z)Qpi&Q!~HhuUw znP;-nUg29^W&WEU>00xgQNNcj`1;Y|H6E53MensfR)kM8z9EyhVaC5tog0o?w9mP) z=uzm&WoCZf`)`+3PT0R7_(-F}y4@SxEi%qs%B%dj|Df8IGPe_xuYUi2ch}vTuT||k za^8G5sg}$9|77ElR-5vf3vO<eD*WYe<7cy%(xnCK=lW;=aND}+*3r#1XEZ*3J28Dl zh?Mt3?pJ&6M;x0NGeQ2sUOmm@{${s!wNx4Z6+I&_AD1q2Yg)=QzU2uW@y|}gKm9x_ zo1fj7^~j^Yv7#ympJl4lE@pb?aq_C`!UrZ^@`sbm@3}sE;8<r~P-PHVA`>h*dqKtL z5|{b$AD;wvFkP<Roqld#;)`I%JG!5xaz3jcf6}@^+DvTM!OZ_R9<A_AiQyESK3OaK zw$-)J5Fd`~a#|V^pI_fiN;|&Pt0VqQmVoe@V`o3cgxXG=COqZOg_G+~eRyvCw$P_; z^NK|^2j7`Ana0kGJW^)<WX0Zw1RjRgb&<{~+teQ|*!MiYMDVOaE~~m|#^s;k4r({2 zu9=*`G~>>KQ~t3zadQgq-$?p9)7pLidpqliuGg}>H-~@nNt4Z<yu_fhO=DN&p8RPW zYg8uNoas7Jp04FQJ>txS!v;rQ9*BK+t4(ie`<I;jy_4d5SbYsSr#rpPIUc3Ow?$y{ zG|4-a{YSdq7M4d}xw`qw2A|6Om*;dD;~00I^?lKKTCn;m=a=RUejEQS<^S0Hb9LF4 zNfq<@3-8|F*Y>#nIge|>!oWGpg-q1GpHFJPzScJS(ouFp1N}p*SIFKzot|`i(J}kZ z)?M$le&2j7eJaM`;Kh`-J?=j~oOHOYK07IM`^;dcJ7QIOONE(NS<e(LnElAJZ+%=w z?&FSA`5WTbt8bh;=Zt^*gw*x-@}Ifhp370-Tx1}S)w6ykOLT*1<8-yId<EyQ=-4$6 zW^ekfH|Ju^Q`HwwF7_TU*rBzz<7~^dqQ|^{`I5g`sK4TkyX+#={=p}8#j(1-)`Inu zHyEzq*Oxxz(;Vtqdj4TjqV<m%Ti?x^{HQBFc>mkonkjxAKekP8TYU9l#_E9NFaEK9 zPbWVY`Ss>U-RF|#pU>wQe>Bibx_;l~Vte`Q2kTx;JEnebf#rkaQN5q;3nZ<H_>vcA ztD%_w<iN!ZR#x)HVxcQl+&50x=47(LW_2XvbKlMTW4F(fEIBMM)O+mcq8^t0_Qsz! zgf`2tx<>>WX8(5)X3%^q^M|c2N%5%9yd%y^`_$L|a-MQx%Y_BAD)(^r3#e_A&W~pP z!e(um^p0ioLaX+7Yt}vAd1CwP>VHxX^zI&sUjHySxgz6IqY=~p>k-a*bK@p4Gj@sG z++Ahf*>^HD_T1;_=Z4eg#;#p!wWjKyJjc&#oiCMo=kd(0ySPMT|6vQ&q@4nj&0>pG zH`>fz^wDYNyZzZ51~*#_mzr0uy7Jg8F#hMYo4z(&%O43bF-Fd4y`&xB#BRmBfz|oj z$>#6#9S<%2rCjFP^>x~{ivf<)Ric+ovC!DKVg6f<`5VOcZ@aGdwWv9G{p<+NHEFLk z#HI^AZFf_hT{^?_PuA*LyHaLs(0}juPe)hk==nY)>9dn_Mc;|+`@Mj_>dWWN_FFXX zD|Lx$@TV=?qZe?oeTh`E0@ti_RSQ10pOrM-Hvf^a1mF6kS;e)C{USH#Sv*gF`}WZl zmuXA?6)!fLEAhs-`dW;w*!pV{H;-p*;%okq$r1O#Z|2LrA{Mt+gf``ys@TpqirHd+ za(c+CS6Pk`X+3<Y96K6%EuxOd$=j^i%-6&HY8$J;R>kCJhc5_c>B|~*%}qI@#r$fW z+DgOr?)`xerkq*2DZ}Jx<1>fqnP$zuewBZ^JVB~;TX-JF9dmu{M!CJ^x$6`U6qp)a zbH8<GR;j*QoVrT{hwfd4MPJYUpJ#vKiSE=6GgVvlsH051Os`(5hp`@s-2495ckk(9 zi@vP;`RBsyBRTx9m#`oFYWLWgPt&nU=l<#XY~5X)Cq9UFu2JZSG<#6|BSx2-Pg;VV z?W5HF&$km)F7jUdXgE8_CWb#I`Q7ewFAtpB&QR~4^Cdo;iO2kp-QJh8*00)m``zQ^ z9*;jb=}r1|e%*bOud9ArIQ=P>Y2o_$_f>ut(+kNwvBmj(6S}$D<mzq2CuJ(EcvtgT zIC1jx+RcB9*f@$rxFc3PJdjnmr``9X_^&hW<=j7-HXYnnrM_UsjaSaQR$guVn>qV* zh4HFs?ys!p&VG^{k`>;y%0gqSmS5@3-CM=J`c!u5Zu}?uBSP44(%LJ_7AqNV++^|4 zrey76rSc~h!B-CL_N?l(E;qRou`k9=U!VOg+gyLazl{|ksjq(Pzhk_aWG$;CsJlz~ zp-j^2ko~t<xA!P^Ol-S$$!Lapa-^!ot4nMqzb{U0;afakJox>Df-ePL_RObd%1>Kl z-1*5&?9#qDYy5A|c`nQ@(CGAZzY6<H(@e!1YHXfzEisSmPR1mO@n#-=5W&&Q#jGP* z#%cW}wers8;{6|_&xo|o?$lhU*e#$QQ1RjCbcHhlai2P5ypkiF+Ko*=7D#>iaqH%} z<9oGFoc?<7plHS94UKERo#ePZbuw4^_ISsLsAX|#);1rH{P_`ga!Y~c67EFCXZQC% zy=*M8+UAW_Q$DXkP-(}CcSoaFHAF-(FX8;W#k5b(gt>{u=yC1|^`Ndl;`c1X(`IN) z%~>g&b<C=C!*wP$hy9IpxpyvW-kg!T$mGk7|4X|pRo^^i5&rZbvtUd7!SH<f52`l5 zeVR{g`&sR2A?@*;$yMEFlK&>tZ>9Sh)PJkoHTbby*uvr7MDFjxjP>m&UzPk~di<X0 zdSkD9)v1WfX>XG{uGVrNxq8#TNJ(g7Md)6!6SD%>Tyfa4EKy?SvhHJ38Kw6qoj<$j z$9v}svc0c%O?jnfbS%ZPuu)5R#@Rib|86wSfArDtrg2=j^WOvhY<a0~w}>u$Y9R23 z=UMjZh2J>mpWnIv<$RgTGaHpXcYg5uYST4&p}y7~XNCT_8|tNJ9zD%kXzjN~r!lGO z;*M1;p5=Rg{XRUg_WH7{Dyuu)JG`$yiP-Wb?(Nj_6aA(C_P8utxVA6p?2j*IPlE&l zmHdi5817A3DfHxtb!4N)fm?q?3J!^x=<p;?elC6Z$f4)^|8C2_`LSDJRu_X!h?v9q zVC%03>*GRK-|b@G_vGBoZ<p71@tC`9H>|6l@OA$3y-rEu(UZJqt#o_z_1KvkKG(N4 zHu9YRc$aUp_lB4A4#soyO_+B*xkEPEhV^v#r{`a^`yX$3A<3nEJl8#~XiAXZ?Z0}) zSBkD2$~f)$XQ|XHt5-YbT<GcuJMNINN&nECn^o<n7KgCgiU!v2;${h!3A_5{Im^eH zTcUrTn^YZ~=6}EBy~0cT@8T9y1C@{74^cejIx%HV!lX^H_xB`ncCXK97BpS_^2vtZ zRie7a?z31PG~M94_`FNF?r=cW)AvUTFYQ#@AldFO7w|5s@JcIVPSO8M+qZo6zx}N7 zY|JJVjp_ueJf+9N!e^do2<8@qNXqZK5_`$u^Nx!*o`x+hSvPyF>E)HVg=f};9f*)x zAJJd^#PgZYTj~0;wg}V2!)Y1)USA)tPrSR(qVCVtiStz)tPCYhmk0gwWw_hTz5b~T z$LXyfk~#H$ym75hS$6(_<-Pig`z^Mptlcu@o?S$%r|y@PzfWGApt>sR+s;%0!?=4t zk8JT{aa`Tp_Tj|NFU1XRQTA73?EkUelI0DZ=o!DM=5+Kwew_(!?T6LwG%i@`X~)eS z8=u3rYyGKB3s;L><H^?DdSt74`$mS<YeN-pOH5Gvo;~U7yNO5J&QEFUHa;>vUD5w_ z&eGkNx2{T_&g>#;o8((<b)Th8_?3Coy>lHu^w-3M{YvVXyRul~;g|b-PnI8B<L}aQ zV#7Lz!yGg7MSBi(HAnKUW^CPg-B2R6_{fDv2bfyLZfv>ws;en#&6HEQXQppHBPajp zYZr^jn|bMCzmAwJ<#us3Soq4n>_oWViS4@<uQx7f);#*gYN?*+u~%&EEeoDceN^tb zkMYqJ`*n_5Po#VVVl^E-dgPt6g34X_Y&g3Yhf2+vd3@KJ*5wB?m*?GOK5_Z7oxAMJ zwU(M0-EO+9c~|!TSGwinZN(b4C#7rtoHR$x>C+p7rfxl>esq?azLxfNh2!eJ78VCu zz7*edj@*~5X%laI)%9U?)JK-C_`7`jrXHBP()hN_|7}mc#drVt^je$OveeqW;Kj=) zb>5SlckZ3CbCO+G!QGiQg7-G}I=}q+*yib)IgebF+#dH!#>ZGJV|Dxa&mcMOS?OO> zt&)3{Z*pFJ*!nowH!9YD`hw1{(zlLv?9qAhOl<eWcV=Jxe^#W&%w~wqh<CFxj&8nY zrE0&$y|VMlJK@sZzt@+&*ugyS6Z=6EgOjzrx7<6{Z{1*>^3J6%)VyG>N$Vcr=;lo& zhjzK!v4tKI-tc8cbn<8Im1e#I$x}IFRKtR7wboy<ShD|j{K6)Kqc&x;R2m{C=Km<n zWxT$#uF0rtp`n}lpBTZi@BiB3jVopd>}Y1OeY|1j*4cm9G^(z}K8mW-Y&A~pxfUV( zsr=RA8Eq%02<+?4Je!}s=!d^6=a(O|CBNxQ7n+5BmDK$AVPUGs-q_D;-!70m{!@1r zyN)7v{YERhztaS+RQJ><?44@zU*!Qa&({;3>pp*)vBl&`-qDup%qO>4|2L~&7o{Bf zHb2$l+0qFII$zs;*^;>^UudHCYT<@Ml2aMay}bXm+u^qOd%jkcy$MG=6_av*C#@5> z#j5_QZ~c;o7py)#+xTJIljrLqvX2Qix14*<w2rZQOYn6znfX2O*Z*8)UVV_|%GUXP z-LYCn87*Yl)%QzvZHc^5<{y{-GG*iJ*@d1z<R{c?@!gjC(9fsV^)&0*q0)mMH_nQ? zEuXe%S#wA1nf>vyE?do>+oUW$yS#Ks#hJ@7(=U7XvOZV1Ay8lIDYt!Nt;=^y9r1+O zYTcC*S6NHve4luZ@u25++4c<^T#rSR?kan7h=*&=wTr@iD>$THb@*7N|M~SGcdp)& ztAAzR&gAJi_;$LyWt;rgf?GbEX50~{++=yus~6<1EAYHhIg{;ph53|sP9K@R$mxqF zn^$g(ou{=y=gE)o@UD5=?unnf5%|b#<(sX|dO>y*7u-*7t9$xk|1ZYZR*K(>pJndZ zzlXPezD$bWZ^Mw1kCM$Ns+3mz+cKka@`VO*>EN0_F?$3YUX(<8EL6GG=;<}1FZ61J zvdf*9xx0=X=LlK!OD;|!%4CPu``@b{XMU}DePgrWN6}dg92@8MzqnxKw$OryqwUF! zn~rR0kDcbLaZlV;{K$W*dr$kbnD3sw6(Y;c9*LXUE;_$GHrsZwfZR0&mE_5-M_Aup z{C2qWd(|Dbrj`=t>!y;~x2k+rysF($*fwL)_ieA@@2ebKu-ouyOVINe4WU`zb=3+) zE^W=O>SC!r-{LjxOZ?Kp?s{%^;s0Bv%vjBG@?@`g%@Q*o;h>-UR=Avtx|#UOYO2|) zi<S1SbJ|olE;)7E+_1>TbjqGxllDn`5>k{2zn99lZb9p%qef2G+N#gQE@=0;C@j8U zXB_WSt?0*Mx{}|QU5{LO#&myhBp-9=tRj29#y!)6G{3G$4zM_~{9)hcj`}F+v-jVx zIvkWF9%a{M*ZM^y;GIMz|BajZv5J-^seN`k|JJ>Zn!PcvI`^Uf;yd1@2klFx-^S;j z>{MZXz9H!Pfz~w-g@3pS@aXn!R!F>j!EaC7tAp9c7V4jwD)7SQ#c6G4zCea=*E-L# zF`ac^<^A@w>Y~2B>PO37s;izZj<5IJ94#6+<GR@n&-v45@7o>Z_%<bPf@{0LNhW8H zYroD`JbEEKW1?#M=6<Dc{cfZEjx(iq=w5qfzC~U$uOM*ApM>zh4-+5#tlYrN;IRAp z$3+ob`_Jz-_rA0E*$HjSZtY3a{^#-T$$018k?$t_@^od?=kM+|@_Wpx);`qp3e=c< zQ`vQ9o-p&Y>s`757QCwF8*gvhUVP}Fd0^ej1>Gh0?{IBXVgHe>d+zcY&;7A`q<${h z*u6p3dfwdmX~qu{I7@3P8Q=MGwTmc+X5{U-U{J}G!X(#RlI^AP=_%hr30HM3jRZ-{ z9(z3%;g8a-3%_?3Iz68}FLnMSi6z%ItyWS!x<sl+sQRt;$%iF}E(K094^(`Xn$co- z-0`T--f0z1)Bj#uvts75zVMa%Sq}RBJkHA3Bk+dbyk79*p+z<mOdn=$o9Msf<=a_n zb~P9*QaZfs*0<xUdW*I!Pt}?q_{H|oWRc$R^5fIzsBZff?D6-SL-hK>S1}Lnt^Xo& zz2Z?}{K-o<0}EBp9mzeX>3Wb?>r$}Ea);v1N4CdjZ#3*R>d8J5`OMq4G`g6}F1O#s z`|)!oi@AH}$oUKQdV5_<`>4e`efx3qSgj79!;cGBoA*w4w&vDrP3vM>H+8;1k=m@f z%0A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 THI2*M($K(wOI6j?-;E0ZaiSHe diff --git a/homer_nav_libs/src/Explorer/Explorer.cpp b/homer_nav_libs/src/Explorer/Explorer.cpp deleted file mode 100644 index 509964e4..00000000 --- a/homer_nav_libs/src/Explorer/Explorer.cpp +++ /dev/null @@ -1,1408 +0,0 @@ -#include <homer_nav_libs/Explorer/Explorer.h> - -using namespace std; -using namespace ExplorerConstants; - -Explorer::Explorer ( double minAllowedObstacleDistance, double maxAllowedObstacleDistance, - double minSafeObstacleDistance, double maxSafeObstacleDistance, - double safePathWeight, double frontierSafenessFactor, int unknownThreshold ) -{ - ExplorerConstants::UNKNOWN = unknownThreshold; - - m_MinAllowedObstacleDistance = minAllowedObstacleDistance; - m_MaxAllowedObstacleDistance = maxAllowedObstacleDistance; - - m_MinSafeObstacleDistance = minSafeObstacleDistance; - m_MaxSafeObstacleDistance = maxSafeObstacleDistance; - - m_SafePathWeight = safePathWeight; - m_FrontierSafenessFactor = frontierSafenessFactor; - - m_OccupancyMap = 0; - m_ObstacleTransform = 0; - m_CostTransform = 0; - m_TargetMap = 0; - m_DrivingDistanceTransform = 0; - m_TargetDistanceTransform = 0; - m_PathTransform = 0; - m_ExplorationTransform = 0; - m_DesiredDistance = 0; -} - -Explorer::~Explorer() -{ - releaseMaps(); - releaseMap( m_OccupancyMap ); -} - -void Explorer::releaseMaps() -{ - releaseMap( m_TargetMap ); - releaseMap( m_ObstacleTransform ); - releaseMap( m_CostTransform ); - releaseMap( m_DrivingDistanceTransform ); - releaseMap( m_TargetDistanceTransform ); - releaseMap( m_PathTransform ); - releaseMap( m_ExplorationTransform ); -} - -// SETTERS //////////////////////////////////////////////////////////////////////////////////////////////// - -void Explorer::setUnknownThreshold(int unknownTresh) -{ - ExplorerConstants::UNKNOWN = unknownTresh; -} - -void Explorer::setAllowedObstacleDistance ( double min, double max ) -{ - m_MinAllowedObstacleDistance = min; - m_MaxAllowedObstacleDistance = max; - releaseMaps(); -} - -void Explorer::setSafeObstacleDistance ( double min, double max ) -{ - m_MinSafeObstacleDistance = min; - m_MaxSafeObstacleDistance = max; - releaseMaps(); -} - -void Explorer::setSafePathWeight ( double weight ) -{ - m_SafePathWeight = weight; - releaseMaps(); -} - -void Explorer::setFrontierSafenessFactor( double frontierSafenessFactor ) -{ - m_FrontierSafenessFactor = frontierSafenessFactor; - releaseMaps(); -} - -void Explorer::setOccupancyMap ( int width, int height, geometry_msgs::Pose origin, int8_t* data ) -{ - if ( !data ) { - ROS_ERROR( "Received 0-pointer." ); - return; - } - releaseMaps(); - releaseMap( m_OccupancyMap ); - //m_OccupancyMap = new GridMap<unsigned char> ( width, height, data, exploredRegion ); - m_OccupancyMap = new GridMap<int8_t> ( width, height, data ); - m_Origin = origin; -} - - -void Explorer::updateObstacles(int width, int height, geometry_msgs::Pose origin, int8_t* mapData) -{ - if ( !m_OccupancyMap ) - { - ROS_ERROR( "Occupancy map is missing." ); - return; - } - if ( (width != m_OccupancyMap->width()) || (height != m_OccupancyMap->height()) ) { - ROS_ERROR_STREAM( "Wrong map size!" ); - return; - } - for ( unsigned i=0; i<m_OccupancyMap->width()*m_OccupancyMap->height(); i++ ) - { - int8_t* myMapData=m_OccupancyMap->getDirectAccess(0,0); - if ( myMapData[i] != UNKNOWN ) - { - myMapData[i]=mapData[i]; - } - } - releaseMaps(); -} - -void Explorer::resetExploration() -{ - m_DesiredDistance = 0; -} - -void Explorer::setStart ( Eigen::Vector2i start ) -{ - if ( !m_OccupancyMap ) - { - ROS_ERROR_STREAM( "Occupancy map is missing." ); - return; - } - if (( start.x() <= 1 ) || ( start.y() <= 1 ) || ( start.x() >= m_OccupancyMap->width()-1 ) || ( start.y() >= m_OccupancyMap->height()-1 ) ) - { - ROS_ERROR_STREAM( "Invalid position!" ); - return; - } - computeWalkableMaps(); - - if ( !isWalkable( start.x(), start.y() ) ) - { - Eigen::Vector2i correctedStart=getNearestWalkablePoint( start ); - if ( !isWalkable( correctedStart.x(), correctedStart.y() ) ) - { - ROS_ERROR_STREAM( "No walkable position was found on the map!" ); - } - else - { - ROS_INFO_STREAM("Start position " << start.x() << "," << start.y() << " was corrected to " << correctedStart.x() << "," << correctedStart.y()); - } - m_Start = correctedStart; - return; - } - m_Start = start; -} - - -Eigen::Vector2i Explorer::getNearestAccessibleTarget(Eigen::Vector2i target ) -{ - if ( !m_OccupancyMap ) - { - ROS_ERROR( "Occupancy map is missing." ); - return target; - } - if ( ( target.x() <= 1 ) || ( target.y() <= 1 ) || ( target.x() >= m_OccupancyMap->width()-1 ) || ( target.y() >= m_OccupancyMap->height()-1 ) ) - { - ROS_ERROR( "Invalid position!" ); - return target; - } - computeApproachableMaps(); - computeWalkableMaps(); - Eigen::Vector2i correctTarget=target; - - if ( !isApproachable( target.x(), target.y() ) ) - { - ROS_INFO_STREAM("target cell in drivingdistancetransform: " << m_DrivingDistanceTransform->getValue ( target.x(), target.y() )); - ROS_INFO_STREAM("target " << target << " is not approachable. Correcting target..."); - int minSqrDist=INT_MAX; - for ( int x = 0; x < m_ObstacleTransform->height(); x++ ) - { - for ( int y = 0; y < m_ObstacleTransform->width(); y++ ) - { - bool isSafe = m_ObstacleTransform->getValue ( x, y ) > m_FrontierSafenessFactor * m_MinAllowedObstacleDistance; - if ( isApproachable ( x,y ) && isWalkable( x , y) && isSafe ) - { - int xDiff = target.x() - x; - int yDiff = target.y() - y; - int sqrDist = xDiff*xDiff + yDiff*yDiff; - if ( sqrDist < minSqrDist ) - { - correctTarget.x() = x; - correctTarget.y() = y; - minSqrDist = sqrDist; - } - } - } - } - } - ROS_DEBUG_STREAM("Target position " << target.x() << "," << target.y() << " was corrected to " << correctTarget.x() << "," << correctTarget.y()); - - return correctTarget; -} - - -Eigen::Vector2i Explorer::getNearestWalkablePoint( Eigen::Vector2i target ) -{ - if ( !m_OccupancyMap ) - { - ROS_ERROR( "Occupancy map is missing." ); - return target; - } - if (( target.x() <= 1 ) || ( target.y() <= 1 ) || ( target.x() >= m_OccupancyMap->width()-1 ) || ( target.y() >= m_OccupancyMap->height()-1 ) ) - { - ROS_ERROR( "Invalid position!" ); - return target; - } - - computeWalkableMaps(); - Eigen::Vector2i correctTarget=target; - - - if ( !isWalkable( target.x(), target.y() ) ) - { - int minSqrDist=INT_MAX; - for ( int x = 0; x < m_ObstacleTransform->height(); x++ ) - { - for ( int y = 0; y < m_ObstacleTransform->width(); y++ ) - { - if ( isWalkable ( x,y ) ) - { - int xDiff = target.x() - x; - int yDiff = target.y() - y; - int sqrDist = xDiff*xDiff + yDiff*yDiff; - if ( sqrDist < minSqrDist ) - { - correctTarget.x() = x; - correctTarget.y() = y; - minSqrDist = sqrDist; - } - } - } - } - } - ROS_DEBUG_STREAM("Position " << target.x() << "," << target.y() << " was corrected to " << correctTarget.x() << "," << correctTarget.y()); - - return correctTarget; -} - - -void Explorer::setTarget (Eigen::Vector2i target ) -{ - if ( !m_OccupancyMap ) - { - ROS_ERROR( "Occupancy map is missing." ); - return; - } - if ( ( target.x() <= 1 ) || ( target.y() <= 1 ) || ( target.x() >= m_OccupancyMap->width()-1 ) || ( target.y() >= m_OccupancyMap->height()-1 ) ) - { - ROS_ERROR( "Invalid position!" ); - return; - } - computeApproachableMaps(); - if ( !isApproachable ( target.x(), target.y() ) ) - { - ROS_WARN( "Target position is not approachable. Path computation will possibly fail." ); - } - m_Target = target; - m_DesiredDistance = 0; -} - - -void Explorer::setTarget (Eigen::Vector2i target, int desiredDistance ) -{ - ROS_ERROR_STREAM("setTarget still in use!!"); - if ( !m_OccupancyMap ) - { - ROS_ERROR( "Occupancy map is missing." ); - return; - } - - if ( desiredDistance < 1 ) - { - setTarget( target ); - return; - } - - if ( target.x() + desiredDistance <= 1 || target.x() - desiredDistance >= m_OccupancyMap->width()-1 || - target.y() + desiredDistance <= 1 || target.y() - desiredDistance >= m_OccupancyMap->height()-1 ) - { - ROS_ERROR( "Invalid position" ); - return; - } - computeApproachableMaps(); - // TODO: check if region is approachable - m_Target = target; - m_DesiredDistance = desiredDistance; -} - - -// GETTERS //////////////////////////////////////////////////////////////////////////////////////////////// - -Eigen::Vector2i Explorer::getStart() const -{ - return m_Start; -} - -Eigen::Vector2i Explorer::getTarget() const -{ - return m_Target; -} - -GridMap<int8_t>* Explorer::getOccupancyMap() -{ - return m_OccupancyMap; -} - -GridMap<double>* Explorer::getObstacleTransform() -{ - if ( !m_OccupancyMap ) - { - ROS_ERROR( "Occupancy map is missing." ); - return 0; - } - computeObstacleTransform(); - return m_ObstacleTransform; -} - -GridMap<double>* Explorer::getCostTransform() -{ - if ( !m_OccupancyMap ) - { - ROS_ERROR( "Occupancy map is missing." ); - return 0; - } - computeCostTransform(); - return m_CostTransform; -} - -GridMap<bool>* Explorer::getTargetMap() -{ - if ( !m_OccupancyMap ) - { - ROS_ERROR( "Occupancy map is missing." ); - return 0; - } - - computeTargetMap(); - return m_TargetMap; -} - -GridMap<double>* Explorer::getDrivingDistanceTransform() -{ - if ( !m_OccupancyMap ) - { - ROS_ERROR( "Occupancy map is missing." ); - return 0; - } - computeDrivingDistanceTransform(); - return m_DrivingDistanceTransform; -} - -GridMap<double>* Explorer::getTargetDistanceTransform() -{ - if ( !m_OccupancyMap ) - { - ROS_ERROR( "Occupancy map is missing." ); - return 0; - } - computeTargetDistanceTransform(); - return m_TargetDistanceTransform; -} - -GridMap<double>* Explorer::getPathTransform() -{ - if ( !m_OccupancyMap ) - { - ROS_ERROR( "Occupancy map is missing." ); - return 0; - } - computePathTransform(); - return m_PathTransform; -} - -GridMap<double>* Explorer::getExplorationTransform() -{ - if ( !m_OccupancyMap ) - { - ROS_ERROR( "Occupancy map is missing." ); - return 0; - } - computeExplorationTransform(); - return m_ExplorationTransform; -} - - - -// MAP GENERATION ////////////////////////////////////////////////////////////////////////////////////////////////7 - - -void Explorer::computeApproachableMaps() -{ - if ( !m_OccupancyMap ) - { - ROS_ERROR( "Occupancy map is missing." ); - return; - } - computeDrivingDistanceTransform(); -} - - -void Explorer::computeWalkableMaps() -{ - if ( !m_OccupancyMap ) - { - ROS_ERROR( "Occupancy map is missing." ); - return; - } - computeObstacleTransform(); -} - - -void Explorer::computeDrivingDistanceTransform() -{ - if ( !m_OccupancyMap ) - { - ROS_ERROR( "Occupancy map is missing." ); - return; - } - - if ( m_DrivingDistanceTransform ) { return; } - - ROS_DEBUG( "Computing drivingDistanceTransform..." ); - resetMap( m_DrivingDistanceTransform ); - distanceFloodFill ( m_DrivingDistanceTransform, m_Start ); -} - - -void Explorer::computeTargetDistanceTransform() -{ - if ( !m_OccupancyMap ) - { - ROS_ERROR( "Occupancy map is missing." ); - return; - } - - if ( m_TargetDistanceTransform ) { return; } - - ROS_DEBUG( "Computing targetDistanceTransform..." ); - resetMap( m_TargetDistanceTransform ); - distanceFloodFill ( m_TargetDistanceTransform, m_Target ); -} - - -void Explorer::computeRegionMap() -{ - if ( !m_OccupancyMap) { - ROS_ERROR( "Occupancy map is missing." ); - return; - } - - resetMap( m_TargetMap ); - ROS_DEBUG( "Computing target region map..." ); - - m_TargetMap->fill( false ); - const int desiredDistanceSquared = m_DesiredDistance * m_DesiredDistance; - int height = m_OccupancyMap->height(); - int width = m_OccupancyMap->width(); - - // draw a circle onto the ExplorationMap - const int firstX = m_Target.x() - m_DesiredDistance <= 1 ? 2 : m_Target.x() - m_DesiredDistance; - const int firstY = m_Target.y() - m_DesiredDistance <= 1 ? 2 : m_Target.y() - m_DesiredDistance; - const int lastX = m_Target.x() + m_DesiredDistance >= width-1 ? width-2 : m_Target.x() + m_DesiredDistance; - const int lastY = m_Target.y() + m_DesiredDistance >= height-1 ? height-2 : m_Target.y() + m_DesiredDistance; - - for ( int y = firstY; y <= lastY; ++y ) - { - for ( int x = firstX; x <= lastX; ++x ) - { - const int dx = x - m_Target.x(); - const int dy = y - m_Target.y(); - - if ( dx*dx + dy*dy <= desiredDistanceSquared ) - { - m_TargetMap->setValue( x, y, true ); - } - } - } -} - -void Explorer::computeFrontierMap() -{ - if ( !m_OccupancyMap) { - ROS_ERROR( "Occupancy map is missing." ); - return; - } - - // if ( m_FrontierMap ) { return; } - - resetMap( m_TargetMap ); - - ROS_DEBUG( "Computing frontier map..." ); - m_TargetMap->fill ( 0 ); - // extract borders - for ( int y = 1; y < m_OccupancyMap->height() - 1; y++ ) - { - for ( int x = 1; x < m_OccupancyMap->width() - 1; x++ ) - { - int value = m_OccupancyMap->getValue ( x, y ); - int value_u = m_OccupancyMap->getValue ( x, y - 1 ); - int value_d = m_OccupancyMap->getValue ( x, y + 1 ); - int value_l = m_OccupancyMap->getValue ( x - 1, y ); - int value_r = m_OccupancyMap->getValue ( x + 1, y ); - bool isFree = value < UNKNOWN && value != NOT_SEEN_YET; - bool upUnknown = (value_u == UNKNOWN || value_u == NOT_SEEN_YET); - bool downUnknown = (value_d == UNKNOWN || value_u == NOT_SEEN_YET); - bool leftUnknown = (value_l == UNKNOWN || value_u == NOT_SEEN_YET); - bool rightUnknown = (value_r == UNKNOWN || value_u == NOT_SEEN_YET); - bool hasUnknownNeighbour = upUnknown || downUnknown || leftUnknown || rightUnknown; - bool isSafe = m_ObstacleTransform->getValue ( x, y ) > m_FrontierSafenessFactor * m_MinAllowedObstacleDistance; - if ( isFree && hasUnknownNeighbour && isSafe ) - { - m_TargetMap->setValue ( x, y, 1 ); - } - else - { - m_TargetMap->setValue ( x, y, 0 ); - } - } - } -} - -void Explorer::computeTargetMap() -{ - ROS_ERROR_STREAM("target Map shouldn't be used anymore!"); - if ( m_DesiredDistance < 1 ) - { - computeFrontierMap(); - } - else - { - computeRegionMap(); - } -} - -void Explorer::computeObstacleTransform() -{ - if ( !m_OccupancyMap) - { - ROS_ERROR( "Missing occupancy map. Aborting." ); - return; - } - - if ( m_ObstacleTransform ) - { - return; - } - - resetMap( m_ObstacleTransform ); - - ROS_DEBUG( "Computing obstacle transform..." ); - for ( int x = 0; x < m_ObstacleTransform->width(); x++ ) - { - for ( int y = 0; y < m_ObstacleTransform->height(); y++ ) - { - if ( m_OccupancyMap->getValue(x, y) > UNKNOWN || - m_OccupancyMap->getValue(x, y) == NOT_SEEN_YET) - { - m_ObstacleTransform->setValue ( x, y, 0 ); // Obstacle - } - else - { - m_ObstacleTransform->setValue ( x, y, INT_MAX ); // Free - } - } - } - - int width = m_ObstacleTransform->width(); - int height = m_ObstacleTransform->height(); - double* f = new double[width > height ? width : height]; - - // transform along columns - for ( int x = 0; x < width; x++ ) - { - for ( int y = 0; y < height; y++ ) - { - // copy column - f[y] = m_ObstacleTransform->getValue ( x, y ); - } - // 1-D transform of column - double* d = distanceTransform1D ( f, height ); - // copy transformed 1-D to output image - for ( int y = 0; y < height; y++ ) - { - m_ObstacleTransform->setValue ( x, y, d[y] ); - } - delete [] d; - } - - // transform along rows - for ( int y = 0; y < height; y++ ) - { - for ( int x = 0; x < width; x++ ) - { - f[x] = m_ObstacleTransform->getValue ( x, y ); - } - double* d = distanceTransform1D ( f, width ); - for ( int x = 0; x < width; x++ ) - { - m_ObstacleTransform->setValue ( x, y, d[x] ); - } - delete [] d; - } - delete f; - - // take square roots - for ( int y = 0; y < m_ObstacleTransform->height(); y++ ) - { - for ( int x = 0; x < m_ObstacleTransform->width(); x++ ) - { - if ( isWalkable( x,y ) ) - { - float value = sqrt ( m_ObstacleTransform->getValue ( x, y ) ); - m_ObstacleTransform->setValue ( x, y, value ); - } - } - } -} - - -void Explorer::computeCostTransform() -{ - if ( !m_OccupancyMap) { - ROS_ERROR( "Missing occupancy map. Aborting." ); - return; - } - - if ( m_CostTransform ) { return; } - - computeObstacleTransform(); - computeApproachableMaps(); - - resetMap( m_CostTransform ); - m_CostTransform->fill( ExplorerConstants::MAX_COST ); - - for ( unsigned y=0; y<m_CostTransform->height(); y++) - { - for ( unsigned x=0; x<m_CostTransform->width(); x++) - { - if ( !isApproachable( x, y ) ) { - continue; - } - double dist = m_ObstacleTransform->getValue(x, y); - double cost = 0; - if ( dist < m_MinSafeObstacleDistance ) { - cost = m_MinSafeObstacleDistance - dist; - } -// if ( dist > m_MaxSafeObstacleDistance ) { -// cost = dist - m_MaxSafeObstacleDistance; -// } - m_CostTransform->setValue( x, y, cost * cost ); - } - } -} - - -void Explorer::computePathTransform() -{ - if ( !m_OccupancyMap) { - ROS_ERROR( "Missing occupancy map. Aborting." ); - return; - } - - if ( m_PathTransform ) { return; } - - computeObstacleTransform(); - computeCostTransform(); - - resetMap( m_PathTransform ); - - ROS_DEBUG( "Computing path transform..." ); - GridMap<double>* map = m_PathTransform; - int width = map->width(); - int height = map->height(); - double maxDistance = MAX_DISTANCE; - map->fill ( maxDistance ); - - int fromX = m_Target.x(); - int fromY = m_Target.y(); - map->setValue ( fromX, fromY, 0 ); - - queue<int> xQueue; - queue<int> yQueue; - xQueue.push ( fromX + 1 ); - yQueue.push ( fromY ); - xQueue.push ( fromX - 1 ); - yQueue.push ( fromY ); - xQueue.push ( fromX ); - yQueue.push ( fromY - 1 ); - xQueue.push ( fromX ); - yQueue.push ( fromY + 1 ); - int xVal, yVal; - while ( !xQueue.empty() ) - { - xVal = xQueue.front(); - yVal = yQueue.front(); - xQueue.pop(); - yQueue.pop(); - if ( xVal > 0 && xVal < width - 1 && yVal > 0 && yVal < height - 1 && isWalkable( xVal, yVal ) ) - { - float value = map->getValue ( xVal, yVal ); - float value_u = map->getValue ( xVal, yVal - 1 ) + 1; - float value_d = map->getValue ( xVal, yVal + 1 ) + 1; - float value_l = map->getValue ( xVal - 1, yVal ) + 1; - float value_r = map->getValue ( xVal + 1, yVal ) + 1; - - float value_ur = map->getValue ( xVal + 1, yVal - 1 ) + 1.4142; - float value_ul = map->getValue ( xVal - 1, yVal - 1 ) + 1.4142; - float value_ll = map->getValue ( xVal - 1, yVal + 1 ) + 1.4142; - float value_lr = map->getValue ( xVal + 1, yVal + 1 ) + 1.4142; - - float min1 = value_u < value_d ? value_u : value_d; - float min2 = value_l < value_r ? value_l : value_r; - float min3 = value_ur < value_ul ? value_ur : value_ul; - float min4 = value_ll < value_lr ? value_ll : value_lr; - float min12 = min1 < min2 ? min1 : min2; - float min34 = min3 < min4 ? min3 : min4; - float min = min12 < min34 ? min12 : min34; - float newVal = min + m_SafePathWeight * m_CostTransform->getValue( xVal, yVal ); - if ( value > newVal ) - { - map->setValue ( xVal, yVal, newVal ); - if ( map->getValue ( xVal, yVal + 1 ) > newVal + 1 ) - { - xQueue.push ( xVal ); - yQueue.push ( yVal + 1 ); - } - if ( map->getValue ( xVal, yVal - 1 ) > newVal + 1 ) - { - xQueue.push ( xVal ); - yQueue.push ( yVal - 1 ); - } - if ( map->getValue ( xVal + 1, yVal ) > newVal + 1 ) - { - xQueue.push ( xVal + 1 ); - yQueue.push ( yVal ); - } - if ( map->getValue ( xVal - 1, yVal ) > newVal + 1 ) - { - xQueue.push ( xVal - 1 ); - yQueue.push ( yVal ); - } - if ( map->getValue ( xVal + 1, yVal - 1 ) > newVal + 1.4142 ) - { - xQueue.push ( xVal + 1 ); - yQueue.push ( yVal - 1 ); - } - if ( map->getValue ( xVal - 1, yVal - 1 ) > newVal + 1.4142 ) - { - xQueue.push ( xVal - 1 ); - yQueue.push ( yVal - 1 ); - } - if ( map->getValue ( xVal + 1, yVal + 1 ) > newVal + 1.4142 ) - { - xQueue.push ( xVal + 1 ); - yQueue.push ( yVal + 1 ); - } - if ( map->getValue ( xVal - 1, yVal + 1 ) > newVal + 1.4142 ) - { - xQueue.push ( xVal - 1 ); - yQueue.push ( yVal + 1 ); - } - } - } - } -} - - -void Explorer::computeExplorationTransform() -{ - ROS_ERROR_STREAM("Exploration Transform shouldn't be used!"); - if ( !m_OccupancyMap) { - ROS_ERROR( "Missing occupancy map. Aborting." ); - return; - } - - if ( m_ExplorationTransform ) { return; } - - ROS_DEBUG_STREAM("computeExplorationTransform: before obstacle transform"); - computeObstacleTransform(); - ROS_DEBUG_STREAM("computeExplorationTransform: before cost transform"); - computeCostTransform(); - ROS_DEBUG_STREAM("computeExplorationTransform: before target map"); - computeTargetMap(); - ROS_DEBUG_STREAM("computeExplorationTransform: before walkable maps"); - computeWalkableMaps(); - ROS_DEBUG_STREAM("computeExplorationTransform: before exploration transform"); - resetMap( m_ExplorationTransform ); - - ROS_DEBUG( "Computing exploration transform..." ); - GridMap<double>* map = m_ExplorationTransform; - int width = map->width(); - int height = map->height(); - double maxDistance = MAX_DISTANCE; - map->fill ( maxDistance ); - queue<int> xQueue; - queue<int> yQueue; - // fill seeds: Mark the frontiers as targets - ROS_DEBUG_STREAM("computeExplorationTransform: before first loop"); - for ( int y = 0; y < m_TargetMap->height(); y++ ) - { - for ( int x = 0; x < m_TargetMap->width(); x++ ) - { - if ( m_TargetMap->getValue ( x, y ) == 1 ) - { - map->setValue ( x, y, 0 ); - xQueue.push ( x + 1 ); - yQueue.push ( y ); - xQueue.push ( x - 1 ); - yQueue.push ( y ); - xQueue.push ( x ); - yQueue.push ( y - 1 ); - xQueue.push ( x ); - yQueue.push ( y + 1 ); - } - } - } - ROS_DEBUG_STREAM("computeExplorationTransform: After first looop"); - // Now go through the coordinates in the queue - int xVal, yVal; - ROS_DEBUG_STREAM("computeExplorationTransform: before while loop"); - while ( !xQueue.empty() ) - { - xVal = xQueue.front(); - yVal = yQueue.front(); - xQueue.pop(); - yQueue.pop(); - if ( xVal > 0 && xVal < width - 1 && yVal > 0 && yVal < height - 1 && isWalkable ( xVal, yVal ) ) - { - // Get own cost and the cost of the 8 neighbor cells (neighbors plus the cost to go there) - float value = map->getValue ( xVal, yVal ); - float value_u = map->getValue ( xVal, yVal - 1 ) + 1; - float value_d = map->getValue ( xVal, yVal + 1 ) + 1; - float value_l = map->getValue ( xVal - 1, yVal ) + 1; - float value_r = map->getValue ( xVal + 1, yVal ) + 1; - float value_ur = map->getValue ( xVal + 1, yVal - 1 ) + 1.4142; - float value_ul = map->getValue ( xVal - 1, yVal - 1 ) + 1.4142; - float value_ll = map->getValue ( xVal - 1, yVal + 1 ) + 1.4142; - float value_lr = map->getValue ( xVal + 1, yVal + 1 ) + 1.4142; - float min1 = value_u < value_d ? value_u : value_d; - float min2 = value_l < value_r ? value_l : value_r; - float min3 = value_ur < value_ul ? value_ur : value_ul; - float min4 = value_ll < value_lr ? value_ll : value_lr; - float min12 = min1 < min2 ? min1 : min2; - float min34 = min3 < min4 ? min3 : min4; - float min = min12 < min34 ? min12 : min34; - float newVal = min + m_SafePathWeight * m_CostTransform->getValue( xVal, yVal ); - if ( value > newVal ) - { - // Cost is lower then the currently known cost: Reduce cost here - map->setValue ( xVal, yVal, newVal ); - // Add the neighbours that might profit in the queue - if ( map->getValue ( xVal, yVal + 1 ) > newVal + 1 ) - { - xQueue.push ( xVal ); - yQueue.push ( yVal + 1 ); - } - if ( map->getValue ( xVal, yVal - 1 ) > newVal + 1 ) - { - xQueue.push ( xVal ); - yQueue.push ( yVal - 1 ); - } - if ( map->getValue ( xVal + 1, yVal ) > newVal + 1 ) - { - xQueue.push ( xVal + 1 ); - yQueue.push ( yVal ); - } - if ( map->getValue ( xVal - 1, yVal ) > newVal + 1 ) - { - xQueue.push ( xVal - 1 ); - yQueue.push ( yVal ); - } - if ( map->getValue ( xVal + 1, yVal - 1 ) > newVal + 1.4142 ) - { - xQueue.push ( xVal + 1 ); - yQueue.push ( yVal - 1 ); - } - if ( map->getValue ( xVal - 1, yVal - 1 ) > newVal + 1.4142 ) - { - xQueue.push ( xVal - 1 ); - yQueue.push ( yVal - 1 ); - } - if ( map->getValue ( xVal + 1, yVal + 1 ) > newVal + 1.4142 ) - { - xQueue.push ( xVal + 1 ); - yQueue.push ( yVal + 1 ); - } - if ( map->getValue ( xVal - 1, yVal + 1 ) > newVal + 1.4142 ) - { - xQueue.push ( xVal - 1 ); - yQueue.push ( yVal + 1 ); - } - } - } - } - ROS_DEBUG_STREAM("computeExplorationTransform: after exploration transform"); -} - - -vector<Eigen::Vector2i> Explorer::sampleWaypointsFromPath ( std::vector<Eigen::Vector2i> pathPoints, float threshold ) -{ - if ( !m_OccupancyMap) { - ROS_ERROR( "Missing occupancy map. Aborting." ); - return pathPoints; - } - if ( pathPoints.size() < 3 ) { - return pathPoints; - } - - computeObstacleTransform(); - - vector<Eigen::Vector2i> simplifiedPath; - simplifiedPath.reserve( pathPoints.size() ); - - Eigen::Vector2i lastAddedPoint = pathPoints[0]; - simplifiedPath.push_back ( lastAddedPoint ); - - for ( unsigned int i = 1; i < pathPoints.size() - 1; i++ ) - { - double distanceToNextPoint = map_tools::distance(lastAddedPoint, pathPoints.at(i)); - double obstacleDistanceLastAddedPoint = m_ObstacleTransform->getValue ( lastAddedPoint.x(), lastAddedPoint.y() ); - double obstacleDistancePossibleNextPoint = m_ObstacleTransform->getValue ( pathPoints[i].x(), pathPoints[i].y() ); - if (( distanceToNextPoint >= obstacleDistanceLastAddedPoint*threshold ) || - ( distanceToNextPoint >= obstacleDistancePossibleNextPoint*threshold ) ) - { - simplifiedPath.push_back ( pathPoints[i] ); - lastAddedPoint = pathPoints[i]; - } - } - simplifiedPath.push_back ( pathPoints[pathPoints.size() - 1] ); - return simplifiedPath; -} - - -std::vector<Eigen::Vector2i> Explorer::getPath(bool& success) -{ - success = false; - - if ( !m_OccupancyMap) { - ROS_ERROR( "Missing occupancy map. Aborting." ); - return vector<Eigen::Vector2i>(); - } - - if ( m_DesiredDistance > 0 ) { - // we are actually performing an exploration since the target - // is a region. - ROS_ERROR_STREAM("Desired Distance > 0: Executing getExplorationTransformPath"); - return getExplorationTransformPath( success ); - } - ROS_DEBUG_STREAM("Computing Path Transform"); - computePathTransform(); - ROS_DEBUG_STREAM("Finished Path Transform"); - - vector<Eigen::Vector2i> path; - - int x = m_Start.x(); - int y = m_Start.y(); - - int width = m_OccupancyMap->width(); - int height = m_OccupancyMap->height(); - - //special case: start and end point are equal, return single waypoint - if ( map_tools::distance( m_Start, m_Target ) < 2.0 ) - { - success = true; - path.push_back ( Eigen::Vector2i( m_Start.x(), m_Start.y() ) ); - return path; - } - - while ( x != m_Target.x() || y != m_Target.y() ) - { - path.push_back ( Eigen::Vector2i( x, y ) ); - int minPosX = x; - int minPosY = y; - double min = m_PathTransform->getValue ( x, y ); - - if ( ( x <= 1 ) || ( y <= 1 ) || ( x >= width-1 ) || ( y >= height-1 ) ) - { - ROS_ERROR( "Out of map bounds" ); - return vector<Eigen::Vector2i>(); - } - - for ( int i = -1; i <= 1; i++ ) - { - for ( int j = -1; j <= 1; j++ ) - { - double pt = m_PathTransform->getValue ( x + i, y + j ); - if ( pt < min ) - { - min = pt; - minPosX = x + i; - minPosY = y + j; - } - } - } - if ( minPosX == x && minPosY == y ) - { - ROS_WARN( "Target is unreachable!" ); - return vector<Eigen::Vector2i>(); - } - else - { - x = minPosX; - y = minPosY; - } - } - success = true; - - return path; -} - -vector<Eigen::Vector2i> Explorer::getExplorationTransformPath(bool& success) -{ - success = false; - - if ( !m_OccupancyMap) { - ROS_ERROR( "Missing occupancy map. Aborting." ); - return vector<Eigen::Vector2i>(); - } - - ROS_DEBUG_STREAM("Exploration Transform: Before obstacle transform"); - computeObstacleTransform(); - ROS_DEBUG_STREAM("Exploration Transform: Before exploration transform"); - computeExplorationTransform(); - ROS_DEBUG_STREAM("Exploration Transform: after obstacle transform"); - - //check if we are already there - if ( m_TargetMap->getValue ( m_Start.x(), m_Start.y() ) ) - { - success = true; - vector<Eigen::Vector2i> path; - path.push_back ( Eigen::Vector2i ( m_Start.x(), m_Start.y() ) ); - return path; - } - - int width = m_OccupancyMap->width(); - int height = m_OccupancyMap->height(); - - vector<Eigen::Vector2i> path; - int x = m_Start.x(); - int y = m_Start.y(); - - if ( m_ObstacleTransform->getValue ( x, y ) < m_MinAllowedObstacleDistance ) - { - // robot got stuck! - // find way out using ObstacleTransform... - int maxPosX = x; - int maxPosY = y; - - if ( ( x <= 1 ) || ( y <= 1 ) || ( x >= width-1 ) || ( y >= height-1 ) ) - { - ROS_ERROR( "Out of map bounds" ); - return vector<Eigen::Vector2i>(); - } - - while ( m_ObstacleTransform->getValue ( maxPosX, maxPosY ) < m_MinAllowedObstacleDistance ) - { - double max = m_ObstacleTransform->getValue ( x, y ); - for ( int i = -1; i <= 1; i++ ) - { - for ( int j = -1; j <= 1; j++ ) - { - double pt = m_ObstacleTransform->getValue ( x + i, y + j ); - if ( pt > max ) - { - max = pt; - maxPosX = x + i; - maxPosY = y + j; - } - } - } - if ( maxPosX == x && maxPosY == y ) // no ascentFound - { - break; - } - else - { - path.push_back ( Eigen::Vector2i ( maxPosX, maxPosY ) ); - x = maxPosX; - y = maxPosY; - } - } - } - // now path is "free" - bool descentFound = true; - while ( descentFound ) - { - descentFound = false; - int minPosX = x; - int minPosY = y; - double min = m_ExplorationTransform->getValue ( x, y ); - if ( ( x <= 1 ) || ( y <= 1 ) || ( x >= width-1 ) || ( y >= height-1 ) ) - { - ROS_ERROR( "Out of map bounds" ); - return vector<Eigen::Vector2i>(); - } - - for ( int i = -1; i <= 1; i++ ) - { - for ( int j = -1; j <= 1; j++ ) - { - double pt = m_ExplorationTransform->getValue ( x + i, y + j ); - if ( pt < min ) - { - min = pt; - minPosX = x + i; - minPosY = y + j; - } - } - } - if ( minPosX == x && minPosY == y ) // no descentFound - { - descentFound = false; - } - else - { - descentFound = true; - path.push_back ( Eigen::Vector2i ( minPosX, minPosY ) ); - x = minPosX; - y = minPosY; - } - } - success = true; - - ROS_INFO_STREAM("Exploration Transform: End of function"); - return path; - -#if 0 - // START P2AT HACK - vector< Eigen::Vector2i > newPath; - for ( unsigned start=0; start<path.size()-1; ++start ) - { - int maxVal = start+1; - for ( unsigned end=start+1; end<path.size(); ++end ) - { - bool ok = true; - // draw bresenham line and check wether an object is within maximum allowed distance - // THANKS TO WIKIPEDIA - int x, y, t, dx, dy, incx, incy, pdx, pdy, ddx, ddy, es, el, err; - /* Entfernung in beiden Dimensionen berechnen */ - dx = path[end].x() - path[start].x(); - dy = path[end].y() - path[start].y(); - /* Vorzeichen des Inkrements bestimmen */ - incx = (dx > 0) ? 1 : (dx < 0) ? -1 : 0; - incy = (dy > 0) ? 1 : (dy < 0) ? -1 : 0; - if(dx<0) dx = -dx; - if(dy<0) dy = -dy; - /* feststellen, welche Entfernung größer ist */ - if (dx>dy) - { - /* x ist schnelle Richtung */ - pdx=incx; pdy=0; /* pd. ist Parallelschritt */ - ddx=incx; ddy=incy; /* dd. ist Diagonalschritt */ - es =dy; el =dx; /* Fehlerschritte schnell, langsam */ - } else - { - /* y ist schnelle Richtung */ - pdx=0; pdy=incy; /* pd. ist Parallelschritt */ - ddx=incx; ddy=incy; /* dd. ist Diagonalschritt */ - es =dx; el =dy; /* Fehlerschritte schnell, langsam */ - } - /* Initialisierungen vor Schleifenbeginn */ - x = path[start].x(); - y = path[start].y(); - err = el/2; - /* Pixel berechnen */ - for(t=0; t<el; ++t) /* t zaehlt die Pixel, el ist auch Anzahl */ - { - /* Aktualisierung Fehlerterm */ - err -= es; - if(err<0) - { - /* Fehlerterm wieder positiv (>=0) machen */ - err += el; - /* Schritt in langsame Richtung, Diagonalschritt */ - x += ddx; - y += ddy; - } else - { - /* Schritt in schnelle Richtung, Parallelschritt */ - x += pdx; - y += pdy; - } - - // --- start: check if obstacle around - if ( m_ObstacleTransform->getValue ( x, y ) < m_MinAllowedObstacleDistance ) - { - ok = false; - break; - } - // --- end : check if obstacle around - } // Pixel berechnen - - if ( ok ) - { - maxVal = end; - } - } // for: inner - newPath.push_back( path[maxVal] ); - start = maxVal; // incremented by foor loop to max+1 - } // for: outer - // END: P2AT HACK - - success = true; - return newPath; -#endif -} - - -bool Explorer::getNearestFrontier ( Eigen::Vector2i& nextFrontier ) -{ - if ( !m_OccupancyMap) { - ROS_ERROR( "Missing occupancy map. Aborting." ); - return false; - } - - computeFrontierMap(); - computeDrivingDistanceTransform(); - - bool found = false; - int distXPos = -1; - int distYPos = -1; - double dist = 10000000; - for ( int y = 0; y < m_TargetMap->height(); y++ ) - { - for ( int x = 0; x < m_TargetMap->width(); x++ ) - { - if ( m_TargetMap->getValue ( x, y ) == 1 && m_DrivingDistanceTransform->getValue ( x, y ) < 999999 ) - { - if ( m_DrivingDistanceTransform->getValue ( x, y ) < dist ) - { - found = true; - dist = m_DrivingDistanceTransform->getValue ( x, y ); - distXPos = x; - distYPos = y; - } - } - } - } - if ( found ) - { - nextFrontier.x() = distXPos; - nextFrontier.y() = distYPos; - return true; - } - else - { - return false; - } -} - - - -// HELPERS ////////////////////////////////////////////////////////////////////////////////////////////////////////// - - -void Explorer::distanceFloodFill ( GridMap<double>* map, Eigen::Vector2i start ) -{ - if ( !map ) { - ROS_ERROR( "Received 0-pointer!" ); - } - - computeObstacleTransform(); - - int width = map->width(); - int height = map->height(); - map->fill ( MAX_DISTANCE ); - - int fromX = start.x(); - int fromY = start.y(); - map->setValue ( fromX, fromY, 0 ); - - queue<int> xQueue; - queue<int> yQueue; - xQueue.push ( fromX + 1 ); - yQueue.push ( fromY ); - xQueue.push ( fromX - 1 ); - yQueue.push ( fromY ); - xQueue.push ( fromX ); - yQueue.push ( fromY - 1 ); - xQueue.push ( fromX ); - yQueue.push ( fromY + 1 ); - int xVal, yVal; - while ( !xQueue.empty() ) - { - xVal = xQueue.front(); - yVal = yQueue.front(); - xQueue.pop(); - yQueue.pop(); - bool isFree = (m_OccupancyMap->getValue ( xVal, yVal ) < UNKNOWN || - m_OccupancyMap->getValue ( xVal, yVal ) != NOT_SEEN_YET); // only fill free cells - bool isSafe = m_ObstacleTransform->getValue ( xVal, yVal ) > m_MinAllowedObstacleDistance; - if ( xVal > 0 && xVal < width - 1 && yVal > 0 && yVal < height - 1 && isFree && isSafe ) - { - float value = map->getValue ( xVal, yVal ); - float value_u = map->getValue ( xVal, yVal - 1 ) + 1; - float value_d = map->getValue ( xVal, yVal + 1 ) + 1; - float value_l = map->getValue ( xVal - 1, yVal ) + 1; - float value_r = map->getValue ( xVal + 1, yVal ) + 1; - - float value_ur = map->getValue ( xVal + 1, yVal - 1 ) + 1.4142; - float value_ul = map->getValue ( xVal - 1, yVal - 1 ) + 1.4142; - float value_ll = map->getValue ( xVal - 1, yVal + 1 ) + 1.4142; - float value_lr = map->getValue ( xVal + 1, yVal + 1 ) + 1.4142; - - float min1 = value_u < value_d ? value_u : value_d; - float min2 = value_l < value_r ? value_l : value_r; - float min3 = value_ur < value_ul ? value_ur : value_ul; - float min4 = value_ll < value_lr ? value_ll : value_lr; - float min12 = min1 < min2 ? min1 : min2; - float min34 = min3 < min4 ? min3 : min4; - float min = min12 < min34 ? min12 : min34; - float newVal = min; - if ( value > newVal ) - { - map->setValue ( xVal, yVal, newVal ); - if ( map->getValue ( xVal, yVal + 1 ) > newVal + 1 ) - { - xQueue.push ( xVal ); - yQueue.push ( yVal + 1 ); - } - if ( map->getValue ( xVal, yVal - 1 ) > newVal + 1 ) - { - xQueue.push ( xVal ); - yQueue.push ( yVal - 1 ); - } - if ( map->getValue ( xVal + 1, yVal ) > newVal + 1 ) - { - xQueue.push ( xVal + 1 ); - yQueue.push ( yVal ); - } - if ( map->getValue ( xVal - 1, yVal ) > newVal + 1 ) - { - xQueue.push ( xVal - 1 ); - yQueue.push ( yVal ); - } - if ( map->getValue ( xVal + 1, yVal - 1 ) > newVal + 1.4142 ) - { - xQueue.push ( xVal + 1 ); - yQueue.push ( yVal - 1 ); - } - if ( map->getValue ( xVal - 1, yVal - 1 ) > newVal + 1.4142 ) - { - xQueue.push ( xVal - 1 ); - yQueue.push ( yVal - 1 ); - } - if ( map->getValue ( xVal + 1, yVal + 1 ) > newVal + 1.4142 ) - { - xQueue.push ( xVal + 1 ); - yQueue.push ( yVal + 1 ); - } - if ( map->getValue ( xVal - 1, yVal + 1 ) > newVal + 1.4142 ) - { - xQueue.push ( xVal - 1 ); - yQueue.push ( yVal + 1 ); - } - } - } - } -} - - -// Implementation taken from http://www.cs.cmu.edu/~cil/vnew.html -double* Explorer::distanceTransform1D ( double *f, int n ) -{ - //int width = m_OccupancyMap->width(); - //int height = m_OccupancyMap->height(); - //double maxDistance = height > width ? height : width; - - double *d = new double[n]; - int *v = new int[n]; - double *z = new double[n+1]; - int k = 0; - v[0] = 0; - z[0] = -INT_MAX; - z[1] = INT_MAX; - for ( int q = 1; q <= n-1; q++ ) - { - double s = ( ( f[q]+ ( q*q ) )- ( f[v[k]]+ ( v[k]*v[k] ) ) ) / ( 2*q-2*v[k] ); - while ( s <= z[k] ) - { - k--; - s = ( ( f[q]+ ( q*q ) )- ( f[v[k]]+ ( v[k]*v[k] ) ) ) / ( 2*q-2*v[k] ); - } - k++; - v[k] = q; - z[k] = s; - z[k+1] = INT_MAX; - } - - k = 0; - for ( int q = 0; q <= n-1; q++ ) - { - while ( z[k+1] < q ) - k++; - d[q] = ( ( q-v[k] ) * ( q-v[k] ) ) + f[v[k]]; - } - - delete [] v; - delete [] z; - return d; -} diff --git a/homer_nav_libs/src/Math/Line2D.cpp b/homer_nav_libs/src/Math/Line2D.cpp deleted file mode 100644 index 89cd5310..00000000 --- a/homer_nav_libs/src/Math/Line2D.cpp +++ /dev/null @@ -1,99 +0,0 @@ -/******************************************************************************* - * Line2D.cpp - * - * (C) 2007 AG Aktives Sehen <agas@uni-koblenz.de> - * Universitaet Koblenz-Landau - * - * Information on Code Review state: - * Author: SM; DevelTest: Date; Reviewer: Initials; Review: Date; State: NOK - * - * Additional information: - * $Id: Line2D.cpp 44313 2011-04-06 22:46:28Z agas $ - *******************************************************************************/ - -#include <iostream> -#include <sstream> - -#include <homer_nav_libs/Math/Line2D.h> -#include <homer_nav_libs/Math/vec2.h> - -#define THIS Line2D - -float THIS::gradient() const -{ - float gradient = 10000000.0; - if ( m_Vec[0] != 0.0 ) - { - gradient = m_Vec[1]/m_Vec[0]; - } - return gradient; -} - -std::vector< Point2D > THIS::vertices ( unsigned substeps ) -{ - unsigned steps = substeps+2; - std::vector<Point2D> myVertices ( steps ); - for ( unsigned i=0; i<steps; i++ ) - { - float t= float ( i ) / float ( steps-1 ); - myVertices[i] = m_Start + t*m_Vec; - } - return myVertices; -} - -Point2D THIS::getClosestPoint ( Point2D point ) const -{ - float t = ( point-m_Start ) * m_Vec; - t /= m_Vec * m_Vec; - if ( t > 1.0 ) - { - t = 1.0; - } - else if ( t < 0.0 ) - { - t = 0.0; - } - Point2D pointOnLine = m_Start + ( t * m_Vec ); - return pointOnLine; -} - -Point2D THIS::getIntersectionPoint ( Line2D line ) const -{ - Point2D intersecPoint; - double det1 = m_Vec.x() * ( -line.vec().y() ) - ( -line.vec().x() ) * m_Vec.y(); - // lines are not parallel - if ( det1 != 0 ) - { - CVec2 startToStart = line.start() -m_Start; - // calculate intersection - double lambda = ( startToStart.x() * ( -line.vec().y() ) - ( -line.vec().x() ) * startToStart.y() ) / det1; - intersecPoint = m_Start + lambda* m_Vec; - } - - return intersecPoint; -} - -float THIS::getIntersectionPointParameter ( Line2D line ) const -{ - double lambda = 0.0; - double det1 = m_Vec.x() * ( -line.vec().y() ) - ( -line.vec().x() ) * m_Vec.y(); - // lines are not parallel - if ( det1 != 0 ) - { - CVec2 startToStart = line.start() -m_Start; - // calculate intersection - lambda = ( startToStart.x() * ( -line.vec().y() ) - ( -line.vec().x() ) * startToStart.y() ) / det1; - } - - return lambda; -} - -std::string THIS::toString() const -{ - std::ostringstream str; -// str << "Startpoint: " << m_Start.x() << " " << m_Start.y() << " Endpoint: " << end().x() << " " << end().y() << -// " Vector: " << m_Vec.x() << " " << m_Vec.y() << " "; - str << m_Start.x() << " " << m_Start.y() << std::endl << end().x() << " " << end().y() << std::endl; - return str.str(); -} - diff --git a/homer_nav_libs/src/Math/Math.cpp b/homer_nav_libs/src/Math/Math.cpp deleted file mode 100644 index 5ad74fc3..00000000 --- a/homer_nav_libs/src/Math/Math.cpp +++ /dev/null @@ -1,135 +0,0 @@ -/******************************************************************************* - * Math.cpp - * - * (C) 2007 AG Aktives Sehen <agas@uni-koblenz.de> - * Universitaet Koblenz-Landau - * - * Additional information: - * $Id: $ - *******************************************************************************/ - -#include <limits.h> -#include <homer_nav_libs/Math/Math.h> -#include <math.h> - -#include <homer_nav_libs/Math/vec2.h> - -#define THIS Math - -THIS::THIS() -{ -} - -THIS::~THIS() -{ -} - -float THIS::meanAngle( const std::vector<float>& angles ) -{ - //calculate vectors from angles - CVec2 vectorSum(0,0); - for ( unsigned i=0; i<angles.size(); i++ ) - { - vectorSum = vectorSum + CVec2( cos( angles[i] ), sin ( angles[i] ) ); - } - //return vectorSum.getAngle( CVec2(1,0) ); - if ( vectorSum.magnitude() == 0 ) { return 0; } - return atan2( vectorSum.y(), vectorSum.x() ); -} - - -float THIS::meanAngleWeighted( const std::vector< WeightedValue >& weightedAngles ) -{ - //calculate vectors from angles - CVec2 vectorSum(0,0); - for ( unsigned i=0; i<weightedAngles.size(); i++ ) - { - vectorSum = vectorSum + weightedAngles[i].weight * CVec2( cos( weightedAngles[i].value ), sin ( weightedAngles[i].value ) ); - } - //return vectorSum.getAngle( CVec2(1,0) ); - if ( vectorSum.magnitude() == 0 ) { return 0; } - return atan2( vectorSum.y(), vectorSum.x() ); -} - - -float THIS::angleVariance( float meanAngle, const std::vector<float>& angles ) -{ - float quadSum=0; - for( unsigned i=0; i < angles.size(); i++ ) - { - float turnAngle=minTurnAngle( angles[i], meanAngle ); - quadSum += turnAngle*turnAngle; - } - return quadSum / float ( angles.size() ); -} - - -float THIS::minTurnAngle( float angle1, float angle2 ) -{ -/* CVec2 vector1( cos( angle1 ), sin ( angle1 ) ); - CVec2 vector2( cos( angle2 ), sin ( angle2 ) ); - return vector1.getAngle( vector2 ); - */ - angle1 *= 180.0/M_PI; - angle2 *= 180.0/M_PI; - //if(angle1 < 0) angle1 += M_PI * 2; - //if(angle2 < 0) angle2 += M_PI * 2; - int diff= angle2 - angle1; - diff = (diff + 180) % 360 - 180; - - //float sign=1; - //if ( diff < 0 ) { sign=-1; } - //minimal turn angle: - //if the absolute difference is above 180°, calculate the difference in other direction - //if ( fabs(diff) > M_PI ) { - // diff = 2*M_PI - fabs(diff); - // diff *= sign; - //} - - float ret = static_cast<double>(diff) * M_PI/180.0; - return ret; -} - -Point2D THIS::center( std::vector<Point2D>& points ) -{ - double numPoints = double( points.size() ); - double sumX=0, sumY=0; - for( unsigned i=0; i < points.size(); i++ ) - { - sumX += points[i].x(); - sumY += points[i].y(); - } - return Point2D( sumX / numPoints, sumY / numPoints ); -} - - -double THIS::randomGauss(float variance) -{ - if (variance < 0) { - variance = -variance; - } - double x1, x2, w, y1; - do { - x1 = 2.0 * random01() - 1.0; - x2 = 2.0 * random01() - 1.0; - w = x1 * x1 + x2 * x2; - } while ( w >= 1.0 ); - - w = sqrt((-2.0 * log(w)) / w); - y1 = x1 * w; - // now y1 is uniformly distributed - return sqrt(variance) * y1; -} - -double THIS::random01(unsigned long init) -{ - static unsigned long n; - if (init > 0) { - n = init; - } - n = 1664525 * n + 1013904223; - // create double from unsigned long - return (double)(n/2) / (double)LONG_MAX; -} - -#undef THIS diff --git a/homer_nav_libs/src/Math/Point2D.cpp b/homer_nav_libs/src/Math/Point2D.cpp deleted file mode 100644 index 13c321d7..00000000 --- a/homer_nav_libs/src/Math/Point2D.cpp +++ /dev/null @@ -1,33 +0,0 @@ -/******************************************************************************* - * Point2D.cpp - * - * (C) 2008 AG Aktives Sehen <agas@uni-koblenz.de> - * Universitaet Koblenz-Landau - * - * Additional information: - * $Id: $ - *******************************************************************************/ - -#include <homer_nav_libs/Math/Point2D.h> - -#define THIS Point2D - -float THIS::getPolarAngle () const -{ - float angle = atan ( m_Y /m_X ); - if ( m_X < 0 ) - { - angle = - ( M_PI - angle ); - } - while ( angle >= M_PI ) - { - angle -= 2*M_PI; - } - while ( angle < -M_PI ) - { - angle += 2*M_PI; - } - return angle; -} - -#undef THIS diff --git a/homer_nav_libs/src/Math/Pose.cpp b/homer_nav_libs/src/Math/Pose.cpp deleted file mode 100644 index 129d123a..00000000 --- a/homer_nav_libs/src/Math/Pose.cpp +++ /dev/null @@ -1,117 +0,0 @@ -/******************************************************************************* - * Pose.cpp - * - * (C) 2006 AG Aktives Sehen <agas@uni-koblenz.de> - * Universitaet Koblenz-Landau - * - * $Id: Pose.cpp 44313 2011-04-06 22:46:28Z agas $ - *******************************************************************************/ - -#include <cmath> - -#include <homer_nav_libs/Math/Pose.h> -#include <homer_nav_libs/Math/Transformation2D.h> - -using namespace std; - - -#define THIS Pose - -THIS::THIS(float x, float y, float theta) : Point2D(x, y) { - m_Theta = theta; -} - -THIS::THIS() { - m_Theta = 0.0; -} - -THIS::~THIS() { -} - -float THIS::theta() const { - return m_Theta; -} - -void THIS::setTheta(float theta) { - m_Theta = theta; -} - -Pose THIS::operator+ ( const Transformation2D& transformation ) const { - float x, y, theta; - x = m_X + transformation.x(); - y = m_Y + transformation.y(); - theta = m_Theta + transformation.theta(); - while (theta >= M_PI) theta -= 2*M_PI; - while (theta < -M_PI) theta += 2*M_PI; - - return Pose(x, y, theta); -} - -Pose THIS::operator- ( const Transformation2D& transformation ) const { - float x, y, theta; - x = m_X - transformation.x(); - y = m_Y - transformation.y(); - theta = m_Theta - transformation.theta(); - while (theta >= M_PI) theta -= 2*M_PI; - while (theta < -M_PI) theta += 2*M_PI; - - return Pose(x, y, theta); -} - -Transformation2D THIS::operator- ( const Pose& pose ) const { - float x, y, theta; - x = m_X - pose.x(); - y = m_Y - pose.y(); - - float s1, s2; - if (m_Theta > pose.theta()) { - s1 = -( 2 * M_PI - m_Theta + pose.theta()); - s2 = m_Theta - pose.theta(); - } else { - s1 = 2 * M_PI - pose.theta() + m_Theta; - s2 = -(pose.theta() - m_Theta); - } - if (fabs(s1) > fabs(s2)) { - theta = s2; - } else { - theta = s1; - } - while (theta >= M_PI) theta -= 2*M_PI; - while (theta < -M_PI) theta += 2*M_PI; - - return Transformation2D(x, y, theta); -} - -Pose THIS::interpolate(const Pose& referencePose, float t) const { - - float newX = m_X + t * (referencePose.x() - m_X); - float newY = m_Y + t * (referencePose.y() - m_Y); - - // Calculate mean angle by adding the vem_Thetaors in unit circle - float x1 = cosf(m_Theta); - float y1 = sinf(m_Theta); - float x2 = cosf(referencePose.theta()); - float y2 = sinf(referencePose.theta()); - float newTheta = atan2 (y1*(1-t)+y2*t, x1*(1-t)+x2*t); - - return Pose(newX, newY, newTheta); -} - -//THIS::THIS( ExtendedInStream& extStrm ) -//{ -// char version; -// extStrm >> version; -// extStrm >> m_X; -// extStrm >> m_Y; -// extStrm >> m_Theta; -//} - -//void THIS::storer( ExtendedOutStream& extStrm ) const -//{ -// char version=10; -// extStrm << version; -// extStrm << m_X; -// extStrm << m_Y; -// extStrm << m_Theta; -//} - diff --git a/homer_nav_libs/src/Math/Transformation2D.cpp b/homer_nav_libs/src/Math/Transformation2D.cpp deleted file mode 100644 index f60629cd..00000000 --- a/homer_nav_libs/src/Math/Transformation2D.cpp +++ /dev/null @@ -1,308 +0,0 @@ -/******************************************************************************* - * Transformation2D.cpp - * - * (C) 2008 AG Aktives Sehen <agas@uni-koblenz.de> - * Universitaet Koblenz-Landau - * - * $Id: Transformation2D.cpp 44313 2011-04-06 22:46:28Z agas $ - *******************************************************************************/ - -#include <homer_nav_libs/Math/Transformation2D.h> - -#include <cmath> -#include <vector> -#include <iostream> -#include <sstream> -#include <homer_nav_libs/Math/vec2.h> // TODO das sieht nach baselib aus ggf. durch baselib ersetzen -#include <homer_nav_libs/Math/mat2.h> // TODO das sieht nach baselib aus ggf. durch baselib ersetzen -#include <homer_nav_libs/Math/Point2D.h> -#include <homer_nav_libs/Math/Line2D.h> - -#define THIS Transformation2D -#define BASE CVec2 - -THIS::Transformation2D() : BASE() -{ - m_Theta = 0.0; -} - -THIS::Transformation2D ( double x, double y, double theta ) : BASE ( x,y ) -{ - m_Theta = theta; -} - -THIS::Transformation2D ( const CVec2& vec, double theta ) : BASE ( vec ) -{ - m_Theta = theta; -} - -THIS::~Transformation2D() -{ -} - -void THIS::set ( double x, double y, double theta ) -{ - m_X = x; - m_Y = y; - m_Theta = theta; -} - -double THIS::theta() const -{ - return m_Theta; -} - -Transformation2D THIS::operator+ ( Transformation2D t ) const -{ - double theta = m_Theta + t.theta(); - // TODO comment only for scan matching test -// while ( theta >= M_PI ) theta -= 2*M_PI; -// while ( theta < -M_PI ) theta += 2*M_PI; - return Transformation2D ( m_X + t.x(), m_Y + t.y(), theta ); -} - -Transformation2D& THIS::operator+= ( Transformation2D t ) -{ - m_X += t.x(); - m_Y += t.y(); - m_Theta += t.theta(); - // TODO comment only for scan matching test -// while ( m_Theta >= M_PI ) m_Theta -= 2*M_PI; -// while ( m_Theta < -M_PI ) m_Theta += 2*M_PI; - return ( *this ); -} - -Transformation2D THIS::operator- ( Transformation2D t ) const -{ - float s1, s2, theta; - if ( m_Theta > t.theta() ) - { - s1 = - ( 2 * M_PI - m_Theta + t.theta() ); - s2 = m_Theta - t.theta(); - } - else - { - s1 = 2 * M_PI - t.theta() + m_Theta; - s2 = - ( t.theta() - m_Theta ); - } - if ( fabs ( s1 ) > fabs ( s2 ) ) - { - theta = s2; - } - else - { - theta = s1; - } - while ( theta >= M_PI ) theta -= 2*M_PI; - while ( theta < -M_PI ) theta += 2*M_PI; -// double theta = m_Theta - t.theta(); -// while ( theta >= M_PI ) theta -= 2*M_PI; -// while ( theta < -M_PI ) theta += 2*M_PI; - return Transformation2D ( m_X - t.x(), m_Y - t.y(), theta ); -} - -Transformation2D& THIS::operator-= ( Transformation2D t ) -{ - m_X -= t.x(); - m_Y -= t.y(); - - float s1, s2, theta; - if ( m_Theta > t.theta() ) - { - s1 = - ( 2 * M_PI - m_Theta + t.theta() ); - s2 = m_Theta - t.theta(); - } - else - { - s1 = 2 * M_PI - t.theta() + m_Theta; - s2 = - ( t.theta() - m_Theta ); - } - if ( fabs ( s1 ) > fabs ( s2 ) ) - { - theta = s2; - } - else - { - theta = s1; - } - while ( theta >= M_PI ) theta -= 2*M_PI; - while ( theta < -M_PI ) theta += 2*M_PI; - m_Theta = theta; - - return ( *this ); - -// m_X -= t.x(); -// m_Y -= t.y(); -// m_Theta -= t.theta(); -// while ( m_Theta >= M_PI ) m_Theta -= 2*M_PI; -// while ( m_Theta < -M_PI ) m_Theta += 2*M_PI; -// return ( *this ); -} - -Transformation2D THIS::operator* ( float factor ) const -{ - - double theta = m_Theta * factor; - while ( theta >= M_PI ) theta -= 2*M_PI; - while ( theta < -M_PI ) theta += 2*M_PI; - return Transformation2D ( m_X * factor, m_Y * factor, theta ); -} - -Transformation2D& THIS::operator*= ( float factor ) -{ - m_X *= factor; - m_Y *= factor; - m_Theta *= factor; - while ( m_Theta >= M_PI ) m_Theta -= 2*M_PI; - while ( m_Theta < -M_PI ) m_Theta += 2*M_PI; - return ( *this ); -} - - -Transformation2D THIS::operator/ ( float factor ) const -{ - double theta = m_Theta / factor; - return Transformation2D ( m_X / factor, m_Y / factor, theta ); -} - -Transformation2D& THIS::operator/= ( float factor ) -{ - m_X /= factor; - m_Y /= factor; - m_Theta /= factor; - return ( *this ); -} - -bool THIS::operator== ( Transformation2D t ) const -{ - if ( t.x() == m_X && t.y() == m_Y && t.theta() == m_Theta ) - { - return true; - } - else - { - return false; - } -} - -bool THIS::operator!= ( Transformation2D t ) const -{ - return ! ( ( *this ) ==t ); -} - -bool THIS::operator<= ( Transformation2D t ) const -{ - return ( this->magnitude() <= t.magnitude() ) && ( m_Theta <= t.theta() ); -} - -bool THIS::operator>= ( Transformation2D t ) const -{ - return ( this->magnitude() >= t.magnitude() ) && ( m_Theta >= t.theta() ); -} - -bool THIS::operator< ( Transformation2D t ) const -{ - return ( m_X < t.x() ) || ( m_Y < t.y() ) || ( ( m_Theta < t.theta() ) && ( *this <= t ) ); -} - -bool THIS::operator> ( Transformation2D t ) const -{ - return ( m_X > t.x() ) || ( m_Y > t.y() ) || ( ( m_Theta > t.theta() ) && ( *this >= t ) ); -} - -Transformation2D THIS::abs() const -{ - return Transformation2D ( std::abs ( m_X ), std::abs ( m_Y ), std::abs ( m_Theta ) ); -} - -Transformation2D THIS::inverse() const -{ - return ( *this ) * ( -1.0 ); -} - -Point2D THIS::transform ( const Point2D& point ) const -{ - CMat2 rotMat = CMat2 ( m_Theta ); - CVec2 transVec = CVec2 ( m_X, m_Y ); - Point2D transformedPoint = rotMat * ( point ); - transformedPoint += transVec; - return transformedPoint; -} - -std::vector<Point2D> THIS::transform ( const std::vector<Point2D>& points ) const -{ - CMat2 rotMat = CMat2 ( m_Theta ); - CVec2 transVec = CVec2 ( m_X, m_Y ); - std::vector<Point2D> transformedPoints; - std::vector<Point2D>::const_iterator iter = points.begin(); - while ( iter != points.end() ) - { - Point2D currPoint = rotMat * ( *iter ); - currPoint += transVec; - transformedPoints.push_back ( currPoint ); - iter++; - } - return transformedPoints; -} - -// // Reihenfolge rotation/translation vertauscht !!! -// Point2D THIS::transform ( Point2D point ) const -// { -// CMat2 rotMat = CMat2 ( m_Theta ); -// CVec2 transVec = CVec2 ( m_X, m_Y ); -// Point2D transformedPoint = point+transVec; -// transformedPoint = rotMat * point; -// return transformedPoint; -// } -// -// // Reihenfolge rotation/translation vertauscht !!! -// std::vector<Point2D> THIS::transform ( std::vector<Point2D> points ) const -// { -// CMat2 rotMat = CMat2 ( m_Theta ); -// CVec2 transVec = CVec2 ( m_X, m_Y ); -// std::vector<Point2D> transformedPoints; -// std::vector<Point2D>::const_iterator iter = points.begin(); -// while ( iter != points.end() ) -// { -// Point2D currPoint = ( *iter )+ transVec; -// currPoint = rotMat * currPoint; -// transformedPoints.push_back ( currPoint ); -// iter++; -// } -// return transformedPoints; -// } - -Line2D THIS::transform ( const Line2D& line ) const -{ - CMat2 rotMat = CMat2 ( m_Theta ); - CVec2 transVec = CVec2 ( m_X, m_Y ); - Line2D transformedLine = Line2D ( rotMat * line.start() + transVec, rotMat * line.end() + transVec ); - return transformedLine; -} - -std::vector<Line2D> THIS::transform ( const std::vector<Line2D>& lines ) const -{ - //CMat2 rotMat = CMat2 ( m_Theta ); - //CVec2 transVec = CVec2 ( m_X, m_Y ); - std::vector<Line2D> transformedLines; - std::vector<Line2D>::const_iterator iter = lines.begin(); - while ( iter != lines.end() ) - { - transformedLines.push_back ( transform(*iter) ); - iter++; - } - return transformedLines; -} - -std::string THIS::toString() const -{ - std::ostringstream str; - str << "deltaX: " << m_X << ", deltaY: " << m_Y << ", deltaTheta: " << m_Theta; - return str.str(); -} - - - -#undef THIS -#undef BASE - diff --git a/homer_nav_libs/src/SpeedControl/CMakeLists.txt b/homer_nav_libs/src/SpeedControl/CMakeLists.txt deleted file mode 100644 index 154b60eb..00000000 --- a/homer_nav_libs/src/SpeedControl/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -set(SpeedControl_SRC - SpeedControl.cpp -) - -add_library(SpeedControl ${SpeedControl_SRC}) diff --git a/homer_nav_libs/src/SpeedControl/SpeedControl.cpp b/homer_nav_libs/src/SpeedControl/SpeedControl.cpp deleted file mode 100644 index c939197e..00000000 --- a/homer_nav_libs/src/SpeedControl/SpeedControl.cpp +++ /dev/null @@ -1,177 +0,0 @@ -#include <cmath> -#include <iostream> - -#include <ros/ros.h> -#include "SpeedControl.h" -#include "tools/loadRosConfig.h" - -using namespace std; - -// Robot dimensions in m -// -// -// /-------------\ <-- MAX_X -// | x | -// | | | -// | | | -// | y----- | -// | | -// | ROBOT | -// | | -// \-------------/ <-- MIN_X -// ^ ^ -// | | -// MAX_Y MIN_Y -// -float ROBOT_MIN_X = -0.30; -float ROBOT_MAX_X = 0.30; -float ROBOT_MIN_Y = -0.27; -float ROBOT_MAX_Y = 0.27; - - -namespace { - Eigen::AlignedBox2f InnerDangerZone, - OuterDangerZone; - float InnerDangerZoneFactor, - OuterDangerZoneFactor; - - inline Eigen::AlignedBox2f loadRect(const string& path) - { - pair<float, float> pX, pY; - ros::param::get(path + "/x_min", pX.first); - ros::param::get(path + "/x_max", pX.second); - ros::param::get(path + "/y_min", pY.first); - ros::param::get(path + "/y_max", pY.second); - - Eigen::Vector2f first(pX.first, pY.first), second(pX.second, pY.second); - return Eigen::AlignedBox2f(first, second); - } -} - -void SpeedControl::loadDimensions() -{ - InnerDangerZone = loadRect("/homer_navigation/speed_control/inner_danger_zone"); - InnerDangerZoneFactor; - ros::param::get("/homer_navigation/speed_control/inner_danger_zone/speed_factor", InnerDangerZoneFactor); - OuterDangerZone = loadRect("/homer_navigation/speed_control/inner_danger_zone"); - OuterDangerZoneFactor; - ros::param::get("/homer_navigation/speed_control/outer_danger_zone/speed_factor", OuterDangerZoneFactor); - if(!OuterDangerZone.contains(InnerDangerZone)) - ROS_WARN_STREAM("InnerDangerZone is not contained in OuterDangerZone"); -} - -float SpeedControl::getSpeedFactor(const vector<geometry_msgs::Point>& points, float minVal, float maxVal ) -{ - float minFactor = 1.0; - for (unsigned i = 0; i < points.size(); i++) - { - Eigen::Vector2f point(points[i].x, points[i].y); - if(InnerDangerZone.contains(point)) - { - minFactor = InnerDangerZoneFactor; - break; - } - if(OuterDangerZone.contains(point)) - minFactor = OuterDangerZoneFactor; - } - minFactor = sqrt(minFactor); - float range = maxVal - minVal; - minFactor = minVal + range*minFactor; - return minFactor; -} - -float SpeedControl::getMaxMoveDistance(vector<geometry_msgs::Point> points) -{ - float minDistance = 4; // distance in m to nearest obstacle in front - for (unsigned int i = 0; i < points.size(); i++) - { - if(points[i].y > ROBOT_MIN_Y && points[i].y < ROBOT_MAX_Y && points[i].x > ROBOT_MAX_X) - { - float distance = sqrt((points[i].x * points[i].x) + (points[i].y * points[i].y)); - if (distance < minDistance) - { - minDistance = distance; - } - } - } - float maxMoveDist = minDistance - ROBOT_MAX_X; - if (maxMoveDist < 0) { - maxMoveDist = 0.0; - } - return maxMoveDist; -} - -float SpeedControl::getMaxMoveDistance(std::vector< Eigen::Vector3d >* kinectData, float minObstacleHeight, float minObstacleFromRobotDistance, float maxObstacleFromRobotDistance) -{ - // Check for obstacles in Kinect image: Look for closest point - - float minDistance = 4; // distance to nearest obstacle in front - - for(int i=0;i<kinectData->size();++i) - { - Eigen::Vector2d p = Eigen::Vector2d(kinectData->at(i).x(), kinectData->at(i).y()); - if(!std::isnan(p.x())) - { - // Filter point cloud - if(p.x() > minObstacleFromRobotDistance && p.x() < maxObstacleFromRobotDistance && kinectData->at(i).z() > minObstacleHeight) - { - // Check for collisions outside of robot - if(p.y() > ROBOT_MIN_Y && p.y() < ROBOT_MAX_Y && p.x() > ROBOT_MAX_X) - { - float distance = sqrt((p.x() * p.x()) + (p.y() * p.y())); - if (distance < minDistance) - { - minDistance = distance; - } - } - } - } - } - - float maxMoveDist = minDistance - ROBOT_MAX_X; - if (maxMoveDist < 0) { - maxMoveDist = 0.0; - } - return maxMoveDist; -} - -float SpeedControl::getTurnSpeedFactor( float speedFactor, float turnAngle, float minVal, float maxVal ) -{ - //turn faster for larger angles - float angleDependentFactor = sqrt( fabs(turnAngle) / M_PI ); - angleDependentFactor = minVal + angleDependentFactor*(maxVal-minVal); - return sqrt( speedFactor * angleDependentFactor ); -} - -float SpeedControl::getMinTurnAngle(std::vector<geometry_msgs::Point> laserData, float minAngle, float maxAngle, float minDistance, float maxDistance) -{ - float turn_factor = 1.0; - for (unsigned int i = 0; i < laserData.size(); i++) - { - if(laserData[i].y > ROBOT_MIN_Y && laserData[i].y < ROBOT_MAX_Y && laserData[i].x > ROBOT_MAX_X) - { - float distance = sqrt((laserData[i].x * laserData[i].x) + (laserData[i].y * laserData[i].y)); - if (distance < minDistance + ROBOT_MAX_X) - { - turn_factor = 0.0; - } - else if(distance > maxDistance + ROBOT_MAX_X) - { - turn_factor = 1.0; - } - else - { - turn_factor = (distance - minDistance)/maxDistance; - } - } - } - float range = maxAngle - minAngle; - return minAngle + turn_factor * range; -} - -SpeedControl::SpeedControl() { -} - -SpeedControl::~SpeedControl() { -} - diff --git a/homer_nav_libs/src/SpeedControl/SpeedControl.h b/homer_nav_libs/src/SpeedControl/SpeedControl.h deleted file mode 100644 index 7bef0e9a..00000000 --- a/homer_nav_libs/src/SpeedControl/SpeedControl.h +++ /dev/null @@ -1,71 +0,0 @@ -#ifndef SPEEDCONTROL_H -#define SPEEDCONTROL_H - -#include <vector> -#include <Eigen/Geometry> -#include <geometry_msgs/Point.h> - -/** - * @class SpeedControl - * @author Malte Knauf, Stephan Wirth - * @brief Class for computing a speed factor with respect to a given laser measurement. - */ -class SpeedControl { - - public: - - /** - * @brief Loads robot and safety zone dimensions config values - */ - static void loadDimensions(); - - /** - * Calculates the speed factor for the robot. If a measured obstacle lies in the "danger zone" - * that is defined in SpeedControl.cpp, the speed factor will be below maxVal. The nearer the obstacle, - * the smaller the speed factor. - * @param laserData Laser measurement - * @param minVal,maxVal range of return values - * @return Speed factor, value between minVal and maxVal. The higher the speed factor, the safer is it to drive fast. - */ - static float getSpeedFactor(const std::vector<geometry_msgs::Point>& points, float minVal=0.2, float maxVal=1.0); - - /** - * Calculates the maximum distance the robot can move without touching an obstacle. - * @param laserPoints Current laser measurement transformed to (valid) points in map frame - * @param laserConf The configuration of the LRF that took the measurement - * @return maximum distance (m) the robot can move based on the given laserscan. - */ - static float getMaxMoveDistance(std::vector<geometry_msgs::Point> laserData); - - static float getMaxMoveDistance(std::vector< Eigen::Vector3d >* kinectData, float minObstacleHeight, float minObstacleFromRobotDistance, float maxObstacleFromRobotDistance); - - /// @return if the angle is larger, the turn speed factor will be higher - static float getTurnSpeedFactor( float speedFactor, float turnAngle, float minVal, float maxVal ); - - /** - * Calculates the minimum angle between the robot's orientation and the next waypoint which is necessary - * to trigger a rotation instead of a straight line - * @brief getMinTurnAngle - * @param laserData - * @param minAngle - * @param maxAngle - * @return - */ - static float getMinTurnAngle(std::vector<geometry_msgs::Point> laserData, float minAngle, float maxAngle, - float minDistance, float maxDistance); - - private: - - /** - * Constructor is empty and private because this class will never be instanciated. - */ - SpeedControl(); - - /** - * Destructor is empty. - */ - ~SpeedControl(); - -}; -#endif - diff --git a/homer_navigation/CHANGELOG.rst b/homer_navigation/CHANGELOG.rst deleted file mode 100644 index 5c4aae42..00000000 --- a/homer_navigation/CHANGELOG.rst +++ /dev/null @@ -1,9 +0,0 @@ -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Changelog for package homer_navigation -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -0.1.1 (2016-11-03) ------------------- -* fixes -* initial commit -* Contributors: Niklas Yann Wettengel diff --git a/homer_navigation/CMakeLists.txt b/homer_navigation/CMakeLists.txt deleted file mode 100644 index 94d03307..00000000 --- a/homer_navigation/CMakeLists.txt +++ /dev/null @@ -1,55 +0,0 @@ -cmake_minimum_required(VERSION 2.8.3) -project(homer_navigation) - -find_package(catkin REQUIRED COMPONENTS - roscpp - roslib - homer_robbie_architecture - nav_msgs - sensor_msgs - homer_mapnav_msgs - homer_nav_libs - tf - cmake_modules -) - -find_package(Eigen3 REQUIRED) - -set(CMAKE_BUILD_TYPE Release) - -catkin_package( - INCLUDE_DIRS include - CATKIN_DEPENDS - roscpp - roslib - homer_robbie_architecture - nav_msgs - sensor_msgs - homer_mapnav_msgs - homer_nav_libs - tf -) - -include_directories( - include - ${catkin_INCLUDE_DIRS} - ${Eigen3_INCLUDE_DIRS} -) - -add_executable(homer_navigation src/homer_navigation_node.cpp) -add_dependencies(homer_navigation ${catkin_EXPORTED_TARGETS}) - -target_link_libraries(homer_navigation - ${catkin_LIBRARIES} - ${EIGEN3_LIBRARIES} - ) - -install(DIRECTORY include/${PROJECT_NAME}/ - DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} -) - -install(TARGETS homer_navigation - ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} - LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} - RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} -) diff --git a/homer_navigation/README.md b/homer_navigation/README.md deleted file mode 100644 index 01fa1271..00000000 --- a/homer_navigation/README.md +++ /dev/null @@ -1,76 +0,0 @@ -# homer_navigation - -## Introduction - -Das Package "homer_navigation" mit seiner gleichnamigen Node ist für die Navigation des Roboters zuständig. Es hält stets die aktuelle Karte des Roboters vor, die auf Topic /map empfangen wurde und berechnet anhand von dieser Karte einen Pfad vom Roboter zu einem gegebenen Zielpunkt. Dafür verwendet die Navigation die sogenannte Pfad-Transformation - eine Kombination aus Distanz-Transformation und Hindernistransformation -, in Verbindung mit A-Stern, um einen optimalen Pfad zu finden. Das Verhältnis zwischen Distanz- und Hindernis-Transformation kann über einen Parameter angepasst werden. -Nach der Pfadberechnung ist das Package außerdem dafür zuständig den Roboter diesen Pfad zum Ziel abfahren zu lassen. - -## Topics - -#### Publisher -* `/homer_navigation/target_reached (std_msgs/String)`: Wenn der Roboter sein Ziel erreicht hat, wird eine Message über dieses Topic veschickt. -* `/homer_navigation/target_unreachable (mapnav_msgs/TargetUnreachable)`: Über dieses Topic wird mitgeteilt, wenn der Roboter sein Ziel nicht erreichen kann und die Navigation abgebrochen wurde. Ein Statuscode wird mitgeliefert (siehe Package map_messages). -* `/homer_navigation/path (nav_msgs/Path)`: Hierüber wird der aktuelle Pfad zur Visualisierung an die GUI geschickt. -* `/robot_platform/cmd_vel (geometry_msgs/Twist)`: Über dieses Topic werden die aktuellen Fahrbefehle zum Roboter geschickt. -* `/ptu/set_pan_tilt (ptu/SetPanTilt)`: Über dieses Topic wird die PTU nach navigation auf 0, 0 gefahren. -* `/ptu/center_world_point (ptu/CenterWorldPoint)`: Über dieses Topic wird die PTU auf den nächsten Wegpunkt centriert. - -#### Subscriber -* `/map (nav_msgs/OccupancyGrid)`: Die jeweils aktuelle Map wird empfangen, um sie für die Pfadplanung und Hindernisvermeidung während der Navigation zu verwenden. -* `/pose (geometry_msgs/PoseStamped)`: Die aktuelle Pose des Roboters wird als Startpunkt der Pfadplanung verwendet. -* `/scan (sensor_msgs/LaserScan)`: Der aktuelle LaserScan wird zur Hindernisvermeidung verwendet. -* `/front_scan (sensor_msgs/LaserScan)`: Der aktuelle LaserScan wird zur Hindernisvermeidung verwendet. -* `/homer_navigation/start_navigation (mapnav_msgs/StartNavigation)`: Startet die Pfadplanung und anschließend die Navigation zur mitgelieferten Zielpose. -* `/move_base_simple/goal (geometry_msgs/PoseStamped)`: Started die Pfadplanung und anschließende Navigation zur Zielpose. -* `/homer_navigation/stop_navigation (std_msgs/Empty)`: Stoppt die aktuelle Navigation. -* `/homer_navigation/navigate_to_POI (mapnav_msgs/NavigateToPOI)`: Startet die Pfadplanung und anschließend die Navigation zum POI mit angegebenen Namen. Der entsprechende POI wird anschließend vom map_manager erfragt. -* `/homer_navigation/unknown_threshold (std_msgs/Int8)`: Über dieses Topic kann der Schwellwert verändert werden, ab dem ein Zellwahrscheinlichkeit als belegt und damit unbefahrbar markiert wird. Standard ist 50 (%). -* `/homer_navigation/refresh_params (std_msgs/Empty)`: Über dieses Topic lassen sich die Parameter neu auslesen. -* `/homer_navigation/max_depth_move_distance (std_msgs/Float32)`: Über dieses Topic lässt sich die Hindernissdistance der Tiefendaten übermitteln. - -## Launch Files - -* `homer_navigation.launch:` Startet die Navigation und lädt alle Navigations-Paramter in den Parameterserver. - -## Parameter - - -### homer_navigation -* `/homer_navigation/safe_path_weight:` 1.2 # factor weight for safer path in relation to shortest path -* `/homer_navigation/waypoint_sampling_threshold:` 1.5 # factor of how dense the path waypoints are sampled regarding the obstacle_distance of the last or next waypoint -* `/homer_navigation/frontier_safeness_factor:` 1.4 # factor of min_allowed_obstacle_distance to an obstacle of a cell which is considered safe - -### cost calculation parameters -* `/homer_navigation/allowed_obstacle_distance/min:` 0.3 # m robot must stay further away than this from obstacles -* `/homer_navigation/allowed_obstacle_distance/max:` 5.0 # m not used at the moment -* `/homer_navigation/safe_obstacle_distance/min:` 0.7 # m if possible robot should move further away than this from obstacles -* `/homer_navigation/safe_obstacle_distance/max:` 1.5 # m further away than this from obstacles doesn't give a lesser cost addition - -### collision Avoidance parameters -* `/homer_navigation/collision_distance:` 0.3 # m distance to obstacle from robotFront in which the obstacle avoidance will be executed -* `/homer_navigation/collision_distance_near_target:` 0.2 # m distance to obstacle from robotFront where obstacle avoidance won't be executed when near the target -* `/homer_navigation/backward_collision_distance:` 0.5 # m distance behind robot in which the robot won't back up into while doing collision avoidance -* `/homer_navigation/min_y:` 0.27 # m half robot width for max_move_distance calculation -* `/homer_navigation/min_x:` 0.3 # m distance from base_link to robot front for max_move_distance calculation - -### check path on map update -* `/homer_navigation/check_path:` true # bool toggles if the calculated path will be checked for obstacles while navigating -* `/homer_navigation/check_path_max_distance:` 2 # m maximal distance from robot position in which the path is being checked for obstacles - -### speed parameters -* `/homer_navigation/min_turn_angle:` 0.15 # rad values lower than this angle will let the navigation assume reaching the designated position -* `/homer_navigation/max_turn_speed:` 0.6 # rad/s max turn velocity the navigation can send -* `/homer_navigation/min_turn_speed:` 0.3 # rad/s min turn speed for Final Turn so the Robot doesn't stop turning -* `/homer_navigation/max_drive_angle:` 0.6 # rad threshold for driving and turning - if above that value only turn - -* `/homer_navigation/max_move_speed:` 0.4 # m/s max move speed the navigation can send - -### caution factors values near 0 mean high caution values greater values mean less caution -### if any factor equals 0 the robot can't follow paths !! -* `/homer_navigation/map_speed_factor:` 1.2 # factor for the max speed calculation of the obstacleDistancemap -* `/homer_navigation/waypoint_speed_factor:` 1.2 # factor for the max speed calculation with the distance to the next waypoint -* `/homer_navigation/obstacle_speed_factor:` 1.0 # factor for the max speed calculation with the last laser may movement distance - -* `/homer_navigation/callback_error_duration:` 0.3 # s max duration between pose and laser callbacks before error handling is executed - -* `/homer_navigation/use_ptu:` false# bool toggles if the ptu is being used to look at the next Waypoint during navigation diff --git a/homer_navigation/config/homer_navigation.yaml b/homer_navigation/config/homer_navigation.yaml deleted file mode 100644 index 24e17193..00000000 --- a/homer_navigation/config/homer_navigation.yaml +++ /dev/null @@ -1,40 +0,0 @@ -/homer_navigation/safe_path_weight: 0.1 # factor weight for safer path in relation to shortest path -/homer_navigation/waypoint_sampling_threshold: 1.5 # factor of how dense the path waypoints are sampled regarding the obstacle_distance of the last or next waypoint -/homer_navigation/frontier_safeness_factor: 1.4 # factor of min_allowed_obstacle_distance to an obstacle of a cell which is considered safe - -### cost calculation parameters -/homer_navigation/allowed_obstacle_distance/min: 0.27 # m robot must stay further away than this from obstacles -/homer_navigation/allowed_obstacle_distance/max: 5.0 # m not used at the moment -/homer_navigation/safe_obstacle_distance/min: 1.5 # m if possible robot should move further away than this from obstacles -/homer_navigation/safe_obstacle_distance/max: 3.0 # m further away than this from obstacles doesn't give a lesser cost addition - -### collision Avoidance parameters -/homer_navigation/collision_distance: 0.3 # m distance to obstacle from robotFront in which the obstacle avoidance will be executed -/homer_navigation/collision_distance_near_target: 0.2 # m distance to obstacle from robotFront where obstacle avoidance won't be executed when near the target -/homer_navigation/backward_collision_distance: 0.5 # m distance behind robot in which the robot won't back up into while doing collision avoidance -/homer_navigation/min_y: 0.23 # m half robot width for max_move_distance calculation -/homer_navigation/min_x: 0.3 # m distance from base_link to robot front for max_move_distance calculation - -### check path on map update -/homer_navigation/check_path: true # toggles if the calculated path will be checked for obstacles while navigating -/homer_navigation/check_path_max_distance: 2 # m maximal distance from robot position in which the path is being checked for obstacles - -### speed parameters -/homer_navigation/min_turn_angle: 0.1 # rad values lower than this angle will let the navigation assume reaching the designated position -/homer_navigation/max_turn_speed: 0.6 # rad/s max turn velocity the navigation can send -/homer_navigation/min_turn_speed: 0.2 # rad/s min turn speed for Final Turn so the Robot doesn't stop turning -/homer_navigation/max_drive_angle: 0.3 # rad threshold for driving and turning - if above that value only turn - -/homer_navigation/max_move_speed: 1.0 # m/s max move speed the navigation can send -### caution factors values near 0 mean high caution values greater values mean less caution -### if any factor equals 0 the robot can't follow paths !! -/homer_navigation/map_speed_factor: 0.7 # factor for the max speed calculation of the obstacleDistancemap -/homer_navigation/waypoint_speed_factor: 10 # factor for the max speed calculation with the distance to the next Waypoint -/homer_navigation/obstacle_speed_factor: 0.5 # factor for the max speed calculation with the last laser max movement distance -/homer_navigation/target_distance_speed_factor: 0.4 # factor for the max speed calculation with the distance to target - -/homer_navigation/callback_error_duration: 0.3 # s max duration between pose and laser callbacks before error handling is executed - -/homer_navigation/use_ptu: false # bool toggles if the ptu is being used to look at the next Waypoint during navigation -/homer_navigation/unknown_threshold: 50 # obstacle strenght under which the obstacle is ignored by navigation -/homer_navigation/waypoint_radius_factor: 0.25 # factor for includance of obstacle map diff --git a/homer_navigation/config/homer_navigation_pioneer.yaml b/homer_navigation/config/homer_navigation_pioneer.yaml deleted file mode 100644 index 0a1370d1..00000000 --- a/homer_navigation/config/homer_navigation_pioneer.yaml +++ /dev/null @@ -1,39 +0,0 @@ -/homer_navigation/safe_path_weight: 0.1 # factor weight for safer path in relation to shortest path -/homer_navigation/waypoint_sampling_threshold: 1.5 # factor of how dense the path waypoints are sampled regarding the obstacle_distance of the last or next waypoint -/homer_navigation/frontier_safeness_factor: 1.4 # factor of min_allowed_obstacle_distance to an obstacle of a cell which is considered safe - -### cost calculation parameters -/homer_navigation/allowed_obstacle_distance/min: 0.27 # m robot must stay further away than this from obstacles -/homer_navigation/allowed_obstacle_distance/max: 5.0 # m not used at the moment -/homer_navigation/safe_obstacle_distance/min: 0.5 # m if possible robot should move further away than this from obstacles -/homer_navigation/safe_obstacle_distance/max: 1.5 # m further away than this from obstacles doesn't give a lesser cost addition - -### collision Avoidance parameters -/homer_navigation/collision_distance: 0.3 # m distance to obstacle from robotFront in which the obstacle avoidance will be executed -/homer_navigation/collision_distance_near_target: 0.2 # m distance to obstacle from robotFront where obstacle avoidance won't be executed when near the target -/homer_navigation/backward_collision_distance: 0.5 # m distance behind robot in which the robot won't back up into while doing collision avoidance -/homer_navigation/min_y: 0.23 # m half robot width for max_move_distance calculation -/homer_navigation/min_x: 0.3 # m distance from base_link to robot front for max_move_distance calculation - -### check path on map update -/homer_navigation/check_path: true # toggles if the calculated path will be checked for obstacles while navigating -/homer_navigation/check_path_max_distance: 2 # m maximal distance from robot position in which the path is being checked for obstacles - -### speed parameters -/homer_navigation/min_turn_angle: 0.1 # rad values lower than this angle will let the navigation assume reaching the designated position -/homer_navigation/max_turn_speed: 0.5 # rad/s max turn velocity the navigation can send -/homer_navigation/min_turn_speed: 0.3 # rad/s min turn speed for Final Turn so the Robot doesn't stop turning -/homer_navigation/max_drive_angle: 0.4 # rad threshold for driving and turning - if above that value only turn - -/homer_navigation/max_move_speed: 0.4 # m/s max move speed the navigation can send -### caution factors values near 0 mean high caution values greater values mean less caution -### if any factor equals 0 the robot can't follow paths !! -/homer_navigation/map_speed_factor: 1.2 # factor for the max speed calculation of the obstacleDistancemap -/homer_navigation/waypoint_speed_factor: 1.3 # factor for the max speed calculation with the distance to the next Waypoint -/homer_navigation/obstacle_speed_factor: 0.8 # factor for the max speed calculation with the last laser max movement distance - -/homer_navigation/callback_error_duration: 0.3 # s max duration between pose and laser callbacks before error handling is executed - -/homer_navigation/use_ptu: false # bool toggles if the ptu is being used to look at the next Waypoint during navigation -/homer_navigation/unknown_threshold: 50 # obstacle strenght under which the obstacle is ignored by navigation -/homer_navigation/waypoint_radius_factor: 0.25 # factor for includance of obstacle map diff --git a/homer_navigation/include/homer_navigation/homer_navigation_node.h b/homer_navigation/include/homer_navigation/homer_navigation_node.h deleted file mode 100644 index a273994b..00000000 --- a/homer_navigation/include/homer_navigation/homer_navigation_node.h +++ /dev/null @@ -1,329 +0,0 @@ -#ifndef FastNavigationModule_H -#define FastNavigationModule_H - -#include <vector> -#include <string> -#include <sstream> -#include <cmath> - -#include <ros/ros.h> -#include <ros/package.h> - -#include <tf/transform_listener.h> - -#include <homer_robbie_architecture/Architecture/StateMachine/StateMachine.h> - -#include <nav_msgs/OccupancyGrid.h> -#include <nav_msgs/Path.h> -#include <geometry_msgs/PoseStamped.h> -#include <geometry_msgs/Twist.h> -#include <sensor_msgs/LaserScan.h> -#include <homer_mapnav_msgs/StartNavigation.h> -#include <homer_mapnav_msgs/NavigateToPOI.h> -#include <homer_mapnav_msgs/TargetUnreachable.h> -#include <homer_mapnav_msgs/GetPointsOfInterest.h> -#include <std_msgs/Int8.h> -#include <std_msgs/Float32.h> -#include <std_msgs/Empty.h> -#include <std_msgs/String.h> -#include <std_msgs/Float32.h> -#include <homer_ptu_msgs/CenterWorldPoint.h> -#include <homer_ptu_msgs/SetPanTilt.h> - -#include <homer_nav_libs/tools.h> -#include <homer_nav_libs/Explorer/Explorer.h> - -class Explorer; -/** - * @class HomerNavigationNode - * @author Malte Knauf, Stephan Wirth, David Gossow (RX), Florian Polster - * @brief Performs autonomous navigation - */ -class HomerNavigationNode { - - public: - - /** - * @brief States of the state machines - */ - enum ProcessState - { - IDLE, - AWAITING_PATHPLANNING_MAP, - FOLLOWING_PATH, - AVOIDING_COLLISION, - FINAL_TURN - }; - - /** - * The constructor - */ - HomerNavigationNode(); - - /** - * The destructor - */ - virtual ~HomerNavigationNode(); - - /** @brief Is called in constant intervals. */ - void idleProcess(); - - - protected: - /** @brief Handles incoming messages. */ - void mapCallback(const nav_msgs::OccupancyGrid::ConstPtr& msg); - void poseCallback(const geometry_msgs::PoseStamped::ConstPtr& msg); - void laserDataCallback(const sensor_msgs::LaserScan::ConstPtr& msg); - void downlaserDataCallback(const sensor_msgs::LaserScan::ConstPtr& msg); - void startNavigationCallback(const homer_mapnav_msgs::StartNavigation::ConstPtr& msg); - void moveBaseSimpleGoalCallback(const geometry_msgs::PoseStamped::ConstPtr& msg); - void stopNavigationCallback(const std_msgs::Empty::ConstPtr& msg); - - void navigateToPOICallback(const homer_mapnav_msgs::NavigateToPOI::ConstPtr& msg); - void unknownThresholdCallback(const std_msgs::Int8::ConstPtr& msg); - void maxDepthMoveDistanceCallback(const std_msgs::Float32::ConstPtr& msg); - - - /** @brief initializes and refreshs parameters */ - void loadParameters(); - - /** @brief Is called when all modules are loaded and thread has started. */ - virtual void init(); - - /** @brief Detect & handle possible collision */ - void handleCollision(); - - private: - /** @brief Start navigation to m_Target on last_map_data_ */ - void startNavigation(); - - /** @brief Check if obstacles are blocking the way in last_map_data_ */ - bool checkPath(); - - /** @brief calculate path from current robot position to target approximation */ - void calculatePath(); - - /** @brief Send message containing current navigation path */ - void sendPathData(); - - /** @brief Sends target reached and stops the robot. */ - void sendTargetReachedMsg(); - - /** - * @brief Sends a target unreachable with given reason and stops the robot. - * @param reason reason for unreachable target (see homer_mapnav_msgs::TargetUnreachable for possible reasons) - */ - void sendTargetUnreachableMsg( int8_t reason ); - - /** @brief reloads all params from the parameterserver */ - void refreshParamsCallback(const std_msgs::Empty::ConstPtr& msg); - - /** @brief Navigate robot to next waypoint */ - void performNextMove(); - - /** @brief Finishes navigation or starts turning to target direction if the target position has been reached */ - void targetPositionReached(); - - /** @return Angle from robot_pose_ to point in degrees */ - int angleToPointDeg(geometry_msgs::Point point); - - /** @brief Calculates current maximal backwards distance on map Data */ - bool backwardObstacle(); - - /** @brief stops the Robot */ - void stopRobot(); - - /** - * @brief Sets each cell of the map to -1 outside the bounding box - * containing the robot pose and the current target - */ - void maskMap(); - - /** - * @brief Current path was finished (either successful or not), - * sets state machine to path planning to check if the robot is already at the goal - */ - void currentPathFinished(); - - //convenience math functions - /** - * Computes minimum turn angle from angle 1 to angle 2 - * @param angle1 from angle - * @param angle2 to angle - * @return minimal angle needed to turn from angle 1 to angle 2 [-Pi..Pi] - */ - static float minTurnAngle ( float angle1, float angle2 ); - - /** - * converts value from degree to radiant - * @param deg Value in degree - * @return value in radiants - */ - static float deg2Rad ( float deg ) { return deg / 180.0*M_PI; } - - /** - * converts value from radiants to degrees - * @param rad Value in radiants - * @return value in degrees - */ - static float rad2Deg ( float rad ) { return rad / M_PI*180.0; } - - bool drawPolygon ( std::vector< geometry_msgs::Point > vertices); - void drawLine ( std::vector<int> &data, int startX, int startY, int endX, int endY, int value ); - bool fillPolygon ( std::vector<int> &data, int x, int y, int value ); - - /** @brief calcs the maximal move distance from Laser and DepthData */ - void calcMaxMoveDist(); - - /// @brief Worker instances - Explorer* m_explorer; - - /// @brief State machine - StateMachine<ProcessState> m_MainMachine; - - /// @brief Navigation options & data - - /** list of waypoints subsampled from m_PixelPath */ - std::vector<geometry_msgs::PoseStamped> m_waypoints; - - /** Path planned by Explorer, pixel accuracy */ - std::vector<Eigen::Vector2i> m_pixel_path; - - /** target point */ - geometry_msgs::Point m_target_point; - - /** target name if called via Navigate_to_POI */ - std::string m_target_name; - - /** orientation the robot should have at the target point */ - double m_target_orientation; - - /** allowed distance to target */ - float m_desired_distance; - - /** check if the final turn should be skipped */ - bool m_skip_final_turn; - - /** - * check if navigation should perform fast planning. In this mode a path is only planned within - * a bounding box containing the robot pose and the target point - */ - bool m_fast_path_planning; - - /** current pose of the robot */ - geometry_msgs::Pose m_robot_pose; - - /** last pose of the robot */ - geometry_msgs::Pose m_robot_last_pose; - - /** time stamp of the last incoming laser scan */ - ros::Time m_last_laser_time; - /** time stamp of the last incoming pose */ - ros::Time m_last_pose_time; - - /** Distance factor of a frontier cell considered save for exploration */ - float m_FrontierSafenessFactor; - - double m_SafePathWeight; - - ///map parameters - double m_resolution; - double m_width; - double m_height; - geometry_msgs::Pose m_origin; - - /// @brief Configuration parameters - - /** Allowed distances of obstacles to robot. Robot must move within these bounds */ - std::pair<float,float> m_AllowedObstacleDistance; - - /** Safe distances of obstacles to robot. If possible, robot should move within these bounds */ - std::pair<float,float> m_SafeObstacleDistance; - - /** threshold to sample down waypoints */ - float m_waypoint_sampling_threshold; - - float m_max_move_distance; - float m_max_move_sick; - float m_max_move_down; - float m_max_move_depth; - - /** if distance to nearest obstacle is below collision distance trigger collision avoidance */ - float m_collision_distance; - - /** if distance to nearest obstacle is below collision distance don't drive backwards */ - float m_backward_collision_distance; - /** do not drive back in collision avoidance when this near target */ - float m_collision_distance_near_target; - - /** if true, obstacles in path will be detected and path will be replanned */ - bool m_check_path; - - /** waypoints will only be checked for obstacles if they are closer than check_path_max_distance to robot */ - float m_check_path_max_distance; - - bool m_avoided_collision; - - float m_min_turn_angle; - float m_max_turn_speed; - float m_min_turn_speed; - float m_max_move_speed; - float m_max_drive_angle; - float m_waypoint_radius_factor; - - float m_distance_to_target; - float m_act_speed; - float m_angular_avoidance; - - float m_map_speed_factor; - float m_waypoint_speed_factor; - float m_obstacle_speed_factor; - float m_target_distance_speed_factor; - - float m_min_y; - float m_min_x; - - float m_callback_error_duration; - - bool m_last_check_path_res; - bool m_use_ptu; - bool m_new_target; - - bool m_path_reaches_target; - int m_last_calculations_failed; - int m_unknown_threshold; - - /** last map data */ - std::vector<int8_t> * m_last_map_data; - - //ros specific members - tf::TransformListener m_transform_listener; - - //subscribers - ros::Subscriber m_map_sub; - ros::Subscriber m_pose_sub; - ros::Subscriber m_laser_data_sub; - ros::Subscriber m_down_laser_data_sub; - ros::Subscriber m_laser_back_data_sub; - ros::Subscriber m_start_navigation_sub; - ros::Subscriber m_stop_navigation_sub; - ros::Subscriber m_navigate_to_poi_sub; - ros::Subscriber m_unknown_threshold_sub; - ros::Subscriber m_refresh_param_sub; - ros::Subscriber m_max_move_depth_sub; - ros::Subscriber m_move_base_simple_goal_sub; - - //publishers - ros::Publisher m_cmd_vel_pub; - ros::Publisher m_target_reached_string_pub; - //ros::Publisher m_target_reached_empty_pub; - ros::Publisher m_target_unreachable_pub; - ros::Publisher m_path_pub; - ros::Publisher m_ptu_center_world_point_pub; - ros::Publisher m_set_pan_tilt_pub; - ros::Publisher m_debug_pub; - - //service clients - ros::ServiceClient m_get_POIs_client; -}; -#endif diff --git a/homer_navigation/launch/homer_navigation.launch b/homer_navigation/launch/homer_navigation.launch deleted file mode 100644 index db217818..00000000 --- a/homer_navigation/launch/homer_navigation.launch +++ /dev/null @@ -1,4 +0,0 @@ -<launch> - <rosparam command="load" file="$(find homer_navigation)/config/homer_navigation.yaml"/> - <node ns="/homer_navigation" name="homer_navigation" pkg="homer_navigation" type="homer_navigation" output="screen"/> -</launch> diff --git a/homer_navigation/launch/homer_navigation_pioneer.launch b/homer_navigation/launch/homer_navigation_pioneer.launch deleted file mode 100644 index df3c3ac5..00000000 --- a/homer_navigation/launch/homer_navigation_pioneer.launch +++ /dev/null @@ -1,4 +0,0 @@ -<launch> - <rosparam command="load" file="$(find homer_navigation)/config/homer_navigation_pioneer.yaml"/> - <node ns="/homer_navigation" name="homer_navigation" pkg="homer_navigation" type="homer_navigation" output="screen"/> -</launch> diff --git a/homer_navigation/package.xml b/homer_navigation/package.xml deleted file mode 100644 index 5752245c..00000000 --- a/homer_navigation/package.xml +++ /dev/null @@ -1,36 +0,0 @@ -<?xml version="1.0"?> -<package> - <name>homer_navigation</name> - <version>0.1.1</version> - <description>The homer_navigation package</description> - - <maintainer email="vseib@uni-koblenz.de">Viktor Seib</maintainer> - <author email="mknauf@uni-koblenz.de">Malte Knauf</author> - <author email="fpolster@uni-koblenz.de">Florian Polster</author> - <license>GPLv3</license> - - <buildtool_depend>catkin</buildtool_depend> - - <build_depend>roscpp</build_depend> - <build_depend>roslib</build_depend> - <build_depend>homer_robbie_architecture</build_depend> - <build_depend>homer_nav_libs</build_depend> - <build_depend>nav_msgs</build_depend> - <build_depend>sensor_msgs</build_depend> - <build_depend>homer_mapnav_msgs</build_depend> - <build_depend>std_msgs</build_depend> - <build_depend>tf</build_depend> - <build_depend>cmake_modules</build_depend> - <build_depend>eigen</build_depend> - - <run_depend>roscpp</run_depend> - <run_depend>roslib</run_depend> - <run_depend>homer_robbie_architecture</run_depend> - <run_depend>homer_nav_libs</run_depend> - <run_depend>nav_msgs</run_depend> - <run_depend>sensor_msgs</run_depend> - <run_depend>homer_mapnav_msgs</run_depend> - <run_depend>std_msgs</run_depend> - <run_depend>tf</run_depend> - -</package> diff --git a/homer_navigation/readme.pdf b/homer_navigation/readme.pdf deleted file mode 100644 index 133628daa3fde419c7bc018c0ea9183625cce4c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120202 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≠eM)OaU6*l;9J^MUz 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 S85&xe8=7#bs=E5SaRC6iOKKzl diff --git a/homer_navigation/src/homer_navigation_node.cpp b/homer_navigation/src/homer_navigation_node.cpp deleted file mode 100644 index 9bad6a76..00000000 --- a/homer_navigation/src/homer_navigation_node.cpp +++ /dev/null @@ -1,1084 +0,0 @@ -#include "homer_navigation/homer_navigation_node.h" - -HomerNavigationNode::HomerNavigationNode() -{ - ros::NodeHandle nh; - - //subscribers - m_map_sub = nh.subscribe<nav_msgs::OccupancyGrid>("/map", 1, &HomerNavigationNode::mapCallback, this); - m_pose_sub = nh.subscribe<geometry_msgs::PoseStamped>("/pose", 1, &HomerNavigationNode::poseCallback, this); - m_laser_data_sub = nh.subscribe<sensor_msgs::LaserScan>("/scan", 1, &HomerNavigationNode::laserDataCallback, this); - m_down_laser_data_sub = nh.subscribe<sensor_msgs::LaserScan>("/front_scan", 1, &HomerNavigationNode::downlaserDataCallback, this); - m_start_navigation_sub = nh.subscribe<homer_mapnav_msgs::StartNavigation>("/homer_navigation/start_navigation", 1, &HomerNavigationNode::startNavigationCallback, this); - m_move_base_simple_goal_sub = nh.subscribe<geometry_msgs::PoseStamped>("/move_base_simple/goal", 1, &HomerNavigationNode::moveBaseSimpleGoalCallback, this); // for RVIZ usage - m_stop_navigation_sub = nh.subscribe<std_msgs::Empty>("/homer_navigation/stop_navigation", 1, &HomerNavigationNode::stopNavigationCallback, this); - m_navigate_to_poi_sub = nh.subscribe<homer_mapnav_msgs::NavigateToPOI>("/homer_navigation/navigate_to_POI", 1, &HomerNavigationNode::navigateToPOICallback, this); - m_unknown_threshold_sub = nh.subscribe<std_msgs::Int8>("/homer_navigation/unknown_threshold", 1, &HomerNavigationNode::unknownThresholdCallback, this); - m_refresh_param_sub = nh.subscribe<std_msgs::Empty>("/homer_navigation/refresh_params", 1, &HomerNavigationNode::refreshParamsCallback, this); - m_max_move_depth_sub = nh.subscribe<std_msgs::Float32>("/homer_navigation/max_depth_move_distance", 1, &HomerNavigationNode::maxDepthMoveDistanceCallback, this); - - m_cmd_vel_pub = nh.advertise<geometry_msgs::Twist>("/robot_platform/cmd_vel", 1); - m_target_reached_string_pub = nh.advertise<std_msgs::String>("/homer_navigation/target_reached", 1); - //m_target_reached_empty_pub = nh.advertise<std_msgs::Empty>("/homer_navigation/target_reached", 1); - m_target_unreachable_pub = nh.advertise<homer_mapnav_msgs::TargetUnreachable>("/homer_navigation/target_unreachable", 1); - m_path_pub = nh.advertise<nav_msgs::Path>("/homer_navigation/path", 1); - m_ptu_center_world_point_pub= nh.advertise<homer_ptu_msgs::CenterWorldPoint>( "/ptu/center_world_point", 1); - m_set_pan_tilt_pub = nh.advertise<homer_ptu_msgs::SetPanTilt>("/ptu/set_pan_tilt", 1); - m_debug_pub = nh.advertise<std_msgs::String>("/homer_navigation/debug",1); - - m_get_POIs_client = nh.serviceClient<homer_mapnav_msgs::GetPointsOfInterest>("/map_manager/get_pois"); - - m_MainMachine.setName( "HomerNavigation Main" ); - ADD_MACHINE_STATE( m_MainMachine, IDLE ); - ADD_MACHINE_STATE( m_MainMachine, AWAITING_PATHPLANNING_MAP ); - ADD_MACHINE_STATE( m_MainMachine, FOLLOWING_PATH ); - ADD_MACHINE_STATE( m_MainMachine, AVOIDING_COLLISION ); - ADD_MACHINE_STATE( m_MainMachine, FINAL_TURN ); - - init(); -} - -void HomerNavigationNode::loadParameters() -{ - //Explorer constructor - ros::param::param("/homer_mapping/resolution", m_resolution, (double) 0.05); - ros::param::param("/homer_navigation/allowed_obstacle_distance/min", m_AllowedObstacleDistance.first, (float) 0.3); - ros::param::param("/homer_navigation/allowed_obstacle_distance/max", m_AllowedObstacleDistance.second, (float) 5.0); - ros::param::param("/homer_navigation/safe_obstacle_distance/min", m_SafeObstacleDistance.first, (float) 0.7); - ros::param::param("/homer_navigation/safe_obstacle_distance/max", m_SafeObstacleDistance.second, (float) 1.5); - ros::param::param("/homer_navigation/frontier_safeness_factor", m_FrontierSafenessFactor, (float) 1.4); - ros::param::param("/homer_navigation/safe_path_weight", m_SafePathWeight, (double) 1.2); - ros::param::param("/homer_navigation/waypoint_sampling_threshold", m_waypoint_sampling_threshold, (float) 1.5); - m_AllowedObstacleDistance.first /= m_resolution; - m_AllowedObstacleDistance.second /= m_resolution; - m_SafeObstacleDistance.first /= m_resolution; - m_SafeObstacleDistance.second /= m_resolution; - - //check path - ros::param::param("/homer_navigation/check_path", m_check_path, (bool) true); - ros::param::param("/homer_navigation/check_path_max_distance", m_check_path_max_distance, (float) 2.0); - - //collision - ros::param::param("/homer_navigation/collision_distance", m_collision_distance, (float) 0.3); - ros::param::param("/homer_navigation/collision_distance_near_target", m_collision_distance_near_target, (float) 0.2); - ros::param::param("/homer_navigation/backward_collision_distance", m_backward_collision_distance, (float) 0.5); - - //cmd_vel config values - ros::param::param("/homer_navigation/min_turn_angle", m_min_turn_angle, (float) 0.15); - ros::param::param("/homer_navigation/max_turn_speed", m_max_turn_speed, (float) 0.6); - ros::param::param("/homer_navigation/min_turn_speed", m_min_turn_speed, (float) 0.3); - ros::param::param("/homer_navigation/max_move_speed", m_max_move_speed, (float) 0.4); - ros::param::param("/homer_navigation/max_drive_angle", m_max_drive_angle, (float) 0.6); - - //caution factors - ros::param::param("/homer_navigation/map_speed_factor", m_map_speed_factor, (float) 1.0); - ros::param::param("/homer_navigation/waypoint_speed_factor", m_waypoint_speed_factor, (float) 1.0); - ros::param::param("/homer_navigation/obstacle_speed_factor", m_obstacle_speed_factor, (float) 1.0); - ros::param::param("/homer_navigation/target_distance_speed_factor", m_target_distance_speed_factor, (float) 0.4); - - //robot dimensions - ros::param::param("/homer_navigation/min_x", m_min_x, (float) 0.3); - ros::param::param("/homer_navigation/min_y", m_min_y, (float) 0.27); - - //error durations - ros::param::param("/homer_navigation/callback_error_duration", m_callback_error_duration, (float) 0.3); - - ros::param::param("/homer_navigation/use_ptu", m_use_ptu, (bool) false); - - ros::param::param("/homer_navigation/unknown_threshold", m_unknown_threshold, (int) 50); - ros::param::param("/homer_navigation/waypoint_radius_factor", m_waypoint_radius_factor, (float) 0.25); -} - -void HomerNavigationNode::init() -{ - m_max_move_sick = 40.0; - m_max_move_down = 40.0; - m_max_move_depth = 40.0; - m_robot_pose.position.x = 0.0; - m_robot_pose.position.y = 0.0; - m_robot_pose.position.z = 0.0; - m_robot_pose.orientation = tf::createQuaternionMsgFromYaw(0.0); - m_robot_last_pose = m_robot_pose; - m_avoided_collision = false; - m_act_speed = 0; - m_angular_avoidance = 0; - m_last_calculations_failed = 0; - m_last_check_path_res = false; - m_new_target = true; - - loadParameters(); - - m_explorer = new Explorer ( m_AllowedObstacleDistance.first, m_AllowedObstacleDistance.second, - m_SafeObstacleDistance.first, m_SafeObstacleDistance.second, - m_SafePathWeight, m_FrontierSafenessFactor, m_unknown_threshold ); - m_last_map_data = new std::vector<int8_t>(0); - - m_MainMachine.setState ( IDLE ); -} - -HomerNavigationNode::~HomerNavigationNode() -{ - if(m_explorer) - { - delete m_explorer; - } - if(m_last_map_data) - { - delete m_last_map_data; - } -} - -void HomerNavigationNode::stopRobot() -{ - m_act_speed = 0; - geometry_msgs::Twist cmd_vel_msg; - cmd_vel_msg.linear.x = 0; - cmd_vel_msg.linear.y = 0; - cmd_vel_msg.linear.z = 0; - cmd_vel_msg.angular.x = 0; - cmd_vel_msg.angular.y = 0; - cmd_vel_msg.angular.z = 0; - m_cmd_vel_pub.publish(cmd_vel_msg); - ros::Duration(0.1).sleep(); - m_cmd_vel_pub.publish(cmd_vel_msg); - ros::Duration(0.1).sleep(); - m_cmd_vel_pub.publish(cmd_vel_msg); -} - -void HomerNavigationNode::idleProcess() -{ - if ( m_MainMachine.state() == FOLLOWING_PATH ) - { - if ( (ros::Time::now() - m_last_laser_time) > ros::Duration( m_callback_error_duration ) ) - { - ROS_ERROR_STREAM("Laser data timeout!\n"); - stopRobot(); - } - if ( (ros::Time::now() - m_last_pose_time) > ros::Duration( m_callback_error_duration ) ) - { - ROS_ERROR_STREAM("Pose timeout!\n"); - stopRobot(); - } - } -} - -void HomerNavigationNode::calculatePath() -{ - if ( m_distance_to_target < m_desired_distance && !m_new_target) - { - m_path_reaches_target = true; - return; - } - m_explorer->setOccupancyMap(m_width, m_width, m_origin, &(*m_last_map_data)[0]); - m_explorer->setStart( map_tools::toMapCoords( m_robot_pose.position, m_origin, m_resolution) ); - - bool success; - m_pixel_path = m_explorer->getPath( success ); - if ( !success) - { - ROS_WARN_STREAM("No path found for navigation" ); - m_last_calculations_failed++; - ROS_INFO_STREAM("last_calculation_failed: "<<m_last_calculations_failed); - if(m_last_calculations_failed > 8) - { - sendTargetUnreachableMsg(homer_mapnav_msgs::TargetUnreachable::NO_PATH_FOUND); - } - } - else - { - m_last_calculations_failed = 0; - std::vector<Eigen::Vector2i> waypoint_pixels = m_explorer->sampleWaypointsFromPath ( m_pixel_path, m_waypoint_sampling_threshold ); - m_waypoints.clear(); - ROS_INFO_STREAM("homer_navigation::calculatePath - Path Size: " << waypoint_pixels.size()); - if(waypoint_pixels.size() > 0) - { - for(std::vector<Eigen::Vector2i>::iterator it = waypoint_pixels.begin(); it != waypoint_pixels.end(); ++it) - { - geometry_msgs::PoseStamped poseStamped; - poseStamped.header.frame_id = "/map"; - poseStamped.pose.position = map_tools::fromMapCoords(*it, m_origin, m_resolution); - poseStamped.pose.orientation.x = 0.0; - poseStamped.pose.orientation.y = 0.0; - poseStamped.pose.orientation.z = 0.0; - poseStamped.pose.orientation.w = 1.0; - m_waypoints.push_back(poseStamped); - } - sendPathData(); - } - else - { - sendTargetUnreachableMsg(homer_mapnav_msgs::TargetUnreachable::NO_PATH_FOUND); - } - - m_last_laser_time = ros::Time::now(); - m_last_pose_time = ros::Time::now(); - } -} - -void HomerNavigationNode::startNavigation() -{ - if ( m_distance_to_target < m_desired_distance && !m_new_target) - { - ROS_INFO_STREAM( "Will not (re-)plan path: Target position already reached." ); - m_path_reaches_target = true; - targetPositionReached(); - return; - } - ROS_INFO_STREAM( "Distance to target still too large (" << m_distance_to_target << "m; requested: " << m_desired_distance << "m)" ); - - if(m_fast_path_planning) - { - maskMap(); - } - - m_explorer->setOccupancyMap(m_width, m_width, m_origin, &(*m_last_map_data)[0]); - m_explorer->setStart(map_tools::toMapCoords(m_robot_pose.position, m_origin, m_resolution)); - Eigen::Vector2i new_target_approx = m_explorer->getNearestAccessibleTarget(map_tools::toMapCoords(m_target_point, m_origin, m_resolution)); - - geometry_msgs::Point new_target_approx_world = map_tools::fromMapCoords(new_target_approx, m_origin, m_resolution); - ROS_INFO_STREAM("start Navigation: Approx target: " << new_target_approx_world); - - m_path_reaches_target = ( map_tools::distance(new_target_approx_world, m_target_point ) < m_desired_distance ); - - bool new_approx_is_better = ( map_tools::distance( m_robot_pose.position, m_target_point ) - map_tools::distance( new_target_approx_world, m_target_point ) ) > 2 * m_desired_distance; - if ( !new_approx_is_better && !m_path_reaches_target ) - { - ROS_WARN_STREAM( "No better way to target found, turning and then reporting as unreachable." - << std::endl << "Distance to target: " << m_distance_to_target << "m; requested: " << m_desired_distance << "m" ); - m_MainMachine.setState( FINAL_TURN ); - } - else - { - m_explorer->setTarget ( new_target_approx); - m_MainMachine.setState ( FOLLOWING_PATH ); - calculatePath(); - } -} - -void HomerNavigationNode::sendPathData() -{ - nav_msgs::Path msg; - msg.header.frame_id = "/map"; - msg.header.stamp = ros::Time::now(); - if(m_waypoints.size() > 0) - { - msg.poses = m_waypoints; - geometry_msgs::PoseStamped pose_stamped; - pose_stamped.pose = m_robot_pose; - pose_stamped.header.frame_id = "/map"; - pose_stamped.header.stamp = ros::Time::now(); - msg.poses.insert(msg.poses.begin(), pose_stamped); - } - m_path_pub.publish(msg); -} - -void HomerNavigationNode::sendTargetReachedMsg() -{ - stopRobot(); - m_MainMachine.setState( IDLE ); - std_msgs::String reached_string_msg; - reached_string_msg.data = m_target_name; - m_target_reached_string_pub.publish(reached_string_msg); - m_waypoints.clear(); - nav_msgs::Path empty_path_msg; - empty_path_msg.poses = m_waypoints; - m_path_pub.publish(empty_path_msg); - ROS_INFO_STREAM("=== Reached Target " << m_target_name << " ==="); -} - -void HomerNavigationNode::sendTargetUnreachableMsg( int8_t reason ) -{ - stopRobot(); - m_MainMachine.setState( IDLE ); - homer_mapnav_msgs::TargetUnreachable unreachable_msg; - unreachable_msg.reason = reason; - m_target_unreachable_pub.publish(unreachable_msg); - m_waypoints.clear(); - nav_msgs::Path empty_path_msg; - empty_path_msg.poses = m_waypoints; - m_path_pub.publish(empty_path_msg); - ROS_INFO_STREAM("=== TargetUnreachableMsg ==="); -} - -void HomerNavigationNode::targetPositionReached() -{ - ROS_INFO_STREAM( "Target position reached. Distance to target: " << m_distance_to_target << "m. Desired distance:" << m_desired_distance << "m" ); - stopRobot(); - m_waypoints.clear(); - sendPathData(); - m_MainMachine.setState( FINAL_TURN ); - ROS_INFO_STREAM("Turning to look-at point"); -} - -bool HomerNavigationNode::checkPath() -{ - if(m_pixel_path.size() != 0) - { - for ( unsigned i = 0; i < m_pixel_path.size()-1; i++ ) - { - geometry_msgs::Point p = map_tools::fromMapCoords(m_pixel_path.at(i), m_origin, m_resolution); - if ( map_tools::distance( m_robot_pose.position, p) > m_check_path_max_distance ) - { - return true; - } - for(int a = 0; a < 5; a++) - { - if (map_tools::findValue( m_last_map_data, m_width, m_height, - m_pixel_path[i].x() + (m_pixel_path[i+1].x() - m_pixel_path[i].x()) * a/4, - m_pixel_path[i].y() + (m_pixel_path[i+1].y() - m_pixel_path[i].y()) * a/4, - 90, 2 )) - { - ROS_WARN_STREAM("Obstacle detected in current path recalculating" ); - return false; - } - } - } - } -} - -void HomerNavigationNode::handleCollision () -{ - if ( m_MainMachine.state() == FOLLOWING_PATH ) - { - stopRobot(); - m_MainMachine.setState( AVOIDING_COLLISION ); - ROS_WARN_STREAM( "Collision detected while following path!" ); - } -} - -void HomerNavigationNode::performNextMove() -{ - if(m_MainMachine.state() == FOLLOWING_PATH ) - { - if ( m_distance_to_target < m_desired_distance && !m_new_target) - { - ROS_INFO_STREAM( "Desired distance to target was reached." ); - targetPositionReached(); - return; - } - //if we have accidentaly skipped waypoints, recalculate path - float minDistance = FLT_MAX; - float distance; - unsigned nearestWaypoint=0; - for ( unsigned i=0; i<m_waypoints.size(); i++ ) - { - distance = map_tools::distance( m_robot_pose.position, m_waypoints[i].pose.position ); - if ( distance < minDistance ) { - nearestWaypoint = i; - minDistance = distance; - } - } - if ( nearestWaypoint != 0 ) - { - //if the target is nearer than the waypoint don't recalculate - if(m_waypoints.size() != 2) - { - ROS_WARN_STREAM("Waypoints skipped. Recalculating path!"); - calculatePath(); - if ( m_MainMachine.state() != FOLLOWING_PATH ) - { - return; - } - } - else - { - m_waypoints.erase(m_waypoints.begin()); - } - } - - Eigen::Vector2i waypointPixel = map_tools::toMapCoords(m_waypoints[0].pose.position, m_origin, m_resolution); - float obstacleDistanceMap = m_explorer->getObstacleTransform()->getValue( waypointPixel.x(), waypointPixel.y() ) * m_resolution; - float waypointRadius = m_waypoint_radius_factor * obstacleDistanceMap; - - if ( ( waypointRadius < m_resolution ) || ( m_waypoints.size() == 1 ) ) - { - waypointRadius = m_resolution; - } - - if(m_waypoints.size() != 0) - { - //calculate distance between last_pose->current_pose and waypoint - Eigen::Vector2f line; //direction of the line - line[0] = m_robot_pose.position.x - m_robot_last_pose.position.x; - line[1] = m_robot_pose.position.y - m_robot_last_pose.position.y; - Eigen::Vector2f point_to_start; //vector from the point to the start of the line - point_to_start[0] = m_robot_last_pose.position.x - m_waypoints[0].pose.position.x; - point_to_start[1] = m_robot_last_pose.position.y - m_waypoints[0].pose.position.y; - float dot = point_to_start[0] * line[0] + point_to_start[1] * line[1]; //dot product of point_to_start * line - Eigen::Vector2f distance; //shortest distance vector from point to line - distance[0] = point_to_start[0] - dot * line[0]; - distance[1] = point_to_start[1] - dot * line[1]; - float distance_to_waypoint = sqrt((double)(distance[0] * distance[0] + distance[1] * distance[1])); - - //check if current waypoint has been reached - if((distance_to_waypoint < waypointRadius && m_waypoints.size() > 1) || (m_distance_to_target < waypointRadius)) - { - m_waypoints.erase ( m_waypoints.begin() ); - } - - } - - sendPathData(); - //last wayoint reached - if ( m_waypoints.size() == 0 ) - { - ROS_INFO_STREAM("Last waypoint reached"); - currentPathFinished(); - return; - } - - if(m_use_ptu) - { - ROS_INFO_STREAM("Moving PTU to center next Waypoint"); - homer_ptu_msgs::CenterWorldPoint ptu_msg; - ptu_msg.point.x = m_waypoints[0].pose.position.x; - ptu_msg.point.y = m_waypoints[0].pose.position.y; - ptu_msg.point.z = 0; - ptu_msg.permanent = true; - m_ptu_center_world_point_pub.publish(ptu_msg); - } - - float distanceToWaypoint = map_tools::distance( m_robot_pose.position, m_waypoints[0].pose.position ); - float angleToWaypoint = angleToPointDeg ( m_waypoints[0].pose.position ); - if (angleToWaypoint < -180) - { - angleToWaypoint += 360; - } - float angle = deg2Rad( angleToWaypoint ); - - //linear speed calculation - if(m_avoided_collision) - { - if( std::abs(angleToWaypoint) < 10) - { - m_avoided_collision = false; - } - } - else if (abs(angle) > m_max_drive_angle) - { - m_act_speed = 0.0; - } - else - { - float obstacleMapDistance = 1; - for(int wpi = -1; wpi < std::min((int)m_waypoints.size(),(int) 2); wpi++) - { - Eigen::Vector2i robotPixel; - if(wpi == -1) - { - robotPixel = map_tools::toMapCoords(m_robot_pose.position, m_origin, m_resolution); - } - else - { - robotPixel = map_tools::toMapCoords(m_waypoints[wpi].pose.position, m_origin, m_resolution); - } - obstacleMapDistance = std::min((float)obstacleMapDistance,(float)( m_explorer->getObstacleTransform()->getValue( robotPixel.x(), robotPixel.y() ) * m_resolution)); - } - - float max_move_distance_speed = m_max_move_speed * m_max_move_distance * m_obstacle_speed_factor; - float max_map_distance_speed = m_max_move_speed * obstacleMapDistance * m_map_speed_factor; - m_act_speed = std::min(std::max((float)0.1,m_distance_to_target * m_target_distance_speed_factor) ,std::min(std::min(m_max_move_speed, max_move_distance_speed), std::min(max_map_distance_speed, distanceToWaypoint * m_waypoint_speed_factor))); - std_msgs::String tmp; - std::stringstream str; - str << "m_obstacle_speed " << max_move_distance_speed <<" max_map_distance_speed "<<max_map_distance_speed; - tmp.data = str.str(); - m_debug_pub.publish(tmp); - } - - //angular speed calculation - if (angle < 0 ) - { - angle = std::max(angle * (float) 0.8, -m_max_turn_speed); - m_act_speed = m_act_speed + angle / 2.0; - if(m_act_speed < 0 ) - { - m_act_speed = 0; - } - } - else - { - angle = std::min(angle * (float) 0.8, m_max_turn_speed); - m_act_speed = m_act_speed - angle / 2.0; - if(m_act_speed < 0 ) - { - m_act_speed = 0; - } - } - geometry_msgs::Twist cmd_vel_msg; - cmd_vel_msg.linear.x = m_act_speed; - cmd_vel_msg.angular.z = angle; - m_cmd_vel_pub.publish(cmd_vel_msg); - - ROS_DEBUG_STREAM("Driving & turning" << std::endl << "linear: " << m_act_speed << " angular: " << angle << std::endl - << "distanceToWaypoint:" << distanceToWaypoint << "angleToWaypoint: " << angleToWaypoint << std::endl ); - } - else if(m_MainMachine.state()== AVOIDING_COLLISION) - { - if( m_distance_to_target < m_desired_distance && !m_new_target) - { - ROS_INFO_STREAM("Collision detected near target. Switch to final turn."); - targetPositionReached(); - } - else if ( m_max_move_distance <= m_collision_distance && m_waypoints.size() > 1 || m_max_move_distance <= m_collision_distance_near_target ) - { - ROS_WARN_STREAM( "Maximum driving distance too short (" << m_max_move_distance << "m)! Moving back." ); - geometry_msgs::Twist cmd_vel_msg; - if(!HomerNavigationNode::backwardObstacle()) - { - cmd_vel_msg.linear.x = -0.2; - } - else - { - if(m_angular_avoidance == 0) - { - float angleToWaypoint = angleToPointDeg ( m_waypoints[0].pose.position ); - if(angleToWaypoint < -180) - { - angleToWaypoint += 360; - } - if (angleToWaypoint < 0 ) - { - m_angular_avoidance = -0.4; - } - else - { - m_angular_avoidance = 0.4; - } - } - cmd_vel_msg.angular.z = m_angular_avoidance; - } - m_cmd_vel_pub.publish(cmd_vel_msg); - } - else - { - m_angular_avoidance = 0; - m_avoided_collision = true; - ROS_WARN_STREAM( "Collision avoided. Updating path." ); - currentPathFinished(); - } - } - else if(m_MainMachine.state()== FINAL_TURN) - { - if(m_use_ptu) - { - //reset PTU - homer_ptu_msgs::SetPanTilt msg; - msg.absolute = true; - msg.panAngle = 0; - msg.tiltAngle = 0; - m_set_pan_tilt_pub.publish(msg); - } - - if ( m_skip_final_turn ) - { - ROS_INFO_STREAM("Final turn skipped. Target reached."); - if(m_path_reaches_target) - { - sendTargetReachedMsg(); - } - else - { - sendTargetUnreachableMsg(homer_mapnav_msgs::TargetUnreachable::NO_PATH_FOUND); - } - return; - } - - float turnAngle = minTurnAngle( tf::getYaw(m_robot_pose.orientation), m_target_orientation ); - ROS_DEBUG_STREAM("homer_navigation::PerformNextMove:: Final Turn. Robot orientation: " << rad2Deg(tf::getYaw(m_robot_pose.orientation)) << ". Target orientation: " << rad2Deg(m_target_orientation) << "homer_navigation::PerformNextMove:: turnAngle: " << rad2Deg(turnAngle)); - - if (std::fabs(turnAngle) < m_min_turn_angle) - { - ROS_INFO_STREAM(":::::::NEAREST WALKABLE TARGET REACHED BECAUSE lower " << m_min_turn_angle); - ROS_INFO_STREAM("target angle = "<< m_target_orientation ); - ROS_INFO_STREAM("is angle = "<< tf::getYaw(m_robot_pose.orientation)); - ROS_INFO_STREAM("m_distance_to_target = " << m_distance_to_target); - ROS_INFO_STREAM("m_desired_distance = " << m_desired_distance); - if(m_path_reaches_target) - { - sendTargetReachedMsg(); - } - else - { - sendTargetUnreachableMsg(homer_mapnav_msgs::TargetUnreachable::NO_PATH_FOUND); - } - return; - } - else - { - if (turnAngle< 0 ) - { - turnAngle= std::max(std::min(turnAngle, -m_min_turn_speed ),-m_max_turn_speed); - } - else - { - turnAngle = std::min(std::max(turnAngle, m_min_turn_speed ),m_max_turn_speed); - } - geometry_msgs::Twist cmd_vel_msg; - cmd_vel_msg.angular.z = turnAngle; - m_cmd_vel_pub.publish(cmd_vel_msg); - } - } -} - -void HomerNavigationNode::currentPathFinished() -{ - ROS_INFO_STREAM( "Current path was finished, initiating recalculation."); - m_waypoints.clear(); - stopRobot(); - m_MainMachine.setState( AWAITING_PATHPLANNING_MAP ); -} - -int HomerNavigationNode::angleToPointDeg ( geometry_msgs::Point target ) -{ - double cx = m_robot_pose.position.x; - double cy = m_robot_pose.position.y; - int targetAngle = rad2Deg( atan2 ( target.y - cy, target.x - cx ) ); - int currentAngle = rad2Deg( tf::getYaw(m_robot_pose.orientation) ); - - int angleDiff = targetAngle - currentAngle; - angleDiff = (angleDiff + 180) % 360 - 180; - return angleDiff; -} - -bool HomerNavigationNode::drawPolygon ( std::vector< geometry_msgs::Point > vertices) -{ - if ( vertices.size() == 0 ) - { - ROS_INFO_STREAM( "No vertices given!" ); - return false; - } - //make temp. map - std::vector<int> data(m_width * m_height); - for ( int i = 0; i < data.size(); i++ ) - { - data[i] = 0; - } - - //draw the lines surrounding the polygon - for ( unsigned int i = 0; i < vertices.size(); i++ ) - { - int i2 = ( i+1 ) % vertices.size(); - drawLine ( data, vertices[i].x, vertices[i].y, vertices[i2].x, vertices[i2].y, 30); - } - //calculate a point in the middle of the polygon - float midX = 0; - float midY = 0; - for ( unsigned int i = 0; i < vertices.size(); i++ ) - { - midX += vertices[i].x; - midY += vertices[i].y; - } - midX /= vertices.size(); - midY /= vertices.size(); - //fill polygon - return fillPolygon ( data, (int)midX, (int)midY, 30 ); -} - -void HomerNavigationNode::drawLine ( std::vector<int> &data, int startX, int startY, int endX, int endY, int value ) -{ - //bresenham algorithm - int x, y, t, dist, xerr, yerr, dx, dy, incx, incy; - // compute distances - dx = endX - startX; - dy = endY - startY; - - // compute increment - if ( dx < 0 ) - { - incx = -1; - dx = -dx; - } - else - { - incx = dx ? 1 : 0; - } - - if ( dy < 0 ) - { - incy = -1; - dy = -dy; - } - else - { - incy = dy ? 1 : 0; - } - - // which distance is greater? - dist = ( dx > dy ) ? dx : dy; - // initializing - x = startX; - y = startY; - xerr = dx; - yerr = dy; - - // compute cells - for ( t = 0; t < dist; t++ ) - { - int index = x + m_width* y; - if(index < 0 || index > data.size()) - { - continue; - } - data[index] = value; - - xerr += dx; - yerr += dy; - if ( xerr > dist ) - { - xerr -= dist; - x += incx; - } - if ( yerr > dist ) - { - yerr -= dist; - y += incy; - } - } -} - -bool HomerNavigationNode::fillPolygon ( std::vector<int> &data, int x, int y, int value ) -{ - int index = x + m_width * y; - bool tmp = false; - - if ((int)m_last_map_data->at(index)> 90) - { - tmp = true; - } - if ( data[index] != value ) - { - data[index] = value; - if (fillPolygon ( data, x + 1, y, value )) - { - tmp = true; - } - if(fillPolygon ( data, x - 1, y, value )) - { - tmp = true; - } - if(fillPolygon ( data, x, y + 1, value )) - { - tmp = true; - } - if(fillPolygon ( data, x, y - 1, value )) - { - tmp = true; - } - } - return tmp; -} - -bool HomerNavigationNode::backwardObstacle() -{ - std::vector<geometry_msgs::Point> vertices; - geometry_msgs::Point base_link_point; - geometry_msgs::Point map_point; - Eigen::Vector2i map_coord; - - std::vector<float> x; - std::vector<float> y; - - x.push_back(- m_min_x - m_backward_collision_distance); - y.push_back(m_min_y); - - x.push_back(- m_min_x - m_backward_collision_distance); - y.push_back(-m_min_y); - - x.push_back(-0.1); - y.push_back(-m_min_y); - - x.push_back(-0.1); - y.push_back(m_min_y); - - for(int i = 0; i<x.size(); i++) - { - base_link_point.x = x[i]; - base_link_point.y = y[i]; - map_coord = map_tools::toMapCoords(map_tools::transformPoint(base_link_point, m_transform_listener ,"/base_link", "/map"), m_origin, m_resolution); - map_point.x = map_coord.x(); - map_point.y = map_coord.y(); - vertices.push_back(map_point); - } - - return drawPolygon(vertices); -} - -void HomerNavigationNode::maskMap() -{ - //generate bounding box - ROS_INFO_STREAM("Calculating Bounding box for fast planning"); - Eigen::Vector2i pose_pixel = map_tools::toMapCoords( m_robot_pose.position, m_origin, m_resolution); - Eigen::Vector2i target_pixel = map_tools::toMapCoords( m_target_point, m_origin, m_resolution); - Eigen::Vector2i safe_pixel_distance(m_AllowedObstacleDistance.first * 4, - m_AllowedObstacleDistance.first * 4); - Eigen::AlignedBox2i planning_box; - planning_box.extend(pose_pixel); - planning_box.extend(target_pixel); - ROS_INFO_STREAM("Bounding Box: (" << planning_box.min() << " " << planning_box.max()); - Eigen::AlignedBox2i safe_planning_box(planning_box.min() - safe_pixel_distance, planning_box.max() + safe_pixel_distance); - ROS_INFO_STREAM("safe Bounding Box: (" << safe_planning_box.min() << " " << safe_planning_box.max()); - ROS_INFO_STREAM("min in m: " <<map_tools::fromMapCoords(safe_planning_box.min(), m_origin, m_resolution)); - ROS_INFO_STREAM("max in m: "<<map_tools::fromMapCoords(safe_planning_box.max(), m_origin, m_resolution)); - for(size_t x = 0; x < m_width; x++) - { - for(size_t y = 0; y < m_width; y++) - { - if(!safe_planning_box.contains(Eigen::Vector2i(x, y))) - { - m_last_map_data->at(y * m_width + x) = -1; - } - } - } -} - -//convenience math functions -float HomerNavigationNode::minTurnAngle( float angle1, float angle2 ) -{ - angle1 *= 180.0/M_PI; - angle2 *= 180.0/M_PI; - - int diff= angle2 - angle1; - diff = (diff + 180) % 360 - 180; - if (diff < -180) - { - diff += 360; - } - - float ret = static_cast<double>(diff) * M_PI/180.0; - return ret; -} - -void HomerNavigationNode::refreshParamsCallback(const std_msgs::Empty::ConstPtr& msg) -{ - ROS_INFO_STREAM("Refreshing Parameters"); - loadParameters(); -} - -void HomerNavigationNode::mapCallback(const nav_msgs::OccupancyGrid::ConstPtr& msg) -{ - if(msg->info.height != msg->info.width) - { - ROS_ERROR_STREAM("Incoming Map not quadratic. No map update!"); - return; - } - if(m_last_map_data) - { - delete m_last_map_data; - } - - m_last_map_data = new std::vector<int8_t>(msg->data); - m_origin = msg->info.origin; - m_width = msg->info.width; - m_height = msg->info.height; - m_resolution = msg->info.resolution; - - switch ( m_MainMachine.state() ) - { - case AWAITING_PATHPLANNING_MAP: - startNavigation(); - break; - case FOLLOWING_PATH: - { - if ( m_check_path) - { - if( !checkPath()) - { - if(!m_last_check_path_res) - { - calculatePath(); - } - m_last_check_path_res = false; - } - else - { - m_last_check_path_res = true; - } - } - break; - } - } -} - -void HomerNavigationNode::poseCallback(const geometry_msgs::PoseStamped::ConstPtr& msg) -{ - m_robot_last_pose = m_robot_pose; - m_robot_pose = msg->pose; - m_last_pose_time = ros::Time::now(); - m_distance_to_target = map_tools::distance( m_robot_pose.position, m_target_point ); - m_new_target = false; - performNextMove(); -} - -void HomerNavigationNode::calcMaxMoveDist() -{ - m_max_move_distance = std::min (m_max_move_sick, std::min(m_max_move_down, m_max_move_depth)); - if(m_max_move_distance <= m_collision_distance && std::fabs(m_act_speed) > 0.1 && m_waypoints.size() > 1 || - m_max_move_distance <= m_collision_distance_near_target && std::fabs(m_act_speed) > 0.1 && m_waypoints.size() == 1 || - m_max_move_distance <= 0.1 ) - { - handleCollision(); - } -} -void HomerNavigationNode::maxDepthMoveDistanceCallback(const std_msgs::Float32::ConstPtr& msg) -{ - m_max_move_depth = msg->data; - calcMaxMoveDist(); -} - -void HomerNavigationNode::laserDataCallback(const sensor_msgs::LaserScan::ConstPtr& msg) -{ - m_last_laser_time = ros::Time::now(); - m_max_move_sick = map_tools::get_max_move_distance ( map_tools::laser_ranges_to_points(msg->ranges, msg->angle_min, msg->angle_increment, msg->range_min, msg->range_max, m_transform_listener, msg->header.frame_id, "/base_link"), m_min_x, m_min_y); - calcMaxMoveDist(); -} - - -void HomerNavigationNode::downlaserDataCallback(const sensor_msgs::LaserScan::ConstPtr& msg) -{ - m_max_move_down = map_tools::get_max_move_distance ( map_tools::laser_ranges_to_points(msg->ranges, msg->angle_min, msg->angle_increment, msg->range_min, msg->range_max, m_transform_listener, msg->header.frame_id, "/base_link"), m_min_x, m_min_y); - calcMaxMoveDist(); -} - -void HomerNavigationNode::startNavigationCallback(const homer_mapnav_msgs::StartNavigation::ConstPtr& msg) -{ - m_avoided_collision = false; - m_target_point = msg->goal.position; - m_target_orientation = tf::getYaw(msg->goal.orientation); - m_desired_distance = msg->distance_to_target < 0.1 ? 0.1 : msg->distance_to_target; - m_skip_final_turn = msg->skip_final_turn; - m_fast_path_planning = msg->fast_planning; - m_new_target = true; - m_target_name = ""; - - ROS_INFO_STREAM("Navigating to target " << m_target_point.x << ", " << m_target_point.y - << "\nTarget orientation: " << m_target_orientation - << "Desired distance to target: " << m_desired_distance); - - m_MainMachine.setState( AWAITING_PATHPLANNING_MAP ); -} - -void HomerNavigationNode::moveBaseSimpleGoalCallback(const geometry_msgs::PoseStamped::ConstPtr& msg) -{ - if(msg->header.frame_id != "map") - { - tf::StampedTransform transform; - if(m_transform_listener.waitForTransform("map", msg->header.frame_id, msg->header.stamp, ros::Duration(1.0))) - { - try - { - m_transform_listener.lookupTransform("map", msg->header.frame_id, msg->header.stamp, transform); - tf::Vector3 targetPos(msg->pose.position.x, msg->pose.position.y, msg->pose.position.z); - targetPos = transform * targetPos; - m_target_point.x = targetPos.getX(); - m_target_point.y = targetPos.getY(); - m_target_orientation = tf::getYaw(transform*tf::Quaternion(msg->pose.orientation.x, msg->pose.orientation.y, msg->pose.orientation.z, msg->pose.orientation.w)); - } - catch(tf::TransformException ex) - { - ROS_ERROR_STREAM(ex.what()); - return; - } - } - else - { - try - { - m_transform_listener.lookupTransform("map", msg->header.frame_id, ros::Time(0), transform); - tf::Vector3 targetPos(msg->pose.position.x, msg->pose.position.y, msg->pose.position.z); - targetPos = transform * targetPos; - m_target_point.x = targetPos.getX(); - m_target_point.y = targetPos.getY(); - m_target_orientation = tf::getYaw(transform*tf::Quaternion(msg->pose.orientation.x, msg->pose.orientation.y, msg->pose.orientation.z, msg->pose.orientation.w)); - } - catch(tf::TransformException ex) - { - ROS_ERROR_STREAM(ex.what()); - return; - } - } - } - else - { - m_target_point = msg->pose.position; - m_target_orientation = tf::getYaw(msg->pose.orientation); - } - m_avoided_collision = false; - m_desired_distance = 0.1; - m_skip_final_turn = false; - m_fast_path_planning = false; - m_new_target = true; - - ROS_INFO_STREAM("Navigating to target via Move Base Simple x: " << m_target_point.x << ", y: " << m_target_point.y - << "\nTarget orientation: " << m_target_orientation - << " Desired distance to target: " << m_desired_distance - << "\nframe_id: " << msg->header.frame_id); - - m_MainMachine.setState( AWAITING_PATHPLANNING_MAP ); -} - -void HomerNavigationNode::navigateToPOICallback(const homer_mapnav_msgs::NavigateToPOI::ConstPtr &msg) -{ - homer_mapnav_msgs::GetPointsOfInterest srv; - m_get_POIs_client.call(srv); - std::vector<homer_mapnav_msgs::PointOfInterest>::iterator it; - for(it = srv.response.poi_list.pois.begin(); it != srv.response.poi_list.pois.end(); ++it) - { - if(it->name == msg->poi_name) - { - m_avoided_collision = false; - m_target_point = it->pose.position; - m_target_orientation = tf::getYaw(it->pose.orientation); - m_desired_distance = msg->distance_to_target < 0.1 ? 0.1 : msg->distance_to_target; - m_skip_final_turn = msg->skip_final_turn; - m_fast_path_planning = false; - m_new_target = true; - m_target_name = msg->poi_name; - - ROS_INFO_STREAM("Navigating to target " << m_target_point.x << ", " << m_target_point.y - << "\nTarget orientation: " << m_target_orientation - << "Desired distance to target: " << m_desired_distance); - - m_MainMachine.setState( AWAITING_PATHPLANNING_MAP ); - return; - } - } - - ROS_ERROR_STREAM("No point of interest with name '" << msg->poi_name << "' found in current poi list"); - sendTargetUnreachableMsg(homer_mapnav_msgs::TargetUnreachable::UNKNOWN); -} - -void HomerNavigationNode::stopNavigationCallback(const std_msgs::Empty::ConstPtr& msg) -{ - ROS_INFO_STREAM("Stopping navigation." ); - m_MainMachine.setState( IDLE ); - m_avoided_collision = false; - stopRobot(); - - m_waypoints.clear(); - nav_msgs::Path empty_path_msg; - empty_path_msg.poses = m_waypoints; - m_path_pub.publish(empty_path_msg); -} - -void HomerNavigationNode::unknownThresholdCallback(const std_msgs::Int8::ConstPtr &msg) -{ - m_explorer->setUnknownThreshold(static_cast<int>(msg->data)); -} - -int main(int argc, char **argv) -{ - ros::init(argc, argv, "homer_navigation"); - - HomerNavigationNode node; - - ros::Rate rate(50); - - while(ros::ok()) - { - ros::spinOnce(); - node.idleProcess(); - rate.sleep(); - } - - return 0; -} diff --git a/homer_map_manager/images/rosgraph.png b/images/rosgraph.png similarity index 100% rename from homer_map_manager/images/rosgraph.png rename to images/rosgraph.png diff --git a/homer_map_manager/images/rosgraph.svg b/images/rosgraph.svg similarity index 100% rename from homer_map_manager/images/rosgraph.svg rename to images/rosgraph.svg diff --git a/homer_map_manager/include/homer_map_manager/Managers/MapManager.h b/include/homer_map_manager/Managers/MapManager.h similarity index 100% rename from homer_map_manager/include/homer_map_manager/Managers/MapManager.h rename to include/homer_map_manager/Managers/MapManager.h diff --git a/homer_map_manager/include/homer_map_manager/Managers/MaskingManager.h b/include/homer_map_manager/Managers/MaskingManager.h similarity index 100% rename from homer_map_manager/include/homer_map_manager/Managers/MaskingManager.h rename to include/homer_map_manager/Managers/MaskingManager.h diff --git a/homer_map_manager/include/homer_map_manager/Managers/PoiManager.h b/include/homer_map_manager/Managers/PoiManager.h similarity index 100% rename from homer_map_manager/include/homer_map_manager/Managers/PoiManager.h rename to include/homer_map_manager/Managers/PoiManager.h diff --git a/homer_map_manager/include/homer_map_manager/Managers/RoiManager.h b/include/homer_map_manager/Managers/RoiManager.h similarity index 100% rename from homer_map_manager/include/homer_map_manager/Managers/RoiManager.h rename to include/homer_map_manager/Managers/RoiManager.h diff --git a/homer_map_manager/include/homer_map_manager/MapIO/image_loader.h b/include/homer_map_manager/MapIO/image_loader.h similarity index 100% rename from homer_map_manager/include/homer_map_manager/MapIO/image_loader.h rename to include/homer_map_manager/MapIO/image_loader.h diff --git a/homer_map_manager/include/homer_map_manager/MapIO/map_loader.h b/include/homer_map_manager/MapIO/map_loader.h similarity index 100% rename from homer_map_manager/include/homer_map_manager/MapIO/map_loader.h rename to include/homer_map_manager/MapIO/map_loader.h diff --git a/homer_map_manager/include/homer_map_manager/MapIO/map_saver.h b/include/homer_map_manager/MapIO/map_saver.h similarity index 100% rename from homer_map_manager/include/homer_map_manager/MapIO/map_saver.h rename to include/homer_map_manager/MapIO/map_saver.h diff --git a/homer_map_manager/include/homer_map_manager/Workers/PointOfInterest/PointOfInterest.h b/include/homer_map_manager/Workers/PointOfInterest/PointOfInterest.h similarity index 100% rename from homer_map_manager/include/homer_map_manager/Workers/PointOfInterest/PointOfInterest.h rename to include/homer_map_manager/Workers/PointOfInterest/PointOfInterest.h diff --git a/homer_map_manager/include/homer_map_manager/map_manager_node.h b/include/homer_map_manager/map_manager_node.h similarity index 100% rename from homer_map_manager/include/homer_map_manager/map_manager_node.h rename to include/homer_map_manager/map_manager_node.h diff --git a/homer_map_manager/mainpage.dox b/mainpage.dox similarity index 100% rename from homer_map_manager/mainpage.dox rename to mainpage.dox diff --git a/homer_map_manager/manifest.xml b/manifest.xml similarity index 100% rename from homer_map_manager/manifest.xml rename to manifest.xml diff --git a/homer_map_manager/package.xml b/package.xml similarity index 100% rename from homer_map_manager/package.xml rename to package.xml diff --git a/homer_map_manager/readme.pdf b/readme.pdf similarity index 100% rename from homer_map_manager/readme.pdf rename to readme.pdf diff --git a/homer_map_manager/src/Managers/MapManager.cpp b/src/Managers/MapManager.cpp similarity index 100% rename from homer_map_manager/src/Managers/MapManager.cpp rename to src/Managers/MapManager.cpp diff --git a/homer_map_manager/src/Managers/MaskingManager.cpp b/src/Managers/MaskingManager.cpp similarity index 100% rename from homer_map_manager/src/Managers/MaskingManager.cpp rename to src/Managers/MaskingManager.cpp diff --git a/homer_map_manager/src/Managers/PoiManager.cpp b/src/Managers/PoiManager.cpp similarity index 100% rename from homer_map_manager/src/Managers/PoiManager.cpp rename to src/Managers/PoiManager.cpp diff --git a/homer_map_manager/src/Managers/RoiManager.cpp b/src/Managers/RoiManager.cpp similarity index 100% rename from homer_map_manager/src/Managers/RoiManager.cpp rename to src/Managers/RoiManager.cpp diff --git a/homer_map_manager/src/MapIO/image_loader.cpp b/src/MapIO/image_loader.cpp similarity index 100% rename from homer_map_manager/src/MapIO/image_loader.cpp rename to src/MapIO/image_loader.cpp diff --git a/homer_map_manager/src/MapIO/map_loader.cpp b/src/MapIO/map_loader.cpp similarity index 100% rename from homer_map_manager/src/MapIO/map_loader.cpp rename to src/MapIO/map_loader.cpp diff --git a/homer_map_manager/src/MapIO/map_saver.cpp b/src/MapIO/map_saver.cpp similarity index 100% rename from homer_map_manager/src/MapIO/map_saver.cpp rename to src/MapIO/map_saver.cpp diff --git a/homer_map_manager/src/Workers/PointOfInterest/CMakeLists.txt b/src/Workers/PointOfInterest/CMakeLists.txt similarity index 100% rename from homer_map_manager/src/Workers/PointOfInterest/CMakeLists.txt rename to src/Workers/PointOfInterest/CMakeLists.txt diff --git a/homer_map_manager/src/map_manager_node.cpp b/src/map_manager_node.cpp similarity index 100% rename from homer_map_manager/src/map_manager_node.cpp rename to src/map_manager_node.cpp -- GitLab