diff --git a/README.md b/README.md
index 7bdb84e..2010d86 100644
--- a/README.md
+++ b/README.md
@@ -4,11 +4,17 @@ This repository includes Core ROS examples for the [MRS UAV System](https://gith
## Packages
-* [waypoint_flier_simple](./waypoint_flier_simple) - Minimalistic C++ Nodelet with "_vanilla_" ROS features
-* [waypoint_flier](./waypoint_flier) - Full C++ Nodelet with "_MRS_" libraries and wrappers
-* [controller_plugin](./controller_plugin) - Example of Controller plugin for the [ControlManager](https://github.com/ctu-mrs/mrs_uav_managers)
-* [tracker_plugin](./tracker_plugin) - Example of Tracker plugin for the [ControlManager](https://github.com/ctu-mrs/mrs_uav_managers)
-* [pluginlib_example](./pluginlib_example) - Example of ROS Pluginlib, similar to how it is used in the [ControlManager](https://github.com/ctu-mrs/mrs_uav_managers)
+## C++
+
+* [waypoint_flier_simple](./cpp/waypoint_flier_simple) - Minimalistic C++ Nodelet with "_vanilla_" ROS features
+* [waypoint_flier](./cpp/waypoint_flier) - Full C++ Nodelet with "_MRS_" libraries and wrappers
+* [controller_plugin](./cpp/controller_plugin) - Example of Controller plugin for the [ControlManager](https://github.com/ctu-mrs/mrs_uav_managers)
+* [tracker_plugin](./cpp/tracker_plugin) - Example of Tracker plugin for the [ControlManager](https://github.com/ctu-mrs/mrs_uav_managers)
+* [pluginlib_example](./cpp/pluginlib_example) - Example of ROS Pluginlib, similar to how it is used in the [ControlManager](https://github.com/ctu-mrs/mrs_uav_managers)
+
+## Python
+
+* [sweeping_generator](./python/sweeping_generator) - Minimalistic Python Example that generates sweeping path for the UAV
# Disclaimer
diff --git a/controller_plugin/README.md b/controller_plugin/README.md
deleted file mode 100644
index 08be633..0000000
--- a/controller_plugin/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# example_controller_plugin
-
-Example controller plugin for the MRS Control Manager.
diff --git a/cpp/README.md b/cpp/README.md
new file mode 100644
index 0000000..55459fe
--- /dev/null
+++ b/cpp/README.md
@@ -0,0 +1 @@
+# MRS C++ Examples
diff --git a/controller_plugin/CMakeLists.txt b/cpp/controller_plugin/CMakeLists.txt
similarity index 100%
rename from controller_plugin/CMakeLists.txt
rename to cpp/controller_plugin/CMakeLists.txt
diff --git a/cpp/controller_plugin/README.md b/cpp/controller_plugin/README.md
new file mode 100644
index 0000000..eb5e102
--- /dev/null
+++ b/cpp/controller_plugin/README.md
@@ -0,0 +1,9 @@
+# Example Controller Plugin
+
+Example controller plugin for the Control Manager.
+
+## How to start
+
+```bash
+./tmux/start.sh
+```
diff --git a/controller_plugin/cfg/example_controller.cfg b/cpp/controller_plugin/cfg/example_controller.cfg
similarity index 100%
rename from controller_plugin/cfg/example_controller.cfg
rename to cpp/controller_plugin/cfg/example_controller.cfg
diff --git a/controller_plugin/config/example_controller.yaml b/cpp/controller_plugin/config/example_controller.yaml
similarity index 100%
rename from controller_plugin/config/example_controller.yaml
rename to cpp/controller_plugin/config/example_controller.yaml
diff --git a/controller_plugin/include/pid.hpp b/cpp/controller_plugin/include/pid.hpp
similarity index 100%
rename from controller_plugin/include/pid.hpp
rename to cpp/controller_plugin/include/pid.hpp
diff --git a/controller_plugin/package.xml b/cpp/controller_plugin/package.xml
similarity index 100%
rename from controller_plugin/package.xml
rename to cpp/controller_plugin/package.xml
diff --git a/controller_plugin/plugins.xml b/cpp/controller_plugin/plugins.xml
similarity index 100%
rename from controller_plugin/plugins.xml
rename to cpp/controller_plugin/plugins.xml
diff --git a/controller_plugin/src/example_controller.cpp b/cpp/controller_plugin/src/example_controller.cpp
similarity index 100%
rename from controller_plugin/src/example_controller.cpp
rename to cpp/controller_plugin/src/example_controller.cpp
diff --git a/controller_plugin/tmux/config/custom_config.yaml b/cpp/controller_plugin/tmux/config/custom_config.yaml
similarity index 100%
rename from controller_plugin/tmux/config/custom_config.yaml
rename to cpp/controller_plugin/tmux/config/custom_config.yaml
diff --git a/controller_plugin/tmux/config/hw_api.yaml b/cpp/controller_plugin/tmux/config/hw_api.yaml
similarity index 100%
rename from controller_plugin/tmux/config/hw_api.yaml
rename to cpp/controller_plugin/tmux/config/hw_api.yaml
diff --git a/controller_plugin/tmux/config/network_config.yaml b/cpp/controller_plugin/tmux/config/network_config.yaml
similarity index 100%
rename from controller_plugin/tmux/config/network_config.yaml
rename to cpp/controller_plugin/tmux/config/network_config.yaml
diff --git a/controller_plugin/tmux/config/simulator.yaml b/cpp/controller_plugin/tmux/config/simulator.yaml
similarity index 100%
rename from controller_plugin/tmux/config/simulator.yaml
rename to cpp/controller_plugin/tmux/config/simulator.yaml
diff --git a/controller_plugin/tmux/config/world_config.yaml b/cpp/controller_plugin/tmux/config/world_config.yaml
similarity index 100%
rename from controller_plugin/tmux/config/world_config.yaml
rename to cpp/controller_plugin/tmux/config/world_config.yaml
diff --git a/controller_plugin/tmux/layout.json b/cpp/controller_plugin/tmux/layout.json
similarity index 100%
rename from controller_plugin/tmux/layout.json
rename to cpp/controller_plugin/tmux/layout.json
diff --git a/controller_plugin/tmux/session.yml b/cpp/controller_plugin/tmux/session.yml
similarity index 100%
rename from controller_plugin/tmux/session.yml
rename to cpp/controller_plugin/tmux/session.yml
diff --git a/controller_plugin/tmux/start.sh b/cpp/controller_plugin/tmux/start.sh
similarity index 100%
rename from controller_plugin/tmux/start.sh
rename to cpp/controller_plugin/tmux/start.sh
diff --git a/pluginlib_example/README.md b/cpp/pluginlib_example/README.md
similarity index 100%
rename from pluginlib_example/README.md
rename to cpp/pluginlib_example/README.md
diff --git a/pluginlib_example/example_plugin_manager/CMakeLists.txt b/cpp/pluginlib_example/example_plugin_manager/CMakeLists.txt
similarity index 100%
rename from pluginlib_example/example_plugin_manager/CMakeLists.txt
rename to cpp/pluginlib_example/example_plugin_manager/CMakeLists.txt
diff --git a/pluginlib_example/example_plugin_manager/config/example_plugin_manager.yaml b/cpp/pluginlib_example/example_plugin_manager/config/example_plugin_manager.yaml
similarity index 100%
rename from pluginlib_example/example_plugin_manager/config/example_plugin_manager.yaml
rename to cpp/pluginlib_example/example_plugin_manager/config/example_plugin_manager.yaml
diff --git a/pluginlib_example/example_plugin_manager/config/plugins.yaml b/cpp/pluginlib_example/example_plugin_manager/config/plugins.yaml
similarity index 100%
rename from pluginlib_example/example_plugin_manager/config/plugins.yaml
rename to cpp/pluginlib_example/example_plugin_manager/config/plugins.yaml
diff --git a/pluginlib_example/example_plugin_manager/include/example_plugin_manager/common_handlers.h b/cpp/pluginlib_example/example_plugin_manager/include/example_plugin_manager/common_handlers.h
similarity index 100%
rename from pluginlib_example/example_plugin_manager/include/example_plugin_manager/common_handlers.h
rename to cpp/pluginlib_example/example_plugin_manager/include/example_plugin_manager/common_handlers.h
diff --git a/pluginlib_example/example_plugin_manager/include/example_plugin_manager/plugin_interface.h b/cpp/pluginlib_example/example_plugin_manager/include/example_plugin_manager/plugin_interface.h
similarity index 100%
rename from pluginlib_example/example_plugin_manager/include/example_plugin_manager/plugin_interface.h
rename to cpp/pluginlib_example/example_plugin_manager/include/example_plugin_manager/plugin_interface.h
diff --git a/pluginlib_example/example_plugin_manager/launch/example_plugin_manager.launch b/cpp/pluginlib_example/example_plugin_manager/launch/example_plugin_manager.launch
similarity index 100%
rename from pluginlib_example/example_plugin_manager/launch/example_plugin_manager.launch
rename to cpp/pluginlib_example/example_plugin_manager/launch/example_plugin_manager.launch
diff --git a/pluginlib_example/example_plugin_manager/nodelets.xml b/cpp/pluginlib_example/example_plugin_manager/nodelets.xml
similarity index 100%
rename from pluginlib_example/example_plugin_manager/nodelets.xml
rename to cpp/pluginlib_example/example_plugin_manager/nodelets.xml
diff --git a/pluginlib_example/example_plugin_manager/package.xml b/cpp/pluginlib_example/example_plugin_manager/package.xml
similarity index 100%
rename from pluginlib_example/example_plugin_manager/package.xml
rename to cpp/pluginlib_example/example_plugin_manager/package.xml
diff --git a/pluginlib_example/example_plugin_manager/src/example_plugin_manager.cpp b/cpp/pluginlib_example/example_plugin_manager/src/example_plugin_manager.cpp
similarity index 100%
rename from pluginlib_example/example_plugin_manager/src/example_plugin_manager.cpp
rename to cpp/pluginlib_example/example_plugin_manager/src/example_plugin_manager.cpp
diff --git a/pluginlib_example/example_plugins/CMakeLists.txt b/cpp/pluginlib_example/example_plugins/CMakeLists.txt
similarity index 100%
rename from pluginlib_example/example_plugins/CMakeLists.txt
rename to cpp/pluginlib_example/example_plugins/CMakeLists.txt
diff --git a/pluginlib_example/example_plugins/config/example_plugin.yaml b/cpp/pluginlib_example/example_plugins/config/example_plugin.yaml
similarity index 100%
rename from pluginlib_example/example_plugins/config/example_plugin.yaml
rename to cpp/pluginlib_example/example_plugins/config/example_plugin.yaml
diff --git a/pluginlib_example/example_plugins/package.xml b/cpp/pluginlib_example/example_plugins/package.xml
similarity index 100%
rename from pluginlib_example/example_plugins/package.xml
rename to cpp/pluginlib_example/example_plugins/package.xml
diff --git a/pluginlib_example/example_plugins/plugins.xml b/cpp/pluginlib_example/example_plugins/plugins.xml
similarity index 100%
rename from pluginlib_example/example_plugins/plugins.xml
rename to cpp/pluginlib_example/example_plugins/plugins.xml
diff --git a/pluginlib_example/example_plugins/src/example_plugin.cpp b/cpp/pluginlib_example/example_plugins/src/example_plugin.cpp
similarity index 100%
rename from pluginlib_example/example_plugins/src/example_plugin.cpp
rename to cpp/pluginlib_example/example_plugins/src/example_plugin.cpp
diff --git a/tracker_plugin/CMakeLists.txt b/cpp/tracker_plugin/CMakeLists.txt
similarity index 100%
rename from tracker_plugin/CMakeLists.txt
rename to cpp/tracker_plugin/CMakeLists.txt
diff --git a/cpp/tracker_plugin/README.md b/cpp/tracker_plugin/README.md
new file mode 100644
index 0000000..f583448
--- /dev/null
+++ b/cpp/tracker_plugin/README.md
@@ -0,0 +1,9 @@
+# Example Tracker Plugin
+
+Example tracker plugin for the MRS Control Manager.
+
+## How to start
+
+```bash
+./tmux/start.sh
+```
diff --git a/tracker_plugin/cfg/example_tracker.cfg b/cpp/tracker_plugin/cfg/example_tracker.cfg
similarity index 100%
rename from tracker_plugin/cfg/example_tracker.cfg
rename to cpp/tracker_plugin/cfg/example_tracker.cfg
diff --git a/tracker_plugin/config/example_tracker.yaml b/cpp/tracker_plugin/config/example_tracker.yaml
similarity index 100%
rename from tracker_plugin/config/example_tracker.yaml
rename to cpp/tracker_plugin/config/example_tracker.yaml
diff --git a/tracker_plugin/include/.gitkeep b/cpp/tracker_plugin/include/.gitkeep
similarity index 100%
rename from tracker_plugin/include/.gitkeep
rename to cpp/tracker_plugin/include/.gitkeep
diff --git a/tracker_plugin/package.xml b/cpp/tracker_plugin/package.xml
similarity index 100%
rename from tracker_plugin/package.xml
rename to cpp/tracker_plugin/package.xml
diff --git a/tracker_plugin/plugins.xml b/cpp/tracker_plugin/plugins.xml
similarity index 100%
rename from tracker_plugin/plugins.xml
rename to cpp/tracker_plugin/plugins.xml
diff --git a/tracker_plugin/src/example_tracker.cpp b/cpp/tracker_plugin/src/example_tracker.cpp
similarity index 100%
rename from tracker_plugin/src/example_tracker.cpp
rename to cpp/tracker_plugin/src/example_tracker.cpp
diff --git a/tracker_plugin/tmux/config/custom_config.yaml b/cpp/tracker_plugin/tmux/config/custom_config.yaml
similarity index 100%
rename from tracker_plugin/tmux/config/custom_config.yaml
rename to cpp/tracker_plugin/tmux/config/custom_config.yaml
diff --git a/tracker_plugin/tmux/config/hw_api.yaml b/cpp/tracker_plugin/tmux/config/hw_api.yaml
similarity index 100%
rename from tracker_plugin/tmux/config/hw_api.yaml
rename to cpp/tracker_plugin/tmux/config/hw_api.yaml
diff --git a/tracker_plugin/tmux/config/network_config.yaml b/cpp/tracker_plugin/tmux/config/network_config.yaml
similarity index 100%
rename from tracker_plugin/tmux/config/network_config.yaml
rename to cpp/tracker_plugin/tmux/config/network_config.yaml
diff --git a/tracker_plugin/tmux/config/simulator.yaml b/cpp/tracker_plugin/tmux/config/simulator.yaml
similarity index 100%
rename from tracker_plugin/tmux/config/simulator.yaml
rename to cpp/tracker_plugin/tmux/config/simulator.yaml
diff --git a/tracker_plugin/tmux/config/world_config.yaml b/cpp/tracker_plugin/tmux/config/world_config.yaml
similarity index 100%
rename from tracker_plugin/tmux/config/world_config.yaml
rename to cpp/tracker_plugin/tmux/config/world_config.yaml
diff --git a/tracker_plugin/tmux/layout.json b/cpp/tracker_plugin/tmux/layout.json
similarity index 100%
rename from tracker_plugin/tmux/layout.json
rename to cpp/tracker_plugin/tmux/layout.json
diff --git a/tracker_plugin/tmux/session.yml b/cpp/tracker_plugin/tmux/session.yml
similarity index 100%
rename from tracker_plugin/tmux/session.yml
rename to cpp/tracker_plugin/tmux/session.yml
diff --git a/tracker_plugin/tmux/start.sh b/cpp/tracker_plugin/tmux/start.sh
similarity index 100%
rename from tracker_plugin/tmux/start.sh
rename to cpp/tracker_plugin/tmux/start.sh
diff --git a/waypoint_flier/CMakeLists.txt b/cpp/waypoint_flier/CMakeLists.txt
similarity index 100%
rename from waypoint_flier/CMakeLists.txt
rename to cpp/waypoint_flier/CMakeLists.txt
diff --git a/waypoint_flier/README.md b/cpp/waypoint_flier/README.md
similarity index 98%
rename from waypoint_flier/README.md
rename to cpp/waypoint_flier/README.md
index 80b37ac..b80af73 100644
--- a/waypoint_flier/README.md
+++ b/cpp/waypoint_flier/README.md
@@ -10,6 +10,14 @@ The package is written in C++ and features custom MRS libraries and msgs.
* Service `start_waypoint_following` causes the UAV to start tracking the waypoints
* Service `stop_waypoint_following` stops adding new waypoints. Flight to the current waypoint is not interrupted.
+## How to start
+
+```bash
+./tmux/start.sh
+```
+
+The call the services prepared in the terminal window.
+
## Package structure
See [ROS packages](http://wiki.ros.org/Packages)
diff --git a/waypoint_flier/config/dynparam.cfg b/cpp/waypoint_flier/config/dynparam.cfg
similarity index 100%
rename from waypoint_flier/config/dynparam.cfg
rename to cpp/waypoint_flier/config/dynparam.cfg
diff --git a/waypoint_flier/config/waypoint_flier.yaml b/cpp/waypoint_flier/config/waypoint_flier.yaml
similarity index 100%
rename from waypoint_flier/config/waypoint_flier.yaml
rename to cpp/waypoint_flier/config/waypoint_flier.yaml
diff --git a/waypoint_flier/launch/waypoint_flier.launch b/cpp/waypoint_flier/launch/waypoint_flier.launch
similarity index 100%
rename from waypoint_flier/launch/waypoint_flier.launch
rename to cpp/waypoint_flier/launch/waypoint_flier.launch
diff --git a/waypoint_flier/nodelets.xml b/cpp/waypoint_flier/nodelets.xml
similarity index 100%
rename from waypoint_flier/nodelets.xml
rename to cpp/waypoint_flier/nodelets.xml
diff --git a/waypoint_flier/package.xml b/cpp/waypoint_flier/package.xml
similarity index 100%
rename from waypoint_flier/package.xml
rename to cpp/waypoint_flier/package.xml
diff --git a/waypoint_flier/src/waypoint_flier.cpp b/cpp/waypoint_flier/src/waypoint_flier.cpp
similarity index 100%
rename from waypoint_flier/src/waypoint_flier.cpp
rename to cpp/waypoint_flier/src/waypoint_flier.cpp
diff --git a/waypoint_flier/tmux/config/automatic_start.yaml b/cpp/waypoint_flier/tmux/config/automatic_start.yaml
similarity index 100%
rename from waypoint_flier/tmux/config/automatic_start.yaml
rename to cpp/waypoint_flier/tmux/config/automatic_start.yaml
diff --git a/waypoint_flier/tmux/config/custom_config.yaml b/cpp/waypoint_flier/tmux/config/custom_config.yaml
similarity index 100%
rename from waypoint_flier/tmux/config/custom_config.yaml
rename to cpp/waypoint_flier/tmux/config/custom_config.yaml
diff --git a/waypoint_flier/tmux/config/hw_api.yaml b/cpp/waypoint_flier/tmux/config/hw_api.yaml
similarity index 100%
rename from waypoint_flier/tmux/config/hw_api.yaml
rename to cpp/waypoint_flier/tmux/config/hw_api.yaml
diff --git a/waypoint_flier/tmux/config/network_config.yaml b/cpp/waypoint_flier/tmux/config/network_config.yaml
similarity index 100%
rename from waypoint_flier/tmux/config/network_config.yaml
rename to cpp/waypoint_flier/tmux/config/network_config.yaml
diff --git a/waypoint_flier/tmux/config/simulator.yaml b/cpp/waypoint_flier/tmux/config/simulator.yaml
similarity index 100%
rename from waypoint_flier/tmux/config/simulator.yaml
rename to cpp/waypoint_flier/tmux/config/simulator.yaml
diff --git a/waypoint_flier/tmux/config/world_config.yaml b/cpp/waypoint_flier/tmux/config/world_config.yaml
similarity index 100%
rename from waypoint_flier/tmux/config/world_config.yaml
rename to cpp/waypoint_flier/tmux/config/world_config.yaml
diff --git a/waypoint_flier/tmux/kill.sh b/cpp/waypoint_flier/tmux/kill.sh
similarity index 100%
rename from waypoint_flier/tmux/kill.sh
rename to cpp/waypoint_flier/tmux/kill.sh
diff --git a/waypoint_flier/tmux/layout.json b/cpp/waypoint_flier/tmux/layout.json
similarity index 100%
rename from waypoint_flier/tmux/layout.json
rename to cpp/waypoint_flier/tmux/layout.json
diff --git a/waypoint_flier/tmux/session.yml b/cpp/waypoint_flier/tmux/session.yml
similarity index 100%
rename from waypoint_flier/tmux/session.yml
rename to cpp/waypoint_flier/tmux/session.yml
diff --git a/waypoint_flier/tmux/start.sh b/cpp/waypoint_flier/tmux/start.sh
similarity index 100%
rename from waypoint_flier/tmux/start.sh
rename to cpp/waypoint_flier/tmux/start.sh
diff --git a/waypoint_flier_simple/CMakeLists.txt b/cpp/waypoint_flier_simple/CMakeLists.txt
similarity index 100%
rename from waypoint_flier_simple/CMakeLists.txt
rename to cpp/waypoint_flier_simple/CMakeLists.txt
diff --git a/waypoint_flier_simple/README.md b/cpp/waypoint_flier_simple/README.md
similarity index 93%
rename from waypoint_flier_simple/README.md
rename to cpp/waypoint_flier_simple/README.md
index 744452f..007230f 100644
--- a/waypoint_flier_simple/README.md
+++ b/cpp/waypoint_flier_simple/README.md
@@ -9,6 +9,14 @@ You can test the program in simulation (see our [simulation tutorial](https://ct
* Service `start_waypoint_following` will activate the nodelet
* The area in which random waypoints are generated is configurable with a separate config file See [.yaml files](http://wiki.ros.org/rosparam)
+## How to start
+
+```bash
+./tmux/start.sh
+```
+
+The call the services prepared in the terminal window.
+
## Package structure
See [ROS packages](http://wiki.ros.org/Packages)
diff --git a/waypoint_flier_simple/config/waypoint_flier.yaml b/cpp/waypoint_flier_simple/config/waypoint_flier.yaml
similarity index 100%
rename from waypoint_flier_simple/config/waypoint_flier.yaml
rename to cpp/waypoint_flier_simple/config/waypoint_flier.yaml
diff --git a/waypoint_flier_simple/launch/waypoint_flier_simple.launch b/cpp/waypoint_flier_simple/launch/waypoint_flier_simple.launch
similarity index 100%
rename from waypoint_flier_simple/launch/waypoint_flier_simple.launch
rename to cpp/waypoint_flier_simple/launch/waypoint_flier_simple.launch
diff --git a/waypoint_flier_simple/nodelets.xml b/cpp/waypoint_flier_simple/nodelets.xml
similarity index 100%
rename from waypoint_flier_simple/nodelets.xml
rename to cpp/waypoint_flier_simple/nodelets.xml
diff --git a/waypoint_flier_simple/package.xml b/cpp/waypoint_flier_simple/package.xml
similarity index 100%
rename from waypoint_flier_simple/package.xml
rename to cpp/waypoint_flier_simple/package.xml
diff --git a/waypoint_flier_simple/src/waypoint_flier_simple.cpp b/cpp/waypoint_flier_simple/src/waypoint_flier_simple.cpp
similarity index 100%
rename from waypoint_flier_simple/src/waypoint_flier_simple.cpp
rename to cpp/waypoint_flier_simple/src/waypoint_flier_simple.cpp
diff --git a/waypoint_flier_simple/tmux/config/automatic_start.yaml b/cpp/waypoint_flier_simple/tmux/config/automatic_start.yaml
similarity index 100%
rename from waypoint_flier_simple/tmux/config/automatic_start.yaml
rename to cpp/waypoint_flier_simple/tmux/config/automatic_start.yaml
diff --git a/waypoint_flier_simple/tmux/config/custom_config.yaml b/cpp/waypoint_flier_simple/tmux/config/custom_config.yaml
similarity index 100%
rename from waypoint_flier_simple/tmux/config/custom_config.yaml
rename to cpp/waypoint_flier_simple/tmux/config/custom_config.yaml
diff --git a/waypoint_flier_simple/tmux/config/hw_api.yaml b/cpp/waypoint_flier_simple/tmux/config/hw_api.yaml
similarity index 100%
rename from waypoint_flier_simple/tmux/config/hw_api.yaml
rename to cpp/waypoint_flier_simple/tmux/config/hw_api.yaml
diff --git a/waypoint_flier_simple/tmux/config/network_config.yaml b/cpp/waypoint_flier_simple/tmux/config/network_config.yaml
similarity index 100%
rename from waypoint_flier_simple/tmux/config/network_config.yaml
rename to cpp/waypoint_flier_simple/tmux/config/network_config.yaml
diff --git a/waypoint_flier_simple/tmux/config/simulator.yaml b/cpp/waypoint_flier_simple/tmux/config/simulator.yaml
similarity index 100%
rename from waypoint_flier_simple/tmux/config/simulator.yaml
rename to cpp/waypoint_flier_simple/tmux/config/simulator.yaml
diff --git a/waypoint_flier_simple/tmux/config/world_config.yaml b/cpp/waypoint_flier_simple/tmux/config/world_config.yaml
similarity index 100%
rename from waypoint_flier_simple/tmux/config/world_config.yaml
rename to cpp/waypoint_flier_simple/tmux/config/world_config.yaml
diff --git a/waypoint_flier_simple/tmux/kill.sh b/cpp/waypoint_flier_simple/tmux/kill.sh
similarity index 100%
rename from waypoint_flier_simple/tmux/kill.sh
rename to cpp/waypoint_flier_simple/tmux/kill.sh
diff --git a/waypoint_flier_simple/tmux/layout.json b/cpp/waypoint_flier_simple/tmux/layout.json
similarity index 100%
rename from waypoint_flier_simple/tmux/layout.json
rename to cpp/waypoint_flier_simple/tmux/layout.json
diff --git a/waypoint_flier_simple/tmux/session.yml b/cpp/waypoint_flier_simple/tmux/session.yml
similarity index 100%
rename from waypoint_flier_simple/tmux/session.yml
rename to cpp/waypoint_flier_simple/tmux/session.yml
diff --git a/waypoint_flier_simple/tmux/start.sh b/cpp/waypoint_flier_simple/tmux/start.sh
similarity index 100%
rename from waypoint_flier_simple/tmux/start.sh
rename to cpp/waypoint_flier_simple/tmux/start.sh
diff --git a/python/README.md b/python/README.md
new file mode 100644
index 0000000..f3f6717
--- /dev/null
+++ b/python/README.md
@@ -0,0 +1 @@
+# MRS Python Examples
diff --git a/python/sweeping_generator/CMakeLists.txt b/python/sweeping_generator/CMakeLists.txt
new file mode 100644
index 0000000..b46d2f0
--- /dev/null
+++ b/python/sweeping_generator/CMakeLists.txt
@@ -0,0 +1,36 @@
+cmake_minimum_required(VERSION 3.15.0)
+project(example_sweeping_generator)
+
+set(CMAKE_CXX_STANDARD 17)
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
+
+set(CATKIN_DEPENDENCIES
+ rospy
+ mrs_msgs
+ )
+
+find_package(catkin REQUIRED COMPONENTS
+ ${CATKIN_DEPENDENCIES}
+ )
+
+catkin_package(
+ CATKIN_DEPENDS ${CATKIN_DEPENDENCIES}
+ )
+
+## --------------------------------------------------------------
+## | Install |
+## --------------------------------------------------------------
+
+install(DIRECTORY launch config
+ DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
+ )
+
+install(DIRECTORY scripts/
+ USE_SOURCE_PERMISSIONS
+ DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
+ )
+
+install(DIRECTORY scripts
+ USE_SOURCE_PERMISSIONS
+ DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
+ )
diff --git a/python/sweeping_generator/README.md b/python/sweeping_generator/README.md
new file mode 100644
index 0000000..14fd3b6
--- /dev/null
+++ b/python/sweeping_generator/README.md
@@ -0,0 +1,12 @@
+# Sweeping Generator
+
+## How to start
+
+```bash
+./tmux/start.sh
+```
+
+When ready, call the service prepared in the bottom terminal window:
+```bash
+rosservice call /$UAV_NAME/sweeping_generator/start 3.0
+```
diff --git a/python/sweeping_generator/config/sweeping_generator.yaml b/python/sweeping_generator/config/sweeping_generator.yaml
new file mode 100644
index 0000000..dc02cb7
--- /dev/null
+++ b/python/sweeping_generator/config/sweeping_generator.yaml
@@ -0,0 +1,13 @@
+frame_id: "world_origin"
+
+timer_main:
+ rate: 1.0 # [Hz]
+
+center:
+ x: 0.0 # [m]
+ y: 0.0 # [m]
+ z: 2.0 # [m]
+
+dimensions:
+ x: 20.0 # [m]
+ y: 20.0 # [m]
diff --git a/python/sweeping_generator/launch/sweeping_generator.launch b/python/sweeping_generator/launch/sweeping_generator.launch
new file mode 100644
index 0000000..46d55f1
--- /dev/null
+++ b/python/sweeping_generator/launch/sweeping_generator.launch
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/python/sweeping_generator/package.xml b/python/sweeping_generator/package.xml
new file mode 100644
index 0000000..2f9087a
--- /dev/null
+++ b/python/sweeping_generator/package.xml
@@ -0,0 +1,21 @@
+
+
+
+ example_sweeping_generator
+ 1.0.0
+ The Python Example for Sweeping Generator
+
+ Tomas Baca
+ Tomas Baca
+
+ MIT
+
+ catkin
+
+ rospy
+ mrs_msgs
+
+
+
+
+
diff --git a/python/sweeping_generator/scripts/sweeping_generator.py b/python/sweeping_generator/scripts/sweeping_generator.py
new file mode 100755
index 0000000..e6c9423
--- /dev/null
+++ b/python/sweeping_generator/scripts/sweeping_generator.py
@@ -0,0 +1,167 @@
+#!/usr/bin/python3
+
+import rospy
+import numpy
+
+from mrs_msgs.msg import ControlManagerDiagnostics,Reference
+from mrs_msgs.srv import PathSrv,PathSrvRequest
+from mrs_msgs.srv import Vec1,Vec1Response
+
+class Node:
+
+ # #{ __init__(self)
+
+ def __init__(self):
+
+ rospy.init_node("sweeping_generator", anonymous=True)
+
+ ## | --------------------- load parameters -------------------- |
+
+ self.frame_id = rospy.get_param("~frame_id")
+
+ self.center_x = rospy.get_param("~center/x")
+ self.center_y = rospy.get_param("~center/y")
+ self.center_z = rospy.get_param("~center/z")
+
+ self.dimensions_x = rospy.get_param("~dimensions/x")
+ self.dimensions_y = rospy.get_param("~dimensions/y")
+
+ self.timer_main_rate = rospy.get_param("~timer_main/rate")
+
+ rospy.loginfo('[SweepingGenerator]: initialized')
+
+ ## | ----------------------- subscribers ---------------------- |
+
+ self.sub_control_manager_diag = rospy.Subscriber("~control_manager_diag_in", ControlManagerDiagnostics, self.callbackControlManagerDiagnostics)
+
+ ## | --------------------- service servers -------------------- |
+
+ self.ss_start = rospy.Service('~start_in', Vec1, self.callbackStart)
+
+ ## | --------------------- service clients -------------------- |
+
+ self.sc_path = rospy.ServiceProxy('~path_out', PathSrv)
+
+ ## | ------------------------- timers ------------------------- |
+
+ self.timer_main = rospy.Timer(rospy.Duration(1.0/self.timer_main_rate), self.timerMain)
+
+ ## | -------------------- spin till the end ------------------- |
+
+ self.is_initialized = True
+
+ rospy.spin()
+
+ # #} end of __init__()
+
+ ## | ------------------------- methods ------------------------ |
+
+ # #{ planPath()
+
+ def planPath(self, step_size):
+
+ rospy.loginfo('[SweepingGenerator]: planning path')
+
+ # https://ctu-mrs.github.io/mrs_msgs/srv/PathSrv.html
+ # -> https://ctu-mrs.github.io/mrs_msgs/msg/Path.html
+ path_msg = PathSrvRequest()
+
+ path_msg.path.header.frame_id = self.frame_id
+ path_msg.path.header.stamp = rospy.Time.now()
+
+ path_msg.path.fly_now = True
+
+ path_msg.path.use_heading = True
+
+ sign = 1.0
+
+ # fill in the path with a sweeping pattern
+ for i in numpy.arange(-self.dimensions_x/2.0, self.dimensions_x/2.0, step_size):
+
+ for j in numpy.arange(-self.dimensions_y/2.0, self.dimensions_y/2.0, step_size):
+
+ # https://ctu-mrs.github.io/mrs_msgs/msg/Reference.html
+ point = Reference()
+
+ point.position.x = self.center_x + i
+ point.position.y = self.center_y + j*sign
+ point.position.z = self.center_z
+ point.heading = 0.0
+
+ path_msg.path.points.append(point)
+
+ if sign > 0.0:
+ sign = -1.0
+ else:
+ sign = 1.0
+
+ return path_msg
+
+ # #} end of planPath()
+
+ ## | ------------------------ callbacks ----------------------- |
+
+ # #{ callbackControlManagerDiagnostics():
+
+ def callbackControlManagerDiagnostics(self, msg):
+
+ if not self.is_initialized:
+ return
+
+ rospy.loginfo_once('[SweepingGenerator]: getting ControlManager diagnostics')
+
+ self.sub_control_manager_diag = msg
+
+ # #} end of
+
+ # #{ callbackStart():
+
+ def callbackStart(self, req):
+
+ if not self.is_initialized:
+ return Vec1Response(False, "not initialized")
+
+ # set the step size based on the service data
+ step_size = req.goal
+
+ path_msg = self.planPath(step_size)
+
+ try:
+ response = self.sc_path.call(path_msg)
+ except:
+ rospy.logerr('[SweepingGenerator]: path service not callable')
+ pass
+
+ if response.success:
+ rospy.loginfo('[SweepingGenerator]: path set')
+ else:
+ rospy.loginfo('[SweepingGenerator]: path setting failed, message: {}'.format(response.message))
+
+ return Vec1Response(True, "starting")
+
+ # #} end of
+
+ ## | ------------------------- timers ------------------------- |
+
+ # #{ timerMain()
+
+ def timerMain(self, event=None):
+
+ if not self.is_initialized:
+ return
+
+ rospy.loginfo_once('[SweepingGenerator]: main timer spinning')
+
+ if isinstance(self.sub_control_manager_diag, ControlManagerDiagnostics):
+ if self.sub_control_manager_diag.tracker_status.have_goal:
+ rospy.loginfo('[SweepingGenerator]: tracker has goal')
+ else:
+ rospy.loginfo('[SweepingGenerator]: waiting for command')
+
+ # #} end of timerMain()
+
+if __name__ == '__main__':
+ try:
+ node = Node()
+ except rospy.ROSInterruptException:
+ pass
diff --git a/python/sweeping_generator/tmux/config/automatic_start.yaml b/python/sweeping_generator/tmux/config/automatic_start.yaml
new file mode 100644
index 0000000..d351868
--- /dev/null
+++ b/python/sweeping_generator/tmux/config/automatic_start.yaml
@@ -0,0 +1,5 @@
+# A timeout between the takeoff being triggered and the UAV actually taking off
+# while the timeout is counting down, the takeoff can be aborted by switching off
+# the offboard mode.
+# default = 5 sec
+safety_timeout: 1.0 # [s]
diff --git a/python/sweeping_generator/tmux/config/custom_config.yaml b/python/sweeping_generator/tmux/config/custom_config.yaml
new file mode 100644
index 0000000..c1f518c
--- /dev/null
+++ b/python/sweeping_generator/tmux/config/custom_config.yaml
@@ -0,0 +1,39 @@
+# GET ALL PARAMETERS USABLE FOR CUSTOM CONFIG BY RUNNING:
+## --------------------------------------------------------------
+## | rosrun mrs_uav_core get_public_params.py #
+## --------------------------------------------------------------
+
+mrs_uav_managers:
+
+ estimation_manager:
+
+ # loaded state estimator plugins
+ state_estimators: [
+ "gps_garmin",
+ "gps_baro",
+ ]
+
+ initial_state_estimator: "gps_baro" # will be used as the first state estimator
+ agl_height_estimator: "garmin_agl" # only slightly filtered height for checking min height (not used in control feedback)
+
+ uav_manager:
+
+ takeoff:
+
+ during_takeoff:
+ controller: "MpcController"
+ tracker: "LandoffTracker"
+
+ after_takeoff:
+ controller: "Se3Controller"
+ tracker: "MpcTracker"
+
+ midair_activation:
+
+ during_activation:
+ controller: "MidairActivationController"
+ tracker: "MidairActivationTracker"
+
+ after_activation:
+ controller: "Se3Controller"
+ tracker: "MpcTracker"
diff --git a/python/sweeping_generator/tmux/config/hw_api.yaml b/python/sweeping_generator/tmux/config/hw_api.yaml
new file mode 100644
index 0000000..30a6919
--- /dev/null
+++ b/python/sweeping_generator/tmux/config/hw_api.yaml
@@ -0,0 +1,28 @@
+input_mode:
+ actuators: false
+ control_group: false
+ attitude_rate: true
+ attitude: true
+ acceleration_hdg_rate: false
+ acceleration_hdg: false
+ velocity_hdg_rate: false
+ velocity_hdg: false
+ position: false
+
+ feedforward: true
+
+outputs:
+ distance_sensor: true
+ gnss: true
+ rtk: true
+ imu: true
+ altitude: true
+ magnetometer_heading: true
+ rc_channels: true
+ battery_state: true
+ position: true
+ orientation: true
+ velocity: true
+ angular_velocity: true
+ odometry: true
+ ground_truth: true
diff --git a/python/sweeping_generator/tmux/config/network_config.yaml b/python/sweeping_generator/tmux/config/network_config.yaml
new file mode 100644
index 0000000..88d3e9f
--- /dev/null
+++ b/python/sweeping_generator/tmux/config/network_config.yaml
@@ -0,0 +1,20 @@
+# 1. This list is used by NimbroNetwork for mutual communication of the UAVs
+# The names of the robots have to match hostnames described in /etc/hosts.
+#
+# 2. This list is used by MpcTracker for mutual collision avoidance of the UAVs.
+# The names should match the true "UAV_NAMES" (the topic prefixes).
+#
+# network_config:=~/config/network_config.yaml
+#
+# to the core.launch and nimbro.launch.
+
+network:
+
+ robot_names: [
+
+ uav1,
+ uav2,
+ uav3,
+ uav4,
+
+ ]
diff --git a/python/sweeping_generator/tmux/config/simulator.yaml b/python/sweeping_generator/tmux/config/simulator.yaml
new file mode 100644
index 0000000..7f7346a
--- /dev/null
+++ b/python/sweeping_generator/tmux/config/simulator.yaml
@@ -0,0 +1,20 @@
+simulation_rate: 250
+clock_rate: 250
+realtime_factor: 1.0
+
+iterate_without_input: true
+
+individual_takeoff_platform:
+ enabled: false
+
+uav_names: [
+ "uav1",
+]
+
+uav1:
+ type: "x500"
+ spawn:
+ x: 10.0
+ y: 15.0
+ z: 2.0
+ heading: 0
diff --git a/python/sweeping_generator/tmux/config/world_config.yaml b/python/sweeping_generator/tmux/config/world_config.yaml
new file mode 100644
index 0000000..9b55067
--- /dev/null
+++ b/python/sweeping_generator/tmux/config/world_config.yaml
@@ -0,0 +1,34 @@
+world_origin:
+
+ units: "LATLON" # {"UTM, "LATLON"}
+
+ origin_x: 47.397743
+ origin_y: 8.545594
+
+safety_area:
+
+ enabled: true
+
+ horizontal:
+
+ # the frame of reference in which the points are expressed
+ frame_name: "world_origin"
+
+ # polygon
+ #
+ # x, y [m] for any frame_name except latlon_origin
+ # x = latitude, y = longitude [deg] for frame_name=="latlon_origin"
+ points: [
+ -50, -50,
+ 50, -50,
+ 50, 50,
+ -50, 50,
+ ]
+
+ vertical:
+
+ # the frame of reference in which the max&min z is expressed
+ frame_name: "world_origin"
+
+ max_z: 15.0
+ min_z: 0.5
diff --git a/python/sweeping_generator/tmux/kill.sh b/python/sweeping_generator/tmux/kill.sh
new file mode 100755
index 0000000..28d50b0
--- /dev/null
+++ b/python/sweeping_generator/tmux/kill.sh
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+# Absolute path to this script. /home/user/bin/foo.sh
+SCRIPT=$(readlink -f $0)
+# Absolute path this script is in. /home/user/bin
+SCRIPTPATH=`dirname $SCRIPT`
+cd "$SCRIPTPATH"
+
+export TMUX_SESSION_NAME=simulation
+export TMUX_SOCKET_NAME=mrs
+
+# just attach to the session
+tmux -L $TMUX_SOCKET_NAME split-window -t $TMUX_SESSION_NAME
+tmux -L $TMUX_SOCKET_NAME send-keys -t $TMUX_SESSION_NAME "sleep 1; tmux list-panes -s -F \"#{pane_pid} #{pane_current_command}\" | grep -v tmux | cut -d\" \" -f1 | while read in; do killp \$in; done; exit" ENTER
diff --git a/python/sweeping_generator/tmux/layout.json b/python/sweeping_generator/tmux/layout.json
new file mode 100644
index 0000000..5664ebd
--- /dev/null
+++ b/python/sweeping_generator/tmux/layout.json
@@ -0,0 +1,50 @@
+[
+{
+ "border": "normal",
+ "floating": "auto_off",
+ "fullscreen_mode": 0,
+ "layout": "splitv",
+ "percent": 0.285714285714286,
+ "type": "con",
+ "nodes": [
+ {
+ "border": "pixel",
+ "current_border_width": 3,
+ "floating": "auto_off",
+ "geometry": {
+ "height": 1030,
+ "width": 936,
+ "x": 4806,
+ "y": 32
+ },
+ "name": "rviz.rviz* - RViz",
+ "percent": 0.5,
+ "swallows": [
+ {
+ "instance": "^rviz$"
+ }
+ ],
+ "type": "con"
+ },
+ {
+ "border": "pixel",
+ "current_border_width": 3,
+ "floating": "auto_off",
+ "geometry": {
+ "height": 460,
+ "width": 724,
+ "x": 0,
+ "y": 0
+ },
+ "name": "./start.sh",
+ "percent": 0.5,
+ "swallows": [
+ {
+ "instance": "^urxvt$"
+ }
+ ],
+ "type": "con"
+ }
+ ]
+}
+]
diff --git a/python/sweeping_generator/tmux/session.yml b/python/sweeping_generator/tmux/session.yml
new file mode 100644
index 0000000..0e107e5
--- /dev/null
+++ b/python/sweeping_generator/tmux/session.yml
@@ -0,0 +1,54 @@
+# do not modify these
+root: ./
+name: simulation
+socket_name: mrs
+attach: false
+tmux_options: -f /etc/ctu-mrs/tmux.conf
+# you can modify these
+pre_window: export UAV_NAME=uav1; export RUN_TYPE=simulation; export UAV_TYPE=x500
+startup_window: sweeping_generator
+windows:
+ - roscore:
+ layout: tiled
+ panes:
+ - roscore
+ - simulator:
+ layout: tiled
+ panes:
+ - waitForRos; roslaunch mrs_multirotor_simulator multirotor_simulator.launch custom_config:=./config/simulator.yaml
+ - hw_api:
+ layout: tiled
+ panes:
+ - waitForTime; roslaunch mrs_multirotor_simulator hw_api.launch custom_config:=./config/hw_api.yaml
+ - takeoff:
+ layout: tiled
+ panes:
+ - waitForHw; roslaunch mrs_uav_autostart automatic_start.launch custom_config:=./config/automatic_start.yaml
+ - waitForControl; rosservice call /$UAV_NAME/hw_api/arming 1; sleep 2; rosservice call /$UAV_NAME/hw_api/offboard
+ - status:
+ layout: tiled
+ panes:
+ - waitForHw; roslaunch mrs_uav_status status.launch
+ - control:
+ layout: tiled
+ panes:
+ - waitForHw; roslaunch mrs_uav_core core.launch
+ platform_config:=`rospack find mrs_multirotor_simulator`/config/mrs_uav_system/$UAV_TYPE.yaml
+ custom_config:=./config/custom_config.yaml
+ world_config:=./config/world_config.yaml
+ network_config:=./config/network_config.yaml
+ - sweeping_generator:
+ layout: tiled
+ panes:
+ - waitForControl; roslaunch example_sweeping_generator sweeping_generator.launch
+ - 'history -s rosservice call /$UAV_NAME/sweeping_generator/start 3.0'
+ - rviz:
+ layout: tiled
+ panes:
+ - waitForControl; roslaunch mrs_uav_core rviz.launch
+ - waitForControl; roslaunch mrs_rviz_plugins load_robot.launch
+ - waitForControl; waitForControl; roslaunch mrs_rviz_plugins rviz_interface.launch
+ - layout:
+ layout: tiled
+ panes:
+ - waitForControl; sleep 5; ~/.i3/layout_manager.sh ./layout.json
diff --git a/python/sweeping_generator/tmux/start.sh b/python/sweeping_generator/tmux/start.sh
new file mode 100755
index 0000000..5bb2275
--- /dev/null
+++ b/python/sweeping_generator/tmux/start.sh
@@ -0,0 +1,27 @@
+#!/bin/bash
+
+# Absolute path to this script. /home/user/bin/foo.sh
+SCRIPT=$(readlink -f $0)
+# Absolute path this script is in. /home/user/bin
+SCRIPTPATH=`dirname $SCRIPT`
+cd "$SCRIPTPATH"
+
+export TMUX_SESSION_NAME=simulation
+export TMUX_SOCKET_NAME=mrs
+
+# start tmuxinator
+tmuxinator start -p ./session.yml
+
+# if we are not in tmux
+if [ -z $TMUX ]; then
+
+ # just attach to the session
+ tmux -L $TMUX_SOCKET_NAME a -t $TMUX_SESSION_NAME
+
+# if we are in tmux
+else
+
+ # switch to the newly-started session
+ tmux detach-client -E "tmux -L $TMUX_SOCKET_NAME a -t $TMUX_SESSION_NAME"
+
+fi
diff --git a/tracker_plugin/README.md b/tracker_plugin/README.md
deleted file mode 100644
index 5583fa7..0000000
--- a/tracker_plugin/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# example_tracker_plugin
-
-Example tracker plugin for the MRS Control Manager.