diff --git a/README.md b/README.md index 5af7ecb..95623ce 100644 --- a/README.md +++ b/README.md @@ -5,3 +5,7 @@ Higher-level navigation capabilities Here is a diagram of the interactions between the components ([source](http://interactive.blockdiag.com/?compression=deflate&src=eJx9kt1KxDAQhe_3KUKvs09Q1osVwQuVRcQbkTJNxzaYZEJ-qovsu5s0dbvqshBIhvnOnHCSVpF47yT07GvFWLDsRUGLalM9kSVFvRSg2A6CI6XQVa91psxZ6gFG2UOQZAqG9oe6-UQRA7IdKSn2pauXIfdkZCCH3b8RThyhR9CWXSup21nfnuhH3ILH0hjgpHUbNZg1fIBD9hsbF_9n6eOZ-yv5Fo7MXS62OCSGoqu4D3uFbMM68AN2E59W7yjaKcmc5bTNeoiBDGmKvrElTWn6KhGHP7KZ98GB6XxjlkuVqYan6HgKt74gFilP34C1vqic4KO5JJjdBieLIIdY-PIr1lfJubx99s61NvMz5nPLk0UWJR-eg6tXh2-Var3n)): ![components](http://interactive.blockdiag.com/image?compression=deflate&encoding=base64&src=eJx9kt1KxDAQhe_3KUKvs09Q1osVwQuVRcQbkTJNxzaYZEJ-qovsu5s0dbvqshBIhvnOnHCSVpF47yT07GvFWLDsRUGLalM9kSVFvRSg2A6CI6XQVa91psxZ6gFG2UOQZAqG9oe6-UQRA7IdKSn2pauXIfdkZCCH3b8RThyhR9CWXSup21nfnuhH3ILH0hjgpHUbNZg1fIBD9hsbF_9n6eOZ-yv5Fo7MXS62OCSGoqu4D3uFbMM68AN2E59W7yjaKcmc5bTNeoiBDGmKvrElTWn6KhGHP7KZ98GB6XxjlkuVqYan6HgKt74gFilP34C1vqic4KO5JJjdBieLIIdY-PIr1lfJubx99s61NvMz5nPLk0UWJR-eg6tXh2-Var3n) + +## Using the navigation stack + +See the strands_navigation_example readme for a simple example of how to use the navigation stack on your robot. \ No newline at end of file diff --git a/strands_navigation_example/CMakeLists.txt b/strands_navigation_example/CMakeLists.txt new file mode 100644 index 0000000..192a176 --- /dev/null +++ b/strands_navigation_example/CMakeLists.txt @@ -0,0 +1,208 @@ +cmake_minimum_required(VERSION 3.0.2) +project(strands_navigation_example) + +## Compile as C++11, supported in ROS Kinetic and newer +# add_compile_options(-std=c++11) + +## Find catkin macros and libraries +## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz) +## is used, also find other catkin packages +find_package(catkin REQUIRED COMPONENTS + jackal_gazebo + jackal_navigation + jackal_viz + topological_rviz_tools + topological_utils +) + +## System dependencies are found with CMake's conventions +# find_package(Boost REQUIRED COMPONENTS system) + + +## Uncomment this if the package has a setup.py. This macro ensures +## modules and global scripts declared therein get installed +## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html +# catkin_python_setup() + +################################################ +## Declare ROS messages, services and actions ## +################################################ + +## To declare and build messages, services or actions from within this +## package, follow these steps: +## * Let MSG_DEP_SET be the set of packages whose message types you use in +## your messages/services/actions (e.g. std_msgs, actionlib_msgs, ...). +## * In the file package.xml: +## * add a build_depend tag for "message_generation" +## * add a build_depend and a exec_depend tag for each package in MSG_DEP_SET +## * If MSG_DEP_SET isn't empty the following dependency has been pulled in +## but can be declared for certainty nonetheless: +## * add a exec_depend tag for "message_runtime" +## * In this file (CMakeLists.txt): +## * add "message_generation" and every package in MSG_DEP_SET to +## find_package(catkin REQUIRED COMPONENTS ...) +## * add "message_runtime" and every package in MSG_DEP_SET to +## catkin_package(CATKIN_DEPENDS ...) +## * uncomment the add_*_files sections below as needed +## and list every .msg/.srv/.action file to be processed +## * uncomment the generate_messages entry below +## * add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...) + +## Generate messages in the 'msg' folder +# add_message_files( +# FILES +# Message1.msg +# Message2.msg +# ) + +## Generate services in the 'srv' folder +# add_service_files( +# FILES +# Service1.srv +# Service2.srv +# ) + +## Generate actions in the 'action' folder +# add_action_files( +# FILES +# Action1.action +# Action2.action +# ) + +## Generate added messages and services with any dependencies listed here +# generate_messages( +# DEPENDENCIES +# std_msgs # Or other packages containing msgs +# ) + +################################################ +## Declare ROS dynamic reconfigure parameters ## +################################################ + +## To declare and build dynamic reconfigure parameters within this +## package, follow these steps: +## * In the file package.xml: +## * add a build_depend and a exec_depend tag for "dynamic_reconfigure" +## * In this file (CMakeLists.txt): +## * add "dynamic_reconfigure" to +## find_package(catkin REQUIRED COMPONENTS ...) +## * uncomment the "generate_dynamic_reconfigure_options" section below +## and list every .cfg file to be processed + +## Generate dynamic reconfigure parameters in the 'cfg' folder +# generate_dynamic_reconfigure_options( +# cfg/DynReconf1.cfg +# cfg/DynReconf2.cfg +# ) + +################################### +## catkin specific configuration ## +################################### +## The catkin_package macro generates cmake config files for your package +## Declare things to be passed to dependent projects +## INCLUDE_DIRS: uncomment this if your package contains header files +## LIBRARIES: libraries you create in this project that dependent projects also need +## CATKIN_DEPENDS: catkin_packages dependent projects also need +## DEPENDS: system dependencies of this project that dependent projects also need +catkin_package( +# INCLUDE_DIRS include +# LIBRARIES strands_navigation_example +# CATKIN_DEPENDS jackal_gazebo jackal_navigation jackal_viz topological_rviz_tools topological_utils +# DEPENDS system_lib +) + +########### +## Build ## +########### + +## Specify additional locations of header files +## Your package locations should be listed before other locations +include_directories( +# include + ${catkin_INCLUDE_DIRS} +) + +## Declare a C++ library +# add_library(${PROJECT_NAME} +# src/${PROJECT_NAME}/strands_navigation_example.cpp +# ) + +## Add cmake target dependencies of the library +## as an example, code may need to be generated before libraries +## either from message generation or dynamic reconfigure +# add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) + +## Declare a C++ executable +## With catkin_make all packages are built within a single CMake context +## The recommended prefix ensures that target names across packages don't collide +# add_executable(${PROJECT_NAME}_node src/strands_navigation_example_node.cpp) + +## Rename C++ executable without prefix +## The above recommended prefix causes long target names, the following renames the +## target back to the shorter version for ease of user use +## e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node" +# set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "") + +## Add cmake target dependencies of the executable +## same as for the library above +# add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) + +## Specify libraries to link a library or executable target against +# target_link_libraries(${PROJECT_NAME}_node +# ${catkin_LIBRARIES} +# ) + +############# +## Install ## +############# + +# all install targets should use catkin DESTINATION variables +# See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html + +## Mark executable scripts (Python etc.) for installation +## in contrast to setup.py, you can choose the destination +# catkin_install_python(PROGRAMS +# scripts/my_python_script +# DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} +# ) + +## Mark executables for installation +## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_executables.html +# install(TARGETS ${PROJECT_NAME}_node +# RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} +# ) + +## Mark libraries for installation +## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html +# install(TARGETS ${PROJECT_NAME} +# ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} +# LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} +# RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION} +# ) + +## Mark cpp header files for installation +# install(DIRECTORY include/${PROJECT_NAME}/ +# DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} +# FILES_MATCHING PATTERN "*.h" +# PATTERN ".svn" EXCLUDE +# ) + +## Mark other files for installation (e.g. launch and bag files, etc.) +# install(FILES +# # myfile1 +# # myfile2 +# DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} +# ) + +############# +## Testing ## +############# + +## Add gtest based cpp test target and link libraries +# catkin_add_gtest(${PROJECT_NAME}-test test/test_strands_navigation_example.cpp) +# if(TARGET ${PROJECT_NAME}-test) +# target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME}) +# endif() + +## Add folders to be run by python nosetests +# catkin_add_nosetests(test) diff --git a/strands_navigation_example/images/empty_map.png b/strands_navigation_example/images/empty_map.png new file mode 100644 index 0000000..19bc807 Binary files /dev/null and b/strands_navigation_example/images/empty_map.png differ diff --git a/strands_navigation_example/images/rviz_config.png b/strands_navigation_example/images/rviz_config.png new file mode 100644 index 0000000..348a793 Binary files /dev/null and b/strands_navigation_example/images/rviz_config.png differ diff --git a/strands_navigation_example/images/topological_map.png b/strands_navigation_example/images/topological_map.png new file mode 100644 index 0000000..9ce0722 Binary files /dev/null and b/strands_navigation_example/images/topological_map.png differ diff --git a/strands_navigation_example/package.xml b/strands_navigation_example/package.xml new file mode 100644 index 0000000..d369c97 --- /dev/null +++ b/strands_navigation_example/package.xml @@ -0,0 +1,74 @@ + + + strands_navigation_example + 0.0.0 + The strands_navigation_example package + + + + + michal + + + + + + TODO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + catkin + jackal_gazebo + jackal_navigation + jackal_viz + topological_rviz_tools + topological_utils + jackal_gazebo + jackal_navigation + jackal_viz + topological_rviz_tools + topological_utils + jackal_gazebo + jackal_navigation + jackal_viz + topological_rviz_tools + topological_utils + + + + + + + + diff --git a/strands_navigation_example/readme.md b/strands_navigation_example/readme.md new file mode 100644 index 0000000..298271d --- /dev/null +++ b/strands_navigation_example/readme.md @@ -0,0 +1,110 @@ +# Strands navigation example + +This package is an example of how you might set up the strands navigation stack for use with a robot, using the clearpath jackal as an example. It includes usage of the topological mapping system. + +The setup assumes the use of melodic, but should also work for kinetic. + +## Jackal simulation setup + +To start, you will need to install the jackal packages. + +``` +sudo apt install ros-melodic-jackal-desktop ros-melodic-jackal-navigation +``` + +Then, you can start the gazebo simulation with + +``` +roslaunch jackal_gazebo jackal_world.launch front_laser:=true +``` + +You will see the jackal in a racing-track-like world. + +Then, run amcl and move_base with + +``` +roslaunch jackal_navigation amcl_demo.launch +``` + +You can visualise and move the robot with rviz, by dragging the interactive markers or by using the 2d nav goal command. + +``` +roscd jackal_viz +rviz -d rviz/navigation.rviz +``` + +The `localization.rviz` config may also be useful. + +## Setting up strands packages + +We need to install the packages required by the strands navigation stack. These are all available through the lincoln buildfarm. Follow the instructions at https://github.com/LCAS/rosdistro/wiki#batch-install to set things up so you can install from it. + +Once that's done, install the following packages + +``` +sudo apt install ros-melodic-strands-navigation ros-melodic-topological-navigation ros-melodic-topological-rviz-tools +``` + +## Making a topological map + +To make a topological map we will use the topological rviz tools package. First, we need to create a directory for the mongodb database that will store the data. This can be anywhere you like. + +``` +mkdir ~/strands_test_db +``` + +To prepare, we need to first insert an empty map into the database. Start the database with + +``` +roslaunch mongodb_store mongodb_store.launch db_path:=/home/$USER/strands_test_db +``` + +Then, insert an empty map. Note that this script is missing from some of the release packages. If so, clone the repository at https://github.com/LCAS/topological_navigation, add it to a workspace and build, and it should be available. + +``` +rosrun topological_utils insert_empty_map.py jackal_race +``` + +Once that is done, we can start the topological rviz tools. Note that this will also run a mongodb_store so the one you started earlier will shut down. + +``` +roslaunch topological_rviz_tools strands_rviz_topmap.launch db_path:=/home/$USER/strands_test_db map:=`rospack find jackal_navigation`/maps/jackal_race.yaml topmap:=jackal_race standalone:=true +``` + +This will bring up an rviz window. See [topological_rviz_tools](https://github.com/LCAS/topological_navigation/tree/master/topological_rviz_tools) for more details about the components. + +![empty map on starting](images/empty_map.png) + +First, remove the `temp_node` using the panel on the right, and then using the node and edge tools, add nodes to the map and connect them with edges. The topological map will be saved in the database but you may also want to output it to yaml for convenience, which you can do with + +``` +rosrun topological_utils map_to_yaml.py jackal_race jackal_race.yaml +``` + +You will end up with something like + +![example topological map](images/topological_map.png) + +We now have all we need to try out the system + +## Navigating on the topological map + +Start the gazebo simulation following the instructions above. + +Then, start the mongo database + +``` +roslaunch mongodb_store mongodb_store.launch db_path:=/home/$USER/strands_test_db +``` + +and run the topological navigation launch + +``` +roslaunch topological_navigation minimal_topological_navigation.launch map:=jackal_race move_base_planner:=move_base/TrajectoryPlannerROS +``` + +Start rviz and load the `topological.rviz` config found in this package. + +![rviz configuration](images/rviz_config.png) + +To use the topological navigation from rviz, you can click the green arrows on the nodes and the robot will navigate there. \ No newline at end of file diff --git a/strands_navigation_example/rviz/topological.rviz b/strands_navigation_example/rviz/topological.rviz new file mode 100644 index 0000000..f3104f3 --- /dev/null +++ b/strands_navigation_example/rviz/topological.rviz @@ -0,0 +1,389 @@ +Panels: + - Class: rviz/Displays + Help Height: 78 + Name: Displays + Property Tree Widget: + Expanded: + - /Robot1 + - /Move base1 + - /Topological map1 + Splitter Ratio: 0.5268459916114807 + Tree Height: 728 + - Class: rviz/Selection + Name: Selection + - Class: rviz/Tool Properties + Expanded: + - /2D Pose Estimate1 + - /2D Nav Goal1 + - /Publish Point1 + Name: Tool Properties + Splitter Ratio: 0.5886790156364441 + - Class: rviz/Views + Expanded: + - /Current View1 + Name: Views + Splitter Ratio: 0.5 + - Class: rviz/Time + Experimental: false + Name: Time + SyncMode: 0 + SyncSource: LaserScan + - Class: topological_rviz_tools/TopologicalMap + Expanded: ~ + Name: TopologicalMap + Splitter Ratio: 0.5 +Preferences: + PromptSaveOnExit: true +Toolbars: + toolButtonStyle: 2 +Visualization Manager: + Class: "" + Displays: + - Alpha: 0.5 + Cell Size: 1 + Class: rviz/Grid + Color: 209; 209; 214 + Enabled: true + Line Style: + Line Width: 0.029999999329447746 + Value: Lines + Name: Grid + Normal Cell Count: 0 + Offset: + X: 0 + Y: 0 + Z: 0 + Plane: XY + Plane Cell Count: 40 + Reference Frame: + Value: true + - Alpha: 0.699999988079071 + Class: rviz/Map + Color Scheme: map + Draw Behind: true + Enabled: true + Name: Map + Topic: /map + Unreliable: false + Use Timestamp: false + Value: true + - Class: rviz/Group + Displays: + - Class: rviz/TF + Enabled: false + Frame Timeout: 15 + Frames: + All Enabled: false + Marker Scale: 1 + Name: TF + Show Arrows: true + Show Axes: true + Show Names: true + Tree: + {} + Update Interval: 0 + Value: false + - Class: rviz/InteractiveMarkers + Enable Transparency: true + Enabled: true + Name: Move robot + Show Axes: false + Show Descriptions: true + Show Visual Aids: false + Update Topic: /twist_marker_server/update + Value: true + - Alpha: 1 + Arrow Length: 0.30000001192092896 + Axes Length: 0.30000001192092896 + Axes Radius: 0.009999999776482582 + Class: rviz/PoseArray + Color: 255; 25; 0 + Enabled: true + Head Length: 0.07000000029802322 + Head Radius: 0.029999999329447746 + Name: Particle cloud + Shaft Length: 0.23000000417232513 + Shaft Radius: 0.009999999776482582 + Shape: Arrow (Flat) + Topic: /particlecloud + Unreliable: false + Value: true + - Alpha: 1 + Class: rviz/RobotModel + Collision Enabled: true + Enabled: true + Links: + All Links Enabled: true + Expand Joint Details: false + Expand Link Details: false + Expand Tree: false + Link Tree Style: Links in Alphabetic Order + base_link: + Alpha: 1 + Show Axes: false + Show Trail: false + chassis_link: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + front_fender_link: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + front_laser: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + front_laser_mount: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + front_left_wheel_link: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + front_mount: + Alpha: 1 + Show Axes: false + Show Trail: false + front_right_wheel_link: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + imu_link: + Alpha: 1 + Show Axes: false + Show Trail: false + mid_mount: + Alpha: 1 + Show Axes: false + Show Trail: false + navsat_link: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + rear_fender_link: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + rear_left_wheel_link: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + rear_mount: + Alpha: 1 + Show Axes: false + Show Trail: false + rear_right_wheel_link: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + Name: RobotModel + Robot Description: robot_description + TF Prefix: "" + Update Interval: 0 + Value: true + Visual Enabled: true + - Alpha: 1 + Autocompute Intensity Bounds: true + Autocompute Value Bounds: + Max Value: 10 + Min Value: -10 + Value: true + Axis: Z + Channel Name: intensity + Class: rviz/LaserScan + Color: 255; 255; 255 + Color Transformer: Intensity + Decay Time: 0 + Enabled: true + Invert Rainbow: false + Max Color: 255; 255; 255 + Max Intensity: 0 + Min Color: 0; 0; 0 + Min Intensity: 0 + Name: LaserScan + Position Transformer: XYZ + Queue Size: 10 + Selectable: true + Size (Pixels): 3 + Size (m): 0.05000000074505806 + Style: Flat Squares + Topic: /front/scan + Unreliable: false + Use Fixed Frame: true + Use rainbow: true + Value: true + Enabled: true + Name: Robot + - Class: rviz/Group + Displays: + - Alpha: 1 + Buffer Length: 1 + Class: rviz/Path + Color: 85; 255; 255 + Enabled: true + Head Diameter: 0.30000001192092896 + Head Length: 0.20000000298023224 + Length: 0.30000001192092896 + Line Style: Lines + Line Width: 0.029999999329447746 + Name: Global plan + Offset: + X: 0 + Y: 0 + Z: 0 + Pose Color: 255; 85; 255 + Pose Style: None + Radius: 0.029999999329447746 + Shaft Diameter: 0.10000000149011612 + Shaft Length: 0.10000000149011612 + Topic: /move_base/NavfnROS/plan + Unreliable: false + Value: true + - Alpha: 1 + Buffer Length: 1 + Class: rviz/Path + Color: 25; 255; 0 + Enabled: true + Head Diameter: 0.30000001192092896 + Head Length: 0.20000000298023224 + Length: 0.30000001192092896 + Line Style: Lines + Line Width: 0.029999999329447746 + Name: Local plan + Offset: + X: 0 + Y: 0 + Z: 0 + Pose Color: 255; 85; 255 + Pose Style: None + Radius: 0.029999999329447746 + Shaft Diameter: 0.10000000149011612 + Shaft Length: 0.10000000149011612 + Topic: /move_base/TrajectoryPlannerROS/local_plan + Unreliable: false + Value: true + Enabled: true + Name: Move base + - Class: rviz/Group + Displays: + - Class: rviz/Group + Displays: + - Class: rviz/InteractiveMarkers + Enable Transparency: true + Enabled: false + Name: Edit Nodes + Show Axes: false + Show Descriptions: true + Show Visual Aids: false + Update Topic: /topological_map_markers/update + Value: false + - Class: rviz/InteractiveMarkers + Enable Transparency: true + Enabled: false + Name: Edit Edges + Show Axes: false + Show Descriptions: true + Show Visual Aids: false + Update Topic: /topological_map_edges/update + Value: false + Enabled: true + Name: Editing + - Class: rviz/InteractiveMarkers + Enable Transparency: true + Enabled: true + Name: Move to node + Show Axes: false + Show Descriptions: true + Show Visual Aids: false + Update Topic: /go_to_node/update + Value: true + - Class: rviz/MarkerArray + Enabled: true + Marker Topic: /topological_map_visualisation + Name: Visualisation + Namespaces: + /edges: true + /legend: true + /nodes: true + /zones: true + Queue Size: 100 + Value: true + Enabled: true + Name: Topological map + Enabled: true + Global Options: + Background Color: 48; 48; 48 + Default Light: true + Fixed Frame: map + Frame Rate: 30 + Name: root + Tools: + - Class: rviz/Interact + Hide Inactive Objects: true + - Class: rviz/MoveCamera + - Class: rviz/Select + - Class: rviz/FocusCamera + - Class: rviz/Measure + - Class: rviz/SetInitialPose + Theta std deviation: 0.2617993950843811 + Topic: /initialpose + X std deviation: 0.5 + Y std deviation: 0.5 + - Class: rviz/SetGoal + Topic: /move_base_simple/goal + - Class: rviz/PublishPoint + Single click: true + Topic: /clicked_point + - Class: topological_rviz_tools/TopmapEdge + - Class: topological_rviz_tools/TopmapNode + Value: true + Views: + Current: + Angle: 1.5707999467849731 + Class: rviz/TopDownOrtho + Enable Stereo Rendering: + Stereo Eye Separation: 0.05999999865889549 + Stereo Focal Distance: 1 + Swap Stereo Eyes: false + Value: false + Invert Z Axis: false + Name: Current View + Near Clip Distance: 0.009999999776482582 + Scale: 24.205989837646484 + Target Frame: + Value: TopDownOrtho (rviz) + X: -0.9606992602348328 + Y: 1.4285414218902588 + Saved: ~ +Window Geometry: + Displays: + collapsed: false + Height: 1025 + Hide Left Dock: false + Hide Right Dock: false + QMainWindow State: 000000ff00000000fd0000000400000000000001d500000363fc0200000008fb0000001200530065006c0065006300740069006f006e00000001e10000009b0000005c00fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c006100790073010000003d00000363000000c900fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261000000010000010f00000363fc0200000003fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fc0000003d00000363000000c10100001cfa000000000100000002fb0000001c0054006f0070006f006c006f0067006900630061006c004d006100700100000000ffffffff000000aa00fffffffb0000000a0056006900650077007301000006710000010f0000010000fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e10000019700000003000007800000003efc0100000002fb0000000800540069006d0065010000000000000780000002eb00fffffffb0000000800540069006d00650100000000000004500000000000000000000004900000036300000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000 + Selection: + collapsed: false + Time: + collapsed: false + Tool Properties: + collapsed: false + TopologicalMap: + collapsed: false + Views: + collapsed: false + Width: 1920 + X: 0 + Y: 27