From a4adef4c88f1013a94afc13c8a82480730243330 Mon Sep 17 00:00:00 2001 From: klaxalk Date: Thu, 18 Apr 2024 23:11:40 +0000 Subject: [PATCH] deploy: 0759e326235aed1121bb343f9bc305782ef3c2eb --- .nojekyll | 0 amber.png | Bin 0 -> 141 bytes badge.svg | 1 + emerald.png | Bin 0 -> 141 bytes gcov.css | 519 + glass.png | Bin 0 -> 167 bytes index-sort-f.html | 612 ++ index-sort-l.html | 612 ++ index.html | 612 ++ .../attitude_converter.h.func-sort-c.html | 124 + .../mrs_lib/attitude_converter.h.func.html | 124 + .../attitude_converter.h.gcov.frameset.html | 19 + .../mrs_lib/attitude_converter.h.gcov.html | 617 ++ .../attitude_converter.h.gcov.overview.html | 154 + .../mrs_lib/attitude_converter.h.gcov.png | Bin 0 -> 1675 bytes ...dynamic_reconfigure_mgr.h.func-sort-c.html | 420 + .../dynamic_reconfigure_mgr.h.func.html | 420 + ...namic_reconfigure_mgr.h.gcov.frameset.html | 19 + .../dynamic_reconfigure_mgr.h.gcov.html | 343 + ...namic_reconfigure_mgr.h.gcov.overview.html | 85 + .../dynamic_reconfigure_mgr.h.gcov.png | Bin 0 -> 1370 bytes .../geometry/cyclic.h.func-sort-c.html | 548 + .../mrs_lib/geometry/cyclic.h.func.html | 548 + .../geometry/cyclic.h.gcov.frameset.html | 19 + .../mrs_lib/geometry/cyclic.h.gcov.html | 612 ++ .../geometry/cyclic.h.gcov.overview.html | 152 + .../mrs_lib/geometry/cyclic.h.gcov.png | Bin 0 -> 2145 bytes .../mrs_lib/geometry/index-detail-sort-f.html | 128 + .../mrs_lib/geometry/index-detail-sort-l.html | 128 + .../mrs_lib/geometry/index-detail.html | 128 + .../mrs_lib/geometry/index-sort-f.html | 112 + .../mrs_lib/geometry/index-sort-l.html | 112 + mrs_lib/include/mrs_lib/geometry/index.html | 112 + .../mrs_lib/geometry/misc.h.func-sort-c.html | 92 + .../include/mrs_lib/geometry/misc.h.func.html | 92 + .../geometry/misc.h.gcov.frameset.html | 19 + .../include/mrs_lib/geometry/misc.h.gcov.html | 408 + .../geometry/misc.h.gcov.overview.html | 101 + .../include/mrs_lib/geometry/misc.h.gcov.png | Bin 0 -> 1071 bytes .../gps_conversions.h.func-sort-c.html | 96 + .../mrs_lib/gps_conversions.h.func.html | 96 + .../gps_conversions.h.gcov.frameset.html | 19 + .../mrs_lib/gps_conversions.h.gcov.html | 387 + .../gps_conversions.h.gcov.overview.html | 96 + .../mrs_lib/gps_conversions.h.gcov.png | Bin 0 -> 1579 bytes .../mrs_lib/impl/index-detail-sort-f.html | 236 + .../mrs_lib/impl/index-detail-sort-l.html | 236 + .../include/mrs_lib/impl/index-detail.html | 236 + .../include/mrs_lib/impl/index-sort-f.html | 172 + .../include/mrs_lib/impl/index-sort-l.html | 172 + mrs_lib/include/mrs_lib/impl/index.html | 172 + .../impl/param_provider.hpp.func-sort-c.html | 144 + .../mrs_lib/impl/param_provider.hpp.func.html | 144 + .../param_provider.hpp.gcov.frameset.html | 19 + .../mrs_lib/impl/param_provider.hpp.gcov.html | 132 + .../param_provider.hpp.gcov.overview.html | 32 + .../mrs_lib/impl/param_provider.hpp.gcov.png | Bin 0 -> 347 bytes .../publisher_handler.hpp.func-sort-c.html | 888 ++ .../impl/publisher_handler.hpp.func.html | 888 ++ .../publisher_handler.hpp.gcov.frameset.html | 19 + .../impl/publisher_handler.hpp.gcov.html | 332 + .../publisher_handler.hpp.gcov.overview.html | 82 + .../impl/publisher_handler.hpp.gcov.png | Bin 0 -> 798 bytes ...ervice_client_handler.hpp.func-sort-c.html | 268 + .../impl/service_client_handler.hpp.func.html | 268 + ...vice_client_handler.hpp.gcov.frameset.html | 19 + .../impl/service_client_handler.hpp.gcov.html | 403 + ...vice_client_handler.hpp.gcov.overview.html | 100 + .../impl/service_client_handler.hpp.gcov.png | Bin 0 -> 969 bytes .../subscribe_handler.hpp.func-sort-c.html | 4256 ++++++++ .../impl/subscribe_handler.hpp.func.html | 4256 ++++++++ .../subscribe_handler.hpp.gcov.frameset.html | 19 + .../impl/subscribe_handler.hpp.gcov.html | 413 + .../subscribe_handler.hpp.gcov.overview.html | 103 + .../impl/subscribe_handler.hpp.gcov.png | Bin 0 -> 1372 bytes .../mrs_lib/impl/timer.hpp.func-sort-c.html | 92 + .../include/mrs_lib/impl/timer.hpp.func.html | 92 + .../mrs_lib/impl/timer.hpp.gcov.frameset.html | 19 + .../include/mrs_lib/impl/timer.hpp.gcov.html | 180 + .../mrs_lib/impl/timer.hpp.gcov.overview.html | 44 + .../include/mrs_lib/impl/timer.hpp.gcov.png | Bin 0 -> 532 bytes .../impl/transformer.hpp.func-sort-c.html | 272 + .../mrs_lib/impl/transformer.hpp.func.html | 272 + .../impl/transformer.hpp.gcov.frameset.html | 19 + .../mrs_lib/impl/transformer.hpp.gcov.html | 280 + .../impl/transformer.hpp.gcov.overview.html | 69 + .../mrs_lib/impl/transformer.hpp.gcov.png | Bin 0 -> 841 bytes .../mrs_lib/impl/ukf.hpp.func-sort-c.html | 128 + .../include/mrs_lib/impl/ukf.hpp.func.html | 128 + .../mrs_lib/impl/ukf.hpp.gcov.frameset.html | 19 + .../include/mrs_lib/impl/ukf.hpp.gcov.html | 364 + .../mrs_lib/impl/ukf.hpp.gcov.overview.html | 90 + mrs_lib/include/mrs_lib/impl/ukf.hpp.gcov.png | Bin 0 -> 1198 bytes .../vector_converter.hpp.func-sort-c.html | 152 + .../impl/vector_converter.hpp.func.html | 152 + .../vector_converter.hpp.gcov.frameset.html | 19 + .../impl/vector_converter.hpp.gcov.html | 173 + .../vector_converter.hpp.gcov.overview.html | 43 + .../impl/vector_converter.hpp.gcov.png | Bin 0 -> 456 bytes .../include/mrs_lib/index-detail-sort-f.html | 444 + .../include/mrs_lib/index-detail-sort-l.html | 444 + mrs_lib/include/mrs_lib/index-detail.html | 444 + mrs_lib/include/mrs_lib/index-sort-f.html | 292 + mrs_lib/include/mrs_lib/index-sort-l.html | 292 + mrs_lib/include/mrs_lib/index.html | 292 + .../include/mrs_lib/lkf.h.func-sort-c.html | 268 + mrs_lib/include/mrs_lib/lkf.h.func.html | 268 + .../include/mrs_lib/lkf.h.gcov.frameset.html | 19 + mrs_lib/include/mrs_lib/lkf.h.gcov.html | 460 + .../include/mrs_lib/lkf.h.gcov.overview.html | 114 + mrs_lib/include/mrs_lib/lkf.h.gcov.png | Bin 0 -> 1750 bytes .../mrs_lib/msg_extractor.h.func-sort-c.html | 256 + .../include/mrs_lib/msg_extractor.h.func.html | 256 + .../msg_extractor.h.gcov.frameset.html | 19 + .../include/mrs_lib/msg_extractor.h.gcov.html | 775 ++ .../msg_extractor.h.gcov.overview.html | 193 + .../include/mrs_lib/msg_extractor.h.gcov.png | Bin 0 -> 1287 bytes .../include/mrs_lib/mutex.h.func-sort-c.html | 400 + mrs_lib/include/mrs_lib/mutex.h.func.html | 400 + .../mrs_lib/mutex.h.gcov.frameset.html | 19 + mrs_lib/include/mrs_lib/mutex.h.gcov.html | 260 + .../mrs_lib/mutex.h.gcov.overview.html | 64 + mrs_lib/include/mrs_lib/mutex.h.gcov.png | Bin 0 -> 739 bytes .../mrs_lib/param_loader.h.func-sort-c.html | 392 + .../include/mrs_lib/param_loader.h.func.html | 392 + .../mrs_lib/param_loader.h.gcov.frameset.html | 19 + .../include/mrs_lib/param_loader.h.gcov.html | 1452 +++ .../mrs_lib/param_loader.h.gcov.overview.html | 362 + .../include/mrs_lib/param_loader.h.gcov.png | Bin 0 -> 4406 bytes .../publisher_handler.h.func-sort-c.html | 556 ++ .../mrs_lib/publisher_handler.h.func.html | 556 ++ .../publisher_handler.h.gcov.frameset.html | 19 + .../mrs_lib/publisher_handler.h.gcov.html | 256 + .../publisher_handler.h.gcov.overview.html | 63 + .../mrs_lib/publisher_handler.h.gcov.png | Bin 0 -> 572 bytes ...uadratic_throttle_model.h.func-sort-c.html | 88 + .../quadratic_throttle_model.h.func.html | 88 + ...dratic_throttle_model.h.gcov.frameset.html | 19 + .../quadratic_throttle_model.h.gcov.html | 117 + ...dratic_throttle_model.h.gcov.overview.html | 29 + .../quadratic_throttle_model.h.gcov.png | Bin 0 -> 246 bytes .../mrs_lib/repredictor.h.func-sort-c.html | 256 + .../include/mrs_lib/repredictor.h.func.html | 256 + .../mrs_lib/repredictor.h.gcov.frameset.html | 19 + .../include/mrs_lib/repredictor.h.gcov.html | 637 ++ .../mrs_lib/repredictor.h.gcov.overview.html | 159 + .../include/mrs_lib/repredictor.h.gcov.png | Bin 0 -> 2387 bytes .../safety_zone/index-detail-sort-f.html | 112 + .../safety_zone/index-detail-sort-l.html | 112 + .../mrs_lib/safety_zone/index-detail.html | 112 + .../mrs_lib/safety_zone/index-sort-f.html | 112 + .../mrs_lib/safety_zone/index-sort-l.html | 112 + .../include/mrs_lib/safety_zone/index.html | 112 + .../safety_zone/polygon.h.func-sort-c.html | 92 + .../mrs_lib/safety_zone/polygon.h.func.html | 92 + .../safety_zone/polygon.h.gcov.frameset.html | 19 + .../mrs_lib/safety_zone/polygon.h.gcov.html | 136 + .../safety_zone/polygon.h.gcov.overview.html | 33 + .../mrs_lib/safety_zone/polygon.h.gcov.png | Bin 0 -> 337 bytes .../safety_zone.h.func-sort-c.html | 84 + .../safety_zone/safety_zone.h.func.html | 84 + .../safety_zone.h.gcov.frameset.html | 19 + .../safety_zone/safety_zone.h.gcov.html | 121 + .../safety_zone.h.gcov.overview.html | 30 + .../safety_zone/safety_zone.h.gcov.png | Bin 0 -> 280 bytes .../mrs_lib/scope_timer.h.func-sort-c.html | 92 + .../include/mrs_lib/scope_timer.h.func.html | 92 + .../mrs_lib/scope_timer.h.gcov.frameset.html | 19 + .../include/mrs_lib/scope_timer.h.gcov.html | 248 + .../mrs_lib/scope_timer.h.gcov.overview.html | 61 + .../include/mrs_lib/scope_timer.h.gcov.png | Bin 0 -> 777 bytes .../service_client_handler.h.func-sort-c.html | 176 + .../service_client_handler.h.func.html | 176 + ...ervice_client_handler.h.gcov.frameset.html | 19 + .../service_client_handler.h.gcov.html | 327 + ...ervice_client_handler.h.gcov.overview.html | 81 + .../mrs_lib/service_client_handler.h.gcov.png | Bin 0 -> 689 bytes .../subscribe_handler.h.func-sort-c.html | 3044 ++++++ .../mrs_lib/subscribe_handler.h.func.html | 3044 ++++++ .../subscribe_handler.h.gcov.frameset.html | 19 + .../mrs_lib/subscribe_handler.h.gcov.html | 548 + .../subscribe_handler.h.gcov.overview.html | 136 + .../mrs_lib/subscribe_handler.h.gcov.png | Bin 0 -> 1783 bytes .../timeout_manager.h.func-sort-c.html | 80 + .../mrs_lib/timeout_manager.h.func.html | 80 + .../timeout_manager.h.gcov.frameset.html | 19 + .../mrs_lib/timeout_manager.h.gcov.html | 169 + .../timeout_manager.h.gcov.overview.html | 42 + .../mrs_lib/timeout_manager.h.gcov.png | Bin 0 -> 435 bytes .../include/mrs_lib/timer.h.func-sort-c.html | 108 + mrs_lib/include/mrs_lib/timer.h.func.html | 108 + .../mrs_lib/timer.h.gcov.frameset.html | 19 + mrs_lib/include/mrs_lib/timer.h.gcov.html | 355 + .../mrs_lib/timer.h.gcov.overview.html | 88 + mrs_lib/include/mrs_lib/timer.h.gcov.png | Bin 0 -> 935 bytes .../mrs_lib/transformer.h.func-sort-c.html | 152 + .../include/mrs_lib/transformer.h.func.html | 152 + .../mrs_lib/transformer.h.gcov.frameset.html | 19 + .../include/mrs_lib/transformer.h.gcov.html | 764 ++ .../mrs_lib/transformer.h.gcov.overview.html | 190 + .../include/mrs_lib/transformer.h.gcov.png | Bin 0 -> 2328 bytes .../include/mrs_lib/ukf.h.func-sort-c.html | 88 + mrs_lib/include/mrs_lib/ukf.h.func.html | 88 + .../include/mrs_lib/ukf.h.gcov.frameset.html | 19 + mrs_lib/include/mrs_lib/ukf.h.gcov.html | 285 + .../include/mrs_lib/ukf.h.gcov.overview.html | 71 + mrs_lib/include/mrs_lib/ukf.h.gcov.png | Bin 0 -> 1009 bytes .../include/mrs_lib/utils.h.func-sort-c.html | 100 + mrs_lib/include/mrs_lib/utils.h.func.html | 100 + .../mrs_lib/utils.h.gcov.frameset.html | 19 + mrs_lib/include/mrs_lib/utils.h.gcov.html | 229 + .../mrs_lib/utils.h.gcov.overview.html | 57 + mrs_lib/include/mrs_lib/utils.h.gcov.png | Bin 0 -> 677 bytes .../vector_converter.h.func-sort-c.html | 224 + .../mrs_lib/vector_converter.h.func.html | 224 + .../vector_converter.h.gcov.frameset.html | 19 + .../mrs_lib/vector_converter.h.gcov.html | 128 + .../vector_converter.h.gcov.overview.html | 31 + .../mrs_lib/vector_converter.h.gcov.png | Bin 0 -> 366 bytes .../mrs_lib/visual_object.h.func-sort-c.html | 84 + .../include/mrs_lib/visual_object.h.func.html | 84 + .../visual_object.h.gcov.frameset.html | 19 + .../include/mrs_lib/visual_object.h.gcov.html | 186 + .../visual_object.h.gcov.overview.html | 46 + .../include/mrs_lib/visual_object.h.gcov.png | Bin 0 -> 493 bytes .../attitude_converter.cpp.func-sort-c.html | 244 + .../attitude_converter.cpp.func.html | 244 + .../attitude_converter.cpp.gcov.frameset.html | 19 + .../attitude_converter.cpp.gcov.html | 561 ++ .../attitude_converter.cpp.gcov.overview.html | 140 + .../attitude_converter.cpp.gcov.png | Bin 0 -> 1533 bytes .../index-detail-sort-f.html | 110 + .../index-detail-sort-l.html | 110 + .../src/attitude_converter/index-detail.html | 110 + .../src/attitude_converter/index-sort-f.html | 102 + .../src/attitude_converter/index-sort-l.html | 102 + mrs_lib/src/attitude_converter/index.html | 102 + .../batch_visualizer.cpp.func-sort-c.html | 172 + .../batch_visualizer.cpp.func.html | 172 + .../batch_visualizer.cpp.gcov.frameset.html | 19 + .../batch_visualizer.cpp.gcov.html | 440 + .../batch_visualizer.cpp.gcov.overview.html | 109 + .../batch_visualizer.cpp.gcov.png | Bin 0 -> 1265 bytes .../batch_visualizer/index-detail-sort-f.html | 128 + .../batch_visualizer/index-detail-sort-l.html | 128 + .../src/batch_visualizer/index-detail.html | 128 + .../src/batch_visualizer/index-sort-f.html | 112 + .../src/batch_visualizer/index-sort-l.html | 112 + mrs_lib/src/batch_visualizer/index.html | 112 + .../visual_object.cpp.func-sort-c.html | 168 + .../visual_object.cpp.func.html | 168 + .../visual_object.cpp.gcov.frameset.html | 19 + .../visual_object.cpp.gcov.html | 435 + .../visual_object.cpp.gcov.overview.html | 108 + .../visual_object.cpp.gcov.png | Bin 0 -> 1229 bytes .../geometry/conversions.cpp.func-sort-c.html | 120 + .../src/geometry/conversions.cpp.func.html | 120 + .../conversions.cpp.gcov.frameset.html | 19 + .../src/geometry/conversions.cpp.gcov.html | 178 + .../conversions.cpp.gcov.overview.html | 44 + mrs_lib/src/geometry/conversions.cpp.gcov.png | Bin 0 -> 446 bytes mrs_lib/src/geometry/index-detail-sort-f.html | 138 + mrs_lib/src/geometry/index-detail-sort-l.html | 138 + mrs_lib/src/geometry/index-detail.html | 138 + mrs_lib/src/geometry/index-sort-f.html | 122 + mrs_lib/src/geometry/index-sort-l.html | 122 + mrs_lib/src/geometry/index.html | 122 + .../src/geometry/misc.cpp.func-sort-c.html | 144 + mrs_lib/src/geometry/misc.cpp.func.html | 144 + .../src/geometry/misc.cpp.gcov.frameset.html | 19 + mrs_lib/src/geometry/misc.cpp.gcov.html | 269 + .../src/geometry/misc.cpp.gcov.overview.html | 67 + mrs_lib/src/geometry/misc.cpp.gcov.png | Bin 0 -> 747 bytes .../src/geometry/shapes.cpp.func-sort-c.html | 352 + mrs_lib/src/geometry/shapes.cpp.func.html | 352 + .../geometry/shapes.cpp.gcov.frameset.html | 19 + mrs_lib/src/geometry/shapes.cpp.gcov.html | 730 ++ .../geometry/shapes.cpp.gcov.overview.html | 182 + mrs_lib/src/geometry/shapes.cpp.gcov.png | Bin 0 -> 1596 bytes mrs_lib/src/math/index-detail-sort-f.html | 110 + mrs_lib/src/math/index-detail-sort-l.html | 110 + mrs_lib/src/math/index-detail.html | 110 + mrs_lib/src/math/index-sort-f.html | 102 + mrs_lib/src/math/index-sort-l.html | 102 + mrs_lib/src/math/index.html | 102 + mrs_lib/src/math/math.cpp.func-sort-c.html | 84 + mrs_lib/src/math/math.cpp.func.html | 84 + mrs_lib/src/math/math.cpp.gcov.frameset.html | 19 + mrs_lib/src/math/math.cpp.gcov.html | 149 + mrs_lib/src/math/math.cpp.gcov.overview.html | 37 + mrs_lib/src/math/math.cpp.gcov.png | Bin 0 -> 388 bytes .../median_filter/index-detail-sort-f.html | 110 + .../median_filter/index-detail-sort-l.html | 110 + mrs_lib/src/median_filter/index-detail.html | 110 + mrs_lib/src/median_filter/index-sort-f.html | 102 + mrs_lib/src/median_filter/index-sort-l.html | 102 + mrs_lib/src/median_filter/index.html | 102 + .../median_filter.cpp.func-sort-c.html | 148 + .../median_filter/median_filter.cpp.func.html | 148 + .../median_filter.cpp.gcov.frameset.html | 19 + .../median_filter/median_filter.cpp.gcov.html | 286 + .../median_filter.cpp.gcov.overview.html | 71 + .../median_filter/median_filter.cpp.gcov.png | Bin 0 -> 872 bytes .../src/param_loader/index-detail-sort-f.html | 110 + .../src/param_loader/index-detail-sort-l.html | 110 + mrs_lib/src/param_loader/index-detail.html | 110 + mrs_lib/src/param_loader/index-sort-f.html | 102 + mrs_lib/src/param_loader/index-sort-l.html | 102 + mrs_lib/src/param_loader/index.html | 102 + .../param_provider.cpp.func-sort-c.html | 96 + .../param_loader/param_provider.cpp.func.html | 96 + .../param_provider.cpp.gcov.frameset.html | 19 + .../param_loader/param_provider.cpp.gcov.html | 200 + .../param_provider.cpp.gcov.overview.html | 49 + .../param_loader/param_provider.cpp.gcov.png | Bin 0 -> 659 bytes mrs_lib/src/profiler/index-detail-sort-f.html | 110 + mrs_lib/src/profiler/index-detail-sort-l.html | 110 + mrs_lib/src/profiler/index-detail.html | 110 + mrs_lib/src/profiler/index-sort-f.html | 102 + mrs_lib/src/profiler/index-sort-l.html | 102 + mrs_lib/src/profiler/index.html | 102 + .../profiler/profiler.cpp.func-sort-c.html | 120 + mrs_lib/src/profiler/profiler.cpp.func.html | 120 + .../profiler/profiler.cpp.gcov.frameset.html | 19 + mrs_lib/src/profiler/profiler.cpp.gcov.html | 301 + .../profiler/profiler.cpp.gcov.overview.html | 75 + mrs_lib/src/profiler/profiler.cpp.gcov.png | Bin 0 -> 841 bytes .../src/safety_zone/index-detail-sort-f.html | 128 + .../src/safety_zone/index-detail-sort-l.html | 128 + mrs_lib/src/safety_zone/index-detail.html | 128 + mrs_lib/src/safety_zone/index-sort-f.html | 112 + mrs_lib/src/safety_zone/index-sort-l.html | 112 + mrs_lib/src/safety_zone/index.html | 112 + .../line_operations.cpp.func-sort-c.html | 92 + .../safety_zone/line_operations.cpp.func.html | 92 + .../line_operations.cpp.gcov.frameset.html | 19 + .../safety_zone/line_operations.cpp.gcov.html | 143 + .../line_operations.cpp.gcov.overview.html | 35 + .../safety_zone/line_operations.cpp.gcov.png | Bin 0 -> 465 bytes .../polygon/index-detail-sort-f.html | 110 + .../polygon/index-detail-sort-l.html | 110 + .../src/safety_zone/polygon/index-detail.html | 110 + .../src/safety_zone/polygon/index-sort-f.html | 102 + .../src/safety_zone/polygon/index-sort-l.html | 102 + mrs_lib/src/safety_zone/polygon/index.html | 102 + .../polygon/polygon.cpp.func-sort-c.html | 112 + .../safety_zone/polygon/polygon.cpp.func.html | 112 + .../polygon/polygon.cpp.gcov.frameset.html | 19 + .../safety_zone/polygon/polygon.cpp.gcov.html | 290 + .../polygon/polygon.cpp.gcov.overview.html | 72 + .../safety_zone/polygon/polygon.cpp.gcov.png | Bin 0 -> 1057 bytes .../safety_zone.cpp.func-sort-c.html | 104 + .../src/safety_zone/safety_zone.cpp.func.html | 104 + .../safety_zone.cpp.gcov.frameset.html | 19 + .../src/safety_zone/safety_zone.cpp.gcov.html | 160 + .../safety_zone.cpp.gcov.overview.html | 39 + .../src/safety_zone/safety_zone.cpp.gcov.png | Bin 0 -> 380 bytes .../src/scope_timer/index-detail-sort-f.html | 110 + .../src/scope_timer/index-detail-sort-l.html | 110 + mrs_lib/src/scope_timer/index-detail.html | 110 + mrs_lib/src/scope_timer/index-sort-f.html | 102 + mrs_lib/src/scope_timer/index-sort-l.html | 102 + mrs_lib/src/scope_timer/index.html | 102 + .../scope_timer.cpp.func-sort-c.html | 120 + .../src/scope_timer/scope_timer.cpp.func.html | 120 + .../scope_timer.cpp.gcov.frameset.html | 19 + .../src/scope_timer/scope_timer.cpp.gcov.html | 345 + .../scope_timer.cpp.gcov.overview.html | 86 + .../src/scope_timer/scope_timer.cpp.gcov.png | Bin 0 -> 1280 bytes .../timeout_manager/index-detail-sort-f.html | 110 + .../timeout_manager/index-detail-sort-l.html | 110 + mrs_lib/src/timeout_manager/index-detail.html | 110 + mrs_lib/src/timeout_manager/index-sort-f.html | 102 + mrs_lib/src/timeout_manager/index-sort-l.html | 102 + mrs_lib/src/timeout_manager/index.html | 102 + .../timeout_manager.cpp.func-sort-c.html | 124 + .../timeout_manager.cpp.func.html | 124 + .../timeout_manager.cpp.gcov.frameset.html | 19 + .../timeout_manager.cpp.gcov.html | 186 + .../timeout_manager.cpp.gcov.overview.html | 46 + .../timeout_manager.cpp.gcov.png | Bin 0 -> 512 bytes mrs_lib/src/timer/index-detail-sort-f.html | 110 + mrs_lib/src/timer/index-detail-sort-l.html | 110 + mrs_lib/src/timer/index-detail.html | 110 + mrs_lib/src/timer/index-sort-f.html | 102 + mrs_lib/src/timer/index-sort-l.html | 102 + mrs_lib/src/timer/index.html | 102 + mrs_lib/src/timer/timer.cpp.func-sort-c.html | 152 + mrs_lib/src/timer/timer.cpp.func.html | 152 + .../src/timer/timer.cpp.gcov.frameset.html | 19 + mrs_lib/src/timer/timer.cpp.gcov.html | 364 + .../src/timer/timer.cpp.gcov.overview.html | 90 + mrs_lib/src/timer/timer.cpp.gcov.png | Bin 0 -> 1151 bytes .../index-detail-sort-f.html | 110 + .../index-detail-sort-l.html | 110 + .../transform_broadcaster/index-detail.html | 110 + .../transform_broadcaster/index-sort-f.html | 102 + .../transform_broadcaster/index-sort-l.html | 102 + mrs_lib/src/transform_broadcaster/index.html | 102 + ...transform_broadcaster.cpp.func-sort-c.html | 92 + .../transform_broadcaster.cpp.func.html | 92 + ...ansform_broadcaster.cpp.gcov.frameset.html | 19 + .../transform_broadcaster.cpp.gcov.html | 140 + ...ansform_broadcaster.cpp.gcov.overview.html | 34 + .../transform_broadcaster.cpp.gcov.png | Bin 0 -> 425 bytes .../src/transformer/index-detail-sort-f.html | 110 + .../src/transformer/index-detail-sort-l.html | 110 + mrs_lib/src/transformer/index-detail.html | 110 + mrs_lib/src/transformer/index-sort-f.html | 102 + mrs_lib/src/transformer/index-sort-l.html | 102 + mrs_lib/src/transformer/index.html | 102 + .../transformer.cpp.func-sort-c.html | 184 + .../src/transformer/transformer.cpp.func.html | 184 + .../transformer.cpp.gcov.frameset.html | 19 + .../src/transformer/transformer.cpp.gcov.html | 671 ++ .../transformer.cpp.gcov.overview.html | 167 + .../src/transformer/transformer.cpp.gcov.png | Bin 0 -> 1995 bytes mrs_lib/src/utils/index-detail-sort-f.html | 110 + mrs_lib/src/utils/index-detail-sort-l.html | 110 + mrs_lib/src/utils/index-detail.html | 110 + mrs_lib/src/utils/index-sort-f.html | 102 + mrs_lib/src/utils/index-sort-l.html | 102 + mrs_lib/src/utils/index.html | 102 + mrs_lib/src/utils/utils.cpp.func-sort-c.html | 88 + mrs_lib/src/utils/utils.cpp.func.html | 88 + .../src/utils/utils.cpp.gcov.frameset.html | 19 + mrs_lib/src/utils/utils.cpp.gcov.html | 101 + .../src/utils/utils.cpp.gcov.overview.html | 25 + mrs_lib/src/utils/utils.cpp.gcov.png | Bin 0 -> 194 bytes .../src/automatic_start.cpp.func-sort-c.html | 164 + .../src/automatic_start.cpp.func.html | 164 + .../automatic_start.cpp.gcov.frameset.html | 19 + .../src/automatic_start.cpp.gcov.html | 1049 ++ .../automatic_start.cpp.gcov.overview.html | 262 + .../src/automatic_start.cpp.gcov.png | Bin 0 -> 3128 bytes .../src/index-detail-sort-f.html | 110 + .../src/index-detail-sort-l.html | 110 + mrs_uav_autostart/src/index-detail.html | 110 + mrs_uav_autostart/src/index-sort-f.html | 102 + mrs_uav_autostart/src/index-sort-l.html | 102 + mrs_uav_autostart/src/index.html | 102 + .../include/common.h.func-sort-c.html | 116 + .../include/common.h.func.html | 116 + .../include/common.h.gcov.frameset.html | 19 + .../include/common.h.gcov.html | 189 + .../include/common.h.gcov.overview.html | 47 + mrs_uav_controllers/include/common.h.gcov.png | Bin 0 -> 436 bytes .../include/index-detail-sort-f.html | 128 + .../include/index-detail-sort-l.html | 128 + mrs_uav_controllers/include/index-detail.html | 128 + mrs_uav_controllers/include/index-sort-f.html | 112 + mrs_uav_controllers/include/index-sort-l.html | 112 + mrs_uav_controllers/include/index.html | 112 + .../include/pid.hpp.func-sort-c.html | 100 + mrs_uav_controllers/include/pid.hpp.func.html | 100 + .../include/pid.hpp.gcov.frameset.html | 19 + mrs_uav_controllers/include/pid.hpp.gcov.html | 184 + .../include/pid.hpp.gcov.overview.html | 45 + mrs_uav_controllers/include/pid.hpp.gcov.png | Bin 0 -> 519 bytes .../src/common.cpp.func-sort-c.html | 116 + mrs_uav_controllers/src/common.cpp.func.html | 116 + .../src/common.cpp.gcov.frameset.html | 19 + mrs_uav_controllers/src/common.cpp.gcov.html | 471 + .../src/common.cpp.gcov.overview.html | 117 + mrs_uav_controllers/src/common.cpp.gcov.png | Bin 0 -> 1368 bytes .../failsafe_controller.cpp.func-sort-c.html | 124 + .../src/failsafe_controller.cpp.func.html | 124 + ...failsafe_controller.cpp.gcov.frameset.html | 19 + .../src/failsafe_controller.cpp.gcov.html | 635 ++ ...failsafe_controller.cpp.gcov.overview.html | 158 + .../src/failsafe_controller.cpp.gcov.png | Bin 0 -> 1814 bytes .../src/index-detail-sort-f.html | 182 + .../src/index-detail-sort-l.html | 182 + mrs_uav_controllers/src/index-detail.html | 182 + mrs_uav_controllers/src/index-sort-f.html | 142 + mrs_uav_controllers/src/index-sort-l.html | 142 + mrs_uav_controllers/src/index.html | 142 + ...activation_controller.cpp.func-sort-c.html | 124 + ...midair_activation_controller.cpp.func.html | 124 + ...tivation_controller.cpp.gcov.frameset.html | 19 + ...midair_activation_controller.cpp.gcov.html | 518 + ...tivation_controller.cpp.gcov.overview.html | 129 + .../midair_activation_controller.cpp.gcov.png | Bin 0 -> 1228 bytes .../src/mpc_controller.cpp.func-sort-c.html | 152 + .../src/mpc_controller.cpp.func.html | 152 + .../src/mpc_controller.cpp.gcov.frameset.html | 19 + .../src/mpc_controller.cpp.gcov.html | 2214 +++++ .../src/mpc_controller.cpp.gcov.overview.html | 553 ++ .../src/mpc_controller.cpp.gcov.png | Bin 0 -> 6656 bytes .../src/se3_controller.cpp.func-sort-c.html | 148 + .../src/se3_controller.cpp.func.html | 148 + .../src/se3_controller.cpp.gcov.frameset.html | 19 + .../src/se3_controller.cpp.gcov.html | 1927 ++++ .../src/se3_controller.cpp.gcov.overview.html | 481 + .../src/se3_controller.cpp.gcov.png | Bin 0 -> 5838 bytes .../control_manager/index-detail-sort-f.html | 110 + .../control_manager/index-detail-sort-l.html | 110 + .../include/control_manager/index-detail.html | 110 + .../include/control_manager/index-sort-f.html | 102 + .../include/control_manager/index-sort-l.html | 102 + .../include/control_manager/index.html | 102 + .../output_publisher.h.func-sort-c.html | 120 + .../output_publisher.h.func.html | 120 + .../output_publisher.h.gcov.frameset.html | 19 + .../output_publisher.h.gcov.html | 146 + .../output_publisher.h.gcov.overview.html | 36 + .../output_publisher.h.gcov.png | Bin 0 -> 332 bytes .../agl_estimator.h.func-sort-c.html | 92 + .../agl_estimator.h.func.html | 92 + .../agl_estimator.h.gcov.frameset.html | 19 + .../agl_estimator.h.gcov.html | 157 + .../agl_estimator.h.gcov.overview.html | 39 + .../mrs_uav_managers/agl_estimator.h.gcov.png | Bin 0 -> 397 bytes .../control_manager/common.h.func-sort-c.html | 188 + .../control_manager/common.h.func.html | 188 + .../common.h.gcov.frameset.html | 19 + .../control_manager/common.h.gcov.html | 380 + .../common.h.gcov.overview.html | 94 + .../control_manager/common.h.gcov.png | Bin 0 -> 945 bytes .../control_manager/index-detail-sort-f.html | 110 + .../control_manager/index-detail-sort-l.html | 110 + .../control_manager/index-detail.html | 110 + .../control_manager/index-sort-f.html | 102 + .../control_manager/index-sort-l.html | 102 + .../control_manager/index.html | 102 + .../controller.h.func-sort-c.html | 88 + .../mrs_uav_managers/controller.h.func.html | 88 + .../controller.h.gcov.frameset.html | 19 + .../mrs_uav_managers/controller.h.gcov.html | 232 + .../controller.h.gcov.overview.html | 57 + .../mrs_uav_managers/controller.h.gcov.png | Bin 0 -> 681 bytes .../estimator.h.func-sort-c.html | 92 + .../estimation_manager/estimator.h.func.html | 92 + .../estimator.h.gcov.frameset.html | 19 + .../estimation_manager/estimator.h.gcov.html | 195 + .../estimator.h.gcov.overview.html | 48 + .../estimation_manager/estimator.h.gcov.png | Bin 0 -> 506 bytes .../index-detail-sort-f.html | 128 + .../index-detail-sort-l.html | 128 + .../estimation_manager/index-detail.html | 128 + .../estimation_manager/index-sort-f.html | 112 + .../estimation_manager/index-sort-l.html | 112 + .../estimation_manager/index.html | 112 + .../support.h.func-sort-c.html | 140 + .../estimation_manager/support.h.func.html | 140 + .../support.h.gcov.frameset.html | 19 + .../estimation_manager/support.h.gcov.html | 405 + .../support.h.gcov.overview.html | 101 + .../estimation_manager/support.h.gcov.png | Bin 0 -> 1232 bytes .../mrs_uav_managers/index-detail-sort-f.html | 164 + .../mrs_uav_managers/index-detail-sort-l.html | 164 + .../mrs_uav_managers/index-detail.html | 164 + .../mrs_uav_managers/index-sort-f.html | 132 + .../mrs_uav_managers/index-sort-l.html | 132 + .../include/mrs_uav_managers/index.html | 132 + .../state_estimator.h.func-sort-c.html | 92 + .../state_estimator.h.func.html | 92 + .../state_estimator.h.gcov.frameset.html | 19 + .../state_estimator.h.gcov.html | 169 + .../state_estimator.h.gcov.overview.html | 42 + .../state_estimator.h.gcov.png | Bin 0 -> 435 bytes .../tracker.h.func-sort-c.html | 88 + .../mrs_uav_managers/tracker.h.func.html | 88 + .../tracker.h.gcov.frameset.html | 19 + .../mrs_uav_managers/tracker.h.gcov.html | 296 + .../tracker.h.gcov.overview.html | 73 + .../mrs_uav_managers/tracker.h.gcov.png | Bin 0 -> 751 bytes .../index-detail-sort-f.html | 120 + .../index-detail-sort-l.html | 120 + .../transform_manager/index-detail.html | 120 + .../transform_manager/index-sort-f.html | 112 + .../transform_manager/index-sort-l.html | 112 + .../include/transform_manager/index.html | 112 + .../tf_mapping_origin.h.func-sort-c.html | 100 + .../tf_mapping_origin.h.func.html | 100 + .../tf_mapping_origin.h.gcov.frameset.html | 19 + .../tf_mapping_origin.h.gcov.html | 474 + .../tf_mapping_origin.h.gcov.overview.html | 118 + .../tf_mapping_origin.h.gcov.png | Bin 0 -> 1536 bytes .../tf_source.h.func-sort-c.html | 136 + .../transform_manager/tf_source.h.func.html | 136 + .../tf_source.h.gcov.frameset.html | 19 + .../transform_manager/tf_source.h.gcov.html | 704 ++ .../tf_source.h.gcov.overview.html | 175 + .../transform_manager/tf_source.h.gcov.png | Bin 0 -> 2234 bytes .../constraint_manager.cpp.func-sort-c.html | 112 + .../src/constraint_manager.cpp.func.html | 112 + .../constraint_manager.cpp.gcov.frameset.html | 19 + .../src/constraint_manager.cpp.gcov.html | 716 ++ .../constraint_manager.cpp.gcov.overview.html | 178 + .../src/constraint_manager.cpp.gcov.png | Bin 0 -> 2190 bytes .../common/common.cpp.func-sort-c.html | 204 + .../common/common.cpp.func.html | 204 + .../common/common.cpp.gcov.frameset.html | 19 + .../common/common.cpp.gcov.html | 1312 +++ .../common/common.cpp.gcov.overview.html | 327 + .../common/common.cpp.gcov.png | Bin 0 -> 2462 bytes .../common/index-detail-sort-f.html | 110 + .../common/index-detail-sort-l.html | 110 + .../control_manager/common/index-detail.html | 110 + .../control_manager/common/index-sort-f.html | 102 + .../control_manager/common/index-sort-l.html | 102 + .../src/control_manager/common/index.html | 102 + .../control_manager.cpp.func-sort-c.html | 524 + .../control_manager.cpp.func.html | 524 + .../control_manager.cpp.gcov.frameset.html | 19 + .../control_manager.cpp.gcov.html | 8847 +++++++++++++++++ .../control_manager.cpp.gcov.overview.html | 2211 ++++ .../control_manager.cpp.gcov.png | Bin 0 -> 25989 bytes .../control_manager/index-detail-sort-f.html | 128 + .../control_manager/index-detail-sort-l.html | 128 + .../src/control_manager/index-detail.html | 128 + .../src/control_manager/index-sort-f.html | 112 + .../src/control_manager/index-sort-l.html | 112 + .../src/control_manager/index.html | 112 + .../output_publisher.cpp.func-sort-c.html | 128 + .../output_publisher.cpp.func.html | 128 + .../output_publisher.cpp.gcov.frameset.html | 19 + .../output_publisher.cpp.gcov.html | 154 + .../output_publisher.cpp.gcov.overview.html | 38 + .../output_publisher.cpp.gcov.png | Bin 0 -> 307 bytes .../estimation_manager.cpp.func-sort-c.html | 176 + .../estimation_manager.cpp.func.html | 176 + .../estimation_manager.cpp.gcov.frameset.html | 19 + .../estimation_manager.cpp.gcov.html | 1330 +++ .../estimation_manager.cpp.gcov.overview.html | 332 + .../estimation_manager.cpp.gcov.png | Bin 0 -> 4322 bytes .../estimator.cpp.func-sort-c.html | 172 + .../estimator.cpp.func.html | 172 + .../estimator.cpp.gcov.frameset.html | 19 + .../estimator.cpp.gcov.html | 295 + .../estimator.cpp.gcov.overview.html | 73 + .../estimation_manager/estimator.cpp.gcov.png | Bin 0 -> 869 bytes .../agl_estimator.cpp.func-sort-c.html | 92 + .../estimators/agl_estimator.cpp.func.html | 92 + .../agl_estimator.cpp.gcov.frameset.html | 19 + .../estimators/agl_estimator.cpp.gcov.html | 182 + .../agl_estimator.cpp.gcov.overview.html | 45 + .../estimators/agl_estimator.cpp.gcov.png | Bin 0 -> 454 bytes .../estimators/index-detail-sort-f.html | 128 + .../estimators/index-detail-sort-l.html | 128 + .../estimators/index-detail.html | 128 + .../estimators/index-sort-f.html | 112 + .../estimators/index-sort-l.html | 112 + .../estimation_manager/estimators/index.html | 112 + .../state_estimator.cpp.func-sort-c.html | 120 + .../estimators/state_estimator.cpp.func.html | 120 + .../state_estimator.cpp.gcov.frameset.html | 19 + .../estimators/state_estimator.cpp.gcov.html | 263 + .../state_estimator.cpp.gcov.overview.html | 65 + .../estimators/state_estimator.cpp.gcov.png | Bin 0 -> 753 bytes .../index-detail-sort-f.html | 128 + .../index-detail-sort-l.html | 128 + .../src/estimation_manager/index-detail.html | 128 + .../src/estimation_manager/index-sort-f.html | 112 + .../src/estimation_manager/index-sort-l.html | 112 + .../src/estimation_manager/index.html | 112 + .../src/gain_manager.cpp.func-sort-c.html | 108 + .../src/gain_manager.cpp.func.html | 108 + .../src/gain_manager.cpp.gcov.frameset.html | 19 + .../src/gain_manager.cpp.gcov.html | 730 ++ .../src/gain_manager.cpp.gcov.overview.html | 182 + .../src/gain_manager.cpp.gcov.png | Bin 0 -> 2153 bytes mrs_uav_managers/src/index-detail-sort-f.html | 164 + mrs_uav_managers/src/index-detail-sort-l.html | 164 + mrs_uav_managers/src/index-detail.html | 164 + mrs_uav_managers/src/index-sort-f.html | 132 + mrs_uav_managers/src/index-sort-l.html | 132 + mrs_uav_managers/src/index.html | 132 + .../src/null_tracker.cpp.func-sort-c.html | 160 + .../src/null_tracker.cpp.func.html | 160 + .../src/null_tracker.cpp.gcov.frameset.html | 19 + .../src/null_tracker.cpp.gcov.html | 332 + .../src/null_tracker.cpp.gcov.overview.html | 82 + .../src/null_tracker.cpp.gcov.png | Bin 0 -> 809 bytes .../index-detail-sort-f.html | 110 + .../index-detail-sort-l.html | 110 + .../src/transform_manager/index-detail.html | 110 + .../src/transform_manager/index-sort-f.html | 102 + .../src/transform_manager/index-sort-l.html | 102 + .../src/transform_manager/index.html | 102 + .../transform_manager.cpp.func-sort-c.html | 136 + .../transform_manager.cpp.func.html | 136 + .../transform_manager.cpp.gcov.frameset.html | 19 + .../transform_manager.cpp.gcov.html | 1037 ++ .../transform_manager.cpp.gcov.overview.html | 259 + .../transform_manager.cpp.gcov.png | Bin 0 -> 3375 bytes .../src/uav_manager.cpp.func-sort-c.html | 232 + .../src/uav_manager.cpp.func.html | 232 + .../src/uav_manager.cpp.gcov.frameset.html | 19 + .../src/uav_manager.cpp.gcov.html | 2765 ++++++ .../src/uav_manager.cpp.gcov.overview.html | 691 ++ mrs_uav_managers/src/uav_manager.cpp.gcov.png | Bin 0 -> 7294 bytes .../agl/garmin_agl.h.func-sort-c.html | 92 + .../estimators/agl/garmin_agl.h.func.html | 92 + .../agl/garmin_agl.h.gcov.frameset.html | 19 + .../estimators/agl/garmin_agl.h.gcov.html | 159 + .../agl/garmin_agl.h.gcov.overview.html | 39 + .../estimators/agl/garmin_agl.h.gcov.png | Bin 0 -> 380 bytes .../estimators/agl/index-detail-sort-f.html | 110 + .../estimators/agl/index-detail-sort-l.html | 110 + .../estimators/agl/index-detail.html | 110 + .../estimators/agl/index-sort-f.html | 102 + .../estimators/agl/index-sort-l.html | 102 + .../estimators/agl/index.html | 102 + .../altitude/alt_generic.h.func-sort-c.html | 92 + .../altitude/alt_generic.h.func.html | 92 + .../altitude/alt_generic.h.gcov.frameset.html | 19 + .../altitude/alt_generic.h.gcov.html | 245 + .../altitude/alt_generic.h.gcov.overview.html | 61 + .../altitude/alt_generic.h.gcov.png | Bin 0 -> 688 bytes .../altitude_estimator.h.func-sort-c.html | 92 + .../altitude/altitude_estimator.h.func.html | 92 + .../altitude_estimator.h.gcov.frameset.html | 19 + .../altitude/altitude_estimator.h.gcov.html | 130 + .../altitude_estimator.h.gcov.overview.html | 32 + .../altitude/altitude_estimator.h.gcov.png | Bin 0 -> 295 bytes .../altitude/index-detail-sort-f.html | 128 + .../altitude/index-detail-sort-l.html | 128 + .../estimators/altitude/index-detail.html | 128 + .../estimators/altitude/index-sort-f.html | 112 + .../estimators/altitude/index-sort-l.html | 112 + .../estimators/altitude/index.html | 112 + .../estimators/correction.h.func-sort-c.html | 364 + .../estimators/correction.h.func.html | 364 + .../correction.h.gcov.frameset.html | 19 + .../estimators/correction.h.gcov.html | 1944 ++++ .../correction.h.gcov.overview.html | 485 + .../estimators/correction.h.gcov.png | Bin 0 -> 5392 bytes .../heading/hdg_generic.h.func-sort-c.html | 92 + .../heading/hdg_generic.h.func.html | 92 + .../heading/hdg_generic.h.gcov.frameset.html | 19 + .../heading/hdg_generic.h.gcov.html | 243 + .../heading/hdg_generic.h.gcov.overview.html | 60 + .../estimators/heading/hdg_generic.h.gcov.png | Bin 0 -> 663 bytes .../hdg_passthrough.h.func-sort-c.html | 92 + .../heading/hdg_passthrough.h.func.html | 92 + .../hdg_passthrough.h.gcov.frameset.html | 19 + .../heading/hdg_passthrough.h.gcov.html | 191 + .../hdg_passthrough.h.gcov.overview.html | 47 + .../heading/hdg_passthrough.h.gcov.png | Bin 0 -> 506 bytes .../heading_estimator.h.func-sort-c.html | 84 + .../heading/heading_estimator.h.func.html | 84 + .../heading_estimator.h.gcov.frameset.html | 19 + .../heading/heading_estimator.h.gcov.html | 124 + .../heading_estimator.h.gcov.overview.html | 30 + .../heading/heading_estimator.h.gcov.png | Bin 0 -> 293 bytes .../heading/index-detail-sort-f.html | 138 + .../heading/index-detail-sort-l.html | 138 + .../estimators/heading/index-detail.html | 138 + .../estimators/heading/index-sort-f.html | 122 + .../estimators/heading/index-sort-l.html | 122 + .../estimators/heading/index.html | 122 + .../estimators/index-detail-sort-f.html | 128 + .../estimators/index-detail-sort-l.html | 128 + .../estimators/index-detail.html | 128 + .../estimators/index-sort-f.html | 112 + .../estimators/index-sort-l.html | 112 + .../estimators/index.html | 112 + .../lateral/index-detail-sort-f.html | 128 + .../lateral/index-detail-sort-l.html | 128 + .../estimators/lateral/index-detail.html | 128 + .../estimators/lateral/index-sort-f.html | 112 + .../estimators/lateral/index-sort-l.html | 112 + .../estimators/lateral/index.html | 112 + .../lateral/lat_generic.h.func-sort-c.html | 92 + .../lateral/lat_generic.h.func.html | 92 + .../lateral/lat_generic.h.gcov.frameset.html | 19 + .../lateral/lat_generic.h.gcov.html | 250 + .../lateral/lat_generic.h.gcov.overview.html | 62 + .../estimators/lateral/lat_generic.h.gcov.png | Bin 0 -> 708 bytes .../lateral_estimator.h.func-sort-c.html | 92 + .../lateral/lateral_estimator.h.func.html | 92 + .../lateral_estimator.h.gcov.frameset.html | 19 + .../lateral/lateral_estimator.h.gcov.html | 122 + .../lateral_estimator.h.gcov.overview.html | 30 + .../lateral/lateral_estimator.h.gcov.png | Bin 0 -> 284 bytes .../partial_estimator.h.func-sort-c.html | 176 + .../estimators/partial_estimator.h.func.html | 176 + .../partial_estimator.h.gcov.frameset.html | 19 + .../estimators/partial_estimator.h.gcov.html | 264 + .../partial_estimator.h.gcov.overview.html | 65 + .../estimators/partial_estimator.h.gcov.png | Bin 0 -> 820 bytes .../estimators/state/index-detail-sort-f.html | 128 + .../estimators/state/index-detail-sort-l.html | 128 + .../estimators/state/index-detail.html | 128 + .../estimators/state/index-sort-f.html | 112 + .../estimators/state/index-sort-l.html | 112 + .../estimators/state/index.html | 112 + .../state/passthrough.h.func-sort-c.html | 92 + .../estimators/state/passthrough.h.func.html | 92 + .../state/passthrough.h.gcov.frameset.html | 19 + .../estimators/state/passthrough.h.gcov.html | 173 + .../state/passthrough.h.gcov.overview.html | 43 + .../estimators/state/passthrough.h.gcov.png | Bin 0 -> 431 bytes .../state/state_generic.h.func-sort-c.html | 92 + .../state/state_generic.h.func.html | 92 + .../state/state_generic.h.gcov.frameset.html | 19 + .../state/state_generic.h.gcov.html | 183 + .../state/state_generic.h.gcov.overview.html | 45 + .../estimators/state/state_generic.h.gcov.png | Bin 0 -> 438 bytes .../processors/index-detail-sort-f.html | 182 + .../processors/index-detail-sort-l.html | 182 + .../processors/index-detail.html | 182 + .../processors/index-sort-f.html | 142 + .../processors/index-sort-l.html | 142 + .../processors/index.html | 142 + .../proc_excessive_tilt.h.func-sort-c.html | 104 + .../proc_excessive_tilt.h.func.html | 104 + .../proc_excessive_tilt.h.gcov.frameset.html | 19 + .../proc_excessive_tilt.h.gcov.html | 206 + .../proc_excessive_tilt.h.gcov.overview.html | 51 + .../processors/proc_excessive_tilt.h.gcov.png | Bin 0 -> 656 bytes .../proc_median_filter.h.func-sort-c.html | 104 + .../processors/proc_median_filter.h.func.html | 104 + .../proc_median_filter.h.gcov.frameset.html | 19 + .../processors/proc_median_filter.h.gcov.html | 192 + .../proc_median_filter.h.gcov.overview.html | 47 + .../processors/proc_median_filter.h.gcov.png | Bin 0 -> 635 bytes .../proc_saturate.h.func-sort-c.html | 104 + .../processors/proc_saturate.h.func.html | 104 + .../proc_saturate.h.gcov.frameset.html | 19 + .../processors/proc_saturate.h.gcov.html | 202 + .../proc_saturate.h.gcov.overview.html | 50 + .../processors/proc_saturate.h.gcov.png | Bin 0 -> 711 bytes .../proc_tf_to_world.h.func-sort-c.html | 112 + .../processors/proc_tf_to_world.h.func.html | 112 + .../proc_tf_to_world.h.gcov.frameset.html | 19 + .../processors/proc_tf_to_world.h.gcov.html | 241 + .../proc_tf_to_world.h.gcov.overview.html | 60 + .../processors/proc_tf_to_world.h.gcov.png | Bin 0 -> 777 bytes .../processors/processor.h.func-sort-c.html | 112 + .../processors/processor.h.func.html | 112 + .../processors/processor.h.gcov.frameset.html | 19 + .../processors/processor.h.gcov.html | 156 + .../processors/processor.h.gcov.overview.html | 38 + .../processors/processor.h.gcov.png | Bin 0 -> 436 bytes .../agl/garmin_agl.cpp.func-sort-c.html | 120 + .../estimators/agl/garmin_agl.cpp.func.html | 120 + .../agl/garmin_agl.cpp.gcov.frameset.html | 19 + .../estimators/agl/garmin_agl.cpp.gcov.html | 318 + .../agl/garmin_agl.cpp.gcov.overview.html | 79 + .../estimators/agl/garmin_agl.cpp.gcov.png | Bin 0 -> 1043 bytes .../estimators/agl/index-detail-sort-f.html | 110 + .../estimators/agl/index-detail-sort-l.html | 110 + .../src/estimators/agl/index-detail.html | 110 + .../src/estimators/agl/index-sort-f.html | 102 + .../src/estimators/agl/index-sort-l.html | 102 + .../src/estimators/agl/index.html | 102 + .../altitude/alt_generic.cpp.func-sort-c.html | 212 + .../altitude/alt_generic.cpp.func.html | 212 + .../alt_generic.cpp.gcov.frameset.html | 19 + .../altitude/alt_generic.cpp.gcov.html | 839 ++ .../alt_generic.cpp.gcov.overview.html | 209 + .../altitude/alt_generic.cpp.gcov.png | Bin 0 -> 2916 bytes .../altitude/index-detail-sort-f.html | 110 + .../altitude/index-detail-sort-l.html | 110 + .../src/estimators/altitude/index-detail.html | 110 + .../src/estimators/altitude/index-sort-f.html | 102 + .../src/estimators/altitude/index-sort-l.html | 102 + .../src/estimators/altitude/index.html | 102 + .../heading/hdg_generic.cpp.func-sort-c.html | 216 + .../heading/hdg_generic.cpp.func.html | 216 + .../hdg_generic.cpp.gcov.frameset.html | 19 + .../heading/hdg_generic.cpp.gcov.html | 795 ++ .../hdg_generic.cpp.gcov.overview.html | 198 + .../heading/hdg_generic.cpp.gcov.png | Bin 0 -> 2308 bytes .../hdg_passthrough.cpp.func-sort-c.html | 172 + .../heading/hdg_passthrough.cpp.func.html | 172 + .../hdg_passthrough.cpp.gcov.frameset.html | 19 + .../heading/hdg_passthrough.cpp.gcov.html | 391 + .../hdg_passthrough.cpp.gcov.overview.html | 97 + .../heading/hdg_passthrough.cpp.gcov.png | Bin 0 -> 1198 bytes .../heading/index-detail-sort-f.html | 120 + .../heading/index-detail-sort-l.html | 120 + .../src/estimators/heading/index-detail.html | 120 + .../src/estimators/heading/index-sort-f.html | 112 + .../src/estimators/heading/index-sort-l.html | 112 + .../src/estimators/heading/index.html | 112 + .../lateral/index-detail-sort-f.html | 110 + .../lateral/index-detail-sort-l.html | 110 + .../src/estimators/lateral/index-detail.html | 110 + .../src/estimators/lateral/index-sort-f.html | 102 + .../src/estimators/lateral/index-sort-l.html | 102 + .../src/estimators/lateral/index.html | 102 + .../lateral/lat_generic.cpp.func-sort-c.html | 212 + .../lateral/lat_generic.cpp.func.html | 212 + .../lat_generic.cpp.gcov.frameset.html | 19 + .../lateral/lat_generic.cpp.gcov.html | 887 ++ .../lat_generic.cpp.gcov.overview.html | 221 + .../lateral/lat_generic.cpp.gcov.png | Bin 0 -> 3146 bytes .../state/gps_baro.cpp.func-sort-c.html | 96 + .../estimators/state/gps_baro.cpp.func.html | 96 + .../state/gps_baro.cpp.gcov.frameset.html | 19 + .../estimators/state/gps_baro.cpp.gcov.html | 109 + .../state/gps_baro.cpp.gcov.overview.html | 27 + .../estimators/state/gps_baro.cpp.gcov.png | Bin 0 -> 231 bytes .../state/gps_garmin.cpp.func-sort-c.html | 96 + .../estimators/state/gps_garmin.cpp.func.html | 96 + .../state/gps_garmin.cpp.gcov.frameset.html | 19 + .../estimators/state/gps_garmin.cpp.gcov.html | 109 + .../state/gps_garmin.cpp.gcov.overview.html | 27 + .../estimators/state/gps_garmin.cpp.gcov.png | Bin 0 -> 231 bytes .../estimators/state/index-detail-sort-f.html | 200 + .../estimators/state/index-detail-sort-l.html | 200 + .../src/estimators/state/index-detail.html | 200 + .../src/estimators/state/index-sort-f.html | 152 + .../src/estimators/state/index-sort-l.html | 152 + .../src/estimators/state/index.html | 152 + .../state/passthrough.cpp.func-sort-c.html | 116 + .../state/passthrough.cpp.func.html | 116 + .../state/passthrough.cpp.gcov.frameset.html | 19 + .../state/passthrough.cpp.gcov.html | 343 + .../state/passthrough.cpp.gcov.overview.html | 85 + .../estimators/state/passthrough.cpp.gcov.png | Bin 0 -> 1099 bytes .../estimators/state/rtk.cpp.func-sort-c.html | 96 + .../src/estimators/state/rtk.cpp.func.html | 96 + .../state/rtk.cpp.gcov.frameset.html | 19 + .../src/estimators/state/rtk.cpp.gcov.html | 109 + .../state/rtk.cpp.gcov.overview.html | 27 + .../src/estimators/state/rtk.cpp.gcov.png | Bin 0 -> 229 bytes .../state/rtk_garmin.cpp.func-sort-c.html | 96 + .../estimators/state/rtk_garmin.cpp.func.html | 96 + .../state/rtk_garmin.cpp.gcov.frameset.html | 19 + .../estimators/state/rtk_garmin.cpp.gcov.html | 109 + .../state/rtk_garmin.cpp.gcov.overview.html | 27 + .../estimators/state/rtk_garmin.cpp.gcov.png | Bin 0 -> 231 bytes .../state/state_generic.cpp.func-sort-c.html | 128 + .../state/state_generic.cpp.func.html | 128 + .../state_generic.cpp.gcov.frameset.html | 19 + .../state/state_generic.cpp.gcov.html | 633 ++ .../state_generic.cpp.gcov.overview.html | 158 + .../state/state_generic.cpp.gcov.png | Bin 0 -> 1968 bytes .../src/joy_tracker/index-detail-sort-f.html | 110 + .../src/joy_tracker/index-detail-sort-l.html | 110 + .../src/joy_tracker/index-detail.html | 110 + .../src/joy_tracker/index-sort-f.html | 102 + .../src/joy_tracker/index-sort-l.html | 102 + mrs_uav_trackers/src/joy_tracker/index.html | 102 + .../joy_tracker.cpp.func-sort-c.html | 152 + .../src/joy_tracker/joy_tracker.cpp.func.html | 152 + .../joy_tracker.cpp.gcov.frameset.html | 19 + .../src/joy_tracker/joy_tracker.cpp.gcov.html | 588 ++ .../joy_tracker.cpp.gcov.overview.html | 146 + .../src/joy_tracker/joy_tracker.cpp.gcov.png | Bin 0 -> 1740 bytes .../landoff_tracker/index-detail-sort-f.html | 110 + .../landoff_tracker/index-detail-sort-l.html | 110 + .../src/landoff_tracker/index-detail.html | 110 + .../src/landoff_tracker/index-sort-f.html | 102 + .../src/landoff_tracker/index-sort-l.html | 102 + .../src/landoff_tracker/index.html | 102 + .../landoff_tracker.cpp.func-sort-c.html | 204 + .../landoff_tracker.cpp.func.html | 204 + .../landoff_tracker.cpp.gcov.frameset.html | 19 + .../landoff_tracker.cpp.gcov.html | 1636 +++ .../landoff_tracker.cpp.gcov.overview.html | 408 + .../landoff_tracker.cpp.gcov.png | Bin 0 -> 4772 bytes .../src/line_tracker/index-detail-sort-f.html | 110 + .../src/line_tracker/index-detail-sort-l.html | 110 + .../src/line_tracker/index-detail.html | 110 + .../src/line_tracker/index-sort-f.html | 102 + .../src/line_tracker/index-sort-l.html | 102 + mrs_uav_trackers/src/line_tracker/index.html | 102 + .../line_tracker.cpp.func-sort-c.html | 200 + .../line_tracker/line_tracker.cpp.func.html | 200 + .../line_tracker.cpp.gcov.frameset.html | 19 + .../line_tracker/line_tracker.cpp.gcov.html | 1359 +++ .../line_tracker.cpp.gcov.overview.html | 339 + .../line_tracker/line_tracker.cpp.gcov.png | Bin 0 -> 3774 bytes .../index-detail-sort-f.html | 110 + .../index-detail-sort-l.html | 110 + .../index-detail.html | 110 + .../index-sort-f.html | 102 + .../index-sort-l.html | 102 + .../src/midair_activation_tracker/index.html | 102 + ...ir_activation_tracker.cpp.func-sort-c.html | 152 + .../midair_activation_tracker.cpp.func.html | 152 + ..._activation_tracker.cpp.gcov.frameset.html | 19 + .../midair_activation_tracker.cpp.gcov.html | 426 + ..._activation_tracker.cpp.gcov.overview.html | 106 + .../midair_activation_tracker.cpp.gcov.png | Bin 0 -> 1153 bytes .../src/mpc_tracker/index-detail-sort-f.html | 110 + .../src/mpc_tracker/index-detail-sort-l.html | 110 + .../src/mpc_tracker/index-detail.html | 110 + .../src/mpc_tracker/index-sort-f.html | 102 + .../src/mpc_tracker/index-sort-l.html | 102 + mrs_uav_trackers/src/mpc_tracker/index.html | 102 + .../mpc_tracker.cpp.func-sort-c.html | 280 + .../src/mpc_tracker/mpc_tracker.cpp.func.html | 280 + .../mpc_tracker.cpp.gcov.frameset.html | 19 + .../src/mpc_tracker/mpc_tracker.cpp.gcov.html | 3931 ++++++++ .../mpc_tracker.cpp.gcov.overview.html | 982 ++ .../src/mpc_tracker/mpc_tracker.cpp.gcov.png | Bin 0 -> 12412 bytes .../speed_tracker/index-detail-sort-f.html | 110 + .../speed_tracker/index-detail-sort-l.html | 110 + .../src/speed_tracker/index-detail.html | 110 + .../src/speed_tracker/index-sort-f.html | 102 + .../src/speed_tracker/index-sort-l.html | 102 + mrs_uav_trackers/src/speed_tracker/index.html | 102 + .../speed_tracker.cpp.func-sort-c.html | 156 + .../speed_tracker/speed_tracker.cpp.func.html | 156 + .../speed_tracker.cpp.gcov.frameset.html | 19 + .../speed_tracker/speed_tracker.cpp.gcov.html | 1178 +++ .../speed_tracker.cpp.gcov.overview.html | 294 + .../speed_tracker/speed_tracker.cpp.gcov.png | Bin 0 -> 3011 bytes .../src/index-detail-sort-f.html | 110 + .../src/index-detail-sort-l.html | 110 + .../src/index-detail.html | 110 + .../src/index-sort-f.html | 102 + .../src/index-sort-l.html | 102 + mrs_uav_trajectory_generation/src/index.html | 102 + ...trajectory_generation.cpp.func-sort-c.html | 168 + .../mrs_trajectory_generation.cpp.func.html | 168 + ...ajectory_generation.cpp.gcov.frameset.html | 19 + .../mrs_trajectory_generation.cpp.gcov.html | 2458 +++++ ...ajectory_generation.cpp.gcov.overview.html | 614 ++ .../mrs_trajectory_generation.cpp.gcov.png | Bin 0 -> 7277 bytes ruby.png | Bin 0 -> 141 bytes snow.png | Bin 0 -> 141 bytes updown.png | Bin 0 -> 117 bytes 1020 files changed, 179141 insertions(+) create mode 100644 .nojekyll create mode 100644 amber.png create mode 100644 badge.svg create mode 100644 emerald.png create mode 100644 gcov.css create mode 100644 glass.png create mode 100644 index-sort-f.html create mode 100644 index-sort-l.html create mode 100644 index.html create mode 100644 mrs_lib/include/mrs_lib/attitude_converter.h.func-sort-c.html create mode 100644 mrs_lib/include/mrs_lib/attitude_converter.h.func.html create mode 100644 mrs_lib/include/mrs_lib/attitude_converter.h.gcov.frameset.html create mode 100644 mrs_lib/include/mrs_lib/attitude_converter.h.gcov.html create mode 100644 mrs_lib/include/mrs_lib/attitude_converter.h.gcov.overview.html create mode 100644 mrs_lib/include/mrs_lib/attitude_converter.h.gcov.png create mode 100644 mrs_lib/include/mrs_lib/dynamic_reconfigure_mgr.h.func-sort-c.html create mode 100644 mrs_lib/include/mrs_lib/dynamic_reconfigure_mgr.h.func.html create mode 100644 mrs_lib/include/mrs_lib/dynamic_reconfigure_mgr.h.gcov.frameset.html create mode 100644 mrs_lib/include/mrs_lib/dynamic_reconfigure_mgr.h.gcov.html create mode 100644 mrs_lib/include/mrs_lib/dynamic_reconfigure_mgr.h.gcov.overview.html create mode 100644 mrs_lib/include/mrs_lib/dynamic_reconfigure_mgr.h.gcov.png create mode 100644 mrs_lib/include/mrs_lib/geometry/cyclic.h.func-sort-c.html create mode 100644 mrs_lib/include/mrs_lib/geometry/cyclic.h.func.html create mode 100644 mrs_lib/include/mrs_lib/geometry/cyclic.h.gcov.frameset.html create mode 100644 mrs_lib/include/mrs_lib/geometry/cyclic.h.gcov.html create mode 100644 mrs_lib/include/mrs_lib/geometry/cyclic.h.gcov.overview.html create mode 100644 mrs_lib/include/mrs_lib/geometry/cyclic.h.gcov.png create mode 100644 mrs_lib/include/mrs_lib/geometry/index-detail-sort-f.html create mode 100644 mrs_lib/include/mrs_lib/geometry/index-detail-sort-l.html create mode 100644 mrs_lib/include/mrs_lib/geometry/index-detail.html create mode 100644 mrs_lib/include/mrs_lib/geometry/index-sort-f.html create mode 100644 mrs_lib/include/mrs_lib/geometry/index-sort-l.html create mode 100644 mrs_lib/include/mrs_lib/geometry/index.html create mode 100644 mrs_lib/include/mrs_lib/geometry/misc.h.func-sort-c.html create mode 100644 mrs_lib/include/mrs_lib/geometry/misc.h.func.html create mode 100644 mrs_lib/include/mrs_lib/geometry/misc.h.gcov.frameset.html create mode 100644 mrs_lib/include/mrs_lib/geometry/misc.h.gcov.html create mode 100644 mrs_lib/include/mrs_lib/geometry/misc.h.gcov.overview.html create mode 100644 mrs_lib/include/mrs_lib/geometry/misc.h.gcov.png create mode 100644 mrs_lib/include/mrs_lib/gps_conversions.h.func-sort-c.html create mode 100644 mrs_lib/include/mrs_lib/gps_conversions.h.func.html create mode 100644 mrs_lib/include/mrs_lib/gps_conversions.h.gcov.frameset.html create mode 100644 mrs_lib/include/mrs_lib/gps_conversions.h.gcov.html create mode 100644 mrs_lib/include/mrs_lib/gps_conversions.h.gcov.overview.html create mode 100644 mrs_lib/include/mrs_lib/gps_conversions.h.gcov.png create mode 100644 mrs_lib/include/mrs_lib/impl/index-detail-sort-f.html create mode 100644 mrs_lib/include/mrs_lib/impl/index-detail-sort-l.html create mode 100644 mrs_lib/include/mrs_lib/impl/index-detail.html create mode 100644 mrs_lib/include/mrs_lib/impl/index-sort-f.html create mode 100644 mrs_lib/include/mrs_lib/impl/index-sort-l.html create mode 100644 mrs_lib/include/mrs_lib/impl/index.html create mode 100644 mrs_lib/include/mrs_lib/impl/param_provider.hpp.func-sort-c.html create mode 100644 mrs_lib/include/mrs_lib/impl/param_provider.hpp.func.html create mode 100644 mrs_lib/include/mrs_lib/impl/param_provider.hpp.gcov.frameset.html create mode 100644 mrs_lib/include/mrs_lib/impl/param_provider.hpp.gcov.html create mode 100644 mrs_lib/include/mrs_lib/impl/param_provider.hpp.gcov.overview.html create mode 100644 mrs_lib/include/mrs_lib/impl/param_provider.hpp.gcov.png create mode 100644 mrs_lib/include/mrs_lib/impl/publisher_handler.hpp.func-sort-c.html create mode 100644 mrs_lib/include/mrs_lib/impl/publisher_handler.hpp.func.html create mode 100644 mrs_lib/include/mrs_lib/impl/publisher_handler.hpp.gcov.frameset.html create mode 100644 mrs_lib/include/mrs_lib/impl/publisher_handler.hpp.gcov.html create mode 100644 mrs_lib/include/mrs_lib/impl/publisher_handler.hpp.gcov.overview.html create mode 100644 mrs_lib/include/mrs_lib/impl/publisher_handler.hpp.gcov.png create mode 100644 mrs_lib/include/mrs_lib/impl/service_client_handler.hpp.func-sort-c.html create mode 100644 mrs_lib/include/mrs_lib/impl/service_client_handler.hpp.func.html create mode 100644 mrs_lib/include/mrs_lib/impl/service_client_handler.hpp.gcov.frameset.html create mode 100644 mrs_lib/include/mrs_lib/impl/service_client_handler.hpp.gcov.html create mode 100644 mrs_lib/include/mrs_lib/impl/service_client_handler.hpp.gcov.overview.html create mode 100644 mrs_lib/include/mrs_lib/impl/service_client_handler.hpp.gcov.png create mode 100644 mrs_lib/include/mrs_lib/impl/subscribe_handler.hpp.func-sort-c.html create mode 100644 mrs_lib/include/mrs_lib/impl/subscribe_handler.hpp.func.html create mode 100644 mrs_lib/include/mrs_lib/impl/subscribe_handler.hpp.gcov.frameset.html create mode 100644 mrs_lib/include/mrs_lib/impl/subscribe_handler.hpp.gcov.html create mode 100644 mrs_lib/include/mrs_lib/impl/subscribe_handler.hpp.gcov.overview.html create mode 100644 mrs_lib/include/mrs_lib/impl/subscribe_handler.hpp.gcov.png create mode 100644 mrs_lib/include/mrs_lib/impl/timer.hpp.func-sort-c.html create mode 100644 mrs_lib/include/mrs_lib/impl/timer.hpp.func.html create mode 100644 mrs_lib/include/mrs_lib/impl/timer.hpp.gcov.frameset.html create mode 100644 mrs_lib/include/mrs_lib/impl/timer.hpp.gcov.html create mode 100644 mrs_lib/include/mrs_lib/impl/timer.hpp.gcov.overview.html create mode 100644 mrs_lib/include/mrs_lib/impl/timer.hpp.gcov.png create mode 100644 mrs_lib/include/mrs_lib/impl/transformer.hpp.func-sort-c.html create mode 100644 mrs_lib/include/mrs_lib/impl/transformer.hpp.func.html create mode 100644 mrs_lib/include/mrs_lib/impl/transformer.hpp.gcov.frameset.html create mode 100644 mrs_lib/include/mrs_lib/impl/transformer.hpp.gcov.html create mode 100644 mrs_lib/include/mrs_lib/impl/transformer.hpp.gcov.overview.html create mode 100644 mrs_lib/include/mrs_lib/impl/transformer.hpp.gcov.png create mode 100644 mrs_lib/include/mrs_lib/impl/ukf.hpp.func-sort-c.html create mode 100644 mrs_lib/include/mrs_lib/impl/ukf.hpp.func.html create mode 100644 mrs_lib/include/mrs_lib/impl/ukf.hpp.gcov.frameset.html create mode 100644 mrs_lib/include/mrs_lib/impl/ukf.hpp.gcov.html create mode 100644 mrs_lib/include/mrs_lib/impl/ukf.hpp.gcov.overview.html create mode 100644 mrs_lib/include/mrs_lib/impl/ukf.hpp.gcov.png create mode 100644 mrs_lib/include/mrs_lib/impl/vector_converter.hpp.func-sort-c.html create mode 100644 mrs_lib/include/mrs_lib/impl/vector_converter.hpp.func.html create mode 100644 mrs_lib/include/mrs_lib/impl/vector_converter.hpp.gcov.frameset.html create mode 100644 mrs_lib/include/mrs_lib/impl/vector_converter.hpp.gcov.html create mode 100644 mrs_lib/include/mrs_lib/impl/vector_converter.hpp.gcov.overview.html create mode 100644 mrs_lib/include/mrs_lib/impl/vector_converter.hpp.gcov.png create mode 100644 mrs_lib/include/mrs_lib/index-detail-sort-f.html create mode 100644 mrs_lib/include/mrs_lib/index-detail-sort-l.html create mode 100644 mrs_lib/include/mrs_lib/index-detail.html create mode 100644 mrs_lib/include/mrs_lib/index-sort-f.html create mode 100644 mrs_lib/include/mrs_lib/index-sort-l.html create mode 100644 mrs_lib/include/mrs_lib/index.html create mode 100644 mrs_lib/include/mrs_lib/lkf.h.func-sort-c.html create mode 100644 mrs_lib/include/mrs_lib/lkf.h.func.html create mode 100644 mrs_lib/include/mrs_lib/lkf.h.gcov.frameset.html create mode 100644 mrs_lib/include/mrs_lib/lkf.h.gcov.html create mode 100644 mrs_lib/include/mrs_lib/lkf.h.gcov.overview.html create mode 100644 mrs_lib/include/mrs_lib/lkf.h.gcov.png create mode 100644 mrs_lib/include/mrs_lib/msg_extractor.h.func-sort-c.html create mode 100644 mrs_lib/include/mrs_lib/msg_extractor.h.func.html create mode 100644 mrs_lib/include/mrs_lib/msg_extractor.h.gcov.frameset.html create mode 100644 mrs_lib/include/mrs_lib/msg_extractor.h.gcov.html create mode 100644 mrs_lib/include/mrs_lib/msg_extractor.h.gcov.overview.html create mode 100644 mrs_lib/include/mrs_lib/msg_extractor.h.gcov.png create mode 100644 mrs_lib/include/mrs_lib/mutex.h.func-sort-c.html create mode 100644 mrs_lib/include/mrs_lib/mutex.h.func.html create mode 100644 mrs_lib/include/mrs_lib/mutex.h.gcov.frameset.html create mode 100644 mrs_lib/include/mrs_lib/mutex.h.gcov.html create mode 100644 mrs_lib/include/mrs_lib/mutex.h.gcov.overview.html create mode 100644 mrs_lib/include/mrs_lib/mutex.h.gcov.png create mode 100644 mrs_lib/include/mrs_lib/param_loader.h.func-sort-c.html create mode 100644 mrs_lib/include/mrs_lib/param_loader.h.func.html create mode 100644 mrs_lib/include/mrs_lib/param_loader.h.gcov.frameset.html create mode 100644 mrs_lib/include/mrs_lib/param_loader.h.gcov.html create mode 100644 mrs_lib/include/mrs_lib/param_loader.h.gcov.overview.html create mode 100644 mrs_lib/include/mrs_lib/param_loader.h.gcov.png create mode 100644 mrs_lib/include/mrs_lib/publisher_handler.h.func-sort-c.html create mode 100644 mrs_lib/include/mrs_lib/publisher_handler.h.func.html create mode 100644 mrs_lib/include/mrs_lib/publisher_handler.h.gcov.frameset.html create mode 100644 mrs_lib/include/mrs_lib/publisher_handler.h.gcov.html create mode 100644 mrs_lib/include/mrs_lib/publisher_handler.h.gcov.overview.html create mode 100644 mrs_lib/include/mrs_lib/publisher_handler.h.gcov.png create mode 100644 mrs_lib/include/mrs_lib/quadratic_throttle_model.h.func-sort-c.html create mode 100644 mrs_lib/include/mrs_lib/quadratic_throttle_model.h.func.html create mode 100644 mrs_lib/include/mrs_lib/quadratic_throttle_model.h.gcov.frameset.html create mode 100644 mrs_lib/include/mrs_lib/quadratic_throttle_model.h.gcov.html create mode 100644 mrs_lib/include/mrs_lib/quadratic_throttle_model.h.gcov.overview.html create mode 100644 mrs_lib/include/mrs_lib/quadratic_throttle_model.h.gcov.png create mode 100644 mrs_lib/include/mrs_lib/repredictor.h.func-sort-c.html create mode 100644 mrs_lib/include/mrs_lib/repredictor.h.func.html create mode 100644 mrs_lib/include/mrs_lib/repredictor.h.gcov.frameset.html create mode 100644 mrs_lib/include/mrs_lib/repredictor.h.gcov.html create mode 100644 mrs_lib/include/mrs_lib/repredictor.h.gcov.overview.html create mode 100644 mrs_lib/include/mrs_lib/repredictor.h.gcov.png create mode 100644 mrs_lib/include/mrs_lib/safety_zone/index-detail-sort-f.html create mode 100644 mrs_lib/include/mrs_lib/safety_zone/index-detail-sort-l.html create mode 100644 mrs_lib/include/mrs_lib/safety_zone/index-detail.html create mode 100644 mrs_lib/include/mrs_lib/safety_zone/index-sort-f.html create mode 100644 mrs_lib/include/mrs_lib/safety_zone/index-sort-l.html create mode 100644 mrs_lib/include/mrs_lib/safety_zone/index.html create mode 100644 mrs_lib/include/mrs_lib/safety_zone/polygon.h.func-sort-c.html create mode 100644 mrs_lib/include/mrs_lib/safety_zone/polygon.h.func.html create mode 100644 mrs_lib/include/mrs_lib/safety_zone/polygon.h.gcov.frameset.html create mode 100644 mrs_lib/include/mrs_lib/safety_zone/polygon.h.gcov.html create mode 100644 mrs_lib/include/mrs_lib/safety_zone/polygon.h.gcov.overview.html create mode 100644 mrs_lib/include/mrs_lib/safety_zone/polygon.h.gcov.png create mode 100644 mrs_lib/include/mrs_lib/safety_zone/safety_zone.h.func-sort-c.html create mode 100644 mrs_lib/include/mrs_lib/safety_zone/safety_zone.h.func.html create mode 100644 mrs_lib/include/mrs_lib/safety_zone/safety_zone.h.gcov.frameset.html create mode 100644 mrs_lib/include/mrs_lib/safety_zone/safety_zone.h.gcov.html create mode 100644 mrs_lib/include/mrs_lib/safety_zone/safety_zone.h.gcov.overview.html create mode 100644 mrs_lib/include/mrs_lib/safety_zone/safety_zone.h.gcov.png create mode 100644 mrs_lib/include/mrs_lib/scope_timer.h.func-sort-c.html create mode 100644 mrs_lib/include/mrs_lib/scope_timer.h.func.html create mode 100644 mrs_lib/include/mrs_lib/scope_timer.h.gcov.frameset.html create mode 100644 mrs_lib/include/mrs_lib/scope_timer.h.gcov.html create mode 100644 mrs_lib/include/mrs_lib/scope_timer.h.gcov.overview.html create mode 100644 mrs_lib/include/mrs_lib/scope_timer.h.gcov.png create mode 100644 mrs_lib/include/mrs_lib/service_client_handler.h.func-sort-c.html create mode 100644 mrs_lib/include/mrs_lib/service_client_handler.h.func.html create mode 100644 mrs_lib/include/mrs_lib/service_client_handler.h.gcov.frameset.html create mode 100644 mrs_lib/include/mrs_lib/service_client_handler.h.gcov.html create mode 100644 mrs_lib/include/mrs_lib/service_client_handler.h.gcov.overview.html create mode 100644 mrs_lib/include/mrs_lib/service_client_handler.h.gcov.png create mode 100644 mrs_lib/include/mrs_lib/subscribe_handler.h.func-sort-c.html create mode 100644 mrs_lib/include/mrs_lib/subscribe_handler.h.func.html create mode 100644 mrs_lib/include/mrs_lib/subscribe_handler.h.gcov.frameset.html create mode 100644 mrs_lib/include/mrs_lib/subscribe_handler.h.gcov.html create mode 100644 mrs_lib/include/mrs_lib/subscribe_handler.h.gcov.overview.html create mode 100644 mrs_lib/include/mrs_lib/subscribe_handler.h.gcov.png create mode 100644 mrs_lib/include/mrs_lib/timeout_manager.h.func-sort-c.html create mode 100644 mrs_lib/include/mrs_lib/timeout_manager.h.func.html create mode 100644 mrs_lib/include/mrs_lib/timeout_manager.h.gcov.frameset.html create mode 100644 mrs_lib/include/mrs_lib/timeout_manager.h.gcov.html create mode 100644 mrs_lib/include/mrs_lib/timeout_manager.h.gcov.overview.html create mode 100644 mrs_lib/include/mrs_lib/timeout_manager.h.gcov.png create mode 100644 mrs_lib/include/mrs_lib/timer.h.func-sort-c.html create mode 100644 mrs_lib/include/mrs_lib/timer.h.func.html create mode 100644 mrs_lib/include/mrs_lib/timer.h.gcov.frameset.html create mode 100644 mrs_lib/include/mrs_lib/timer.h.gcov.html create mode 100644 mrs_lib/include/mrs_lib/timer.h.gcov.overview.html create mode 100644 mrs_lib/include/mrs_lib/timer.h.gcov.png create mode 100644 mrs_lib/include/mrs_lib/transformer.h.func-sort-c.html create mode 100644 mrs_lib/include/mrs_lib/transformer.h.func.html create mode 100644 mrs_lib/include/mrs_lib/transformer.h.gcov.frameset.html create mode 100644 mrs_lib/include/mrs_lib/transformer.h.gcov.html create mode 100644 mrs_lib/include/mrs_lib/transformer.h.gcov.overview.html create mode 100644 mrs_lib/include/mrs_lib/transformer.h.gcov.png create mode 100644 mrs_lib/include/mrs_lib/ukf.h.func-sort-c.html create mode 100644 mrs_lib/include/mrs_lib/ukf.h.func.html create mode 100644 mrs_lib/include/mrs_lib/ukf.h.gcov.frameset.html create mode 100644 mrs_lib/include/mrs_lib/ukf.h.gcov.html create mode 100644 mrs_lib/include/mrs_lib/ukf.h.gcov.overview.html create mode 100644 mrs_lib/include/mrs_lib/ukf.h.gcov.png create mode 100644 mrs_lib/include/mrs_lib/utils.h.func-sort-c.html create mode 100644 mrs_lib/include/mrs_lib/utils.h.func.html create mode 100644 mrs_lib/include/mrs_lib/utils.h.gcov.frameset.html create mode 100644 mrs_lib/include/mrs_lib/utils.h.gcov.html create mode 100644 mrs_lib/include/mrs_lib/utils.h.gcov.overview.html create mode 100644 mrs_lib/include/mrs_lib/utils.h.gcov.png create mode 100644 mrs_lib/include/mrs_lib/vector_converter.h.func-sort-c.html create mode 100644 mrs_lib/include/mrs_lib/vector_converter.h.func.html create mode 100644 mrs_lib/include/mrs_lib/vector_converter.h.gcov.frameset.html create mode 100644 mrs_lib/include/mrs_lib/vector_converter.h.gcov.html create mode 100644 mrs_lib/include/mrs_lib/vector_converter.h.gcov.overview.html create mode 100644 mrs_lib/include/mrs_lib/vector_converter.h.gcov.png create mode 100644 mrs_lib/include/mrs_lib/visual_object.h.func-sort-c.html create mode 100644 mrs_lib/include/mrs_lib/visual_object.h.func.html create mode 100644 mrs_lib/include/mrs_lib/visual_object.h.gcov.frameset.html create mode 100644 mrs_lib/include/mrs_lib/visual_object.h.gcov.html create mode 100644 mrs_lib/include/mrs_lib/visual_object.h.gcov.overview.html create mode 100644 mrs_lib/include/mrs_lib/visual_object.h.gcov.png create mode 100644 mrs_lib/src/attitude_converter/attitude_converter.cpp.func-sort-c.html create mode 100644 mrs_lib/src/attitude_converter/attitude_converter.cpp.func.html create mode 100644 mrs_lib/src/attitude_converter/attitude_converter.cpp.gcov.frameset.html create mode 100644 mrs_lib/src/attitude_converter/attitude_converter.cpp.gcov.html create mode 100644 mrs_lib/src/attitude_converter/attitude_converter.cpp.gcov.overview.html create mode 100644 mrs_lib/src/attitude_converter/attitude_converter.cpp.gcov.png create mode 100644 mrs_lib/src/attitude_converter/index-detail-sort-f.html create mode 100644 mrs_lib/src/attitude_converter/index-detail-sort-l.html create mode 100644 mrs_lib/src/attitude_converter/index-detail.html create mode 100644 mrs_lib/src/attitude_converter/index-sort-f.html create mode 100644 mrs_lib/src/attitude_converter/index-sort-l.html create mode 100644 mrs_lib/src/attitude_converter/index.html create mode 100644 mrs_lib/src/batch_visualizer/batch_visualizer.cpp.func-sort-c.html create mode 100644 mrs_lib/src/batch_visualizer/batch_visualizer.cpp.func.html create mode 100644 mrs_lib/src/batch_visualizer/batch_visualizer.cpp.gcov.frameset.html create mode 100644 mrs_lib/src/batch_visualizer/batch_visualizer.cpp.gcov.html create mode 100644 mrs_lib/src/batch_visualizer/batch_visualizer.cpp.gcov.overview.html create mode 100644 mrs_lib/src/batch_visualizer/batch_visualizer.cpp.gcov.png create mode 100644 mrs_lib/src/batch_visualizer/index-detail-sort-f.html create mode 100644 mrs_lib/src/batch_visualizer/index-detail-sort-l.html create mode 100644 mrs_lib/src/batch_visualizer/index-detail.html create mode 100644 mrs_lib/src/batch_visualizer/index-sort-f.html create mode 100644 mrs_lib/src/batch_visualizer/index-sort-l.html create mode 100644 mrs_lib/src/batch_visualizer/index.html create mode 100644 mrs_lib/src/batch_visualizer/visual_object.cpp.func-sort-c.html create mode 100644 mrs_lib/src/batch_visualizer/visual_object.cpp.func.html create mode 100644 mrs_lib/src/batch_visualizer/visual_object.cpp.gcov.frameset.html create mode 100644 mrs_lib/src/batch_visualizer/visual_object.cpp.gcov.html create mode 100644 mrs_lib/src/batch_visualizer/visual_object.cpp.gcov.overview.html create mode 100644 mrs_lib/src/batch_visualizer/visual_object.cpp.gcov.png create mode 100644 mrs_lib/src/geometry/conversions.cpp.func-sort-c.html create mode 100644 mrs_lib/src/geometry/conversions.cpp.func.html create mode 100644 mrs_lib/src/geometry/conversions.cpp.gcov.frameset.html create mode 100644 mrs_lib/src/geometry/conversions.cpp.gcov.html create mode 100644 mrs_lib/src/geometry/conversions.cpp.gcov.overview.html create mode 100644 mrs_lib/src/geometry/conversions.cpp.gcov.png create mode 100644 mrs_lib/src/geometry/index-detail-sort-f.html create mode 100644 mrs_lib/src/geometry/index-detail-sort-l.html create mode 100644 mrs_lib/src/geometry/index-detail.html create mode 100644 mrs_lib/src/geometry/index-sort-f.html create mode 100644 mrs_lib/src/geometry/index-sort-l.html create mode 100644 mrs_lib/src/geometry/index.html create mode 100644 mrs_lib/src/geometry/misc.cpp.func-sort-c.html create mode 100644 mrs_lib/src/geometry/misc.cpp.func.html create mode 100644 mrs_lib/src/geometry/misc.cpp.gcov.frameset.html create mode 100644 mrs_lib/src/geometry/misc.cpp.gcov.html create mode 100644 mrs_lib/src/geometry/misc.cpp.gcov.overview.html create mode 100644 mrs_lib/src/geometry/misc.cpp.gcov.png create mode 100644 mrs_lib/src/geometry/shapes.cpp.func-sort-c.html create mode 100644 mrs_lib/src/geometry/shapes.cpp.func.html create mode 100644 mrs_lib/src/geometry/shapes.cpp.gcov.frameset.html create mode 100644 mrs_lib/src/geometry/shapes.cpp.gcov.html create mode 100644 mrs_lib/src/geometry/shapes.cpp.gcov.overview.html create mode 100644 mrs_lib/src/geometry/shapes.cpp.gcov.png create mode 100644 mrs_lib/src/math/index-detail-sort-f.html create mode 100644 mrs_lib/src/math/index-detail-sort-l.html create mode 100644 mrs_lib/src/math/index-detail.html create mode 100644 mrs_lib/src/math/index-sort-f.html create mode 100644 mrs_lib/src/math/index-sort-l.html create mode 100644 mrs_lib/src/math/index.html create mode 100644 mrs_lib/src/math/math.cpp.func-sort-c.html create mode 100644 mrs_lib/src/math/math.cpp.func.html create mode 100644 mrs_lib/src/math/math.cpp.gcov.frameset.html create mode 100644 mrs_lib/src/math/math.cpp.gcov.html create mode 100644 mrs_lib/src/math/math.cpp.gcov.overview.html create mode 100644 mrs_lib/src/math/math.cpp.gcov.png create mode 100644 mrs_lib/src/median_filter/index-detail-sort-f.html create mode 100644 mrs_lib/src/median_filter/index-detail-sort-l.html create mode 100644 mrs_lib/src/median_filter/index-detail.html create mode 100644 mrs_lib/src/median_filter/index-sort-f.html create mode 100644 mrs_lib/src/median_filter/index-sort-l.html create mode 100644 mrs_lib/src/median_filter/index.html create mode 100644 mrs_lib/src/median_filter/median_filter.cpp.func-sort-c.html create mode 100644 mrs_lib/src/median_filter/median_filter.cpp.func.html create mode 100644 mrs_lib/src/median_filter/median_filter.cpp.gcov.frameset.html create mode 100644 mrs_lib/src/median_filter/median_filter.cpp.gcov.html create mode 100644 mrs_lib/src/median_filter/median_filter.cpp.gcov.overview.html create mode 100644 mrs_lib/src/median_filter/median_filter.cpp.gcov.png create mode 100644 mrs_lib/src/param_loader/index-detail-sort-f.html create mode 100644 mrs_lib/src/param_loader/index-detail-sort-l.html create mode 100644 mrs_lib/src/param_loader/index-detail.html create mode 100644 mrs_lib/src/param_loader/index-sort-f.html create mode 100644 mrs_lib/src/param_loader/index-sort-l.html create mode 100644 mrs_lib/src/param_loader/index.html create mode 100644 mrs_lib/src/param_loader/param_provider.cpp.func-sort-c.html create mode 100644 mrs_lib/src/param_loader/param_provider.cpp.func.html create mode 100644 mrs_lib/src/param_loader/param_provider.cpp.gcov.frameset.html create mode 100644 mrs_lib/src/param_loader/param_provider.cpp.gcov.html create mode 100644 mrs_lib/src/param_loader/param_provider.cpp.gcov.overview.html create mode 100644 mrs_lib/src/param_loader/param_provider.cpp.gcov.png create mode 100644 mrs_lib/src/profiler/index-detail-sort-f.html create mode 100644 mrs_lib/src/profiler/index-detail-sort-l.html create mode 100644 mrs_lib/src/profiler/index-detail.html create mode 100644 mrs_lib/src/profiler/index-sort-f.html create mode 100644 mrs_lib/src/profiler/index-sort-l.html create mode 100644 mrs_lib/src/profiler/index.html create mode 100644 mrs_lib/src/profiler/profiler.cpp.func-sort-c.html create mode 100644 mrs_lib/src/profiler/profiler.cpp.func.html create mode 100644 mrs_lib/src/profiler/profiler.cpp.gcov.frameset.html create mode 100644 mrs_lib/src/profiler/profiler.cpp.gcov.html create mode 100644 mrs_lib/src/profiler/profiler.cpp.gcov.overview.html create mode 100644 mrs_lib/src/profiler/profiler.cpp.gcov.png create mode 100644 mrs_lib/src/safety_zone/index-detail-sort-f.html create mode 100644 mrs_lib/src/safety_zone/index-detail-sort-l.html create mode 100644 mrs_lib/src/safety_zone/index-detail.html create mode 100644 mrs_lib/src/safety_zone/index-sort-f.html create mode 100644 mrs_lib/src/safety_zone/index-sort-l.html create mode 100644 mrs_lib/src/safety_zone/index.html create mode 100644 mrs_lib/src/safety_zone/line_operations.cpp.func-sort-c.html create mode 100644 mrs_lib/src/safety_zone/line_operations.cpp.func.html create mode 100644 mrs_lib/src/safety_zone/line_operations.cpp.gcov.frameset.html create mode 100644 mrs_lib/src/safety_zone/line_operations.cpp.gcov.html create mode 100644 mrs_lib/src/safety_zone/line_operations.cpp.gcov.overview.html create mode 100644 mrs_lib/src/safety_zone/line_operations.cpp.gcov.png create mode 100644 mrs_lib/src/safety_zone/polygon/index-detail-sort-f.html create mode 100644 mrs_lib/src/safety_zone/polygon/index-detail-sort-l.html create mode 100644 mrs_lib/src/safety_zone/polygon/index-detail.html create mode 100644 mrs_lib/src/safety_zone/polygon/index-sort-f.html create mode 100644 mrs_lib/src/safety_zone/polygon/index-sort-l.html create mode 100644 mrs_lib/src/safety_zone/polygon/index.html create mode 100644 mrs_lib/src/safety_zone/polygon/polygon.cpp.func-sort-c.html create mode 100644 mrs_lib/src/safety_zone/polygon/polygon.cpp.func.html create mode 100644 mrs_lib/src/safety_zone/polygon/polygon.cpp.gcov.frameset.html create mode 100644 mrs_lib/src/safety_zone/polygon/polygon.cpp.gcov.html create mode 100644 mrs_lib/src/safety_zone/polygon/polygon.cpp.gcov.overview.html create mode 100644 mrs_lib/src/safety_zone/polygon/polygon.cpp.gcov.png create mode 100644 mrs_lib/src/safety_zone/safety_zone.cpp.func-sort-c.html create mode 100644 mrs_lib/src/safety_zone/safety_zone.cpp.func.html create mode 100644 mrs_lib/src/safety_zone/safety_zone.cpp.gcov.frameset.html create mode 100644 mrs_lib/src/safety_zone/safety_zone.cpp.gcov.html create mode 100644 mrs_lib/src/safety_zone/safety_zone.cpp.gcov.overview.html create mode 100644 mrs_lib/src/safety_zone/safety_zone.cpp.gcov.png create mode 100644 mrs_lib/src/scope_timer/index-detail-sort-f.html create mode 100644 mrs_lib/src/scope_timer/index-detail-sort-l.html create mode 100644 mrs_lib/src/scope_timer/index-detail.html create mode 100644 mrs_lib/src/scope_timer/index-sort-f.html create mode 100644 mrs_lib/src/scope_timer/index-sort-l.html create mode 100644 mrs_lib/src/scope_timer/index.html create mode 100644 mrs_lib/src/scope_timer/scope_timer.cpp.func-sort-c.html create mode 100644 mrs_lib/src/scope_timer/scope_timer.cpp.func.html create mode 100644 mrs_lib/src/scope_timer/scope_timer.cpp.gcov.frameset.html create mode 100644 mrs_lib/src/scope_timer/scope_timer.cpp.gcov.html create mode 100644 mrs_lib/src/scope_timer/scope_timer.cpp.gcov.overview.html create mode 100644 mrs_lib/src/scope_timer/scope_timer.cpp.gcov.png create mode 100644 mrs_lib/src/timeout_manager/index-detail-sort-f.html create mode 100644 mrs_lib/src/timeout_manager/index-detail-sort-l.html create mode 100644 mrs_lib/src/timeout_manager/index-detail.html create mode 100644 mrs_lib/src/timeout_manager/index-sort-f.html create mode 100644 mrs_lib/src/timeout_manager/index-sort-l.html create mode 100644 mrs_lib/src/timeout_manager/index.html create mode 100644 mrs_lib/src/timeout_manager/timeout_manager.cpp.func-sort-c.html create mode 100644 mrs_lib/src/timeout_manager/timeout_manager.cpp.func.html create mode 100644 mrs_lib/src/timeout_manager/timeout_manager.cpp.gcov.frameset.html create mode 100644 mrs_lib/src/timeout_manager/timeout_manager.cpp.gcov.html create mode 100644 mrs_lib/src/timeout_manager/timeout_manager.cpp.gcov.overview.html create mode 100644 mrs_lib/src/timeout_manager/timeout_manager.cpp.gcov.png create mode 100644 mrs_lib/src/timer/index-detail-sort-f.html create mode 100644 mrs_lib/src/timer/index-detail-sort-l.html create mode 100644 mrs_lib/src/timer/index-detail.html create mode 100644 mrs_lib/src/timer/index-sort-f.html create mode 100644 mrs_lib/src/timer/index-sort-l.html create mode 100644 mrs_lib/src/timer/index.html create mode 100644 mrs_lib/src/timer/timer.cpp.func-sort-c.html create mode 100644 mrs_lib/src/timer/timer.cpp.func.html create mode 100644 mrs_lib/src/timer/timer.cpp.gcov.frameset.html create mode 100644 mrs_lib/src/timer/timer.cpp.gcov.html create mode 100644 mrs_lib/src/timer/timer.cpp.gcov.overview.html create mode 100644 mrs_lib/src/timer/timer.cpp.gcov.png create mode 100644 mrs_lib/src/transform_broadcaster/index-detail-sort-f.html create mode 100644 mrs_lib/src/transform_broadcaster/index-detail-sort-l.html create mode 100644 mrs_lib/src/transform_broadcaster/index-detail.html create mode 100644 mrs_lib/src/transform_broadcaster/index-sort-f.html create mode 100644 mrs_lib/src/transform_broadcaster/index-sort-l.html create mode 100644 mrs_lib/src/transform_broadcaster/index.html create mode 100644 mrs_lib/src/transform_broadcaster/transform_broadcaster.cpp.func-sort-c.html create mode 100644 mrs_lib/src/transform_broadcaster/transform_broadcaster.cpp.func.html create mode 100644 mrs_lib/src/transform_broadcaster/transform_broadcaster.cpp.gcov.frameset.html create mode 100644 mrs_lib/src/transform_broadcaster/transform_broadcaster.cpp.gcov.html create mode 100644 mrs_lib/src/transform_broadcaster/transform_broadcaster.cpp.gcov.overview.html create mode 100644 mrs_lib/src/transform_broadcaster/transform_broadcaster.cpp.gcov.png create mode 100644 mrs_lib/src/transformer/index-detail-sort-f.html create mode 100644 mrs_lib/src/transformer/index-detail-sort-l.html create mode 100644 mrs_lib/src/transformer/index-detail.html create mode 100644 mrs_lib/src/transformer/index-sort-f.html create mode 100644 mrs_lib/src/transformer/index-sort-l.html create mode 100644 mrs_lib/src/transformer/index.html create mode 100644 mrs_lib/src/transformer/transformer.cpp.func-sort-c.html create mode 100644 mrs_lib/src/transformer/transformer.cpp.func.html create mode 100644 mrs_lib/src/transformer/transformer.cpp.gcov.frameset.html create mode 100644 mrs_lib/src/transformer/transformer.cpp.gcov.html create mode 100644 mrs_lib/src/transformer/transformer.cpp.gcov.overview.html create mode 100644 mrs_lib/src/transformer/transformer.cpp.gcov.png create mode 100644 mrs_lib/src/utils/index-detail-sort-f.html create mode 100644 mrs_lib/src/utils/index-detail-sort-l.html create mode 100644 mrs_lib/src/utils/index-detail.html create mode 100644 mrs_lib/src/utils/index-sort-f.html create mode 100644 mrs_lib/src/utils/index-sort-l.html create mode 100644 mrs_lib/src/utils/index.html create mode 100644 mrs_lib/src/utils/utils.cpp.func-sort-c.html create mode 100644 mrs_lib/src/utils/utils.cpp.func.html create mode 100644 mrs_lib/src/utils/utils.cpp.gcov.frameset.html create mode 100644 mrs_lib/src/utils/utils.cpp.gcov.html create mode 100644 mrs_lib/src/utils/utils.cpp.gcov.overview.html create mode 100644 mrs_lib/src/utils/utils.cpp.gcov.png create mode 100644 mrs_uav_autostart/src/automatic_start.cpp.func-sort-c.html create mode 100644 mrs_uav_autostart/src/automatic_start.cpp.func.html create mode 100644 mrs_uav_autostart/src/automatic_start.cpp.gcov.frameset.html create mode 100644 mrs_uav_autostart/src/automatic_start.cpp.gcov.html create mode 100644 mrs_uav_autostart/src/automatic_start.cpp.gcov.overview.html create mode 100644 mrs_uav_autostart/src/automatic_start.cpp.gcov.png create mode 100644 mrs_uav_autostart/src/index-detail-sort-f.html create mode 100644 mrs_uav_autostart/src/index-detail-sort-l.html create mode 100644 mrs_uav_autostart/src/index-detail.html create mode 100644 mrs_uav_autostart/src/index-sort-f.html create mode 100644 mrs_uav_autostart/src/index-sort-l.html create mode 100644 mrs_uav_autostart/src/index.html create mode 100644 mrs_uav_controllers/include/common.h.func-sort-c.html create mode 100644 mrs_uav_controllers/include/common.h.func.html create mode 100644 mrs_uav_controllers/include/common.h.gcov.frameset.html create mode 100644 mrs_uav_controllers/include/common.h.gcov.html create mode 100644 mrs_uav_controllers/include/common.h.gcov.overview.html create mode 100644 mrs_uav_controllers/include/common.h.gcov.png create mode 100644 mrs_uav_controllers/include/index-detail-sort-f.html create mode 100644 mrs_uav_controllers/include/index-detail-sort-l.html create mode 100644 mrs_uav_controllers/include/index-detail.html create mode 100644 mrs_uav_controllers/include/index-sort-f.html create mode 100644 mrs_uav_controllers/include/index-sort-l.html create mode 100644 mrs_uav_controllers/include/index.html create mode 100644 mrs_uav_controllers/include/pid.hpp.func-sort-c.html create mode 100644 mrs_uav_controllers/include/pid.hpp.func.html create mode 100644 mrs_uav_controllers/include/pid.hpp.gcov.frameset.html create mode 100644 mrs_uav_controllers/include/pid.hpp.gcov.html create mode 100644 mrs_uav_controllers/include/pid.hpp.gcov.overview.html create mode 100644 mrs_uav_controllers/include/pid.hpp.gcov.png create mode 100644 mrs_uav_controllers/src/common.cpp.func-sort-c.html create mode 100644 mrs_uav_controllers/src/common.cpp.func.html create mode 100644 mrs_uav_controllers/src/common.cpp.gcov.frameset.html create mode 100644 mrs_uav_controllers/src/common.cpp.gcov.html create mode 100644 mrs_uav_controllers/src/common.cpp.gcov.overview.html create mode 100644 mrs_uav_controllers/src/common.cpp.gcov.png create mode 100644 mrs_uav_controllers/src/failsafe_controller.cpp.func-sort-c.html create mode 100644 mrs_uav_controllers/src/failsafe_controller.cpp.func.html create mode 100644 mrs_uav_controllers/src/failsafe_controller.cpp.gcov.frameset.html create mode 100644 mrs_uav_controllers/src/failsafe_controller.cpp.gcov.html create mode 100644 mrs_uav_controllers/src/failsafe_controller.cpp.gcov.overview.html create mode 100644 mrs_uav_controllers/src/failsafe_controller.cpp.gcov.png create mode 100644 mrs_uav_controllers/src/index-detail-sort-f.html create mode 100644 mrs_uav_controllers/src/index-detail-sort-l.html create mode 100644 mrs_uav_controllers/src/index-detail.html create mode 100644 mrs_uav_controllers/src/index-sort-f.html create mode 100644 mrs_uav_controllers/src/index-sort-l.html create mode 100644 mrs_uav_controllers/src/index.html create mode 100644 mrs_uav_controllers/src/midair_activation_controller.cpp.func-sort-c.html create mode 100644 mrs_uav_controllers/src/midair_activation_controller.cpp.func.html create mode 100644 mrs_uav_controllers/src/midair_activation_controller.cpp.gcov.frameset.html create mode 100644 mrs_uav_controllers/src/midair_activation_controller.cpp.gcov.html create mode 100644 mrs_uav_controllers/src/midair_activation_controller.cpp.gcov.overview.html create mode 100644 mrs_uav_controllers/src/midair_activation_controller.cpp.gcov.png create mode 100644 mrs_uav_controllers/src/mpc_controller.cpp.func-sort-c.html create mode 100644 mrs_uav_controllers/src/mpc_controller.cpp.func.html create mode 100644 mrs_uav_controllers/src/mpc_controller.cpp.gcov.frameset.html create mode 100644 mrs_uav_controllers/src/mpc_controller.cpp.gcov.html create mode 100644 mrs_uav_controllers/src/mpc_controller.cpp.gcov.overview.html create mode 100644 mrs_uav_controllers/src/mpc_controller.cpp.gcov.png create mode 100644 mrs_uav_controllers/src/se3_controller.cpp.func-sort-c.html create mode 100644 mrs_uav_controllers/src/se3_controller.cpp.func.html create mode 100644 mrs_uav_controllers/src/se3_controller.cpp.gcov.frameset.html create mode 100644 mrs_uav_controllers/src/se3_controller.cpp.gcov.html create mode 100644 mrs_uav_controllers/src/se3_controller.cpp.gcov.overview.html create mode 100644 mrs_uav_controllers/src/se3_controller.cpp.gcov.png create mode 100644 mrs_uav_managers/include/control_manager/index-detail-sort-f.html create mode 100644 mrs_uav_managers/include/control_manager/index-detail-sort-l.html create mode 100644 mrs_uav_managers/include/control_manager/index-detail.html create mode 100644 mrs_uav_managers/include/control_manager/index-sort-f.html create mode 100644 mrs_uav_managers/include/control_manager/index-sort-l.html create mode 100644 mrs_uav_managers/include/control_manager/index.html create mode 100644 mrs_uav_managers/include/control_manager/output_publisher.h.func-sort-c.html create mode 100644 mrs_uav_managers/include/control_manager/output_publisher.h.func.html create mode 100644 mrs_uav_managers/include/control_manager/output_publisher.h.gcov.frameset.html create mode 100644 mrs_uav_managers/include/control_manager/output_publisher.h.gcov.html create mode 100644 mrs_uav_managers/include/control_manager/output_publisher.h.gcov.overview.html create mode 100644 mrs_uav_managers/include/control_manager/output_publisher.h.gcov.png create mode 100644 mrs_uav_managers/include/mrs_uav_managers/agl_estimator.h.func-sort-c.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/agl_estimator.h.func.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/agl_estimator.h.gcov.frameset.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/agl_estimator.h.gcov.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/agl_estimator.h.gcov.overview.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/agl_estimator.h.gcov.png create mode 100644 mrs_uav_managers/include/mrs_uav_managers/control_manager/common.h.func-sort-c.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/control_manager/common.h.func.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/control_manager/common.h.gcov.frameset.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/control_manager/common.h.gcov.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/control_manager/common.h.gcov.overview.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/control_manager/common.h.gcov.png create mode 100644 mrs_uav_managers/include/mrs_uav_managers/control_manager/index-detail-sort-f.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/control_manager/index-detail-sort-l.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/control_manager/index-detail.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/control_manager/index-sort-f.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/control_manager/index-sort-l.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/control_manager/index.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/controller.h.func-sort-c.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/controller.h.func.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/controller.h.gcov.frameset.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/controller.h.gcov.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/controller.h.gcov.overview.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/controller.h.gcov.png create mode 100644 mrs_uav_managers/include/mrs_uav_managers/estimation_manager/estimator.h.func-sort-c.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/estimation_manager/estimator.h.func.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/estimation_manager/estimator.h.gcov.frameset.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/estimation_manager/estimator.h.gcov.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/estimation_manager/estimator.h.gcov.overview.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/estimation_manager/estimator.h.gcov.png create mode 100644 mrs_uav_managers/include/mrs_uav_managers/estimation_manager/index-detail-sort-f.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/estimation_manager/index-detail-sort-l.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/estimation_manager/index-detail.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/estimation_manager/index-sort-f.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/estimation_manager/index-sort-l.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/estimation_manager/index.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/estimation_manager/support.h.func-sort-c.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/estimation_manager/support.h.func.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/estimation_manager/support.h.gcov.frameset.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/estimation_manager/support.h.gcov.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/estimation_manager/support.h.gcov.overview.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/estimation_manager/support.h.gcov.png create mode 100644 mrs_uav_managers/include/mrs_uav_managers/index-detail-sort-f.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/index-detail-sort-l.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/index-detail.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/index-sort-f.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/index-sort-l.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/index.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/state_estimator.h.func-sort-c.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/state_estimator.h.func.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/state_estimator.h.gcov.frameset.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/state_estimator.h.gcov.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/state_estimator.h.gcov.overview.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/state_estimator.h.gcov.png create mode 100644 mrs_uav_managers/include/mrs_uav_managers/tracker.h.func-sort-c.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/tracker.h.func.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/tracker.h.gcov.frameset.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/tracker.h.gcov.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/tracker.h.gcov.overview.html create mode 100644 mrs_uav_managers/include/mrs_uav_managers/tracker.h.gcov.png create mode 100644 mrs_uav_managers/include/transform_manager/index-detail-sort-f.html create mode 100644 mrs_uav_managers/include/transform_manager/index-detail-sort-l.html create mode 100644 mrs_uav_managers/include/transform_manager/index-detail.html create mode 100644 mrs_uav_managers/include/transform_manager/index-sort-f.html create mode 100644 mrs_uav_managers/include/transform_manager/index-sort-l.html create mode 100644 mrs_uav_managers/include/transform_manager/index.html create mode 100644 mrs_uav_managers/include/transform_manager/tf_mapping_origin.h.func-sort-c.html create mode 100644 mrs_uav_managers/include/transform_manager/tf_mapping_origin.h.func.html create mode 100644 mrs_uav_managers/include/transform_manager/tf_mapping_origin.h.gcov.frameset.html create mode 100644 mrs_uav_managers/include/transform_manager/tf_mapping_origin.h.gcov.html create mode 100644 mrs_uav_managers/include/transform_manager/tf_mapping_origin.h.gcov.overview.html create mode 100644 mrs_uav_managers/include/transform_manager/tf_mapping_origin.h.gcov.png create mode 100644 mrs_uav_managers/include/transform_manager/tf_source.h.func-sort-c.html create mode 100644 mrs_uav_managers/include/transform_manager/tf_source.h.func.html create mode 100644 mrs_uav_managers/include/transform_manager/tf_source.h.gcov.frameset.html create mode 100644 mrs_uav_managers/include/transform_manager/tf_source.h.gcov.html create mode 100644 mrs_uav_managers/include/transform_manager/tf_source.h.gcov.overview.html create mode 100644 mrs_uav_managers/include/transform_manager/tf_source.h.gcov.png create mode 100644 mrs_uav_managers/src/constraint_manager.cpp.func-sort-c.html create mode 100644 mrs_uav_managers/src/constraint_manager.cpp.func.html create mode 100644 mrs_uav_managers/src/constraint_manager.cpp.gcov.frameset.html create mode 100644 mrs_uav_managers/src/constraint_manager.cpp.gcov.html create mode 100644 mrs_uav_managers/src/constraint_manager.cpp.gcov.overview.html create mode 100644 mrs_uav_managers/src/constraint_manager.cpp.gcov.png create mode 100644 mrs_uav_managers/src/control_manager/common/common.cpp.func-sort-c.html create mode 100644 mrs_uav_managers/src/control_manager/common/common.cpp.func.html create mode 100644 mrs_uav_managers/src/control_manager/common/common.cpp.gcov.frameset.html create mode 100644 mrs_uav_managers/src/control_manager/common/common.cpp.gcov.html create mode 100644 mrs_uav_managers/src/control_manager/common/common.cpp.gcov.overview.html create mode 100644 mrs_uav_managers/src/control_manager/common/common.cpp.gcov.png create mode 100644 mrs_uav_managers/src/control_manager/common/index-detail-sort-f.html create mode 100644 mrs_uav_managers/src/control_manager/common/index-detail-sort-l.html create mode 100644 mrs_uav_managers/src/control_manager/common/index-detail.html create mode 100644 mrs_uav_managers/src/control_manager/common/index-sort-f.html create mode 100644 mrs_uav_managers/src/control_manager/common/index-sort-l.html create mode 100644 mrs_uav_managers/src/control_manager/common/index.html create mode 100644 mrs_uav_managers/src/control_manager/control_manager.cpp.func-sort-c.html create mode 100644 mrs_uav_managers/src/control_manager/control_manager.cpp.func.html create mode 100644 mrs_uav_managers/src/control_manager/control_manager.cpp.gcov.frameset.html create mode 100644 mrs_uav_managers/src/control_manager/control_manager.cpp.gcov.html create mode 100644 mrs_uav_managers/src/control_manager/control_manager.cpp.gcov.overview.html create mode 100644 mrs_uav_managers/src/control_manager/control_manager.cpp.gcov.png create mode 100644 mrs_uav_managers/src/control_manager/index-detail-sort-f.html create mode 100644 mrs_uav_managers/src/control_manager/index-detail-sort-l.html create mode 100644 mrs_uav_managers/src/control_manager/index-detail.html create mode 100644 mrs_uav_managers/src/control_manager/index-sort-f.html create mode 100644 mrs_uav_managers/src/control_manager/index-sort-l.html create mode 100644 mrs_uav_managers/src/control_manager/index.html create mode 100644 mrs_uav_managers/src/control_manager/output_publisher.cpp.func-sort-c.html create mode 100644 mrs_uav_managers/src/control_manager/output_publisher.cpp.func.html create mode 100644 mrs_uav_managers/src/control_manager/output_publisher.cpp.gcov.frameset.html create mode 100644 mrs_uav_managers/src/control_manager/output_publisher.cpp.gcov.html create mode 100644 mrs_uav_managers/src/control_manager/output_publisher.cpp.gcov.overview.html create mode 100644 mrs_uav_managers/src/control_manager/output_publisher.cpp.gcov.png create mode 100644 mrs_uav_managers/src/estimation_manager/estimation_manager.cpp.func-sort-c.html create mode 100644 mrs_uav_managers/src/estimation_manager/estimation_manager.cpp.func.html create mode 100644 mrs_uav_managers/src/estimation_manager/estimation_manager.cpp.gcov.frameset.html create mode 100644 mrs_uav_managers/src/estimation_manager/estimation_manager.cpp.gcov.html create mode 100644 mrs_uav_managers/src/estimation_manager/estimation_manager.cpp.gcov.overview.html create mode 100644 mrs_uav_managers/src/estimation_manager/estimation_manager.cpp.gcov.png create mode 100644 mrs_uav_managers/src/estimation_manager/estimator.cpp.func-sort-c.html create mode 100644 mrs_uav_managers/src/estimation_manager/estimator.cpp.func.html create mode 100644 mrs_uav_managers/src/estimation_manager/estimator.cpp.gcov.frameset.html create mode 100644 mrs_uav_managers/src/estimation_manager/estimator.cpp.gcov.html create mode 100644 mrs_uav_managers/src/estimation_manager/estimator.cpp.gcov.overview.html create mode 100644 mrs_uav_managers/src/estimation_manager/estimator.cpp.gcov.png create mode 100644 mrs_uav_managers/src/estimation_manager/estimators/agl_estimator.cpp.func-sort-c.html create mode 100644 mrs_uav_managers/src/estimation_manager/estimators/agl_estimator.cpp.func.html create mode 100644 mrs_uav_managers/src/estimation_manager/estimators/agl_estimator.cpp.gcov.frameset.html create mode 100644 mrs_uav_managers/src/estimation_manager/estimators/agl_estimator.cpp.gcov.html create mode 100644 mrs_uav_managers/src/estimation_manager/estimators/agl_estimator.cpp.gcov.overview.html create mode 100644 mrs_uav_managers/src/estimation_manager/estimators/agl_estimator.cpp.gcov.png create mode 100644 mrs_uav_managers/src/estimation_manager/estimators/index-detail-sort-f.html create mode 100644 mrs_uav_managers/src/estimation_manager/estimators/index-detail-sort-l.html create mode 100644 mrs_uav_managers/src/estimation_manager/estimators/index-detail.html create mode 100644 mrs_uav_managers/src/estimation_manager/estimators/index-sort-f.html create mode 100644 mrs_uav_managers/src/estimation_manager/estimators/index-sort-l.html create mode 100644 mrs_uav_managers/src/estimation_manager/estimators/index.html create mode 100644 mrs_uav_managers/src/estimation_manager/estimators/state_estimator.cpp.func-sort-c.html create mode 100644 mrs_uav_managers/src/estimation_manager/estimators/state_estimator.cpp.func.html create mode 100644 mrs_uav_managers/src/estimation_manager/estimators/state_estimator.cpp.gcov.frameset.html create mode 100644 mrs_uav_managers/src/estimation_manager/estimators/state_estimator.cpp.gcov.html create mode 100644 mrs_uav_managers/src/estimation_manager/estimators/state_estimator.cpp.gcov.overview.html create mode 100644 mrs_uav_managers/src/estimation_manager/estimators/state_estimator.cpp.gcov.png create mode 100644 mrs_uav_managers/src/estimation_manager/index-detail-sort-f.html create mode 100644 mrs_uav_managers/src/estimation_manager/index-detail-sort-l.html create mode 100644 mrs_uav_managers/src/estimation_manager/index-detail.html create mode 100644 mrs_uav_managers/src/estimation_manager/index-sort-f.html create mode 100644 mrs_uav_managers/src/estimation_manager/index-sort-l.html create mode 100644 mrs_uav_managers/src/estimation_manager/index.html create mode 100644 mrs_uav_managers/src/gain_manager.cpp.func-sort-c.html create mode 100644 mrs_uav_managers/src/gain_manager.cpp.func.html create mode 100644 mrs_uav_managers/src/gain_manager.cpp.gcov.frameset.html create mode 100644 mrs_uav_managers/src/gain_manager.cpp.gcov.html create mode 100644 mrs_uav_managers/src/gain_manager.cpp.gcov.overview.html create mode 100644 mrs_uav_managers/src/gain_manager.cpp.gcov.png create mode 100644 mrs_uav_managers/src/index-detail-sort-f.html create mode 100644 mrs_uav_managers/src/index-detail-sort-l.html create mode 100644 mrs_uav_managers/src/index-detail.html create mode 100644 mrs_uav_managers/src/index-sort-f.html create mode 100644 mrs_uav_managers/src/index-sort-l.html create mode 100644 mrs_uav_managers/src/index.html create mode 100644 mrs_uav_managers/src/null_tracker.cpp.func-sort-c.html create mode 100644 mrs_uav_managers/src/null_tracker.cpp.func.html create mode 100644 mrs_uav_managers/src/null_tracker.cpp.gcov.frameset.html create mode 100644 mrs_uav_managers/src/null_tracker.cpp.gcov.html create mode 100644 mrs_uav_managers/src/null_tracker.cpp.gcov.overview.html create mode 100644 mrs_uav_managers/src/null_tracker.cpp.gcov.png create mode 100644 mrs_uav_managers/src/transform_manager/index-detail-sort-f.html create mode 100644 mrs_uav_managers/src/transform_manager/index-detail-sort-l.html create mode 100644 mrs_uav_managers/src/transform_manager/index-detail.html create mode 100644 mrs_uav_managers/src/transform_manager/index-sort-f.html create mode 100644 mrs_uav_managers/src/transform_manager/index-sort-l.html create mode 100644 mrs_uav_managers/src/transform_manager/index.html create mode 100644 mrs_uav_managers/src/transform_manager/transform_manager.cpp.func-sort-c.html create mode 100644 mrs_uav_managers/src/transform_manager/transform_manager.cpp.func.html create mode 100644 mrs_uav_managers/src/transform_manager/transform_manager.cpp.gcov.frameset.html create mode 100644 mrs_uav_managers/src/transform_manager/transform_manager.cpp.gcov.html create mode 100644 mrs_uav_managers/src/transform_manager/transform_manager.cpp.gcov.overview.html create mode 100644 mrs_uav_managers/src/transform_manager/transform_manager.cpp.gcov.png create mode 100644 mrs_uav_managers/src/uav_manager.cpp.func-sort-c.html create mode 100644 mrs_uav_managers/src/uav_manager.cpp.func.html create mode 100644 mrs_uav_managers/src/uav_manager.cpp.gcov.frameset.html create mode 100644 mrs_uav_managers/src/uav_manager.cpp.gcov.html create mode 100644 mrs_uav_managers/src/uav_manager.cpp.gcov.overview.html create mode 100644 mrs_uav_managers/src/uav_manager.cpp.gcov.png create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/garmin_agl.h.func-sort-c.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/garmin_agl.h.func.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/garmin_agl.h.gcov.frameset.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/garmin_agl.h.gcov.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/garmin_agl.h.gcov.overview.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/garmin_agl.h.gcov.png create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/index-detail-sort-f.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/index-detail-sort-l.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/index-detail.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/index-sort-f.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/index-sort-l.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/index.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/alt_generic.h.func-sort-c.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/alt_generic.h.func.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/alt_generic.h.gcov.frameset.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/alt_generic.h.gcov.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/alt_generic.h.gcov.overview.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/alt_generic.h.gcov.png create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/altitude_estimator.h.func-sort-c.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/altitude_estimator.h.func.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/altitude_estimator.h.gcov.frameset.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/altitude_estimator.h.gcov.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/altitude_estimator.h.gcov.overview.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/altitude_estimator.h.gcov.png create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/index-detail-sort-f.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/index-detail-sort-l.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/index-detail.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/index-sort-f.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/index-sort-l.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/index.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/correction.h.func-sort-c.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/correction.h.func.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/correction.h.gcov.frameset.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/correction.h.gcov.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/correction.h.gcov.overview.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/correction.h.gcov.png create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_generic.h.func-sort-c.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_generic.h.func.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_generic.h.gcov.frameset.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_generic.h.gcov.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_generic.h.gcov.overview.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_generic.h.gcov.png create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_passthrough.h.func-sort-c.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_passthrough.h.func.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_passthrough.h.gcov.frameset.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_passthrough.h.gcov.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_passthrough.h.gcov.overview.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_passthrough.h.gcov.png create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/heading_estimator.h.func-sort-c.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/heading_estimator.h.func.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/heading_estimator.h.gcov.frameset.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/heading_estimator.h.gcov.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/heading_estimator.h.gcov.overview.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/heading_estimator.h.gcov.png create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/index-detail-sort-f.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/index-detail-sort-l.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/index-detail.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/index-sort-f.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/index-sort-l.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/index.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/index-detail-sort-f.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/index-detail-sort-l.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/index-detail.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/index-sort-f.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/index-sort-l.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/index.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/index-detail-sort-f.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/index-detail-sort-l.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/index-detail.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/index-sort-f.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/index-sort-l.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/index.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lat_generic.h.func-sort-c.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lat_generic.h.func.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lat_generic.h.gcov.frameset.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lat_generic.h.gcov.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lat_generic.h.gcov.overview.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lat_generic.h.gcov.png create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lateral_estimator.h.func-sort-c.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lateral_estimator.h.func.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lateral_estimator.h.gcov.frameset.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lateral_estimator.h.gcov.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lateral_estimator.h.gcov.overview.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lateral_estimator.h.gcov.png create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/partial_estimator.h.func-sort-c.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/partial_estimator.h.func.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/partial_estimator.h.gcov.frameset.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/partial_estimator.h.gcov.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/partial_estimator.h.gcov.overview.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/partial_estimator.h.gcov.png create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/index-detail-sort-f.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/index-detail-sort-l.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/index-detail.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/index-sort-f.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/index-sort-l.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/index.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/passthrough.h.func-sort-c.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/passthrough.h.func.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/passthrough.h.gcov.frameset.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/passthrough.h.gcov.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/passthrough.h.gcov.overview.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/passthrough.h.gcov.png create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/state_generic.h.func-sort-c.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/state_generic.h.func.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/state_generic.h.gcov.frameset.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/state_generic.h.gcov.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/state_generic.h.gcov.overview.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/state_generic.h.gcov.png create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/index-detail-sort-f.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/index-detail-sort-l.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/index-detail.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/index-sort-f.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/index-sort-l.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/index.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_excessive_tilt.h.func-sort-c.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_excessive_tilt.h.func.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_excessive_tilt.h.gcov.frameset.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_excessive_tilt.h.gcov.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_excessive_tilt.h.gcov.overview.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_excessive_tilt.h.gcov.png create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_median_filter.h.func-sort-c.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_median_filter.h.func.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_median_filter.h.gcov.frameset.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_median_filter.h.gcov.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_median_filter.h.gcov.overview.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_median_filter.h.gcov.png create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_saturate.h.func-sort-c.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_saturate.h.func.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_saturate.h.gcov.frameset.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_saturate.h.gcov.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_saturate.h.gcov.overview.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_saturate.h.gcov.png create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_tf_to_world.h.func-sort-c.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_tf_to_world.h.func.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_tf_to_world.h.gcov.frameset.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_tf_to_world.h.gcov.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_tf_to_world.h.gcov.overview.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_tf_to_world.h.gcov.png create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/processor.h.func-sort-c.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/processor.h.func.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/processor.h.gcov.frameset.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/processor.h.gcov.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/processor.h.gcov.overview.html create mode 100644 mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/processor.h.gcov.png create mode 100644 mrs_uav_state_estimators/src/estimators/agl/garmin_agl.cpp.func-sort-c.html create mode 100644 mrs_uav_state_estimators/src/estimators/agl/garmin_agl.cpp.func.html create mode 100644 mrs_uav_state_estimators/src/estimators/agl/garmin_agl.cpp.gcov.frameset.html create mode 100644 mrs_uav_state_estimators/src/estimators/agl/garmin_agl.cpp.gcov.html create mode 100644 mrs_uav_state_estimators/src/estimators/agl/garmin_agl.cpp.gcov.overview.html create mode 100644 mrs_uav_state_estimators/src/estimators/agl/garmin_agl.cpp.gcov.png create mode 100644 mrs_uav_state_estimators/src/estimators/agl/index-detail-sort-f.html create mode 100644 mrs_uav_state_estimators/src/estimators/agl/index-detail-sort-l.html create mode 100644 mrs_uav_state_estimators/src/estimators/agl/index-detail.html create mode 100644 mrs_uav_state_estimators/src/estimators/agl/index-sort-f.html create mode 100644 mrs_uav_state_estimators/src/estimators/agl/index-sort-l.html create mode 100644 mrs_uav_state_estimators/src/estimators/agl/index.html create mode 100644 mrs_uav_state_estimators/src/estimators/altitude/alt_generic.cpp.func-sort-c.html create mode 100644 mrs_uav_state_estimators/src/estimators/altitude/alt_generic.cpp.func.html create mode 100644 mrs_uav_state_estimators/src/estimators/altitude/alt_generic.cpp.gcov.frameset.html create mode 100644 mrs_uav_state_estimators/src/estimators/altitude/alt_generic.cpp.gcov.html create mode 100644 mrs_uav_state_estimators/src/estimators/altitude/alt_generic.cpp.gcov.overview.html create mode 100644 mrs_uav_state_estimators/src/estimators/altitude/alt_generic.cpp.gcov.png create mode 100644 mrs_uav_state_estimators/src/estimators/altitude/index-detail-sort-f.html create mode 100644 mrs_uav_state_estimators/src/estimators/altitude/index-detail-sort-l.html create mode 100644 mrs_uav_state_estimators/src/estimators/altitude/index-detail.html create mode 100644 mrs_uav_state_estimators/src/estimators/altitude/index-sort-f.html create mode 100644 mrs_uav_state_estimators/src/estimators/altitude/index-sort-l.html create mode 100644 mrs_uav_state_estimators/src/estimators/altitude/index.html create mode 100644 mrs_uav_state_estimators/src/estimators/heading/hdg_generic.cpp.func-sort-c.html create mode 100644 mrs_uav_state_estimators/src/estimators/heading/hdg_generic.cpp.func.html create mode 100644 mrs_uav_state_estimators/src/estimators/heading/hdg_generic.cpp.gcov.frameset.html create mode 100644 mrs_uav_state_estimators/src/estimators/heading/hdg_generic.cpp.gcov.html create mode 100644 mrs_uav_state_estimators/src/estimators/heading/hdg_generic.cpp.gcov.overview.html create mode 100644 mrs_uav_state_estimators/src/estimators/heading/hdg_generic.cpp.gcov.png create mode 100644 mrs_uav_state_estimators/src/estimators/heading/hdg_passthrough.cpp.func-sort-c.html create mode 100644 mrs_uav_state_estimators/src/estimators/heading/hdg_passthrough.cpp.func.html create mode 100644 mrs_uav_state_estimators/src/estimators/heading/hdg_passthrough.cpp.gcov.frameset.html create mode 100644 mrs_uav_state_estimators/src/estimators/heading/hdg_passthrough.cpp.gcov.html create mode 100644 mrs_uav_state_estimators/src/estimators/heading/hdg_passthrough.cpp.gcov.overview.html create mode 100644 mrs_uav_state_estimators/src/estimators/heading/hdg_passthrough.cpp.gcov.png create mode 100644 mrs_uav_state_estimators/src/estimators/heading/index-detail-sort-f.html create mode 100644 mrs_uav_state_estimators/src/estimators/heading/index-detail-sort-l.html create mode 100644 mrs_uav_state_estimators/src/estimators/heading/index-detail.html create mode 100644 mrs_uav_state_estimators/src/estimators/heading/index-sort-f.html create mode 100644 mrs_uav_state_estimators/src/estimators/heading/index-sort-l.html create mode 100644 mrs_uav_state_estimators/src/estimators/heading/index.html create mode 100644 mrs_uav_state_estimators/src/estimators/lateral/index-detail-sort-f.html create mode 100644 mrs_uav_state_estimators/src/estimators/lateral/index-detail-sort-l.html create mode 100644 mrs_uav_state_estimators/src/estimators/lateral/index-detail.html create mode 100644 mrs_uav_state_estimators/src/estimators/lateral/index-sort-f.html create mode 100644 mrs_uav_state_estimators/src/estimators/lateral/index-sort-l.html create mode 100644 mrs_uav_state_estimators/src/estimators/lateral/index.html create mode 100644 mrs_uav_state_estimators/src/estimators/lateral/lat_generic.cpp.func-sort-c.html create mode 100644 mrs_uav_state_estimators/src/estimators/lateral/lat_generic.cpp.func.html create mode 100644 mrs_uav_state_estimators/src/estimators/lateral/lat_generic.cpp.gcov.frameset.html create mode 100644 mrs_uav_state_estimators/src/estimators/lateral/lat_generic.cpp.gcov.html create mode 100644 mrs_uav_state_estimators/src/estimators/lateral/lat_generic.cpp.gcov.overview.html create mode 100644 mrs_uav_state_estimators/src/estimators/lateral/lat_generic.cpp.gcov.png create mode 100644 mrs_uav_state_estimators/src/estimators/state/gps_baro.cpp.func-sort-c.html create mode 100644 mrs_uav_state_estimators/src/estimators/state/gps_baro.cpp.func.html create mode 100644 mrs_uav_state_estimators/src/estimators/state/gps_baro.cpp.gcov.frameset.html create mode 100644 mrs_uav_state_estimators/src/estimators/state/gps_baro.cpp.gcov.html create mode 100644 mrs_uav_state_estimators/src/estimators/state/gps_baro.cpp.gcov.overview.html create mode 100644 mrs_uav_state_estimators/src/estimators/state/gps_baro.cpp.gcov.png create mode 100644 mrs_uav_state_estimators/src/estimators/state/gps_garmin.cpp.func-sort-c.html create mode 100644 mrs_uav_state_estimators/src/estimators/state/gps_garmin.cpp.func.html create mode 100644 mrs_uav_state_estimators/src/estimators/state/gps_garmin.cpp.gcov.frameset.html create mode 100644 mrs_uav_state_estimators/src/estimators/state/gps_garmin.cpp.gcov.html create mode 100644 mrs_uav_state_estimators/src/estimators/state/gps_garmin.cpp.gcov.overview.html create mode 100644 mrs_uav_state_estimators/src/estimators/state/gps_garmin.cpp.gcov.png create mode 100644 mrs_uav_state_estimators/src/estimators/state/index-detail-sort-f.html create mode 100644 mrs_uav_state_estimators/src/estimators/state/index-detail-sort-l.html create mode 100644 mrs_uav_state_estimators/src/estimators/state/index-detail.html create mode 100644 mrs_uav_state_estimators/src/estimators/state/index-sort-f.html create mode 100644 mrs_uav_state_estimators/src/estimators/state/index-sort-l.html create mode 100644 mrs_uav_state_estimators/src/estimators/state/index.html create mode 100644 mrs_uav_state_estimators/src/estimators/state/passthrough.cpp.func-sort-c.html create mode 100644 mrs_uav_state_estimators/src/estimators/state/passthrough.cpp.func.html create mode 100644 mrs_uav_state_estimators/src/estimators/state/passthrough.cpp.gcov.frameset.html create mode 100644 mrs_uav_state_estimators/src/estimators/state/passthrough.cpp.gcov.html create mode 100644 mrs_uav_state_estimators/src/estimators/state/passthrough.cpp.gcov.overview.html create mode 100644 mrs_uav_state_estimators/src/estimators/state/passthrough.cpp.gcov.png create mode 100644 mrs_uav_state_estimators/src/estimators/state/rtk.cpp.func-sort-c.html create mode 100644 mrs_uav_state_estimators/src/estimators/state/rtk.cpp.func.html create mode 100644 mrs_uav_state_estimators/src/estimators/state/rtk.cpp.gcov.frameset.html create mode 100644 mrs_uav_state_estimators/src/estimators/state/rtk.cpp.gcov.html create mode 100644 mrs_uav_state_estimators/src/estimators/state/rtk.cpp.gcov.overview.html create mode 100644 mrs_uav_state_estimators/src/estimators/state/rtk.cpp.gcov.png create mode 100644 mrs_uav_state_estimators/src/estimators/state/rtk_garmin.cpp.func-sort-c.html create mode 100644 mrs_uav_state_estimators/src/estimators/state/rtk_garmin.cpp.func.html create mode 100644 mrs_uav_state_estimators/src/estimators/state/rtk_garmin.cpp.gcov.frameset.html create mode 100644 mrs_uav_state_estimators/src/estimators/state/rtk_garmin.cpp.gcov.html create mode 100644 mrs_uav_state_estimators/src/estimators/state/rtk_garmin.cpp.gcov.overview.html create mode 100644 mrs_uav_state_estimators/src/estimators/state/rtk_garmin.cpp.gcov.png create mode 100644 mrs_uav_state_estimators/src/estimators/state/state_generic.cpp.func-sort-c.html create mode 100644 mrs_uav_state_estimators/src/estimators/state/state_generic.cpp.func.html create mode 100644 mrs_uav_state_estimators/src/estimators/state/state_generic.cpp.gcov.frameset.html create mode 100644 mrs_uav_state_estimators/src/estimators/state/state_generic.cpp.gcov.html create mode 100644 mrs_uav_state_estimators/src/estimators/state/state_generic.cpp.gcov.overview.html create mode 100644 mrs_uav_state_estimators/src/estimators/state/state_generic.cpp.gcov.png create mode 100644 mrs_uav_trackers/src/joy_tracker/index-detail-sort-f.html create mode 100644 mrs_uav_trackers/src/joy_tracker/index-detail-sort-l.html create mode 100644 mrs_uav_trackers/src/joy_tracker/index-detail.html create mode 100644 mrs_uav_trackers/src/joy_tracker/index-sort-f.html create mode 100644 mrs_uav_trackers/src/joy_tracker/index-sort-l.html create mode 100644 mrs_uav_trackers/src/joy_tracker/index.html create mode 100644 mrs_uav_trackers/src/joy_tracker/joy_tracker.cpp.func-sort-c.html create mode 100644 mrs_uav_trackers/src/joy_tracker/joy_tracker.cpp.func.html create mode 100644 mrs_uav_trackers/src/joy_tracker/joy_tracker.cpp.gcov.frameset.html create mode 100644 mrs_uav_trackers/src/joy_tracker/joy_tracker.cpp.gcov.html create mode 100644 mrs_uav_trackers/src/joy_tracker/joy_tracker.cpp.gcov.overview.html create mode 100644 mrs_uav_trackers/src/joy_tracker/joy_tracker.cpp.gcov.png create mode 100644 mrs_uav_trackers/src/landoff_tracker/index-detail-sort-f.html create mode 100644 mrs_uav_trackers/src/landoff_tracker/index-detail-sort-l.html create mode 100644 mrs_uav_trackers/src/landoff_tracker/index-detail.html create mode 100644 mrs_uav_trackers/src/landoff_tracker/index-sort-f.html create mode 100644 mrs_uav_trackers/src/landoff_tracker/index-sort-l.html create mode 100644 mrs_uav_trackers/src/landoff_tracker/index.html create mode 100644 mrs_uav_trackers/src/landoff_tracker/landoff_tracker.cpp.func-sort-c.html create mode 100644 mrs_uav_trackers/src/landoff_tracker/landoff_tracker.cpp.func.html create mode 100644 mrs_uav_trackers/src/landoff_tracker/landoff_tracker.cpp.gcov.frameset.html create mode 100644 mrs_uav_trackers/src/landoff_tracker/landoff_tracker.cpp.gcov.html create mode 100644 mrs_uav_trackers/src/landoff_tracker/landoff_tracker.cpp.gcov.overview.html create mode 100644 mrs_uav_trackers/src/landoff_tracker/landoff_tracker.cpp.gcov.png create mode 100644 mrs_uav_trackers/src/line_tracker/index-detail-sort-f.html create mode 100644 mrs_uav_trackers/src/line_tracker/index-detail-sort-l.html create mode 100644 mrs_uav_trackers/src/line_tracker/index-detail.html create mode 100644 mrs_uav_trackers/src/line_tracker/index-sort-f.html create mode 100644 mrs_uav_trackers/src/line_tracker/index-sort-l.html create mode 100644 mrs_uav_trackers/src/line_tracker/index.html create mode 100644 mrs_uav_trackers/src/line_tracker/line_tracker.cpp.func-sort-c.html create mode 100644 mrs_uav_trackers/src/line_tracker/line_tracker.cpp.func.html create mode 100644 mrs_uav_trackers/src/line_tracker/line_tracker.cpp.gcov.frameset.html create mode 100644 mrs_uav_trackers/src/line_tracker/line_tracker.cpp.gcov.html create mode 100644 mrs_uav_trackers/src/line_tracker/line_tracker.cpp.gcov.overview.html create mode 100644 mrs_uav_trackers/src/line_tracker/line_tracker.cpp.gcov.png create mode 100644 mrs_uav_trackers/src/midair_activation_tracker/index-detail-sort-f.html create mode 100644 mrs_uav_trackers/src/midair_activation_tracker/index-detail-sort-l.html create mode 100644 mrs_uav_trackers/src/midair_activation_tracker/index-detail.html create mode 100644 mrs_uav_trackers/src/midair_activation_tracker/index-sort-f.html create mode 100644 mrs_uav_trackers/src/midair_activation_tracker/index-sort-l.html create mode 100644 mrs_uav_trackers/src/midair_activation_tracker/index.html create mode 100644 mrs_uav_trackers/src/midair_activation_tracker/midair_activation_tracker.cpp.func-sort-c.html create mode 100644 mrs_uav_trackers/src/midair_activation_tracker/midair_activation_tracker.cpp.func.html create mode 100644 mrs_uav_trackers/src/midair_activation_tracker/midair_activation_tracker.cpp.gcov.frameset.html create mode 100644 mrs_uav_trackers/src/midair_activation_tracker/midair_activation_tracker.cpp.gcov.html create mode 100644 mrs_uav_trackers/src/midair_activation_tracker/midair_activation_tracker.cpp.gcov.overview.html create mode 100644 mrs_uav_trackers/src/midair_activation_tracker/midair_activation_tracker.cpp.gcov.png create mode 100644 mrs_uav_trackers/src/mpc_tracker/index-detail-sort-f.html create mode 100644 mrs_uav_trackers/src/mpc_tracker/index-detail-sort-l.html create mode 100644 mrs_uav_trackers/src/mpc_tracker/index-detail.html create mode 100644 mrs_uav_trackers/src/mpc_tracker/index-sort-f.html create mode 100644 mrs_uav_trackers/src/mpc_tracker/index-sort-l.html create mode 100644 mrs_uav_trackers/src/mpc_tracker/index.html create mode 100644 mrs_uav_trackers/src/mpc_tracker/mpc_tracker.cpp.func-sort-c.html create mode 100644 mrs_uav_trackers/src/mpc_tracker/mpc_tracker.cpp.func.html create mode 100644 mrs_uav_trackers/src/mpc_tracker/mpc_tracker.cpp.gcov.frameset.html create mode 100644 mrs_uav_trackers/src/mpc_tracker/mpc_tracker.cpp.gcov.html create mode 100644 mrs_uav_trackers/src/mpc_tracker/mpc_tracker.cpp.gcov.overview.html create mode 100644 mrs_uav_trackers/src/mpc_tracker/mpc_tracker.cpp.gcov.png create mode 100644 mrs_uav_trackers/src/speed_tracker/index-detail-sort-f.html create mode 100644 mrs_uav_trackers/src/speed_tracker/index-detail-sort-l.html create mode 100644 mrs_uav_trackers/src/speed_tracker/index-detail.html create mode 100644 mrs_uav_trackers/src/speed_tracker/index-sort-f.html create mode 100644 mrs_uav_trackers/src/speed_tracker/index-sort-l.html create mode 100644 mrs_uav_trackers/src/speed_tracker/index.html create mode 100644 mrs_uav_trackers/src/speed_tracker/speed_tracker.cpp.func-sort-c.html create mode 100644 mrs_uav_trackers/src/speed_tracker/speed_tracker.cpp.func.html create mode 100644 mrs_uav_trackers/src/speed_tracker/speed_tracker.cpp.gcov.frameset.html create mode 100644 mrs_uav_trackers/src/speed_tracker/speed_tracker.cpp.gcov.html create mode 100644 mrs_uav_trackers/src/speed_tracker/speed_tracker.cpp.gcov.overview.html create mode 100644 mrs_uav_trackers/src/speed_tracker/speed_tracker.cpp.gcov.png create mode 100644 mrs_uav_trajectory_generation/src/index-detail-sort-f.html create mode 100644 mrs_uav_trajectory_generation/src/index-detail-sort-l.html create mode 100644 mrs_uav_trajectory_generation/src/index-detail.html create mode 100644 mrs_uav_trajectory_generation/src/index-sort-f.html create mode 100644 mrs_uav_trajectory_generation/src/index-sort-l.html create mode 100644 mrs_uav_trajectory_generation/src/index.html create mode 100644 mrs_uav_trajectory_generation/src/mrs_trajectory_generation.cpp.func-sort-c.html create mode 100644 mrs_uav_trajectory_generation/src/mrs_trajectory_generation.cpp.func.html create mode 100644 mrs_uav_trajectory_generation/src/mrs_trajectory_generation.cpp.gcov.frameset.html create mode 100644 mrs_uav_trajectory_generation/src/mrs_trajectory_generation.cpp.gcov.html create mode 100644 mrs_uav_trajectory_generation/src/mrs_trajectory_generation.cpp.gcov.overview.html create mode 100644 mrs_uav_trajectory_generation/src/mrs_trajectory_generation.cpp.gcov.png create mode 100644 ruby.png create mode 100644 snow.png create mode 100644 updown.png diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000000..e69de29bb2 diff --git a/amber.png b/amber.png new file mode 100644 index 0000000000000000000000000000000000000000..2cab170d8359081983a4e343848dfe06bc490f12 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^j3CU&3?x-=hn)ga>?NMQuI!iC1^G2tW}LqE04T&+ z;1OBOz`!j8!i<;h*8KqrvZOouIx;Y9?C1WI$O`1M1^9%x{(levWGtest coveragetest coverage62.4%62.4% \ No newline at end of file diff --git a/emerald.png b/emerald.png new file mode 100644 index 0000000000000000000000000000000000000000..38ad4f4068b935643d2486f323005fb294a9bd7e GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^j3CU&3?x-=hn)ga>?NMQuI!iC1^Jb!lvI6;R0X`wF(yt=9xVZRt1vCRixIA4P dLn>}1Cji+@42)0J?}79&c)I$ztaD0e0sy@GAL0N2 literal 0 HcmV?d00001 diff --git a/gcov.css b/gcov.css new file mode 100644 index 0000000000..bfd0a83e10 --- /dev/null +++ b/gcov.css @@ -0,0 +1,519 @@ +/* All views: initial background and text color */ +body +{ + color: #000000; + background-color: #FFFFFF; +} + +/* All views: standard link format*/ +a:link +{ + color: #284FA8; + text-decoration: underline; +} + +/* All views: standard link - visited format */ +a:visited +{ + color: #00CB40; + text-decoration: underline; +} + +/* All views: standard link - activated format */ +a:active +{ + color: #FF0040; + text-decoration: underline; +} + +/* All views: main title format */ +td.title +{ + text-align: center; + padding-bottom: 10px; + font-family: sans-serif; + font-size: 20pt; + font-style: italic; + font-weight: bold; +} + +/* All views: header item format */ +td.headerItem +{ + text-align: right; + padding-right: 6px; + font-family: sans-serif; + font-weight: bold; + vertical-align: top; + white-space: nowrap; +} + +/* All views: header item value format */ +td.headerValue +{ + text-align: left; + color: #284FA8; + font-family: sans-serif; + font-weight: bold; + white-space: nowrap; +} + +/* All views: header item coverage table heading */ +td.headerCovTableHead +{ + text-align: center; + padding-right: 6px; + padding-left: 6px; + padding-bottom: 0px; + font-family: sans-serif; + font-size: 80%; + white-space: nowrap; +} + +/* All views: header item coverage table entry */ +td.headerCovTableEntry +{ + text-align: right; + color: #284FA8; + font-family: sans-serif; + font-weight: bold; + white-space: nowrap; + padding-left: 12px; + padding-right: 4px; + background-color: #DAE7FE; +} + +/* All views: header item coverage table entry for high coverage rate */ +td.headerCovTableEntryHi +{ + text-align: right; + color: #000000; + font-family: sans-serif; + font-weight: bold; + white-space: nowrap; + padding-left: 12px; + padding-right: 4px; + background-color: #A7FC9D; +} + +/* All views: header item coverage table entry for medium coverage rate */ +td.headerCovTableEntryMed +{ + text-align: right; + color: #000000; + font-family: sans-serif; + font-weight: bold; + white-space: nowrap; + padding-left: 12px; + padding-right: 4px; + background-color: #FFEA20; +} + +/* All views: header item coverage table entry for ow coverage rate */ +td.headerCovTableEntryLo +{ + text-align: right; + color: #000000; + font-family: sans-serif; + font-weight: bold; + white-space: nowrap; + padding-left: 12px; + padding-right: 4px; + background-color: #FF0000; +} + +/* All views: header legend value for legend entry */ +td.headerValueLeg +{ + text-align: left; + color: #000000; + font-family: sans-serif; + font-size: 80%; + white-space: nowrap; + padding-top: 4px; +} + +/* All views: color of horizontal ruler */ +td.ruler +{ + background-color: #6688D4; +} + +/* All views: version string format */ +td.versionInfo +{ + text-align: center; + padding-top: 2px; + font-family: sans-serif; + font-style: italic; +} + +/* Directory view/File view (all)/Test case descriptions: + table headline format */ +td.tableHead +{ + text-align: center; + color: #FFFFFF; + background-color: #6688D4; + font-family: sans-serif; + font-size: 120%; + font-weight: bold; + white-space: nowrap; + padding-left: 4px; + padding-right: 4px; +} + +span.tableHeadSort +{ + padding-right: 4px; +} + +/* Directory view/File view (all): filename entry format */ +td.coverFile +{ + text-align: left; + padding-left: 10px; + padding-right: 20px; + color: #284FA8; + background-color: #DAE7FE; + font-family: monospace; +} + +/* Directory view/File view (all): bar-graph entry format*/ +td.coverBar +{ + padding-left: 10px; + padding-right: 10px; + background-color: #DAE7FE; +} + +/* Directory view/File view (all): bar-graph outline color */ +td.coverBarOutline +{ + background-color: #000000; +} + +/* Directory view/File view (all): percentage entry for files with + high coverage rate */ +td.coverPerHi +{ + text-align: right; + padding-left: 10px; + padding-right: 10px; + background-color: #A7FC9D; + font-weight: bold; + font-family: sans-serif; +} + +/* Directory view/File view (all): line count entry for files with + high coverage rate */ +td.coverNumHi +{ + text-align: right; + padding-left: 10px; + padding-right: 10px; + background-color: #A7FC9D; + white-space: nowrap; + font-family: sans-serif; +} + +/* Directory view/File view (all): percentage entry for files with + medium coverage rate */ +td.coverPerMed +{ + text-align: right; + padding-left: 10px; + padding-right: 10px; + background-color: #FFEA20; + font-weight: bold; + font-family: sans-serif; +} + +/* Directory view/File view (all): line count entry for files with + medium coverage rate */ +td.coverNumMed +{ + text-align: right; + padding-left: 10px; + padding-right: 10px; + background-color: #FFEA20; + white-space: nowrap; + font-family: sans-serif; +} + +/* Directory view/File view (all): percentage entry for files with + low coverage rate */ +td.coverPerLo +{ + text-align: right; + padding-left: 10px; + padding-right: 10px; + background-color: #FF0000; + font-weight: bold; + font-family: sans-serif; +} + +/* Directory view/File view (all): line count entry for files with + low coverage rate */ +td.coverNumLo +{ + text-align: right; + padding-left: 10px; + padding-right: 10px; + background-color: #FF0000; + white-space: nowrap; + font-family: sans-serif; +} + +/* File view (all): "show/hide details" link format */ +a.detail:link +{ + color: #B8D0FF; + font-size:80%; +} + +/* File view (all): "show/hide details" link - visited format */ +a.detail:visited +{ + color: #B8D0FF; + font-size:80%; +} + +/* File view (all): "show/hide details" link - activated format */ +a.detail:active +{ + color: #FFFFFF; + font-size:80%; +} + +/* File view (detail): test name entry */ +td.testName +{ + text-align: right; + padding-right: 10px; + background-color: #DAE7FE; + font-family: sans-serif; +} + +/* File view (detail): test percentage entry */ +td.testPer +{ + text-align: right; + padding-left: 10px; + padding-right: 10px; + background-color: #DAE7FE; + font-family: sans-serif; +} + +/* File view (detail): test lines count entry */ +td.testNum +{ + text-align: right; + padding-left: 10px; + padding-right: 10px; + background-color: #DAE7FE; + font-family: sans-serif; +} + +/* Test case descriptions: test name format*/ +dt +{ + font-family: sans-serif; + font-weight: bold; +} + +/* Test case descriptions: description table body */ +td.testDescription +{ + padding-top: 10px; + padding-left: 30px; + padding-bottom: 10px; + padding-right: 30px; + background-color: #DAE7FE; +} + +/* Source code view: function entry */ +td.coverFn +{ + text-align: left; + padding-left: 10px; + padding-right: 20px; + color: #284FA8; + background-color: #DAE7FE; + font-family: monospace; +} + +/* Source code view: function entry zero count*/ +td.coverFnLo +{ + text-align: right; + padding-left: 10px; + padding-right: 10px; + background-color: #FF0000; + font-weight: bold; + font-family: sans-serif; +} + +/* Source code view: function entry nonzero count*/ +td.coverFnHi +{ + text-align: right; + padding-left: 10px; + padding-right: 10px; + background-color: #DAE7FE; + font-weight: bold; + font-family: sans-serif; +} + +/* Source code view: source code format */ +pre.source +{ + font-family: monospace; + white-space: pre; + margin-top: 2px; +} + +/* Source code view: line number format */ +span.lineNum +{ + background-color: #EFE383; +} + +/* Source code view: format for lines which were executed */ +td.lineCov, +span.lineCov +{ + background-color: #CAD7FE; +} + +/* Source code view: format for Cov legend */ +span.coverLegendCov +{ + padding-left: 10px; + padding-right: 10px; + padding-bottom: 2px; + background-color: #CAD7FE; +} + +/* Source code view: format for lines which were not executed */ +td.lineNoCov, +span.lineNoCov +{ + background-color: #FF6230; +} + +/* Source code view: format for NoCov legend */ +span.coverLegendNoCov +{ + padding-left: 10px; + padding-right: 10px; + padding-bottom: 2px; + background-color: #FF6230; +} + +/* Source code view (function table): standard link - visited format */ +td.lineNoCov > a:visited, +td.lineCov > a:visited +{ + color: black; + text-decoration: underline; +} + +/* Source code view: format for lines which were executed only in a + previous version */ +span.lineDiffCov +{ + background-color: #B5F7AF; +} + +/* Source code view: format for branches which were executed + * and taken */ +span.branchCov +{ + background-color: #CAD7FE; +} + +/* Source code view: format for branches which were executed + * but not taken */ +span.branchNoCov +{ + background-color: #FF6230; +} + +/* Source code view: format for branches which were not executed */ +span.branchNoExec +{ + background-color: #FF6230; +} + +/* Source code view: format for the source code heading line */ +pre.sourceHeading +{ + white-space: pre; + font-family: monospace; + font-weight: bold; + margin: 0px; +} + +/* All views: header legend value for low rate */ +td.headerValueLegL +{ + font-family: sans-serif; + text-align: center; + white-space: nowrap; + padding-left: 4px; + padding-right: 2px; + background-color: #FF0000; + font-size: 80%; +} + +/* All views: header legend value for med rate */ +td.headerValueLegM +{ + font-family: sans-serif; + text-align: center; + white-space: nowrap; + padding-left: 2px; + padding-right: 2px; + background-color: #FFEA20; + font-size: 80%; +} + +/* All views: header legend value for hi rate */ +td.headerValueLegH +{ + font-family: sans-serif; + text-align: center; + white-space: nowrap; + padding-left: 2px; + padding-right: 4px; + background-color: #A7FC9D; + font-size: 80%; +} + +/* All views except source code view: legend format for low coverage */ +span.coverLegendCovLo +{ + padding-left: 10px; + padding-right: 10px; + padding-top: 2px; + background-color: #FF0000; +} + +/* All views except source code view: legend format for med coverage */ +span.coverLegendCovMed +{ + padding-left: 10px; + padding-right: 10px; + padding-top: 2px; + background-color: #FFEA20; +} + +/* All views except source code view: legend format for hi coverage */ +span.coverLegendCovHi +{ + padding-left: 10px; + padding-right: 10px; + padding-top: 2px; + background-color: #A7FC9D; +} diff --git a/glass.png b/glass.png new file mode 100644 index 0000000000000000000000000000000000000000..e1abc00680a3093c49fdb775ae6bdb6764c95af2 GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^j3CU&3?x-=hn)gaEa{HEjtmSN`?>!lvI6;R0X`wF z|Ns97GD8ntt^-nxB|(0{3=Yq3q=7g|-tI089jvk*Kn`btM`SSr1Gf+eGhVt|_XjA* zUgGKN%6^Gmn4d%Ph(nkFP>9RZ#WAE}PI3Z}&BVayv3^M*kj3EX>gTe~DWM4f=_Dpv literal 0 HcmV?d00001 diff --git a/index-sort-f.html b/index-sort-f.html new file mode 100644 index 0000000000..48851fd709 --- /dev/null +++ b/index-sort-f.html @@ -0,0 +1,612 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top levelHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:140472134865.8 %
Date:2024-04-18 23:11:36Functions:2601416562.4 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Directory Sort by nameLine Coverage Sort by line coverageFunctions Sort by function coverage
mrs_lib/include/mrs_lib/safety_zone +
0.0%
+
0.0 %0 / 80.0 %0 / 4
mrs_lib/src/geometry +
15.1%15.1%
+
15.1 %67 / 44516.0 %15 / 94
mrs_uav_state_estimators/src/estimators/heading +
18.6%18.6%
+
18.6 %91 / 49021.1 %12 / 57
mrs_uav_trackers/src/speed_tracker +
14.8%14.8%
+
14.8 %61 / 41136.8 %7 / 19
mrs_uav_trackers/src/joy_tracker +
46.5%46.5%
+
46.5 %66 / 14238.9 %7 / 18
mrs_lib/include/mrs_lib/geometry +
71.0%71.0%
+
71.0 %66 / 9342.5 %51 / 120
mrs_lib/src/batch_visualizer +
44.1%44.1%
+
44.1 %192 / 43544.4 %20 / 45
mrs_lib/src/safety_zone/polygon +
40.8%40.8%
+
40.8 %42 / 10350.0 %4 / 8
mrs_lib/src/scope_timer +
14.1%14.1%
+
14.1 %20 / 14250.0 %5 / 10
mrs_uav_trackers/src/midair_activation_tracker +
72.8%72.8%
+
72.8 %67 / 9250.0 %9 / 18
mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors +
71.7%71.7%
+
71.7 %132 / 18450.0 %17 / 34
mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading +
58.3%58.3%
+
58.3 %7 / 1257.1 %4 / 7
mrs_lib/include/mrs_lib/impl +
82.3%82.3%
+
82.3 %367 / 44658.7 %816 / 1390
mrs_uav_state_estimators/src/estimators/agl +
72.1%72.1%
+
72.1 %75 / 10460.0 %6 / 10
mrs_uav_managers/include/mrs_uav_managers +
100.0%
+
100.0 %12 / 1260.0 %6 / 10
mrs_lib/include/mrs_lib +
79.3%79.3%
+
79.3 %781 / 98562.3 %842 / 1351
mrs_uav_trackers/src/line_tracker +
67.9%67.9%
+
67.9 %322 / 47463.3 %19 / 30
mrs_lib/src/transform_broadcaster +
53.3%53.3%
+
53.3 %16 / 3066.7 %2 / 3
mrs_uav_state_estimators/src/estimators/altitude +
53.9%53.9%
+
53.9 %213 / 39566.7 %22 / 33
mrs_uav_trackers/src/landoff_tracker +
73.1%73.1%
+
73.1 %433 / 59267.7 %21 / 31
mrs_uav_managers/include/transform_manager +
48.2%48.2%
+
48.2 %192 / 39868.4 %13 / 19
mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators +
53.7%53.7%
+
53.7 %409 / 76169.5 %66 / 95
mrs_uav_managers/src/control_manager/common +
43.2%43.2%
+
43.2 %245 / 56771.0 %22 / 31
mrs_uav_managers/src/control_manager +
64.1%64.1%
+
64.1 %2369 / 369672.4 %89 / 123
mrs_uav_managers/include/mrs_uav_managers/control_manager +
58.3%58.3%
+
58.3 %56 / 9674.1 %20 / 27
mrs_uav_state_estimators/src/estimators/state +
70.7%70.7%
+
70.7 %311 / 44075.7 %28 / 37
mrs_uav_state_estimators/src/estimators/lateral +
55.1%55.1%
+
55.1 %241 / 43775.8 %25 / 33
mrs_lib/src/transformer +
66.1%66.1%
+
66.1 %185 / 28076.9 %20 / 26
mrs_uav_trackers/src/mpc_tracker +
80.0%80.0%
+
80.0 %1320 / 165080.0 %40 / 50
mrs_lib/src/timeout_manager +
79.0%79.0%
+
79.0 %49 / 6281.8 %9 / 11
mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral +
100.0%
+
100.0 %10 / 1083.3 %5 / 6
mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state +
100.0%
+
100.0 %9 / 983.3 %5 / 6
mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude +
100.0%
+
100.0 %9 / 983.3 %5 / 6
mrs_lib/src/timer +
84.8%84.8%
+
84.8 %106 / 12583.3 %15 / 18
mrs_uav_managers/src/estimation_manager +
70.0%70.0%
+
70.0 %433 / 61985.1 %40 / 47
mrs_uav_managers/src +
72.5%72.5%
+
72.5 %1246 / 171887.7 %64 / 73
mrs_uav_controllers/src +
81.1%81.1%
+
81.1 %1762 / 217287.9 %58 / 66
mrs_lib/src/safety_zone +
63.3%63.3%
+
63.3 %31 / 4988.9 %8 / 9
mrs_lib/src/profiler +
38.6%38.6%
+
38.6 %39 / 10190.0 %9 / 10
mrs_uav_managers/src/transform_manager +
81.4%81.4%
+
81.4 %349 / 42992.9 %13 / 14
mrs_lib/src/median_filter +
89.1%89.1%
+
89.1 %82 / 9294.1 %16 / 17
mrs_uav_managers/include/mrs_uav_managers/estimation_manager +
97.2%97.2%
+
97.2 %106 / 10994.4 %17 / 18
mrs_lib/src/attitude_converter +
94.6%94.6%
+
94.6 %212 / 22495.1 %39 / 41
mrs_lib/src/math +
100.0%
+
100.0 %17 / 17100.0 %1 / 1
mrs_lib/src/utils +
100.0%
+
100.0 %7 / 7100.0 %2 / 2
mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl +
100.0%
+
100.0 %4 / 4100.0 %3 / 3
mrs_lib/src/param_loader +
80.0%80.0%
+
80.0 %44 / 55100.0 %4 / 4
mrs_uav_managers/include/control_manager +
100.0%
+
100.0 %4 / 4100.0 %10 / 10
mrs_uav_managers/src/estimation_manager/estimators +
60.7%60.7%
+
60.7 %82 / 135100.0 %13 / 13
mrs_uav_controllers/include +
98.3%98.3%
+
98.3 %57 / 58100.0 %14 / 14
mrs_uav_autostart/src +
88.3%88.3%
+
88.3 %287 / 325100.0 %21 / 21
mrs_uav_trajectory_generation/src +
67.9%67.9%
+
67.9 %744 / 1095100.0 %22 / 22
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/index-sort-l.html b/index-sort-l.html new file mode 100644 index 0000000000..769099b47a --- /dev/null +++ b/index-sort-l.html @@ -0,0 +1,612 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top levelHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:140472134865.8 %
Date:2024-04-18 23:11:36Functions:2601416562.4 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Directory Sort by nameLine Coverage Sort by line coverageFunctions Sort by function coverage
mrs_lib/include/mrs_lib/safety_zone +
0.0%
+
0.0 %0 / 80.0 %0 / 4
mrs_lib/src/scope_timer +
14.1%14.1%
+
14.1 %20 / 14250.0 %5 / 10
mrs_uav_trackers/src/speed_tracker +
14.8%14.8%
+
14.8 %61 / 41136.8 %7 / 19
mrs_lib/src/geometry +
15.1%15.1%
+
15.1 %67 / 44516.0 %15 / 94
mrs_uav_state_estimators/src/estimators/heading +
18.6%18.6%
+
18.6 %91 / 49021.1 %12 / 57
mrs_lib/src/profiler +
38.6%38.6%
+
38.6 %39 / 10190.0 %9 / 10
mrs_lib/src/safety_zone/polygon +
40.8%40.8%
+
40.8 %42 / 10350.0 %4 / 8
mrs_uav_managers/src/control_manager/common +
43.2%43.2%
+
43.2 %245 / 56771.0 %22 / 31
mrs_lib/src/batch_visualizer +
44.1%44.1%
+
44.1 %192 / 43544.4 %20 / 45
mrs_uav_trackers/src/joy_tracker +
46.5%46.5%
+
46.5 %66 / 14238.9 %7 / 18
mrs_uav_managers/include/transform_manager +
48.2%48.2%
+
48.2 %192 / 39868.4 %13 / 19
mrs_lib/src/transform_broadcaster +
53.3%53.3%
+
53.3 %16 / 3066.7 %2 / 3
mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators +
53.7%53.7%
+
53.7 %409 / 76169.5 %66 / 95
mrs_uav_state_estimators/src/estimators/altitude +
53.9%53.9%
+
53.9 %213 / 39566.7 %22 / 33
mrs_uav_state_estimators/src/estimators/lateral +
55.1%55.1%
+
55.1 %241 / 43775.8 %25 / 33
mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading +
58.3%58.3%
+
58.3 %7 / 1257.1 %4 / 7
mrs_uav_managers/include/mrs_uav_managers/control_manager +
58.3%58.3%
+
58.3 %56 / 9674.1 %20 / 27
mrs_uav_managers/src/estimation_manager/estimators +
60.7%60.7%
+
60.7 %82 / 135100.0 %13 / 13
mrs_lib/src/safety_zone +
63.3%63.3%
+
63.3 %31 / 4988.9 %8 / 9
mrs_uav_managers/src/control_manager +
64.1%64.1%
+
64.1 %2369 / 369672.4 %89 / 123
mrs_lib/src/transformer +
66.1%66.1%
+
66.1 %185 / 28076.9 %20 / 26
mrs_uav_trackers/src/line_tracker +
67.9%67.9%
+
67.9 %322 / 47463.3 %19 / 30
mrs_uav_trajectory_generation/src +
67.9%67.9%
+
67.9 %744 / 1095100.0 %22 / 22
mrs_uav_managers/src/estimation_manager +
70.0%70.0%
+
70.0 %433 / 61985.1 %40 / 47
mrs_uav_state_estimators/src/estimators/state +
70.7%70.7%
+
70.7 %311 / 44075.7 %28 / 37
mrs_lib/include/mrs_lib/geometry +
71.0%71.0%
+
71.0 %66 / 9342.5 %51 / 120
mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors +
71.7%71.7%
+
71.7 %132 / 18450.0 %17 / 34
mrs_uav_state_estimators/src/estimators/agl +
72.1%72.1%
+
72.1 %75 / 10460.0 %6 / 10
mrs_uav_managers/src +
72.5%72.5%
+
72.5 %1246 / 171887.7 %64 / 73
mrs_uav_trackers/src/midair_activation_tracker +
72.8%72.8%
+
72.8 %67 / 9250.0 %9 / 18
mrs_uav_trackers/src/landoff_tracker +
73.1%73.1%
+
73.1 %433 / 59267.7 %21 / 31
mrs_lib/src/timeout_manager +
79.0%79.0%
+
79.0 %49 / 6281.8 %9 / 11
mrs_lib/include/mrs_lib +
79.3%79.3%
+
79.3 %781 / 98562.3 %842 / 1351
mrs_lib/src/param_loader +
80.0%80.0%
+
80.0 %44 / 55100.0 %4 / 4
mrs_uav_trackers/src/mpc_tracker +
80.0%80.0%
+
80.0 %1320 / 165080.0 %40 / 50
mrs_uav_controllers/src +
81.1%81.1%
+
81.1 %1762 / 217287.9 %58 / 66
mrs_uav_managers/src/transform_manager +
81.4%81.4%
+
81.4 %349 / 42992.9 %13 / 14
mrs_lib/include/mrs_lib/impl +
82.3%82.3%
+
82.3 %367 / 44658.7 %816 / 1390
mrs_lib/src/timer +
84.8%84.8%
+
84.8 %106 / 12583.3 %15 / 18
mrs_uav_autostart/src +
88.3%88.3%
+
88.3 %287 / 325100.0 %21 / 21
mrs_lib/src/median_filter +
89.1%89.1%
+
89.1 %82 / 9294.1 %16 / 17
mrs_lib/src/attitude_converter +
94.6%94.6%
+
94.6 %212 / 22495.1 %39 / 41
mrs_uav_managers/include/mrs_uav_managers/estimation_manager +
97.2%97.2%
+
97.2 %106 / 10994.4 %17 / 18
mrs_uav_controllers/include +
98.3%98.3%
+
98.3 %57 / 58100.0 %14 / 14
mrs_uav_managers/include/control_manager +
100.0%
+
100.0 %4 / 4100.0 %10 / 10
mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl +
100.0%
+
100.0 %4 / 4100.0 %3 / 3
mrs_lib/src/utils +
100.0%
+
100.0 %7 / 7100.0 %2 / 2
mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state +
100.0%
+
100.0 %9 / 983.3 %5 / 6
mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude +
100.0%
+
100.0 %9 / 983.3 %5 / 6
mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral +
100.0%
+
100.0 %10 / 1083.3 %5 / 6
mrs_uav_managers/include/mrs_uav_managers +
100.0%
+
100.0 %12 / 1260.0 %6 / 10
mrs_lib/src/math +
100.0%
+
100.0 %17 / 17100.0 %1 / 1
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/index.html b/index.html new file mode 100644 index 0000000000..ec5753422c --- /dev/null +++ b/index.html @@ -0,0 +1,612 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top levelHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:140472134865.8 %
Date:2024-04-18 23:11:36Functions:2601416562.4 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Directory Sort by nameLine Coverage Sort by line coverageFunctions Sort by function coverage
mrs_lib/include/mrs_lib +
79.3%79.3%
+
79.3 %781 / 98562.3 %842 / 1351
mrs_lib/include/mrs_lib/geometry +
71.0%71.0%
+
71.0 %66 / 9342.5 %51 / 120
mrs_lib/include/mrs_lib/impl +
82.3%82.3%
+
82.3 %367 / 44658.7 %816 / 1390
mrs_lib/include/mrs_lib/safety_zone +
0.0%
+
0.0 %0 / 80.0 %0 / 4
mrs_lib/src/attitude_converter +
94.6%94.6%
+
94.6 %212 / 22495.1 %39 / 41
mrs_lib/src/batch_visualizer +
44.1%44.1%
+
44.1 %192 / 43544.4 %20 / 45
mrs_lib/src/geometry +
15.1%15.1%
+
15.1 %67 / 44516.0 %15 / 94
mrs_lib/src/math +
100.0%
+
100.0 %17 / 17100.0 %1 / 1
mrs_lib/src/median_filter +
89.1%89.1%
+
89.1 %82 / 9294.1 %16 / 17
mrs_lib/src/param_loader +
80.0%80.0%
+
80.0 %44 / 55100.0 %4 / 4
mrs_lib/src/profiler +
38.6%38.6%
+
38.6 %39 / 10190.0 %9 / 10
mrs_lib/src/safety_zone +
63.3%63.3%
+
63.3 %31 / 4988.9 %8 / 9
mrs_lib/src/safety_zone/polygon +
40.8%40.8%
+
40.8 %42 / 10350.0 %4 / 8
mrs_lib/src/scope_timer +
14.1%14.1%
+
14.1 %20 / 14250.0 %5 / 10
mrs_lib/src/timeout_manager +
79.0%79.0%
+
79.0 %49 / 6281.8 %9 / 11
mrs_lib/src/timer +
84.8%84.8%
+
84.8 %106 / 12583.3 %15 / 18
mrs_lib/src/transform_broadcaster +
53.3%53.3%
+
53.3 %16 / 3066.7 %2 / 3
mrs_lib/src/transformer +
66.1%66.1%
+
66.1 %185 / 28076.9 %20 / 26
mrs_lib/src/utils +
100.0%
+
100.0 %7 / 7100.0 %2 / 2
mrs_uav_autostart/src +
88.3%88.3%
+
88.3 %287 / 325100.0 %21 / 21
mrs_uav_controllers/include +
98.3%98.3%
+
98.3 %57 / 58100.0 %14 / 14
mrs_uav_controllers/src +
81.1%81.1%
+
81.1 %1762 / 217287.9 %58 / 66
mrs_uav_managers/include/control_manager +
100.0%
+
100.0 %4 / 4100.0 %10 / 10
mrs_uav_managers/include/mrs_uav_managers +
100.0%
+
100.0 %12 / 1260.0 %6 / 10
mrs_uav_managers/include/mrs_uav_managers/control_manager +
58.3%58.3%
+
58.3 %56 / 9674.1 %20 / 27
mrs_uav_managers/include/mrs_uav_managers/estimation_manager +
97.2%97.2%
+
97.2 %106 / 10994.4 %17 / 18
mrs_uav_managers/include/transform_manager +
48.2%48.2%
+
48.2 %192 / 39868.4 %13 / 19
mrs_uav_managers/src +
72.5%72.5%
+
72.5 %1246 / 171887.7 %64 / 73
mrs_uav_managers/src/control_manager +
64.1%64.1%
+
64.1 %2369 / 369672.4 %89 / 123
mrs_uav_managers/src/control_manager/common +
43.2%43.2%
+
43.2 %245 / 56771.0 %22 / 31
mrs_uav_managers/src/estimation_manager +
70.0%70.0%
+
70.0 %433 / 61985.1 %40 / 47
mrs_uav_managers/src/estimation_manager/estimators +
60.7%60.7%
+
60.7 %82 / 135100.0 %13 / 13
mrs_uav_managers/src/transform_manager +
81.4%81.4%
+
81.4 %349 / 42992.9 %13 / 14
mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators +
53.7%53.7%
+
53.7 %409 / 76169.5 %66 / 95
mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl +
100.0%
+
100.0 %4 / 4100.0 %3 / 3
mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude +
100.0%
+
100.0 %9 / 983.3 %5 / 6
mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading +
58.3%58.3%
+
58.3 %7 / 1257.1 %4 / 7
mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral +
100.0%
+
100.0 %10 / 1083.3 %5 / 6
mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state +
100.0%
+
100.0 %9 / 983.3 %5 / 6
mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors +
71.7%71.7%
+
71.7 %132 / 18450.0 %17 / 34
mrs_uav_state_estimators/src/estimators/agl +
72.1%72.1%
+
72.1 %75 / 10460.0 %6 / 10
mrs_uav_state_estimators/src/estimators/altitude +
53.9%53.9%
+
53.9 %213 / 39566.7 %22 / 33
mrs_uav_state_estimators/src/estimators/heading +
18.6%18.6%
+
18.6 %91 / 49021.1 %12 / 57
mrs_uav_state_estimators/src/estimators/lateral +
55.1%55.1%
+
55.1 %241 / 43775.8 %25 / 33
mrs_uav_state_estimators/src/estimators/state +
70.7%70.7%
+
70.7 %311 / 44075.7 %28 / 37
mrs_uav_trackers/src/joy_tracker +
46.5%46.5%
+
46.5 %66 / 14238.9 %7 / 18
mrs_uav_trackers/src/landoff_tracker +
73.1%73.1%
+
73.1 %433 / 59267.7 %21 / 31
mrs_uav_trackers/src/line_tracker +
67.9%67.9%
+
67.9 %322 / 47463.3 %19 / 30
mrs_uav_trackers/src/midair_activation_tracker +
72.8%72.8%
+
72.8 %67 / 9250.0 %9 / 18
mrs_uav_trackers/src/mpc_tracker +
80.0%80.0%
+
80.0 %1320 / 165080.0 %40 / 50
mrs_uav_trackers/src/speed_tracker +
14.8%14.8%
+
14.8 %61 / 41136.8 %7 / 19
mrs_uav_trajectory_generation/src +
67.9%67.9%
+
67.9 %744 / 1095100.0 %22 / 22
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/attitude_converter.h.func-sort-c.html b/mrs_lib/include/mrs_lib/attitude_converter.h.func-sort-c.html new file mode 100644 index 0000000000..3a09202623 --- /dev/null +++ b/mrs_lib/include/mrs_lib/attitude_converter.h.func-sort-c.html @@ -0,0 +1,124 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/attitude_converter.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - attitude_converter.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:232785.2 %
Date:2024-04-18 23:11:36Functions:91181.8 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::AttitudeConverter::MathErrorException::what() const0
mrs_lib::AttitudeConverter::SetHeadingException::what() const0
auto mrs_lib::AttitudeConverter::get<0ul>()1
auto mrs_lib::AttitudeConverter::get<1ul>()1
auto mrs_lib::AttitudeConverter::get<2ul>()1
mrs_lib::AttitudeConverter::GetHeadingException::what() const1
_ZNK7mrs_lib17AttitudeConvertercvN5Eigen9AngleAxisIT_EEIdEEv1
mrs_lib::AttitudeConverter::InvalidAttitudeException::what() const2
_ZNK7mrs_lib17AttitudeConvertercvN5Eigen10QuaternionIT_Li0EEEIdEEv86515
mrs_lib::Vector3Converter::Vector3Converter(tf2::Vector3 const&)281647
mrs_lib::AttitudeConverter::AttitudeConverter<double>(Eigen::AngleAxis<double>)569568
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/attitude_converter.h.func.html b/mrs_lib/include/mrs_lib/attitude_converter.h.func.html new file mode 100644 index 0000000000..c64f560f18 --- /dev/null +++ b/mrs_lib/include/mrs_lib/attitude_converter.h.func.html @@ -0,0 +1,124 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/attitude_converter.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - attitude_converter.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:232785.2 %
Date:2024-04-18 23:11:36Functions:91181.8 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::Vector3Converter::Vector3Converter(tf2::Vector3 const&)281647
auto mrs_lib::AttitudeConverter::get<0ul>()1
auto mrs_lib::AttitudeConverter::get<1ul>()1
auto mrs_lib::AttitudeConverter::get<2ul>()1
mrs_lib::AttitudeConverter::AttitudeConverter<double>(Eigen::AngleAxis<double>)569568
mrs_lib::AttitudeConverter::MathErrorException::what() const0
mrs_lib::AttitudeConverter::GetHeadingException::what() const1
mrs_lib::AttitudeConverter::SetHeadingException::what() const0
mrs_lib::AttitudeConverter::InvalidAttitudeException::what() const2
_ZNK7mrs_lib17AttitudeConvertercvN5Eigen10QuaternionIT_Li0EEEIdEEv86515
_ZNK7mrs_lib17AttitudeConvertercvN5Eigen9AngleAxisIT_EEIdEEv1
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/attitude_converter.h.gcov.frameset.html b/mrs_lib/include/mrs_lib/attitude_converter.h.gcov.frameset.html new file mode 100644 index 0000000000..30914dc7fa --- /dev/null +++ b/mrs_lib/include/mrs_lib/attitude_converter.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/attitude_converter.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/include/mrs_lib/attitude_converter.h.gcov.html b/mrs_lib/include/mrs_lib/attitude_converter.h.gcov.html new file mode 100644 index 0000000000..0957441636 --- /dev/null +++ b/mrs_lib/include/mrs_lib/attitude_converter.h.gcov.html @@ -0,0 +1,617 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/attitude_converter.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - attitude_converter.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:232785.2 %
Date:2024-04-18 23:11:36Functions:91181.8 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : // clang: TomasFormat
+       2             : /**
+       3             :  * @file attitude_converter.h
+       4             :  *
+       5             :  * @brief Conversions between various representations of object attitude in 3D.
+       6             :  * Supports Quaternions, Euler angles, Angle-axis and Rotational matrices from tf, tf2, Eigen and geometry_msgs libraries.
+       7             :  * The default Euler angle notation is the extrinsic RPY.
+       8             :  *
+       9             :  * @author Tomas Baca
+      10             :  */
+      11             : 
+      12             : #ifndef ATTITUDE_CONVERTER_H
+      13             : #define ATTITUDE_CONVERTER_H
+      14             : 
+      15             : #include <vector>
+      16             : #include <cmath>
+      17             : #include <Eigen/Dense>
+      18             : #include <tuple>
+      19             : 
+      20             : #include <tf2_ros/transform_listener.h>
+      21             : #include <tf2_ros/buffer.h>
+      22             : #include <tf2_eigen/tf2_eigen.h>
+      23             : #include <tf2_geometry_msgs/tf2_geometry_msgs.h>
+      24             : #include <tf/transform_datatypes.h>
+      25             : #include <tf_conversions/tf_eigen.h>
+      26             : 
+      27             : #include <mrs_lib/geometry/misc.h>
+      28             : 
+      29             : namespace mrs_lib
+      30             : {
+      31             : 
+      32             : // type of the object we are grasping
+      33             : typedef enum
+      34             : {
+      35             : 
+      36             :   RPY_INTRINSIC = 1,
+      37             :   RPY_EXTRINSIC = 2,
+      38             : 
+      39             : } RPY_convention_t;
+      40             : 
+      41             : /* class EulerAttitude //{ */
+      42             : 
+      43             : /**
+      44             :  * @brief A small class for storing the Euler angles.
+      45             :  */
+      46             : class EulerAttitude {
+      47             : public:
+      48             :   /**
+      49             :    * @brief A simple class for storing the Euler angles.
+      50             :    *
+      51             :    * @param roll
+      52             :    * @param pitch
+      53             :    * @param yaw
+      54             :    */
+      55             :   EulerAttitude(const double& roll, const double& pitch, const double& yaw);
+      56             : 
+      57             :   /**
+      58             :    * @brief get the roll angle
+      59             :    *
+      60             :    * @return roll
+      61             :    */
+      62             :   double roll(void) const;
+      63             : 
+      64             :   /**
+      65             :    * @brief get the pitch angle
+      66             :    *
+      67             :    * @return pitch
+      68             :    */
+      69             :   double pitch(void) const;
+      70             : 
+      71             :   /**
+      72             :    * @brief get the yaw angle
+      73             :    *
+      74             :    * @return yaw
+      75             :    */
+      76             :   double yaw(void) const;
+      77             : 
+      78             : private:
+      79             :   double roll_, pitch_, yaw_;
+      80             : };
+      81             : 
+      82             : //}
+      83             : 
+      84             : /* class Vector3Converter //{ */
+      85             : 
+      86             : /**
+      87             :  * @brief Converter of Vector3 representations. Instantiate it with any type of vector3 in constructor and convert it by assigning it to any other type of
+      88             :  * vector3 variable.
+      89             :  */
+      90             : class Vector3Converter {
+      91             : public:
+      92             :   /**
+      93             :    * @brief Constructor with tf2::Vector3
+      94             :    *
+      95             :    * @param vector3
+      96             :    */
+      97      281647 :   Vector3Converter(const tf2::Vector3& vector3) : vector3_(vector3){};
+      98             : 
+      99             :   /**
+     100             :    * @brief Constructor with Eigen::Vector3
+     101             :    *
+     102             :    * @param vector3
+     103             :    */
+     104             :   Vector3Converter(const Eigen::Vector3d& vector3);
+     105             : 
+     106             :   /**
+     107             :    * @brief Constructor with geometry_msgs::Vector3
+     108             :    *
+     109             :    * @param vector3
+     110             :    */
+     111             :   Vector3Converter(const geometry_msgs::Vector3& vector3);
+     112             : 
+     113             :   /**
+     114             :    * @brief Constructor with doubles: x, y, z
+     115             :    *
+     116             :    * @param x
+     117             :    * @param y
+     118             :    * @param z
+     119             :    */
+     120             :   Vector3Converter(const double& x, const double& y, const double& z);
+     121             : 
+     122             :   /**
+     123             :    * @brief typecast overloaded for tf2::Vector3
+     124             :    *
+     125             :    * @return vector3
+     126             :    */
+     127             :   operator tf2::Vector3() const;
+     128             : 
+     129             :   /**
+     130             :    * @brief typecast overloaded for Eigen::Vector3
+     131             :    *
+     132             :    * @return vector3
+     133             :    */
+     134             :   operator Eigen::Vector3d() const;
+     135             : 
+     136             :   /**
+     137             :    * @brief typecast overloaded for geometry_msgs::Vector3
+     138             :    *
+     139             :    * @return vector3
+     140             :    */
+     141             :   operator geometry_msgs::Vector3() const;
+     142             : 
+     143             : private:
+     144             :   tf2::Vector3 vector3_;
+     145             : };
+     146             : 
+     147             : //}
+     148             : 
+     149             : /**
+     150             :  * @brief The main convertor class. Instantiate with any type in constructor and get the value in any other type by assigning the instance to your variable,
+     151             :  * as: tf::Quaternion tf1_quaternion = AttitudeConverter(roll, pitch, yaw); All the default Euler angles are in the extrinsic RPY notation.
+     152             :  */
+     153             : class AttitudeConverter {
+     154             : public:
+     155             :   /* exceptions //{ */
+     156             : 
+     157             :   //! is thrown when calculating of heading is not possible due to atan2 exception
+     158             :   struct GetHeadingException : public std::exception
+     159             :   {
+     160           1 :     const char* what() const throw() {
+     161           1 :       return "AttitudeConverter: can not calculate the heading, the rotated x-axis is parallel to the world's z-axis";
+     162             :     }
+     163             :   };
+     164             : 
+     165             :   //! is thrown when math breaks
+     166             :   struct MathErrorException : public std::exception
+     167             :   {
+     168           0 :     const char* what() const throw() {
+     169           0 :       return "AttitudeConverter: math error";
+     170             :     }
+     171             :   };
+     172             : 
+     173             :   //! is thrown when the internal attitude becomes invalid
+     174             :   struct InvalidAttitudeException : public std::exception
+     175             :   {
+     176           2 :     const char* what() const throw() {
+     177           2 :       return "AttitudeConverter: invalid attitude, the input probably constains NaNs";
+     178             :     }
+     179             :   };
+     180             : 
+     181             :   //! is thrown when the Euler angle format is set wrongly
+     182             :   struct EulerFormatException : public std::exception
+     183             :   {
+     184             :     const char* what() const throw() {
+     185             :       return "AttitudeConverter: invalid Euler angle format";
+     186             :     }
+     187             :   };
+     188             : 
+     189             :   //! is thrown when the heading cannot be set to an existing attitude
+     190             :   struct SetHeadingException : public std::exception
+     191             :   {
+     192           0 :     const char* what() const throw() {
+     193           0 :       return "AttitudeConverter: cannot set the desired heading, the thrust vector's Z component is 0";
+     194             :     }
+     195             :   };
+     196             : 
+     197             :   //}
+     198             : 
+     199             :   /* constructors //{ */
+     200             : 
+     201             :   /**
+     202             :    * @brief Euler angles constructor
+     203             :    *
+     204             :    * @param roll
+     205             :    * @param pitch
+     206             :    * @param yaw
+     207             :    * @param format optional, Euler angle convention, {"extrinsic", "intrinsic"}, defaults to "extrinsic"
+     208             :    */
+     209    12810206 :   AttitudeConverter(const double& roll, const double& pitch, const double& yaw, const RPY_convention_t& format = RPY_EXTRINSIC);
+     210             : 
+     211             :   /**
+     212             :    * @brief tf::Quaternion constructor
+     213             :    *
+     214             :    * @param quaternion tf::Quaternion quaternion
+     215             :    */
+     216             :   AttitudeConverter(const tf::Quaternion quaternion);
+     217             : 
+     218             :   /**
+     219             :    * @brief geometry_msgs::Quaternion constructor
+     220             :    *
+     221             :    * @param quaternion geometry_msgs::Quaternion quaternion
+     222             :    */
+     223             :   AttitudeConverter(const geometry_msgs::Quaternion quaternion);
+     224             : 
+     225             :   /**
+     226             :    * @brief mrs_lib::EulerAttitude constructor
+     227             :    *
+     228             :    * @param euler_attitude mrs_lib::EulerAttitude
+     229             :    */
+     230             :   AttitudeConverter(const mrs_lib::EulerAttitude& euler_attitude);
+     231             : 
+     232             :   /**
+     233             :    * @brief Eigen::Quaterniond constructor
+     234             :    *
+     235             :    * @param quaternion Eigen::Quaterniond quaternion
+     236             :    */
+     237             :   AttitudeConverter(const Eigen::Quaterniond quaternion);
+     238             : 
+     239             :   /**
+     240             :    * @brief Eigen::Matrix3d constructor
+     241             :    *
+     242             :    * @param matrix Eigen::Matrix3d rotational matrix
+     243             :    */
+     244             :   AttitudeConverter(const Eigen::Matrix3d matrix);
+     245             : 
+     246             :   /**
+     247             :    * @brief Eigen::AngleAxis constructor
+     248             :    *
+     249             :    * @tparam T angle-axis base type
+     250             :    * @param angle_axis Eigen::AngleAxis
+     251             :    */
+     252             :   template <class T>
+     253      569568 :   AttitudeConverter(const Eigen::AngleAxis<T> angle_axis) {
+     254      566720 :     double       angle = angle_axis.angle();
+     255      567638 :     tf2::Vector3 axis(angle_axis.axis()[0], angle_axis.axis()[1], angle_axis.axis()[2]);
+     256             : 
+     257      568437 :     tf2_quaternion_.setRotation(axis, angle);
+     258      568163 :   }
+     259             : 
+     260             :   /**
+     261             :    * @brief tf2::Quaternion constructor
+     262             :    *
+     263             :    * @param quaternion tf2::Quaternion
+     264             :    */
+     265             :   AttitudeConverter(const tf2::Quaternion quaternion);
+     266             : 
+     267             :   /**
+     268             :    * @brief tf2::Matrix3x3 constructor
+     269             :    *
+     270             :    * @param quaternion tf2::Matrix3x3
+     271             :    */
+     272             :   AttitudeConverter(const tf2::Matrix3x3 matrix);
+     273             : 
+     274             :   //}
+     275             : 
+     276             :   /* operators //{ */
+     277             : 
+     278             :   /**
+     279             :    * @brief typecast to tf2::Quaternion
+     280             :    *
+     281             :    * @return orientation in tf2::Quaternion
+     282             :    */
+     283             :   operator tf2::Quaternion() const;
+     284             : 
+     285             :   /**
+     286             :    * @brief typecast to tf::Quaternion
+     287             :    *
+     288             :    * @return orientation in tf::Quaternion
+     289             :    */
+     290             :   operator tf::Quaternion() const;
+     291             : 
+     292             :   /**
+     293             :    * @brief typecast to geometry_msgs::Quaternion
+     294             :    *
+     295             :    * @return orientation in geometry_msgs::Quaternion
+     296             :    */
+     297             :   operator geometry_msgs::Quaternion() const;
+     298             : 
+     299             :   /**
+     300             :    * @brief typecast to EulerAttitude
+     301             :    *
+     302             :    * @return orientation in EulerAttitude
+     303             :    */
+     304             :   operator EulerAttitude() const;
+     305             : 
+     306             :   /**
+     307             :    * @brief typecast to Eigen::AngleAxis
+     308             :    *
+     309             :    * @tparam T angle-axis base type
+     310             :    *
+     311             :    * @return orientation in EulerAttitude
+     312             :    */
+     313             :   template <class T>
+     314           1 :   operator Eigen::AngleAxis<T>() const {
+     315             : 
+     316           1 :     double          angle = tf2_quaternion_.getAngle();
+     317           1 :     Eigen::Vector3d axis(tf2_quaternion_.getAxis()[0], tf2_quaternion_.getAxis()[1], tf2_quaternion_.getAxis()[2]);
+     318             : 
+     319           1 :     Eigen::AngleAxis<T> angle_axis(angle, axis);
+     320             : 
+     321           2 :     return angle_axis;
+     322             :   }
+     323             : 
+     324             : 
+     325             :   /**
+     326             :    * @brief typecast to EulerAttitude Eigen::Quaternion
+     327             :    *
+     328             :    * @tparam T quaternion base type
+     329             :    *
+     330             :    * @return orientation in Eigen::Quaternion
+     331             :    */
+     332             :   template <class T>
+     333       86515 :   operator Eigen::Quaternion<T>() const {
+     334             : 
+     335       86515 :     return Eigen::Quaternion<T>(tf2_quaternion_.w(), tf2_quaternion_.x(), tf2_quaternion_.y(), tf2_quaternion_.z());
+     336             :   }
+     337             : 
+     338             :   operator Eigen::Matrix3d() const;
+     339             : 
+     340             :   /**
+     341             :    * @brief typecase to tuple of Euler angles in extrinsic RPY
+     342             :    *
+     343             :    * @return std::tuple of extrinsic RPY
+     344             :    */
+     345             :   operator std::tuple<double&, double&, double&>();
+     346             : 
+     347             :   /**
+     348             :    * @brief typecase to tf2::Matrix3x3
+     349             :    *
+     350             :    * @return tf2::Matrix3x3 rotational matrix
+     351             :    */
+     352             :   operator tf2::Matrix3x3() const;
+     353             : 
+     354             :   /**
+     355             :    * @brief typecase to tf2::Transform
+     356             :    *
+     357             :    * @return tf2::Transform
+     358             :    */
+     359             :   operator tf2::Transform() const;
+     360             : 
+     361             :   //}
+     362             : 
+     363             :   /* getters //{ */
+     364             : 
+     365             :   /**
+     366             :    * @brief get the roll angle
+     367             :    *
+     368             :    * @return roll
+     369             :    */
+     370             :   double getRoll(void);
+     371             : 
+     372             :   /**
+     373             :    * @brief get the pitch angle
+     374             :    *
+     375             :    * @return pitch
+     376             :    */
+     377             :   double getPitch(void);
+     378             : 
+     379             :   /**
+     380             :    * @brief get the yaw angle
+     381             :    *
+     382             :    * @return yaw
+     383             :    */
+     384             :   double getYaw(void);
+     385             : 
+     386             :   /**
+     387             :    * @brief get the angle of the rotated x-axis in the original XY plane, a.k.a
+     388             :    *
+     389             :    * @return heading
+     390             :    */
+     391             :   double getHeading(void);
+     392             : 
+     393             :   /**
+     394             :    * @brief get heading rate base on the orientation and body-based attitude rate
+     395             :    *
+     396             :    * @param attitude_rate in the body frame
+     397             :    *
+     398             :    * @return heading rate in the world
+     399             :    */
+     400             :   double getHeadingRate(const Vector3Converter& attitude_rate);
+     401             : 
+     402             :   /**
+     403             :    * @brief get the intrinsic yaw rate from a heading rate
+     404             :    *
+     405             :    * @param heading_rate
+     406             :    *
+     407             :    * @return intrinsic yaw rate
+     408             :    */
+     409             :   double getYawRateIntrinsic(const double& heading_rate);
+     410             : 
+     411             :   /**
+     412             :    * @brief get a unit vector pointing in the X direction
+     413             :    *
+     414             :    * @return the vector
+     415             :    */
+     416             :   Vector3Converter getVectorX(void);
+     417             : 
+     418             :   /**
+     419             :    * @brief get a unit vector pointing in the Y direction
+     420             :    *
+     421             :    * @return the vector
+     422             :    */
+     423             :   Vector3Converter getVectorY(void);
+     424             : 
+     425             :   /**
+     426             :    * @brief get a unit vector pointing in the Z direction
+     427             :    *
+     428             :    * @return the vector
+     429             :    */
+     430             :   Vector3Converter getVectorZ(void);
+     431             : 
+     432             :   /**
+     433             :    * @brief get the Roll, Pitch, Yaw angles in the Intrinsic convention
+     434             :    *
+     435             :    * @return RPY
+     436             :    */
+     437             :   std::tuple<double, double, double> getIntrinsicRPY();
+     438             : 
+     439             :   /**
+     440             :    * @brief get the Roll, Pitch, Yaw angles in the Extrinsic convention. The same as the default AttitudeConverter assignment.
+     441             :    *
+     442             :    * @return RPY
+     443             :    */
+     444             :   std::tuple<double, double, double> getExtrinsicRPY();
+     445             : 
+     446             :   //}
+     447             : 
+     448             :   /* setters //{ */
+     449             : 
+     450             :   /**
+     451             :    * @brief Updates the heading of the current orientation by updating the intrinsic yaw
+     452             :    *
+     453             :    * @param new heading
+     454             :    *
+     455             :    * @return the orientation
+     456             :    */
+     457             :   AttitudeConverter setHeading(const double& heading);
+     458             : 
+     459             :   /**
+     460             :    * @brief Updates the extrinsic yaw of the current orientation.
+     461             :    *
+     462             :    * @param new yaw
+     463             :    *
+     464             :    * @return the orientation
+     465             :    */
+     466             :   AttitudeConverter setYaw(const double& new_yaw);
+     467             : 
+     468             :   //}
+     469             : 
+     470             :   template <std::size_t I>
+     471             :   constexpr auto get();
+     472             : 
+     473             : private:
+     474             :   /**
+     475             :    * @brief Internal representation of the attitude
+     476             :    */
+     477             :   tf2::Quaternion tf2_quaternion_;
+     478             : 
+     479             :   /**
+     480             :    * @brief convert the internal quaternion representation to internally-stored RPY
+     481             :    */
+     482             :   void calculateRPY(void);
+     483             : 
+     484             :   /**
+     485             :    * @brief throws exception when the internal attitude is invalid
+     486             :    */
+     487             :   void validateOrientation(void);
+     488             : 
+     489             :   /**
+     490             :    * @brief Internal representation in RPY. is used only when converting to RPY.
+     491             :    */
+     492             :   double roll_, pitch_, yaw_;
+     493             :   bool   got_rpy_ = false;
+     494             : };
+     495             : 
+     496             : 
+     497             : template <std::size_t I>
+     498           3 : constexpr auto AttitudeConverter::get() {
+     499             : 
+     500           3 :   calculateRPY();
+     501             : 
+     502             :   // call compilation error if I > 2
+     503             :   static_assert(I <= 2);
+     504             : 
+     505             :   // get the RPY components based on the index in the tuple
+     506             :   if constexpr (I == 0) {
+     507           1 :     return static_cast<double>(roll_);
+     508             :   } else if constexpr (I == 1) {
+     509           1 :     return static_cast<double>(pitch_);
+     510             :   } else if constexpr (I == 2) {
+     511           1 :     return static_cast<double>(yaw_);
+     512             :   }
+     513             : }
+     514             : 
+     515             : }  // namespace mrs_lib
+     516             : 
+     517             : template <>
+     518             : struct std::tuple_size<mrs_lib::AttitudeConverter>
+     519             : { static constexpr int value = 3; };
+     520             : 
+     521             : template <>
+     522             : struct std::tuple_element<0, mrs_lib::AttitudeConverter>
+     523             : { using type = double; };
+     524             : 
+     525             : template <>
+     526             : struct std::tuple_element<1, mrs_lib::AttitudeConverter>
+     527             : { using type = double; };
+     528             : 
+     529             : template <>
+     530             : struct std::tuple_element<2, mrs_lib::AttitudeConverter>
+     531             : { using type = double; };
+     532             : 
+     533             : #endif
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/attitude_converter.h.gcov.overview.html b/mrs_lib/include/mrs_lib/attitude_converter.h.gcov.overview.html new file mode 100644 index 0000000000..2b64ca38c0 --- /dev/null +++ b/mrs_lib/include/mrs_lib/attitude_converter.h.gcov.overview.html @@ -0,0 +1,154 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/attitude_converter.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/include/mrs_lib/attitude_converter.h.gcov.png b/mrs_lib/include/mrs_lib/attitude_converter.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..5645ea2bb184ba5c13faadff6ae080a7ed21a006 GIT binary patch literal 1675 zcmV;626Xv}P)R0{{R3v^8aD0000OP)t-s|NsB0 zs;a7|?_FK${{R500003000620&P%hU00009a7bBm000ie000ie0hKEb8vp^O~xJw}!I*vg`@baJIpOoIavV`$(K?>!`bo|a^C) za8g(t(GB3SHwi*Y*B(ABA)4cq7R?deK-XjKEeJ~&vr9LR}k6~|SE zj-$qCkGRR)tetw3kCxx*!;6UEC@RHf4BS;>N2h>L$)pCW@@QNm!OX>*`BO)Lk71D%>OnE>K^hjQTBMES? zGvhv}xdH-50z4|BgOy^!kpa(GH^`~foRA8S^Y>UW#vJMJOe}{A4}y>ij~qH^H4MF) zneqsxd6A=h9u5{hcDe;P(zMKk1rd-Ue&^knPPR3jA9^gb>#8x~Ik7N~R1Fdq@=|ju z0T!S8M{bY&wr%zW06bfshHfN{MDlGm(rkM>62Wo>ikiawavEnFLStBy1HdIWEFe%Ww^Ngwm;Hcq)jl z0*{0W;oTtCZ~llxle+lG>3#O+D&&gJrG@=)lao1h2seK7gq0SK9kjuxg-NrKGR!%~ z`au99dU_T5N&6~=-sZqq>k<~8`<@qW?#HHsHY0qrv%R~ejG3dmdiYQNZF4O4*G{-$ z^G7N8QUf@SO&a1DH?d4h1F$$gpRd=K`+0r3pV#NJ)po+CrwQ%T-SgEVtiNn>JQv4Q z$!a>`qaW=;`3?H`0rb(Ur2TajeM}|3XxAlSQK}p$B;JRoy~&s`4k)2hNq1Dm2(-&Z z%ZP0UeT*pTteufi+CMJX^?uWrH*Wvgee-&=U5j%JyB%`DkeX;_W9brNyMAW@LV=NF z`vbMAFhtINPYBIhx=Oy)`A1x1t=K11!#H_Sq=yYc#`?Mxm2Dy{cz^))?R~`tEg7 zo(>_l>s;xc@cdbu``xNXAjEdvf~QT$fk&n`v;a?Mx|iT-@?_UO)>ViPPuH7ayKcbK zIe5W=N5r<4w5LOe?HZq((Kwy}I4+3;`PQSeHB3yo++}$V=9qWo+^i(35sOuwsIM>rafH+-<*caYfll7-k8qBGOLd1CnUsn zot2`+1`_h(bt-s#>%p`$vc0^nk+7M>5i7}n<3->Z68->q@ErZ91s_QKmCsa&B%_`q z1D@+YQz7;U=C6FFLhb=op7xZL`xqZRZtpz_n1U--iU~*Zp}2TpDV}{(xy0affm7%5 z+W7_^4dR!LZX*O5l2^DZ1 z?A~WeTGw4u;hC=z$ot`PUf>U&F~>i6h8%ghnJNAcf#T%Hdy|jS=_H)EsjMJ8?!*5I z51!+@7iT$1QUD{R;|$UhBs~Y1;Zi2XPgaWJl!jXIElj|TK46~NkO7}ca2>#x;XcI* z^CV0j8!}-zAteJI3FZ@GU`1FF5~pzC_+7=3X)_ASQIrJ;gUR_iSNsD<>R>{U1Y^?W zvYR!Sg}4SeuBe%R`Cnmz$V;iPVjSJHb9JE2c3kC8_@f)zqlD5AEDo&}n_5NIC62c= zqkgYRb;F6tx*!Fl3jb2?u8vgi2?nd`J-wb + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/dynamic_reconfigure_mgr.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - dynamic_reconfigure_mgr.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:578765.5 %
Date:2024-04-18 23:11:36Functions:288532.9 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::load_param<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::shared_ptr<mrs_uav_state_estimators::CorrectionConfig::AbstractParamDescription const>&, mrs_uav_state_estimators::CorrectionConfig&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::load_param<bool>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::shared_ptr<mrs_uav_state_estimators::CorrectionConfig::AbstractParamDescription const>&, mrs_uav_state_estimators::CorrectionConfig&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::load_param<int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::shared_ptr<mrs_uav_state_estimators::CorrectionConfig::AbstractParamDescription const>&, mrs_uav_state_estimators::CorrectionConfig&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::print_value<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::print_value<bool>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::print_value<int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int const&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::try_compare<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(boost::any&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::try_compare<bool>(boost::any&, bool*&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::try_compare<double>(boost::any&, double*&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::try_compare<int>(boost::any&, int*&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::try_cast<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(boost::any&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::try_cast<bool>(boost::any&, bool*&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::HeadingEstimatorConfig>::load_param<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::shared_ptr<mrs_uav_state_estimators::HeadingEstimatorConfig::AbstractParamDescription const>&, mrs_uav_state_estimators::HeadingEstimatorConfig&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::HeadingEstimatorConfig>::load_param<bool>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::shared_ptr<mrs_uav_state_estimators::HeadingEstimatorConfig::AbstractParamDescription const>&, mrs_uav_state_estimators::HeadingEstimatorConfig&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::HeadingEstimatorConfig>::load_param<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::shared_ptr<mrs_uav_state_estimators::HeadingEstimatorConfig::AbstractParamDescription const>&, mrs_uav_state_estimators::HeadingEstimatorConfig&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::HeadingEstimatorConfig>::load_param<int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::shared_ptr<mrs_uav_state_estimators::HeadingEstimatorConfig::AbstractParamDescription const>&, mrs_uav_state_estimators::HeadingEstimatorConfig&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::HeadingEstimatorConfig>::print_value<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::HeadingEstimatorConfig>::print_value<bool>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::HeadingEstimatorConfig>::print_value<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, double const&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::HeadingEstimatorConfig>::print_value<int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int const&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::HeadingEstimatorConfig>::try_compare<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(boost::any&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::HeadingEstimatorConfig>::try_compare<bool>(boost::any&, bool*&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::HeadingEstimatorConfig>::try_compare<double>(boost::any&, double*&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::HeadingEstimatorConfig>::try_compare<int>(boost::any&, int*&)0
mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::HeadingEstimatorConfig>::load_defaults(mrs_uav_state_estimators::HeadingEstimatorConfig&)0
mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::HeadingEstimatorConfig>::update_config(mrs_uav_state_estimators::HeadingEstimatorConfig const&)0
mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::HeadingEstimatorConfig>::print_changed_params(mrs_uav_state_estimators::HeadingEstimatorConfig const&)0
mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::HeadingEstimatorConfig>::dynamic_reconfigure_callback(mrs_uav_state_estimators::HeadingEstimatorConfig&, unsigned int)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::HeadingEstimatorConfig>::try_cast<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(boost::any&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::HeadingEstimatorConfig>::try_cast<bool>(boost::any&, bool*&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::HeadingEstimatorConfig>::try_cast<double>(boost::any&, double*&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::HeadingEstimatorConfig>::try_cast<int>(boost::any&, int*&)0
mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::HeadingEstimatorConfig>::DynamicReconfigureMgr(ros::NodeHandle const&, bool, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::function<void (mrs_uav_state_estimators::HeadingEstimatorConfig&, unsigned int)> const&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::LateralEstimatorConfig>::load_param<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::shared_ptr<mrs_uav_state_estimators::LateralEstimatorConfig::AbstractParamDescription const>&, mrs_uav_state_estimators::LateralEstimatorConfig&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::LateralEstimatorConfig>::load_param<bool>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::shared_ptr<mrs_uav_state_estimators::LateralEstimatorConfig::AbstractParamDescription const>&, mrs_uav_state_estimators::LateralEstimatorConfig&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::LateralEstimatorConfig>::load_param<int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::shared_ptr<mrs_uav_state_estimators::LateralEstimatorConfig::AbstractParamDescription const>&, mrs_uav_state_estimators::LateralEstimatorConfig&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::LateralEstimatorConfig>::print_value<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::LateralEstimatorConfig>::print_value<bool>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::LateralEstimatorConfig>::print_value<int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int const&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::LateralEstimatorConfig>::try_compare<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(boost::any&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::LateralEstimatorConfig>::try_compare<bool>(boost::any&, bool*&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::LateralEstimatorConfig>::try_compare<double>(boost::any&, double*&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::LateralEstimatorConfig>::try_compare<int>(boost::any&, int*&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::LateralEstimatorConfig>::try_cast<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(boost::any&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::LateralEstimatorConfig>::try_cast<bool>(boost::any&, bool*&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::AltitudeEstimatorConfig>::load_param<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::shared_ptr<mrs_uav_state_estimators::AltitudeEstimatorConfig::AbstractParamDescription const>&, mrs_uav_state_estimators::AltitudeEstimatorConfig&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::AltitudeEstimatorConfig>::load_param<bool>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::shared_ptr<mrs_uav_state_estimators::AltitudeEstimatorConfig::AbstractParamDescription const>&, mrs_uav_state_estimators::AltitudeEstimatorConfig&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::AltitudeEstimatorConfig>::load_param<int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::shared_ptr<mrs_uav_state_estimators::AltitudeEstimatorConfig::AbstractParamDescription const>&, mrs_uav_state_estimators::AltitudeEstimatorConfig&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::AltitudeEstimatorConfig>::print_value<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::AltitudeEstimatorConfig>::print_value<bool>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::AltitudeEstimatorConfig>::print_value<int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int const&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::AltitudeEstimatorConfig>::try_compare<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(boost::any&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::AltitudeEstimatorConfig>::try_compare<bool>(boost::any&, bool*&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::AltitudeEstimatorConfig>::try_compare<double>(boost::any&, double*&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::AltitudeEstimatorConfig>::try_compare<int>(boost::any&, int*&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::AltitudeEstimatorConfig>::try_cast<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(boost::any&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::AltitudeEstimatorConfig>::try_cast<bool>(boost::any&, bool*&)0
mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::LateralEstimatorConfig>::load_defaults(mrs_uav_state_estimators::LateralEstimatorConfig&)97
mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::LateralEstimatorConfig>::print_changed_params(mrs_uav_state_estimators::LateralEstimatorConfig const&)97
mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::LateralEstimatorConfig>::dynamic_reconfigure_callback(mrs_uav_state_estimators::LateralEstimatorConfig&, unsigned int)97
mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::LateralEstimatorConfig>::DynamicReconfigureMgr(ros::NodeHandle const&, bool, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::function<void (mrs_uav_state_estimators::LateralEstimatorConfig&, unsigned int)> const&)97
mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::AltitudeEstimatorConfig>::load_defaults(mrs_uav_state_estimators::AltitudeEstimatorConfig&)167
mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::AltitudeEstimatorConfig>::print_changed_params(mrs_uav_state_estimators::AltitudeEstimatorConfig const&)167
mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::AltitudeEstimatorConfig>::dynamic_reconfigure_callback(mrs_uav_state_estimators::AltitudeEstimatorConfig&, unsigned int)167
mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::AltitudeEstimatorConfig>::DynamicReconfigureMgr(ros::NodeHandle const&, bool, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::function<void (mrs_uav_state_estimators::AltitudeEstimatorConfig&, unsigned int)> const&)167
mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::LateralEstimatorConfig>::update_config(mrs_uav_state_estimators::LateralEstimatorConfig const&)194
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::LateralEstimatorConfig>::load_param<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::shared_ptr<mrs_uav_state_estimators::LateralEstimatorConfig::AbstractParamDescription const>&, mrs_uav_state_estimators::LateralEstimatorConfig&)291
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::LateralEstimatorConfig>::print_value<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, double const&)291
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::LateralEstimatorConfig>::try_cast<double>(boost::any&, double*&)291
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::LateralEstimatorConfig>::try_cast<int>(boost::any&, int*&)291
mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::AltitudeEstimatorConfig>::update_config(mrs_uav_state_estimators::AltitudeEstimatorConfig const&)334
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::load_param<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::shared_ptr<mrs_uav_state_estimators::CorrectionConfig::AbstractParamDescription const>&, mrs_uav_state_estimators::CorrectionConfig&)346
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::print_value<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, double const&)346
mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::load_defaults(mrs_uav_state_estimators::CorrectionConfig&)346
mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::print_changed_params(mrs_uav_state_estimators::CorrectionConfig const&)346
mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::dynamic_reconfigure_callback(mrs_uav_state_estimators::CorrectionConfig&, unsigned int)346
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::try_cast<double>(boost::any&, double*&)346
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::try_cast<int>(boost::any&, int*&)346
mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::DynamicReconfigureMgr(ros::NodeHandle const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)346
mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::DynamicReconfigureMgr(ros::NodeHandle const&, bool, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::function<void (mrs_uav_state_estimators::CorrectionConfig&, unsigned int)> const&)346
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::AltitudeEstimatorConfig>::load_param<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::shared_ptr<mrs_uav_state_estimators::AltitudeEstimatorConfig::AbstractParamDescription const>&, mrs_uav_state_estimators::AltitudeEstimatorConfig&)501
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::AltitudeEstimatorConfig>::print_value<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, double const&)501
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::AltitudeEstimatorConfig>::try_cast<double>(boost::any&, double*&)501
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::AltitudeEstimatorConfig>::try_cast<int>(boost::any&, int*&)501
mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::update_config(mrs_uav_state_estimators::CorrectionConfig const&)692
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/dynamic_reconfigure_mgr.h.func.html b/mrs_lib/include/mrs_lib/dynamic_reconfigure_mgr.h.func.html new file mode 100644 index 0000000000..2be772352b --- /dev/null +++ b/mrs_lib/include/mrs_lib/dynamic_reconfigure_mgr.h.func.html @@ -0,0 +1,420 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/dynamic_reconfigure_mgr.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - dynamic_reconfigure_mgr.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:578765.5 %
Date:2024-04-18 23:11:36Functions:288532.9 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::load_param<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::shared_ptr<mrs_uav_state_estimators::CorrectionConfig::AbstractParamDescription const>&, mrs_uav_state_estimators::CorrectionConfig&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::load_param<bool>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::shared_ptr<mrs_uav_state_estimators::CorrectionConfig::AbstractParamDescription const>&, mrs_uav_state_estimators::CorrectionConfig&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::load_param<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::shared_ptr<mrs_uav_state_estimators::CorrectionConfig::AbstractParamDescription const>&, mrs_uav_state_estimators::CorrectionConfig&)346
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::load_param<int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::shared_ptr<mrs_uav_state_estimators::CorrectionConfig::AbstractParamDescription const>&, mrs_uav_state_estimators::CorrectionConfig&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::print_value<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::print_value<bool>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::print_value<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, double const&)346
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::print_value<int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int const&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::try_compare<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(boost::any&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::try_compare<bool>(boost::any&, bool*&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::try_compare<double>(boost::any&, double*&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::try_compare<int>(boost::any&, int*&)0
mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::load_defaults(mrs_uav_state_estimators::CorrectionConfig&)346
mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::update_config(mrs_uav_state_estimators::CorrectionConfig const&)692
mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::print_changed_params(mrs_uav_state_estimators::CorrectionConfig const&)346
mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::dynamic_reconfigure_callback(mrs_uav_state_estimators::CorrectionConfig&, unsigned int)346
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::try_cast<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(boost::any&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::try_cast<bool>(boost::any&, bool*&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::try_cast<double>(boost::any&, double*&)346
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::try_cast<int>(boost::any&, int*&)346
mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::DynamicReconfigureMgr(ros::NodeHandle const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)346
mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::CorrectionConfig>::DynamicReconfigureMgr(ros::NodeHandle const&, bool, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::function<void (mrs_uav_state_estimators::CorrectionConfig&, unsigned int)> const&)346
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::HeadingEstimatorConfig>::load_param<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::shared_ptr<mrs_uav_state_estimators::HeadingEstimatorConfig::AbstractParamDescription const>&, mrs_uav_state_estimators::HeadingEstimatorConfig&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::HeadingEstimatorConfig>::load_param<bool>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::shared_ptr<mrs_uav_state_estimators::HeadingEstimatorConfig::AbstractParamDescription const>&, mrs_uav_state_estimators::HeadingEstimatorConfig&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::HeadingEstimatorConfig>::load_param<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::shared_ptr<mrs_uav_state_estimators::HeadingEstimatorConfig::AbstractParamDescription const>&, mrs_uav_state_estimators::HeadingEstimatorConfig&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::HeadingEstimatorConfig>::load_param<int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::shared_ptr<mrs_uav_state_estimators::HeadingEstimatorConfig::AbstractParamDescription const>&, mrs_uav_state_estimators::HeadingEstimatorConfig&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::HeadingEstimatorConfig>::print_value<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::HeadingEstimatorConfig>::print_value<bool>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::HeadingEstimatorConfig>::print_value<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, double const&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::HeadingEstimatorConfig>::print_value<int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int const&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::HeadingEstimatorConfig>::try_compare<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(boost::any&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::HeadingEstimatorConfig>::try_compare<bool>(boost::any&, bool*&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::HeadingEstimatorConfig>::try_compare<double>(boost::any&, double*&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::HeadingEstimatorConfig>::try_compare<int>(boost::any&, int*&)0
mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::HeadingEstimatorConfig>::load_defaults(mrs_uav_state_estimators::HeadingEstimatorConfig&)0
mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::HeadingEstimatorConfig>::update_config(mrs_uav_state_estimators::HeadingEstimatorConfig const&)0
mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::HeadingEstimatorConfig>::print_changed_params(mrs_uav_state_estimators::HeadingEstimatorConfig const&)0
mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::HeadingEstimatorConfig>::dynamic_reconfigure_callback(mrs_uav_state_estimators::HeadingEstimatorConfig&, unsigned int)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::HeadingEstimatorConfig>::try_cast<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(boost::any&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::HeadingEstimatorConfig>::try_cast<bool>(boost::any&, bool*&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::HeadingEstimatorConfig>::try_cast<double>(boost::any&, double*&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::HeadingEstimatorConfig>::try_cast<int>(boost::any&, int*&)0
mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::HeadingEstimatorConfig>::DynamicReconfigureMgr(ros::NodeHandle const&, bool, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::function<void (mrs_uav_state_estimators::HeadingEstimatorConfig&, unsigned int)> const&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::LateralEstimatorConfig>::load_param<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::shared_ptr<mrs_uav_state_estimators::LateralEstimatorConfig::AbstractParamDescription const>&, mrs_uav_state_estimators::LateralEstimatorConfig&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::LateralEstimatorConfig>::load_param<bool>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::shared_ptr<mrs_uav_state_estimators::LateralEstimatorConfig::AbstractParamDescription const>&, mrs_uav_state_estimators::LateralEstimatorConfig&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::LateralEstimatorConfig>::load_param<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::shared_ptr<mrs_uav_state_estimators::LateralEstimatorConfig::AbstractParamDescription const>&, mrs_uav_state_estimators::LateralEstimatorConfig&)291
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::LateralEstimatorConfig>::load_param<int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::shared_ptr<mrs_uav_state_estimators::LateralEstimatorConfig::AbstractParamDescription const>&, mrs_uav_state_estimators::LateralEstimatorConfig&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::LateralEstimatorConfig>::print_value<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::LateralEstimatorConfig>::print_value<bool>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::LateralEstimatorConfig>::print_value<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, double const&)291
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::LateralEstimatorConfig>::print_value<int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int const&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::LateralEstimatorConfig>::try_compare<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(boost::any&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::LateralEstimatorConfig>::try_compare<bool>(boost::any&, bool*&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::LateralEstimatorConfig>::try_compare<double>(boost::any&, double*&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::LateralEstimatorConfig>::try_compare<int>(boost::any&, int*&)0
mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::LateralEstimatorConfig>::load_defaults(mrs_uav_state_estimators::LateralEstimatorConfig&)97
mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::LateralEstimatorConfig>::update_config(mrs_uav_state_estimators::LateralEstimatorConfig const&)194
mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::LateralEstimatorConfig>::print_changed_params(mrs_uav_state_estimators::LateralEstimatorConfig const&)97
mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::LateralEstimatorConfig>::dynamic_reconfigure_callback(mrs_uav_state_estimators::LateralEstimatorConfig&, unsigned int)97
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::LateralEstimatorConfig>::try_cast<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(boost::any&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::LateralEstimatorConfig>::try_cast<bool>(boost::any&, bool*&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::LateralEstimatorConfig>::try_cast<double>(boost::any&, double*&)291
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::LateralEstimatorConfig>::try_cast<int>(boost::any&, int*&)291
mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::LateralEstimatorConfig>::DynamicReconfigureMgr(ros::NodeHandle const&, bool, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::function<void (mrs_uav_state_estimators::LateralEstimatorConfig&, unsigned int)> const&)97
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::AltitudeEstimatorConfig>::load_param<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::shared_ptr<mrs_uav_state_estimators::AltitudeEstimatorConfig::AbstractParamDescription const>&, mrs_uav_state_estimators::AltitudeEstimatorConfig&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::AltitudeEstimatorConfig>::load_param<bool>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::shared_ptr<mrs_uav_state_estimators::AltitudeEstimatorConfig::AbstractParamDescription const>&, mrs_uav_state_estimators::AltitudeEstimatorConfig&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::AltitudeEstimatorConfig>::load_param<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::shared_ptr<mrs_uav_state_estimators::AltitudeEstimatorConfig::AbstractParamDescription const>&, mrs_uav_state_estimators::AltitudeEstimatorConfig&)501
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::AltitudeEstimatorConfig>::load_param<int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::shared_ptr<mrs_uav_state_estimators::AltitudeEstimatorConfig::AbstractParamDescription const>&, mrs_uav_state_estimators::AltitudeEstimatorConfig&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::AltitudeEstimatorConfig>::print_value<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::AltitudeEstimatorConfig>::print_value<bool>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&)0
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::AltitudeEstimatorConfig>::print_value<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, double const&)501
void mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::AltitudeEstimatorConfig>::print_value<int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int const&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::AltitudeEstimatorConfig>::try_compare<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(boost::any&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::AltitudeEstimatorConfig>::try_compare<bool>(boost::any&, bool*&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::AltitudeEstimatorConfig>::try_compare<double>(boost::any&, double*&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::AltitudeEstimatorConfig>::try_compare<int>(boost::any&, int*&)0
mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::AltitudeEstimatorConfig>::load_defaults(mrs_uav_state_estimators::AltitudeEstimatorConfig&)167
mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::AltitudeEstimatorConfig>::update_config(mrs_uav_state_estimators::AltitudeEstimatorConfig const&)334
mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::AltitudeEstimatorConfig>::print_changed_params(mrs_uav_state_estimators::AltitudeEstimatorConfig const&)167
mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::AltitudeEstimatorConfig>::dynamic_reconfigure_callback(mrs_uav_state_estimators::AltitudeEstimatorConfig&, unsigned int)167
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::AltitudeEstimatorConfig>::try_cast<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(boost::any&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::AltitudeEstimatorConfig>::try_cast<bool>(boost::any&, bool*&)0
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::AltitudeEstimatorConfig>::try_cast<double>(boost::any&, double*&)501
bool mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::AltitudeEstimatorConfig>::try_cast<int>(boost::any&, int*&)501
mrs_lib::DynamicReconfigureMgr<mrs_uav_state_estimators::AltitudeEstimatorConfig>::DynamicReconfigureMgr(ros::NodeHandle const&, bool, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::function<void (mrs_uav_state_estimators::AltitudeEstimatorConfig&, unsigned int)> const&)167
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/dynamic_reconfigure_mgr.h.gcov.frameset.html b/mrs_lib/include/mrs_lib/dynamic_reconfigure_mgr.h.gcov.frameset.html new file mode 100644 index 0000000000..fa0e06e3c7 --- /dev/null +++ b/mrs_lib/include/mrs_lib/dynamic_reconfigure_mgr.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/dynamic_reconfigure_mgr.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/include/mrs_lib/dynamic_reconfigure_mgr.h.gcov.html b/mrs_lib/include/mrs_lib/dynamic_reconfigure_mgr.h.gcov.html new file mode 100644 index 0000000000..e32f07b54e --- /dev/null +++ b/mrs_lib/include/mrs_lib/dynamic_reconfigure_mgr.h.gcov.html @@ -0,0 +1,343 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/dynamic_reconfigure_mgr.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - dynamic_reconfigure_mgr.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:578765.5 %
Date:2024-04-18 23:11:36Functions:288532.9 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : // clang: MatousFormat
+       2             : /**  \file
+       3             :      \brief Defines DynamicReconfigureMgr - a convenience class for managing dynamic ROS parameters through dynamic reconfigure.
+       4             :      \author Matouš Vrba - vrbamato@fel.cvut.cz
+       5             :  */
+       6             : #ifndef DYNAMIC_RECONFIGURE_MGR_H
+       7             : #define DYNAMIC_RECONFIGURE_MGR_H
+       8             : 
+       9             : #include <ros/ros.h>
+      10             : #include <dynamic_reconfigure/server.h>
+      11             : #include <string>
+      12             : #include <map>
+      13             : #include <unordered_set>
+      14             : #include <mutex>
+      15             : #include <iostream>
+      16             : #include <boost/any.hpp>
+      17             : #include <Eigen/Dense>
+      18             : #include <mrs_lib/param_loader.h>
+      19             : 
+      20             : 
+      21             : namespace mrs_lib
+      22             : {
+      23             : 
+      24             : /** DynamicReconfigureMgr CLASS //{ **/
+      25             : // This class handles dynamic reconfiguration of parameters using dynamic_reconfigure server.
+      26             : // Initialize this manager simply by instantiating an object of this templated class
+      27             : // with the template parameter corresponding to the type of your config message, e.g. as
+      28             : // DynamicReconfigureMgr<MyConfig> drmgr;
+      29             : // This will automatically initialize the dynamic_reconfigure server and a callback method
+      30             : // to asynchronously update the values in the config.
+      31             : // Optionally, you can specify the ros NodeHandle to initialize the dynamic_reconfigure server
+      32             : // and a flag 'print_values' to indicate whether to print new received values (only changed ones,
+      33             : // default is true).
+      34             : // The latest configuration is available through the public member 'config'. This should be
+      35             : // changed externally with care since any change risks being overwritten in the next call to
+      36             : // the 'dynamic_reconfigure_callback' method.
+      37             : // Note that in case of a multithreaded ROS node, external mutexes _might_ be necessary
+      38             : // to make access to the 'config' member thread-safe.
+      39             : template <typename ConfigType>
+      40             : class DynamicReconfigureMgr
+      41             : {
+      42             :   private:
+      43             :     using callback_t = typename dynamic_reconfigure::Server<ConfigType>::CallbackType;
+      44             : public:
+      45             :   // this variable holds the latest received configuration
+      46             :   ConfigType config;
+      47             :   // initialize some stuff in the constructor
+      48         610 :   DynamicReconfigureMgr(const ros::NodeHandle& nh = ros::NodeHandle("~"), bool print_values = true, std::string node_name = std::string(), const callback_t& user_callback = {})
+      49             :       : m_not_initialized(true),
+      50             :         m_loaded_invalid_default(false),
+      51             :         m_print_values(print_values),
+      52             :         m_node_name(node_name),
+      53         610 :         m_server(m_server_mtx, nh),
+      54             :         m_usr_cbf(user_callback),
+      55         610 :         m_pl(nh, print_values, node_name)
+      56             :   {
+      57             :     // initialize the dynamic reconfigure callback
+      58         610 :     m_server.setCallback(boost::bind(&DynamicReconfigureMgr<ConfigType>::dynamic_reconfigure_callback, this, _1, _2));
+      59         610 :   };
+      60             : 
+      61             :   /* Constructor overloads //{ */
+      62             :   // Convenience constructor to enable writing DynamicReconfigureMgr<MyConfig> drmgr(nh, node_name)
+      63         346 :   DynamicReconfigureMgr(const ros::NodeHandle& nh, std::string node_name) : DynamicReconfigureMgr(nh, true, node_name){};
+      64             :   // Convenience constructor to enable writing DynamicReconfigureMgr<MyConfig> drmgr(nh, "node_name")
+      65             :   DynamicReconfigureMgr(const ros::NodeHandle& nh, const char* node_name) : DynamicReconfigureMgr(nh, std::string(node_name)){};
+      66             :   // Convenience constructor to enable writing DynamicReconfigureMgr<MyConfig> drmgr(node_name)
+      67             :   DynamicReconfigureMgr(std::string node_name) : DynamicReconfigureMgr(ros::NodeHandle("~"), node_name){};
+      68             :   //}
+      69             : 
+      70             :   // pushes this config to the server
+      71        1220 :   void update_config(const ConfigType& cfg)
+      72             :   {
+      73        1220 :     m_server.updateConfig(cfg);
+      74        1220 :   }
+      75             : 
+      76             :   // pushes the current config to the server
+      77             :   void update_config()
+      78             :   {
+      79             :     m_server.updateConfig(config);
+      80             :   }
+      81             : 
+      82             :   void publish_descriptions()
+      83             :   {
+      84             :     ConfigType dflt;
+      85             :     m_server.getConfigDefault(dflt);
+      86             :     m_server.setConfigDefault(dflt);
+      87             :   }
+      88             : 
+      89             :   bool loaded_successfully()
+      90             :   {
+      91             :     return !m_not_initialized && !m_loaded_invalid_default && m_pl.loadedSuccessfully();
+      92             :   }
+      93             : 
+      94             : private:
+      95             :   bool m_not_initialized, m_loaded_invalid_default, m_print_values;
+      96             :   std::string m_node_name;
+      97             :   // dynamic_reconfigure server variables
+      98             :   boost::recursive_mutex m_server_mtx;
+      99             :   typename dynamic_reconfigure::Server<ConfigType> m_server;
+     100             :   callback_t m_usr_cbf;
+     101             : 
+     102             :   ParamLoader m_pl;
+     103             :   std::unordered_set<std::string> m_to_init;
+     104             : 
+     105             :   // the callback itself
+     106         610 :   void dynamic_reconfigure_callback(ConfigType& new_config, uint32_t level)
+     107             :   {
+     108         610 :     if (m_print_values)
+     109             :     {
+     110         610 :       if (m_node_name.empty())
+     111           0 :         ROS_INFO("Dynamic reconfigure request received");
+     112             :       else
+     113         610 :         ROS_INFO("[%s]: Dynamic reconfigure request received", m_node_name.c_str());
+     114             :     }
+     115             : 
+     116         610 :     if (m_not_initialized)
+     117             :     {
+     118         610 :       load_defaults(new_config);
+     119         610 :       update_config(new_config);
+     120             :     }
+     121         610 :     if (m_print_values)
+     122             :     {
+     123         610 :       print_changed_params(new_config);
+     124             :     }
+     125         610 :     m_not_initialized = false;
+     126         610 :     config = new_config;
+     127         610 :     if (m_usr_cbf)
+     128         264 :       m_usr_cbf(new_config, level);
+     129         610 :   }
+     130             : 
+     131             :   template <typename T>
+     132        1138 :   void load_param(const std::string& name, typename ConfigType::AbstractParamDescriptionConstPtr& descr, ConfigType& config)
+     133             :   {
+     134             :     using param_descr_t = typename ConfigType::template ParamDescription<T>;
+     135        2276 :     boost::shared_ptr<const param_descr_t> cast_descr = boost::dynamic_pointer_cast<const param_descr_t>(descr);
+     136        1138 :     m_pl.loadParam(name, config.*(cast_descr->field));
+     137        1138 :   }
+     138             :   
+     139         610 :   void load_defaults(ConfigType& new_config)
+     140             :   {
+     141             :     // Note that this part of the API is still unstable and may change! It was tested with ROS Kinetic and Melodic.
+     142        1220 :     std::vector<typename ConfigType::AbstractParamDescriptionConstPtr> descrs = new_config.__getParamDescriptions__();
+     143        1748 :     for (auto& descr : descrs)
+     144             :     {
+     145        2276 :       std::string name = descr->name;
+     146        1138 :       size_t pos = name.find("__");
+     147        1138 :       while (pos != name.npos)
+     148             :       {
+     149           0 :         name.replace(pos, 2, "/");
+     150           0 :         pos = name.find("__");
+     151             :       }
+     152             : 
+     153        1138 :       if (descr->type == "bool")
+     154           0 :         load_param<bool>(name, descr, new_config);
+     155        1138 :       else if (descr->type == "int")
+     156           0 :         load_param<int>(name, descr, new_config);
+     157        1138 :       else if (descr->type == "double")
+     158        1138 :         load_param<double>(name, descr, new_config);
+     159           0 :       else if (descr->type == "str")
+     160           0 :         load_param<std::string>(name, descr, new_config);
+     161             :       else
+     162             :       {
+     163           0 :         ROS_ERROR("[%s]: Unknown parameter type: '%s'", m_node_name.c_str(), descr->type.c_str());
+     164           0 :         m_loaded_invalid_default = true;
+     165             :       }
+     166             :     }
+     167         610 :   }
+     168             : 
+     169             :   // method for printing names and values of new received parameters (prints only the changed ones) //{
+     170         610 :   void print_changed_params(const ConfigType& new_config)
+     171             :   {
+     172             :     // Note that this part of the API is still unstable and may change! It was tested with ROS Kinetic and Melodic.
+     173        1220 :     std::vector<typename ConfigType::AbstractParamDescriptionConstPtr> descrs = new_config.__getParamDescriptions__();
+     174        1748 :     for (auto& descr : descrs)
+     175             :     {
+     176           0 :       boost::any val, old_val;
+     177        1138 :       descr->getValue(new_config, val);
+     178        1138 :       descr->getValue(config, old_val);
+     179        1138 :       std::string name = descr->name;
+     180        1138 :       const size_t pos = name.find("__");
+     181        1138 :       if (pos != name.npos)
+     182             :       {
+     183           0 :         if (m_not_initialized)
+     184             :         {
+     185           0 :           continue;
+     186             :         } else
+     187             :         {
+     188           0 :           name.replace(pos, 2, "/");
+     189             :         }
+     190             :       }
+     191             : 
+     192             :       // try to guess the correct type of the parameter (these should be the only ones supported)
+     193             :       int* intval;
+     194             :       double* doubleval;
+     195             :       bool* boolval;
+     196             :       std::string* stringval;
+     197             : 
+     198        1138 :       if (try_cast(val, intval))
+     199             :       {
+     200           0 :         if (m_not_initialized || !try_compare(old_val, intval))
+     201           0 :           print_value(name, *intval);
+     202        1138 :       } else if (try_cast(val, doubleval))
+     203             :       {
+     204        1138 :         if (m_not_initialized || !try_compare(old_val, doubleval))
+     205        1138 :           print_value(name, *doubleval);
+     206           0 :       } else if (try_cast(val, boolval))
+     207             :       {
+     208           0 :         if (m_not_initialized || !try_compare(old_val, boolval))
+     209           0 :           print_value(name, *boolval);
+     210           0 :       } else if (try_cast(val, stringval))
+     211             :       {
+     212           0 :         if (m_not_initialized || !try_compare(old_val, stringval))
+     213           0 :           print_value(name, *stringval);
+     214             :       } else
+     215             :       {
+     216           0 :         print_value(name, std::string("unknown dynamic reconfigure type"));
+     217             :       }
+     218             :     }
+     219         610 :   }
+     220             :   //}
+     221             :   
+     222             :   // helper method for parameter printing
+     223             :   template <typename T>
+     224        1138 :   inline void print_value(const std::string& name, const T& val)
+     225             :   {
+     226        1138 :     if (m_node_name.empty())
+     227           0 :       std::cout << "\t" << name << ":\t" << val << std::endl;
+     228             :     else
+     229        1138 :       ROS_INFO_STREAM("[" << m_node_name << "]: parameter '" << name << "':\t" << val);
+     230        1138 :   }
+     231             :   // helper methods for automatic parameter value parsing
+     232             :   template <typename T>
+     233        2276 :   inline bool try_cast(boost::any& val, T*& out)
+     234             :   {
+     235        2276 :     return (out = boost::any_cast<T>(&val));
+     236             :   }
+     237             :   template <typename T>
+     238           0 :   inline bool try_compare(boost::any& val, T*& to_what)
+     239             :   {
+     240             :     T* tmp;
+     241           0 :     if ((tmp = boost::any_cast<T>(&val)))
+     242             :     {
+     243             :       /* std::cout << std::endl << *tmp << " vs " << *to_what << std::endl; */
+     244           0 :       return *tmp == *to_what;
+     245             :     } else
+     246             :     {  // the value should not change during runtime - this should never happen (but its better to be safe than sorry)
+     247           0 :       if (m_node_name.empty())
+     248           0 :         ROS_WARN("DynamicReconfigure value type has changed - this should not happen!");
+     249             :       else
+     250           0 :         ROS_WARN_STREAM("[" << m_node_name << "]: DynamicReconfigure value type has changed - this should not happen!");
+     251           0 :       return false;
+     252             :     }
+     253             :   }
+     254             : };
+     255             : //}
+     256             : 
+     257             : }
+     258             : 
+     259             : #endif // DYNAMIC_RECONFIGURE_MGR_H
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/dynamic_reconfigure_mgr.h.gcov.overview.html b/mrs_lib/include/mrs_lib/dynamic_reconfigure_mgr.h.gcov.overview.html new file mode 100644 index 0000000000..d3923d0459 --- /dev/null +++ b/mrs_lib/include/mrs_lib/dynamic_reconfigure_mgr.h.gcov.overview.html @@ -0,0 +1,85 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/dynamic_reconfigure_mgr.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/include/mrs_lib/dynamic_reconfigure_mgr.h.gcov.png b/mrs_lib/include/mrs_lib/dynamic_reconfigure_mgr.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..beea652aa5ace2e35921803bbdef95ad964a6e86 GIT binary patch literal 1370 zcmV-g1*Q6lP)WHHeNXCF(^#PvpXJ0r5 za(hJuf(6Erkyl(*bo2zG;(+EIgWhM3fw5Ww$!+-pGoSzJYqc9oUExez$t=$+)bZ+Q zbeh+mmC{gsM8h!R(9z&@66o%wJv^?vpld` z1mwUy_EZ=P>cGr&HBSB;hUI}7>#aS*TkW# zLRC%f3f+?;%m(&YP^WyRV*E*pjtx-5RbWJp3fQe0i>rHhNuciJ>LaP4PRA4)McZJf zj#SR_)1VFFKq%Zba*4beX5iT3*OZN6BS#p*+t?T#o6w;o^t_y%Maiz?C2Coc%V2(f z&4;9~B~p>Fa#x_II-zHe$0p3wpWWeT1iHGavX!;#9$OE0x7v$I{g|U&GK;9^mM&8( z-iG+cz%RRJ1ia-Q;u&P-`@m#9pVsq;B_z}EQiE8W@X;~HYA1FS`hKqh2YeYqkZ*re zN1yU2T5Z~sUflPY=-RRlaqD%Js%u?>dYx{T<~S?M0JO0@OEXte2fhw^1MTz-?_QN$ z#=YjmTdpMBlGs|7+Zn4dW)em}=0{FX0L`Mm5fp9Eeyk%hO2aVAz!+x}!>pc*X2vAl zNndGaub|*X25idOxBb`_Qf=aI z?z!;LBe$6W_XvR+P=9VybgS8LN+%GuCOLXXR^QCRLL!;R@710X zPa`g6FY#v~`hO~WIMrK;0euSB_Ml>rGp!fLKwHI4^P&s2C+Ww840xmBZj=eSdtSy| z$iP>xDs?#;N`Nz001`b}KkUZX6Z;0`6Hj(9g~#V%VFz>>XuDR)uKLb_-J{?x$0xVg zYu#0(QLpgZz};C4=eIPwZBVFz2^S!uXj*%U+I3u4zB5d`^a<{z*vq=yb&)G6gX?fH zT8nVo$~E!hTL7CayUOvRV-NbAj&BZZbkyBr=|0Zbz2AK7QooHy<)8Kx;~jkk+NoXx zrmL#sn?4MC*Sy5ZWGMUBGdHU-zc}R@wG`AU?73Gck28!R-s+?|W9KS+3QYgQhybKLXL8s?w+3$p8QV07*qoM6N<$f;1+n!vFvP literal 0 HcmV?d00001 diff --git a/mrs_lib/include/mrs_lib/geometry/cyclic.h.func-sort-c.html b/mrs_lib/include/mrs_lib/geometry/cyclic.h.func-sort-c.html new file mode 100644 index 0000000000..7a228da23f --- /dev/null +++ b/mrs_lib/include/mrs_lib/geometry/cyclic.h.func-sort-c.html @@ -0,0 +1,548 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/geometry/cyclic.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/geometry - cyclic.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:608769.0 %
Date:2024-04-18 23:11:36Functions:4811741.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::interpUnwrapped(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::interpUnwrapped(double, double, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::pinterpUnwrapped(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::pinterpUnwrapped(double, double, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::dist(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::dist(double, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::pdist(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::pdist(double, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::interp(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::interp(double, double, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::inRange(double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::pinterp(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::pinterp(double, double, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::cyclic(mrs_lib::geometry::degrees const&)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::cyclic(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees> const&)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::cyclic()0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::operator=(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>&&)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::operator=(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees> const&)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::operator=(double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::operator-=(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees> const&)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::operator+=(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees> const&)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::pinterpUnwrapped(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::pinterpUnwrapped(double, double, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::pdist(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::pdist(double, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::interp(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::inRange(double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::pinterp(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::pinterp(double, double, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::cyclic()0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::operator=(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians> const&)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::operator=(double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::interpUnwrapped(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::interpUnwrapped(double, double, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::pinterpUnwrapped(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::pinterpUnwrapped(double, double, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::dist(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::dist(double, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::pdist(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::pdist(double, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::interp(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::interp(double, double, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::inRange(double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::pinterp(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::pinterp(double, double, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::cyclic(mrs_lib::geometry::sdegrees const&)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::cyclic(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees> const&)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::cyclic()0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::operator=(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>&&)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::operator=(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees> const&)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::operator=(double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::operator-=(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees> const&)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::operator+=(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees> const&)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::pinterpUnwrapped(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::pinterpUnwrapped(double, double, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::pdist(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::pdist(double, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::interp(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::inRange(double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::pinterp(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::pinterp(double, double, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::cyclic(mrs_lib::geometry::sradians const&)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::cyclic()0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::operator=(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>&&)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::operator=(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians> const&)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::operator=(double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::operator-=(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians> const&)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::operator+=(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians> const&)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::value() const0
mrs_lib::geometry::radians mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::convert<mrs_lib::geometry::radians>(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees> const&)1
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::operator-=(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians> const&)1
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::operator+=(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians> const&)1
mrs_lib::geometry::radians mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::convert<mrs_lib::geometry::radians>() const1
bool mrs_lib::geometry::operator><double, mrs_lib::geometry::radians>(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians> const&, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians> const&)2
bool mrs_lib::geometry::operator><double, mrs_lib::geometry::sradians>(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians> const&, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians> const&)2
bool mrs_lib::geometry::operator< <double, mrs_lib::geometry::radians>(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians> const&, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians> const&)2
bool mrs_lib::geometry::operator< <double, mrs_lib::geometry::sradians>(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians> const&, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians> const&)2
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::value() const4
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::operator=(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>&&)6
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::interpUnwrapped(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>, double)898
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::interpUnwrapped(double, double, double)898
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::interp(double, double, double)898
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::diff(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>)10000
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::diff(double, double)10000
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::unwrap(double, double)10000
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::diff(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>)10000
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::diff(double, double)10000
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::unwrap(double, double)10000
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::dist(double, double)10000
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::unwrap(double, double)10001
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::value() const10002
mrs_lib::geometry::operator+(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians> const&, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians> const&)10004
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::dist(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>)10008
mrs_lib::geometry::operator-(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians> const&, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians> const&)10009
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::dist(double, double)10374
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::cyclic(double)20000
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::cyclic(double)20005
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::wrap(double)30000
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::wrap(double)30005
mrs_lib::geometry::operator+(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians> const&, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians> const&)40000
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::value() const40002
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::dist(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>)389695
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::diff(double, double)449405
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::interpUnwrapped(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>, double)516159
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::interpUnwrapped(double, double, double)516160
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::interp(double, double, double)516160
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::cyclic(mrs_lib::geometry::radians const&)757947
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::cyclic(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians> const&)800662
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::diff(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>)849931
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::cyclic(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians> const&)1052342
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::cyclic(double)1729690
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::wrap(double)1752050
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::unwrap(double, double)2838849
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::diff(double, double)2852435
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::diff(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>)3378600
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::cyclic(double)6857209
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::wrap(double)7488169
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/geometry/cyclic.h.func.html b/mrs_lib/include/mrs_lib/geometry/cyclic.h.func.html new file mode 100644 index 0000000000..a09403bee0 --- /dev/null +++ b/mrs_lib/include/mrs_lib/geometry/cyclic.h.func.html @@ -0,0 +1,548 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/geometry/cyclic.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/geometry - cyclic.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:608769.0 %
Date:2024-04-18 23:11:36Functions:4811741.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::interpUnwrapped(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::interpUnwrapped(double, double, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::pinterpUnwrapped(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::pinterpUnwrapped(double, double, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::diff(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>)10000
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::diff(double, double)10000
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::dist(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::dist(double, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::wrap(double)30005
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::pdist(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::pdist(double, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::interp(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::interp(double, double, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::unwrap(double, double)10000
mrs_lib::geometry::radians mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::convert<mrs_lib::geometry::radians>(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees> const&)1
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::inRange(double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::pinterp(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::pinterp(double, double, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::cyclic(mrs_lib::geometry::degrees const&)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::cyclic(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees> const&)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::cyclic(double)20005
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::cyclic()0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::operator=(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>&&)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::operator=(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees> const&)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::operator=(double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::operator-=(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees> const&)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::operator+=(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees> const&)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::interpUnwrapped(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>, double)898
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::interpUnwrapped(double, double, double)898
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::pinterpUnwrapped(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::pinterpUnwrapped(double, double, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::diff(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>)849931
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::diff(double, double)449405
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::dist(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>)389695
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::dist(double, double)10374
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::wrap(double)1752050
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::pdist(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::pdist(double, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::interp(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::interp(double, double, double)898
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::unwrap(double, double)10001
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::inRange(double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::pinterp(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::pinterp(double, double, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::cyclic(mrs_lib::geometry::radians const&)757947
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::cyclic(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians> const&)800662
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::cyclic(double)1729690
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::cyclic()0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::operator=(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>&&)6
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::operator=(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians> const&)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::operator=(double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::operator-=(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians> const&)1
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::operator+=(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians> const&)1
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::interpUnwrapped(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::interpUnwrapped(double, double, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::pinterpUnwrapped(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::pinterpUnwrapped(double, double, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::diff(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>)10000
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::diff(double, double)10000
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::dist(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::dist(double, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::wrap(double)30000
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::pdist(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::pdist(double, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::interp(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::interp(double, double, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::unwrap(double, double)10000
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::inRange(double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::pinterp(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::pinterp(double, double, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::cyclic(mrs_lib::geometry::sdegrees const&)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::cyclic(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees> const&)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::cyclic(double)20000
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::cyclic()0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::operator=(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>&&)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::operator=(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees> const&)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::operator=(double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::operator-=(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees> const&)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::operator+=(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees> const&)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::interpUnwrapped(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>, double)516159
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::interpUnwrapped(double, double, double)516160
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::pinterpUnwrapped(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::pinterpUnwrapped(double, double, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::diff(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>)3378600
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::diff(double, double)2852435
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::dist(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>)10008
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::dist(double, double)10000
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::wrap(double)7488169
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::pdist(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::pdist(double, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::interp(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::interp(double, double, double)516160
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::unwrap(double, double)2838849
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::inRange(double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::pinterp(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::pinterp(double, double, double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::cyclic(mrs_lib::geometry::sradians const&)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::cyclic(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians> const&)1052342
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::cyclic(double)6857209
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::cyclic()0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::operator=(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>&&)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::operator=(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians> const&)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::operator=(double)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::operator-=(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians> const&)0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::operator+=(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians> const&)0
bool mrs_lib::geometry::operator><double, mrs_lib::geometry::radians>(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians> const&, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians> const&)2
bool mrs_lib::geometry::operator><double, mrs_lib::geometry::sradians>(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians> const&, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians> const&)2
bool mrs_lib::geometry::operator< <double, mrs_lib::geometry::radians>(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians> const&, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians> const&)2
bool mrs_lib::geometry::operator< <double, mrs_lib::geometry::sradians>(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians> const&, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians> const&)2
mrs_lib::geometry::operator-(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians> const&, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians> const&)10009
mrs_lib::geometry::operator+(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians> const&, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians> const&)10004
mrs_lib::geometry::operator+(mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians> const&, mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians> const&)40000
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::degrees>::value() const4
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::radians>::value() const10002
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sdegrees>::value() const0
mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::value() const40002
mrs_lib::geometry::radians mrs_lib::geometry::cyclic<double, mrs_lib::geometry::sradians>::convert<mrs_lib::geometry::radians>() const1
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/geometry/cyclic.h.gcov.frameset.html b/mrs_lib/include/mrs_lib/geometry/cyclic.h.gcov.frameset.html new file mode 100644 index 0000000000..380619f2cf --- /dev/null +++ b/mrs_lib/include/mrs_lib/geometry/cyclic.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/geometry/cyclic.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/include/mrs_lib/geometry/cyclic.h.gcov.html b/mrs_lib/include/mrs_lib/geometry/cyclic.h.gcov.html new file mode 100644 index 0000000000..bf08ea5732 --- /dev/null +++ b/mrs_lib/include/mrs_lib/geometry/cyclic.h.gcov.html @@ -0,0 +1,612 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/geometry/cyclic.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/geometry - cyclic.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:608769.0 %
Date:2024-04-18 23:11:36Functions:4811741.0 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : // clang: MatousFormat
+       2             : /**  \file
+       3             :      \brief Defines the cyclic class for calculations with cyclic quantities.
+       4             :      \author Matouš Vrba - vrbamato@fel.cvut.cz
+       5             :  */
+       6             : 
+       7             : #ifndef CYCLIC_H
+       8             : #define CYCLIC_H
+       9             : 
+      10             : #include <cmath>
+      11             : #include <ostream>
+      12             : 
+      13             : namespace mrs_lib
+      14             : {
+      15             :   namespace geometry
+      16             :   {
+      17             :     /**
+      18             :      * \brief Implementation of the a general cyclic value (such as angles in radians/degrees etc).
+      19             :      *
+      20             :      * This class implements a periodical value with a period of \f$ r \in {\rm I\!R} \f$ so that a general number \f$ v \in {\rm I\!R} \f$ represents the same
+      21             :      * value as \f$ v + kr,~k \in {\rm I\!N} \f$. For the purposes of calculations in this class, \f$ v \f$ is confined to a half-open interval \f$ v \in
+      22             :      * [~m,~s~[ \f$, where \f$ m \f$ is the minimum of this interval and \f$ s \f$ is its supremum, and \f$ s = m + r \f$ holds. This approach enables
+      23             :      * representing \f$ v \f$ in different intervals on the real numbers axis; eg. angle in radians may be represented within the interval \f$ v \in
+      24             :      * [~-\pi,~\pi~[ \f$ or \f$ v \in [~0,~2\pi~[ \f$, according to the needs of the specific application. The period \f$ r \f$ is called \p range for the
+      25             :      * purposes of this class, as it represents range of the interval of valid ("wrapped") values of \f$ v \f$.
+      26             :      *
+      27             :      * This class may be used as an object or its static methods may be used on regular floating-point types, avoiding any object-related overheads (see
+      28             :      * example). Specializations for the most common cyclic values are provided and a new specialization may be easily created simply by inheriting from this
+      29             :      * class and specifying a different minimum and supremum values.
+      30             :      *
+      31             :      * Implementation inspired by: https://www.codeproject.com/Articles/190833/Circular-Values-Math-and-Statistics-with-Cplusplus
+      32             :      *
+      33             :      * \parblock
+      34             :      * \note For a better intuitive understanding of the used functions, the term **walk** is sometimes used in the function explanations.
+      35             :      * You can imagine walking along the circle from one angle to another (represented by the circular quantities).
+      36             :      * The walk may be the shortest - then you're walking in such a manner that you reach the other point in the least of steps.
+      37             :      * The walk may also be oriented - then you're walking in a specific direction (ie. according to the increasing/decreasing angle).
+      38             :      * \endparblock
+      39             :      *
+      40             :      * \parblock
+      41             :      * \note The terms **circular quantity** and **value** are used in the function explanations.
+      42             :      * A circular quantity is eg. an angle and the same quantity may be represented using different values: the same angle is represented by the values of 100
+      43             :      * degrees and 460 degrees. \endparblock
+      44             :      *
+      45             :      * \tparam flt floating data type to be used by this class.
+      46             :      */
+      47             :     template <typename flt, class spec>
+      48             :     struct cyclic
+      49             :     {
+      50             :       /*!
+      51             :        * \brief Default constructor.
+      52             :        *
+      53             :        * Sets the value to the minimum.
+      54             :        */
+      55           0 :       cyclic() : val(minimum){};
+      56             :       /*!
+      57             :        * \brief Constructor overload.
+      58             :        *
+      59             :        * \param val initialization value (will be wrapped).
+      60             :        */
+      61     8626904 :       cyclic(const flt val) : val(wrap(val)){};
+      62             :       /*!
+      63             :        * \brief Copy constructor.
+      64             :        *
+      65             :        * \param val initialization value.
+      66             :        */
+      67     1853004 :       cyclic(const cyclic& other) : val(other.val){};
+      68             :       /*!
+      69             :        * \brief Copy constructor.
+      70             :        *
+      71             :        * \param val initialization value.
+      72             :        */
+      73      757947 :       cyclic(const spec& other) : val(other.val){};
+      74             : 
+      75             :       /*!
+      76             :        * \brief Getter for \p val.
+      77             :        *
+      78             :        * \return the value.
+      79             :        */
+      80       50008 :       flt value() const
+      81             :       {
+      82       50008 :         return val;
+      83             :       };
+      84             : 
+      85             :       static constexpr flt minimum = spec::minimum;   /*!< \brief Minimum of the valid interval of wrapped values \f$ m \f$ */
+      86             :       static constexpr flt supremum = spec::supremum; /*!< \brief Supremum of the valid interval of wrapped values \f$ s \f$ */
+      87             :       static constexpr flt range =
+      88             :           supremum - minimum; /*!< \brief Range of the valid interval of wrapped values \f$ r \f$ (also the period of the cyclic quantity). */
+      89             :       static constexpr flt half_range =
+      90             :           range / flt(2); /*!< \brief Half of the range of the valid interval of wrapped values \f$ r/2 \f$ (used for some calculations). */
+      91             : 
+      92             :       /* static_assert((supremum > minimum), "cyclic value: Range not valid"); */
+      93             : 
+      94             :       /*!
+      95             :        * \brief Checks if \p val is within the valid interval of wrapped values.
+      96             :        *
+      97             :        * \param val the value to be checked.
+      98             :        * \returns   true if \p val is within the valid interval of wrapped values.
+      99             :        */
+     100           0 :       static bool inRange(const flt val)
+     101             :       {
+     102           0 :         return val >= minimum && val < supremum;
+     103             :       }
+     104             : 
+     105             :       /*!
+     106             :        * \brief Returns \p val, converted to the valid interval of values.
+     107             :        *
+     108             :        * The wrapped value represents the same quantity as the parameter (ie. \f$ v' = v + kr \f$, where \f$ v \f$ is the parameter and \f$ v' \f$ is the
+     109             :        * returned value).
+     110             :        *
+     111             :        * \param val the value to be wrapped.
+     112             :        * \returns   \p val wrapped to the valid interval of values.
+     113             :        */
+     114     9300224 :       static flt wrap(const flt val)
+     115             :       {
+     116             :         // these few ifs should cover most cases, improving speed and precision
+     117     9300224 :         if (val >= minimum)
+     118             :         {
+     119     8568919 :           if (val < supremum)  // value is actually in range and doesn't need to be wrapped
+     120     8338479 :             return val;
+     121      230439 :           else if (val < supremum + range)
+     122       67441 :             return val - range;  // to avoid unnecessary costly fmod operation for this case (assumed to be significantly more common than the general case)
+     123             :         } else
+     124             :         {
+     125      731304 :           if (val >= minimum - range)
+     126      567762 :             return val + range;  // to avoid unnecessary costly fmod operation for this case (assumed to be significantly more common than the general case)
+     127             :         }
+     128             : 
+     129             :         // general case
+     130      326542 :         const flt rem = std::fmod(val - minimum, range);
+     131      326542 :         const flt wrapped = rem + minimum + std::signbit(rem) * range;
+     132      326439 :         return wrapped;
+     133             :       }
+     134             : 
+     135             :       /*!
+     136             :        * \brief Returns value of the parameter \p what modified so that there is no "jump" between \p from and \t what.
+     137             :        *
+     138             :        * The circular difference between the two input quantities is preserved, but the returned value is modified if necessary so that the linear distance
+     139             :        * between the values is the smallest. This is useful whenever you need to preserve linear continuity of consecutive values, eg. when commanding a
+     140             :        * multi-rotational servo motor or when using a simple linear Kalman filter to estimate circular quantities.
+     141             :        *
+     142             :        * An example of inputs and outputs if \f$ m = 0,~s=360 \f$:
+     143             :        *  \p what | \p from  | \p return
+     144             :        *  ------- | -------- | ---------
+     145             :        *    20    |    10    |   20
+     146             :        *    20    |    350   |   380
+     147             :        *    0     |    350   |   360
+     148             :        *    200   |    10    |  -160
+     149             :        *
+     150             :        * \param what   the value to be unwrapped.
+     151             :        * \param from   the previous value from which the unwrapped value of \p what should have the same circular difference and minimal linear distance.
+     152             :        * \returns      the unwrapped value of \p what.
+     153             :        *
+     154             :        * \warning Note that the returned value may be outside the valid interval of wrapped values, specified by the \p minimum and \p supremum parameters of
+     155             :        * this class.
+     156             :        */
+     157     2868850 :       static flt unwrap(const flt what, const flt from)
+     158             :       {
+     159     2868850 :         return from + diff(what, from);
+     160             :       }
+     161             : 
+     162             :       /*!
+     163             :        * \brief Returns length of the shortest walk in the positive direction from the first parameter to the second one.
+     164             :        *
+     165             :        * \param from   the positive walk starts at this value.
+     166             :        * \param to     the positive walk ends at this value.
+     167             :        * \returns      length of the shortest positive walk from the first parameter to the second one.
+     168             :        *
+     169             :        * \note The returned value is not necessarily the shortest distance between the two circular quantities (see the dist() function for that).
+     170             :        */
+     171           0 :       static flt pdist(const flt from, const flt to)
+     172             :       {
+     173           0 :         return pdist(cyclic(from), cyclic(to));
+     174             :       }
+     175             : 
+     176           0 :       static flt pdist(const cyclic from, const cyclic to)
+     177             :       {
+     178           0 :         const flt tmp = to.val - from.val;
+     179           0 :         const flt dist = tmp + std::signbit(tmp) * range;
+     180           0 :         return dist;
+     181             :       }
+     182             : 
+     183             :       /*!
+     184             :        * \brief Returns the difference between the two circular values.
+     185             :        *
+     186             :        * The difference may also be interpreted as length of the shortest walk between the two values, with a sign according to the direction of the shortest
+     187             :        * walk.
+     188             :        *
+     189             :        * \param minuend      the \p subtrahend will be subtracted from this value.
+     190             :        * \param subtrahend   this value will be subtracted from the \p minuend.
+     191             :        * \returns            the difference of the two circular quantities.
+     192             :        */
+     193     3321840 :       static flt diff(const flt minuend, const flt subtrahend)
+     194             :       {
+     195     3321840 :         return diff(cyclic(minuend), cyclic(subtrahend));
+     196             :       }
+     197             : 
+     198     4248531 :       static flt diff(const cyclic minuend, const cyclic subtrahend)
+     199             :       {
+     200     4248531 :         const flt d = minuend.val - subtrahend.val;
+     201     4248531 :         if (d < -half_range)
+     202       40743 :           return d + range;
+     203     4207788 :         if (d >= half_range)
+     204       25580 :           return d - range;
+     205     4182208 :         return d;
+     206             :       }
+     207             : 
+     208             :       /*!
+     209             :        * \brief Returns the distance between the two circular values.
+     210             :        *
+     211             :        * The distance may also be interpreted as length of the shortest walk between the two values.
+     212             :        *
+     213             :        * \param from  the first circular quantity.
+     214             :        * \param to    the second circular quantity.
+     215             :        * \returns     distance of the two circular quantities.
+     216             :        *
+     217             :        * \note The order of the parameters doesn't matter.
+     218             :        */
+     219       20374 :       static flt dist(const flt from, const flt to)
+     220             :       {
+     221       20374 :         return dist(cyclic(from), cyclic(to));
+     222             :       }
+     223             : 
+     224      399703 :       static flt dist(const cyclic from, const cyclic to)
+     225             :       {
+     226      399703 :         return std::abs(diff(from, to));
+     227             :       }
+     228             : 
+     229             :       /*!
+     230             :        * \brief Interpolation between two circular quantities without wrapping of the result.
+     231             :        *
+     232             :        * This function doesn't wrap the returned value.
+     233             :        *
+     234             :        * \param from  the first circular quantity.
+     235             :        * \param to    the second circular quantity.
+     236             :        * \param coeff the interpolation coefficient.
+     237             :        * \returns     interpolation of the two circular quantities using the coefficient.
+     238             :        *
+     239             :        * \warning Note that the returned value may be outside the valid interval of wrapped values, specified by the \p minimum and \p supremum parameters of
+     240             :        * this class.
+     241             :        */
+     242      517058 :       static flt interpUnwrapped(const flt from, const flt to, const flt coeff)
+     243             :       {
+     244      517058 :         return interpUnwrapped(cyclic(from), cyclic(to), coeff);
+     245             :       }
+     246             : 
+     247      517057 :       static flt interpUnwrapped(const cyclic from, const cyclic to, const flt coeff)
+     248             :       {
+     249      517057 :         const flt dang = diff(to, from);
+     250      517057 :         const flt intp = from.val + coeff * dang;
+     251      517057 :         return intp;
+     252             :       }
+     253             : 
+     254             :       /*!
+     255             :        * \brief Interpolation between two circular quantities.
+     256             :        *
+     257             :        * This function wraps the returned value so that it is in the interval of valid values.
+     258             :        *
+     259             :        * \param from  the first circular quantity.
+     260             :        * \param to    the second circular quantity.
+     261             :        * \param coeff the interpolation coefficient.
+     262             :        * \returns     interpolation of the two circular quantities using the coefficient, wrapped to the interval of valid values.
+     263             :        */
+     264      517058 :       static flt interp(const flt from, const flt to, const flt coeff)
+     265             :       {
+     266      517058 :         return wrap(interpUnwrapped(from, to, coeff));
+     267             :       }
+     268             : 
+     269           0 :       static flt interp(const cyclic from, const cyclic to, const flt coeff)
+     270             :       {
+     271           0 :         return wrap(interpUnwrapped(from, to, coeff));
+     272             :       }
+     273             : 
+     274             :       /*!
+     275             :        * \brief Interpolation between two circular quantities in the positive direction without wrapping of the result.
+     276             :        *
+     277             :        * Interpolates the two values in the positive direction from the first parameter to the second by the coefficient.
+     278             :        * This function doesn't wrap the returned value.
+     279             :        *
+     280             :        * \param from  the first circular quantity.
+     281             :        * \param to    the second circular quantity.
+     282             :        * \param coeff the interpolation coefficient.
+     283             :        * \returns     interpolation of the two circular quantities using the coefficient.
+     284             :        *
+     285             :        * \warning Note that the returned value may be outside the valid interval of wrapped values, specified by the \p minimum and \p supremum parameters of
+     286             :        * this class.
+     287             :        */
+     288           0 :       static flt pinterpUnwrapped(const flt from, const flt to, const flt coeff)
+     289             :       {
+     290           0 :         return pinterpUnwrapped(cyclic(from), cyclic(to), coeff);
+     291             :       }
+     292             : 
+     293           0 :       static flt pinterpUnwrapped(const cyclic from, const cyclic to, const flt coeff)
+     294             :       {
+     295           0 :         const flt dang = pdist(to, from);
+     296           0 :         const flt intp = from.val + coeff * dang;
+     297           0 :         return intp;
+     298             :       }
+     299             : 
+     300             :       /*!
+     301             :        * \brief Interpolation between two circular quantities in the positive direction.
+     302             :        *
+     303             :        * Interpolates the two values in the positive direction from the first parameter to the second by the coefficient.
+     304             :        * This function wraps the returned value so that it is in the interval of valid values.
+     305             :        *
+     306             :        * \param from  the first circular quantity.
+     307             :        * \param to    the second circular quantity.
+     308             :        * \param coeff the interpolation coefficient.
+     309             :        * \returns     interpolation of the two circular quantities using the coefficient, wrapped to the interval of valid values.
+     310             :        */
+     311           0 :       static flt pinterp(const flt from, const flt to, const flt coeff)
+     312             :       {
+     313           0 :         return pinterpUnwrapped(cyclic(from), cyclic(to), coeff);
+     314             :       }
+     315             : 
+     316           0 :       static flt pinterp(const cyclic from, const cyclic to, const flt coeff)
+     317             :       {
+     318           0 :         return wrap(pinterpUnwrapped(from, to, coeff));
+     319             :       }
+     320             : 
+     321             :       /*!
+     322             :        * \brief Conversion between two different circular quantities.
+     323             :        *
+     324             :        * This function converts its parameter, interpreted as the circular quantity, represented by this class, to the \p other_t type of circular quantity.
+     325             :        *
+     326             :        * \param what       the circular quantity to be converted.
+     327             :        * \returns          the circular quantity converted to the range of \p other_t.
+     328             :        * \tparam other_t   type of the circular quantity to be converted to.
+     329             :        *
+     330             :        * \warning For the purposes of this function, it is assumed that the range of one type corresponds to the whole range of the other type and zeros of both
+     331             :        * types correspond to each other (such as when converting eg. degrees to radians).
+     332             :        */
+     333             :       template <class other_t>
+     334           1 :       static other_t convert(const cyclic& what)
+     335             :       {
+     336           1 :         return other_t(what.val / range * other_t::range);
+     337             :       }
+     338             : 
+     339             :       /*!
+     340             :        * \brief Conversion between two different circular quantities.
+     341             :        *
+     342             :        * This method returns the circular quantity, represented by this object, converted to the \p other_t type of circular quantity.
+     343             :        *
+     344             :        * \returns          the circular quantity converted to the range of \p other_t.
+     345             :        * \tparam other_t   type of the circular quantity to be converted to.
+     346             :        *
+     347             :        * \warning For the purposes of this function, it is assumed that the range of one type corresponds to the whole range of the other type and zeros of both
+     348             :        * types correspond to each other (such as when converting eg. degrees to radians).
+     349             :        */
+     350             :       template <class other_t>
+     351           1 :       other_t convert() const
+     352             :       {
+     353           1 :         return other_t(val / range * other_t::range);
+     354             :       }
+     355             : 
+     356             :       // | ------------------------ Operators ----------------------- |
+     357             :       /*!
+     358             :        * \brief Assignment operator.
+     359             :        *
+     360             :        * \param nval value to be assigned (will be wrapped).
+     361             :        * \return     reference to self.
+     362             :        */
+     363           0 :       cyclic& operator=(const flt nval)
+     364             :       {
+     365           0 :         val = wrap(nval);
+     366           0 :         return *this;
+     367             :       };
+     368             :       /*!
+     369             :        * \brief Assignment operator.
+     370             :        *
+     371             :        * \param other value to be assigned.
+     372             :        * \return      reference to self.
+     373             :        */
+     374           0 :       cyclic& operator=(const cyclic& other)
+     375             :       {
+     376           0 :         val = other.val;
+     377           0 :         return *this;
+     378             :       };
+     379             :       /*!
+     380             :        * \brief Move operator.
+     381             :        *
+     382             :        * \param other value to be assigned.
+     383             :        * \return      reference to self.
+     384             :        */
+     385           6 :       cyclic& operator=(cyclic&& other)
+     386             :       {
+     387           6 :         val = other.val;
+     388           6 :         return *this;
+     389             :       };
+     390             : 
+     391             :       /*!
+     392             :        * \brief Addition compound operator.
+     393             :        *
+     394             :        * \param other value to be added.
+     395             :        * \return      reference to self.
+     396             :        */
+     397           1 :       cyclic& operator+=(const cyclic& other)
+     398             :       {
+     399           1 :         val = wrap(val + other.val);
+     400           1 :         return *this;
+     401             :       };
+     402             : 
+     403             :       /*!
+     404             :        * \brief Subtraction compound operator.
+     405             :        *
+     406             :        * \param other value to be subtracted.
+     407             :        * \return      reference to self.
+     408             :        */
+     409           1 :       cyclic& operator-=(const cyclic& other)
+     410             :       {
+     411           1 :         val = diff(val, other.val);
+     412           1 :         return *this;
+     413             :       };
+     414             : 
+     415             :       /*!
+     416             :        * \brief Addition operator.
+     417             :        *
+     418             :        * \param lhs left-hand-side.
+     419             :        * \param rhs right-hand-side.
+     420             :        * \return    the result of adding the two angles.
+     421             :        */
+     422       50004 :       friend spec operator+(const cyclic& lhs, const cyclic& rhs)
+     423             :       {
+     424       50004 :         return wrap(lhs.val + rhs.val);
+     425             :       }
+     426             : 
+     427             :       /*!
+     428             :        * \brief Subtraction operator (uses the diff() method).
+     429             :        *
+     430             :        * \param lhs left-hand-side.
+     431             :        * \param rhs right-hand-side.
+     432             :        * \return    the result of subtracting rhs from lhs.
+     433             :        */
+     434       10009 :       friend flt operator-(const cyclic& lhs, const cyclic& rhs)
+     435             :       {
+     436       10009 :         return diff(lhs, rhs);
+     437             :       }
+     438             : 
+     439             :       protected:
+     440             :         flt val;
+     441             :       };
+     442             : 
+     443             :     /*!
+     444             :      * \brief Implementation of the comparison operation between two angles.
+     445             :      *
+     446             :      * An angle is considered to be smaller than another angle if it is shorter - closer to zero.
+     447             :      *
+     448             :      * \param lhs left-hand-side.
+     449             :      * \param rhs right-hand-side.
+     450             :      * \return    true iff the shortest unsigned walk from lhs to 0 is less than from rhs to 0.
+     451             :      */
+     452             :     template <typename flt, class spec>
+     453           4 :     bool operator<(const cyclic<flt, spec>& lhs, const cyclic<flt, spec>& rhs)
+     454             :     {
+     455           4 :       return cyclic<flt, spec>::dist(lhs, 0) < cyclic<flt, spec>::dist(rhs, 0);
+     456             :     }
+     457             : 
+     458             :     /*!
+     459             :      * \brief Implementation of the comparison operation between two angles.
+     460             :      *
+     461             :      * An angle is considered to be larger than another angle if it is longer - further from zero.
+     462             :      *
+     463             :      * \param lhs left-hand-side.
+     464             :      * \param rhs right-hand-side.
+     465             :      * \return    true iff the shortest unsigned walk from lhs to 0 is more than from rhs to 0.
+     466             :      */
+     467             :     template <typename flt, class spec>
+     468           4 :     bool operator>(const cyclic<flt, spec>& lhs, const cyclic<flt, spec>& rhs)
+     469             :     {
+     470           4 :       return cyclic<flt, spec>::dist(lhs, 0) > cyclic<flt, spec>::dist(rhs, 0);
+     471             :     }
+     472             : 
+     473             :     /*!
+     474             :      * \brief Implementation of the stream output operator.
+     475             :      *
+     476             :      * \param out the stream to write the angle to.
+     477             :      * \param ang the angle to be written.
+     478             :      * \return    a reference to the stream.
+     479             :      */
+     480             :     template <typename flt, class spec>
+     481             :     std::ostream& operator<<(std::ostream &out, const cyclic<flt, spec>& ang)
+     482             :     {
+     483             :       return (out << ang.value());
+     484             :     }
+     485             : 
+     486             :     /*!
+     487             :      * \brief Convenience specialization of the cyclic class for unsigned radians (from $0$ to $2\pi$).
+     488             :      */
+     489             :     struct radians : public cyclic<double, radians>
+     490             :     {
+     491             :       using cyclic<double, radians>::cyclic;  // necessary to inherit constructors
+     492             :       static constexpr double minimum = 0;
+     493             :       static constexpr double supremum = 2 * M_PI;
+     494             :     };
+     495             : 
+     496             :     /*!
+     497             :      * \brief Convenience specialization of the cyclic class for signed radians (from $-\pi$ to $\pi$).
+     498             :      */
+     499             :     struct sradians : public cyclic<double, sradians>
+     500             :     {
+     501             :       using cyclic<double, sradians>::cyclic;  // necessary to inherit constructors
+     502             :       static constexpr double minimum = -M_PI;
+     503             :       static constexpr double supremum = M_PI;
+     504             :     };
+     505             : 
+     506             :     /*!
+     507             :      * \brief Convenience specialization of the cyclic class for unsigned degrees (from $0$ to $360$).
+     508             :      */
+     509             :     struct degrees : public cyclic<double, degrees>
+     510             :     {
+     511             :       using cyclic<double, degrees>::cyclic;  // necessary to inherit constructors
+     512             :       static constexpr double minimum = 0;
+     513             :       static constexpr double supremum = 360;
+     514             :     };
+     515             : 
+     516             :     /*!
+     517             :      * \brief Convenience specialization of the cyclic class for signed degrees (from $-180$ to $180$).
+     518             :      */
+     519             :     struct sdegrees : public cyclic<double, sdegrees>
+     520             :     {
+     521             :       using cyclic<double, sdegrees>::cyclic;  // necessary to inherit constructors
+     522             :       static constexpr double minimum = -180;
+     523             :       static constexpr double supremum = 180;
+     524             :     };
+     525             :   }  // namespace geometry
+     526             : }  // namespace mrs_lib
+     527             : 
+     528             : #endif  // CYCLIC_H
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/geometry/cyclic.h.gcov.overview.html b/mrs_lib/include/mrs_lib/geometry/cyclic.h.gcov.overview.html new file mode 100644 index 0000000000..1ad3dfadb9 --- /dev/null +++ b/mrs_lib/include/mrs_lib/geometry/cyclic.h.gcov.overview.html @@ -0,0 +1,152 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/geometry/cyclic.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/include/mrs_lib/geometry/cyclic.h.gcov.png b/mrs_lib/include/mrs_lib/geometry/cyclic.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..966598f52a04aad7097c45178d084b601fee1a23 GIT binary patch literal 2145 zcmV-n2%h(eP)ztac=LGdqZvm__Cy*;dNOmM>B;1gHpm39@cZ%O zo?OEbB%EeIK<43HR=#8OfIF6AR0ZMg;XeTAM1kZCYC>dY$_&f0mBhxF z5qxarj^u6udxMlZGR2bG2SY}qvfda;4-0{@P+@~j6|ifMpP!#!&-HkG;rgsB0NiTt zT0p}!`|BxObM#`*CTrax@8kO8$8lhu>l)T!uHm=F z`2Uyd2GhWG*NRAo0{{ls7GNhr6G;#D&@Y}SlC@y|d-3$x1j-S_eE<%mdj;OTG%L8k zwPqAmlHhYdX_HJVg*9#p*j7_ul7hu+X7*BerKF#1) znkZ)+m*NHUUdB`?wR+H&Ps$r0#H71=?Dts@ZPiOF>vsDYNk})y!q2e#47{&K+_8h5pxxg zM0rEnnBu9rq2n7eQl0#!1%2KcK9#@MhxjYrLq0U9(mrv!z#yvFwSBG*wV1UIG*A#Vyyf+7XT!r zP{65$-0OrCp5W>Pj`J}9_L9!5$7%Uh09-6!5zd%dx-l1IQaVwG8|&ubaDscHyvCUn zygu;tYYLQsu$9j6NkFr0%3Vu( zQyEUga9Mh|?f_4Y;X7uiHq}GsXOx*(1+S)Nu8b9*-3+~bfDv|C?4Z!qPzGc# z%rh%F)G#yO-<**}-Xytmj$dC%?3&!|6zSdWDs)$q+>xJ&#Ln}_N{-C|SNg4s=a}?0 z1HgQqF@_z?1j}iH9mRP40Py07geN6BOr7^as@vafW}iuui@h!VY}oB?(4)T4vGaAd zU5|Q^mb92Or!AZ?r9&i5qTXhOzwBCP<~y=$>I!PNW26@78B(;da_}M7NfFoUdU8Hc`Q0KVm1r&4hm$^0!Q=8o-CdSGaL`RdRdDy}k zd=yj|P-2%i5haNH(f>wo=a#fwURvVbw8<AD5@K3(5x!k^Oht#zIK z$LYG=ufOEimCgJlU9W`#Y6tj(bbS=XCm+dc-ME_owkiNL3Z7i)jT{-^(A5;V3Fpo? z*V6+Cb4J1CH5o?@@DhDtGUCg-kt^w%K9@b1Fn9f$A2DI2k88&2x^Bj>b{12QP=+7+)+@OQzU2!27`rJ?R$Pf` zs9P>$0*A0=t*sa`M&xKQp)h46&TkspY}dZ}bpkuU_{3nbl{>xmI8ifFDhz6dAGZ|L z+2>! + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/geometry + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/geometryHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:669371.0 %
Date:2024-04-18 23:11:36Functions:5112042.5 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
cyclic.h +
69.0%69.0%
+
69.0 %60 / 8741.0 %48 / 117
<unnamed>69.0 %60 / 8741.0 %48 / 117
misc.h +
100.0%
+
100.0 %6 / 6100.0 %3 / 3
<unnamed>100.0 %6 / 6100.0 %3 / 3
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/geometry/index-detail-sort-l.html b/mrs_lib/include/mrs_lib/geometry/index-detail-sort-l.html new file mode 100644 index 0000000000..c11571b01d --- /dev/null +++ b/mrs_lib/include/mrs_lib/geometry/index-detail-sort-l.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/geometry + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/geometryHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:669371.0 %
Date:2024-04-18 23:11:36Functions:5112042.5 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
cyclic.h +
69.0%69.0%
+
69.0 %60 / 8741.0 %48 / 117
<unnamed>69.0 %60 / 8741.0 %48 / 117
misc.h +
100.0%
+
100.0 %6 / 6100.0 %3 / 3
<unnamed>100.0 %6 / 6100.0 %3 / 3
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/geometry/index-detail.html b/mrs_lib/include/mrs_lib/geometry/index-detail.html new file mode 100644 index 0000000000..1ee5060b09 --- /dev/null +++ b/mrs_lib/include/mrs_lib/geometry/index-detail.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/geometry + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/geometryHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:669371.0 %
Date:2024-04-18 23:11:36Functions:5112042.5 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
cyclic.h +
69.0%69.0%
+
69.0 %60 / 8741.0 %48 / 117
<unnamed>69.0 %60 / 8741.0 %48 / 117
misc.h +
100.0%
+
100.0 %6 / 6100.0 %3 / 3
<unnamed>100.0 %6 / 6100.0 %3 / 3
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/geometry/index-sort-f.html b/mrs_lib/include/mrs_lib/geometry/index-sort-f.html new file mode 100644 index 0000000000..d000ac3b54 --- /dev/null +++ b/mrs_lib/include/mrs_lib/geometry/index-sort-f.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/geometry + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/geometryHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:669371.0 %
Date:2024-04-18 23:11:36Functions:5112042.5 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
cyclic.h +
69.0%69.0%
+
69.0 %60 / 8741.0 %48 / 117
misc.h +
100.0%
+
100.0 %6 / 6100.0 %3 / 3
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/geometry/index-sort-l.html b/mrs_lib/include/mrs_lib/geometry/index-sort-l.html new file mode 100644 index 0000000000..791b35d780 --- /dev/null +++ b/mrs_lib/include/mrs_lib/geometry/index-sort-l.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/geometry + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/geometryHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:669371.0 %
Date:2024-04-18 23:11:36Functions:5112042.5 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
cyclic.h +
69.0%69.0%
+
69.0 %60 / 8741.0 %48 / 117
misc.h +
100.0%
+
100.0 %6 / 6100.0 %3 / 3
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/geometry/index.html b/mrs_lib/include/mrs_lib/geometry/index.html new file mode 100644 index 0000000000..9dc22e1d99 --- /dev/null +++ b/mrs_lib/include/mrs_lib/geometry/index.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/geometry + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/geometryHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:669371.0 %
Date:2024-04-18 23:11:36Functions:5112042.5 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
cyclic.h +
69.0%69.0%
+
69.0 %60 / 8741.0 %48 / 117
misc.h +
100.0%
+
100.0 %6 / 6100.0 %3 / 3
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/geometry/misc.h.func-sort-c.html b/mrs_lib/include/mrs_lib/geometry/misc.h.func-sort-c.html new file mode 100644 index 0000000000..5d516fbcaa --- /dev/null +++ b/mrs_lib/include/mrs_lib/geometry/misc.h.func-sort-c.html @@ -0,0 +1,92 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/geometry/misc.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/geometry - misc.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:66100.0 %
Date:2024-04-18 23:11:36Functions:33100.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
Eigen::Matrix<double, (3)+(1), 1, ((Eigen::StorageOptions)0)|(((((3)+(1))==(1))&&((1)!=(1)))?((Eigen::StorageOptions)1) : ((((1)==(1))&&(((3)+(1))!=(1)))?((Eigen::StorageOptions)0) : ((Eigen::StorageOptions)0))), (3)+(1), 1> mrs_lib::geometry::toHomogenous<3>(Eigen::Matrix<double, 3, 1, ((Eigen::StorageOptions)0)|((((3)==(1))&&((1)!=(1)))?((Eigen::StorageOptions)1) : ((((1)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)0) : ((Eigen::StorageOptions)0))), 3, 1> const&)2
double mrs_lib::geometry::headingFromRot<Eigen::Matrix<double, 3, 3, 0, 3, 3> >(Eigen::Matrix<double, 3, 3, 0, 3, 3> const&)6
double mrs_lib::geometry::headingFromRot<Eigen::Quaternion<double, 0> >(Eigen::Quaternion<double, 0> const&)110062
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/geometry/misc.h.func.html b/mrs_lib/include/mrs_lib/geometry/misc.h.func.html new file mode 100644 index 0000000000..4940eadeab --- /dev/null +++ b/mrs_lib/include/mrs_lib/geometry/misc.h.func.html @@ -0,0 +1,92 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/geometry/misc.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/geometry - misc.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:66100.0 %
Date:2024-04-18 23:11:36Functions:33100.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
Eigen::Matrix<double, (3)+(1), 1, ((Eigen::StorageOptions)0)|(((((3)+(1))==(1))&&((1)!=(1)))?((Eigen::StorageOptions)1) : ((((1)==(1))&&(((3)+(1))!=(1)))?((Eigen::StorageOptions)0) : ((Eigen::StorageOptions)0))), (3)+(1), 1> mrs_lib::geometry::toHomogenous<3>(Eigen::Matrix<double, 3, 1, ((Eigen::StorageOptions)0)|((((3)==(1))&&((1)!=(1)))?((Eigen::StorageOptions)1) : ((((1)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)0) : ((Eigen::StorageOptions)0))), 3, 1> const&)2
double mrs_lib::geometry::headingFromRot<Eigen::Quaternion<double, 0> >(Eigen::Quaternion<double, 0> const&)110062
double mrs_lib::geometry::headingFromRot<Eigen::Matrix<double, 3, 3, 0, 3, 3> >(Eigen::Matrix<double, 3, 3, 0, 3, 3> const&)6
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/geometry/misc.h.gcov.frameset.html b/mrs_lib/include/mrs_lib/geometry/misc.h.gcov.frameset.html new file mode 100644 index 0000000000..609f4cb0f6 --- /dev/null +++ b/mrs_lib/include/mrs_lib/geometry/misc.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/geometry/misc.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/include/mrs_lib/geometry/misc.h.gcov.html b/mrs_lib/include/mrs_lib/geometry/misc.h.gcov.html new file mode 100644 index 0000000000..3e10466fb7 --- /dev/null +++ b/mrs_lib/include/mrs_lib/geometry/misc.h.gcov.html @@ -0,0 +1,408 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/geometry/misc.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/geometry - misc.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:66100.0 %
Date:2024-04-18 23:11:36Functions:33100.0 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : // clang: MatousFormat
+       2             : /**  \file
+       3             :      \brief Defines useful geometry utilities and functions.
+       4             :      \author Matouš Vrba - vrbamato@fel.cvut.cz
+       5             :      \author Petr Štibinger - stibipet@fel.cvut.cz
+       6             :  */
+       7             : 
+       8             : #ifndef GEOMETRY_MISC_H
+       9             : #define GEOMETRY_MISC_H
+      10             : 
+      11             : #include <cmath>
+      12             : #include <Eigen/Dense>
+      13             : #include <geometry_msgs/Point.h>
+      14             : #include <geometry_msgs/Quaternion.h>
+      15             : 
+      16             : namespace mrs_lib
+      17             : {
+      18             :   namespace geometry
+      19             :   {
+      20             :     template <int dims>
+      21             :     using vec_t = Eigen::Matrix<double, dims, 1>;
+      22             : 
+      23             :     using pt2_t = vec_t<2>;
+      24             :     using vec2_t = vec_t<2>;
+      25             :     using pt3_t = vec_t<3>;
+      26             :     using vec3_t = vec_t<3>;
+      27             : 
+      28             :     using mat3_t = Eigen::Matrix3d;
+      29             : 
+      30             :     using quat_t = Eigen::Quaterniond;
+      31             :     using anax_t = Eigen::AngleAxisd;
+      32             : 
+      33             :     template <int dims>
+      34           2 :     vec_t<dims + 1> toHomogenous(const vec_t<dims>& vec)
+      35             :     {
+      36           2 :       const Eigen::Matrix<double, dims + 1, 1> ret((Eigen::Matrix<double, dims + 1, 1>() << vec, 1).finished());
+      37           2 :       return ret;
+      38             :     }
+      39             : 
+      40             :     // | ----------------- Angle-related functions ---------------- |
+      41             : 
+      42             :     /* angle-related functions //{ */
+      43             : 
+      44             :     /* headingFromRot() //{ */
+      45             : 
+      46             :     /*!
+      47             :      * \brief Returns the heading angle from the rotation.
+      48             :      *
+      49             :      * Heading is defined as the angle of a [1,0,0] vector rotated by the rotation and projected to the XY plane from the X axis.
+      50             :      *
+      51             :      * \param rot the rotation to extract the heading angle from.
+      52             :      *
+      53             :      * \returns the heading angle.
+      54             :      *
+      55             :      */
+      56             :     template <typename T>
+      57      110068 :     double headingFromRot(const T& rot)
+      58             :     {
+      59      110068 :       const vec3_t rot_vec = rot*vec3_t::UnitX();
+      60      220136 :       return std::atan2(rot_vec.y(), rot_vec.x());
+      61             :     }
+      62             : 
+      63             :     //}
+      64             : 
+      65             :     /* angleBetween() //{ */
+      66             : 
+      67             :     /*!
+      68             :      * \brief Returns the angle between two vectors, taking orientation into account.
+      69             :      *
+      70             :      * This implementation uses \p atan2 instead of just \p acos and thus it properly
+      71             :      * takes into account orientation of the vectors, returning angle in all four quadrants.
+      72             :      *
+      73             :      * \param a vector from which the angle will be measured.
+      74             :      * \param b vector to which the angle will be measured.
+      75             :      *
+      76             :      * \returns    angle from \p a to \p b.
+      77             :      *
+      78             :      */
+      79             :     double angleBetween(const vec2_t& a, const vec2_t& b);
+      80             : 
+      81             :     /*!
+      82             :      * \brief Returns the angle between two vectors, taking orientation into account.
+      83             :      *
+      84             :      * This implementation uses \p atan2 instead of just \p acos and thus it properly
+      85             :      * takes into account orientation of the vectors, returning angle in all four quadrants.
+      86             :      *
+      87             :      * \param a vector from which the angle will be measured.
+      88             :      * \param b vector to which the angle will be measured.
+      89             :      *
+      90             :      * \returns    angle from \p a to \p b.
+      91             :      *
+      92             :      */
+      93             :     double angleBetween(const vec3_t& a, const vec3_t& b);
+      94             : 
+      95             :     //}
+      96             : 
+      97             :     /* angleaxisBetween() //{ */
+      98             : 
+      99             :     /*!
+     100             :      * \brief Returns the rotation between two vectors, represented as angle-axis.
+     101             :      *
+     102             :      * To avoid singularities, a \p tolerance parameter is used:
+     103             :      * * If the absolute angle between the two vectors is less than \p tolerance, a zero rotation is returned.
+     104             :      * * If the angle between the two vectors is closer to \f$ \pi \f$ than \p tolerance, a \f$ \pi \f$ rotation is returned.
+     105             :      *
+     106             :      * \param a vector from which the rotation starts.
+     107             :      * \param b vector at which the rotation ends.
+     108             :      *
+     109             :      * \returns    rotation from \p a to \p b.
+     110             :      *
+     111             :      */
+     112             :     anax_t angleaxisBetween(const vec3_t& a, const vec3_t& b, const double tolerance = 1e-9);
+     113             : 
+     114             :     //}
+     115             : 
+     116             :     /* quaternionBetween() //{ */
+     117             : 
+     118             :     /*!
+     119             :      * \brief Returns the rotation between two vectors, represented as a quaternion.
+     120             :      *
+     121             :      * Works the same as the angleaxisBetween() function (in fact it is used in the implementation).
+     122             :      *
+     123             :      * \param a vector from which the rotation starts.
+     124             :      * \param b vector at which the rotation ends.
+     125             :      *
+     126             :      * \returns    rotation from \p a to \p b.
+     127             :      *
+     128             :      */
+     129             :     quat_t quaternionBetween(const vec3_t& a, const vec3_t& b, const double tolerance = 1e-9);
+     130             : 
+     131             :     //}
+     132             : 
+     133             :     /* rotationBetween() //{ */
+     134             : 
+     135             :     /*!
+     136             :      * \brief Returns the rotation between two vectors, represented as a rotation matrix.
+     137             :      *
+     138             :      * Works the same as the angleaxisBetween() function (in fact it is used in the implementation).
+     139             :      *
+     140             :      * \param a vector from which the rotation starts.
+     141             :      * \param b vector at which the rotation ends.
+     142             :      *
+     143             :      * \returns    rotation from \p a to \p b.
+     144             :      *
+     145             :      */
+     146             :     Eigen::Matrix3d rotationBetween(const vec3_t& a, const vec3_t& b, const double tolerance = 1e-9);
+     147             : 
+     148             :     //}
+     149             : 
+     150             :     /* haversin() //{ */
+     151             : 
+     152             :     /**
+     153             :      * @brief computes the haversine (half of versine) for a given angle
+     154             :      *
+     155             :      * @param angle angle in radians
+     156             :      *
+     157             :      * @return
+     158             :      */
+     159             :     double haversin(const double angle);
+     160             : 
+     161             :     //}
+     162             : 
+     163             :     /* invHaversin() //{ */
+     164             : 
+     165             :     /**
+     166             :      * @brief computes the inverse haversine angle for a given value
+     167             :      *
+     168             :      * @param value
+     169             :      *
+     170             :      * @return angle in radians
+     171             :      */
+     172             :     double invHaversin(const double value);
+     173             : 
+     174             :     //}
+     175             : 
+     176             :     /* solidAngle //{ */
+     177             : 
+     178             :     /**
+     179             :      * @brief computes the solid angle for a spherical surface corresponding to a 'triangle' with edge lengths a, b, c
+     180             :      *
+     181             :      * @param a
+     182             :      * @param b
+     183             :      * @param c
+     184             :      *
+     185             :      * @return solid angle in steradians
+     186             :      */
+     187             :     double solidAngle(double a, double b, double c);
+     188             : 
+     189             :     //}
+     190             : 
+     191             :     /* quaternionFromEuler() //{ */
+     192             : 
+     193             :     /**
+     194             :      * @brief create a quaternion from 3 provided Euler angles
+     195             :      *
+     196             :      * @param x Euler angle in radians
+     197             :      * @param y Euler angle in radians
+     198             :      * @param z Euler angle in radians
+     199             :      *
+     200             :      * @return quaternion
+     201             :      */
+     202             :     quat_t quaternionFromEuler(double x, double y, double z);
+     203             : 
+     204             :     /**
+     205             :      * @brief create a quaternion from Euler angles provided as a vector
+     206             :      *
+     207             :      * @param euler components of the rotation provided as vector of Euler angles
+     208             :      *
+     209             :      * @return quaternion
+     210             :      */
+     211             :     quat_t quaternionFromEuler(const Eigen::Vector3d& euler);
+     212             : 
+     213             :     //}
+     214             : 
+     215             :     /**
+     216             :      * @brief create a quaternion from heading
+     217             :      *
+     218             :      * Heading is defined as the angle of a [1,0,0] vector rotated by the rotation and projected to the XY plane from the X axis.
+     219             :      *
+     220             :      * @param heading the heading angle.
+     221             :      *
+     222             :      * @return the quaternion corresponding to the heading rotation.
+     223             :      */
+     224             :     quat_t quaternionFromHeading(const double heading);
+     225             : 
+     226             :     //}
+     227             : 
+     228             :     // | ----------------- Miscellaneous functions ---------------- |
+     229             : 
+     230             :     /* 2D cross() //{ */
+     231             : 
+     232             :     /*!
+     233             :      * \brief Implementation of cross product for 2D vectors.
+     234             :      *
+     235             :      * Useful e.g. for finding the sine of an angle between two 2D vectors.
+     236             :      *
+     237             :      * \param a first vector of the cross product.
+     238             :      * \param b second vector of the cross product.
+     239             :      *
+     240             :      * \returns    \f$ a \times b \f$ (sine of the angle from \p a to \p b).
+     241             :      *
+     242             :      */
+     243             :     double cross(const vec2_t& a, const vec2_t b);
+     244             : 
+     245             :     //}
+     246             : 
+     247             :     /* vector distance //{ */
+     248             : 
+     249             :     /**
+     250             :      * @brief distnace between two 2D Eigen vectors
+     251             :      *
+     252             :      * @param a
+     253             :      * @param b
+     254             :      *
+     255             :      * @return Euclidean distance
+     256             :      */
+     257             :     double dist(const vec2_t& a, const vec2_t& b);
+     258             : 
+     259             :     /**
+     260             :      * @brief distnace between two 3D Eigen vectors
+     261             :      *
+     262             :      * @param a
+     263             :      * @param b
+     264             :      *
+     265             :      * @return Euclidean distance
+     266             :      */
+     267             :     double dist(const vec3_t& a, const vec3_t& b);
+     268             : 
+     269             :     //}
+     270             : 
+     271             :     /* triangleArea() //{ */
+     272             : 
+     273             :     /**
+     274             :      * @brief uses Heron's formula to compute area of a given triangle using side lengths
+     275             :      *
+     276             :      * @param a length of side1
+     277             :      * @param b length of side2
+     278             :      * @param c length of side3
+     279             :      *
+     280             :      * @return area in units squared
+     281             :      */
+     282             :     double triangleArea(const double a, const double b, const double c);
+     283             : 
+     284             :     //}
+     285             : 
+     286             :     /* sphericalTriangleArea //{ */
+     287             : 
+     288             :     /**
+     289             :      * @brief compute the area of a 'triangle' drawn on a spherical surface
+     290             :      *
+     291             :      * @param a length of side1
+     292             :      * @param b length of side2
+     293             :      * @param c length of side3
+     294             :      *
+     295             :      * @return area in units squared
+     296             :      */
+     297             :     double sphericalTriangleArea(Eigen::Vector3d a, Eigen::Vector3d b, Eigen::Vector3d c);
+     298             : 
+     299             :     //}
+     300             : 
+     301             :     /* rotateCovariance() //{ */
+     302             :     
+     303             :     /*!
+     304             :      * \brief Returns the covariance rotated using the specified rotation.
+     305             :      *
+     306             :      * \param cov the covariance to be rotated.
+     307             :      * \param rot the rotation use.
+     308             :      *
+     309             :      * \returns a new matrix object containing the rotated covariance.
+     310             :      *
+     311             :      */
+     312             :     template <typename T>
+     313             :     mat3_t rotateCovariance(const mat3_t& cov, const T& rot)
+     314             :     {
+     315             :       const mat3_t matrot(rot);
+     316             :       return matrot*cov*matrot.transpose();
+     317             :     }
+     318             :     
+     319             :     //}
+     320             : 
+     321             :   }  // namespace geometry
+     322             : }  // namespace mrs_lib
+     323             : 
+     324             : #endif
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/geometry/misc.h.gcov.overview.html b/mrs_lib/include/mrs_lib/geometry/misc.h.gcov.overview.html new file mode 100644 index 0000000000..5f250b8ef8 --- /dev/null +++ b/mrs_lib/include/mrs_lib/geometry/misc.h.gcov.overview.html @@ -0,0 +1,101 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/geometry/misc.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/include/mrs_lib/geometry/misc.h.gcov.png b/mrs_lib/include/mrs_lib/geometry/misc.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..581208ad4f1fcef2a803b9ae709887799e133c02 GIT binary patch literal 1071 zcmV+~1kn45P);0000OP)t-s|NsB0 zs;a7|?_FK${{R500003000620&P%hU00009a7bBm000ie000ie0hKEb8vp|&|^9W#|%90LIw8GE%5p? zC5q1}kKGVco(9NAnPql%OSW8V7PG?5hPsSrLPJS{UuHD7nsH1*G>pfNw!rJQjiR{U zpRe|K{5-im^5^pVy=n{a=Wb~W@SgAH_EXp&&*%DD0WR0ic#FdTV?{RXIm(iyo|^*G_>AUPwMkgNID_6 zGgfN~&;?+<64wd{YLyL3Hq@pG$bL#UBHfa~ zJ|8!!u)mVtrb23-f`J~>B^63my;5Pf%jc#-n+z!Bq19|=oR|t@>iVIn0Pa-KA$>In z@l~W6^efzMTMKt3SXMCpJ;EKN+plmxLbwvS<5AaYHZx8V?zp8{K)9?j;4%|ZQ6RhI z+^69BxD#5RdQ3q7XvP~dR$mSor;TQ##P@E0-`tvdKg8mJ>Jk1$HTeRn*+wr z9VtW(NhK1Sklq6{V1$vMx6C0&z>v&PJ}z|V)Fr^6@y9JQAf+eTrB3Y@wY%;)oslL0 zJw8%yp8$geyROz#^a%7q7wUFhIR;^%)wI?WNzP8Fyym9@e|bGO;2?pI&Lb1@`brmG zEZDi)<`vDL12JBqw8KN(N1kIPZA2;xjEX|?Al$Vx2K&0~kuTA2kHXr$Ynu!E p@Zka + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/gps_conversions.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - gps_conversions.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:10413676.5 %
Date:2024-04-18 23:11:36Functions:44100.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::UTMtoLL(double, double, char const*, double&, double&)1918
mrs_lib::UTM(double, double, double*, double*)8440
mrs_lib::UTMLetterDesignator(double)182706
mrs_lib::LLtoUTM(double, double, double&, double&, char*)182860
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/gps_conversions.h.func.html b/mrs_lib/include/mrs_lib/gps_conversions.h.func.html new file mode 100644 index 0000000000..5540f8a102 --- /dev/null +++ b/mrs_lib/include/mrs_lib/gps_conversions.h.func.html @@ -0,0 +1,96 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/gps_conversions.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - gps_conversions.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:10413676.5 %
Date:2024-04-18 23:11:36Functions:44100.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::UTMLetterDesignator(double)182706
mrs_lib::UTM(double, double, double*, double*)8440
mrs_lib::LLtoUTM(double, double, double&, double&, char*)182860
mrs_lib::UTMtoLL(double, double, char const*, double&, double&)1918
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/gps_conversions.h.gcov.frameset.html b/mrs_lib/include/mrs_lib/gps_conversions.h.gcov.frameset.html new file mode 100644 index 0000000000..f0ef2f614d --- /dev/null +++ b/mrs_lib/include/mrs_lib/gps_conversions.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/gps_conversions.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/include/mrs_lib/gps_conversions.h.gcov.html b/mrs_lib/include/mrs_lib/gps_conversions.h.gcov.html new file mode 100644 index 0000000000..a581087da8 --- /dev/null +++ b/mrs_lib/include/mrs_lib/gps_conversions.h.gcov.html @@ -0,0 +1,387 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/gps_conversions.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - gps_conversions.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:10413676.5 %
Date:2024-04-18 23:11:36Functions:44100.0 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : /* Taken from utexas-art-ros-pkg:art_vehicle/applanix */
+       2             : 
+       3             : /*
+       4             :  * Conversions between coordinate systems.
+       5             :  *
+       6             :  * Includes LatLong<->UTM.
+       7             :  */
+       8             : 
+       9             : #ifndef _UTM_H
+      10             : #define _UTM_H
+      11             : 
+      12             : /**  @file
+      13             :      @brief Universal Transverse Mercator transforms.
+      14             :      Functions to convert (spherical) latitude and longitude to and
+      15             :      from (Euclidean) UTM coordinates.
+      16             :      @author Chuck Gantz- chuck.gantz@globalstar.com
+      17             :  */
+      18             : 
+      19             : #include <cmath>
+      20             : #include <cstdio>
+      21             : #include <cstdlib>
+      22             : #include <string>
+      23             : 
+      24             : namespace mrs_lib
+      25             : {
+      26             : 
+      27             :   const double RADIANS_PER_DEGREE = M_PI / 180.0;
+      28             :   const double DEGREES_PER_RADIAN = 180.0 / M_PI;
+      29             : 
+      30             :   // WGS84 Parameters
+      31             :   const double WGS84_A  = 6378137.0;         // major axis
+      32             :   const double WGS84_B  = 6356752.31424518;  // minor axis
+      33             :   const double WGS84_F  = 0.0033528107;      // ellipsoid flattening
+      34             :   const double WGS84_E  = 0.0818191908;      // first eccentricity
+      35             :   const double WGS84_EP = 0.0820944379;      // second eccentricity
+      36             : 
+      37             :   // UTM Parameters
+      38             :   const double UTM_K0   = 0.9996;                   // scale factor
+      39             :   const double UTM_FE   = 500000.0;                 // false easting
+      40             :   const double UTM_FN_N = 0.0;                      // false northing on north hemisphere
+      41             :   const double UTM_FN_S = 10000000.0;               // false northing on south hemisphere
+      42             :   const double UTM_E2   = (WGS84_E * WGS84_E);      // e^2
+      43             :   const double UTM_E4   = (UTM_E2 * UTM_E2);        // e^4
+      44             :   const double UTM_E6   = (UTM_E4 * UTM_E2);        // e^6
+      45             :   const double UTM_EP2  = (UTM_E2 / (1 - UTM_E2));  // e'^2
+      46             : 
+      47             :   /**
+      48             :    * Utility function to convert geodetic to UTM position
+      49             :    *
+      50             :    * Units in are floating point degrees (sign for east/west)
+      51             :    *
+      52             :    * Units out are meters
+      53             :    */
+      54        8440 :   static inline void UTM(double lat, double lon, double* x, double* y) {
+      55             :     // constants
+      56             :     const static double m0 = (1 - UTM_E2 / 4 - 3 * UTM_E4 / 64 - 5 * UTM_E6 / 256);
+      57             :     const static double m1 = -(3 * UTM_E2 / 8 + 3 * UTM_E4 / 32 + 45 * UTM_E6 / 1024);
+      58             :     const static double m2 = (15 * UTM_E4 / 256 + 45 * UTM_E6 / 1024);
+      59             :     const static double m3 = -(35 * UTM_E6 / 3072);
+      60             : 
+      61             :     // compute the central meridian
+      62        8440 :     int cm = ((lon >= 0.0) ? ((int)lon - ((int)lon) % 6 + 3) : ((int)lon - ((int)lon) % 6 - 3));
+      63             : 
+      64             :     // convert degrees into radians
+      65        8440 :     double rlat  = lat * RADIANS_PER_DEGREE;
+      66        8440 :     double rlon  = lon * RADIANS_PER_DEGREE;
+      67        8440 :     double rlon0 = cm * RADIANS_PER_DEGREE;
+      68             : 
+      69             :     // compute trigonometric functions
+      70        8440 :     double slat = sin(rlat);
+      71        8440 :     double clat = cos(rlat);
+      72        8440 :     double tlat = tan(rlat);
+      73             : 
+      74             :     // decide the false northing at origin
+      75        8440 :     double fn = (lat > 0) ? UTM_FN_N : UTM_FN_S;
+      76             : 
+      77        8440 :     double T = tlat * tlat;
+      78        8440 :     double C = UTM_EP2 * clat * clat;
+      79        8440 :     double A = (rlon - rlon0) * clat;
+      80        8440 :     double M = WGS84_A * (m0 * rlat + m1 * sin(2 * rlat) + m2 * sin(4 * rlat) + m3 * sin(6 * rlat));
+      81        8440 :     double V = WGS84_A / sqrt(1 - UTM_E2 * slat * slat);
+      82             : 
+      83             :     // compute the easting-northing coordinates
+      84        8440 :     *x = UTM_FE + UTM_K0 * V * (A + (1 - T + C) * pow(A, 3) / 6 + (5 - 18 * T + T * T + 72 * C - 58 * UTM_EP2) * pow(A, 5) / 120);
+      85        8400 :     *y = fn +
+      86        8400 :          UTM_K0 *
+      87        8423 :              (M + V * tlat * (A * A / 2 + (5 - T + 9 * C + 4 * C * C) * pow(A, 4) / 24 + ((61 - 58 * T + T * T + 600 * C - 330 * UTM_EP2) * pow(A, 6) / 720)));
+      88             : 
+      89        8400 :     return;
+      90             :   }
+      91             : 
+      92             : 
+      93             :   /**
+      94             :    * Determine the correct UTM letter designator for the
+      95             :    * given latitude
+      96             :    *
+      97             :    * @returns 'Z' if latitude is outside the UTM limits of 84N to 80S
+      98             :    *
+      99             :    * Written by Chuck Gantz- chuck.gantz@globalstar.com
+     100             :    */
+     101      182706 :   static inline char UTMLetterDesignator(double Lat) {
+     102             :     char LetterDesignator;
+     103             : 
+     104      182706 :     if ((84 >= Lat) && (Lat >= 72))
+     105           0 :       LetterDesignator = 'X';
+     106      182706 :     else if ((72 > Lat) && (Lat >= 64))
+     107           0 :       LetterDesignator = 'W';
+     108      182706 :     else if ((64 > Lat) && (Lat >= 56))
+     109           0 :       LetterDesignator = 'V';
+     110      182706 :     else if ((56 > Lat) && (Lat >= 48))
+     111           0 :       LetterDesignator = 'U';
+     112      182706 :     else if ((48 > Lat) && (Lat >= 40))
+     113      181822 :       LetterDesignator = 'T';
+     114         884 :     else if ((40 > Lat) && (Lat >= 32))
+     115           0 :       LetterDesignator = 'S';
+     116         884 :     else if ((32 > Lat) && (Lat >= 24))
+     117           0 :       LetterDesignator = 'R';
+     118         884 :     else if ((24 > Lat) && (Lat >= 16))
+     119           0 :       LetterDesignator = 'Q';
+     120         884 :     else if ((16 > Lat) && (Lat >= 8))
+     121           0 :       LetterDesignator = 'P';
+     122         884 :     else if ((8 > Lat) && (Lat >= 0))
+     123           2 :       LetterDesignator = 'N';
+     124         882 :     else if ((0 > Lat) && (Lat >= -8))
+     125           0 :       LetterDesignator = 'M';
+     126         882 :     else if ((-8 > Lat) && (Lat >= -16))
+     127           0 :       LetterDesignator = 'L';
+     128         882 :     else if ((-16 > Lat) && (Lat >= -24))
+     129           0 :       LetterDesignator = 'K';
+     130         882 :     else if ((-24 > Lat) && (Lat >= -32))
+     131           0 :       LetterDesignator = 'J';
+     132         882 :     else if ((-32 > Lat) && (Lat >= -40))
+     133           0 :       LetterDesignator = 'H';
+     134         882 :     else if ((-40 > Lat) && (Lat >= -48))
+     135           0 :       LetterDesignator = 'G';
+     136         882 :     else if ((-48 > Lat) && (Lat >= -56))
+     137           0 :       LetterDesignator = 'F';
+     138         882 :     else if ((-56 > Lat) && (Lat >= -64))
+     139           0 :       LetterDesignator = 'E';
+     140         882 :     else if ((-64 > Lat) && (Lat >= -72))
+     141           0 :       LetterDesignator = 'D';
+     142         882 :     else if ((-72 > Lat) && (Lat >= -80))
+     143           0 :       LetterDesignator = 'C';
+     144             :     // 'Z' is an error flag, the Latitude is outside the UTM limits
+     145             :     else
+     146         882 :       LetterDesignator = 'Z';
+     147      182706 :     return LetterDesignator;
+     148             :   }
+     149             : 
+     150             :   /**
+     151             :    * Convert lat/long to UTM coords.  Equations from USGS Bulletin 1532
+     152             :    *
+     153             :    * East Longitudes are positive, West longitudes are negative.
+     154             :    * North latitudes are positive, South latitudes are negative
+     155             :    * Lat and Long are in fractional degrees
+     156             :    *
+     157             :    * Written by Chuck Gantz- chuck.gantz@globalstar.com
+     158             :    */
+     159      182860 :   static inline void LLtoUTM(const double Lat, const double Long, double& UTMNorthing, double& UTMEasting, char* UTMZone) {
+     160      182860 :     double a          = WGS84_A;
+     161      182860 :     double eccSquared = UTM_E2;
+     162      182860 :     double k0         = UTM_K0;
+     163             : 
+     164             :     double LongOrigin;
+     165             :     double eccPrimeSquared;
+     166             :     double N, T, C, A, M;
+     167             : 
+     168             :     // Make sure the longitude is between -180.00 .. 179.9
+     169      182860 :     double LongTemp = (Long + 180) - int((Long + 180) / 360) * 360 - 180;
+     170             : 
+     171      182860 :     double LatRad  = Lat * RADIANS_PER_DEGREE;
+     172      182860 :     double LongRad = LongTemp * RADIANS_PER_DEGREE;
+     173             :     double LongOriginRad;
+     174             :     int    ZoneNumber;
+     175             : 
+     176      182860 :     ZoneNumber = int((LongTemp + 180) / 6) + 1;
+     177             :     // range clamping to shut up some compiler warnings
+     178             :     // (the UTM Zone number should in reality be in the range <1, 60>)
+     179      182860 :     if (ZoneNumber > 99)
+     180           0 :       ZoneNumber = 99;
+     181      182860 :     if (ZoneNumber < -9)
+     182           0 :       ZoneNumber = -9;
+     183             : 
+     184      182860 :     if (Lat >= 56.0 && Lat < 64.0 && LongTemp >= 3.0 && LongTemp < 12.0)
+     185           0 :       ZoneNumber = 32;
+     186             : 
+     187             :     // Special zones for Svalbard
+     188      182860 :     if (Lat >= 72.0 && Lat < 84.0) {
+     189           0 :       if (LongTemp >= 0.0 && LongTemp < 9.0)
+     190           0 :         ZoneNumber = 31;
+     191           0 :       else if (LongTemp >= 9.0 && LongTemp < 21.0)
+     192           0 :         ZoneNumber = 33;
+     193           0 :       else if (LongTemp >= 21.0 && LongTemp < 33.0)
+     194           0 :         ZoneNumber = 35;
+     195           0 :       else if (LongTemp >= 33.0 && LongTemp < 42.0)
+     196           0 :         ZoneNumber = 37;
+     197             :     }
+     198             :     // +3 puts origin in middle of zone
+     199      182860 :     LongOrigin    = (ZoneNumber - 1) * 6 - 180 + 3;
+     200      182860 :     LongOriginRad = LongOrigin * RADIANS_PER_DEGREE;
+     201             : 
+     202             :     // compute the UTM Zone from the latitude and longitude
+     203      182860 :     snprintf(UTMZone, 4, "%d%c", ZoneNumber, UTMLetterDesignator(Lat));
+     204             : 
+     205      182444 :     eccPrimeSquared = (eccSquared) / (1 - eccSquared);
+     206             : 
+     207      182444 :     N = a / sqrt(1 - eccSquared * sin(LatRad) * sin(LatRad));
+     208      182444 :     T = tan(LatRad) * tan(LatRad);
+     209      182444 :     C = eccPrimeSquared * cos(LatRad) * cos(LatRad);
+     210      182444 :     A = cos(LatRad) * (LongRad - LongOriginRad);
+     211             : 
+     212      182444 :     M = a * ((1 - eccSquared / 4 - 3 * eccSquared * eccSquared / 64 - 5 * eccSquared * eccSquared * eccSquared / 256) * LatRad -
+     213      182444 :              (3 * eccSquared / 8 + 3 * eccSquared * eccSquared / 32 + 45 * eccSquared * eccSquared * eccSquared / 1024) * sin(2 * LatRad) +
+     214      182444 :              (15 * eccSquared * eccSquared / 256 + 45 * eccSquared * eccSquared * eccSquared / 1024) * sin(4 * LatRad) -
+     215      182444 :              (35 * eccSquared * eccSquared * eccSquared / 3072) * sin(6 * LatRad));
+     216             : 
+     217      182444 :     UTMEasting =
+     218      182444 :         (double)(k0 * N * (A + (1 - T + C) * A * A * A / 6 + (5 - 18 * T + T * T + 72 * C - 58 * eccPrimeSquared) * A * A * A * A * A / 120) + 500000.0);
+     219             : 
+     220      182444 :     UTMNorthing = (double)(k0 * (M + N * tan(LatRad) *
+     221      182444 :                                          (A * A / 2 + (5 - T + 9 * C + 4 * C * C) * A * A * A * A / 24 +
+     222      182444 :                                           (61 - 58 * T + T * T + 600 * C - 330 * eccPrimeSquared) * A * A * A * A * A * A / 720)));
+     223      182444 :     if (Lat < 0)
+     224           0 :       UTMNorthing += 10000000.0;  // 10000000 meter offset for southern hemisphere
+     225      182444 :   }
+     226             : 
+     227             :   static inline void LLtoUTM(const double Lat, const double Long, double& UTMNorthing, double& UTMEasting, std::string& UTMZone) {
+     228             :     char zone_buf[] = {0, 0, 0, 0};
+     229             : 
+     230             :     LLtoUTM(Lat, Long, UTMNorthing, UTMEasting, zone_buf);
+     231             : 
+     232             :     UTMZone = zone_buf;
+     233             :   }
+     234             : 
+     235             : 
+     236             :   /**
+     237             :    * Converts UTM coords to lat/long.  Equations from USGS Bulletin 1532
+     238             :    *
+     239             :    * East Longitudes are positive, West longitudes are negative.
+     240             :    * North latitudes are positive, South latitudes are negative
+     241             :    * Lat and Long are in fractional degrees.
+     242             :    *
+     243             :    * Written by Chuck Gantz- chuck.gantz@globalstar.com
+     244             :    */
+     245        1918 :   static inline void UTMtoLL(const double UTMNorthing, const double UTMEasting, const char* UTMZone, double& Lat, double& Long) {
+     246        1918 :     double                  k0         = UTM_K0;
+     247        1918 :     double                  a          = WGS84_A;
+     248        1918 :     double                  eccSquared = UTM_E2;
+     249             :     double                  eccPrimeSquared;
+     250        1918 :     double                  e1 = (1 - sqrt(1 - eccSquared)) / (1 + sqrt(1 - eccSquared));
+     251             :     double                  N1, T1, C1, R1, D, M;
+     252             :     double                  LongOrigin;
+     253             :     double                  mu, phi1Rad;
+     254             :     [[maybe_unused]] double phi1;
+     255             :     double                  x, y;
+     256             :     int                     ZoneNumber;
+     257             :     char*                   ZoneLetter;
+     258             :     [[maybe_unused]] int    NorthernHemisphere;  // 1 for northern hemispher, 0 for southern
+     259             : 
+     260        1918 :     x = UTMEasting - 500000.0;  // remove 500,000 meter offset for longitude
+     261        1918 :     y = UTMNorthing;
+     262             : 
+     263        1918 :     ZoneNumber = strtoul(UTMZone, &ZoneLetter, 10);
+     264        1918 :     if ((*ZoneLetter - 'N') >= 0)
+     265        1918 :       NorthernHemisphere = 1;  // point is in northern hemisphere
+     266             :     else {
+     267           0 :       NorthernHemisphere = 0;  // point is in southern hemisphere
+     268           0 :       y -= 10000000.0;         // remove 10,000,000 meter offset used for southern hemisphere
+     269             :     }
+     270             : 
+     271        1918 :     LongOrigin = (ZoneNumber - 1) * 6 - 180 + 3;  //+3 puts origin in middle of zone
+     272             : 
+     273        1918 :     eccPrimeSquared = (eccSquared) / (1 - eccSquared);
+     274             : 
+     275        1918 :     M  = y / k0;
+     276        1918 :     mu = M / (a * (1 - eccSquared / 4 - 3 * eccSquared * eccSquared / 64 - 5 * eccSquared * eccSquared * eccSquared / 256));
+     277             : 
+     278        1918 :     phi1Rad = mu + (3 * e1 / 2 - 27 * e1 * e1 * e1 / 32) * sin(2 * mu) + (21 * e1 * e1 / 16 - 55 * e1 * e1 * e1 * e1 / 32) * sin(4 * mu) +
+     279        1918 :               (151 * e1 * e1 * e1 / 96) * sin(6 * mu);
+     280        1918 :     phi1 = phi1Rad * DEGREES_PER_RADIAN;
+     281             : 
+     282        1918 :     N1 = a / sqrt(1 - eccSquared * sin(phi1Rad) * sin(phi1Rad));
+     283        1918 :     T1 = tan(phi1Rad) * tan(phi1Rad);
+     284        1918 :     C1 = eccPrimeSquared * cos(phi1Rad) * cos(phi1Rad);
+     285        1918 :     R1 = a * (1 - eccSquared) / pow(1 - eccSquared * sin(phi1Rad) * sin(phi1Rad), 1.5);
+     286        1918 :     D  = x / (N1 * k0);
+     287             : 
+     288        1918 :     Lat = phi1Rad - (N1 * tan(phi1Rad) / R1) * (D * D / 2 - (5 + 3 * T1 + 10 * C1 - 4 * C1 * C1 - 9 * eccPrimeSquared) * D * D * D * D / 24 +
+     289        1918 :                                                 (61 + 90 * T1 + 298 * C1 + 45 * T1 * T1 - 252 * eccPrimeSquared - 3 * C1 * C1) * D * D * D * D * D * D / 720);
+     290        1918 :     Lat = Lat * DEGREES_PER_RADIAN;
+     291             : 
+     292        1918 :     Long = (D - (1 + 2 * T1 + C1) * D * D * D / 6 + (5 - 2 * C1 + 28 * T1 - 3 * C1 * C1 + 8 * eccPrimeSquared + 24 * T1 * T1) * D * D * D * D * D / 120) /
+     293        1918 :            cos(phi1Rad);
+     294        1918 :     Long = LongOrigin + Long * DEGREES_PER_RADIAN;
+     295        1918 :   }
+     296             : 
+     297             :   static inline void UTMtoLL(const double UTMNorthing, const double UTMEasting, std::string UTMZone, double& Lat, double& Long) {
+     298             :     UTMtoLL(UTMNorthing, UTMEasting, UTMZone.c_str(), Lat, Long);
+     299             :   }
+     300             : 
+     301             : }  // namespace mrs_lib
+     302             : 
+     303             : #endif  // _UTM_H
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/gps_conversions.h.gcov.overview.html b/mrs_lib/include/mrs_lib/gps_conversions.h.gcov.overview.html new file mode 100644 index 0000000000..68d9ba32f7 --- /dev/null +++ b/mrs_lib/include/mrs_lib/gps_conversions.h.gcov.overview.html @@ -0,0 +1,96 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/gps_conversions.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/include/mrs_lib/gps_conversions.h.gcov.png b/mrs_lib/include/mrs_lib/gps_conversions.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..3b04ca2bf9dcbddc89b129fb7f6bb4873f2132a0 GIT binary patch literal 1579 zcmV+`2Gse9P)0000OP)t-s|NsB0 zs;a7|?_FK${{R500003000620&P%hU00009a7bBm000ie000ie0hKEb8vp>!TNJ4nq%^v^ler$H% z-fGj283TL_eNc!daET)KWeBvhBxf5jz7ROi+L~EQtw8IXG#cq#z{Pf1QwoNjE3Q;L_XG4ZzCaS$Wkr3rWB)BwWg1J;Ip z#I%f?mEo1fv8}9i04CydK#LT4AfE#3iIIV}qG;NaaYj8;+R3c#R*oW`njN6}!IZP9 z>`W;WIhb_O=(Rlq5^KX#Eq*ubjKq)6fja|m_Ad$fCGrewUdE@p9+YICmBLTakAINEX-m5I3bdg$}B-DI)NSFHk}aY2MW|O z0>v3%gaQ-dLfpBb6pOY#7cl}SKmhzgTZ^vZNM#LT>I8s7+=S0wU6a}(xRVS>(+zQJmQfThl2P}%NphW{7P8f){}lgI{0WK?_jo;?@qqvF z@Pa$Ij%RvyORKoa$h9zCXQJjeGO72<4^RN1OxJJ$fhetHDLKiKWu)AetW5#bx3&Np zAY=1>L9>5#LN_#tS69Q~w4#w&JLcamY80MgK*mIVdY~;+i zAH2XmNI{i2=!j(Ptl3&doU6RtBHI`$T}ZW-vl8OUCz>!;o-hbhlX`waFdBMpCcY-NRE zjkQo@ADT$pP>lm)cOV>fH`b!IGz-MBP%{|2$6-jz*W_Kgoo4 z-Vi>K?h7we%(k^voXy!5ycx8!pH}ZS{9&uO3*P$rfmIw`$qj8b@<+8KJProU zng?MTV^FcEI}xS)n^ zXQyICM$GTZC6Z+EC9wFd|E_{aH+n)ToH1<~#Dv2_^J=fLp6Jy;E8iS|Q + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/implHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:36744682.3 %
Date:2024-04-18 23:11:36Functions:816139058.7 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
subscribe_handler.hpp +
81.7%81.7%
+
81.7 %98 / 12046.6 %487 / 1044
<unnamed>81.7 %98 / 12046.6 %487 / 1044
ukf.hpp +
74.0%74.0%
+
74.0 %77 / 10466.7 %8 / 12
<unnamed>74.0 %77 / 10466.7 %8 / 12
transformer.hpp +
85.9%85.9%
+
85.9 %55 / 6483.3 %40 / 48
<unnamed>85.9 %55 / 6483.3 %40 / 48
publisher_handler.hpp +
81.5%81.5%
+
81.5 %44 / 5497.5 %197 / 202
<unnamed>81.5 %44 / 5497.5 %197 / 202
timer.hpp +
87.5%87.5%
+
87.5 %14 / 16100.0 %3 / 3
<unnamed>87.5 %14 / 16100.0 %3 / 3
param_provider.hpp +
64.3%64.3%
+
64.3 %9 / 14100.0 %16 / 16
<unnamed>64.3 %9 / 14100.0 %16 / 16
vector_converter.hpp +
100.0%
+
100.0 %18 / 18100.0 %18 / 18
<unnamed>100.0 %18 / 18100.0 %18 / 18
service_client_handler.hpp +
92.9%92.9%
+
92.9 %52 / 56100.0 %47 / 47
<unnamed>92.9 %52 / 56100.0 %47 / 47
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/impl/index-detail-sort-l.html b/mrs_lib/include/mrs_lib/impl/index-detail-sort-l.html new file mode 100644 index 0000000000..fc53beb0ce --- /dev/null +++ b/mrs_lib/include/mrs_lib/impl/index-detail-sort-l.html @@ -0,0 +1,236 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/implHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:36744682.3 %
Date:2024-04-18 23:11:36Functions:816139058.7 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
param_provider.hpp +
64.3%64.3%
+
64.3 %9 / 14100.0 %16 / 16
<unnamed>64.3 %9 / 14100.0 %16 / 16
ukf.hpp +
74.0%74.0%
+
74.0 %77 / 10466.7 %8 / 12
<unnamed>74.0 %77 / 10466.7 %8 / 12
publisher_handler.hpp +
81.5%81.5%
+
81.5 %44 / 5497.5 %197 / 202
<unnamed>81.5 %44 / 5497.5 %197 / 202
subscribe_handler.hpp +
81.7%81.7%
+
81.7 %98 / 12046.6 %487 / 1044
<unnamed>81.7 %98 / 12046.6 %487 / 1044
transformer.hpp +
85.9%85.9%
+
85.9 %55 / 6483.3 %40 / 48
<unnamed>85.9 %55 / 6483.3 %40 / 48
timer.hpp +
87.5%87.5%
+
87.5 %14 / 16100.0 %3 / 3
<unnamed>87.5 %14 / 16100.0 %3 / 3
service_client_handler.hpp +
92.9%92.9%
+
92.9 %52 / 56100.0 %47 / 47
<unnamed>92.9 %52 / 56100.0 %47 / 47
vector_converter.hpp +
100.0%
+
100.0 %18 / 18100.0 %18 / 18
<unnamed>100.0 %18 / 18100.0 %18 / 18
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/impl/index-detail.html b/mrs_lib/include/mrs_lib/impl/index-detail.html new file mode 100644 index 0000000000..21b1ecc46c --- /dev/null +++ b/mrs_lib/include/mrs_lib/impl/index-detail.html @@ -0,0 +1,236 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/implHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:36744682.3 %
Date:2024-04-18 23:11:36Functions:816139058.7 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
param_provider.hpp +
64.3%64.3%
+
64.3 %9 / 14100.0 %16 / 16
<unnamed>64.3 %9 / 14100.0 %16 / 16
publisher_handler.hpp +
81.5%81.5%
+
81.5 %44 / 5497.5 %197 / 202
<unnamed>81.5 %44 / 5497.5 %197 / 202
service_client_handler.hpp +
92.9%92.9%
+
92.9 %52 / 56100.0 %47 / 47
<unnamed>92.9 %52 / 56100.0 %47 / 47
subscribe_handler.hpp +
81.7%81.7%
+
81.7 %98 / 12046.6 %487 / 1044
<unnamed>81.7 %98 / 12046.6 %487 / 1044
timer.hpp +
87.5%87.5%
+
87.5 %14 / 16100.0 %3 / 3
<unnamed>87.5 %14 / 16100.0 %3 / 3
transformer.hpp +
85.9%85.9%
+
85.9 %55 / 6483.3 %40 / 48
<unnamed>85.9 %55 / 6483.3 %40 / 48
ukf.hpp +
74.0%74.0%
+
74.0 %77 / 10466.7 %8 / 12
<unnamed>74.0 %77 / 10466.7 %8 / 12
vector_converter.hpp +
100.0%
+
100.0 %18 / 18100.0 %18 / 18
<unnamed>100.0 %18 / 18100.0 %18 / 18
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/impl/index-sort-f.html b/mrs_lib/include/mrs_lib/impl/index-sort-f.html new file mode 100644 index 0000000000..872aae39b8 --- /dev/null +++ b/mrs_lib/include/mrs_lib/impl/index-sort-f.html @@ -0,0 +1,172 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/implHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:36744682.3 %
Date:2024-04-18 23:11:36Functions:816139058.7 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
subscribe_handler.hpp +
81.7%81.7%
+
81.7 %98 / 12046.6 %487 / 1044
ukf.hpp +
74.0%74.0%
+
74.0 %77 / 10466.7 %8 / 12
transformer.hpp +
85.9%85.9%
+
85.9 %55 / 6483.3 %40 / 48
publisher_handler.hpp +
81.5%81.5%
+
81.5 %44 / 5497.5 %197 / 202
timer.hpp +
87.5%87.5%
+
87.5 %14 / 16100.0 %3 / 3
param_provider.hpp +
64.3%64.3%
+
64.3 %9 / 14100.0 %16 / 16
vector_converter.hpp +
100.0%
+
100.0 %18 / 18100.0 %18 / 18
service_client_handler.hpp +
92.9%92.9%
+
92.9 %52 / 56100.0 %47 / 47
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/impl/index-sort-l.html b/mrs_lib/include/mrs_lib/impl/index-sort-l.html new file mode 100644 index 0000000000..521aa00d2b --- /dev/null +++ b/mrs_lib/include/mrs_lib/impl/index-sort-l.html @@ -0,0 +1,172 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/implHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:36744682.3 %
Date:2024-04-18 23:11:36Functions:816139058.7 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
param_provider.hpp +
64.3%64.3%
+
64.3 %9 / 14100.0 %16 / 16
ukf.hpp +
74.0%74.0%
+
74.0 %77 / 10466.7 %8 / 12
publisher_handler.hpp +
81.5%81.5%
+
81.5 %44 / 5497.5 %197 / 202
subscribe_handler.hpp +
81.7%81.7%
+
81.7 %98 / 12046.6 %487 / 1044
transformer.hpp +
85.9%85.9%
+
85.9 %55 / 6483.3 %40 / 48
timer.hpp +
87.5%87.5%
+
87.5 %14 / 16100.0 %3 / 3
service_client_handler.hpp +
92.9%92.9%
+
92.9 %52 / 56100.0 %47 / 47
vector_converter.hpp +
100.0%
+
100.0 %18 / 18100.0 %18 / 18
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/impl/index.html b/mrs_lib/include/mrs_lib/impl/index.html new file mode 100644 index 0000000000..6dcd6f2e32 --- /dev/null +++ b/mrs_lib/include/mrs_lib/impl/index.html @@ -0,0 +1,172 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/implHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:36744682.3 %
Date:2024-04-18 23:11:36Functions:816139058.7 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
param_provider.hpp +
64.3%64.3%
+
64.3 %9 / 14100.0 %16 / 16
publisher_handler.hpp +
81.5%81.5%
+
81.5 %44 / 5497.5 %197 / 202
service_client_handler.hpp +
92.9%92.9%
+
92.9 %52 / 56100.0 %47 / 47
subscribe_handler.hpp +
81.7%81.7%
+
81.7 %98 / 12046.6 %487 / 1044
timer.hpp +
87.5%87.5%
+
87.5 %14 / 16100.0 %3 / 3
transformer.hpp +
85.9%85.9%
+
85.9 %55 / 6483.3 %40 / 48
ukf.hpp +
74.0%74.0%
+
74.0 %77 / 10466.7 %8 / 12
vector_converter.hpp +
100.0%
+
100.0 %18 / 18100.0 %18 / 18
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/impl/param_provider.hpp.func-sort-c.html b/mrs_lib/include/mrs_lib/impl/param_provider.hpp.func-sort-c.html new file mode 100644 index 0000000000..c2830c9d78 --- /dev/null +++ b/mrs_lib/include/mrs_lib/impl/param_provider.hpp.func-sort-c.html @@ -0,0 +1,144 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl/param_provider.hpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/impl - param_provider.hpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:91464.3 %
Date:2024-04-18 23:11:36Functions:1616100.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
bool mrs_lib::ParamProvider::getParamImpl<std::vector<int, std::allocator<int> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<int, std::allocator<int> >&) const5
bool mrs_lib::ParamProvider::getParam<std::vector<int, std::allocator<int> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<int, std::allocator<int> >&) const5
bool mrs_lib::ParamProvider::getParamImpl<std::vector<float, std::allocator<float> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<float, std::allocator<float> >&) const10
bool mrs_lib::ParamProvider::getParam<std::vector<float, std::allocator<float> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<float, std::allocator<float> >&) const10
bool mrs_lib::ParamProvider::getParamImpl<std::vector<double, std::allocator<double> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<double, std::allocator<double> >&) const1629
bool mrs_lib::ParamProvider::getParam<std::vector<double, std::allocator<double> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<double, std::allocator<double> >&) const1629
bool mrs_lib::ParamProvider::getParamImpl<std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&) const3198
bool mrs_lib::ParamProvider::getParam<std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&) const3198
bool mrs_lib::ParamProvider::getParamImpl<int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int&) const4613
bool mrs_lib::ParamProvider::getParam<int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int&) const4613
bool mrs_lib::ParamProvider::getParamImpl<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&) const15438
bool mrs_lib::ParamProvider::getParam<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&) const15438
bool mrs_lib::ParamProvider::getParamImpl<bool>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool&) const18240
bool mrs_lib::ParamProvider::getParam<bool>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool&) const18240
bool mrs_lib::ParamProvider::getParamImpl<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, double&) const37299
bool mrs_lib::ParamProvider::getParam<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, double&) const37299
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/impl/param_provider.hpp.func.html b/mrs_lib/include/mrs_lib/impl/param_provider.hpp.func.html new file mode 100644 index 0000000000..380bffa4d6 --- /dev/null +++ b/mrs_lib/include/mrs_lib/impl/param_provider.hpp.func.html @@ -0,0 +1,144 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl/param_provider.hpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/impl - param_provider.hpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:91464.3 %
Date:2024-04-18 23:11:36Functions:1616100.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
bool mrs_lib::ParamProvider::getParamImpl<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&) const15438
bool mrs_lib::ParamProvider::getParamImpl<std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&) const3198
bool mrs_lib::ParamProvider::getParamImpl<std::vector<double, std::allocator<double> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<double, std::allocator<double> >&) const1629
bool mrs_lib::ParamProvider::getParamImpl<std::vector<float, std::allocator<float> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<float, std::allocator<float> >&) const10
bool mrs_lib::ParamProvider::getParamImpl<std::vector<int, std::allocator<int> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<int, std::allocator<int> >&) const5
bool mrs_lib::ParamProvider::getParamImpl<bool>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool&) const18240
bool mrs_lib::ParamProvider::getParamImpl<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, double&) const37299
bool mrs_lib::ParamProvider::getParamImpl<int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int&) const4613
bool mrs_lib::ParamProvider::getParam<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&) const15438
bool mrs_lib::ParamProvider::getParam<std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&) const3198
bool mrs_lib::ParamProvider::getParam<std::vector<double, std::allocator<double> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<double, std::allocator<double> >&) const1629
bool mrs_lib::ParamProvider::getParam<std::vector<float, std::allocator<float> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<float, std::allocator<float> >&) const10
bool mrs_lib::ParamProvider::getParam<std::vector<int, std::allocator<int> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<int, std::allocator<int> >&) const5
bool mrs_lib::ParamProvider::getParam<bool>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool&) const18240
bool mrs_lib::ParamProvider::getParam<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, double&) const37299
bool mrs_lib::ParamProvider::getParam<int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int&) const4613
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/impl/param_provider.hpp.gcov.frameset.html b/mrs_lib/include/mrs_lib/impl/param_provider.hpp.gcov.frameset.html new file mode 100644 index 0000000000..150116899e --- /dev/null +++ b/mrs_lib/include/mrs_lib/impl/param_provider.hpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl/param_provider.hpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/include/mrs_lib/impl/param_provider.hpp.gcov.html b/mrs_lib/include/mrs_lib/impl/param_provider.hpp.gcov.html new file mode 100644 index 0000000000..036d67147f --- /dev/null +++ b/mrs_lib/include/mrs_lib/impl/param_provider.hpp.gcov.html @@ -0,0 +1,132 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl/param_provider.hpp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/impl - param_provider.hpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:91464.3 %
Date:2024-04-18 23:11:36Functions:1616100.0 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : #ifndef PARAM_PROVIDER_HPP
+       2             : #define PARAM_PROVIDER_HPP
+       3             : 
+       4             : #include <mrs_lib/param_provider.h>
+       5             : 
+       6             : namespace mrs_lib
+       7             : {
+       8             :   template <typename T>
+       9       80432 :   bool ParamProvider::getParam(const std::string& param_name, T& value_out) const
+      10             :   {
+      11             :     try
+      12             :     {
+      13       80432 :       return getParamImpl(param_name, value_out);
+      14             :     }
+      15           0 :     catch (const YAML::Exception& e)
+      16             :     {
+      17           0 :       ROS_ERROR_STREAM("[" << m_node_name << "]: YAML-CPP threw an unknown exception: " << e.what());
+      18           0 :       return false;
+      19             :     }
+      20             :   }
+      21             : 
+      22             :   template <typename T>
+      23       80432 :   bool ParamProvider::getParamImpl(const std::string& param_name, T& value_out) const
+      24             :   {
+      25             :     {
+      26       80432 :       const auto found_node = findYamlNode(param_name);
+      27       80432 :       if (found_node.has_value())
+      28             :       {
+      29             :         try
+      30             :         {
+      31             :           // try catch is the only type-generic option...
+      32       69146 :           value_out = found_node.value().as<T>();
+      33       69146 :           return true;
+      34             :         }
+      35           0 :         catch (const YAML::BadConversion& e)
+      36             :         {}
+      37             :       }
+      38             : 
+      39             :     }
+      40             : 
+      41       11286 :     if (m_use_rosparam)
+      42       11286 :       return m_nh.getParam(param_name, value_out);
+      43             : 
+      44           0 :     return false;
+      45             :   }
+      46             : }
+      47             : 
+      48             : #endif // PARAM_PROVIDER_HPP
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/impl/param_provider.hpp.gcov.overview.html b/mrs_lib/include/mrs_lib/impl/param_provider.hpp.gcov.overview.html new file mode 100644 index 0000000000..69615a5af4 --- /dev/null +++ b/mrs_lib/include/mrs_lib/impl/param_provider.hpp.gcov.overview.html @@ -0,0 +1,32 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl/param_provider.hpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/include/mrs_lib/impl/param_provider.hpp.gcov.png b/mrs_lib/include/mrs_lib/impl/param_provider.hpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..ade5b52da3b6b1fdc1937ea78b6f4e330848bd5b GIT binary patch literal 347 zcmeAS@N?(olHy`uVBq!ia0vp^0YGfP!VDx!PCqyTq$C1-LR|m<|Gx?dmcNgUef6J# zVHHpuOr7)IycEdhEbxddW?exI8~cZ8YuYE)5S5wqIYZPZNU}=o)*3ZtZx{i z8u&c^ua)V4vEbQ`uWa8BH!8ks+tGO{D*FweDWeR>Vxdgy18WjYI0V;~sH}Yceuu!e z0;l^`b$NRN&slSXO8W};Xs>xVM=ia4YFWZ0Ew@EJE}d3Ju7autr`5k7@L&&0yLLsS zDBjGHPiM9KksV){!x#LxZ@Z~}-j3&;nl`5^?b8Y_Wi{U3e%V`LO6vLxN&VqovDxc< zWm#+Y&A45X$$2MVXKT~#-D!1_>~XuLzF#sey8p%D#18$4a?^(i^D?KlC?1vmcshZ# noy}F#!c60lb+eQ5{_FfwLML{x?EUc*=xGK|S3j3^P6 + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl/publisher_handler.hpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/impl - publisher_handler.hpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:445481.5 %
Date:2024-04-18 23:11:36Functions:19720297.5 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::PublisherHandler<mrs_msgs::EstimatorDiagnostics_<std::allocator<void> > >::publish(mrs_msgs::EstimatorDiagnostics_<std::allocator<void> > const&)0
mrs_lib::PublisherHandler<mrs_msgs::EstimatorDiagnostics_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)0
mrs_lib::PublisherHandler<mrs_msgs::EstimatorDiagnostics_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::EstimatorDiagnostics_<std::allocator<void> > > const&)0
mrs_lib::PublisherHandler_impl<mrs_msgs::EstimatorDiagnostics_<std::allocator<void> > >::publish(mrs_msgs::EstimatorDiagnostics_<std::allocator<void> > const&)0
mrs_lib::PublisherHandler_impl<mrs_msgs::EstimatorDiagnostics_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)0
mrs_lib::PublisherHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)1
mrs_lib::PublisherHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > > const&)1
mrs_lib::PublisherHandler<mrs_msgs::Path_<std::allocator<void> > >::publish(boost::shared_ptr<mrs_msgs::Path_<std::allocator<void> > const> const&)1
mrs_lib::PublisherHandler_impl<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)1
mrs_lib::PublisherHandler_impl<mrs_msgs::Path_<std::allocator<void> > >::publish(boost::shared_ptr<mrs_msgs::Path_<std::allocator<void> > const> const&)1
mrs_lib::PublisherHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)2
mrs_lib::PublisherHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > > const&)2
mrs_lib::PublisherHandler<std_msgs::Int64_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)2
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)2
mrs_lib::PublisherHandler_impl<std_msgs::Int64_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)2
mrs_lib::PublisherHandler<mrs_msgs::Path_<std::allocator<void> > >::publish(mrs_msgs::Path_<std::allocator<void> > const&)5
mrs_lib::PublisherHandler_impl<mrs_msgs::Path_<std::allocator<void> > >::publish(mrs_msgs::Path_<std::allocator<void> > const&)5
mrs_lib::PublisherHandler<std_msgs::Bool_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)31
mrs_lib::PublisherHandler<std_msgs::Bool_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<std_msgs::Bool_<std::allocator<void> > > const&)31
mrs_lib::PublisherHandler_impl<std_msgs::Bool_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)31
mrs_lib::PublisherHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<geometry_msgs::PoseStamped_<std::allocator<void> > > const&)91
mrs_lib::PublisherHandler<mrs_msgs::ControlError_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<mrs_msgs::ControlError_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::ControlError_<std::allocator<void> > > const&)91
mrs_lib::PublisherHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > > const&)91
mrs_lib::PublisherHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > > const&)91
mrs_lib::PublisherHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > > const&)91
mrs_lib::PublisherHandler<mrs_msgs::HwApiActuatorCmd_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<mrs_msgs::HwApiPositionCmd_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > > const&)91
mrs_lib::PublisherHandler<mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > > const&)91
mrs_lib::PublisherHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > > const&)91
mrs_lib::PublisherHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > > const&)91
mrs_lib::PublisherHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > > const&)91
mrs_lib::PublisherHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > > const&)91
mrs_lib::PublisherHandler<mrs_msgs::HwApiAccelerationHdgCmd_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<mrs_msgs::HwApiVelocityHdgRateCmd_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > > const&)91
mrs_lib::PublisherHandler<mrs_msgs::HwApiAccelerationHdgRateCmd_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > > const&)91
mrs_lib::PublisherHandler<mrs_msgs::Path_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<mrs_msgs::Path_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::Path_<std::allocator<void> > > const&)91
mrs_lib::PublisherHandler<std_msgs::Empty_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<std_msgs::Empty_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<std_msgs::Empty_<std::allocator<void> > > const&)91
mrs_lib::PublisherHandler<std_msgs::String_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<std_msgs::String_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<std_msgs::String_<std::allocator<void> > > const&)91
mrs_lib::PublisherHandler_impl<geometry_msgs::PoseStamped_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<mrs_msgs::ControlError_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<mrs_msgs::EstimatorInput_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<mrs_msgs::TrackerCommand_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiActuatorCmd_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiPositionCmd_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiAccelerationHdgCmd_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiVelocityHdgRateCmd_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiAccelerationHdgRateCmd_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<mrs_msgs::Path_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<std_msgs::Empty_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<std_msgs::String_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<mrs_msgs::HwApiVelocityHdgCmd_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)92
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiVelocityHdgCmd_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)92
mrs_lib::PublisherHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)97
mrs_lib::PublisherHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > > const&)97
mrs_lib::PublisherHandler_impl<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)97
mrs_lib::PublisherHandler<std_msgs::Int64_<std::allocator<void> > >::publish(std_msgs::Int64_<std::allocator<void> > const&)110
mrs_lib::PublisherHandler_impl<std_msgs::Int64_<std::allocator<void> > >::publish(std_msgs::Int64_<std::allocator<void> > const&)110
mrs_lib::PublisherHandler<mrs_msgs::HwApiActuatorCmd_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::HwApiActuatorCmd_<std::allocator<void> > > const&)182
mrs_lib::PublisherHandler<mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> > > const&)182
mrs_lib::PublisherHandler<mrs_msgs::HwApiPositionCmd_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::HwApiPositionCmd_<std::allocator<void> > > const&)182
mrs_lib::PublisherHandler<mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> > > const&)182
mrs_lib::PublisherHandler<mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> > > const&)182
mrs_lib::PublisherHandler<mrs_msgs::HwApiAccelerationHdgCmd_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::HwApiAccelerationHdgCmd_<std::allocator<void> > > const&)182
mrs_lib::PublisherHandler<mrs_msgs::HwApiVelocityHdgRateCmd_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::HwApiVelocityHdgRateCmd_<std::allocator<void> > > const&)182
mrs_lib::PublisherHandler<mrs_msgs::HwApiAccelerationHdgRateCmd_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::HwApiAccelerationHdgRateCmd_<std::allocator<void> > > const&)182
mrs_lib::PublisherHandler<mrs_msgs::HwApiVelocityHdgCmd_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::HwApiVelocityHdgCmd_<std::allocator<void> > > const&)183
mrs_lib::PublisherHandler<mrs_msgs::UavState_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)189
mrs_lib::PublisherHandler<mrs_msgs::UavState_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::UavState_<std::allocator<void> > > const&)189
mrs_lib::PublisherHandler_impl<mrs_msgs::UavState_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)189
mrs_lib::PublisherHandler<mrs_msgs::Float64ArrayStamped_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)264
mrs_lib::PublisherHandler<mrs_msgs::Float64ArrayStamped_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::Float64ArrayStamped_<std::allocator<void> > > const&)264
mrs_lib::PublisherHandler_impl<mrs_msgs::Float64ArrayStamped_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)264
mrs_lib::PublisherHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)361
mrs_lib::PublisherHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > > const&)361
mrs_lib::PublisherHandler_impl<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)361
mrs_lib::PublisherHandler<geometry_msgs::PoseArray_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)364
mrs_lib::PublisherHandler<geometry_msgs::PoseArray_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<geometry_msgs::PoseArray_<std::allocator<void> > > const&)364
mrs_lib::PublisherHandler<std_msgs::Float64_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)364
mrs_lib::PublisherHandler<std_msgs::Float64_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<std_msgs::Float64_<std::allocator<void> > > const&)364
mrs_lib::PublisherHandler_impl<geometry_msgs::PoseArray_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)364
mrs_lib::PublisherHandler_impl<std_msgs::Float64_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)364
mrs_lib::PublisherHandler<nav_msgs::Odometry_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<nav_msgs::Odometry_<std::allocator<void> > > const&)372
mrs_lib::PublisherHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::publish(mrs_msgs::ObstacleSectors_<std::allocator<void> > const&)435
mrs_lib::PublisherHandler_impl<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::publish(mrs_msgs::ObstacleSectors_<std::allocator<void> > const&)435
mrs_lib::PublisherHandler<nav_msgs::Odometry_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)447
mrs_lib::PublisherHandler_impl<nav_msgs::Odometry_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)447
mrs_lib::PublisherHandler<mrs_msgs::HwApiPositionCmd_<std::allocator<void> > >::publish(mrs_msgs::HwApiPositionCmd_<std::allocator<void> > const&)505
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiPositionCmd_<std::allocator<void> > >::publish(mrs_msgs::HwApiPositionCmd_<std::allocator<void> > const&)505
mrs_lib::PublisherHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)525
mrs_lib::PublisherHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > > const&)525
mrs_lib::PublisherHandler_impl<mrs_msgs::Float64Stamped_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)525
mrs_lib::PublisherHandler<visualization_msgs::MarkerArray_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)546
mrs_lib::PublisherHandler<visualization_msgs::MarkerArray_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<visualization_msgs::MarkerArray_<std::allocator<void> > > const&)546
mrs_lib::PublisherHandler_impl<visualization_msgs::MarkerArray_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)546
mrs_lib::PublisherHandler<mrs_msgs::EstimatorCorrection_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)692
mrs_lib::PublisherHandler<mrs_msgs::EstimatorCorrection_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::EstimatorCorrection_<std::allocator<void> > > const&)692
mrs_lib::PublisherHandler_impl<mrs_msgs::EstimatorCorrection_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)692
mrs_lib::PublisherHandler<mrs_msgs::HwApiAccelerationHdgRateCmd_<std::allocator<void> > >::publish(mrs_msgs::HwApiAccelerationHdgRateCmd_<std::allocator<void> > const&)1026
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiAccelerationHdgRateCmd_<std::allocator<void> > >::publish(mrs_msgs::HwApiAccelerationHdgRateCmd_<std::allocator<void> > const&)1026
mrs_lib::PublisherHandler<mrs_msgs::HwApiAccelerationHdgCmd_<std::allocator<void> > >::publish(mrs_msgs::HwApiAccelerationHdgCmd_<std::allocator<void> > const&)1046
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiAccelerationHdgCmd_<std::allocator<void> > >::publish(mrs_msgs::HwApiAccelerationHdgCmd_<std::allocator<void> > const&)1046
mrs_lib::PublisherHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::publish(geometry_msgs::PoseStamped_<std::allocator<void> > const&)1328
mrs_lib::PublisherHandler_impl<geometry_msgs::PoseStamped_<std::allocator<void> > >::publish(geometry_msgs::PoseStamped_<std::allocator<void> > const&)1328
mrs_lib::PublisherHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::publish(mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > const&)1599
mrs_lib::PublisherHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::publish(mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > const&)1599
mrs_lib::PublisherHandler_impl<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::publish(mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > const&)1599
mrs_lib::PublisherHandler_impl<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::publish(mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > const&)1599
mrs_lib::PublisherHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::publish(mrs_msgs::FutureTrajectory_<std::allocator<void> > const&)1892
mrs_lib::PublisherHandler_impl<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::publish(mrs_msgs::FutureTrajectory_<std::allocator<void> > const&)1892
mrs_lib::PublisherHandler<mrs_msgs::HwApiVelocityHdgCmd_<std::allocator<void> > >::publish(mrs_msgs::HwApiVelocityHdgCmd_<std::allocator<void> > const&)1910
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiVelocityHdgCmd_<std::allocator<void> > >::publish(mrs_msgs::HwApiVelocityHdgCmd_<std::allocator<void> > const&)1910
mrs_lib::PublisherHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::publish(mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > const&)1955
mrs_lib::PublisherHandler_impl<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::publish(mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > const&)1955
mrs_lib::PublisherHandler<mrs_msgs::HwApiVelocityHdgRateCmd_<std::allocator<void> > >::publish(mrs_msgs::HwApiVelocityHdgRateCmd_<std::allocator<void> > const&)2241
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiVelocityHdgRateCmd_<std::allocator<void> > >::publish(mrs_msgs::HwApiVelocityHdgRateCmd_<std::allocator<void> > const&)2241
mrs_lib::PublisherHandler<mrs_msgs::HwApiActuatorCmd_<std::allocator<void> > >::publish(mrs_msgs::HwApiActuatorCmd_<std::allocator<void> > const&)3826
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiActuatorCmd_<std::allocator<void> > >::publish(mrs_msgs::HwApiActuatorCmd_<std::allocator<void> > const&)3826
mrs_lib::PublisherHandler<mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> > >::publish(mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> > const&)3844
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> > >::publish(mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> > const&)3844
mrs_lib::PublisherHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::publish(mrs_msgs::HwApiRcChannels_<std::allocator<void> > const&)6527
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::publish(mrs_msgs::HwApiRcChannels_<std::allocator<void> > const&)6527
mrs_lib::PublisherHandler<mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> > >::publish(mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> > const&)7936
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> > >::publish(mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> > const&)7936
mrs_lib::PublisherHandler<std_msgs::Bool_<std::allocator<void> > >::publish(std_msgs::Bool_<std::allocator<void> > const&)9790
mrs_lib::PublisherHandler_impl<std_msgs::Bool_<std::allocator<void> > >::publish(std_msgs::Bool_<std::allocator<void> > const&)9790
mrs_lib::PublisherHandler<mrs_msgs::ControlError_<std::allocator<void> > >::publish(mrs_msgs::ControlError_<std::allocator<void> > const&)9948
mrs_lib::PublisherHandler_impl<mrs_msgs::ControlError_<std::allocator<void> > >::publish(mrs_msgs::ControlError_<std::allocator<void> > const&)9948
mrs_lib::PublisherHandler<std_msgs::Empty_<std::allocator<void> > >::publish(std_msgs::Empty_<std::allocator<void> > const&)11051
mrs_lib::PublisherHandler_impl<std_msgs::Empty_<std::allocator<void> > >::publish(std_msgs::Empty_<std::allocator<void> > const&)11051
mrs_lib::PublisherHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::publish(mrs_msgs::DynamicsConstraints_<std::allocator<void> > const&)13792
mrs_lib::PublisherHandler_impl<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::publish(mrs_msgs::DynamicsConstraints_<std::allocator<void> > const&)13792
mrs_lib::PublisherHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::publish(mrs_msgs::EstimationDiagnostics_<std::allocator<void> > const&)16325
mrs_lib::PublisherHandler_impl<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::publish(mrs_msgs::EstimationDiagnostics_<std::allocator<void> > const&)16325
mrs_lib::PublisherHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::publish(mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > const&)16355
mrs_lib::PublisherHandler_impl<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::publish(mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > const&)16355
mrs_lib::PublisherHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::publish(mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > const&)20339
mrs_lib::PublisherHandler<std_msgs::String_<std::allocator<void> > >::publish(std_msgs::String_<std::allocator<void> > const&)20339
mrs_lib::PublisherHandler_impl<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::publish(mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > const&)20339
mrs_lib::PublisherHandler_impl<std_msgs::String_<std::allocator<void> > >::publish(std_msgs::String_<std::allocator<void> > const&)20339
mrs_lib::PublisherHandler<visualization_msgs::MarkerArray_<std::allocator<void> > >::publish(visualization_msgs::MarkerArray_<std::allocator<void> > const&)31199
mrs_lib::PublisherHandler_impl<visualization_msgs::MarkerArray_<std::allocator<void> > >::publish(visualization_msgs::MarkerArray_<std::allocator<void> > const&)31199
mrs_lib::PublisherHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::publish(mrs_msgs::EstimatorInput_<std::allocator<void> > const&)79851
mrs_lib::PublisherHandler_impl<mrs_msgs::EstimatorInput_<std::allocator<void> > >::publish(mrs_msgs::EstimatorInput_<std::allocator<void> > const&)79851
mrs_lib::PublisherHandler<mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> > >::publish(mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> > const&)86477
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> > >::publish(mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> > const&)86477
mrs_lib::PublisherHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::publish(mrs_msgs::TrackerCommand_<std::allocator<void> > const&)93659
mrs_lib::PublisherHandler_impl<mrs_msgs::TrackerCommand_<std::allocator<void> > >::publish(mrs_msgs::TrackerCommand_<std::allocator<void> > const&)93659
mrs_lib::PublisherHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::publish(mrs_msgs::ControllerDiagnostics_<std::allocator<void> > const&)130025
mrs_lib::PublisherHandler_impl<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::publish(mrs_msgs::ControllerDiagnostics_<std::allocator<void> > const&)130025
mrs_lib::PublisherHandler<geometry_msgs::PoseArray_<std::allocator<void> > >::publish(geometry_msgs::PoseArray_<std::allocator<void> > const&)141934
mrs_lib::PublisherHandler_impl<geometry_msgs::PoseArray_<std::allocator<void> > >::publish(geometry_msgs::PoseArray_<std::allocator<void> > const&)141934
mrs_lib::PublisherHandler<nav_msgs::Odometry_<std::allocator<void> > >::PublisherHandler(mrs_lib::PublisherHandler<nav_msgs::Odometry_<std::allocator<void> > > const&)144024
mrs_lib::PublisherHandler_impl<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::publish(geometry_msgs::QuaternionStamped_<std::allocator<void> > const&)189920
mrs_lib::PublisherHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::publish(geometry_msgs::QuaternionStamped_<std::allocator<void> > const&)189937
mrs_lib::PublisherHandler<std_msgs::Float64_<std::allocator<void> > >::publish(std_msgs::Float64_<std::allocator<void> > const&)214790
mrs_lib::PublisherHandler_impl<std_msgs::Float64_<std::allocator<void> > >::publish(std_msgs::Float64_<std::allocator<void> > const&)214790
mrs_lib::PublisherHandler_impl<mrs_msgs::Float64Stamped_<std::allocator<void> > >::publish(mrs_msgs::Float64Stamped_<std::allocator<void> > const&)331693
mrs_lib::PublisherHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::publish(mrs_msgs::Float64Stamped_<std::allocator<void> > const&)331704
mrs_lib::PublisherHandler<mrs_msgs::UavState_<std::allocator<void> > >::publish(mrs_msgs::UavState_<std::allocator<void> > const&)339056
mrs_lib::PublisherHandler_impl<mrs_msgs::UavState_<std::allocator<void> > >::publish(mrs_msgs::UavState_<std::allocator<void> > const&)339100
mrs_lib::PublisherHandler_impl<mrs_msgs::Float64ArrayStamped_<std::allocator<void> > >::publish(mrs_msgs::Float64ArrayStamped_<std::allocator<void> > const&)464561
mrs_lib::PublisherHandler<mrs_msgs::Float64ArrayStamped_<std::allocator<void> > >::publish(mrs_msgs::Float64ArrayStamped_<std::allocator<void> > const&)464701
mrs_lib::PublisherHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::publish(mrs_msgs::EstimatorOutput_<std::allocator<void> > const&)655436
mrs_lib::PublisherHandler_impl<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::publish(mrs_msgs::EstimatorOutput_<std::allocator<void> > const&)655458
mrs_lib::PublisherHandler_impl<nav_msgs::Odometry_<std::allocator<void> > >::publish(nav_msgs::Odometry_<std::allocator<void> > const&)724633
mrs_lib::PublisherHandler<nav_msgs::Odometry_<std::allocator<void> > >::publish(nav_msgs::Odometry_<std::allocator<void> > const&)724648
mrs_lib::PublisherHandler_impl<mrs_msgs::EstimatorCorrection_<std::allocator<void> > >::publish(mrs_msgs::EstimatorCorrection_<std::allocator<void> > const&)1291924
mrs_lib::PublisherHandler<mrs_msgs::EstimatorCorrection_<std::allocator<void> > >::publish(mrs_msgs::EstimatorCorrection_<std::allocator<void> > const&)1291954
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/impl/publisher_handler.hpp.func.html b/mrs_lib/include/mrs_lib/impl/publisher_handler.hpp.func.html new file mode 100644 index 0000000000..d8d44ac80f --- /dev/null +++ b/mrs_lib/include/mrs_lib/impl/publisher_handler.hpp.func.html @@ -0,0 +1,888 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl/publisher_handler.hpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/impl - publisher_handler.hpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:445481.5 %
Date:2024-04-18 23:11:36Functions:19720297.5 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::PublisherHandler<geometry_msgs::PoseArray_<std::allocator<void> > >::publish(geometry_msgs::PoseArray_<std::allocator<void> > const&)141934
mrs_lib::PublisherHandler<geometry_msgs::PoseArray_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)364
mrs_lib::PublisherHandler<geometry_msgs::PoseArray_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<geometry_msgs::PoseArray_<std::allocator<void> > > const&)364
mrs_lib::PublisherHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::publish(geometry_msgs::PoseStamped_<std::allocator<void> > const&)1328
mrs_lib::PublisherHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<geometry_msgs::PoseStamped_<std::allocator<void> > > const&)91
mrs_lib::PublisherHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::publish(geometry_msgs::QuaternionStamped_<std::allocator<void> > const&)189937
mrs_lib::PublisherHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)97
mrs_lib::PublisherHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > > const&)97
mrs_lib::PublisherHandler<visualization_msgs::MarkerArray_<std::allocator<void> > >::publish(visualization_msgs::MarkerArray_<std::allocator<void> > const&)31199
mrs_lib::PublisherHandler<visualization_msgs::MarkerArray_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)546
mrs_lib::PublisherHandler<visualization_msgs::MarkerArray_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<visualization_msgs::MarkerArray_<std::allocator<void> > > const&)546
mrs_lib::PublisherHandler<mrs_msgs::ControlError_<std::allocator<void> > >::publish(mrs_msgs::ControlError_<std::allocator<void> > const&)9948
mrs_lib::PublisherHandler<mrs_msgs::ControlError_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<mrs_msgs::ControlError_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::ControlError_<std::allocator<void> > > const&)91
mrs_lib::PublisherHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::publish(mrs_msgs::EstimatorInput_<std::allocator<void> > const&)79851
mrs_lib::PublisherHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > > const&)91
mrs_lib::PublisherHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::publish(mrs_msgs::Float64Stamped_<std::allocator<void> > const&)331704
mrs_lib::PublisherHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)525
mrs_lib::PublisherHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > > const&)525
mrs_lib::PublisherHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::publish(mrs_msgs::TrackerCommand_<std::allocator<void> > const&)93659
mrs_lib::PublisherHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > > const&)91
mrs_lib::PublisherHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::publish(mrs_msgs::EstimatorOutput_<std::allocator<void> > const&)655436
mrs_lib::PublisherHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)361
mrs_lib::PublisherHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > > const&)361
mrs_lib::PublisherHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::publish(mrs_msgs::HwApiRcChannels_<std::allocator<void> > const&)6527
mrs_lib::PublisherHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)2
mrs_lib::PublisherHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > > const&)2
mrs_lib::PublisherHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::publish(mrs_msgs::ObstacleSectors_<std::allocator<void> > const&)435
mrs_lib::PublisherHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)1
mrs_lib::PublisherHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > > const&)1
mrs_lib::PublisherHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::publish(mrs_msgs::FutureTrajectory_<std::allocator<void> > const&)1892
mrs_lib::PublisherHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > > const&)91
mrs_lib::PublisherHandler<mrs_msgs::HwApiActuatorCmd_<std::allocator<void> > >::publish(mrs_msgs::HwApiActuatorCmd_<std::allocator<void> > const&)3826
mrs_lib::PublisherHandler<mrs_msgs::HwApiActuatorCmd_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<mrs_msgs::HwApiActuatorCmd_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::HwApiActuatorCmd_<std::allocator<void> > > const&)182
mrs_lib::PublisherHandler<mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> > >::publish(mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> > const&)7936
mrs_lib::PublisherHandler<mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> > > const&)182
mrs_lib::PublisherHandler<mrs_msgs::HwApiPositionCmd_<std::allocator<void> > >::publish(mrs_msgs::HwApiPositionCmd_<std::allocator<void> > const&)505
mrs_lib::PublisherHandler<mrs_msgs::HwApiPositionCmd_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<mrs_msgs::HwApiPositionCmd_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::HwApiPositionCmd_<std::allocator<void> > > const&)182
mrs_lib::PublisherHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::publish(mrs_msgs::DynamicsConstraints_<std::allocator<void> > const&)13792
mrs_lib::PublisherHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > > const&)91
mrs_lib::PublisherHandler<mrs_msgs::EstimatorCorrection_<std::allocator<void> > >::publish(mrs_msgs::EstimatorCorrection_<std::allocator<void> > const&)1291954
mrs_lib::PublisherHandler<mrs_msgs::EstimatorCorrection_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)692
mrs_lib::PublisherHandler<mrs_msgs::EstimatorCorrection_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::EstimatorCorrection_<std::allocator<void> > > const&)692
mrs_lib::PublisherHandler<mrs_msgs::Float64ArrayStamped_<std::allocator<void> > >::publish(mrs_msgs::Float64ArrayStamped_<std::allocator<void> > const&)464701
mrs_lib::PublisherHandler<mrs_msgs::Float64ArrayStamped_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)264
mrs_lib::PublisherHandler<mrs_msgs::Float64ArrayStamped_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::Float64ArrayStamped_<std::allocator<void> > > const&)264
mrs_lib::PublisherHandler<mrs_msgs::HwApiVelocityHdgCmd_<std::allocator<void> > >::publish(mrs_msgs::HwApiVelocityHdgCmd_<std::allocator<void> > const&)1910
mrs_lib::PublisherHandler<mrs_msgs::HwApiVelocityHdgCmd_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)92
mrs_lib::PublisherHandler<mrs_msgs::HwApiVelocityHdgCmd_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::HwApiVelocityHdgCmd_<std::allocator<void> > > const&)183
mrs_lib::PublisherHandler<mrs_msgs::EstimatorDiagnostics_<std::allocator<void> > >::publish(mrs_msgs::EstimatorDiagnostics_<std::allocator<void> > const&)0
mrs_lib::PublisherHandler<mrs_msgs::EstimatorDiagnostics_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)0
mrs_lib::PublisherHandler<mrs_msgs::EstimatorDiagnostics_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::EstimatorDiagnostics_<std::allocator<void> > > const&)0
mrs_lib::PublisherHandler<mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> > >::publish(mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> > const&)86477
mrs_lib::PublisherHandler<mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> > > const&)182
mrs_lib::PublisherHandler<mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> > >::publish(mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> > const&)3844
mrs_lib::PublisherHandler<mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> > > const&)182
mrs_lib::PublisherHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::publish(mrs_msgs::ControllerDiagnostics_<std::allocator<void> > const&)130025
mrs_lib::PublisherHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > > const&)91
mrs_lib::PublisherHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::publish(mrs_msgs::EstimationDiagnostics_<std::allocator<void> > const&)16325
mrs_lib::PublisherHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > > const&)91
mrs_lib::PublisherHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::publish(mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > const&)20339
mrs_lib::PublisherHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > > const&)91
mrs_lib::PublisherHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::publish(mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > const&)1955
mrs_lib::PublisherHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > > const&)91
mrs_lib::PublisherHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::publish(mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > const&)1599
mrs_lib::PublisherHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > > const&)91
mrs_lib::PublisherHandler<mrs_msgs::HwApiAccelerationHdgCmd_<std::allocator<void> > >::publish(mrs_msgs::HwApiAccelerationHdgCmd_<std::allocator<void> > const&)1046
mrs_lib::PublisherHandler<mrs_msgs::HwApiAccelerationHdgCmd_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<mrs_msgs::HwApiAccelerationHdgCmd_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::HwApiAccelerationHdgCmd_<std::allocator<void> > > const&)182
mrs_lib::PublisherHandler<mrs_msgs::HwApiVelocityHdgRateCmd_<std::allocator<void> > >::publish(mrs_msgs::HwApiVelocityHdgRateCmd_<std::allocator<void> > const&)2241
mrs_lib::PublisherHandler<mrs_msgs::HwApiVelocityHdgRateCmd_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<mrs_msgs::HwApiVelocityHdgRateCmd_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::HwApiVelocityHdgRateCmd_<std::allocator<void> > > const&)182
mrs_lib::PublisherHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::publish(mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > const&)16355
mrs_lib::PublisherHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > > const&)91
mrs_lib::PublisherHandler<mrs_msgs::HwApiAccelerationHdgRateCmd_<std::allocator<void> > >::publish(mrs_msgs::HwApiAccelerationHdgRateCmd_<std::allocator<void> > const&)1026
mrs_lib::PublisherHandler<mrs_msgs::HwApiAccelerationHdgRateCmd_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<mrs_msgs::HwApiAccelerationHdgRateCmd_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::HwApiAccelerationHdgRateCmd_<std::allocator<void> > > const&)182
mrs_lib::PublisherHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::publish(mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > const&)1599
mrs_lib::PublisherHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > > const&)91
mrs_lib::PublisherHandler<mrs_msgs::Path_<std::allocator<void> > >::publish(boost::shared_ptr<mrs_msgs::Path_<std::allocator<void> > const> const&)1
mrs_lib::PublisherHandler<mrs_msgs::Path_<std::allocator<void> > >::publish(mrs_msgs::Path_<std::allocator<void> > const&)5
mrs_lib::PublisherHandler<mrs_msgs::Path_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<mrs_msgs::Path_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::Path_<std::allocator<void> > > const&)91
mrs_lib::PublisherHandler<mrs_msgs::UavState_<std::allocator<void> > >::publish(mrs_msgs::UavState_<std::allocator<void> > const&)339056
mrs_lib::PublisherHandler<mrs_msgs::UavState_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)189
mrs_lib::PublisherHandler<mrs_msgs::UavState_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<mrs_msgs::UavState_<std::allocator<void> > > const&)189
mrs_lib::PublisherHandler<nav_msgs::Odometry_<std::allocator<void> > >::publish(nav_msgs::Odometry_<std::allocator<void> > const&)724648
mrs_lib::PublisherHandler<nav_msgs::Odometry_<std::allocator<void> > >::PublisherHandler(mrs_lib::PublisherHandler<nav_msgs::Odometry_<std::allocator<void> > > const&)144024
mrs_lib::PublisherHandler<nav_msgs::Odometry_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)447
mrs_lib::PublisherHandler<nav_msgs::Odometry_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<nav_msgs::Odometry_<std::allocator<void> > > const&)372
mrs_lib::PublisherHandler<std_msgs::Bool_<std::allocator<void> > >::publish(std_msgs::Bool_<std::allocator<void> > const&)9790
mrs_lib::PublisherHandler<std_msgs::Bool_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)31
mrs_lib::PublisherHandler<std_msgs::Bool_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<std_msgs::Bool_<std::allocator<void> > > const&)31
mrs_lib::PublisherHandler<std_msgs::Empty_<std::allocator<void> > >::publish(std_msgs::Empty_<std::allocator<void> > const&)11051
mrs_lib::PublisherHandler<std_msgs::Empty_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<std_msgs::Empty_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<std_msgs::Empty_<std::allocator<void> > > const&)91
mrs_lib::PublisherHandler<std_msgs::Int64_<std::allocator<void> > >::publish(std_msgs::Int64_<std::allocator<void> > const&)110
mrs_lib::PublisherHandler<std_msgs::Int64_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)2
mrs_lib::PublisherHandler<std_msgs::String_<std::allocator<void> > >::publish(std_msgs::String_<std::allocator<void> > const&)20339
mrs_lib::PublisherHandler<std_msgs::String_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler<std_msgs::String_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<std_msgs::String_<std::allocator<void> > > const&)91
mrs_lib::PublisherHandler<std_msgs::Float64_<std::allocator<void> > >::publish(std_msgs::Float64_<std::allocator<void> > const&)214790
mrs_lib::PublisherHandler<std_msgs::Float64_<std::allocator<void> > >::PublisherHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)364
mrs_lib::PublisherHandler<std_msgs::Float64_<std::allocator<void> > >::operator=(mrs_lib::PublisherHandler<std_msgs::Float64_<std::allocator<void> > > const&)364
mrs_lib::PublisherHandler_impl<geometry_msgs::PoseArray_<std::allocator<void> > >::publish(geometry_msgs::PoseArray_<std::allocator<void> > const&)141934
mrs_lib::PublisherHandler_impl<geometry_msgs::PoseArray_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)364
mrs_lib::PublisherHandler_impl<geometry_msgs::PoseStamped_<std::allocator<void> > >::publish(geometry_msgs::PoseStamped_<std::allocator<void> > const&)1328
mrs_lib::PublisherHandler_impl<geometry_msgs::PoseStamped_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::publish(geometry_msgs::QuaternionStamped_<std::allocator<void> > const&)189920
mrs_lib::PublisherHandler_impl<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)97
mrs_lib::PublisherHandler_impl<visualization_msgs::MarkerArray_<std::allocator<void> > >::publish(visualization_msgs::MarkerArray_<std::allocator<void> > const&)31199
mrs_lib::PublisherHandler_impl<visualization_msgs::MarkerArray_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)546
mrs_lib::PublisherHandler_impl<mrs_msgs::ControlError_<std::allocator<void> > >::publish(mrs_msgs::ControlError_<std::allocator<void> > const&)9948
mrs_lib::PublisherHandler_impl<mrs_msgs::ControlError_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<mrs_msgs::EstimatorInput_<std::allocator<void> > >::publish(mrs_msgs::EstimatorInput_<std::allocator<void> > const&)79851
mrs_lib::PublisherHandler_impl<mrs_msgs::EstimatorInput_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<mrs_msgs::Float64Stamped_<std::allocator<void> > >::publish(mrs_msgs::Float64Stamped_<std::allocator<void> > const&)331693
mrs_lib::PublisherHandler_impl<mrs_msgs::Float64Stamped_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)525
mrs_lib::PublisherHandler_impl<mrs_msgs::TrackerCommand_<std::allocator<void> > >::publish(mrs_msgs::TrackerCommand_<std::allocator<void> > const&)93659
mrs_lib::PublisherHandler_impl<mrs_msgs::TrackerCommand_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::publish(mrs_msgs::EstimatorOutput_<std::allocator<void> > const&)655458
mrs_lib::PublisherHandler_impl<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)361
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::publish(mrs_msgs::HwApiRcChannels_<std::allocator<void> > const&)6527
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)2
mrs_lib::PublisherHandler_impl<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::publish(mrs_msgs::ObstacleSectors_<std::allocator<void> > const&)435
mrs_lib::PublisherHandler_impl<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)1
mrs_lib::PublisherHandler_impl<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::publish(mrs_msgs::FutureTrajectory_<std::allocator<void> > const&)1892
mrs_lib::PublisherHandler_impl<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiActuatorCmd_<std::allocator<void> > >::publish(mrs_msgs::HwApiActuatorCmd_<std::allocator<void> > const&)3826
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiActuatorCmd_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> > >::publish(mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> > const&)7936
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiPositionCmd_<std::allocator<void> > >::publish(mrs_msgs::HwApiPositionCmd_<std::allocator<void> > const&)505
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiPositionCmd_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::publish(mrs_msgs::DynamicsConstraints_<std::allocator<void> > const&)13792
mrs_lib::PublisherHandler_impl<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<mrs_msgs::EstimatorCorrection_<std::allocator<void> > >::publish(mrs_msgs::EstimatorCorrection_<std::allocator<void> > const&)1291924
mrs_lib::PublisherHandler_impl<mrs_msgs::EstimatorCorrection_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)692
mrs_lib::PublisherHandler_impl<mrs_msgs::Float64ArrayStamped_<std::allocator<void> > >::publish(mrs_msgs::Float64ArrayStamped_<std::allocator<void> > const&)464561
mrs_lib::PublisherHandler_impl<mrs_msgs::Float64ArrayStamped_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)264
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiVelocityHdgCmd_<std::allocator<void> > >::publish(mrs_msgs::HwApiVelocityHdgCmd_<std::allocator<void> > const&)1910
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiVelocityHdgCmd_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)92
mrs_lib::PublisherHandler_impl<mrs_msgs::EstimatorDiagnostics_<std::allocator<void> > >::publish(mrs_msgs::EstimatorDiagnostics_<std::allocator<void> > const&)0
mrs_lib::PublisherHandler_impl<mrs_msgs::EstimatorDiagnostics_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)0
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> > >::publish(mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> > const&)86477
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> > >::publish(mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> > const&)3844
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::publish(mrs_msgs::ControllerDiagnostics_<std::allocator<void> > const&)130025
mrs_lib::PublisherHandler_impl<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::publish(mrs_msgs::EstimationDiagnostics_<std::allocator<void> > const&)16325
mrs_lib::PublisherHandler_impl<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::publish(mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > const&)20339
mrs_lib::PublisherHandler_impl<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::publish(mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > const&)1955
mrs_lib::PublisherHandler_impl<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::publish(mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > const&)1599
mrs_lib::PublisherHandler_impl<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiAccelerationHdgCmd_<std::allocator<void> > >::publish(mrs_msgs::HwApiAccelerationHdgCmd_<std::allocator<void> > const&)1046
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiAccelerationHdgCmd_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiVelocityHdgRateCmd_<std::allocator<void> > >::publish(mrs_msgs::HwApiVelocityHdgRateCmd_<std::allocator<void> > const&)2241
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiVelocityHdgRateCmd_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::publish(mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > const&)16355
mrs_lib::PublisherHandler_impl<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiAccelerationHdgRateCmd_<std::allocator<void> > >::publish(mrs_msgs::HwApiAccelerationHdgRateCmd_<std::allocator<void> > const&)1026
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiAccelerationHdgRateCmd_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::publish(mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > const&)1599
mrs_lib::PublisherHandler_impl<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<mrs_msgs::Path_<std::allocator<void> > >::publish(boost::shared_ptr<mrs_msgs::Path_<std::allocator<void> > const> const&)1
mrs_lib::PublisherHandler_impl<mrs_msgs::Path_<std::allocator<void> > >::publish(mrs_msgs::Path_<std::allocator<void> > const&)5
mrs_lib::PublisherHandler_impl<mrs_msgs::Path_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<mrs_msgs::UavState_<std::allocator<void> > >::publish(mrs_msgs::UavState_<std::allocator<void> > const&)339100
mrs_lib::PublisherHandler_impl<mrs_msgs::UavState_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)189
mrs_lib::PublisherHandler_impl<nav_msgs::Odometry_<std::allocator<void> > >::publish(nav_msgs::Odometry_<std::allocator<void> > const&)724633
mrs_lib::PublisherHandler_impl<nav_msgs::Odometry_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)447
mrs_lib::PublisherHandler_impl<std_msgs::Bool_<std::allocator<void> > >::publish(std_msgs::Bool_<std::allocator<void> > const&)9790
mrs_lib::PublisherHandler_impl<std_msgs::Bool_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)31
mrs_lib::PublisherHandler_impl<std_msgs::Empty_<std::allocator<void> > >::publish(std_msgs::Empty_<std::allocator<void> > const&)11051
mrs_lib::PublisherHandler_impl<std_msgs::Empty_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<std_msgs::Int64_<std::allocator<void> > >::publish(std_msgs::Int64_<std::allocator<void> > const&)110
mrs_lib::PublisherHandler_impl<std_msgs::Int64_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)2
mrs_lib::PublisherHandler_impl<std_msgs::String_<std::allocator<void> > >::publish(std_msgs::String_<std::allocator<void> > const&)20339
mrs_lib::PublisherHandler_impl<std_msgs::String_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)91
mrs_lib::PublisherHandler_impl<std_msgs::Float64_<std::allocator<void> > >::publish(std_msgs::Float64_<std::allocator<void> > const&)214790
mrs_lib::PublisherHandler_impl<std_msgs::Float64_<std::allocator<void> > >::PublisherHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, bool const&, double const&)364
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/impl/publisher_handler.hpp.gcov.frameset.html b/mrs_lib/include/mrs_lib/impl/publisher_handler.hpp.gcov.frameset.html new file mode 100644 index 0000000000..0082e6a657 --- /dev/null +++ b/mrs_lib/include/mrs_lib/impl/publisher_handler.hpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl/publisher_handler.hpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/include/mrs_lib/impl/publisher_handler.hpp.gcov.html b/mrs_lib/include/mrs_lib/impl/publisher_handler.hpp.gcov.html new file mode 100644 index 0000000000..8d5a3e7390 --- /dev/null +++ b/mrs_lib/include/mrs_lib/impl/publisher_handler.hpp.gcov.html @@ -0,0 +1,332 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl/publisher_handler.hpp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/impl - publisher_handler.hpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:445481.5 %
Date:2024-04-18 23:11:36Functions:19720297.5 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : #ifndef PUBLISHER_HANDLER_HPP
+       2             : #define PUBLISHER_HANDLER_HPP
+       3             : 
+       4             : namespace mrs_lib
+       5             : {
+       6             : 
+       7             : // --------------------------------------------------------------
+       8             : // |                    PublisherHandler_impl                   |
+       9             : // --------------------------------------------------------------
+      10             : 
+      11             : /* PublisherHandler_impl(void) //{ */
+      12             : 
+      13             : template <class TopicType>
+      14             : PublisherHandler_impl<TopicType>::PublisherHandler_impl(void) : publisher_initialized_(false) {
+      15             : }
+      16             : 
+      17             : //}
+      18             : 
+      19             : /* PublisherHandler_impl(ros::NodeHandle& nh, const std::string& address, const unsigned int &buffer_size, const bool &latch) //{ */
+      20             : 
+      21             : template <class TopicType>
+      22        6161 : PublisherHandler_impl<TopicType>::PublisherHandler_impl(ros::NodeHandle& nh, const std::string& address, const unsigned int& buffer_size, const bool& latch,
+      23        6161 :                                                         const double& rate) {
+      24             : 
+      25             :   {
+      26        6161 :     std::scoped_lock lock(mutex_publisher_);
+      27             : 
+      28        6161 :     publisher_ = nh.advertise<TopicType>(address, buffer_size, latch);
+      29             : 
+      30        6161 :     if (rate > 0.0) {
+      31             : 
+      32         638 :       throttle_ = true;
+      33             : 
+      34         638 :       throttle_min_dt_ = 1.0 / rate;
+      35             : 
+      36             :     } else {
+      37             : 
+      38        5523 :       throttle_ = false;
+      39             : 
+      40        5523 :       throttle_min_dt_ = 0;
+      41             :     }
+      42             : 
+      43        6161 :     last_time_published_ = ros::Time(0);
+      44             :   }
+      45             : 
+      46        6161 :   publisher_initialized_ = true;
+      47        6161 : }
+      48             : 
+      49             : //}
+      50             : 
+      51             : /* publish(TopicType& msg) //{ */
+      52             : 
+      53             : template <class TopicType>
+      54     4930947 : void PublisherHandler_impl<TopicType>::publish(const TopicType& msg) {
+      55             : 
+      56     4930947 :   if (!publisher_initialized_) {
+      57           0 :     return;
+      58             :   }
+      59             : 
+      60             :   {
+      61     4928057 :     std::scoped_lock lock(mutex_publisher_);
+      62             : 
+      63     4927792 :     if (throttle_) {
+      64             : 
+      65      259353 :       if ((ros::Time::now() - last_time_published_).toSec() < throttle_min_dt_) {
+      66      118247 :         return;
+      67             :       }
+      68             : 
+      69      141106 :       last_time_published_ = ros::Time::now();
+      70             :     }
+      71             : 
+      72             :     try {
+      73     4809545 :       publisher_.publish(msg);
+      74             :     }
+      75           0 :     catch (...) {
+      76           0 :       ROS_ERROR("exception caught during publishing topic '%s'", publisher_.getTopic().c_str());
+      77             :     }
+      78             :   }
+      79             : }
+      80             : 
+      81             : //}
+      82             : 
+      83             : /* publish(const boost::shared_ptr<TopicType>& msg) //{ */
+      84             : 
+      85             : template <class TopicType>
+      86             : void PublisherHandler_impl<TopicType>::publish(const boost::shared_ptr<TopicType>& msg) {
+      87             : 
+      88             :   if (!publisher_initialized_) {
+      89             :     return;
+      90             :   }
+      91             : 
+      92             :   {
+      93             :     std::scoped_lock lock(mutex_publisher_);
+      94             : 
+      95             :     if (throttle_) {
+      96             : 
+      97             :       if ((ros::Time::now() - last_time_published_).toSec() < throttle_min_dt_) {
+      98             :         return;
+      99             :       }
+     100             : 
+     101             :       last_time_published_ = ros::Time::now();
+     102             :     }
+     103             : 
+     104             :     try {
+     105             :       publisher_.publish(msg);
+     106             :     }
+     107             :     catch (...) {
+     108             :       ROS_ERROR("exception caught during publishing topic '%s'", publisher_.getTopic().c_str());
+     109             :     }
+     110             :   }
+     111             : }
+     112             : 
+     113             : //}
+     114             : 
+     115             : /* publish(const boost::shared_ptr<TopicType const>& msg) //{ */
+     116             : 
+     117             : template <class TopicType>
+     118           1 : void PublisherHandler_impl<TopicType>::publish(const boost::shared_ptr<TopicType const>& msg) {
+     119             : 
+     120           1 :   if (!publisher_initialized_) {
+     121           0 :     return;
+     122             :   }
+     123             : 
+     124             :   {
+     125           1 :     std::scoped_lock lock(mutex_publisher_);
+     126             : 
+     127           1 :     if (throttle_) {
+     128             : 
+     129           0 :       if ((ros::Time::now() - last_time_published_).toSec() < throttle_min_dt_) {
+     130           0 :         return;
+     131             :       }
+     132             : 
+     133           0 :       last_time_published_ = ros::Time::now();
+     134             :     }
+     135             : 
+     136             :     try {
+     137           1 :       publisher_.publish(msg);
+     138             :     }
+     139           0 :     catch (...) {
+     140           0 :       ROS_ERROR("exception caught during publishing topic '%s'", publisher_.getTopic().c_str());
+     141             :     }
+     142             :   }
+     143             : }
+     144             : 
+     145             : //}
+     146             : 
+     147             : /* getNumSubscribers(void) //{ */
+     148             : 
+     149             : template <class TopicType>
+     150             : unsigned int PublisherHandler_impl<TopicType>::getNumSubscribers(void) {
+     151             : 
+     152             :   {
+     153             :     std::scoped_lock lock(mutex_publisher_);
+     154             : 
+     155             :     return publisher_.getNumSubscribers();
+     156             :   }
+     157             : }
+     158             : 
+     159             : //}
+     160             : 
+     161             : // --------------------------------------------------------------
+     162             : // |                      PublisherHandler                      |
+     163             : // --------------------------------------------------------------
+     164             : 
+     165             : /* operator= //{ */
+     166             : 
+     167             : template <class TopicType>
+     168        6903 : PublisherHandler<TopicType>& PublisherHandler<TopicType>::operator=(const PublisherHandler<TopicType>& other) {
+     169             : 
+     170        6903 :   if (this == &other) {
+     171           0 :     return *this;
+     172             :   }
+     173             : 
+     174        6903 :   if (other.impl_) {
+     175        6903 :     this->impl_ = other.impl_;
+     176             :   }
+     177             : 
+     178        6903 :   return *this;
+     179             : }
+     180             : 
+     181             : //}
+     182             : 
+     183             : /* copy constructor //{ */
+     184             : 
+     185             : template <class TopicType>
+     186      144024 : PublisherHandler<TopicType>::PublisherHandler(const PublisherHandler<TopicType>& other) {
+     187             : 
+     188      144024 :   if (other.impl_) {
+     189      144024 :     this->impl_ = other.impl_;
+     190             :   }
+     191      144024 : }
+     192             : 
+     193             : //}
+     194             : 
+     195             : /* PublisherHandler(ros::NodeHandle& nh, const std::string& address, const unsigned int &buffer_size, const bool &latch) //{ */
+     196             : 
+     197             : template <class TopicType>
+     198        6161 : PublisherHandler<TopicType>::PublisherHandler(ros::NodeHandle& nh, const std::string& address, const unsigned int& buffer_size, const bool& latch,
+     199        6161 :                                               const double& rate) {
+     200             : 
+     201        6161 :   impl_ = std::make_shared<PublisherHandler_impl<TopicType>>(nh, address, buffer_size, latch, rate);
+     202        6161 : }
+     203             : 
+     204             : //}
+     205             : 
+     206             : /* publish(const TopicType& msg) //{ */
+     207             : 
+     208             : template <class TopicType>
+     209     4931094 : void PublisherHandler<TopicType>::publish(const TopicType& msg) {
+     210             : 
+     211     4931094 :   impl_->publish(msg);
+     212     4932850 : }
+     213             : 
+     214             : //}
+     215             : 
+     216             : /* publish(const boost::shared_ptr<TopicType>& msg) //{ */
+     217             : 
+     218             : template <class TopicType>
+     219             : void PublisherHandler<TopicType>::publish(const boost::shared_ptr<TopicType>& msg) {
+     220             : 
+     221             :   impl_->publish(msg);
+     222             : }
+     223             : 
+     224             : //}
+     225             : 
+     226             : /* publish(const boost::shared_ptr<TopicType const>& msg) //{ */
+     227             : 
+     228             : template <class TopicType>
+     229           1 : void PublisherHandler<TopicType>::publish(const boost::shared_ptr<TopicType const>& msg) {
+     230             : 
+     231           1 :   impl_->publish(msg);
+     232           1 : }
+     233             : 
+     234             : //}
+     235             : 
+     236             : /* getNumSubscribers(void) //{ */
+     237             : 
+     238             : template <class TopicType>
+     239             : unsigned int PublisherHandler<TopicType>::getNumSubscribers(void) {
+     240             : 
+     241             :   return impl_->getNumSubscribers();
+     242             : }
+     243             : 
+     244             : //}
+     245             : 
+     246             : }  // namespace mrs_lib
+     247             : 
+     248             : #endif  // PUBLISHER_HANDLER_HPP
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/impl/publisher_handler.hpp.gcov.overview.html b/mrs_lib/include/mrs_lib/impl/publisher_handler.hpp.gcov.overview.html new file mode 100644 index 0000000000..4ab1195056 --- /dev/null +++ b/mrs_lib/include/mrs_lib/impl/publisher_handler.hpp.gcov.overview.html @@ -0,0 +1,82 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl/publisher_handler.hpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/include/mrs_lib/impl/publisher_handler.hpp.gcov.png b/mrs_lib/include/mrs_lib/impl/publisher_handler.hpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..635f18b8a53237cee5f0d09d83c1fed5e41f3609 GIT binary patch literal 798 zcmV+(1L6FMP)q?p-?i-RjX(;YJ986rs_mRR+& z!Y<6?3J4QF(~^;O<*WMRe90>Mf*%@bz^-JM1R`wOATk#1l<#Kh5t#xM6ciL;M72mR zY3+(=b}l#HiYR zek5J0OjUl2b3~AfM3}NldX^B89V%|y>-BnWMVU50Nh#uTYieeBV(Jk+$~liRzI)FV z;#$bI77;o&INwVuRV0YKAW6xF26A_>#!Pm`*C-?WDSk`wD-`8fF!E4elK=F#?Q0=I z5jzWbgpbreMs4J*n#gmAcprXrs|Y_ou^R)EUnRt4e;?wADLUG08>pUbmseoD8+7$GdOSDvk4}F5 zcno{K%D|yA? zJma6R+lHy}NUmy_>Ljl>Qlt4jV;mm8`{!rI)}k-EK*F=z01|q5F~XT4GqEY86Sm~T c=jTZ84>I7)EiN$bBme*a07*qoM6N<$g7<4~+W-In literal 0 HcmV?d00001 diff --git a/mrs_lib/include/mrs_lib/impl/service_client_handler.hpp.func-sort-c.html b/mrs_lib/include/mrs_lib/impl/service_client_handler.hpp.func-sort-c.html new file mode 100644 index 0000000000..215fb0ff0c --- /dev/null +++ b/mrs_lib/include/mrs_lib/impl/service_client_handler.hpp.func-sort-c.html @@ -0,0 +1,268 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl/service_client_handler.hpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/impl - service_client_handler.hpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:525692.9 %
Date:2024-04-18 23:11:36Functions:4747100.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::ServiceClientHandler<mrs_msgs::ConstraintsOverride>::call(mrs_msgs::ConstraintsOverride&)1
mrs_lib::ServiceClientHandler<mrs_msgs::ConstraintsOverride>::ServiceClientHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1
mrs_lib::ServiceClientHandler<mrs_msgs::ConstraintsOverride>::operator=(mrs_lib::ServiceClientHandler<mrs_msgs::ConstraintsOverride> const&)1
mrs_lib::ServiceClientHandler<mrs_msgs::Vec4>::call(mrs_msgs::Vec4&)1
mrs_lib::ServiceClientHandler_impl<mrs_msgs::ConstraintsOverride>::call(mrs_msgs::ConstraintsOverride&)1
mrs_lib::ServiceClientHandler_impl<mrs_msgs::ConstraintsOverride>::ServiceClientHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1
mrs_lib::ServiceClientHandler_impl<mrs_msgs::Vec4>::call(mrs_msgs::Vec4&)1
mrs_lib::ServiceClientHandler<mrs_msgs::Float64Srv>::ServiceClientHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)2
mrs_lib::ServiceClientHandler<mrs_msgs::Float64Srv>::operator=(mrs_lib::ServiceClientHandler<mrs_msgs::Float64Srv> const&)2
mrs_lib::ServiceClientHandler<std_srvs::Trigger>::callAsync(std_srvs::Trigger&, int const&)2
mrs_lib::ServiceClientHandler_impl<mrs_msgs::Float64Srv>::ServiceClientHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)2
mrs_lib::ServiceClientHandler_impl<std_srvs::Trigger>::call(std_srvs::Trigger&, int const&, double const&)2
mrs_lib::ServiceClientHandler_impl<std_srvs::Trigger>::asyncRun()2
mrs_lib::ServiceClientHandler_impl<std_srvs::Trigger>::callAsync(std_srvs::Trigger&, int const&)2
mrs_lib::ServiceClientHandler<mrs_msgs::Float64Srv>::call(mrs_msgs::Float64Srv&)11
mrs_lib::ServiceClientHandler_impl<mrs_msgs::Float64Srv>::call(mrs_msgs::Float64Srv&)11
mrs_lib::ServiceClientHandler<mrs_msgs::Vec1>::call(mrs_msgs::Vec1&)20
mrs_lib::ServiceClientHandler_impl<mrs_msgs::Vec1>::call(mrs_msgs::Vec1&)20
mrs_lib::ServiceClientHandler<mrs_msgs::DynamicsConstraintsSrv>::ServiceClientHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)91
mrs_lib::ServiceClientHandler<mrs_msgs::DynamicsConstraintsSrv>::operator=(mrs_lib::ServiceClientHandler<mrs_msgs::DynamicsConstraintsSrv> const&)91
mrs_lib::ServiceClientHandler<mrs_msgs::Vec1>::ServiceClientHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)91
mrs_lib::ServiceClientHandler<mrs_msgs::Vec1>::operator=(mrs_lib::ServiceClientHandler<mrs_msgs::Vec1> const&)91
mrs_lib::ServiceClientHandler<std_srvs::Trigger>::initialize(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)91
mrs_lib::ServiceClientHandler_impl<mrs_msgs::DynamicsConstraintsSrv>::ServiceClientHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)91
mrs_lib::ServiceClientHandler_impl<mrs_msgs::Vec1>::ServiceClientHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)91
mrs_lib::ServiceClientHandler<mrs_msgs::ReferenceStampedSrv>::ServiceClientHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)92
mrs_lib::ServiceClientHandler<mrs_msgs::ReferenceStampedSrv>::operator=(mrs_lib::ServiceClientHandler<mrs_msgs::ReferenceStampedSrv> const&)92
mrs_lib::ServiceClientHandler_impl<mrs_msgs::ReferenceStampedSrv>::ServiceClientHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)92
mrs_lib::ServiceClientHandler<mrs_msgs::DynamicsConstraintsSrv>::call(mrs_msgs::DynamicsConstraintsSrv&)94
mrs_lib::ServiceClientHandler_impl<mrs_msgs::DynamicsConstraintsSrv>::call(mrs_msgs::DynamicsConstraintsSrv&)94
mrs_lib::ServiceClientHandler<mrs_msgs::ReferenceStampedSrv>::call(mrs_msgs::ReferenceStampedSrv&)95
mrs_lib::ServiceClientHandler_impl<mrs_msgs::ReferenceStampedSrv>::call(mrs_msgs::ReferenceStampedSrv&)95
mrs_lib::ServiceClientHandler<mrs_msgs::String>::ServiceClientHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)182
mrs_lib::ServiceClientHandler<mrs_msgs::String>::operator=(mrs_lib::ServiceClientHandler<mrs_msgs::String> const&)182
mrs_lib::ServiceClientHandler_impl<mrs_msgs::String>::ServiceClientHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)182
mrs_lib::ServiceClientHandler<std_srvs::Trigger>::call(std_srvs::Trigger&)200
mrs_lib::ServiceClientHandler_impl<std_srvs::Trigger>::call(std_srvs::Trigger&)200
mrs_lib::ServiceClientHandler<std_srvs::SetBool>::call(std_srvs::SetBool&)322
mrs_lib::ServiceClientHandler_impl<std_srvs::SetBool>::call(std_srvs::SetBool&)322
mrs_lib::ServiceClientHandler<mrs_msgs::String>::call(mrs_msgs::String&)355
mrs_lib::ServiceClientHandler_impl<mrs_msgs::String>::call(mrs_msgs::String&)355
mrs_lib::ServiceClientHandler<std_srvs::SetBool>::ServiceClientHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)548
mrs_lib::ServiceClientHandler<std_srvs::SetBool>::operator=(mrs_lib::ServiceClientHandler<std_srvs::SetBool> const&)548
mrs_lib::ServiceClientHandler_impl<std_srvs::SetBool>::ServiceClientHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)548
mrs_lib::ServiceClientHandler<std_srvs::Trigger>::ServiceClientHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)911
mrs_lib::ServiceClientHandler<std_srvs::Trigger>::operator=(mrs_lib::ServiceClientHandler<std_srvs::Trigger> const&)911
mrs_lib::ServiceClientHandler_impl<std_srvs::Trigger>::ServiceClientHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1002
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/impl/service_client_handler.hpp.func.html b/mrs_lib/include/mrs_lib/impl/service_client_handler.hpp.func.html new file mode 100644 index 0000000000..eaa036e9bd --- /dev/null +++ b/mrs_lib/include/mrs_lib/impl/service_client_handler.hpp.func.html @@ -0,0 +1,268 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl/service_client_handler.hpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/impl - service_client_handler.hpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:525692.9 %
Date:2024-04-18 23:11:36Functions:4747100.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::ServiceClientHandler<mrs_msgs::Float64Srv>::call(mrs_msgs::Float64Srv&)11
mrs_lib::ServiceClientHandler<mrs_msgs::Float64Srv>::ServiceClientHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)2
mrs_lib::ServiceClientHandler<mrs_msgs::Float64Srv>::operator=(mrs_lib::ServiceClientHandler<mrs_msgs::Float64Srv> const&)2
mrs_lib::ServiceClientHandler<mrs_msgs::ConstraintsOverride>::call(mrs_msgs::ConstraintsOverride&)1
mrs_lib::ServiceClientHandler<mrs_msgs::ConstraintsOverride>::ServiceClientHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1
mrs_lib::ServiceClientHandler<mrs_msgs::ConstraintsOverride>::operator=(mrs_lib::ServiceClientHandler<mrs_msgs::ConstraintsOverride> const&)1
mrs_lib::ServiceClientHandler<mrs_msgs::ReferenceStampedSrv>::call(mrs_msgs::ReferenceStampedSrv&)95
mrs_lib::ServiceClientHandler<mrs_msgs::ReferenceStampedSrv>::ServiceClientHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)92
mrs_lib::ServiceClientHandler<mrs_msgs::ReferenceStampedSrv>::operator=(mrs_lib::ServiceClientHandler<mrs_msgs::ReferenceStampedSrv> const&)92
mrs_lib::ServiceClientHandler<mrs_msgs::DynamicsConstraintsSrv>::call(mrs_msgs::DynamicsConstraintsSrv&)94
mrs_lib::ServiceClientHandler<mrs_msgs::DynamicsConstraintsSrv>::ServiceClientHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)91
mrs_lib::ServiceClientHandler<mrs_msgs::DynamicsConstraintsSrv>::operator=(mrs_lib::ServiceClientHandler<mrs_msgs::DynamicsConstraintsSrv> const&)91
mrs_lib::ServiceClientHandler<mrs_msgs::Vec1>::call(mrs_msgs::Vec1&)20
mrs_lib::ServiceClientHandler<mrs_msgs::Vec1>::ServiceClientHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)91
mrs_lib::ServiceClientHandler<mrs_msgs::Vec1>::operator=(mrs_lib::ServiceClientHandler<mrs_msgs::Vec1> const&)91
mrs_lib::ServiceClientHandler<mrs_msgs::Vec4>::call(mrs_msgs::Vec4&)1
mrs_lib::ServiceClientHandler<mrs_msgs::String>::call(mrs_msgs::String&)355
mrs_lib::ServiceClientHandler<mrs_msgs::String>::ServiceClientHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)182
mrs_lib::ServiceClientHandler<mrs_msgs::String>::operator=(mrs_lib::ServiceClientHandler<mrs_msgs::String> const&)182
mrs_lib::ServiceClientHandler<std_srvs::SetBool>::call(std_srvs::SetBool&)322
mrs_lib::ServiceClientHandler<std_srvs::SetBool>::ServiceClientHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)548
mrs_lib::ServiceClientHandler<std_srvs::SetBool>::operator=(mrs_lib::ServiceClientHandler<std_srvs::SetBool> const&)548
mrs_lib::ServiceClientHandler<std_srvs::Trigger>::initialize(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)91
mrs_lib::ServiceClientHandler<std_srvs::Trigger>::call(std_srvs::Trigger&)200
mrs_lib::ServiceClientHandler<std_srvs::Trigger>::callAsync(std_srvs::Trigger&, int const&)2
mrs_lib::ServiceClientHandler<std_srvs::Trigger>::ServiceClientHandler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)911
mrs_lib::ServiceClientHandler<std_srvs::Trigger>::operator=(mrs_lib::ServiceClientHandler<std_srvs::Trigger> const&)911
mrs_lib::ServiceClientHandler_impl<mrs_msgs::Float64Srv>::call(mrs_msgs::Float64Srv&)11
mrs_lib::ServiceClientHandler_impl<mrs_msgs::Float64Srv>::ServiceClientHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)2
mrs_lib::ServiceClientHandler_impl<mrs_msgs::ConstraintsOverride>::call(mrs_msgs::ConstraintsOverride&)1
mrs_lib::ServiceClientHandler_impl<mrs_msgs::ConstraintsOverride>::ServiceClientHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1
mrs_lib::ServiceClientHandler_impl<mrs_msgs::ReferenceStampedSrv>::call(mrs_msgs::ReferenceStampedSrv&)95
mrs_lib::ServiceClientHandler_impl<mrs_msgs::ReferenceStampedSrv>::ServiceClientHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)92
mrs_lib::ServiceClientHandler_impl<mrs_msgs::DynamicsConstraintsSrv>::call(mrs_msgs::DynamicsConstraintsSrv&)94
mrs_lib::ServiceClientHandler_impl<mrs_msgs::DynamicsConstraintsSrv>::ServiceClientHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)91
mrs_lib::ServiceClientHandler_impl<mrs_msgs::Vec1>::call(mrs_msgs::Vec1&)20
mrs_lib::ServiceClientHandler_impl<mrs_msgs::Vec1>::ServiceClientHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)91
mrs_lib::ServiceClientHandler_impl<mrs_msgs::Vec4>::call(mrs_msgs::Vec4&)1
mrs_lib::ServiceClientHandler_impl<mrs_msgs::String>::call(mrs_msgs::String&)355
mrs_lib::ServiceClientHandler_impl<mrs_msgs::String>::ServiceClientHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)182
mrs_lib::ServiceClientHandler_impl<std_srvs::SetBool>::call(std_srvs::SetBool&)322
mrs_lib::ServiceClientHandler_impl<std_srvs::SetBool>::ServiceClientHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)548
mrs_lib::ServiceClientHandler_impl<std_srvs::Trigger>::call(std_srvs::Trigger&)200
mrs_lib::ServiceClientHandler_impl<std_srvs::Trigger>::call(std_srvs::Trigger&, int const&, double const&)2
mrs_lib::ServiceClientHandler_impl<std_srvs::Trigger>::asyncRun()2
mrs_lib::ServiceClientHandler_impl<std_srvs::Trigger>::callAsync(std_srvs::Trigger&, int const&)2
mrs_lib::ServiceClientHandler_impl<std_srvs::Trigger>::ServiceClientHandler_impl(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1002
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/impl/service_client_handler.hpp.gcov.frameset.html b/mrs_lib/include/mrs_lib/impl/service_client_handler.hpp.gcov.frameset.html new file mode 100644 index 0000000000..c6e9ac6564 --- /dev/null +++ b/mrs_lib/include/mrs_lib/impl/service_client_handler.hpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl/service_client_handler.hpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/include/mrs_lib/impl/service_client_handler.hpp.gcov.html b/mrs_lib/include/mrs_lib/impl/service_client_handler.hpp.gcov.html new file mode 100644 index 0000000000..659707845f --- /dev/null +++ b/mrs_lib/include/mrs_lib/impl/service_client_handler.hpp.gcov.html @@ -0,0 +1,403 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl/service_client_handler.hpp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/impl - service_client_handler.hpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:525692.9 %
Date:2024-04-18 23:11:36Functions:4747100.0 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : #ifndef SERVICE_CLIENT_HANDLER_HPP
+       2             : #define SERVICE_CLIENT_HANDLER_HPP
+       3             : 
+       4             : namespace mrs_lib
+       5             : {
+       6             : 
+       7             : // --------------------------------------------------------------
+       8             : // |                  ServiceClientHandler_impl                 |
+       9             : // --------------------------------------------------------------
+      10             : 
+      11             : /* ServiceClientHandler_impl(void) //{ */
+      12             : 
+      13             : template <class ServiceType>
+      14             : ServiceClientHandler_impl<ServiceType>::ServiceClientHandler_impl(void) : service_initialized_(false) {
+      15             : }
+      16             : 
+      17             : //}
+      18             : 
+      19             : /* ServiceClientHandler_impl(ros::NodeHandle& nh, const std::string& address) //{ */
+      20             : 
+      21             : template <class ServiceType>
+      22        2009 : ServiceClientHandler_impl<ServiceType>::ServiceClientHandler_impl(ros::NodeHandle& nh, const std::string& address) {
+      23             : 
+      24             :   {
+      25        2009 :     std::scoped_lock lock(mutex_service_client_);
+      26             : 
+      27        2009 :     service_client_ = nh.serviceClient<ServiceType>(address);
+      28             :   }
+      29             : 
+      30        2009 :   _address_       = address;
+      31        2009 :   async_attempts_ = 1;
+      32             : 
+      33             :   /* thread_oneshot_ = std::make_shared<std::thread>(std::thread(&ServiceClientHandler_impl::threadOneshot, this, true, false)); */
+      34             : 
+      35        2009 :   service_initialized_ = true;
+      36        2009 : }
+      37             : 
+      38             : //}
+      39             : 
+      40             : /* call(ServiceType& srv) //{ */
+      41             : 
+      42             : template <class ServiceType>
+      43        1099 : bool ServiceClientHandler_impl<ServiceType>::call(ServiceType& srv) {
+      44             : 
+      45        1099 :   if (!service_initialized_) {
+      46           0 :     return false;
+      47             :   }
+      48             : 
+      49        1099 :   return service_client_.call(srv);
+      50             : }
+      51             : 
+      52             : //}
+      53             : 
+      54             : /* call(ServiceType& srv, const int& attempts) //{ */
+      55             : 
+      56             : template <class ServiceType>
+      57             : bool ServiceClientHandler_impl<ServiceType>::call(ServiceType& srv, const int& attempts) {
+      58             : 
+      59             :   if (!service_initialized_) {
+      60             :     return false;
+      61             :   }
+      62             : 
+      63             :   std::scoped_lock lock(mutex_service_client_);
+      64             : 
+      65             :   bool success = false;
+      66             :   int  counter = 0;
+      67             : 
+      68             :   while (!success && ros::ok()) {
+      69             : 
+      70             :     success = service_client_.call(srv);
+      71             : 
+      72             :     if (!success) {
+      73             :       ROS_ERROR("[%s]: failed to call service to '%s'", ros::this_node::getName().c_str(), _address_.c_str());
+      74             :     }
+      75             : 
+      76             :     if (++counter >= attempts) {
+      77             :       break;
+      78             :     }
+      79             :   }
+      80             : 
+      81             :   return success;
+      82             : }
+      83             : 
+      84             : //}
+      85             : 
+      86             : /* call(ServiceType& srv, const int& attempts, const double& repeat_delay) //{ */
+      87             : 
+      88             : template <class ServiceType>
+      89           2 : bool ServiceClientHandler_impl<ServiceType>::call(ServiceType& srv, const int& attempts, const double& repeat_delay) {
+      90             : 
+      91           2 :   if (!service_initialized_) {
+      92           0 :     return false;
+      93             :   }
+      94             : 
+      95           2 :   std::scoped_lock lock(mutex_service_client_);
+      96             : 
+      97           2 :   bool success = false;
+      98           2 :   int  counter = 0;
+      99             : 
+     100           8 :   while (!success && ros::ok()) {
+     101             : 
+     102           6 :     success = service_client_.call(srv);
+     103             : 
+     104           6 :     if (!success) {
+     105           4 :       ROS_ERROR("[%s]: failed to call service to '%s'", ros::this_node::getName().c_str(), _address_.c_str());
+     106             :     }
+     107             : 
+     108           6 :     if (++counter >= attempts) {
+     109           0 :       break;
+     110             :     }
+     111             : 
+     112           6 :     ros::Duration(repeat_delay).sleep();
+     113             :   }
+     114             : 
+     115           2 :   return success;
+     116             : }
+     117             : 
+     118             : //}
+     119             : 
+     120             : /* callAsync(ServiceType& srv) //{ */
+     121             : 
+     122             : template <class ServiceType>
+     123             : std::future<ServiceType> ServiceClientHandler_impl<ServiceType>::callAsync(ServiceType& srv) {
+     124             : 
+     125             :   {
+     126             :     std::scoped_lock lock(mutex_async_);
+     127             : 
+     128             :     async_data_         = srv;
+     129             :     async_attempts_     = 1;
+     130             :     async_repeat_delay_ = 0;
+     131             :   }
+     132             : 
+     133             :   return std::async(std::launch::async, &ServiceClientHandler_impl::asyncRun, this);
+     134             : }
+     135             : 
+     136             : //}
+     137             : 
+     138             : /* callAsync(ServiceType& srv, const int& attempts) //{ */
+     139             : 
+     140             : template <class ServiceType>
+     141           2 : std::future<ServiceType> ServiceClientHandler_impl<ServiceType>::callAsync(ServiceType& srv, const int& attempts) {
+     142             : 
+     143             :   {
+     144           2 :     std::scoped_lock lock(mutex_async_);
+     145             : 
+     146           2 :     async_data_         = srv;
+     147           2 :     async_attempts_     = attempts;
+     148           2 :     async_repeat_delay_ = 0;
+     149             :   }
+     150             : 
+     151           2 :   return std::async(std::launch::async, &ServiceClientHandler_impl::asyncRun, this);
+     152             : }
+     153             : 
+     154             : //}
+     155             : 
+     156             : /* callAsync(ServiceType& srv, const int& attempts, const double &repeat_delay) //{ */
+     157             : 
+     158             : template <class ServiceType>
+     159             : std::future<ServiceType> ServiceClientHandler_impl<ServiceType>::callAsync(ServiceType& srv, const int& attempts, const double& repeat_delay) {
+     160             : 
+     161             :   {
+     162             :     std::scoped_lock lock(mutex_async_);
+     163             : 
+     164             :     async_data_         = srv;
+     165             :     async_attempts_     = attempts;
+     166             :     async_repeat_delay_ = repeat_delay;
+     167             :   }
+     168             : 
+     169             :   return std::async(std::launch::async, &ServiceClientHandler_impl::asyncRun, this);
+     170             : }
+     171             : 
+     172             : //}
+     173             : 
+     174             : /* asyncRun(void) //{ */
+     175             : 
+     176             : template <class ServiceType>
+     177           2 : ServiceType ServiceClientHandler_impl<ServiceType>::asyncRun(void) {
+     178             : 
+     179           2 :   ServiceType async_data;
+     180             :   int         async_attempts;
+     181             : 
+     182             :   {
+     183           2 :     std::scoped_lock lock(mutex_async_);
+     184             : 
+     185           2 :     async_data          = async_data_;
+     186           2 :     async_attempts      = async_attempts_;
+     187           2 :     async_repeat_delay_ = async_repeat_delay_;
+     188             :   }
+     189             : 
+     190           2 :   call(async_data, async_attempts, async_repeat_delay_);
+     191             : 
+     192           4 :   return async_data;
+     193             : }
+     194             : 
+     195             : //}
+     196             : 
+     197             : // --------------------------------------------------------------
+     198             : // |                    ServiceClientHandler                    |
+     199             : // --------------------------------------------------------------
+     200             : 
+     201             : /* operator= //{ */
+     202             : 
+     203             : template <class ServiceType>
+     204        1918 : ServiceClientHandler<ServiceType>& ServiceClientHandler<ServiceType>::operator=(const ServiceClientHandler<ServiceType>& other) {
+     205             : 
+     206        1918 :   if (this == &other) {
+     207           0 :     return *this;
+     208             :   }
+     209             : 
+     210        1918 :   if (other.impl_) {
+     211        1918 :     this->impl_ = other.impl_;
+     212             :   }
+     213             : 
+     214        1918 :   return *this;
+     215             : }
+     216             : 
+     217             : //}
+     218             : 
+     219             : /* copy constructor //{ */
+     220             : 
+     221             : template <class ServiceType>
+     222             : ServiceClientHandler<ServiceType>::ServiceClientHandler(const ServiceClientHandler<ServiceType>& other) {
+     223             : 
+     224             :   if (other.impl_) {
+     225             :     this->impl_ = other.impl_;
+     226             :   }
+     227             : }
+     228             : 
+     229             : //}
+     230             : 
+     231             : /* ServiceClientHandler(ros::NodeHandle& nh, const std::string& address) //{ */
+     232             : 
+     233             : template <class ServiceType>
+     234        1918 : ServiceClientHandler<ServiceType>::ServiceClientHandler(ros::NodeHandle& nh, const std::string& address) {
+     235             : 
+     236        1918 :   impl_ = std::make_shared<ServiceClientHandler_impl<ServiceType>>(nh, address);
+     237        1918 : }
+     238             : 
+     239             : //}
+     240             : 
+     241             : /* initialize(ros::NodeHandle& nh, const std::string& address) //{ */
+     242             : 
+     243             : template <class ServiceType>
+     244          91 : void ServiceClientHandler<ServiceType>::initialize(ros::NodeHandle& nh, const std::string& address) {
+     245             : 
+     246          91 :   impl_ = std::make_shared<ServiceClientHandler_impl<ServiceType>>(nh, address);
+     247          91 : }
+     248             : 
+     249             : //}
+     250             : 
+     251             : /* call(ServiceType& srv) //{ */
+     252             : 
+     253             : template <class ServiceType>
+     254        1099 : bool ServiceClientHandler<ServiceType>::call(ServiceType& srv) {
+     255             : 
+     256        1099 :   return impl_->call(srv);
+     257             : }
+     258             : 
+     259             : //}
+     260             : 
+     261             : /* call(ServiceType& srv, const int& attempts) //{ */
+     262             : 
+     263             : template <class ServiceType>
+     264             : bool ServiceClientHandler<ServiceType>::call(ServiceType& srv, const int& attempts) {
+     265             : 
+     266             :   return impl_->call(srv, attempts);
+     267             : }
+     268             : 
+     269             : //}
+     270             : 
+     271             : /* call(ServiceType& srv, const int& attempts, const double& repeat_delay) //{ */
+     272             : 
+     273             : template <class ServiceType>
+     274             : bool ServiceClientHandler<ServiceType>::call(ServiceType& srv, const int& attempts, const double& repeat_delay) {
+     275             : 
+     276             :   return impl_->call(srv, attempts, repeat_delay);
+     277             : }
+     278             : 
+     279             : //}
+     280             : 
+     281             : /* callAsync(ServiceType& srv) //{ */
+     282             : 
+     283             : template <class ServiceType>
+     284             : std::future<ServiceType> ServiceClientHandler<ServiceType>::callAsync(ServiceType& srv) {
+     285             : 
+     286             :   std::future<ServiceType> res = impl_->callAsync(srv);
+     287             : 
+     288             :   return res;
+     289             : }
+     290             : 
+     291             : //}
+     292             : 
+     293             : /* callAsync(ServiceType& srv, const int& attempts) //{ */
+     294             : 
+     295             : template <class ServiceType>
+     296           2 : std::future<ServiceType> ServiceClientHandler<ServiceType>::callAsync(ServiceType& srv, const int& attempts) {
+     297             : 
+     298           2 :   std::future<ServiceType> res = impl_->callAsync(srv, attempts);
+     299             : 
+     300           2 :   return res;
+     301             : }
+     302             : 
+     303             : //}
+     304             : 
+     305             : /* callAsync(ServiceType& srv, const int& attempts, const double& repeat_delay) //{ */
+     306             : 
+     307             : template <class ServiceType>
+     308             : std::future<ServiceType> ServiceClientHandler<ServiceType>::callAsync(ServiceType& srv, const int& attempts, const double& repeat_delay) {
+     309             : 
+     310             :   std::future<ServiceType> res = impl_->callAsync(srv, attempts, repeat_delay);
+     311             : 
+     312             :   return res;
+     313             : }
+     314             : 
+     315             : //}
+     316             : 
+     317             : }  // namespace mrs_lib
+     318             : 
+     319             : #endif  // SERVICE_CLIENT_HANDLER_HPP
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/impl/service_client_handler.hpp.gcov.overview.html b/mrs_lib/include/mrs_lib/impl/service_client_handler.hpp.gcov.overview.html new file mode 100644 index 0000000000..ab6ff399da --- /dev/null +++ b/mrs_lib/include/mrs_lib/impl/service_client_handler.hpp.gcov.overview.html @@ -0,0 +1,100 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl/service_client_handler.hpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/include/mrs_lib/impl/service_client_handler.hpp.gcov.png b/mrs_lib/include/mrs_lib/impl/service_client_handler.hpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..263b73ad1380cf9f7a8ef86c51aca552078dfaf1 GIT binary patch literal 969 zcmV;)12+7LP)Wqk9Iv^@lP(dY(=QXOzU}^O$n3W+JqlhhKurdbsVPJ$4 zm2sw#fHn(q8wtvc3@&CusskcExa5-;CL|9hAa2i^A<8=Aw(a}=Z{L45n3k=@;Th4i zo+G;AC3x?_TV}BL=oh6ew&M%93cw*aU1|285l zT!NU`Mp*~6s%7#VjJVE+;1pg)`&RYb!*R9eBK&bfdM-)ECo1pbkef4EZ$u;FTpg)P zx3}9BbjHow&pHv-#>@V^FkzWGq7i_@V1BnXBT7cyp+S7ZdWwYd9?^X?Sx?~`3g+AB zi?{EDo+51^>hz*Duv_mvWO+jOvI5%_itJ)oVlEcCI)xaE{P+`cY9&_gK=;7v_ zg@l7f#Cmv|5B_Qn2e&pFhJ#l4pTj{!@4{Ust_Bh7;kDcl6MM*J$V{;&kWhNjcS!m@ zX4Bib=l$iw{G;lCNmYo9Mb=aKsEax3d?wu;Sze#!6tcc6k#V+yRHD*pb5cs;XTwjM zJKXO?L{du0Qb;+o5JyeY3<%(%%UefHGE10sW!5aF0me~nVH0i;^<5TL9l1NA@qtxXjPZ-Hy|8-Suo%AbI@I=D1MDetRyXI_3l`vS}O#^lU5 zmu0@;ASZ`RpG3To0T|}uDQ!LTkw$iqE6sxg*#assQV?bPCT_M`SRU@fW91^^N5(Y^ rzi2W3O>xaxC_|mFwRLjam4SZ&Pzvjg528x=00000NkvXXu0mjf<=M*E literal 0 HcmV?d00001 diff --git a/mrs_lib/include/mrs_lib/impl/subscribe_handler.hpp.func-sort-c.html b/mrs_lib/include/mrs_lib/impl/subscribe_handler.hpp.func-sort-c.html new file mode 100644 index 0000000000..314819d8ca --- /dev/null +++ b/mrs_lib/include/mrs_lib/impl/subscribe_handler.hpp.func-sort-c.html @@ -0,0 +1,4256 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl/subscribe_handler.hpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/impl - subscribe_handler.hpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:9812081.7 %
Date:2024-04-18 23:11:36Functions:487104446.6 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::ImplThreadsafe::getMsg()0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::Impl::getMsg()0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<sensor_msgs::Imu_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<sensor_msgs::Joy_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::ImplThreadsafe::getMsg()0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<sensor_msgs::Joy_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<sensor_msgs::Joy_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::Impl::getMsg()0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<sensor_msgs::Range_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<geometry_msgs::PoseStamped_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::ImplThreadsafe::start()0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::ImplThreadsafe::getMsg()0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<geometry_msgs::PoseStamped_<std::allocator<void> > const>)> const&)0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().20
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<geometry_msgs::PoseStamped_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<geometry_msgs::PoseStamped_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::Impl::start()0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::Impl::getMsg()0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<geometry_msgs::PoseStamped_<std::allocator<void> > const>)> const&)0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::Impl::~Impl().20
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::HwApiStatus_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::HwApiAltitude_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::EstimatorInput_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::Float64Stamped_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::TrackerCommand_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::ImplThreadsafe::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::EstimatorOutput_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::Impl::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::HwApiRcChannels_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::ObstacleSectors_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::ImplThreadsafe::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::FutureTrajectory_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::Impl::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::Impl::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::HwApiCapabilities_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::DynamicsConstraints_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::ImplThreadsafe::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::Impl::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::TrajectoryReference_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::ImplThreadsafe::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::TrajectoryReference_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::TrajectoryReference_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::Impl::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::Impl::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::Impl::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::Impl::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::Impl::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::Impl::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::Impl::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::ImplThreadsafe::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::Path_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::Impl::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::ImplThreadsafe::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::Impl::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<std_msgs::Float64_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::Impl::hasMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::Impl::peekMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::Impl::hasMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::Impl::peekMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::Impl::hasMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::Impl::peekMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::Impl::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::Impl::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::Impl::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::Impl::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::Impl::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::Impl::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::Impl::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::Impl::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::Impl::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::Impl::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::Impl::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::Impl::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::Impl::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::Impl::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::Impl::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::Impl::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::Impl::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::Impl::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::Impl::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::Impl::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::Impl::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::Impl::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::Impl::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::Impl::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::Impl::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::Path_<std::allocator<void> > const> const&)1
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::Path_<std::allocator<void> > const> const&)1
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const1
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::ImplThreadsafe::stop()5
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::Impl::stop()5
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::getMsg()5
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::Impl::getMsg()5
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const5
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::Impl::lastMsgTime() const5
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const5
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::Impl::peekMsg() const5
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const6
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::Impl::hasMsg() const6
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)8
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::ImplThreadsafe::start()9
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>)> const&)9
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()9
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().29
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::Impl::start()9
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>)> const&)9
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::Impl::~Impl().29
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const9
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::ImplThreadsafe::start()10
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::FutureTrajectory_<std::allocator<void> > const>)> const&)10
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()10
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().210
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::Impl::start()10
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::FutureTrajectory_<std::allocator<void> > const>)> const&)10
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::Impl::~Impl().210
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::start()10
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > const>)> const&)10
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()10
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().210
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::Impl::start()10
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > const>)> const&)10
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::Impl::~Impl().210
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const10
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const10
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const16
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::Impl::hasMsg() const16
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::ImplThreadsafe::getMsg()22
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::Impl::getMsg()22
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const22
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::Impl::peekMsg() const22
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::ImplThreadsafe::start()31
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<sensor_msgs::Imu_<std::allocator<void> > const>)> const&)31
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()31
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().231
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::Impl::start()31
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<sensor_msgs::Imu_<std::allocator<void> > const>)> const&)31
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::Impl::~Impl().231
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::start()31
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > const>)> const&)31
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()31
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().231
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::Impl::start()31
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > const>)> const&)31
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::Impl::~Impl().231
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::start()31
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > const>)> const&)31
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()31
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().231
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::Impl::start()31
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > const>)> const&)31
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::Impl::~Impl().231
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const31
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const31
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const31
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const87
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::Impl::lastMsgTime() const87
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const87
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::Impl::lastMsgTime() const87
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::ImplThreadsafe::getMsg()89
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::Impl::getMsg()89
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const89
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const89
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::Impl::hasMsg() const89
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::Impl::peekMsg() const89
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::ImplThreadsafe::start()91
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::HwApiRcChannels_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()91
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().291
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::Impl::start()91
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::HwApiRcChannels_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::Impl::~Impl().291
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::ImplThreadsafe::start()91
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::ObstacleSectors_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()91
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().291
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::Impl::start()91
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::ObstacleSectors_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::Impl::~Impl().291
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::start()91
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()91
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().291
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::Impl::start()91
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::Impl::~Impl().291
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::ImplThreadsafe::start()91
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::DynamicsConstraints_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()91
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().291
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::Impl::start()91
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::DynamicsConstraints_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::Impl::~Impl().291
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::ImplThreadsafe::start()91
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()91
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().291
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::Impl::start()91
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::Impl::~Impl().291
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::ImplThreadsafe::start()91
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::TrajectoryReference_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()91
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().291
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::Impl::start()91
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::TrajectoryReference_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::Impl::~Impl().291
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::start()91
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()91
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().291
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::Impl::start()91
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::Impl::~Impl().291
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::start()91
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()91
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().291
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::Impl::start()91
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::Impl::~Impl().291
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::start()91
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()91
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().291
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::Impl::start()91
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::Impl::~Impl().291
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::start()91
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()91
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().291
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::Impl::start()91
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::Impl::~Impl().291
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::ImplThreadsafe::start()91
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::Path_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()91
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().291
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::Impl::start()91
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::Path_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::Impl::~Impl().291
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const91
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const91
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const91
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const91
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const91
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const91
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const91
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const91
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const91
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const91
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const91
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const92
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const92
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::Impl::hasMsg() const92
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>)> const&)94
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()94
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().294
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>)> const&)94
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::Impl::~Impl().294
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const95
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::ImplThreadsafe::start()97
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::EstimatorOutput_<std::allocator<void> > const>)> const&)97
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()97
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().297
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::Impl::start()97
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::EstimatorOutput_<std::allocator<void> > const>)> const&)97
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::Impl::~Impl().297
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const97
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::ImplThreadsafe::start()98
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::Impl::start()98
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const105
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const115
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::ImplThreadsafe::start()177
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<sensor_msgs::Range_<std::allocator<void> > const>)> const&)177
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()177
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().2177
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::Impl::start()177
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<sensor_msgs::Range_<std::allocator<void> > const>)> const&)177
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::Impl::~Impl().2177
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const177
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const179
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::Impl::lastMsgTime() const179
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::ImplThreadsafe::start()182
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<sensor_msgs::Joy_<std::allocator<void> > const>)> const&)182
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()182
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().2182
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::Impl::start()182
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<sensor_msgs::Joy_<std::allocator<void> > const>)> const&)182
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::Impl::~Impl().2182
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::ImplThreadsafe::start()182
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::TrackerCommand_<std::allocator<void> > const>)> const&)182
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()182
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().2182
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::Impl::start()182
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::TrackerCommand_<std::allocator<void> > const>)> const&)182
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::Impl::~Impl().2182
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::ImplThreadsafe::start()182
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<std_msgs::Float64_<std::allocator<void> > const>)> const&)182
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()182
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().2182
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::Impl::start()182
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<std_msgs::Float64_<std::allocator<void> > const>)> const&)182
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::Impl::~Impl().2182
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const182
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const182
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const182
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::ImplThreadsafe::start()186
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::HwApiAltitude_<std::allocator<void> > const>)> const&)186
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()186
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().2186
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::Impl::start()186
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::HwApiAltitude_<std::allocator<void> > const>)> const&)186
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::Impl::~Impl().2186
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const186
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::ImplThreadsafe::start()213
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::HwApiStatus_<std::allocator<void> > const>)> const&)213
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()213
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().2213
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::Impl::start()213
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::HwApiStatus_<std::allocator<void> > const>)> const&)213
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::Impl::~Impl().2213
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const213
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::ImplThreadsafe::getMsg()259
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::Impl::getMsg()259
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const259
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::Impl::peekMsg() const259
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::ImplThreadsafe::start()273
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const>)> const&)273
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()273
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().2273
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::Impl::start()273
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const>)> const&)273
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::Impl::~Impl().2273
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const273
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::ImplThreadsafe::start()282
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>)> const&)282
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()282
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().2282
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::Impl::start()282
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>)> const&)282
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::Impl::~Impl().2282
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const283
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::FutureTrajectory_<std::allocator<void> > const> const&)284
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::FutureTrajectory_<std::allocator<void> > const> const&)284
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::ImplThreadsafe::start()295
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>)> const&)295
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()295
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().2295
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::Impl::start()295
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>)> const&)295
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::Impl::~Impl().2295
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const295
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const299
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::Impl::lastMsgTime() const299
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::ImplThreadsafe::start()304
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::HwApiCapabilities_<std::allocator<void> > const>)> const&)304
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()304
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().2304
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::Impl::start()304
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::HwApiCapabilities_<std::allocator<void> > const>)> const&)304
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::Impl::~Impl().2304
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::ImplThreadsafe::start()355
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::EstimatorInput_<std::allocator<void> > const>)> const&)355
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()355
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().2355
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::Impl::start()355
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::EstimatorInput_<std::allocator<void> > const>)> const&)355
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::Impl::~Impl().2355
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const355
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::ImplThreadsafe::start()363
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>)> const&)363
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()363
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().2363
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::Impl::start()363
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>)> const&)363
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::Impl::~Impl().2363
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const363
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::ImplThreadsafe::start()364
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::Float64Stamped_<std::allocator<void> > const>)> const&)364
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()364
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().2364
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::Impl::start()364
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::Float64Stamped_<std::allocator<void> > const>)> const&)364
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::Impl::~Impl().2364
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const364
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::ObstacleSectors_<std::allocator<void> > const> const&)390
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::ObstacleSectors_<std::allocator<void> > const> const&)390
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::ImplThreadsafe::start()395
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > const>)> const&)395
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()395
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().2395
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::Impl::start()395
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > const>)> const&)395
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::Impl::~Impl().2395
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::start()395
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > const>)> const&)395
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()395
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().2395
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::Impl::start()395
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > const>)> const&)395
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::Impl::~Impl().2395
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const395
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const396
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::ImplThreadsafe::getMsg()419
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::Impl::getMsg()419
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const419
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::Impl::peekMsg() const419
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const500
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::ImplThreadsafe::getMsg()546
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::Impl::getMsg()546
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const546
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const546
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::Impl::hasMsg() const546
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::Impl::peekMsg() const546
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::ImplThreadsafe::start()549
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>)> const&)549
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()549
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().2549
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::Impl::start()549
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>)> const&)549
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::Impl::~Impl().2549
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > const> const&)576
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > const> const&)576
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const741
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::ImplThreadsafe::getMsg()792
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::Impl::getMsg()792
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const792
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::Impl::peekMsg() const792
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > const> const&)1599
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > const> const&)1599
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > const> const&)1599
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > const> const&)1599
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > const> const&)1881
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > const> const&)1881
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const2466
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::Impl::hasMsg() const2466
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > const> const&)3112
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > const> const&)3112
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::ImplThreadsafe::getMsg()3736
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::Impl::getMsg()3736
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const3736
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::Impl::peekMsg() const3736
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::HwApiCapabilities_<std::allocator<void> > const> const&)4930
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::HwApiCapabilities_<std::allocator<void> > const> const&)4930
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::ImplThreadsafe::getMsg()9944
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::Impl::getMsg()9944
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const9944
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const9944
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::Impl::hasMsg() const9944
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::Impl::peekMsg() const9944
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const> const&)11804
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const> const&)11824
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::DynamicsConstraints_<std::allocator<void> > const> const&)13774
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::DynamicsConstraints_<std::allocator<void> > const> const&)13774
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::ImplThreadsafe::getMsg()14144
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const14144
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::Impl::peekMsg() const14144
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::Impl::getMsg()14145
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::Impl::hasMsg() const16526
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const16528
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const17825
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::Impl::hasMsg() const17825
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const18488
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::Impl::hasMsg() const18488
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const18685
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::Impl::hasMsg() const18685
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const18705
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::Impl::hasMsg() const18705
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<std_msgs::Float64_<std::allocator<void> > const> const&)19913
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<std_msgs::Float64_<std::allocator<void> > const> const&)19913
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::ImplThreadsafe::getMsg()19916
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::Impl::getMsg()19916
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const19916
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::Impl::peekMsg() const19916
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::HwApiRcChannels_<std::allocator<void> > const> const&)21072
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::HwApiRcChannels_<std::allocator<void> > const> const&)21072
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::ImplThreadsafe::getMsg()34694
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::Impl::getMsg()34694
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const34694
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const34694
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::Impl::lastMsgTime() const34694
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::Impl::peekMsg() const34694
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const41349
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::ImplThreadsafe::getMsg()41350
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::Impl::getMsg()41350
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::Impl::peekMsg() const41350
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const50249
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::Impl::hasMsg() const50249
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<sensor_msgs::Imu_<std::allocator<void> > const> const&)57194
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<sensor_msgs::Imu_<std::allocator<void> > const> const&)57194
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::Impl::hasMsg() const63335
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const63348
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::ImplThreadsafe::getMsg()65453
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const65473
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::Impl::getMsg()65477
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::Impl::peekMsg() const65478
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const68416
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::Impl::hasMsg() const68433
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > const> const&)69353
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > const> const&)69375
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > const> const&)70576
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > const> const&)70747
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > const> const&)129956
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > const> const&)129956
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const141523
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::Impl::hasMsg() const141533
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const142416
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::getMsg()142417
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::Impl::peekMsg() const142417
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::Impl::getMsg()142420
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::ImplThreadsafe::getMsg()162667
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::Impl::getMsg()162667
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const162667
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const162667
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::Impl::hasMsg() const162667
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::Impl::peekMsg() const162667
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const> const&)180929
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const> const&)180936
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const182921
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::Impl::getMsg()183003
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::Impl::peekMsg() const183006
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::ImplThreadsafe::getMsg()183011
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::TrackerCommand_<std::allocator<void> > const> const&)187018
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::TrackerCommand_<std::allocator<void> > const> const&)187053
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::EstimatorOutput_<std::allocator<void> > const> const&)188137
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::EstimatorOutput_<std::allocator<void> > const> const&)188150
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const194033
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::Impl::lastMsgTime() const194033
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::ImplThreadsafe::getMsg()209179
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const209180
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::Impl::peekMsg() const209180
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::Impl::getMsg()209181
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const226566
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::Impl::hasMsg() const226567
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<sensor_msgs::Range_<std::allocator<void> > const> const&)306610
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<sensor_msgs::Range_<std::allocator<void> > const> const&)306690
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::Float64Stamped_<std::allocator<void> > const> const&)309969
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::Float64Stamped_<std::allocator<void> > const> const&)310014
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::HwApiAltitude_<std::allocator<void> > const> const&)322853
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::HwApiAltitude_<std::allocator<void> > const> const&)322905
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::EstimatorInput_<std::allocator<void> > const> const&)328979
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::EstimatorInput_<std::allocator<void> > const> const&)329503
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const> const&)364444
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const> const&)365449
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::Impl::hasMsg() const377487
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const377592
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const382073
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::Impl::getMsg()382124
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::Impl::peekMsg() const382314
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::ImplThreadsafe::getMsg()382342
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const405021
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::Impl::lastMsgTime() const405063
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const> const&)465031
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const> const&)465356
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const> const&)495960
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const> const&)496289
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::Impl::hasMsg() const498933
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const498934
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::Impl::newMsg() const513615
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::ImplThreadsafe::newMsg() const513883
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const> const&)573633
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const> const&)573986
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const699067
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::ImplThreadsafe::getMsg()699072
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::Impl::getMsg()699081
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::Impl::peekMsg() const699130
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::HwApiStatus_<std::allocator<void> > const> const&)896098
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::HwApiStatus_<std::allocator<void> > const> const&)896628
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::Impl::hasMsg() const897184
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const897319
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const> const&)1101738
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const> const&)1102022
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/impl/subscribe_handler.hpp.func.html b/mrs_lib/include/mrs_lib/impl/subscribe_handler.hpp.func.html new file mode 100644 index 0000000000..038f3e12e2 --- /dev/null +++ b/mrs_lib/include/mrs_lib/impl/subscribe_handler.hpp.func.html @@ -0,0 +1,4256 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl/subscribe_handler.hpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/impl - subscribe_handler.hpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:9812081.7 %
Date:2024-04-18 23:11:36Functions:487104446.6 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const> const&)365449
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::ImplThreadsafe::start()363
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::ImplThreadsafe::getMsg()0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>)> const&)363
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()363
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().2363
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const> const&)364444
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::Impl::start()363
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::Impl::getMsg()0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>)> const&)363
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::Impl::~Impl().2363
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<sensor_msgs::Imu_<std::allocator<void> > const> const&)57194
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::ImplThreadsafe::start()31
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::ImplThreadsafe::getMsg()9944
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<sensor_msgs::Imu_<std::allocator<void> > const>)> const&)31
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()31
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().231
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<sensor_msgs::Imu_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<sensor_msgs::Imu_<std::allocator<void> > const> const&)57194
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::Impl::start()31
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::Impl::getMsg()9944
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<sensor_msgs::Imu_<std::allocator<void> > const>)> const&)31
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::Impl::~Impl().231
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<sensor_msgs::Joy_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::ImplThreadsafe::start()182
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::ImplThreadsafe::getMsg()0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<sensor_msgs::Joy_<std::allocator<void> > const>)> const&)182
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()182
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().2182
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<sensor_msgs::Joy_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<sensor_msgs::Joy_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::Impl::start()182
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::Impl::getMsg()0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<sensor_msgs::Joy_<std::allocator<void> > const>)> const&)182
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::Impl::~Impl().2182
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<sensor_msgs::Range_<std::allocator<void> > const> const&)306690
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::ImplThreadsafe::start()177
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::ImplThreadsafe::getMsg()14144
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<sensor_msgs::Range_<std::allocator<void> > const>)> const&)177
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()177
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().2177
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<sensor_msgs::Range_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<sensor_msgs::Range_<std::allocator<void> > const> const&)306610
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::Impl::start()177
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::Impl::getMsg()14145
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<sensor_msgs::Range_<std::allocator<void> > const>)> const&)177
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::Impl::~Impl().2177
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<geometry_msgs::PoseStamped_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::ImplThreadsafe::start()0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::ImplThreadsafe::getMsg()0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<geometry_msgs::PoseStamped_<std::allocator<void> > const>)> const&)0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().20
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<geometry_msgs::PoseStamped_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<geometry_msgs::PoseStamped_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::Impl::start()0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::Impl::getMsg()0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<geometry_msgs::PoseStamped_<std::allocator<void> > const>)> const&)0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::Impl::~Impl().20
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const> const&)180936
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::ImplThreadsafe::stop()5
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::ImplThreadsafe::start()98
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::ImplThreadsafe::getMsg()3736
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>)> const&)94
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()94
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().294
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const> const&)180929
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::Impl::stop()5
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::Impl::start()98
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::Impl::getMsg()3736
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>)> const&)94
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::Impl::~Impl().294
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const> const&)573986
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::ImplThreadsafe::start()295
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::ImplThreadsafe::getMsg()183011
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>)> const&)295
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()295
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().2295
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const> const&)573633
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::Impl::start()295
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::Impl::getMsg()183003
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>)> const&)295
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::Impl::~Impl().2295
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const> const&)1101738
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::ImplThreadsafe::start()549
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::ImplThreadsafe::getMsg()699072
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>)> const&)549
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()549
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().2549
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const> const&)1102022
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)8
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::Impl::start()549
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::Impl::getMsg()699081
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>)> const&)549
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::Impl::~Impl().2549
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::HwApiStatus_<std::allocator<void> > const> const&)896628
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::ImplThreadsafe::start()213
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::ImplThreadsafe::getMsg()259
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::HwApiStatus_<std::allocator<void> > const>)> const&)213
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()213
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().2213
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::HwApiStatus_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::HwApiStatus_<std::allocator<void> > const> const&)896098
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::Impl::start()213
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::Impl::getMsg()259
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::HwApiStatus_<std::allocator<void> > const>)> const&)213
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::Impl::~Impl().2213
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::HwApiAltitude_<std::allocator<void> > const> const&)322853
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::ImplThreadsafe::start()186
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::ImplThreadsafe::getMsg()162667
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::HwApiAltitude_<std::allocator<void> > const>)> const&)186
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()186
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().2186
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::HwApiAltitude_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::HwApiAltitude_<std::allocator<void> > const> const&)322905
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::Impl::start()186
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::Impl::getMsg()162667
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::HwApiAltitude_<std::allocator<void> > const>)> const&)186
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::Impl::~Impl().2186
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::EstimatorInput_<std::allocator<void> > const> const&)329503
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::ImplThreadsafe::start()355
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::ImplThreadsafe::getMsg()382342
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::EstimatorInput_<std::allocator<void> > const>)> const&)355
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()355
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().2355
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::EstimatorInput_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::EstimatorInput_<std::allocator<void> > const> const&)328979
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::Impl::start()355
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::Impl::getMsg()382124
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::EstimatorInput_<std::allocator<void> > const>)> const&)355
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::Impl::~Impl().2355
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::Float64Stamped_<std::allocator<void> > const> const&)310014
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::ImplThreadsafe::start()364
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::ImplThreadsafe::getMsg()41350
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::Float64Stamped_<std::allocator<void> > const>)> const&)364
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()364
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().2364
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::Float64Stamped_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::Float64Stamped_<std::allocator<void> > const> const&)309969
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::Impl::start()364
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::Impl::getMsg()41350
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::Float64Stamped_<std::allocator<void> > const>)> const&)364
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::Impl::~Impl().2364
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::TrackerCommand_<std::allocator<void> > const> const&)187053
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::ImplThreadsafe::start()182
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::ImplThreadsafe::getMsg()792
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::TrackerCommand_<std::allocator<void> > const>)> const&)182
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()182
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().2182
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::TrackerCommand_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::TrackerCommand_<std::allocator<void> > const> const&)187018
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::Impl::start()182
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::Impl::getMsg()792
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::TrackerCommand_<std::allocator<void> > const>)> const&)182
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::Impl::~Impl().2182
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::EstimatorOutput_<std::allocator<void> > const> const&)188150
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::ImplThreadsafe::start()97
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::ImplThreadsafe::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::EstimatorOutput_<std::allocator<void> > const>)> const&)97
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()97
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().297
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::EstimatorOutput_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::EstimatorOutput_<std::allocator<void> > const> const&)188137
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::Impl::start()97
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::Impl::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::EstimatorOutput_<std::allocator<void> > const>)> const&)97
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::Impl::~Impl().297
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::HwApiRcChannels_<std::allocator<void> > const> const&)21072
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::ImplThreadsafe::start()91
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::ImplThreadsafe::getMsg()546
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::HwApiRcChannels_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()91
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().291
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::HwApiRcChannels_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::HwApiRcChannels_<std::allocator<void> > const> const&)21072
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::Impl::start()91
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::Impl::getMsg()546
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::HwApiRcChannels_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::Impl::~Impl().291
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::ObstacleSectors_<std::allocator<void> > const> const&)390
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::ImplThreadsafe::start()91
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::ImplThreadsafe::getMsg()419
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::ObstacleSectors_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()91
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().291
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::ObstacleSectors_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::ObstacleSectors_<std::allocator<void> > const> const&)390
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::Impl::start()91
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::Impl::getMsg()419
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::ObstacleSectors_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::Impl::~Impl().291
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::FutureTrajectory_<std::allocator<void> > const> const&)284
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::ImplThreadsafe::start()10
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::ImplThreadsafe::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::FutureTrajectory_<std::allocator<void> > const>)> const&)10
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()10
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().210
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::FutureTrajectory_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::FutureTrajectory_<std::allocator<void> > const> const&)284
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::Impl::start()10
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::Impl::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::FutureTrajectory_<std::allocator<void> > const>)> const&)10
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::Impl::~Impl().210
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::start()91
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()91
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().291
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::Impl::start()91
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::Impl::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::Impl::~Impl().291
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::HwApiCapabilities_<std::allocator<void> > const> const&)4930
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::ImplThreadsafe::start()304
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::ImplThreadsafe::getMsg()19916
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::HwApiCapabilities_<std::allocator<void> > const>)> const&)304
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()304
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().2304
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::HwApiCapabilities_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::HwApiCapabilities_<std::allocator<void> > const> const&)4930
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::Impl::start()304
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::Impl::getMsg()19916
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::HwApiCapabilities_<std::allocator<void> > const>)> const&)304
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::Impl::~Impl().2304
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::DynamicsConstraints_<std::allocator<void> > const> const&)13774
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::ImplThreadsafe::start()91
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::ImplThreadsafe::getMsg()22
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::DynamicsConstraints_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()91
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().291
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::DynamicsConstraints_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::DynamicsConstraints_<std::allocator<void> > const> const&)13774
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::Impl::start()91
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::Impl::getMsg()22
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::DynamicsConstraints_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::Impl::~Impl().291
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::ImplThreadsafe::start()91
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::ImplThreadsafe::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()91
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().291
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::Impl::start()91
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::Impl::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::Impl::~Impl().291
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::TrajectoryReference_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::ImplThreadsafe::start()91
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::ImplThreadsafe::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::TrajectoryReference_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()91
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().291
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::TrajectoryReference_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::TrajectoryReference_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::Impl::start()91
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::Impl::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::TrajectoryReference_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::Impl::~Impl().291
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > const> const&)129956
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::start()91
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::getMsg()5
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()91
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().291
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > const> const&)129956
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::Impl::start()91
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::Impl::getMsg()5
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::Impl::~Impl().291
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > const> const&)69375
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::ImplThreadsafe::start()395
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::ImplThreadsafe::getMsg()65453
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > const>)> const&)395
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()395
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().2395
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > const> const&)69353
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::Impl::start()395
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::Impl::getMsg()65477
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > const>)> const&)395
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::Impl::~Impl().2395
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > const> const&)1881
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::start()10
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > const>)> const&)10
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()10
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().210
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > const> const&)1881
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::Impl::start()10
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::Impl::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > const>)> const&)10
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::Impl::~Impl().210
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > const> const&)576
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::start()31
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > const>)> const&)31
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()31
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().231
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > const> const&)576
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::Impl::start()31
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::Impl::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > const>)> const&)31
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::Impl::~Impl().231
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > const> const&)1599
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::start()91
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()91
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().291
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > const> const&)1599
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::Impl::start()91
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::Impl::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::Impl::~Impl().291
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > const> const&)3112
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::start()31
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > const>)> const&)31
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()31
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().231
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > const> const&)3112
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::Impl::start()31
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::Impl::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > const>)> const&)31
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::Impl::~Impl().231
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::start()91
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()91
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().291
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::Impl::start()91
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::Impl::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::Impl::~Impl().291
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > const> const&)70747
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::start()395
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::getMsg()142417
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > const>)> const&)395
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()395
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().2395
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > const> const&)70576
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::Impl::start()395
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::Impl::getMsg()142420
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > const>)> const&)395
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::Impl::~Impl().2395
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > const> const&)1599
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::start()91
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()91
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().291
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > const> const&)1599
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::Impl::start()91
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::Impl::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::Impl::~Impl().291
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::Path_<std::allocator<void> > const> const&)1
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::ImplThreadsafe::start()91
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::ImplThreadsafe::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::Path_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()91
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().291
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::Path_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::Path_<std::allocator<void> > const> const&)1
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::Impl::start()91
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::Impl::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::Path_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::Impl::~Impl().291
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const> const&)11824
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::ImplThreadsafe::start()9
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::ImplThreadsafe::getMsg()89
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>)> const&)9
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()9
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().29
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const> const&)11804
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::Impl::start()9
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::Impl::getMsg()89
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>)> const&)9
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::Impl::~Impl().29
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const> const&)465356
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::ImplThreadsafe::start()273
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::ImplThreadsafe::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const>)> const&)273
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()273
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().2273
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const> const&)465031
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::Impl::start()273
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::Impl::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const>)> const&)273
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::Impl::~Impl().2273
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const> const&)496289
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::ImplThreadsafe::start()282
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::ImplThreadsafe::getMsg()209179
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>)> const&)282
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()282
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().2282
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const> const&)495960
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::Impl::start()282
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::Impl::getMsg()209181
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>)> const&)282
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::Impl::~Impl().2282
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::ImplThreadsafe::data_callback(boost::shared_ptr<std_msgs::Float64_<std::allocator<void> > const> const&)19913
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::ImplThreadsafe::stop()0
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::ImplThreadsafe::start()182
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::ImplThreadsafe::getMsg()34694
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::ImplThreadsafe::ImplThreadsafe(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<std_msgs::Float64_<std::allocator<void> > const>)> const&)182
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe()182
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::ImplThreadsafe::~ImplThreadsafe().2182
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::Impl::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::Impl::data_callback(boost::shared_ptr<std_msgs::Float64_<std::allocator<void> > const> const&)0
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::Impl::process_new_message(boost::shared_ptr<std_msgs::Float64_<std::allocator<void> > const> const&)19913
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::Impl::default_timeout_callback(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)0
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::Impl::stop()0
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::Impl::start()182
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::Impl::getMsg()34694
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::Impl::Impl(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<std_msgs::Float64_<std::allocator<void> > const>)> const&)182
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::Impl::~Impl()0
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::Impl::~Impl().2182
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::Impl::hasMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::Impl::peekMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const363
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const9944
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const9944
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::Impl::hasMsg() const9944
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::Impl::peekMsg() const9944
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const31
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::Impl::hasMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::Impl::peekMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const182
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const17825
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const14144
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::Impl::hasMsg() const17825
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::Impl::peekMsg() const14144
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const177
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::Impl::hasMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::Impl::peekMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const5
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const16528
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const3736
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::Impl::lastMsgTime() const5
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::Impl::hasMsg() const16526
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::Impl::peekMsg() const3736
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const95
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const377592
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const182921
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::Impl::hasMsg() const377487
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::Impl::peekMsg() const183006
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const295
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const897319
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const699067
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const115
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::Impl::hasMsg() const897184
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::Impl::peekMsg() const699130
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const741
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const179
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const18685
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const259
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::Impl::lastMsgTime() const179
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::Impl::hasMsg() const18685
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::Impl::peekMsg() const259
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const213
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const162667
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const162667
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::Impl::hasMsg() const162667
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::Impl::peekMsg() const162667
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const186
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const405021
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::ImplThreadsafe::newMsg() const513883
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const382073
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::Impl::lastMsgTime() const405063
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::Impl::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::Impl::newMsg() const513615
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::Impl::peekMsg() const382314
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const355
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const63348
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const41349
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::Impl::hasMsg() const63335
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::Impl::peekMsg() const41350
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const364
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const16
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const792
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::Impl::hasMsg() const16
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::Impl::peekMsg() const792
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const182
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::Impl::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::Impl::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const97
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const546
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const546
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::Impl::hasMsg() const546
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::Impl::peekMsg() const546
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const91
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const299
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const2466
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const419
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::Impl::lastMsgTime() const299
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::Impl::hasMsg() const2466
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::Impl::peekMsg() const419
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const91
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::Impl::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::Impl::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const10
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::Impl::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::Impl::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const91
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const18705
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const19916
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const92
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::Impl::hasMsg() const18705
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::Impl::peekMsg() const19916
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const396
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const6
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const22
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::Impl::hasMsg() const6
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::Impl::peekMsg() const22
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const91
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::Impl::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::Impl::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const91
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::Impl::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::Impl::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const91
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const92
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const5
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::Impl::hasMsg() const92
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::Impl::peekMsg() const5
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const91
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const68416
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const65473
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::Impl::hasMsg() const68433
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::Impl::peekMsg() const65478
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const395
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::Impl::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::Impl::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const10
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const18488
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::Impl::hasMsg() const18488
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::Impl::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const31
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const87
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::Impl::lastMsgTime() const87
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::Impl::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::Impl::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const91
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::Impl::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::Impl::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const31
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::Impl::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::Impl::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const91
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const141523
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const142416
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const105
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::Impl::hasMsg() const141533
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::Impl::peekMsg() const142417
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const500
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const87
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::Impl::lastMsgTime() const87
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::Impl::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::Impl::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const91
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::Impl::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::Impl::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const91
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const89
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const89
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::Impl::hasMsg() const89
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::Impl::peekMsg() const89
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const9
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const194033
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const226566
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::Impl::lastMsgTime() const194033
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::Impl::hasMsg() const226567
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::Impl::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const273
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const498934
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const209180
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const1
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::Impl::lastMsgTime() const0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::Impl::hasMsg() const498933
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::Impl::peekMsg() const209180
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const283
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::ImplThreadsafe::lastMsgTime() const34694
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::ImplThreadsafe::hasMsg() const50249
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::ImplThreadsafe::newMsg() const0
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::ImplThreadsafe::peekMsg() const34694
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::ImplThreadsafe::usedMsg() const0
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::ImplThreadsafe::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::Impl::lastMsgTime() const34694
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::Impl::hasMsg() const50249
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::Impl::newMsg() const0
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::Impl::peekMsg() const34694
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::Impl::usedMsg() const0
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::Impl::topicName[abi:cxx11]() const182
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/impl/subscribe_handler.hpp.gcov.frameset.html b/mrs_lib/include/mrs_lib/impl/subscribe_handler.hpp.gcov.frameset.html new file mode 100644 index 0000000000..19a3af8db0 --- /dev/null +++ b/mrs_lib/include/mrs_lib/impl/subscribe_handler.hpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl/subscribe_handler.hpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/include/mrs_lib/impl/subscribe_handler.hpp.gcov.html b/mrs_lib/include/mrs_lib/impl/subscribe_handler.hpp.gcov.html new file mode 100644 index 0000000000..2bc7363392 --- /dev/null +++ b/mrs_lib/include/mrs_lib/impl/subscribe_handler.hpp.gcov.html @@ -0,0 +1,413 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl/subscribe_handler.hpp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/impl - subscribe_handler.hpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:9812081.7 %
Date:2024-04-18 23:11:36Functions:487104446.6 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : // clang: MatousFormat
+       2             : 
+       3             : #ifndef SUBSCRIBE_HANDLER_HPP
+       4             : #define SUBSCRIBE_HANDLER_HPP
+       5             : 
+       6             : #include <mrs_lib/subscribe_handler.h>
+       7             : #include <mrs_lib/timer.h>
+       8             : #include <mutex>
+       9             : #include <condition_variable>
+      10             : 
+      11             : namespace mrs_lib
+      12             : {
+      13             :   /* SubscribeHandler::Impl class //{ */
+      14             :   // implements the constructor, getMsg() method and data_callback method (non-thread-safe)
+      15             :   template <typename MessageType>
+      16             :   class SubscribeHandler<MessageType>::Impl
+      17             :   {
+      18             :   public:
+      19             :     using timeout_callback_t = typename SubscribeHandler<MessageType>::timeout_callback_t;
+      20             :     using message_callback_t = typename SubscribeHandler<MessageType>::message_callback_t;
+      21             :     using data_callback_t = std::function<void(const typename MessageType::ConstPtr&)>;
+      22             : 
+      23             :   private:
+      24             :     friend class SubscribeHandler<MessageType>;
+      25             : 
+      26             :   public:
+      27             :     /* constructor //{ */
+      28        6011 :     Impl(const SubscribeHandlerOptions& options, const message_callback_t& message_callback = message_callback_t())
+      29        6011 :         : m_nh(options.nh),
+      30        6011 :           m_topic_name(options.topic_name),
+      31        6011 :           m_node_name(options.node_name),
+      32             :           m_got_data(false),
+      33             :           m_new_data(false),
+      34             :           m_used_data(false),
+      35        6011 :           m_timeout_manager(options.timeout_manager),
+      36             :           m_latest_message_time(0),
+      37             :           m_latest_message(nullptr),
+      38             :           m_message_callback(message_callback),
+      39        6011 :           m_queue_size(options.queue_size),
+      40        6011 :           m_transport_hints(options.transport_hints)
+      41             :     {
+      42        6011 :       if (options.no_message_timeout != mrs_lib::no_timeout)
+      43             :       {
+      44             :         // initialize a new TimeoutManager if not provided by the user
+      45          77 :         if (!m_timeout_manager)
+      46          77 :           m_timeout_manager = std::make_shared<mrs_lib::TimeoutManager>(m_nh, ros::Rate(2.0/options.no_message_timeout.toSec()));
+      47             : 
+      48             :         // initialize the callback for the TimeoutManager
+      49         154 :         std::function<void(const ros::Time&)> timeout_mgr_callback;
+      50          77 :         if (options.timeout_callback)
+      51           1 :           timeout_mgr_callback = std::bind(options.timeout_callback, topicName(), std::placeholders::_1);
+      52             :         else
+      53          76 :           timeout_mgr_callback = std::bind(&Impl::default_timeout_callback, this, topicName(), std::placeholders::_1);
+      54             : 
+      55             :         // register the timeout callback with the TimeoutManager
+      56          77 :         m_timeout_id = m_timeout_manager->registerNew(options.no_message_timeout, timeout_mgr_callback);
+      57             :       }
+      58             : 
+      59       18033 :       const std::string msg = "Subscribed to topic '" + m_topic_name + "' -> '" + topicName() + "'";
+      60        6011 :       if (m_node_name.empty())
+      61           1 :         ROS_INFO_STREAM(msg);
+      62             :       else
+      63        6010 :         ROS_INFO_STREAM("[" << m_node_name << "]: " << msg);
+      64        6011 :     }
+      65             :     //}
+      66             : 
+      67        6011 :     virtual ~Impl() = default;
+      68             : 
+      69             :   public:
+      70             :     /* getMsg() method //{ */
+      71     1969870 :     virtual typename MessageType::ConstPtr getMsg()
+      72             :     {
+      73     1969870 :       m_new_data = false;
+      74     1969870 :       m_used_data = true;
+      75     1969870 :       return peekMsg();
+      76             :     }
+      77             :     //}
+      78             : 
+      79             :     /* peekMsg() method //{ */
+      80     1970108 :     virtual typename MessageType::ConstPtr peekMsg() const
+      81             :     {
+      82             :       /* assert(m_got_data); */
+      83             :       /* if (!m_got_data) */
+      84             :       /*   ROS_ERROR("[%s]: No data received yet from topic '%s' (forgot to check hasMsg()?)! Returning empty message.", m_node_name.c_str(), */
+      85             :       /*             topicName().c_str()); */
+      86     1970108 :       return m_latest_message;
+      87             :     }
+      88             :     //}
+      89             : 
+      90             :     /* hasMsg() method //{ */
+      91     2589776 :     virtual bool hasMsg() const
+      92             :     {
+      93     2589776 :       return m_got_data;
+      94             :     }
+      95             :     //}
+      96             : 
+      97             :     /* newMsg() method //{ */
+      98      513615 :     virtual bool newMsg() const
+      99             :     {
+     100      513615 :       return m_new_data;
+     101             :     }
+     102             :     //}
+     103             : 
+     104             :     /* usedMsg() method //{ */
+     105           0 :     virtual bool usedMsg() const
+     106             :     {
+     107           0 :       return m_used_data;
+     108             :     }
+     109             :     //}
+     110             : 
+     111             :     /* waitForNew() method //{ */
+     112           0 :     virtual typename MessageType::ConstPtr waitForNew(const ros::WallDuration& timeout)
+     113             :     {
+     114             :       // convert the ros type to chrono type
+     115           0 :       const std::chrono::duration<float> chrono_timeout(timeout.toSec());
+     116             :       // lock the mutex guarding the m_new_data flag
+     117           0 :       std::unique_lock lock(m_new_data_mtx);
+     118             :       // if new data is available, return immediately, otherwise attempt to wait for new data using the respective condition variable
+     119           0 :       if (m_new_data)
+     120           0 :         return getMsg();
+     121           0 :       else if (m_new_data_cv.wait_for(lock, chrono_timeout) == std::cv_status::no_timeout && m_new_data)
+     122           0 :         return getMsg();
+     123             :       else
+     124           0 :         return nullptr;
+     125             :     };
+     126             :     //}
+     127             : 
+     128             :     /* lastMsgTime() method //{ */
+     129      634447 :     virtual ros::Time lastMsgTime() const
+     130             :     {
+     131      634447 :       return m_latest_message_time;
+     132             :     };
+     133             :     //}
+     134             : 
+     135             :     /* topicName() method //{ */
+     136        6402 :     virtual std::string topicName() const
+     137             :     {
+     138        6402 :       std::string ret = m_sub.getTopic();
+     139        6402 :       if (ret.empty())
+     140        6088 :         ret = m_nh.resolveName(m_topic_name);
+     141        6402 :       return ret;
+     142             :     }
+     143             :     //}
+     144             : 
+     145             :     /* start() method //{ */
+     146        6015 :     virtual void start()
+     147             :     {
+     148        6015 :       if (m_timeout_manager)
+     149          81 :         m_timeout_manager->start(m_timeout_id);
+     150        6015 :       m_sub = m_nh.subscribe(m_topic_name, m_queue_size, &Impl::data_callback, this, m_transport_hints);
+     151        6015 :     }
+     152             :     //}
+     153             : 
+     154             :     /* stop() method //{ */
+     155           5 :     virtual void stop()
+     156             :     {
+     157           5 :       if (m_timeout_manager)
+     158           5 :         m_timeout_manager->pause(m_timeout_id);
+     159           5 :       m_sub.shutdown();
+     160           5 :     }
+     161             :     //}
+     162             : 
+     163             :   protected:
+     164             :     ros::NodeHandle m_nh;
+     165             :     ros::Subscriber m_sub;
+     166             : 
+     167             :   protected:
+     168             :     std::string m_topic_name;
+     169             :     std::string m_node_name;
+     170             : 
+     171             :   protected:
+     172             :     bool m_got_data;   // whether any data was received
+     173             : 
+     174             :     mutable std::mutex m_new_data_mtx;
+     175             :     mutable std::condition_variable m_new_data_cv;
+     176             :     bool m_new_data;   // whether new data was received since last call to get_data
+     177             : 
+     178             :     bool m_used_data;  // whether get_data was successfully called at least once
+     179             : 
+     180             :   protected:
+     181             :     std::shared_ptr<mrs_lib::TimeoutManager> m_timeout_manager;
+     182             :     mrs_lib::TimeoutManager::timeout_id_t m_timeout_id;
+     183             : 
+     184             :   protected:
+     185             :     ros::Time m_latest_message_time;
+     186             :     typename MessageType::ConstPtr m_latest_message;
+     187             :     message_callback_t m_message_callback;
+     188             : 
+     189             :   private:
+     190             :     uint32_t m_queue_size;
+     191             :     ros::TransportHints m_transport_hints;
+     192             : 
+     193             :   protected:
+     194             :     /* default_timeout_callback() method //{ */
+     195           8 :     void default_timeout_callback(const std::string& topic_name, const ros::Time& last_msg)
+     196             :     {
+     197           8 :       const ros::Duration since_msg = (ros::Time::now() - last_msg);
+     198           8 :       const auto n_pubs = m_sub.getNumPublishers();
+     199          24 :       const std::string txt = "Did not receive any message from topic '" + topic_name + "' for " + std::to_string(since_msg.toSec()) + "s ("
+     200             :                               + std::to_string(n_pubs) + " publishers on this topic)";
+     201           8 :       if (m_node_name.empty())
+     202           0 :         ROS_WARN_STREAM(txt);
+     203             :       else
+     204           8 :         ROS_WARN_STREAM("[" << m_node_name << "]: " << txt);
+     205           8 :     }
+     206             :     //}
+     207             : 
+     208             :     /* process_new_message() method //{ */
+     209     6129749 :     void process_new_message(const typename MessageType::ConstPtr& msg)
+     210             :     {
+     211     6129749 :       m_latest_message_time = ros::Time::now();
+     212     6135601 :       m_latest_message = msg;
+     213             :       // If the message callback is registered, the new data will immediately be processed,
+     214             :       // so reset the flag. Otherwise, set the flag.
+     215     6131024 :       m_new_data = !m_message_callback;
+     216     6126635 :       m_got_data = true;
+     217     6126635 :       m_new_data_cv.notify_one();
+     218     6134030 :     }
+     219             :     //}
+     220             : 
+     221             :     /* data_callback() method //{ */
+     222           0 :     virtual void data_callback(const typename MessageType::ConstPtr& msg)
+     223             :     {
+     224             :       {
+     225           0 :         std::lock_guard lck(m_new_data_mtx);
+     226           0 :         if (m_timeout_manager)
+     227           0 :           m_timeout_manager->reset(m_timeout_id);
+     228           0 :         process_new_message(msg);
+     229             :       }
+     230             : 
+     231             :       // execute the callback after unlocking the mutex to enable multi-threaded callback execution
+     232           0 :       if (m_message_callback)
+     233           0 :         m_message_callback(msg);
+     234           0 :     }
+     235             :     //}
+     236             :   };
+     237             :   //}
+     238             : 
+     239             :   /* SubscribeHandler_threadsafe class //{ */
+     240             :   template <typename MessageType>
+     241             :   class SubscribeHandler<MessageType>::ImplThreadsafe : public SubscribeHandler<MessageType>::Impl
+     242             :   {
+     243             :   private:
+     244             :     using impl_class_t = SubscribeHandler<MessageType>::Impl;
+     245             : 
+     246             :   public:
+     247             :     using timeout_callback_t = typename impl_class_t::timeout_callback_t;
+     248             :     using message_callback_t = typename impl_class_t::message_callback_t;
+     249             : 
+     250             :     friend class SubscribeHandler<MessageType>;
+     251             : 
+     252             :   public:
+     253        6011 :     ImplThreadsafe(const SubscribeHandlerOptions& options, const message_callback_t& message_callback = message_callback_t())
+     254        6011 :         : impl_class_t::Impl(options, message_callback)
+     255             :     {
+     256        6011 :     }
+     257             : 
+     258             :   public:
+     259     2590004 :     virtual bool hasMsg() const override
+     260             :     {
+     261     5179593 :       std::lock_guard lck(m_mtx);
+     262     5179475 :       return impl_class_t::hasMsg();
+     263             :     }
+     264      513883 :     virtual bool newMsg() const override
+     265             :     {
+     266     1027145 :       std::lock_guard lck(m_mtx);
+     267     1026153 :       return impl_class_t::newMsg();
+     268             :     }
+     269           0 :     virtual bool usedMsg() const override
+     270             :     {
+     271           0 :       std::lock_guard lck(m_mtx);
+     272           0 :       return impl_class_t::usedMsg();
+     273             :     }
+     274     1970057 :     virtual typename MessageType::ConstPtr getMsg() override
+     275             :     {
+     276     3939039 :       std::lock_guard lck(m_mtx);
+     277     3938799 :       return impl_class_t::getMsg();
+     278             :     }
+     279     1969712 :     virtual typename MessageType::ConstPtr peekMsg() const override
+     280             :     {
+     281     3938893 :       std::lock_guard lck(m_mtx);
+     282     3938445 :       return impl_class_t::peekMsg();
+     283             :     }
+     284      634405 :     virtual ros::Time lastMsgTime() const override
+     285             :     {
+     286     1268707 :       std::lock_guard lck(m_mtx);
+     287     1268522 :       return impl_class_t::lastMsgTime();
+     288             :     };
+     289         313 :     virtual std::string topicName() const override
+     290             :     {
+     291         627 :       std::lock_guard lck(m_mtx);
+     292         628 :       return impl_class_t::topicName();
+     293             :     };
+     294        6015 :     virtual void start() override
+     295             :     {
+     296       12030 :       std::lock_guard lck(m_mtx);
+     297       12030 :       return impl_class_t::start();
+     298             :     }
+     299           5 :     virtual void stop() override
+     300             :     {
+     301          10 :       std::lock_guard lck(m_mtx);
+     302          10 :       return impl_class_t::stop();
+     303             :     }
+     304             : 
+     305       12022 :     virtual ~ImplThreadsafe() override = default;
+     306             : 
+     307             :   protected:
+     308     6132872 :     virtual void data_callback(const typename MessageType::ConstPtr& msg) override
+     309             :     {
+     310             :       {
+     311    12264298 :         std::scoped_lock lck(m_mtx, this->m_new_data_mtx);
+     312     6113227 :         if (this->m_timeout_manager)
+     313      148813 :           this->m_timeout_manager->reset(this->m_timeout_id);
+     314     6081976 :         impl_class_t::process_new_message(msg);
+     315             :       }
+     316             : 
+     317             :       // execute the callback after unlocking the mutex to enable multi-threaded callback execution
+     318     6114818 :       if (this->m_message_callback)
+     319     3407939 :         impl_class_t::m_message_callback(msg);
+     320     6106183 :     }
+     321             : 
+     322             :   private:
+     323             :     mutable std::recursive_mutex m_mtx;
+     324             :   };
+     325             :   //}
+     326             : 
+     327             : }  // namespace mrs_lib
+     328             : 
+     329             : #endif  // SUBSCRIBE_HANDLER_HPP
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/impl/subscribe_handler.hpp.gcov.overview.html b/mrs_lib/include/mrs_lib/impl/subscribe_handler.hpp.gcov.overview.html new file mode 100644 index 0000000000..02a4b3f18a --- /dev/null +++ b/mrs_lib/include/mrs_lib/impl/subscribe_handler.hpp.gcov.overview.html @@ -0,0 +1,103 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl/subscribe_handler.hpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/include/mrs_lib/impl/subscribe_handler.hpp.gcov.png b/mrs_lib/include/mrs_lib/impl/subscribe_handler.hpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..039a0b123a5be30b6b86ab27f511bc7c3edec5e5 GIT binary patch literal 1372 zcmV-i1*7_jP)PbXF zRA_$hj4@iQ$tY%%8HH^zS zW6cEpSWW-;D~SoWLPH?$vi4?$WWPqq&<)@QNwyBXCKhLurC>WWYYu4IJlu$ zh0YNwZba1sMI@ur1}1BoodzD`chMU0CaKq2J9ixq7b9FNBgj=2+oknPWgKADO5G|$ z>eIT=*2XV9fVDuGImIaQ6XuE50Sgsx4$L#=nuacVL?du^pqon%e$h)2Vvk6+u8nZs zjx+Zqpu{l^MF&#YAg*mDmw38zD>niv>=>g1Y{)AkW3Alcmgy#!WyFrOy_0myUJ6_8 zl??RO5dbY8Iw~0t^PG{`_6CpnB$bS^2Cw5*r3_Ao`HaTz5^*V>WB}_WkzB(11Pgh{ zwF5T;n+?!GY1~KxbH>ImZg*A98Oz(|zj=OvdFBhi?Y8gxW8d$`m;bmC z;{ZOWe`|ra9q8@cD{_kOGtV@Bl6jIsJAQnWUo^@@-Ue2%Sn>~9-!O~45hB|+0PhF# zktMx@bVJXyga{Yj1HtF|Ka}ySkF8iDdwn{0W;U4X8z7{D=D(l^)j;B_@EHb zdvD;*W_H=wUCK(Siv5XYk4v0A>u)c6({-u&<7$5~OX^|8?%vajS5_rekW=7_^&h}#8KHO$DWFb9 z$XyNU*`aiHp)yKF7hT|1BiGss3zUS?X)AYbSqF9y1t0^&LcR*`syj6#D~ zhi2rCwpMspEJoTa1-O{QlrW!JDi?GDnS1Zsr*&W)k!5&&My;fM5F zeG#ZYx^-W(*vofU8BnJ+I>@2Ysb?|(H`@!F)+e#Ysy5BPqfC2-M0L=$XGmpp<+ixJ zJ{B26<*ex|2(_txg=g5~eRQwlBg&BXq}0lwBaMNTKB5fS+!vmG3=bf_rVLe7D3!6- zDyl}nw<|-RO6iwo_M+4$lzEx8c%XPp4|e2A-Nr6TAaV4>F{tgYn#RyYn&o;lW?FG= zwXUZO!Ft0ayWtv&90CDPudjtwT&FZWxrWM&fbYm3<;_%-^cyno{9aucTl%v9o+2CG eIJickaQ^@zmyh{xOPAyT0000 + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl/timer.hpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/impl - timer.hpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:141687.5 %
Date:2024-04-18 23:11:36Functions:33100.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::ThreadTimer::ThreadTimer<obj_t>(ros::NodeHandle const&, ros::Rate const&, void (obj_t::*)(ros::TimerEvent const&), obj_t*, bool, bool)8
mrs_lib::ThreadTimer::ThreadTimer<obj_t>(ros::NodeHandle const&, ros::Duration const&, void (obj_t::*)(ros::TimerEvent const&), obj_t*, bool, bool)8
mrs_lib::ROSTimer::ROSTimer<obj_t>(ros::NodeHandle const&, ros::Rate const&, void (obj_t::*)(ros::TimerEvent const&), obj_t*, bool, bool)8
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/impl/timer.hpp.func.html b/mrs_lib/include/mrs_lib/impl/timer.hpp.func.html new file mode 100644 index 0000000000..0ee0a5ed9e --- /dev/null +++ b/mrs_lib/include/mrs_lib/impl/timer.hpp.func.html @@ -0,0 +1,92 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl/timer.hpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/impl - timer.hpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:141687.5 %
Date:2024-04-18 23:11:36Functions:33100.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::ThreadTimer::ThreadTimer<obj_t>(ros::NodeHandle const&, ros::Rate const&, void (obj_t::*)(ros::TimerEvent const&), obj_t*, bool, bool)8
mrs_lib::ThreadTimer::ThreadTimer<obj_t>(ros::NodeHandle const&, ros::Duration const&, void (obj_t::*)(ros::TimerEvent const&), obj_t*, bool, bool)8
mrs_lib::ROSTimer::ROSTimer<obj_t>(ros::NodeHandle const&, ros::Rate const&, void (obj_t::*)(ros::TimerEvent const&), obj_t*, bool, bool)8
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/impl/timer.hpp.gcov.frameset.html b/mrs_lib/include/mrs_lib/impl/timer.hpp.gcov.frameset.html new file mode 100644 index 0000000000..25b7f54de2 --- /dev/null +++ b/mrs_lib/include/mrs_lib/impl/timer.hpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl/timer.hpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/include/mrs_lib/impl/timer.hpp.gcov.html b/mrs_lib/include/mrs_lib/impl/timer.hpp.gcov.html new file mode 100644 index 0000000000..484a5cde84 --- /dev/null +++ b/mrs_lib/include/mrs_lib/impl/timer.hpp.gcov.html @@ -0,0 +1,180 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl/timer.hpp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/impl - timer.hpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:141687.5 %
Date:2024-04-18 23:11:36Functions:33100.0 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : #ifndef MRS_TIMER_HPP
+       2             : #define MRS_TIMER_HPP
+       3             : 
+       4             : // | ------------------------ ROSTimer ------------------------ |
+       5             : 
+       6             : /* ROSTimer constructors //{ */
+       7             : 
+       8             : // duration + oneshot + autostart
+       9             : #include <chrono>
+      10             : #include <mutex>
+      11             : template <class ObjectType>
+      12             : ROSTimer::ROSTimer(const ros::NodeHandle& nh, const ros::Duration& duration, void (ObjectType::*const callback)(const ros::TimerEvent&),
+      13             :                    ObjectType* const obj, const bool oneshot, const bool autostart) {
+      14             : 
+      15             :   this->timer_ = std::make_unique<ros::Timer>(nh.createTimer(duration, callback, obj, oneshot, autostart));
+      16             : }
+      17             : 
+      18             : // rate + oneshot + autostart
+      19             : template <class ObjectType>
+      20           8 : ROSTimer::ROSTimer(const ros::NodeHandle& nh, const ros::Rate& rate, void (ObjectType::*const callback)(const ros::TimerEvent&), ObjectType* const obj,
+      21           8 :                    const bool oneshot, const bool autostart) {
+      22             : 
+      23           8 :   this->timer_ = std::make_unique<ros::Timer>(nh.createTimer(rate, callback, obj, oneshot, autostart));
+      24           8 : }
+      25             : 
+      26             : //}
+      27             : 
+      28             : // | ----------------------- ThreadTimer ---------------------- |
+      29             : 
+      30             : /* class ThreadTimer::Impl //{ */
+      31             : 
+      32             : class ThreadTimer::Impl {
+      33             : public:
+      34             :   Impl(const std::function<void(const ros::TimerEvent&)>& callback, const ros::Duration& delay_dur, const bool oneshot);
+      35             :   ~Impl();
+      36             : 
+      37             :   void start();
+      38             :   void stop();
+      39             :   void setPeriod(const ros::Duration& duration, const bool reset = true);
+      40             :   void setCallback(const std::function<void(const ros::TimerEvent&)>& callback);
+      41             : 
+      42             :   friend class ThreadTimer;
+      43             : 
+      44             :   // to keep rule of five since we have a custom destructor
+      45             :   Impl(const Impl&) = delete;
+      46             :   Impl(Impl&&) = delete;
+      47             :   Impl& operator=(const Impl&) = delete;
+      48             :   Impl& operator=(Impl&&) = delete;
+      49             : 
+      50             : private:
+      51             :   std::thread thread_;
+      52             :   std::function<void(const ros::TimerEvent&)> callback_;
+      53             : 
+      54             :   bool oneshot_;
+      55             : 
+      56             :   bool breakableSleep(const ros::Time& until);
+      57             :   void threadFcn();
+      58             : 
+      59             :   std::mutex mutex_wakeup_;
+      60             :   std::condition_variable wakeup_cond_;
+      61             :   std::recursive_mutex mutex_state_;
+      62             :   bool running_;
+      63             :   ros::Duration delay_dur_;
+      64             :   bool ending_;
+      65             :   ros::Time next_expected_;
+      66             :   ros::Time last_expected_;
+      67             :   ros::Time last_real_;
+      68             : 
+      69             : };
+      70             : 
+      71             : //}
+      72             : 
+      73             : /* ThreadTimer constructors and destructors//{ */
+      74             : 
+      75             : template <class ObjectType>
+      76           8 : ThreadTimer::ThreadTimer([[maybe_unused]] const ros::NodeHandle& nh, const ros::Rate& rate, void (ObjectType::*const callback)(const ros::TimerEvent&),
+      77             :                          ObjectType* const obj, const bool oneshot, const bool autostart)
+      78           8 :   : ThreadTimer(nh, rate.expectedCycleTime(), callback, obj, oneshot, autostart)
+      79             : {
+      80           8 : }
+      81             : 
+      82             : template <class ObjectType>
+      83           8 : ThreadTimer::ThreadTimer([[maybe_unused]] const ros::NodeHandle& nh, const ros::Duration& duration,
+      84           8 :                          void (ObjectType::*const callback)(const ros::TimerEvent&), ObjectType* const obj, bool oneshot, const bool autostart) 
+      85             : {
+      86           8 :   const auto cbk = std::bind(callback, obj, std::placeholders::_1);
+      87           8 :   if (duration == ros::Duration(0))
+      88           0 :     oneshot = true;
+      89           8 :   this->impl_ = std::make_unique<Impl>(cbk, duration, oneshot);
+      90           8 :   if (autostart)
+      91           0 :     this->impl_->start();
+      92           8 : }
+      93             : 
+      94             : //}
+      95             : 
+      96             : #endif  // MRS_TIMER_HPP
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/impl/timer.hpp.gcov.overview.html b/mrs_lib/include/mrs_lib/impl/timer.hpp.gcov.overview.html new file mode 100644 index 0000000000..fcb66ffefa --- /dev/null +++ b/mrs_lib/include/mrs_lib/impl/timer.hpp.gcov.overview.html @@ -0,0 +1,44 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl/timer.hpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/include/mrs_lib/impl/timer.hpp.gcov.png b/mrs_lib/include/mrs_lib/impl/timer.hpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..5eaff0c12ba0f0ee0c40adf9de476fcd7273979a GIT binary patch literal 532 zcmV+v0_**WP)WYG+H!gJy;wixEWkN+2HI)NNz7^h?e(6ei$EBmECa$YZdPbo z&&?9qN!l`6XNE9?C@%|f+=+O+hxoa^dC8|ovlXdJZ8P5Mb^}htY{=^O2l4r0f>@&z zs8-G-GtlRs7WS8Q4Naj!VYlL#*dr>O}oC~oA&GPcoS+nZ3=NZ9cU>_BRGE{}RklLXi&dpW;c zBPdq`J%+YgIsodmKUOYNAghxH_$}Pe8ijGBtP>l>ErpzMWuQ`Sl)LSv@r6H4l4sjS zx9^Ei-P+t!q)t6)>`2qi&SnbFW}=WM6nrvUXlj^Fio7N%@i_Cs-1BmH0tK`Cf-@K| zG8cLl(@=qVKn&f+P2+K#=lS`>-!T-NNCQh?%^=ZVsQ0Nei5g|Z{u?uHY__wee90dK WkIr@^1TfP80000 + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl/transformer.hpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/impl - transformer.hpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:556485.9 %
Date:2024-04-18 23:11:36Functions:404883.3 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
std::optional<Eigen::Quaternion<double, 0> > mrs_lib::Transformer::doTransform<Eigen::Quaternion<double, 0> >(Eigen::Quaternion<double, 0> const&, geometry_msgs::TransformStamped_<std::allocator<void> > const&)0
geometry_msgs::Quaternion_<std::allocator<void> > mrs_lib::Transformer::copyChangeFrame<geometry_msgs::Quaternion_<std::allocator<void> > >(geometry_msgs::Quaternion_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)0
geometry_msgs::Vector3Stamped_<std::allocator<void> > mrs_lib::Transformer::copyChangeFrame<geometry_msgs::Vector3Stamped_<std::allocator<void> > >(geometry_msgs::Vector3Stamped_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)0
geometry_msgs::Point_<std::allocator<void> > mrs_lib::Transformer::copyChangeFrame<geometry_msgs::Point_<std::allocator<void> > >(geometry_msgs::Point_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)0
geometry_msgs::Vector3_<std::allocator<void> > mrs_lib::Transformer::copyChangeFrame<geometry_msgs::Vector3_<std::allocator<void> > >(geometry_msgs::Vector3_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)0
cv::Point3_<double> mrs_lib::Transformer::copyChangeFrame<cv::Point3_<double> >(cv::Point3_<double> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)0
Eigen::Quaternion<double, 0> mrs_lib::Transformer::copyChangeFrame<Eigen::Quaternion<double, 0> >(Eigen::Quaternion<double, 0> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)0
void mrs_lib::Transformer::setHeader<geometry_msgs::Vector3Stamped_<std::allocator<void> > >(geometry_msgs::Vector3Stamped_<std::allocator<void> >&, std_msgs::Header_<std::allocator<void> > const&)0
std::optional<cv::Point3_<double> > mrs_lib::Transformer::doTransform<cv::Point3_<double> >(cv::Point3_<double> const&, geometry_msgs::TransformStamped_<std::allocator<void> > const&)1
std::optional<cv::Point3_<double> > mrs_lib::Transformer::transformImpl<cv::Point3_<double> >(geometry_msgs::TransformStamped_<std::allocator<void> > const&, cv::Point3_<double> const&)1
std::optional<geometry_msgs::Quaternion_<std::allocator<void> > > mrs_lib::Transformer::transformSingle<geometry_msgs::Quaternion_<std::allocator<void> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, geometry_msgs::Quaternion_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)1
std::optional<cv::Point3_<double> > mrs_lib::Transformer::transform<cv::Point3_<double> >(cv::Point3_<double> const&, geometry_msgs::TransformStamped_<std::allocator<void> > const&)1
std::optional<Eigen::Quaternion<double, 0> > mrs_lib::Transformer::transformImpl<Eigen::Quaternion<double, 0> >(geometry_msgs::TransformStamped_<std::allocator<void> > const&, Eigen::Quaternion<double, 0> const&)2
std::optional<Eigen::Quaternion<double, 0> > mrs_lib::Transformer::transform<Eigen::Quaternion<double, 0> >(Eigen::Quaternion<double, 0> const&, geometry_msgs::TransformStamped_<std::allocator<void> > const&)2
std::optional<geometry_msgs::Point_<std::allocator<void> > > mrs_lib::Transformer::transform<geometry_msgs::Point_<std::allocator<void> > >(geometry_msgs::Point_<std::allocator<void> > const&, geometry_msgs::TransformStamped_<std::allocator<void> > const&)4
std::optional<geometry_msgs::Quaternion_<std::allocator<void> > > mrs_lib::Transformer::transform<geometry_msgs::Quaternion_<std::allocator<void> > >(geometry_msgs::Quaternion_<std::allocator<void> > const&, geometry_msgs::TransformStamped_<std::allocator<void> > const&)5
std::optional<geometry_msgs::Quaternion_<std::allocator<void> > > mrs_lib::Transformer::doTransform<geometry_msgs::Quaternion_<std::allocator<void> > >(geometry_msgs::Quaternion_<std::allocator<void> > const&, geometry_msgs::TransformStamped_<std::allocator<void> > const&)6
std::optional<geometry_msgs::Quaternion_<std::allocator<void> > > mrs_lib::Transformer::transformImpl<geometry_msgs::Quaternion_<std::allocator<void> > >(geometry_msgs::TransformStamped_<std::allocator<void> > const&, geometry_msgs::Quaternion_<std::allocator<void> > const&)6
std::optional<Eigen::Matrix<double, 3, 1, 0, 3, 1> > mrs_lib::Transformer::transform<Eigen::Matrix<double, 3, 1, 0, 3, 1> >(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, geometry_msgs::TransformStamped_<std::allocator<void> > const&)6
std::optional<geometry_msgs::Point_<std::allocator<void> > > mrs_lib::Transformer::doTransform<geometry_msgs::Point_<std::allocator<void> > >(geometry_msgs::Point_<std::allocator<void> > const&, geometry_msgs::TransformStamped_<std::allocator<void> > const&)16
std::optional<geometry_msgs::Point_<std::allocator<void> > > mrs_lib::Transformer::transformImpl<geometry_msgs::Point_<std::allocator<void> > >(geometry_msgs::TransformStamped_<std::allocator<void> > const&, geometry_msgs::Point_<std::allocator<void> > const&)16
std::optional<geometry_msgs::Vector3_<std::allocator<void> > > mrs_lib::Transformer::doTransform<geometry_msgs::Vector3_<std::allocator<void> > >(geometry_msgs::Vector3_<std::allocator<void> > const&, geometry_msgs::TransformStamped_<std::allocator<void> > const&)18
std::optional<geometry_msgs::Vector3_<std::allocator<void> > > mrs_lib::Transformer::transformImpl<geometry_msgs::Vector3_<std::allocator<void> > >(geometry_msgs::TransformStamped_<std::allocator<void> > const&, geometry_msgs::Vector3_<std::allocator<void> > const&)18
std::optional<geometry_msgs::Vector3Stamped_<std::allocator<void> > > mrs_lib::Transformer::transform<geometry_msgs::Vector3Stamped_<std::allocator<void> > >(geometry_msgs::Vector3Stamped_<std::allocator<void> > const&, geometry_msgs::TransformStamped_<std::allocator<void> > const&)468
std::optional<mrs_msgs::ReferenceStamped_<std::allocator<void> > > mrs_lib::Transformer::transformSingle<mrs_msgs::ReferenceStamped_<std::allocator<void> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, mrs_msgs::ReferenceStamped_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)21311
std::optional<mrs_msgs::ReferenceStamped_<std::allocator<void> > > mrs_lib::Transformer::transformSingle<mrs_msgs::ReferenceStamped_<std::allocator<void> > >(mrs_msgs::ReferenceStamped_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)21311
std_msgs::Header_<std::allocator<void> > mrs_lib::Transformer::getHeader<mrs_msgs::ReferenceStamped_<std::allocator<void> > >(mrs_msgs::ReferenceStamped_<std::allocator<void> > const&)21311
geometry_msgs::PointStamped_<std::allocator<void> > mrs_lib::Transformer::copyChangeFrame<geometry_msgs::PointStamped_<std::allocator<void> > >(geometry_msgs::PointStamped_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)22654
void mrs_lib::Transformer::setHeader<geometry_msgs::PointStamped_<std::allocator<void> > >(geometry_msgs::PointStamped_<std::allocator<void> >&, std_msgs::Header_<std::allocator<void> > const&)22654
std::optional<geometry_msgs::PoseStamped_<std::allocator<void> > > mrs_lib::Transformer::transform<geometry_msgs::PoseStamped_<std::allocator<void> > >(geometry_msgs::PoseStamped_<std::allocator<void> > const&, geometry_msgs::TransformStamped_<std::allocator<void> > const&)87508
std::optional<mrs_msgs::ReferenceStamped_<std::allocator<void> > > mrs_lib::Transformer::transform<mrs_msgs::ReferenceStamped_<std::allocator<void> > >(mrs_msgs::ReferenceStamped_<std::allocator<void> > const&, geometry_msgs::TransformStamped_<std::allocator<void> > const&)88751
geometry_msgs::PoseStamped_<std::allocator<void> > mrs_lib::Transformer::copyChangeFrame<geometry_msgs::PoseStamped_<std::allocator<void> > >(geometry_msgs::PoseStamped_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)152982
void mrs_lib::Transformer::setHeader<geometry_msgs::PoseStamped_<std::allocator<void> > >(geometry_msgs::PoseStamped_<std::allocator<void> >&, std_msgs::Header_<std::allocator<void> > const&)152982
std::optional<geometry_msgs::PointStamped_<std::allocator<void> > > mrs_lib::Transformer::doTransform<geometry_msgs::PointStamped_<std::allocator<void> > >(geometry_msgs::PointStamped_<std::allocator<void> > const&, geometry_msgs::TransformStamped_<std::allocator<void> > const&)207085
std::optional<geometry_msgs::PointStamped_<std::allocator<void> > > mrs_lib::Transformer::transformSingle<geometry_msgs::PointStamped_<std::allocator<void> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, geometry_msgs::PointStamped_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)229491
std::optional<geometry_msgs::PointStamped_<std::allocator<void> > > mrs_lib::Transformer::transformSingle<geometry_msgs::PointStamped_<std::allocator<void> > >(geometry_msgs::PointStamped_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)229727
std::optional<geometry_msgs::PointStamped_<std::allocator<void> > > mrs_lib::Transformer::transformImpl<geometry_msgs::PointStamped_<std::allocator<void> > >(geometry_msgs::TransformStamped_<std::allocator<void> > const&, geometry_msgs::PointStamped_<std::allocator<void> > const&)229739
std_msgs::Header_<std::allocator<void> > mrs_lib::Transformer::getHeader<geometry_msgs::PointStamped_<std::allocator<void> > >(geometry_msgs::PointStamped_<std::allocator<void> > const&)252381
std::optional<geometry_msgs::PoseStamped_<std::allocator<void> > > mrs_lib::Transformer::transformSingle<geometry_msgs::PoseStamped_<std::allocator<void> > >(geometry_msgs::PoseStamped_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)571861
std::optional<geometry_msgs::PoseStamped_<std::allocator<void> > > mrs_lib::Transformer::transformSingle<geometry_msgs::PoseStamped_<std::allocator<void> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, geometry_msgs::PoseStamped_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)572158
std::optional<geometry_msgs::PoseStamped_<std::allocator<void> > > mrs_lib::Transformer::doTransform<geometry_msgs::PoseStamped_<std::allocator<void> > >(geometry_msgs::PoseStamped_<std::allocator<void> > const&, geometry_msgs::TransformStamped_<std::allocator<void> > const&)606171
std::optional<geometry_msgs::Vector3Stamped_<std::allocator<void> > > mrs_lib::Transformer::transformSingle<geometry_msgs::Vector3Stamped_<std::allocator<void> > >(geometry_msgs::Vector3Stamped_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)702425
std::optional<geometry_msgs::Vector3Stamped_<std::allocator<void> > > mrs_lib::Transformer::transformSingle<geometry_msgs::Vector3Stamped_<std::allocator<void> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, geometry_msgs::Vector3Stamped_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)702482
std_msgs::Header_<std::allocator<void> > mrs_lib::Transformer::getHeader<geometry_msgs::Vector3Stamped_<std::allocator<void> > >(geometry_msgs::Vector3Stamped_<std::allocator<void> > const&)702568
std::optional<geometry_msgs::Vector3Stamped_<std::allocator<void> > > mrs_lib::Transformer::doTransform<geometry_msgs::Vector3Stamped_<std::allocator<void> > >(geometry_msgs::Vector3Stamped_<std::allocator<void> > const&, geometry_msgs::TransformStamped_<std::allocator<void> > const&)703072
std::optional<geometry_msgs::Vector3Stamped_<std::allocator<void> > > mrs_lib::Transformer::transformImpl<geometry_msgs::Vector3Stamped_<std::allocator<void> > >(geometry_msgs::TransformStamped_<std::allocator<void> > const&, geometry_msgs::Vector3Stamped_<std::allocator<void> > const&)703072
std_msgs::Header_<std::allocator<void> > mrs_lib::Transformer::getHeader<geometry_msgs::PoseStamped_<std::allocator<void> > >(geometry_msgs::PoseStamped_<std::allocator<void> > const&)725145
std::optional<geometry_msgs::PoseStamped_<std::allocator<void> > > mrs_lib::Transformer::transformImpl<geometry_msgs::PoseStamped_<std::allocator<void> > >(geometry_msgs::TransformStamped_<std::allocator<void> > const&, geometry_msgs::PoseStamped_<std::allocator<void> > const&)759149
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/impl/transformer.hpp.func.html b/mrs_lib/include/mrs_lib/impl/transformer.hpp.func.html new file mode 100644 index 0000000000..cf96ff02d9 --- /dev/null +++ b/mrs_lib/include/mrs_lib/impl/transformer.hpp.func.html @@ -0,0 +1,272 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl/transformer.hpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/impl - transformer.hpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:556485.9 %
Date:2024-04-18 23:11:36Functions:404883.3 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
std::optional<geometry_msgs::Quaternion_<std::allocator<void> > > mrs_lib::Transformer::doTransform<geometry_msgs::Quaternion_<std::allocator<void> > >(geometry_msgs::Quaternion_<std::allocator<void> > const&, geometry_msgs::TransformStamped_<std::allocator<void> > const&)6
std::optional<geometry_msgs::PoseStamped_<std::allocator<void> > > mrs_lib::Transformer::doTransform<geometry_msgs::PoseStamped_<std::allocator<void> > >(geometry_msgs::PoseStamped_<std::allocator<void> > const&, geometry_msgs::TransformStamped_<std::allocator<void> > const&)606171
std::optional<geometry_msgs::PointStamped_<std::allocator<void> > > mrs_lib::Transformer::doTransform<geometry_msgs::PointStamped_<std::allocator<void> > >(geometry_msgs::PointStamped_<std::allocator<void> > const&, geometry_msgs::TransformStamped_<std::allocator<void> > const&)207085
std::optional<geometry_msgs::Vector3Stamped_<std::allocator<void> > > mrs_lib::Transformer::doTransform<geometry_msgs::Vector3Stamped_<std::allocator<void> > >(geometry_msgs::Vector3Stamped_<std::allocator<void> > const&, geometry_msgs::TransformStamped_<std::allocator<void> > const&)703072
std::optional<geometry_msgs::Point_<std::allocator<void> > > mrs_lib::Transformer::doTransform<geometry_msgs::Point_<std::allocator<void> > >(geometry_msgs::Point_<std::allocator<void> > const&, geometry_msgs::TransformStamped_<std::allocator<void> > const&)16
std::optional<geometry_msgs::Vector3_<std::allocator<void> > > mrs_lib::Transformer::doTransform<geometry_msgs::Vector3_<std::allocator<void> > >(geometry_msgs::Vector3_<std::allocator<void> > const&, geometry_msgs::TransformStamped_<std::allocator<void> > const&)18
std::optional<cv::Point3_<double> > mrs_lib::Transformer::doTransform<cv::Point3_<double> >(cv::Point3_<double> const&, geometry_msgs::TransformStamped_<std::allocator<void> > const&)1
std::optional<Eigen::Quaternion<double, 0> > mrs_lib::Transformer::doTransform<Eigen::Quaternion<double, 0> >(Eigen::Quaternion<double, 0> const&, geometry_msgs::TransformStamped_<std::allocator<void> > const&)0
std::optional<geometry_msgs::Quaternion_<std::allocator<void> > > mrs_lib::Transformer::transformImpl<geometry_msgs::Quaternion_<std::allocator<void> > >(geometry_msgs::TransformStamped_<std::allocator<void> > const&, geometry_msgs::Quaternion_<std::allocator<void> > const&)6
std::optional<geometry_msgs::PoseStamped_<std::allocator<void> > > mrs_lib::Transformer::transformImpl<geometry_msgs::PoseStamped_<std::allocator<void> > >(geometry_msgs::TransformStamped_<std::allocator<void> > const&, geometry_msgs::PoseStamped_<std::allocator<void> > const&)759149
std::optional<geometry_msgs::PointStamped_<std::allocator<void> > > mrs_lib::Transformer::transformImpl<geometry_msgs::PointStamped_<std::allocator<void> > >(geometry_msgs::TransformStamped_<std::allocator<void> > const&, geometry_msgs::PointStamped_<std::allocator<void> > const&)229739
std::optional<geometry_msgs::Vector3Stamped_<std::allocator<void> > > mrs_lib::Transformer::transformImpl<geometry_msgs::Vector3Stamped_<std::allocator<void> > >(geometry_msgs::TransformStamped_<std::allocator<void> > const&, geometry_msgs::Vector3Stamped_<std::allocator<void> > const&)703072
std::optional<geometry_msgs::Point_<std::allocator<void> > > mrs_lib::Transformer::transformImpl<geometry_msgs::Point_<std::allocator<void> > >(geometry_msgs::TransformStamped_<std::allocator<void> > const&, geometry_msgs::Point_<std::allocator<void> > const&)16
std::optional<geometry_msgs::Vector3_<std::allocator<void> > > mrs_lib::Transformer::transformImpl<geometry_msgs::Vector3_<std::allocator<void> > >(geometry_msgs::TransformStamped_<std::allocator<void> > const&, geometry_msgs::Vector3_<std::allocator<void> > const&)18
std::optional<cv::Point3_<double> > mrs_lib::Transformer::transformImpl<cv::Point3_<double> >(geometry_msgs::TransformStamped_<std::allocator<void> > const&, cv::Point3_<double> const&)1
std::optional<Eigen::Quaternion<double, 0> > mrs_lib::Transformer::transformImpl<Eigen::Quaternion<double, 0> >(geometry_msgs::TransformStamped_<std::allocator<void> > const&, Eigen::Quaternion<double, 0> const&)2
geometry_msgs::Quaternion_<std::allocator<void> > mrs_lib::Transformer::copyChangeFrame<geometry_msgs::Quaternion_<std::allocator<void> > >(geometry_msgs::Quaternion_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)0
geometry_msgs::PoseStamped_<std::allocator<void> > mrs_lib::Transformer::copyChangeFrame<geometry_msgs::PoseStamped_<std::allocator<void> > >(geometry_msgs::PoseStamped_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)152982
geometry_msgs::PointStamped_<std::allocator<void> > mrs_lib::Transformer::copyChangeFrame<geometry_msgs::PointStamped_<std::allocator<void> > >(geometry_msgs::PointStamped_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)22654
geometry_msgs::Vector3Stamped_<std::allocator<void> > mrs_lib::Transformer::copyChangeFrame<geometry_msgs::Vector3Stamped_<std::allocator<void> > >(geometry_msgs::Vector3Stamped_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)0
geometry_msgs::Point_<std::allocator<void> > mrs_lib::Transformer::copyChangeFrame<geometry_msgs::Point_<std::allocator<void> > >(geometry_msgs::Point_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)0
geometry_msgs::Vector3_<std::allocator<void> > mrs_lib::Transformer::copyChangeFrame<geometry_msgs::Vector3_<std::allocator<void> > >(geometry_msgs::Vector3_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)0
cv::Point3_<double> mrs_lib::Transformer::copyChangeFrame<cv::Point3_<double> >(cv::Point3_<double> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)0
Eigen::Quaternion<double, 0> mrs_lib::Transformer::copyChangeFrame<Eigen::Quaternion<double, 0> >(Eigen::Quaternion<double, 0> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)0
std::optional<geometry_msgs::Quaternion_<std::allocator<void> > > mrs_lib::Transformer::transformSingle<geometry_msgs::Quaternion_<std::allocator<void> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, geometry_msgs::Quaternion_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)1
std::optional<geometry_msgs::PoseStamped_<std::allocator<void> > > mrs_lib::Transformer::transformSingle<geometry_msgs::PoseStamped_<std::allocator<void> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, geometry_msgs::PoseStamped_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)572158
std::optional<geometry_msgs::PoseStamped_<std::allocator<void> > > mrs_lib::Transformer::transformSingle<geometry_msgs::PoseStamped_<std::allocator<void> > >(geometry_msgs::PoseStamped_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)571861
std::optional<geometry_msgs::PointStamped_<std::allocator<void> > > mrs_lib::Transformer::transformSingle<geometry_msgs::PointStamped_<std::allocator<void> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, geometry_msgs::PointStamped_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)229491
std::optional<geometry_msgs::PointStamped_<std::allocator<void> > > mrs_lib::Transformer::transformSingle<geometry_msgs::PointStamped_<std::allocator<void> > >(geometry_msgs::PointStamped_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)229727
std::optional<geometry_msgs::Vector3Stamped_<std::allocator<void> > > mrs_lib::Transformer::transformSingle<geometry_msgs::Vector3Stamped_<std::allocator<void> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, geometry_msgs::Vector3Stamped_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)702482
std::optional<geometry_msgs::Vector3Stamped_<std::allocator<void> > > mrs_lib::Transformer::transformSingle<geometry_msgs::Vector3Stamped_<std::allocator<void> > >(geometry_msgs::Vector3Stamped_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)702425
std::optional<mrs_msgs::ReferenceStamped_<std::allocator<void> > > mrs_lib::Transformer::transformSingle<mrs_msgs::ReferenceStamped_<std::allocator<void> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, mrs_msgs::ReferenceStamped_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)21311
std::optional<mrs_msgs::ReferenceStamped_<std::allocator<void> > > mrs_lib::Transformer::transformSingle<mrs_msgs::ReferenceStamped_<std::allocator<void> > >(mrs_msgs::ReferenceStamped_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)21311
std_msgs::Header_<std::allocator<void> > mrs_lib::Transformer::getHeader<geometry_msgs::PoseStamped_<std::allocator<void> > >(geometry_msgs::PoseStamped_<std::allocator<void> > const&)725145
std_msgs::Header_<std::allocator<void> > mrs_lib::Transformer::getHeader<geometry_msgs::PointStamped_<std::allocator<void> > >(geometry_msgs::PointStamped_<std::allocator<void> > const&)252381
std_msgs::Header_<std::allocator<void> > mrs_lib::Transformer::getHeader<geometry_msgs::Vector3Stamped_<std::allocator<void> > >(geometry_msgs::Vector3Stamped_<std::allocator<void> > const&)702568
std_msgs::Header_<std::allocator<void> > mrs_lib::Transformer::getHeader<mrs_msgs::ReferenceStamped_<std::allocator<void> > >(mrs_msgs::ReferenceStamped_<std::allocator<void> > const&)21311
void mrs_lib::Transformer::setHeader<geometry_msgs::PoseStamped_<std::allocator<void> > >(geometry_msgs::PoseStamped_<std::allocator<void> >&, std_msgs::Header_<std::allocator<void> > const&)152982
void mrs_lib::Transformer::setHeader<geometry_msgs::PointStamped_<std::allocator<void> > >(geometry_msgs::PointStamped_<std::allocator<void> >&, std_msgs::Header_<std::allocator<void> > const&)22654
void mrs_lib::Transformer::setHeader<geometry_msgs::Vector3Stamped_<std::allocator<void> > >(geometry_msgs::Vector3Stamped_<std::allocator<void> >&, std_msgs::Header_<std::allocator<void> > const&)0
std::optional<geometry_msgs::Quaternion_<std::allocator<void> > > mrs_lib::Transformer::transform<geometry_msgs::Quaternion_<std::allocator<void> > >(geometry_msgs::Quaternion_<std::allocator<void> > const&, geometry_msgs::TransformStamped_<std::allocator<void> > const&)5
std::optional<geometry_msgs::PoseStamped_<std::allocator<void> > > mrs_lib::Transformer::transform<geometry_msgs::PoseStamped_<std::allocator<void> > >(geometry_msgs::PoseStamped_<std::allocator<void> > const&, geometry_msgs::TransformStamped_<std::allocator<void> > const&)87508
std::optional<geometry_msgs::Vector3Stamped_<std::allocator<void> > > mrs_lib::Transformer::transform<geometry_msgs::Vector3Stamped_<std::allocator<void> > >(geometry_msgs::Vector3Stamped_<std::allocator<void> > const&, geometry_msgs::TransformStamped_<std::allocator<void> > const&)468
std::optional<geometry_msgs::Point_<std::allocator<void> > > mrs_lib::Transformer::transform<geometry_msgs::Point_<std::allocator<void> > >(geometry_msgs::Point_<std::allocator<void> > const&, geometry_msgs::TransformStamped_<std::allocator<void> > const&)4
std::optional<cv::Point3_<double> > mrs_lib::Transformer::transform<cv::Point3_<double> >(cv::Point3_<double> const&, geometry_msgs::TransformStamped_<std::allocator<void> > const&)1
std::optional<Eigen::Quaternion<double, 0> > mrs_lib::Transformer::transform<Eigen::Quaternion<double, 0> >(Eigen::Quaternion<double, 0> const&, geometry_msgs::TransformStamped_<std::allocator<void> > const&)2
std::optional<Eigen::Matrix<double, 3, 1, 0, 3, 1> > mrs_lib::Transformer::transform<Eigen::Matrix<double, 3, 1, 0, 3, 1> >(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, geometry_msgs::TransformStamped_<std::allocator<void> > const&)6
std::optional<mrs_msgs::ReferenceStamped_<std::allocator<void> > > mrs_lib::Transformer::transform<mrs_msgs::ReferenceStamped_<std::allocator<void> > >(mrs_msgs::ReferenceStamped_<std::allocator<void> > const&, geometry_msgs::TransformStamped_<std::allocator<void> > const&)88751
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/impl/transformer.hpp.gcov.frameset.html b/mrs_lib/include/mrs_lib/impl/transformer.hpp.gcov.frameset.html new file mode 100644 index 0000000000..493a6837a5 --- /dev/null +++ b/mrs_lib/include/mrs_lib/impl/transformer.hpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl/transformer.hpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/include/mrs_lib/impl/transformer.hpp.gcov.html b/mrs_lib/include/mrs_lib/impl/transformer.hpp.gcov.html new file mode 100644 index 0000000000..e06fbc5016 --- /dev/null +++ b/mrs_lib/include/mrs_lib/impl/transformer.hpp.gcov.html @@ -0,0 +1,280 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl/transformer.hpp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/impl - transformer.hpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:556485.9 %
Date:2024-04-18 23:11:36Functions:404883.3 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : #ifndef TRANSFORMER_HPP
+       2             : #define TRANSFORMER_HPP
+       3             : 
+       4             : // clang: MatousFormat
+       5             : 
+       6             : namespace mrs_lib
+       7             : {
+       8             : 
+       9             :   // | --------------------- helper methods --------------------- |
+      10             : 
+      11             :   /* getHeader() overloads for different message types (pointers, pointclouds etc) //{ */
+      12             : 
+      13             :   template <typename msg_t>
+      14     1701405 :   std_msgs::Header Transformer::getHeader(const msg_t& msg)
+      15             :   {
+      16     1701405 :     return msg.header;
+      17             :   }
+      18             : 
+      19             :   template <typename pt_t>
+      20             :   std_msgs::Header Transformer::getHeader(const pcl::PointCloud<pt_t>& cloud)
+      21             :   {
+      22             :     std_msgs::Header ret;
+      23             :     pcl_conversions::fromPCL(cloud.header, ret);
+      24             :     return ret;
+      25             :   }
+      26             : 
+      27             :   //}
+      28             : 
+      29             :   /* setHeader() overloads for different message types (pointers, pointclouds etc) //{ */
+      30             : 
+      31             :   template <typename msg_t>
+      32      175636 :   void Transformer::setHeader(msg_t& msg, const std_msgs::Header& header)
+      33             :   {
+      34      175636 :     msg.header = header;
+      35      175636 :   }
+      36             : 
+      37             :   template <typename pt_t>
+      38             :   void Transformer::setHeader(pcl::PointCloud<pt_t>& cloud, const std_msgs::Header& header)
+      39             :   {
+      40             :     pcl_conversions::toPCL(header, cloud.header);
+      41             :   }
+      42             : 
+      43             :   //}
+      44             : 
+      45             :   /* copyChangeFrame() helper function //{ */
+      46             : 
+      47             :   template <typename T>
+      48      175636 :   T Transformer::copyChangeFrame(const T& what, const std::string& frame_id)
+      49             :   {
+      50      175636 :     T ret = what;
+      51             :     if constexpr (has_header_member_v<T>)
+      52             :     {
+      53      351272 :       std_msgs::Header new_header = getHeader(what);
+      54      175636 :       new_header.frame_id = frame_id;
+      55      175636 :       setHeader(ret, new_header);
+      56             :     }
+      57      175636 :     return ret;
+      58             :   }
+      59             : 
+      60             :   //}
+      61             : 
+      62             :   /* transformImpl() //{ */
+      63             : 
+      64             :   template <class T>
+      65     1692003 :   std::optional<T> Transformer::transformImpl(const geometry_msgs::TransformStamped& tf, const T& what)
+      66             :   {
+      67     3383988 :     const std::string from_frame = frame_from(tf);
+      68     3383968 :     const std::string to_frame = frame_to(tf);
+      69             : 
+      70     1691989 :     if (from_frame == to_frame)
+      71      175636 :       return copyChangeFrame(what, from_frame);
+      72             : 
+      73     3032716 :     const std::string latlon_frame_name = resolveFrameImpl(LATLON_ORIGIN);
+      74             : 
+      75             :     // First, check if the transformation is from/to the latlon frame
+      76             :     // if conversion between UVM and LatLon coordinates is defined for this message, it may be resolved
+      77             :     if constexpr (UTMLL_exists_v<Transformer, T>)
+      78             :     {
+      79             :       // check for transformation from LAT-LON GPS
+      80      813264 :       if (from_frame == latlon_frame_name)
+      81             :       {
+      82           2 :         const std::optional<T> tmp = LLtoUTM(what, getFramePrefix(from_frame));
+      83           2 :         if (!tmp.has_value())
+      84           0 :           return std::nullopt;
+      85           2 :         return doTransform(tmp.value(), tf);
+      86             :       }
+      87             :       // check for transformation to LAT-LON GPS
+      88      813262 :       else if (to_frame == latlon_frame_name)
+      89             :       {
+      90        3834 :         const std::optional<T> tmp = doTransform(what, tf);
+      91        1918 :         if (!tmp.has_value())
+      92           0 :           return std::nullopt;
+      93        1918 :         return UTMtoLL(tmp.value(), getFramePrefix(to_frame));
+      94             :       }
+      95             :     }
+      96             :     else
+      97             :     {
+      98             :       // by default, transformation from/to LATLON is undefined, so return nullopt if it's attempted
+      99      703098 :       if (from_frame == latlon_frame_name || to_frame == latlon_frame_name)
+     100             :       {
+     101           2 :         ROS_ERROR_STREAM_THROTTLE(1.0, "[" << node_name_ << "]: Transformer: cannot transform message of this type (" << typeid(T).name() << ") to/from latitude/longitude coordinates!");
+     102           2 :         return std::nullopt;
+     103             :       }
+     104             :     }
+     105             : 
+     106             :     // otherwise it's just an ol' borin' transformation
+     107     1514443 :     return doTransform(what, tf);
+     108             :   }
+     109             : 
+     110             :   //}
+     111             : 
+     112             :   /* doTransform() //{ */
+     113             : 
+     114             :   template <class T>
+     115     1516369 :   std::optional<T> Transformer::doTransform(const T& what, const geometry_msgs::TransformStamped& tf)
+     116             :   {
+     117             :     try
+     118             :     {
+     119     3032630 :       T result;
+     120     1516343 :       tf2::doTransform(what, result, tf);
+     121     1516343 :       return result;
+     122             :     }
+     123           0 :     catch (tf2::TransformException& ex)
+     124             :     {
+     125           0 :       ROS_WARN_THROTTLE(1.0, "[%s]: Transformer: Error during transform from \"%s\" frame to \"%s\" frame.\n\tMSG: %s", node_name_.c_str(), frame_from(tf).c_str(),
+     126             :                         frame_to(tf).c_str(), ex.what());
+     127           0 :       return std::nullopt;
+     128             :     }
+     129             :   }
+     130             : 
+     131             :   //}
+     132             : 
+     133             :   // | ------------------ user-callable methods ----------------- |
+     134             : 
+     135             :   /* transformSingle() //{ */
+     136             : 
+     137             :   template <class T>
+     138     1525324 :   std::optional<T> Transformer::transformSingle(const T& what, const std::string& to_frame_raw)
+     139             :   {
+     140     3051561 :     const std_msgs::Header orig_header = getHeader(what);
+     141     3051130 :     return transformSingle(orig_header.frame_id, what, to_frame_raw, orig_header.stamp);
+     142             :   }
+     143             : 
+     144             :   template <class T>
+     145     1525443 :   std::optional<T> Transformer::transformSingle(const std::string& from_frame_raw, const T& what, const std::string& to_frame_raw, const ros::Time& time_stamp)
+     146             :   {
+     147     3051666 :     std::scoped_lock lck(mutex_);
+     148             : 
+     149     1526243 :     if (!initialized_)
+     150             :     {
+     151           0 :       ROS_ERROR_THROTTLE(1.0, "[%s]: Transformer: cannot transform, not initialized", node_name_.c_str());
+     152           0 :       return std::nullopt;
+     153             :     }
+     154             : 
+     155     3052446 :     const std::string from_frame = resolveFrameImpl(from_frame_raw);
+     156     3052444 :     const std::string to_frame = resolveFrameImpl(to_frame_raw);
+     157     3052451 :     const std::string latlon_frame = resolveFrameImpl(LATLON_ORIGIN);
+     158             : 
+     159             :     // get the transform
+     160     3052458 :     const auto tf_opt = getTransformImpl(from_frame, to_frame, time_stamp, latlon_frame);
+     161     1526243 :     if (!tf_opt.has_value())
+     162       11008 :       return std::nullopt;
+     163     1515220 :     const geometry_msgs::TransformStamped& tf = tf_opt.value();
+     164             : 
+     165             :     // do the transformation
+     166     3030441 :     const geometry_msgs::TransformStamped tf_resolved = create_transform(from_frame, to_frame, tf.header.stamp, tf.transform);
+     167     1515217 :     return transformImpl(tf_resolved, what);
+     168             :   }
+     169             : 
+     170             :   //}
+     171             : 
+     172             :   /* transform() //{ */
+     173             : 
+     174             :   template <class T>
+     175      176745 :   std::optional<T> Transformer::transform(const T& what, const geometry_msgs::TransformStamped& tf)
+     176             :   {
+     177      353490 :     std::scoped_lock lck(mutex_);
+     178             : 
+     179      176745 :     if (!initialized_)
+     180             :     {
+     181           0 :       ROS_ERROR_THROTTLE(1.0, "[%s]: Transformer: cannot transform, not initialized", node_name_.c_str());
+     182           0 :       return std::nullopt;
+     183             :     }
+     184             : 
+     185      353490 :     const std::string from_frame = resolveFrameImpl(frame_from(tf));
+     186      353490 :     const std::string to_frame = resolveFrameImpl(frame_to(tf));
+     187      353490 :     const geometry_msgs::TransformStamped tf_resolved = create_transform(from_frame, to_frame, tf.header.stamp, tf.transform);
+     188             : 
+     189      176745 :     return transformImpl(tf_resolved, what);
+     190             :   }
+     191             : 
+     192             :   /* //} */
+     193             : 
+     194             : }
+     195             : 
+     196             : #endif // TRANSFORMER_HPP
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/impl/transformer.hpp.gcov.overview.html b/mrs_lib/include/mrs_lib/impl/transformer.hpp.gcov.overview.html new file mode 100644 index 0000000000..d41ec041c1 --- /dev/null +++ b/mrs_lib/include/mrs_lib/impl/transformer.hpp.gcov.overview.html @@ -0,0 +1,69 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl/transformer.hpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/include/mrs_lib/impl/transformer.hpp.gcov.png b/mrs_lib/include/mrs_lib/impl/transformer.hpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..69b889343341273e8bef5883143f2c7f010d788c GIT binary patch literal 841 zcmV-P1GfB$P)0000OP)t-s|NsB0 zs;a7|?_FK${{R500003000620&P%hU00009a7bBm000ie000ie0hKEb8vp5jOU|8 zm6*pKyIQ-hGyRjermXd?hXi>IwazyX3(i%hbuwvthBHOeonQ2N;&1Z0*vxv0FKkHf z5%(@%6Jkt)iC(8wK&8|RuaH^81_j-XL`XACb!)TCz-MUT0~8(uc7t z2&n1{l;yC$h944rBoyxje$Moz+gZ{cokX_i%-BB`h36LxRx~S?roGZWJS3vIIHF)1 z;7`%>dPNxQgNyBy<2XKtldUJgbY5^<-q4+?v7Bz=7KW} z;*t-ooK%pwg$jQ$H)ZJWbR!k~TIMUtUBXOE1poPh4x|Y981eCdGs5VjC|%HGuPM#B z({Ba7s{?qf0l3`(I5wIz%!wm8KJ<<>p6JG=b(RUHOAOQjOc9A4=~?sk1Id2u&9b*` z&GDAvhTuK`|4BFdc`5Ky*uML$5od*&GsiDE7edP;^WyApF2CD*Fkx>u>_x&}Y1jc3 zdH`E0)@E^$;F|us;lbnV7enyq;Ot6A?3{@zMRM)Im12h+hpXLJgEtBQRl4Uw5ESsn zxv)@cow+Ji%Ul_k*r5xjIAiKl9(osJPMT@V#Nk?#TC*Zu!75C{Vnn*v61_YmEFlW9 z|ICIPmBKc?`l{aSxz_A%H7i@Q|JCfDs%F#VqOZ*FW#NO_;^c)s6VB%2|26#qR3G;^ To_s9e00000NkvXXu0mjfg!h-E literal 0 HcmV?d00001 diff --git a/mrs_lib/include/mrs_lib/impl/ukf.hpp.func-sort-c.html b/mrs_lib/include/mrs_lib/impl/ukf.hpp.func-sort-c.html new file mode 100644 index 0000000000..8ccb79abfd --- /dev/null +++ b/mrs_lib/include/mrs_lib/impl/ukf.hpp.func-sort-c.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl/ukf.hpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/impl - ukf.hpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:7710474.0 %
Date:2024-04-18 23:11:36Functions:81266.7 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::UKF<4, 1, 2>::setConstants(double, double, double)0
mrs_lib::UKF<4, 1, 2>::setTransitionModel(std::function<Eigen::Matrix<double, 4, 1, 0, 4, 1> (Eigen::Matrix<double, 4, 1, 0, 4, 1> const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, double)> const&)0
mrs_lib::UKF<4, 1, 2>::setObservationModel(std::function<Eigen::Matrix<double, 2, 1, 0, 2, 1> (Eigen::Matrix<double, 4, 1, 0, 4, 1> const&)> const&)0
mrs_lib::UKF<4, 1, 2>::UKF()0
mrs_lib::UKF<4, 1, 2>::computeWeights()1
mrs_lib::UKF<4, 1, 2>::UKF(std::function<Eigen::Matrix<double, 4, 1, 0, 4, 1> (Eigen::Matrix<double, 4, 1, 0, 4, 1> const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, double)> const&, std::function<Eigen::Matrix<double, 2, 1, 0, 2, 1> (Eigen::Matrix<double, 4, 1, 0, 4, 1> const&)> const&, double, double, double)1
mrs_lib::UKF<4, 1, 2>::computeInverse(Eigen::Matrix<double, 2, 2, 0, 2, 2> const&) const100
mrs_lib::UKF<4, 1, 2>::computeKalmanGain(Eigen::Matrix<double, 4, 1, 0, 4, 1> const&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 4, 2, 0, 4, 2> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&) const100
mrs_lib::UKF<4, 1, 2>::correct(mrs_lib::KalmanFilter<4, 1, 2>::statecov_t const&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&) const100
mrs_lib::UKF<4, 1, 2>::predict(mrs_lib::KalmanFilter<4, 1, 2>::statecov_t const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 4, 4, 0, 4, 4> const&, double) const100
mrs_lib::UKF<4, 1, 2>::computePaSqrt(Eigen::Matrix<double, 4, 4, 0, 4, 4> const&) const200
mrs_lib::UKF<4, 1, 2>::computeSigmas(Eigen::Matrix<double, 4, 1, 0, 4, 1> const&, Eigen::Matrix<double, 4, 4, 0, 4, 4> const&) const200
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/impl/ukf.hpp.func.html b/mrs_lib/include/mrs_lib/impl/ukf.hpp.func.html new file mode 100644 index 0000000000..1f3ab783b7 --- /dev/null +++ b/mrs_lib/include/mrs_lib/impl/ukf.hpp.func.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl/ukf.hpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/impl - ukf.hpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:7710474.0 %
Date:2024-04-18 23:11:36Functions:81266.7 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::UKF<4, 1, 2>::setConstants(double, double, double)0
mrs_lib::UKF<4, 1, 2>::computeWeights()1
mrs_lib::UKF<4, 1, 2>::setTransitionModel(std::function<Eigen::Matrix<double, 4, 1, 0, 4, 1> (Eigen::Matrix<double, 4, 1, 0, 4, 1> const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, double)> const&)0
mrs_lib::UKF<4, 1, 2>::setObservationModel(std::function<Eigen::Matrix<double, 2, 1, 0, 2, 1> (Eigen::Matrix<double, 4, 1, 0, 4, 1> const&)> const&)0
mrs_lib::UKF<4, 1, 2>::UKF(std::function<Eigen::Matrix<double, 4, 1, 0, 4, 1> (Eigen::Matrix<double, 4, 1, 0, 4, 1> const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, double)> const&, std::function<Eigen::Matrix<double, 2, 1, 0, 2, 1> (Eigen::Matrix<double, 4, 1, 0, 4, 1> const&)> const&, double, double, double)1
mrs_lib::UKF<4, 1, 2>::UKF()0
mrs_lib::UKF<4, 1, 2>::computePaSqrt(Eigen::Matrix<double, 4, 4, 0, 4, 4> const&) const200
mrs_lib::UKF<4, 1, 2>::computeSigmas(Eigen::Matrix<double, 4, 1, 0, 4, 1> const&, Eigen::Matrix<double, 4, 4, 0, 4, 4> const&) const200
mrs_lib::UKF<4, 1, 2>::computeInverse(Eigen::Matrix<double, 2, 2, 0, 2, 2> const&) const100
mrs_lib::UKF<4, 1, 2>::computeKalmanGain(Eigen::Matrix<double, 4, 1, 0, 4, 1> const&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 4, 2, 0, 4, 2> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&) const100
mrs_lib::UKF<4, 1, 2>::correct(mrs_lib::KalmanFilter<4, 1, 2>::statecov_t const&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&) const100
mrs_lib::UKF<4, 1, 2>::predict(mrs_lib::KalmanFilter<4, 1, 2>::statecov_t const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 4, 4, 0, 4, 4> const&, double) const100
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/impl/ukf.hpp.gcov.frameset.html b/mrs_lib/include/mrs_lib/impl/ukf.hpp.gcov.frameset.html new file mode 100644 index 0000000000..aac3d90c80 --- /dev/null +++ b/mrs_lib/include/mrs_lib/impl/ukf.hpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl/ukf.hpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/include/mrs_lib/impl/ukf.hpp.gcov.html b/mrs_lib/include/mrs_lib/impl/ukf.hpp.gcov.html new file mode 100644 index 0000000000..501c414df4 --- /dev/null +++ b/mrs_lib/include/mrs_lib/impl/ukf.hpp.gcov.html @@ -0,0 +1,364 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl/ukf.hpp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/impl - ukf.hpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:7710474.0 %
Date:2024-04-18 23:11:36Functions:81266.7 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : // clang: MatousFormat
+       2             : 
+       3             : #ifndef UKF_HPP
+       4             : #define UKF_HPP
+       5             : 
+       6             : /**  \file
+       7             :      \brief Implements UKF - a class implementing the Unscented Kalman Filter.
+       8             :      \author Tomáš Báča - bacatoma@fel.cvut.cz (original implementation)
+       9             :      \author Matouš Vrba - vrbamato@fel.cvut.cz (rewrite, documentation)
+      10             :  */
+      11             : 
+      12             : #include <ros/ros.h>
+      13             : #include <mrs_lib/ukf.h>
+      14             : 
+      15             : namespace mrs_lib
+      16             : {
+      17             :   /* constructor //{ */
+      18             : 
+      19             :   template <int n_states, int n_inputs, int n_measurements>
+      20           0 :   UKF<n_states, n_inputs, n_measurements>::UKF()
+      21             :   {
+      22           0 :   }
+      23             : 
+      24             :   template <int n_states, int n_inputs, int n_measurements>
+      25           1 :   UKF<n_states, n_inputs, n_measurements>::UKF(const transition_model_t& transition_model, const observation_model_t& observation_model, const double alpha, const double kappa, const double beta)
+      26           1 :     : m_alpha(alpha), m_kappa(kappa), m_beta(beta), m_Wm(W_t::Zero()), m_Wc(W_t::Zero()), m_transition_model(transition_model), m_observation_model(observation_model)
+      27             :   {
+      28           1 :     assert(alpha > 0.0);
+      29           1 :     computeWeights();
+      30           1 :   }
+      31             : 
+      32             :   //}
+      33             : 
+      34             :   /* computeWeights() //{ */
+      35             : 
+      36             :   template <int n_states, int n_inputs, int n_measurements>
+      37           1 :   void UKF<n_states, n_inputs, n_measurements>::computeWeights()
+      38             :   {
+      39             :     // initialize lambda
+      40             :     /* m_lambda = double(n) * (m_alpha * m_alpha - 1.0); */
+      41           1 :     m_lambda = m_alpha*m_alpha*(double(n) + m_kappa) - double(n);
+      42             : 
+      43             :     // initialize first terms of the weights
+      44           1 :     m_Wm(0) = m_lambda / (double(n) + m_lambda);
+      45           1 :     m_Wc(0) = m_Wm(0) + (1.0 - m_alpha*m_alpha + m_beta);
+      46             : 
+      47             :     // initialize the rest of the weights
+      48           9 :     for (int i = 1; i < w; i++)
+      49             :     {
+      50           8 :       m_Wm(i) = (1.0 - m_Wm(0))/(w - 1.0);
+      51           8 :       m_Wc(i) = m_Wm(i);
+      52             :     }
+      53           1 :   }
+      54             : 
+      55             :   //}
+      56             : 
+      57             :   /* setConstants() //{ */
+      58             : 
+      59             :   template <int n_states, int n_inputs, int n_measurements>
+      60             :   // update the UKF constants
+      61           0 :   void UKF<n_states, n_inputs, n_measurements>::setConstants(const double alpha, const double kappa, const double beta)
+      62             :   {
+      63           0 :     m_alpha = alpha;
+      64           0 :     m_kappa = kappa;
+      65           0 :     m_beta  = beta;
+      66             : 
+      67           0 :     computeWeights();
+      68           0 :   }
+      69             : 
+      70             :   //}
+      71             : 
+      72             :     /* setTransitionModel() method //{ */
+      73             : 
+      74             :     template <int n_states, int n_inputs, int n_measurements>
+      75           0 :     void UKF<n_states, n_inputs, n_measurements>::setTransitionModel(const transition_model_t& transition_model)
+      76             :     {
+      77           0 :       m_transition_model = transition_model;
+      78           0 :     }
+      79             : 
+      80             :     //}
+      81             : 
+      82             :     /* setObservationModel() method //{ */
+      83             : 
+      84             :     template <int n_states, int n_inputs, int n_measurements>
+      85           0 :     void UKF<n_states, n_inputs, n_measurements>::setObservationModel(const observation_model_t& observation_model)
+      86             :     {
+      87           0 :       m_observation_model = observation_model;
+      88           0 :     }
+      89             : 
+      90             :     //}
+      91             : 
+      92             :   /* computePaSqrt() method //{ */
+      93             :   template <int n_states, int n_inputs, int n_measurements>
+      94         200 :   typename UKF<n_states, n_inputs, n_measurements>::P_t UKF<n_states, n_inputs, n_measurements>::computePaSqrt(const P_t& P) const
+      95             :   {
+      96             :     // calculate the square root of the covariance matrix
+      97         200 :     const P_t Pa = (double(n) + m_lambda)*P;
+      98             : 
+      99             :     /* Eigen::SelfAdjointEigenSolver<P_t> es(Pa); */
+     100         200 :     Eigen::LLT<P_t> llt(Pa);
+     101         200 :     if (llt.info() != Eigen::Success)
+     102             :     {
+     103           0 :       P_t tmp = Pa + (double(n) + m_lambda)*1e-9*P_t::Identity();
+     104           0 :       llt.compute(tmp);
+     105           0 :       if (llt.info() != Eigen::Success)
+     106             :       {
+     107           0 :         ROS_WARN("UKF: taking the square root of covariance during sigma point generation failed.");
+     108           0 :         throw square_root_exception();
+     109             :       }
+     110             :     }
+     111             : 
+     112         200 :     const P_t Pa_sqrt = llt.matrixL();
+     113         400 :     return Pa_sqrt;
+     114             :   }
+     115             :   //}
+     116             : 
+     117             :   /* computeInverse() method //{ */
+     118             :   template <int n_states, int n_inputs, int n_measurements>
+     119         100 :   typename UKF<n_states, n_inputs, n_measurements>::Pzz_t UKF<n_states, n_inputs, n_measurements>::computeInverse(const Pzz_t& Pzz) const
+     120             :   {
+     121         100 :     Eigen::ColPivHouseholderQR<Pzz_t> qr(Pzz);
+     122         100 :     if (!qr.isInvertible())
+     123             :     {
+     124             :       // add some stuff to the tmp matrix diagonal to make it invertible
+     125           0 :       Pzz_t tmp = Pzz + 1e-9*Pzz_t::Identity(Pzz.rows(), Pzz.cols());
+     126           0 :       qr.compute(tmp);
+     127           0 :       if (!qr.isInvertible())
+     128             :       {
+     129             :         // never managed to make this happen except for explicitly putting NaNs in the input
+     130           0 :         ROS_ERROR("UKF: could not compute matrix inversion!!! Fix your covariances (the measurement's is probably too low...)");
+     131           0 :         throw inverse_exception();
+     132             :       }
+     133           0 :       ROS_WARN("UKF: artificially inflating matrix for inverse computation! Check your covariances (the measurement's might be too low...)");
+     134             :     }
+     135         100 :     Pzz_t ret = qr.inverse();
+     136         200 :     return ret;
+     137             :   }
+     138             :   //}
+     139             : 
+     140             :   /* computeKalmanGain() method //{ */
+     141             :   template <int n_states, int n_inputs, int n_measurements>
+     142         100 :   typename UKF<n_states, n_inputs, n_measurements>::K_t UKF<n_states, n_inputs, n_measurements>::computeKalmanGain([[maybe_unused]] const x_t& x, [[maybe_unused]] const z_t& inn, const K_t& Pxz, const Pzz_t& Pzz) const
+     143             :   {
+     144         100 :     const Pzz_t Pzz_inv = computeInverse(Pzz);
+     145         100 :     const K_t K = Pxz * Pzz_inv;
+     146         200 :     return K;
+     147             :   }
+     148             :   //}
+     149             : 
+     150             :   /* computeSigmas() method //{ */
+     151             :   template <int n_states, int n_inputs, int n_measurements>
+     152         200 :   typename UKF<n_states, n_inputs, n_measurements>::X_t UKF<n_states, n_inputs, n_measurements>::computeSigmas(const x_t& x, const P_t& P) const
+     153             :   {
+     154             :     // calculate sigma points
+     155             :     // fill in the middle of the elipsoid
+     156         200 :     X_t S;
+     157         200 :     S.col(0) = x;
+     158             : 
+     159         200 :     const P_t P_sqrt = computePaSqrt(P);
+     160         200 :     const auto xrep = x.replicate(1, n);
+     161             : 
+     162             :     // positive sigma points
+     163         200 :     S.template block<n, n>(0, 1) = xrep + P_sqrt;
+     164             : 
+     165             :     // negative sigma points
+     166         200 :     S.template block<n, n>(0, n+1) = xrep - P_sqrt;
+     167             : 
+     168             :     /* std::cout << "x: " << std::endl << x << std::endl; */
+     169             :     /* std::cout << "S rowmean: " << std::endl << S.rowwise().mean() << std::endl; */
+     170             : 
+     171         400 :     return S;
+     172             :   }
+     173             :   //}
+     174             : 
+     175             :   /* predict() method //{ */
+     176             : 
+     177             :   template <int n_states, int n_inputs, int n_measurements>
+     178         100 :   typename UKF<n_states, n_inputs, n_measurements>::statecov_t UKF<n_states, n_inputs, n_measurements>::predict(const statecov_t& sc, const u_t& u, const Q_t& Q, double dt) const
+     179             :   {
+     180         100 :     const auto& x = sc.x;
+     181         100 :     const auto& P = sc.P;
+     182         100 :     statecov_t ret;
+     183             : 
+     184         100 :     const X_t S = computeSigmas(x, P);
+     185             : 
+     186             :     // propagate sigmas through the transition model
+     187         100 :     X_t X;
+     188        1000 :     for (int i = 0; i < w; i++)
+     189             :     {
+     190         900 :       X.col(i) = m_transition_model(S.col(i), u, dt);
+     191             :     }
+     192             : 
+     193             :     /* std::cout << "x: " << std::endl << x << std::endl; */
+     194             :     /* std::cout << "X rowmean: " << std::endl << X.rowwise().mean() << std::endl; */
+     195             :     /* std::cout << "m_Wm sum: " << m_Wm.sum() << std::endl; */
+     196             : 
+     197             :     // recompute the state vector
+     198         100 :     ret.x = x_t::Zero();
+     199        1000 :     for (int i = 0; i < w; i++)
+     200             :     {
+     201             :       //TODO: WHY DOES THIS SHIT WORK IF I SUBSTITUTE m_Wm(i) FOR 1.0/w ??
+     202         900 :       x_t tmp = 1.0/w * X.col(i);
+     203             :       /* x_t tmp = m_Wm(i) * X.col(i); */
+     204         900 :       ret.x += tmp;
+     205             :     }
+     206             : 
+     207             :     // recompute the covariance
+     208         100 :     ret.P = P_t::Zero();
+     209        1000 :     for (int i = 0; i < w; i++)
+     210             :     {
+     211         900 :       ret.P += m_Wc(i) * (X.col(i) - ret.x) * (X.col(i) - ret.x).transpose();
+     212             :     }
+     213         100 :     ret.P += Q;
+     214             : 
+     215         200 :     return ret;
+     216             :   }
+     217             : 
+     218             :   //}
+     219             : 
+     220             :   /* correct() method //{ */
+     221             : 
+     222             :   template <int n_states, int n_inputs, int n_measurements>
+     223         100 :   typename UKF<n_states, n_inputs, n_measurements>::statecov_t UKF<n_states, n_inputs, n_measurements>::correct(const statecov_t& sc, const z_t& z, const R_t& R) const
+     224             :   {
+     225         100 :     const auto& x = sc.x;
+     226         100 :     const auto& P = sc.P;
+     227         100 :     const X_t S = computeSigmas(x, P);
+     228             : 
+     229             :     // propagate sigmas through the observation model
+     230         100 :     Z_t Z_exp(z.rows(), w);
+     231        1000 :     for (int i = 0; i < w; i++)
+     232             :     {
+     233         900 :       Z_exp.col(i) = m_observation_model(S.col(i));
+     234             :     }
+     235             : 
+     236             :     // compute expected measurement
+     237         100 :     z_t z_exp = z_t::Zero(z.rows());
+     238        1000 :     for (int i = 0; i < w; i++)
+     239             :     {
+     240         900 :       z_exp += m_Wm(i) * Z_exp.col(i);
+     241             :     }
+     242             : 
+     243             :     // compute the covariance of measurement
+     244         100 :     Pzz_t Pzz = Pzz_t::Zero(z.rows(), z.rows());
+     245        1000 :     for (int i = 0; i < w; i++)
+     246             :     {
+     247         900 :       Pzz += m_Wc(i) * (Z_exp.col(i) - z_exp) * (Z_exp.col(i) - z_exp).transpose();
+     248             :     }
+     249         100 :     Pzz += R;
+     250             : 
+     251             :     // compute cross covariance
+     252         100 :     K_t Pxz = K_t::Zero(n, z.rows());
+     253        1000 :     for (int i = 0; i < w; i++)
+     254             :     {
+     255         900 :       Pxz += m_Wc(i) * (S.col(i) - x) * (Z_exp.col(i) - z_exp).transpose();
+     256             :     }
+     257             : 
+     258             :     // compute Kalman gain
+     259         100 :     const z_t inn = (z - z_exp); // innovation
+     260         100 :     const K_t K = computeKalmanGain(sc.x, inn, Pxz, Pzz);
+     261             : 
+     262             :     // check whether the inverse produced valid numbers
+     263         100 :     if (!K.array().isFinite().all())
+     264             :     {
+     265           0 :       ROS_ERROR("UKF: inverting of Pzz in correction update produced non-finite numbers!!! Fix your covariances (the measurement's is probably too low...)");
+     266           0 :       throw inverse_exception();
+     267             :     }
+     268             : 
+     269             :     // correct
+     270         100 :     statecov_t ret;
+     271         100 :     ret.x = x + K * inn;
+     272         100 :     ret.P = P - K * Pzz * K.transpose();
+     273         200 :     return ret;
+     274             :   }
+     275             : 
+     276             :   //}
+     277             : 
+     278             : }  // namespace mrs_lib
+     279             : 
+     280             : #endif
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/impl/ukf.hpp.gcov.overview.html b/mrs_lib/include/mrs_lib/impl/ukf.hpp.gcov.overview.html new file mode 100644 index 0000000000..68c88bdc08 --- /dev/null +++ b/mrs_lib/include/mrs_lib/impl/ukf.hpp.gcov.overview.html @@ -0,0 +1,90 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl/ukf.hpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/include/mrs_lib/impl/ukf.hpp.gcov.png b/mrs_lib/include/mrs_lib/impl/ukf.hpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..1d33d5b3039a981579bb4f50a9c00a2c8709ad9b GIT binary patch literal 1198 zcmV;f1X25mP)Y@{;Pb0B(89X1lp$WlRn3FWZf6Cw_WVJ+}+ydtQ`=_ zd4PPgbS9hXQz+oPx)ki&7 z-lQE#rEk)z9uGELd87|74GK~T#|W?+u3XZe6t2^vl^w1d^jri}M|c;c3rf)C56QZq zP>s|XTiZ;bsJ#Vv-hdqz_$BTdbHN)i=DQZ)l5v>`+*`m1a!FMX_`s(SmpO- zp$vyfR|C*SHhH6}0WwL`B(6KO!^))|7!eAY$hGhdq-(Utn_=63OFES_bj!U50C8YR z|N7J=_cr$>VLl@P%-P){#tAJ~{L6R_w;t2FXAF>2UxyPws4?ZRe#OISm*?A}%rGNq zZ^^7Vo9;iJkq`B_Y=@kl0KzY}Aw>xP^-|D;VL_|NIq#{C2ogQcHsOZP_(abshj)TrRs^3 zRDJ%qOg&hws;@$&LlQi$D@$mg=^NrpvL6ojS`Pb^=MJ& zI<$0_Mxku)5@`mY@u80@ds!ioK4>QJ-s>hI8lqjf%z4bxSXJQzPkg@O>F7ldYVaim ze6B)6>E3j9;8EqM3Hx9J`$AVSoejBw%?C7ptCNz#zfL;|HFrYu4`1RPbHQ`N;s5{u M07*qoM6N<$f)tiG*8l(j literal 0 HcmV?d00001 diff --git a/mrs_lib/include/mrs_lib/impl/vector_converter.hpp.func-sort-c.html b/mrs_lib/include/mrs_lib/impl/vector_converter.hpp.func-sort-c.html new file mode 100644 index 0000000000..9d8a4eb731 --- /dev/null +++ b/mrs_lib/include/mrs_lib/impl/vector_converter.hpp.func-sort-c.html @@ -0,0 +1,152 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl/vector_converter.hpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/impl - vector_converter.hpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:1818100.0 %
Date:2024-04-18 23:11:36Functions:1818100.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
geometry_msgs::Vector3_<std::allocator<void> > mrs_lib::impl::convertTo<geometry_msgs::Vector3_<std::allocator<void> > >(double, double, double)8
cv::Vec<double, 3> mrs_lib::impl::convertTo<cv::Vec<double, 3> >(double, double, double)8
cv::Vec<float, 3> mrs_lib::impl::convertTo<cv::Vec<float, 3> >(double, double, double)8
pcl::PointXYZ mrs_lib::impl::convertTo<pcl::PointXYZ>(double, double, double)8
Eigen::Matrix<double, 3, 1, 0, 3, 1> mrs_lib::impl::convertTo<Eigen::Matrix<double, 3, 1, 0, 3, 1> >(double, double, double)8
Eigen::Matrix<float, 3, 1, 0, 3, 1> mrs_lib::impl::convertTo<Eigen::Matrix<float, 3, 1, 0, 3, 1> >(double, double, double)8
std::enable_if<has_xmem_v<geometry_msgs::Vector3_<std::allocator<void> > >, std::tuple<double, double, double> >::type mrs_lib::impl::convertFrom<geometry_msgs::Vector3_<std::allocator<void> > >(geometry_msgs::Vector3_<std::allocator<void> > const&)14
std::enable_if<(has_squarebracket_operator_v<cv::Vec<double, 3> >)&&(!(has_xfun_v<cv::Vec<double, 3> >)), std::tuple<double, double, double> >::type mrs_lib::impl::convertFrom<cv::Vec<double, 3> >(cv::Vec<double, 3> const&)14
std::enable_if<(has_squarebracket_operator_v<cv::Vec<float, 3> >)&&(!(has_xfun_v<cv::Vec<float, 3> >)), std::tuple<double, double, double> >::type mrs_lib::impl::convertFrom<cv::Vec<float, 3> >(cv::Vec<float, 3> const&)14
std::enable_if<has_xmem_v<pcl::PointXYZ>, std::tuple<double, double, double> >::type mrs_lib::impl::convertFrom<pcl::PointXYZ>(pcl::PointXYZ const&)14
std::enable_if<has_xfun_v<Eigen::Matrix<double, 3, 1, 0, 3, 1> >, std::tuple<double, double, double> >::type mrs_lib::impl::convertFrom<Eigen::Matrix<double, 3, 1, 0, 3, 1> >(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&)14
std::enable_if<has_xfun_v<Eigen::Matrix<float, 3, 1, 0, 3, 1> >, std::tuple<double, double, double> >::type mrs_lib::impl::convertFrom<Eigen::Matrix<float, 3, 1, 0, 3, 1> >(Eigen::Matrix<float, 3, 1, 0, 3, 1> const&)14
std::enable_if<(!(has_xyz_constructor_v<geometry_msgs::Vector3_<std::allocator<void> > >))&&(has_xmem_v<geometry_msgs::Vector3_<std::allocator<void> > >), void>::type mrs_lib::impl::convertTo<geometry_msgs::Vector3_<std::allocator<void> > >(geometry_msgs::Vector3_<std::allocator<void> >&, double, double, double)14
std::enable_if<has_xyz_constructor_v<cv::Vec<double, 3> >, void>::type mrs_lib::impl::convertTo<cv::Vec<double, 3> >(cv::Vec<double, 3>&, double, double, double)14
std::enable_if<has_xyz_constructor_v<cv::Vec<float, 3> >, void>::type mrs_lib::impl::convertTo<cv::Vec<float, 3> >(cv::Vec<float, 3>&, double, double, double)14
std::enable_if<has_xyz_constructor_v<pcl::PointXYZ>, void>::type mrs_lib::impl::convertTo<pcl::PointXYZ>(pcl::PointXYZ&, double, double, double)14
std::enable_if<has_xyz_constructor_v<Eigen::Matrix<double, 3, 1, 0, 3, 1> >, void>::type mrs_lib::impl::convertTo<Eigen::Matrix<double, 3, 1, 0, 3, 1> >(Eigen::Matrix<double, 3, 1, 0, 3, 1>&, double, double, double)14
std::enable_if<has_xyz_constructor_v<Eigen::Matrix<float, 3, 1, 0, 3, 1> >, void>::type mrs_lib::impl::convertTo<Eigen::Matrix<float, 3, 1, 0, 3, 1> >(Eigen::Matrix<float, 3, 1, 0, 3, 1>&, double, double, double)14
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/impl/vector_converter.hpp.func.html b/mrs_lib/include/mrs_lib/impl/vector_converter.hpp.func.html new file mode 100644 index 0000000000..031af34f9f --- /dev/null +++ b/mrs_lib/include/mrs_lib/impl/vector_converter.hpp.func.html @@ -0,0 +1,152 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl/vector_converter.hpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/impl - vector_converter.hpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:1818100.0 %
Date:2024-04-18 23:11:36Functions:1818100.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
std::enable_if<has_xmem_v<geometry_msgs::Vector3_<std::allocator<void> > >, std::tuple<double, double, double> >::type mrs_lib::impl::convertFrom<geometry_msgs::Vector3_<std::allocator<void> > >(geometry_msgs::Vector3_<std::allocator<void> > const&)14
std::enable_if<(has_squarebracket_operator_v<cv::Vec<double, 3> >)&&(!(has_xfun_v<cv::Vec<double, 3> >)), std::tuple<double, double, double> >::type mrs_lib::impl::convertFrom<cv::Vec<double, 3> >(cv::Vec<double, 3> const&)14
std::enable_if<(has_squarebracket_operator_v<cv::Vec<float, 3> >)&&(!(has_xfun_v<cv::Vec<float, 3> >)), std::tuple<double, double, double> >::type mrs_lib::impl::convertFrom<cv::Vec<float, 3> >(cv::Vec<float, 3> const&)14
std::enable_if<has_xmem_v<pcl::PointXYZ>, std::tuple<double, double, double> >::type mrs_lib::impl::convertFrom<pcl::PointXYZ>(pcl::PointXYZ const&)14
std::enable_if<has_xfun_v<Eigen::Matrix<double, 3, 1, 0, 3, 1> >, std::tuple<double, double, double> >::type mrs_lib::impl::convertFrom<Eigen::Matrix<double, 3, 1, 0, 3, 1> >(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&)14
std::enable_if<has_xfun_v<Eigen::Matrix<float, 3, 1, 0, 3, 1> >, std::tuple<double, double, double> >::type mrs_lib::impl::convertFrom<Eigen::Matrix<float, 3, 1, 0, 3, 1> >(Eigen::Matrix<float, 3, 1, 0, 3, 1> const&)14
std::enable_if<(!(has_xyz_constructor_v<geometry_msgs::Vector3_<std::allocator<void> > >))&&(has_xmem_v<geometry_msgs::Vector3_<std::allocator<void> > >), void>::type mrs_lib::impl::convertTo<geometry_msgs::Vector3_<std::allocator<void> > >(geometry_msgs::Vector3_<std::allocator<void> >&, double, double, double)14
geometry_msgs::Vector3_<std::allocator<void> > mrs_lib::impl::convertTo<geometry_msgs::Vector3_<std::allocator<void> > >(double, double, double)8
std::enable_if<has_xyz_constructor_v<cv::Vec<double, 3> >, void>::type mrs_lib::impl::convertTo<cv::Vec<double, 3> >(cv::Vec<double, 3>&, double, double, double)14
cv::Vec<double, 3> mrs_lib::impl::convertTo<cv::Vec<double, 3> >(double, double, double)8
std::enable_if<has_xyz_constructor_v<cv::Vec<float, 3> >, void>::type mrs_lib::impl::convertTo<cv::Vec<float, 3> >(cv::Vec<float, 3>&, double, double, double)14
cv::Vec<float, 3> mrs_lib::impl::convertTo<cv::Vec<float, 3> >(double, double, double)8
std::enable_if<has_xyz_constructor_v<pcl::PointXYZ>, void>::type mrs_lib::impl::convertTo<pcl::PointXYZ>(pcl::PointXYZ&, double, double, double)14
pcl::PointXYZ mrs_lib::impl::convertTo<pcl::PointXYZ>(double, double, double)8
std::enable_if<has_xyz_constructor_v<Eigen::Matrix<double, 3, 1, 0, 3, 1> >, void>::type mrs_lib::impl::convertTo<Eigen::Matrix<double, 3, 1, 0, 3, 1> >(Eigen::Matrix<double, 3, 1, 0, 3, 1>&, double, double, double)14
Eigen::Matrix<double, 3, 1, 0, 3, 1> mrs_lib::impl::convertTo<Eigen::Matrix<double, 3, 1, 0, 3, 1> >(double, double, double)8
std::enable_if<has_xyz_constructor_v<Eigen::Matrix<float, 3, 1, 0, 3, 1> >, void>::type mrs_lib::impl::convertTo<Eigen::Matrix<float, 3, 1, 0, 3, 1> >(Eigen::Matrix<float, 3, 1, 0, 3, 1>&, double, double, double)14
Eigen::Matrix<float, 3, 1, 0, 3, 1> mrs_lib::impl::convertTo<Eigen::Matrix<float, 3, 1, 0, 3, 1> >(double, double, double)8
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/impl/vector_converter.hpp.gcov.frameset.html b/mrs_lib/include/mrs_lib/impl/vector_converter.hpp.gcov.frameset.html new file mode 100644 index 0000000000..bc2d20363d --- /dev/null +++ b/mrs_lib/include/mrs_lib/impl/vector_converter.hpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl/vector_converter.hpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/include/mrs_lib/impl/vector_converter.hpp.gcov.html b/mrs_lib/include/mrs_lib/impl/vector_converter.hpp.gcov.html new file mode 100644 index 0000000000..6f089ea7bd --- /dev/null +++ b/mrs_lib/include/mrs_lib/impl/vector_converter.hpp.gcov.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl/vector_converter.hpp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/impl - vector_converter.hpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:1818100.0 %
Date:2024-04-18 23:11:36Functions:1818100.0 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : /**  \file vector_converter.hpp
+       2             :      \brief Implements the convertTo() and convertFrom() functions for conversion between different vector representations (Eigen, OpenCV, tf2 etc.).
+       3             :      \author Matouš Vrba - vrbamato@fel.cvut.cz
+       4             :  */
+       5             : #ifndef VECTOR_CONVERTER_HPP
+       6             : #define VECTOR_CONVERTER_HPP
+       7             : 
+       8             : #include <experimental/type_traits>
+       9             : 
+      10             : namespace mrs_lib
+      11             : {
+      12             :   namespace impl
+      13             :   {
+      14             :     using unw_t = std::tuple<double, double, double>;
+      15             : 
+      16             :     /* SFINAE magic - only for black wizards! //{ */
+      17             :     
+      18             :     #define GENERATE_HAS_MEMBER_FUNC(func, rettype)                                \
+      19             :     template<class T> using _has_##func##fun_chk =                                 \
+      20             :           decltype(std::declval<T &>().func());                                    \
+      21             :     template<class T> constexpr bool has_##func##fun_v =                           \
+      22             :           std::experimental::is_detected_convertible_v<rettype, _has_##func##fun_chk, T>;
+      23             :     
+      24             :     #define GENERATE_HAS_MEMBER(memb, type)                                        \
+      25             :     template<class T> using _has_##memb##mem_chk =                                 \
+      26             :           decltype(std::declval<T &>().memb);                                      \
+      27             :     template<class T> constexpr bool has_##memb##mem_v =                           \
+      28             :           std::experimental::is_detected_convertible_v<type, _has_##memb##mem_chk, T>;
+      29             :     
+      30             :     GENERATE_HAS_MEMBER_FUNC(x, double)
+      31             :     GENERATE_HAS_MEMBER(x, double)
+      32             : 
+      33             :     template<class T> using _has_squarebracket_operator_chk = decltype(std::declval<T &>()[0]);
+      34             :     template<class T> constexpr bool has_squarebracket_operator_v = std::experimental::is_detected_convertible_v<double, _has_squarebracket_operator_chk, T>;
+      35             : 
+      36             :     template<class T> constexpr bool has_xyz_constructor_v = std::experimental::is_constructible_v<T, double, double, double>;
+      37             :     
+      38             :     //}
+      39             : 
+      40             :     // convertFrom specialization for Eigen types
+      41             :     template <typename in_t>
+      42          28 :     std::enable_if_t<has_xfun_v<in_t>, unw_t> convertFrom(const in_t& in)
+      43             :     {
+      44          28 :       return {in.x(), in.y(), in.z()};
+      45             :     }
+      46             : 
+      47             :     // convertFrom specialization for plain member types
+      48             :     template <typename in_t>
+      49          28 :     std::enable_if_t<has_xmem_v<in_t>, unw_t> convertFrom(const in_t& in)
+      50             :     {
+      51          28 :       return {in.x, in.y, in.z};
+      52             :     }
+      53             : 
+      54             :     // convertFrom specialization for OpenCV vectors
+      55             :     template <typename in_t>
+      56          28 :     std::enable_if_t<has_squarebracket_operator_v<in_t> && !has_xfun_v<in_t>, unw_t> convertFrom(const in_t& in)
+      57             :     {
+      58          28 :       return {in[0], in[1], in[2]};
+      59             :     }
+      60             : 
+      61             :     // convertTo specialization for types with a constructor that takes three doubles
+      62             :     template <typename ret_t>
+      63          70 :     std::enable_if_t<has_xyz_constructor_v<ret_t>, void> convertTo(ret_t& out, const double x, const double y, const double z)
+      64             :     {
+      65          70 :       out = {x, y, z};
+      66          70 :     }
+      67             : 
+      68             :     // convertTo specialization for other types
+      69             :     template <typename ret_t>
+      70          14 :     std::enable_if_t<!has_xyz_constructor_v<ret_t> && has_xmem_v<ret_t>, void> convertTo(ret_t& out, const double x, const double y, const double z)
+      71             :     {
+      72          14 :       out.x = x;
+      73          14 :       out.y = y;
+      74          14 :       out.z = z;
+      75          14 :     }
+      76             : 
+      77             :     template <typename ret_t>
+      78          48 :     ret_t convertTo(const double x, const double y, const double z)
+      79             :     {
+      80          48 :       ret_t ret;
+      81          48 :       convertTo(ret, x, y, z);
+      82          48 :       return ret;
+      83             :     }
+      84             : 
+      85             :   }  // namespace impl
+      86             : 
+      87             : }  // namespace mrs_lib
+      88             : 
+      89             : #endif // VECTOR_CONVERTER_HPP
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/impl/vector_converter.hpp.gcov.overview.html b/mrs_lib/include/mrs_lib/impl/vector_converter.hpp.gcov.overview.html new file mode 100644 index 0000000000..63bef275db --- /dev/null +++ b/mrs_lib/include/mrs_lib/impl/vector_converter.hpp.gcov.overview.html @@ -0,0 +1,43 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/impl/vector_converter.hpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/include/mrs_lib/impl/vector_converter.hpp.gcov.png b/mrs_lib/include/mrs_lib/impl/vector_converter.hpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..6df626b77730d3afc2366a6bff779a75aafec4bb GIT binary patch literal 456 zcmV;(0XP1MP)0000OP)t-s|NsB0 zs;a7|?_FK${{R500003000620&P%hU00009a7bBm000ie000ie0hKEb8vpT=9C9wI= zG+~i#a`WyY{t1@_iX){|^BF%e2Apb;YSze^m8gMB%2L!-%15Hk-82~W)kUrli=9UH zXfqZ%Mo03Ets&0^JGphqs3vt>etz8;@hnKG0j?worJ61qvzKP~-QnCFmovtA;4$>g z15G3eEP;sw3K^H>sc7)MJTCGyfPayv-naAeWNB=k&Qwp*nOXOuJVo&+)GW0cK6?<` zXmM5^yOTOTMmr{tb3xo5P|hd=GV*Ze^^!a;Plx3>^!Wt%g5Yu;Q8Aa~yN(k+hNUtf y=B!bZ)Ym-+-so$f6MbNjjPR)go?bgT?-)N0N#(4bA-TN(0000 + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_libHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:78198579.3 %
Date:2024-04-18 23:11:36Functions:842135162.3 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
ukf.h +
0.0%
+
0.0 %0 / 40.0 %0 / 2
dynamic_reconfigure_mgr.h +
65.5%65.5%
+
65.5 %57 / 8732.9 %28 / 85
<unnamed>65.5 %57 / 8732.9 %28 / 85
scope_timer.h +
33.3%33.3%
+
33.3 %2 / 633.3 %1 / 3
<unnamed>33.3 %2 / 633.3 %1 / 3
msg_extractor.h +
33.3%33.3%
+
33.3 %33 / 9934.1 %15 / 44
<unnamed>33.3 %33 / 9934.1 %15 / 44
repredictor.h +
90.1%90.1%
+
90.1 %100 / 11145.5 %20 / 44
<unnamed>90.1 %100 / 11145.5 %20 / 44
subscribe_handler.h +
89.8%89.8%
+
89.8 %44 / 4952.5 %389 / 741
<unnamed>89.8 %44 / 4952.5 %389 / 741
lkf.h +
81.5%81.5%
+
81.5 %44 / 5453.2 %25 / 47
<unnamed>81.5 %44 / 5453.2 %25 / 47
transformer.h +
85.0%85.0%
+
85.0 %51 / 6077.8 %14 / 18
<unnamed>85.0 %51 / 6077.8 %14 / 18
attitude_converter.h +
85.2%85.2%
+
85.2 %23 / 2781.8 %9 / 11
<unnamed>85.2 %23 / 2781.8 %9 / 11
mutex.h +
100.0%
+
100.0 %11 / 1183.8 %67 / 80
<unnamed>100.0 %11 / 1183.8 %67 / 80
timer.h +
100.0%
+
100.0 %4 / 485.7 %6 / 7
<unnamed>100.0 %4 / 485.7 %6 / 7
publisher_handler.h +
100.0%
+
100.0 %4 / 499.2 %118 / 119
<unnamed>100.0 %4 / 499.2 %118 / 119
timeout_manager.h +
100.0%
+
100.0 %4 / 4-0 / 0
<unnamed>100.0 %4 / 4-0 / 0
visual_object.h +
100.0%
+
100.0 %2 / 2100.0 %1 / 1
<unnamed>100.0 %2 / 2100.0 %1 / 1
quadratic_throttle_model.h +
100.0%
+
100.0 %4 / 4100.0 %2 / 2
<unnamed>100.0 %4 / 4100.0 %2 / 2
gps_conversions.h +
76.5%76.5%
+
76.5 %104 / 136100.0 %4 / 4
<unnamed>76.5 %104 / 136100.0 %4 / 4
utils.h +
100.0%
+
100.0 %15 / 15100.0 %5 / 5
<unnamed>100.0 %15 / 15100.0 %5 / 5
service_client_handler.h +
100.0%
+
100.0 %3 / 3100.0 %24 / 24
<unnamed>100.0 %3 / 3100.0 %24 / 24
vector_converter.h +
100.0%
+
100.0 %5 / 5100.0 %36 / 36
<unnamed>100.0 %5 / 5100.0 %36 / 36
param_loader.h +
90.3%90.3%
+
90.3 %271 / 300100.0 %78 / 78
<unnamed>90.3 %271 / 300100.0 %78 / 78
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/index-detail-sort-l.html b/mrs_lib/include/mrs_lib/index-detail-sort-l.html new file mode 100644 index 0000000000..c625c2e9aa --- /dev/null +++ b/mrs_lib/include/mrs_lib/index-detail-sort-l.html @@ -0,0 +1,444 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_libHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:78198579.3 %
Date:2024-04-18 23:11:36Functions:842135162.3 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
ukf.h +
0.0%
+
0.0 %0 / 40.0 %0 / 2
scope_timer.h +
33.3%33.3%
+
33.3 %2 / 633.3 %1 / 3
<unnamed>33.3 %2 / 633.3 %1 / 3
msg_extractor.h +
33.3%33.3%
+
33.3 %33 / 9934.1 %15 / 44
<unnamed>33.3 %33 / 9934.1 %15 / 44
dynamic_reconfigure_mgr.h +
65.5%65.5%
+
65.5 %57 / 8732.9 %28 / 85
<unnamed>65.5 %57 / 8732.9 %28 / 85
gps_conversions.h +
76.5%76.5%
+
76.5 %104 / 136100.0 %4 / 4
<unnamed>76.5 %104 / 136100.0 %4 / 4
lkf.h +
81.5%81.5%
+
81.5 %44 / 5453.2 %25 / 47
<unnamed>81.5 %44 / 5453.2 %25 / 47
transformer.h +
85.0%85.0%
+
85.0 %51 / 6077.8 %14 / 18
<unnamed>85.0 %51 / 6077.8 %14 / 18
attitude_converter.h +
85.2%85.2%
+
85.2 %23 / 2781.8 %9 / 11
<unnamed>85.2 %23 / 2781.8 %9 / 11
subscribe_handler.h +
89.8%89.8%
+
89.8 %44 / 4952.5 %389 / 741
<unnamed>89.8 %44 / 4952.5 %389 / 741
repredictor.h +
90.1%90.1%
+
90.1 %100 / 11145.5 %20 / 44
<unnamed>90.1 %100 / 11145.5 %20 / 44
param_loader.h +
90.3%90.3%
+
90.3 %271 / 300100.0 %78 / 78
<unnamed>90.3 %271 / 300100.0 %78 / 78
visual_object.h +
100.0%
+
100.0 %2 / 2100.0 %1 / 1
<unnamed>100.0 %2 / 2100.0 %1 / 1
service_client_handler.h +
100.0%
+
100.0 %3 / 3100.0 %24 / 24
<unnamed>100.0 %3 / 3100.0 %24 / 24
publisher_handler.h +
100.0%
+
100.0 %4 / 499.2 %118 / 119
<unnamed>100.0 %4 / 499.2 %118 / 119
quadratic_throttle_model.h +
100.0%
+
100.0 %4 / 4100.0 %2 / 2
<unnamed>100.0 %4 / 4100.0 %2 / 2
timeout_manager.h +
100.0%
+
100.0 %4 / 4-0 / 0
<unnamed>100.0 %4 / 4-0 / 0
timer.h +
100.0%
+
100.0 %4 / 485.7 %6 / 7
<unnamed>100.0 %4 / 485.7 %6 / 7
vector_converter.h +
100.0%
+
100.0 %5 / 5100.0 %36 / 36
<unnamed>100.0 %5 / 5100.0 %36 / 36
mutex.h +
100.0%
+
100.0 %11 / 1183.8 %67 / 80
<unnamed>100.0 %11 / 1183.8 %67 / 80
utils.h +
100.0%
+
100.0 %15 / 15100.0 %5 / 5
<unnamed>100.0 %15 / 15100.0 %5 / 5
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/index-detail.html b/mrs_lib/include/mrs_lib/index-detail.html new file mode 100644 index 0000000000..ca56a5114b --- /dev/null +++ b/mrs_lib/include/mrs_lib/index-detail.html @@ -0,0 +1,444 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_libHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:78198579.3 %
Date:2024-04-18 23:11:36Functions:842135162.3 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
attitude_converter.h +
85.2%85.2%
+
85.2 %23 / 2781.8 %9 / 11
<unnamed>85.2 %23 / 2781.8 %9 / 11
dynamic_reconfigure_mgr.h +
65.5%65.5%
+
65.5 %57 / 8732.9 %28 / 85
<unnamed>65.5 %57 / 8732.9 %28 / 85
gps_conversions.h +
76.5%76.5%
+
76.5 %104 / 136100.0 %4 / 4
<unnamed>76.5 %104 / 136100.0 %4 / 4
lkf.h +
81.5%81.5%
+
81.5 %44 / 5453.2 %25 / 47
<unnamed>81.5 %44 / 5453.2 %25 / 47
msg_extractor.h +
33.3%33.3%
+
33.3 %33 / 9934.1 %15 / 44
<unnamed>33.3 %33 / 9934.1 %15 / 44
mutex.h +
100.0%
+
100.0 %11 / 1183.8 %67 / 80
<unnamed>100.0 %11 / 1183.8 %67 / 80
param_loader.h +
90.3%90.3%
+
90.3 %271 / 300100.0 %78 / 78
<unnamed>90.3 %271 / 300100.0 %78 / 78
publisher_handler.h +
100.0%
+
100.0 %4 / 499.2 %118 / 119
<unnamed>100.0 %4 / 499.2 %118 / 119
quadratic_throttle_model.h +
100.0%
+
100.0 %4 / 4100.0 %2 / 2
<unnamed>100.0 %4 / 4100.0 %2 / 2
repredictor.h +
90.1%90.1%
+
90.1 %100 / 11145.5 %20 / 44
<unnamed>90.1 %100 / 11145.5 %20 / 44
scope_timer.h +
33.3%33.3%
+
33.3 %2 / 633.3 %1 / 3
<unnamed>33.3 %2 / 633.3 %1 / 3
service_client_handler.h +
100.0%
+
100.0 %3 / 3100.0 %24 / 24
<unnamed>100.0 %3 / 3100.0 %24 / 24
subscribe_handler.h +
89.8%89.8%
+
89.8 %44 / 4952.5 %389 / 741
<unnamed>89.8 %44 / 4952.5 %389 / 741
timeout_manager.h +
100.0%
+
100.0 %4 / 4-0 / 0
<unnamed>100.0 %4 / 4-0 / 0
timer.h +
100.0%
+
100.0 %4 / 485.7 %6 / 7
<unnamed>100.0 %4 / 485.7 %6 / 7
transformer.h +
85.0%85.0%
+
85.0 %51 / 6077.8 %14 / 18
<unnamed>85.0 %51 / 6077.8 %14 / 18
ukf.h +
0.0%
+
0.0 %0 / 40.0 %0 / 2
utils.h +
100.0%
+
100.0 %15 / 15100.0 %5 / 5
<unnamed>100.0 %15 / 15100.0 %5 / 5
vector_converter.h +
100.0%
+
100.0 %5 / 5100.0 %36 / 36
<unnamed>100.0 %5 / 5100.0 %36 / 36
visual_object.h +
100.0%
+
100.0 %2 / 2100.0 %1 / 1
<unnamed>100.0 %2 / 2100.0 %1 / 1
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/index-sort-f.html b/mrs_lib/include/mrs_lib/index-sort-f.html new file mode 100644 index 0000000000..cdf37b8766 --- /dev/null +++ b/mrs_lib/include/mrs_lib/index-sort-f.html @@ -0,0 +1,292 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_libHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:78198579.3 %
Date:2024-04-18 23:11:36Functions:842135162.3 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
ukf.h +
0.0%
+
0.0 %0 / 40.0 %0 / 2
dynamic_reconfigure_mgr.h +
65.5%65.5%
+
65.5 %57 / 8732.9 %28 / 85
scope_timer.h +
33.3%33.3%
+
33.3 %2 / 633.3 %1 / 3
msg_extractor.h +
33.3%33.3%
+
33.3 %33 / 9934.1 %15 / 44
repredictor.h +
90.1%90.1%
+
90.1 %100 / 11145.5 %20 / 44
subscribe_handler.h +
89.8%89.8%
+
89.8 %44 / 4952.5 %389 / 741
lkf.h +
81.5%81.5%
+
81.5 %44 / 5453.2 %25 / 47
transformer.h +
85.0%85.0%
+
85.0 %51 / 6077.8 %14 / 18
attitude_converter.h +
85.2%85.2%
+
85.2 %23 / 2781.8 %9 / 11
mutex.h +
100.0%
+
100.0 %11 / 1183.8 %67 / 80
timer.h +
100.0%
+
100.0 %4 / 485.7 %6 / 7
publisher_handler.h +
100.0%
+
100.0 %4 / 499.2 %118 / 119
timeout_manager.h +
100.0%
+
100.0 %4 / 4-0 / 0
visual_object.h +
100.0%
+
100.0 %2 / 2100.0 %1 / 1
quadratic_throttle_model.h +
100.0%
+
100.0 %4 / 4100.0 %2 / 2
gps_conversions.h +
76.5%76.5%
+
76.5 %104 / 136100.0 %4 / 4
utils.h +
100.0%
+
100.0 %15 / 15100.0 %5 / 5
service_client_handler.h +
100.0%
+
100.0 %3 / 3100.0 %24 / 24
vector_converter.h +
100.0%
+
100.0 %5 / 5100.0 %36 / 36
param_loader.h +
90.3%90.3%
+
90.3 %271 / 300100.0 %78 / 78
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/index-sort-l.html b/mrs_lib/include/mrs_lib/index-sort-l.html new file mode 100644 index 0000000000..84c6e6db36 --- /dev/null +++ b/mrs_lib/include/mrs_lib/index-sort-l.html @@ -0,0 +1,292 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_libHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:78198579.3 %
Date:2024-04-18 23:11:36Functions:842135162.3 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
ukf.h +
0.0%
+
0.0 %0 / 40.0 %0 / 2
scope_timer.h +
33.3%33.3%
+
33.3 %2 / 633.3 %1 / 3
msg_extractor.h +
33.3%33.3%
+
33.3 %33 / 9934.1 %15 / 44
dynamic_reconfigure_mgr.h +
65.5%65.5%
+
65.5 %57 / 8732.9 %28 / 85
gps_conversions.h +
76.5%76.5%
+
76.5 %104 / 136100.0 %4 / 4
lkf.h +
81.5%81.5%
+
81.5 %44 / 5453.2 %25 / 47
transformer.h +
85.0%85.0%
+
85.0 %51 / 6077.8 %14 / 18
attitude_converter.h +
85.2%85.2%
+
85.2 %23 / 2781.8 %9 / 11
subscribe_handler.h +
89.8%89.8%
+
89.8 %44 / 4952.5 %389 / 741
repredictor.h +
90.1%90.1%
+
90.1 %100 / 11145.5 %20 / 44
param_loader.h +
90.3%90.3%
+
90.3 %271 / 300100.0 %78 / 78
visual_object.h +
100.0%
+
100.0 %2 / 2100.0 %1 / 1
service_client_handler.h +
100.0%
+
100.0 %3 / 3100.0 %24 / 24
publisher_handler.h +
100.0%
+
100.0 %4 / 499.2 %118 / 119
quadratic_throttle_model.h +
100.0%
+
100.0 %4 / 4100.0 %2 / 2
timeout_manager.h +
100.0%
+
100.0 %4 / 4-0 / 0
timer.h +
100.0%
+
100.0 %4 / 485.7 %6 / 7
vector_converter.h +
100.0%
+
100.0 %5 / 5100.0 %36 / 36
mutex.h +
100.0%
+
100.0 %11 / 1183.8 %67 / 80
utils.h +
100.0%
+
100.0 %15 / 15100.0 %5 / 5
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/index.html b/mrs_lib/include/mrs_lib/index.html new file mode 100644 index 0000000000..825878dace --- /dev/null +++ b/mrs_lib/include/mrs_lib/index.html @@ -0,0 +1,292 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_libHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:78198579.3 %
Date:2024-04-18 23:11:36Functions:842135162.3 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
attitude_converter.h +
85.2%85.2%
+
85.2 %23 / 2781.8 %9 / 11
dynamic_reconfigure_mgr.h +
65.5%65.5%
+
65.5 %57 / 8732.9 %28 / 85
gps_conversions.h +
76.5%76.5%
+
76.5 %104 / 136100.0 %4 / 4
lkf.h +
81.5%81.5%
+
81.5 %44 / 5453.2 %25 / 47
msg_extractor.h +
33.3%33.3%
+
33.3 %33 / 9934.1 %15 / 44
mutex.h +
100.0%
+
100.0 %11 / 1183.8 %67 / 80
param_loader.h +
90.3%90.3%
+
90.3 %271 / 300100.0 %78 / 78
publisher_handler.h +
100.0%
+
100.0 %4 / 499.2 %118 / 119
quadratic_throttle_model.h +
100.0%
+
100.0 %4 / 4100.0 %2 / 2
repredictor.h +
90.1%90.1%
+
90.1 %100 / 11145.5 %20 / 44
scope_timer.h +
33.3%33.3%
+
33.3 %2 / 633.3 %1 / 3
service_client_handler.h +
100.0%
+
100.0 %3 / 3100.0 %24 / 24
subscribe_handler.h +
89.8%89.8%
+
89.8 %44 / 4952.5 %389 / 741
timeout_manager.h +
100.0%
+
100.0 %4 / 4-0 / 0
timer.h +
100.0%
+
100.0 %4 / 485.7 %6 / 7
transformer.h +
85.0%85.0%
+
85.0 %51 / 6077.8 %14 / 18
ukf.h +
0.0%
+
0.0 %0 / 40.0 %0 / 2
utils.h +
100.0%
+
100.0 %15 / 15100.0 %5 / 5
vector_converter.h +
100.0%
+
100.0 %5 / 5100.0 %36 / 36
visual_object.h +
100.0%
+
100.0 %2 / 2100.0 %1 / 1
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/lkf.h.func-sort-c.html b/mrs_lib/include/mrs_lib/lkf.h.func-sort-c.html new file mode 100644 index 0000000000..20efab2c3a --- /dev/null +++ b/mrs_lib/include/mrs_lib/lkf.h.func-sort-c.html @@ -0,0 +1,268 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/lkf.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - lkf.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:445481.5 %
Date:2024-04-18 23:11:36Functions:254753.2 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::varstepLKF<3, 1, 1>::varstepLKF(std::function<Eigen::Matrix<double, 3, 3, 0, 3, 3> (double)> const&, std::function<Eigen::Matrix<double, 3, 1, 0, 3, 1> (double)> const&, Eigen::Matrix<double, 1, 3, 1, 1, 3> const&)0
mrs_lib::varstepLKF<6, 2, 2>::varstepLKF(std::function<Eigen::Matrix<double, 6, 6, 0, 6, 6> (double)> const&, std::function<Eigen::Matrix<double, 6, 2, 0, 6, 2> (double)> const&, Eigen::Matrix<double, 2, 6, 0, 2, 6> const&)0
mrs_lib::LKF<2, 1, 1>::LKF(Eigen::Matrix<double, 2, 2, 0, 2, 2> const&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 1, 2, 1, 1, 2> const&)0
mrs_lib::LKF<3, 1, 1>::LKF()0
std::enable_if<(1)!=(0), Eigen::Matrix<double, 4, 1, 0, 4, 1> >::type mrs_lib::LKF<4, 1, 2>::state_predict<1>(Eigen::Matrix<double, 4, 4, 0, 4, 4> const&, Eigen::Matrix<double, 4, 1, 0, 4, 1> const&, Eigen::Matrix<double, 4, 1, 0, 4, 1> const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&)0
mrs_lib::LKF<4, 1, 2>::covariance_predict(Eigen::Matrix<double, 4, 4, 0, 4, 4> const&, Eigen::Matrix<double, 4, 4, 0, 4, 4> const&, Eigen::Matrix<double, 4, 4, 0, 4, 4> const&, double)0
mrs_lib::LKF<4, 1, 2>::correction_optimized(mrs_lib::KalmanFilter<4, 1, 2>::statecov_t const&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&, Eigen::Matrix<double, 2, 4, 0, 2, 4> const&)0
mrs_lib::LKF<4, 1, 2>::invert_W(Eigen::Matrix<double, 2, 2, 0, 2, 2>)0
mrs_lib::LKF<4, 1, 2>::LKF(Eigen::Matrix<double, 4, 4, 0, 4, 4> const&, Eigen::Matrix<double, 4, 1, 0, 4, 1> const&, Eigen::Matrix<double, 2, 4, 0, 2, 4> const&)0
mrs_lib::LKF<4, 1, 2>::LKF()0
mrs_lib::LKF<6, 2, 2>::LKF()0
mrs_lib::varstepLKF<3, 1, 1>::predict(mrs_lib::KalmanFilter<3, 1, 1>::statecov_t const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 3, 3, 0, 3, 3> const&, double) const0
mrs_lib::varstepLKF<6, 2, 2>::predict(mrs_lib::KalmanFilter<6, 2, 2>::statecov_t const&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 6, 6, 0, 6, 6> const&, double) const0
mrs_lib::LKF<2, 1, 1>::inverse_exception::what() const0
mrs_lib::LKF<2, 1, 1>::predict(mrs_lib::KalmanFilter<2, 1, 1>::statecov_t const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&, double) const0
mrs_lib::LKF<3, 1, 1>::inverse_exception::what() const0
std::enable_if<(4)>=(0), mrs_lib::KalmanFilter<4, 1, 2>::statecov_t>::type mrs_lib::LKF<4, 1, 2>::correction_impl<4>(mrs_lib::KalmanFilter<4, 1, 2>::statecov_t const&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&, Eigen::Matrix<double, 2, 4, 0, 2, 4> const&) const0
mrs_lib::LKF<4, 1, 2>::computeKalmanGain(mrs_lib::KalmanFilter<4, 1, 2>::statecov_t const&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&, Eigen::Matrix<double, 2, 4, 0, 2, 4> const&) const0
mrs_lib::LKF<4, 1, 2>::inverse_exception::what() const0
mrs_lib::LKF<4, 1, 2>::correct(mrs_lib::KalmanFilter<4, 1, 2>::statecov_t const&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&) const0
mrs_lib::LKF<4, 1, 2>::predict(mrs_lib::KalmanFilter<4, 1, 2>::statecov_t const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 4, 4, 0, 4, 4> const&, double) const0
mrs_lib::LKF<6, 2, 2>::inverse_exception::what() const0
mrs_lib::varstepLKF<2, 1, 1>::varstepLKF(std::function<Eigen::Matrix<double, 2, 2, 0, 2, 2> (double)> const&, std::function<Eigen::Matrix<double, 2, 1, 0, 2, 1> (double)> const&, Eigen::Matrix<double, 1, 2, 1, 1, 2> const&)3
mrs_lib::LKF<2, 1, 1>::LKF()3
mrs_lib::LKF<6, 2, 2>::LKF(Eigen::Matrix<double, 6, 6, 0, 6, 6> const&, Eigen::Matrix<double, 6, 2, 0, 6, 2> const&, Eigen::Matrix<double, 2, 6, 0, 2, 6> const&)97
mrs_lib::LKF<3, 1, 1>::LKF(Eigen::Matrix<double, 3, 3, 0, 3, 3> const&, Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, Eigen::Matrix<double, 1, 3, 1, 1, 3> const&)167
mrs_lib::LKF<2, 1, 1>::invert_W(Eigen::Matrix<double, 1, 1, 0, 1, 1>)5856
std::enable_if<(2)>=(0), mrs_lib::KalmanFilter<2, 1, 1>::statecov_t>::type mrs_lib::LKF<2, 1, 1>::correction_impl<2>(mrs_lib::KalmanFilter<2, 1, 1>::statecov_t const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 1, 2, 1, 1, 2> const&) const5856
mrs_lib::LKF<2, 1, 1>::computeKalmanGain(mrs_lib::KalmanFilter<2, 1, 1>::statecov_t const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 1, 2, 1, 1, 2> const&) const5856
mrs_lib::LKF<2, 1, 1>::correct(mrs_lib::KalmanFilter<2, 1, 1>::statecov_t const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&) const5856
std::enable_if<(1)!=(0), Eigen::Matrix<double, 2, 1, 0, 2, 1> >::type mrs_lib::LKF<2, 1, 1>::state_predict<1>(Eigen::Matrix<double, 2, 2, 0, 2, 2> const&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&)16344
mrs_lib::LKF<2, 1, 1>::covariance_predict(Eigen::Matrix<double, 2, 2, 0, 2, 2> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&, double)16344
mrs_lib::varstepLKF<2, 1, 1>::predict(mrs_lib::KalmanFilter<2, 1, 1>::statecov_t const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&, double) const16344
mrs_lib::LKF<6, 2, 2>::predict(mrs_lib::KalmanFilter<6, 2, 2>::statecov_t const&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 6, 6, 0, 6, 6> const&, double) const171812
mrs_lib::LKF<6, 2, 2>::covariance_predict(Eigen::Matrix<double, 6, 6, 0, 6, 6> const&, Eigen::Matrix<double, 6, 6, 0, 6, 6> const&, Eigen::Matrix<double, 6, 6, 0, 6, 6> const&, double)171833
std::enable_if<(2)!=(0), Eigen::Matrix<double, 6, 1, 0, 6, 1> >::type mrs_lib::LKF<6, 2, 2>::state_predict<2>(Eigen::Matrix<double, 6, 6, 0, 6, 6> const&, Eigen::Matrix<double, 6, 1, 0, 6, 1> const&, Eigen::Matrix<double, 6, 2, 0, 6, 2> const&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&)171837
mrs_lib::LKF<6, 2, 2>::correct(mrs_lib::KalmanFilter<6, 2, 2>::statecov_t const&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&) const193049
mrs_lib::LKF<6, 2, 2>::invert_W(Eigen::Matrix<double, 2, 2, 0, 2, 2>)193121
mrs_lib::LKF<6, 2, 2>::computeKalmanGain(mrs_lib::KalmanFilter<6, 2, 2>::statecov_t const&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&, Eigen::Matrix<double, 2, 6, 0, 2, 6> const&) const193187
std::enable_if<(6)>=(0), mrs_lib::KalmanFilter<6, 2, 2>::statecov_t>::type mrs_lib::LKF<6, 2, 2>::correction_impl<6>(mrs_lib::KalmanFilter<6, 2, 2>::statecov_t const&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&, Eigen::Matrix<double, 2, 6, 0, 2, 6> const&) const193195
mrs_lib::LKF<3, 1, 1>::predict(mrs_lib::KalmanFilter<3, 1, 1>::statecov_t const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 3, 3, 0, 3, 3> const&, double) const293232
std::enable_if<(1)!=(0), Eigen::Matrix<double, 3, 1, 0, 3, 1> >::type mrs_lib::LKF<3, 1, 1>::state_predict<1>(Eigen::Matrix<double, 3, 3, 0, 3, 3> const&, Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&)293498
mrs_lib::LKF<3, 1, 1>::covariance_predict(Eigen::Matrix<double, 3, 3, 0, 3, 3> const&, Eigen::Matrix<double, 3, 3, 0, 3, 3> const&, Eigen::Matrix<double, 3, 3, 0, 3, 3> const&, double)293630
mrs_lib::LKF<3, 1, 1>::invert_W(Eigen::Matrix<double, 1, 1, 0, 1, 1>)439194
mrs_lib::LKF<3, 1, 1>::computeKalmanGain(mrs_lib::KalmanFilter<3, 1, 1>::statecov_t const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 1, 3, 1, 1, 3> const&) const440703
std::enable_if<(3)>=(0), mrs_lib::KalmanFilter<3, 1, 1>::statecov_t>::type mrs_lib::LKF<3, 1, 1>::correction_impl<3>(mrs_lib::KalmanFilter<3, 1, 1>::statecov_t const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 1, 3, 1, 1, 3> const&) const440711
mrs_lib::LKF<3, 1, 1>::correct(mrs_lib::KalmanFilter<3, 1, 1>::statecov_t const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&) const440726
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/lkf.h.func.html b/mrs_lib/include/mrs_lib/lkf.h.func.html new file mode 100644 index 0000000000..b32471f1b1 --- /dev/null +++ b/mrs_lib/include/mrs_lib/lkf.h.func.html @@ -0,0 +1,268 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/lkf.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - lkf.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:445481.5 %
Date:2024-04-18 23:11:36Functions:254753.2 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::varstepLKF<2, 1, 1>::varstepLKF(std::function<Eigen::Matrix<double, 2, 2, 0, 2, 2> (double)> const&, std::function<Eigen::Matrix<double, 2, 1, 0, 2, 1> (double)> const&, Eigen::Matrix<double, 1, 2, 1, 1, 2> const&)3
mrs_lib::varstepLKF<3, 1, 1>::varstepLKF(std::function<Eigen::Matrix<double, 3, 3, 0, 3, 3> (double)> const&, std::function<Eigen::Matrix<double, 3, 1, 0, 3, 1> (double)> const&, Eigen::Matrix<double, 1, 3, 1, 1, 3> const&)0
mrs_lib::varstepLKF<6, 2, 2>::varstepLKF(std::function<Eigen::Matrix<double, 6, 6, 0, 6, 6> (double)> const&, std::function<Eigen::Matrix<double, 6, 2, 0, 6, 2> (double)> const&, Eigen::Matrix<double, 2, 6, 0, 2, 6> const&)0
std::enable_if<(1)!=(0), Eigen::Matrix<double, 2, 1, 0, 2, 1> >::type mrs_lib::LKF<2, 1, 1>::state_predict<1>(Eigen::Matrix<double, 2, 2, 0, 2, 2> const&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&)16344
mrs_lib::LKF<2, 1, 1>::covariance_predict(Eigen::Matrix<double, 2, 2, 0, 2, 2> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&, double)16344
mrs_lib::LKF<2, 1, 1>::invert_W(Eigen::Matrix<double, 1, 1, 0, 1, 1>)5856
mrs_lib::LKF<2, 1, 1>::LKF(Eigen::Matrix<double, 2, 2, 0, 2, 2> const&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 1, 2, 1, 1, 2> const&)0
mrs_lib::LKF<2, 1, 1>::LKF()3
std::enable_if<(1)!=(0), Eigen::Matrix<double, 3, 1, 0, 3, 1> >::type mrs_lib::LKF<3, 1, 1>::state_predict<1>(Eigen::Matrix<double, 3, 3, 0, 3, 3> const&, Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&)293498
mrs_lib::LKF<3, 1, 1>::covariance_predict(Eigen::Matrix<double, 3, 3, 0, 3, 3> const&, Eigen::Matrix<double, 3, 3, 0, 3, 3> const&, Eigen::Matrix<double, 3, 3, 0, 3, 3> const&, double)293630
mrs_lib::LKF<3, 1, 1>::invert_W(Eigen::Matrix<double, 1, 1, 0, 1, 1>)439194
mrs_lib::LKF<3, 1, 1>::LKF(Eigen::Matrix<double, 3, 3, 0, 3, 3> const&, Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, Eigen::Matrix<double, 1, 3, 1, 1, 3> const&)167
mrs_lib::LKF<3, 1, 1>::LKF()0
std::enable_if<(1)!=(0), Eigen::Matrix<double, 4, 1, 0, 4, 1> >::type mrs_lib::LKF<4, 1, 2>::state_predict<1>(Eigen::Matrix<double, 4, 4, 0, 4, 4> const&, Eigen::Matrix<double, 4, 1, 0, 4, 1> const&, Eigen::Matrix<double, 4, 1, 0, 4, 1> const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&)0
mrs_lib::LKF<4, 1, 2>::covariance_predict(Eigen::Matrix<double, 4, 4, 0, 4, 4> const&, Eigen::Matrix<double, 4, 4, 0, 4, 4> const&, Eigen::Matrix<double, 4, 4, 0, 4, 4> const&, double)0
mrs_lib::LKF<4, 1, 2>::correction_optimized(mrs_lib::KalmanFilter<4, 1, 2>::statecov_t const&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&, Eigen::Matrix<double, 2, 4, 0, 2, 4> const&)0
mrs_lib::LKF<4, 1, 2>::invert_W(Eigen::Matrix<double, 2, 2, 0, 2, 2>)0
mrs_lib::LKF<4, 1, 2>::LKF(Eigen::Matrix<double, 4, 4, 0, 4, 4> const&, Eigen::Matrix<double, 4, 1, 0, 4, 1> const&, Eigen::Matrix<double, 2, 4, 0, 2, 4> const&)0
mrs_lib::LKF<4, 1, 2>::LKF()0
std::enable_if<(2)!=(0), Eigen::Matrix<double, 6, 1, 0, 6, 1> >::type mrs_lib::LKF<6, 2, 2>::state_predict<2>(Eigen::Matrix<double, 6, 6, 0, 6, 6> const&, Eigen::Matrix<double, 6, 1, 0, 6, 1> const&, Eigen::Matrix<double, 6, 2, 0, 6, 2> const&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&)171837
mrs_lib::LKF<6, 2, 2>::covariance_predict(Eigen::Matrix<double, 6, 6, 0, 6, 6> const&, Eigen::Matrix<double, 6, 6, 0, 6, 6> const&, Eigen::Matrix<double, 6, 6, 0, 6, 6> const&, double)171833
mrs_lib::LKF<6, 2, 2>::invert_W(Eigen::Matrix<double, 2, 2, 0, 2, 2>)193121
mrs_lib::LKF<6, 2, 2>::LKF(Eigen::Matrix<double, 6, 6, 0, 6, 6> const&, Eigen::Matrix<double, 6, 2, 0, 6, 2> const&, Eigen::Matrix<double, 2, 6, 0, 2, 6> const&)97
mrs_lib::LKF<6, 2, 2>::LKF()0
mrs_lib::varstepLKF<2, 1, 1>::predict(mrs_lib::KalmanFilter<2, 1, 1>::statecov_t const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&, double) const16344
mrs_lib::varstepLKF<3, 1, 1>::predict(mrs_lib::KalmanFilter<3, 1, 1>::statecov_t const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 3, 3, 0, 3, 3> const&, double) const0
mrs_lib::varstepLKF<6, 2, 2>::predict(mrs_lib::KalmanFilter<6, 2, 2>::statecov_t const&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 6, 6, 0, 6, 6> const&, double) const0
std::enable_if<(2)>=(0), mrs_lib::KalmanFilter<2, 1, 1>::statecov_t>::type mrs_lib::LKF<2, 1, 1>::correction_impl<2>(mrs_lib::KalmanFilter<2, 1, 1>::statecov_t const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 1, 2, 1, 1, 2> const&) const5856
mrs_lib::LKF<2, 1, 1>::computeKalmanGain(mrs_lib::KalmanFilter<2, 1, 1>::statecov_t const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 1, 2, 1, 1, 2> const&) const5856
mrs_lib::LKF<2, 1, 1>::inverse_exception::what() const0
mrs_lib::LKF<2, 1, 1>::correct(mrs_lib::KalmanFilter<2, 1, 1>::statecov_t const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&) const5856
mrs_lib::LKF<2, 1, 1>::predict(mrs_lib::KalmanFilter<2, 1, 1>::statecov_t const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&, double) const0
std::enable_if<(3)>=(0), mrs_lib::KalmanFilter<3, 1, 1>::statecov_t>::type mrs_lib::LKF<3, 1, 1>::correction_impl<3>(mrs_lib::KalmanFilter<3, 1, 1>::statecov_t const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 1, 3, 1, 1, 3> const&) const440711
mrs_lib::LKF<3, 1, 1>::computeKalmanGain(mrs_lib::KalmanFilter<3, 1, 1>::statecov_t const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 1, 3, 1, 1, 3> const&) const440703
mrs_lib::LKF<3, 1, 1>::inverse_exception::what() const0
mrs_lib::LKF<3, 1, 1>::correct(mrs_lib::KalmanFilter<3, 1, 1>::statecov_t const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&) const440726
mrs_lib::LKF<3, 1, 1>::predict(mrs_lib::KalmanFilter<3, 1, 1>::statecov_t const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 3, 3, 0, 3, 3> const&, double) const293232
std::enable_if<(4)>=(0), mrs_lib::KalmanFilter<4, 1, 2>::statecov_t>::type mrs_lib::LKF<4, 1, 2>::correction_impl<4>(mrs_lib::KalmanFilter<4, 1, 2>::statecov_t const&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&, Eigen::Matrix<double, 2, 4, 0, 2, 4> const&) const0
mrs_lib::LKF<4, 1, 2>::computeKalmanGain(mrs_lib::KalmanFilter<4, 1, 2>::statecov_t const&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&, Eigen::Matrix<double, 2, 4, 0, 2, 4> const&) const0
mrs_lib::LKF<4, 1, 2>::inverse_exception::what() const0
mrs_lib::LKF<4, 1, 2>::correct(mrs_lib::KalmanFilter<4, 1, 2>::statecov_t const&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&) const0
mrs_lib::LKF<4, 1, 2>::predict(mrs_lib::KalmanFilter<4, 1, 2>::statecov_t const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 4, 4, 0, 4, 4> const&, double) const0
std::enable_if<(6)>=(0), mrs_lib::KalmanFilter<6, 2, 2>::statecov_t>::type mrs_lib::LKF<6, 2, 2>::correction_impl<6>(mrs_lib::KalmanFilter<6, 2, 2>::statecov_t const&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&, Eigen::Matrix<double, 2, 6, 0, 2, 6> const&) const193195
mrs_lib::LKF<6, 2, 2>::computeKalmanGain(mrs_lib::KalmanFilter<6, 2, 2>::statecov_t const&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&, Eigen::Matrix<double, 2, 6, 0, 2, 6> const&) const193187
mrs_lib::LKF<6, 2, 2>::inverse_exception::what() const0
mrs_lib::LKF<6, 2, 2>::correct(mrs_lib::KalmanFilter<6, 2, 2>::statecov_t const&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&) const193049
mrs_lib::LKF<6, 2, 2>::predict(mrs_lib::KalmanFilter<6, 2, 2>::statecov_t const&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 6, 6, 0, 6, 6> const&, double) const171812
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/lkf.h.gcov.frameset.html b/mrs_lib/include/mrs_lib/lkf.h.gcov.frameset.html new file mode 100644 index 0000000000..60fa6745b7 --- /dev/null +++ b/mrs_lib/include/mrs_lib/lkf.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/lkf.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/include/mrs_lib/lkf.h.gcov.html b/mrs_lib/include/mrs_lib/lkf.h.gcov.html new file mode 100644 index 0000000000..de4c9f6434 --- /dev/null +++ b/mrs_lib/include/mrs_lib/lkf.h.gcov.html @@ -0,0 +1,460 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/lkf.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - lkf.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:445481.5 %
Date:2024-04-18 23:11:36Functions:254753.2 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : // clang: MatousFormat
+       2             : /**  \file LKF
+       3             :      \brief Defines LKF - a class, implementing the Linear Kalman Filter \cite LKF, as well as a few specialized variants.
+       4             :      \author Matouš Vrba - vrbamato@fel.cvut.cz
+       5             :  */
+       6             : #ifndef LKFSYSTEMMODELS_H
+       7             : #define LKFSYSTEMMODELS_H
+       8             : 
+       9             : #include <mrs_lib/kalman_filter.h>
+      10             : #include <iostream>
+      11             : 
+      12             : namespace mrs_lib
+      13             : {
+      14             : 
+      15             :   /* class LKF //{ */
+      16             :   /**
+      17             :   * \brief Implementation of the Linear Kalman filter \cite LKF.
+      18             :   *
+      19             :   * The Linear Kalman filter (abbreviated LKF, \cite LKF) may be used for state filtration or estimation of linear
+      20             :   * stochastic discrete systems. It assumes that noise variables are sampled from multivariate gaussian distributions
+      21             :   * and takes into account apriori known parameters of these distributions (namely zero means and covariance matrices,
+      22             :   * which have to be specified by the user and are tunable parameters).
+      23             :   *
+      24             :   * The LKF C++ class itself is templated. This has its advantages and disadvantages. Main disadvantage is that it
+      25             :   * may be harder to use if you're not familiar with C++ templates, which, admittedly, can get somewhat messy,
+      26             :   * espetially during compilation. Another disadvantage is that if used unwisely, the compilation times can get
+      27             :   * much higher when using templates. The main advantage is compile-time checking (if it compiles, then it has
+      28             :   * a lower chance of crashing at runtime) and enabling more effective optimalizations during compilation. Also in case
+      29             :   * of Eigen, the code is arguably more readable when you use aliases to the specific Matrix instances instead of
+      30             :   * having Eigen::MatrixXd and Eigen::VectorXd everywhere.
+      31             :   *
+      32             :   * \tparam n_states         number of states of the system (length of the \f$ \mathbf{x} \f$ vector).
+      33             :   * \tparam n_inputs         number of inputs of the system (length of the \f$ \mathbf{u} \f$ vector).
+      34             :   * \tparam n_measurements   number of measurements of the system (length of the \f$ \mathbf{z} \f$ vector).
+      35             :   *
+      36             :   */
+      37             :   template <int n_states, int n_inputs, int n_measurements>
+      38             :   class LKF : public KalmanFilter<n_states, n_inputs, n_measurements>
+      39             :   {
+      40             :   public:
+      41             :     /* LKF definitions (typedefs, constants etc) //{ */
+      42             :     static constexpr int n = n_states;            /*!< \brief Length of the state vector of the system. */
+      43             :     static constexpr int m = n_inputs;            /*!< \brief Length of the input vector of the system. */
+      44             :     static constexpr int p = n_measurements;      /*!< \brief Length of the measurement vector of the system. */
+      45             :     using Base_class = KalmanFilter<n, m, p>; /*!< \brief Base class of this class. */
+      46             : 
+      47             :     using x_t = typename Base_class::x_t;                /*!< \brief State vector type \f$n \times 1\f$ */
+      48             :     using u_t = typename Base_class::u_t;                /*!< \brief Input vector type \f$m \times 1\f$ */
+      49             :     using z_t = typename Base_class::z_t;                /*!< \brief Measurement vector type \f$p \times 1\f$ */
+      50             :     using P_t = typename Base_class::P_t;                /*!< \brief State uncertainty covariance matrix type \f$n \times n\f$ */
+      51             :     using R_t = typename Base_class::R_t;                /*!< \brief Measurement noise covariance matrix type \f$p \times p\f$ */
+      52             :     using Q_t = typename Base_class::Q_t;                /*!< \brief Process noise covariance matrix type \f$n \times n\f$ */
+      53             :     using statecov_t = typename Base_class::statecov_t;  /*!< \brief Helper struct for passing around the state and its covariance in one variable */
+      54             : 
+      55             :     typedef Eigen::Matrix<double, n, n> A_t;  /*!< \brief System transition matrix type \f$n \times n\f$ */
+      56             :     typedef Eigen::Matrix<double, n, m> B_t;  /*!< \brief Input to state mapping matrix type \f$n \times m\f$ */
+      57             :     typedef Eigen::Matrix<double, p, n> H_t;  /*!< \brief State to measurement mapping matrix type \f$p \times n\f$ */
+      58             :     typedef Eigen::Matrix<double, n, p> K_t;  /*!< \brief Kalman gain matrix type \f$n \times p\f$ */
+      59             : 
+      60             :   /*!
+      61             :     * \brief This exception is thrown when taking the inverse of a matrix fails.
+      62             :     *
+      63             :     * You should catch this exception in your code and act accordingly if it appears
+      64             :     * (e.g. reset the state and covariance or modify the measurement/process noise parameters).
+      65             :     */
+      66             :     struct inverse_exception : public std::exception
+      67             :     {
+      68             :     /*!
+      69             :       * \brief Returns the error message, describing what caused the exception.
+      70             :       *
+      71             :       * \return  The error message, describing what caused the exception.
+      72             :       */
+      73           0 :       const char* what() const throw()
+      74             :       {
+      75           0 :         return "LKF: could not compute matrix inversion!!! Fix your covariances (the measurement's is probably too low...)";
+      76             :       }
+      77             :     };
+      78             :     //}
+      79             : 
+      80             :   public:
+      81             :   /*!
+      82             :     * \brief Convenience default constructor.
+      83             :     *
+      84             :     * This constructor should not be used if applicable. If used, the main constructor has to be called afterwards,
+      85             :     * before using this class, otherwise the LKF object is invalid (not initialized).
+      86             :     */
+      87           3 :     LKF(){};
+      88             : 
+      89             :   /*!
+      90             :     * \brief The main constructor.
+      91             :     *
+      92             :     * \param A             The state transition matrix.
+      93             :     * \param B             The input to state mapping matrix.
+      94             :     * \param H             The state to measurement mapping matrix.
+      95             :     */
+      96         264 :     LKF(const A_t& A, const B_t& B, const H_t& H) : A(A), B(B), H(H){};
+      97             : 
+      98             :     /* correct() method //{ */
+      99             :   /*!
+     100             :     * \brief Applies the correction (update, measurement, data) step of the Kalman filter.
+     101             :     *
+     102             :     * This method applies the linear Kalman filter correction step to the state and covariance
+     103             :     * passed in \p sc using the measurement \p z and measurement noise \p R. The updated state
+     104             :     * and covariance after the correction step is returned.
+     105             :     *
+     106             :     * \param sc          The state and covariance to which the correction step is to be applied.
+     107             :     * \param z           The measurement vector to be used for correction.
+     108             :     * \param R           The measurement noise covariance matrix to be used for correction.
+     109             :     * \return            The state and covariance after the correction update.
+     110             :     */
+     111      639631 :     virtual statecov_t correct(const statecov_t& sc, const z_t& z, const R_t& R) const override
+     112             :     {
+     113             :       /* return correct_optimized(sc, z, R, H); */
+     114      639631 :       return correction_impl(sc, z, R, H);
+     115             :     };
+     116             :     //}
+     117             : 
+     118             :     /* predict() method //{ */
+     119             :   /*!
+     120             :     * \brief Applies the prediction (time) step of the Kalman filter.
+     121             :     *
+     122             :     * This method applies the linear Kalman filter prediction step to the state and covariance
+     123             :     * passed in \p sc using the input \p u and process noise \p Q. The process noise covariance
+     124             :     * \p Q is scaled by the \p dt parameter. The updated state and covariance after
+     125             :     * the prediction step is returned.
+     126             :     *
+     127             :     * \param sc          The state and covariance to which the prediction step is to be applied.
+     128             :     * \param u           The input vector to be used for prediction.
+     129             :     * \param Q           The process noise covariance matrix to be used for prediction.
+     130             :     * \param dt          Used to scale the process noise covariance \p Q.
+     131             :     * \return            The state and covariance after the prediction step.
+     132             :     *
+     133             :     * \note Note that the \p dt parameter is only used to scale the process noise covariance \p Q it
+     134             :     * does not change the system matrices #A or #B (because there is no unambiguous way to do this)!
+     135             :     * If you have a changing time step duration and a dynamic system, you have to change the #A and #B
+     136             :     * matrices manually.
+     137             :     */
+     138      465044 :     virtual statecov_t predict(const statecov_t& sc, const u_t& u, const Q_t& Q, [[maybe_unused]] double dt) const override
+     139             :     {
+     140      465044 :       statecov_t ret;
+     141      464304 :       ret.x = state_predict(A, sc.x, B, u);
+     142      464381 :       ret.P = covariance_predict(A, sc.P, Q, dt);
+     143      464393 :       return ret;
+     144             :     };
+     145             :     //}
+     146             : 
+     147             :   public:
+     148             :     A_t A;  /*!< \brief The system transition matrix \f$n \times n\f$ */
+     149             :     B_t B;  /*!< \brief The input to state mapping matrix \f$n \times m\f$ */
+     150             :     H_t H;  /*!< \brief The state to measurement mapping matrix \f$p \times n\f$ */
+     151             : 
+     152             :   protected:
+     153             :     /* covariance_predict() method //{ */
+     154      481807 :     static P_t covariance_predict(const A_t& A, const P_t& P, const Q_t& Q, const double dt)
+     155             :     {
+     156      481807 :       return A * P * A.transpose() + dt*Q;
+     157             :     }
+     158             :     //}
+     159             : 
+     160             :     /* state_predict() method //{ */
+     161             :     template <int check = n_inputs>
+     162             :     static inline typename std::enable_if<check == 0, x_t>::type state_predict(const A_t& A, const x_t& x, [[maybe_unused]] const B_t& B,
+     163             :                                                                                [[maybe_unused]] const u_t& u)
+     164             :     {
+     165             :       return A * x;
+     166             :     }
+     167             : 
+     168             :     template <int check = n_inputs>
+     169      481679 :     static inline typename std::enable_if<check != 0, x_t>::type state_predict(const A_t& A, const x_t& x, const B_t& B, const u_t& u)
+     170             :     {
+     171      481679 :       return A * x + B * u;
+     172             :     }
+     173             :     //}
+     174             : 
+     175             :   protected:
+     176             :     /* invert_W() method //{ */
+     177      638171 :     static R_t invert_W(R_t W)
+     178             :     {
+     179      638171 :       Eigen::ColPivHouseholderQR<R_t> qr(W);
+     180      639538 :       if (!qr.isInvertible())
+     181             :       {
+     182             :         // add some stuff to the tmp matrix diagonal to make it invertible
+     183       37824 :         R_t ident = R_t::Identity(W.rows(), W.cols());
+     184       37852 :         W += 1e-9 * ident;
+     185       37872 :         qr.compute(W);
+     186       37882 :         if (!qr.isInvertible())
+     187             :         {
+     188             :           // never managed to make this happen except for explicitly putting NaNs in the input
+     189           0 :           throw inverse_exception();
+     190             :         }
+     191             :       }
+     192      637754 :       const R_t W_inv = qr.inverse();
+     193     1278670 :       return W_inv;
+     194             :     }
+     195             :     //}
+     196             : 
+     197             :     /* computeKalmanGain() method //{ */
+     198      639746 :     virtual K_t computeKalmanGain(const statecov_t& sc, [[maybe_unused]] const z_t& z, const R_t& R, const H_t& H) const
+     199             :     {
+     200             :       // calculation of the kalman gain K
+     201      639746 :       const R_t W = H * sc.P * H.transpose() + R;
+     202      639160 :       const R_t W_inv = invert_W(W);
+     203      639350 :       const K_t K = sc.P * H.transpose() * W_inv;
+     204     1277808 :       return K;
+     205             :     }
+     206             :     //}
+     207             : 
+     208             :     /* correction_impl() method //{ */
+     209             :     template<int check=n>
+     210      639762 :     typename std::enable_if<check >= 0, statecov_t>::type correction_impl(const statecov_t& sc, const z_t& z, const R_t& R, const H_t& H) const
+     211             :     {
+     212             :       // the correction phase
+     213      639762 :       statecov_t ret;
+     214      639172 :       const K_t K = computeKalmanGain(sc, z, R, H);
+     215      638811 :       ret.x = sc.x + K * (z - (H * sc.x));
+     216      639026 :       ret.P = (P_t::Identity() - (K * H)) * sc.P;
+     217     1277076 :       return ret;
+     218             :     }
+     219             : 
+     220             :     template<int check=n>
+     221             :     typename std::enable_if<check < 0, statecov_t>::type correction_impl(const statecov_t& sc, const z_t& z, const R_t& R, const H_t& H) const
+     222             :     {
+     223             :       // the correction phase
+     224             :       statecov_t ret;
+     225             :       const K_t K = computeKalmanGain(sc, z, R, H);
+     226             :       ret.x = sc.x + K * (z - (H * sc.x));
+     227             :       ret.P = (P_t::Identity(sc.P.rows(), sc.P.cols()) - (K * H)) * sc.P;
+     228             :       return ret;
+     229             :     }
+     230             :     //}
+     231             : 
+     232             :     // NOT USED METHODS
+     233             :     /* correction_optimized() method //{ */
+     234             :     // No notable performance gain was observed for the matrix sizes we use, so this is not used.
+     235           0 :     static statecov_t correction_optimized(const statecov_t& sc, const z_t& z, const R_t& R, const H_t& H)
+     236             :     {
+     237           0 :       statecov_t ret = sc;
+     238           0 :       const H_t B(H*sc.P.transpose());
+     239           0 :       const K_t K((B*H.transpose() + R).ldlt().solve(B).transpose());
+     240           0 :       ret.x.noalias() += K*(z - H*sc.x);
+     241           0 :       ret.P.noalias() -= K*H*sc.P;
+     242           0 :       return ret;
+     243             :     }
+     244             : 
+     245             :     /* static statecov_t correction_optimized(const statecov_t& sc, const z_t& z, const R_t& R, const H_t& H) */
+     246             :     /* { */
+     247             :     /*   statecov_t ret; */
+     248             :     /*   const H_t B = H*sc.P.transpose(); */
+     249             :     /*   const K_t K = (B*H.transpose() + R).partialPivLu().solve(B).transpose(); */
+     250             :     /*   ret.x = sc.x + K*(z - H*sc.x); */
+     251             :     /*   ret.P = sc.P - K*H*sc.P; */
+     252             :     /*   return ret; */
+     253             :     /* } */
+     254             :     //}
+     255             :   };
+     256             :   //}
+     257             : 
+     258             :   /* class dtMatrixLKF //{ */
+     259             :   template <int n_states, int n_inputs, int n_measurements>
+     260             :   class varstepLKF : public LKF<n_states, n_inputs, n_measurements>
+     261             :   {
+     262             :   public:
+     263             :     /* LKF definitions (typedefs, constants etc) //{ */
+     264             :     static const int n = n_states;
+     265             :     static const int m = n_inputs;
+     266             :     static const int p = n_measurements;
+     267             :     using Base_class = LKF<n, m, p>;
+     268             : 
+     269             :     using x_t = typename Base_class::x_t;
+     270             :     using u_t = typename Base_class::u_t;
+     271             :     using z_t = typename Base_class::z_t;
+     272             :     using P_t = typename Base_class::P_t;
+     273             :     using R_t = typename Base_class::R_t;
+     274             :     using statecov_t = typename Base_class::statecov_t;
+     275             :     using A_t = typename Base_class::A_t;  // measurement mapping p*n
+     276             :     using B_t = typename Base_class::B_t;  // process covariance n*n
+     277             :     using H_t = typename Base_class::H_t;  // measurement mapping p*n
+     278             :     using Q_t = typename Base_class::Q_t;  // process covariance n*n
+     279             : 
+     280             :     using generateA_t = std::function<A_t(double)>;
+     281             :     using generateB_t = std::function<B_t(double)>;
+     282             :     //}
+     283             : 
+     284             :   public:
+     285             : 
+     286             :   /*!
+     287             :     * \brief The main constructor.
+     288             :     *
+     289             :     * \param generateA a function, which returns the state transition matrix \p A based on the time difference \p dt.
+     290             :     * \param generateB a function, which returns the input to state mapping matrix \p B based on the time difference \p dt.
+     291             :     * \param H         the state to measurement mapping matrix.
+     292             :     */
+     293           3 :     varstepLKF(const generateA_t& generateA, const generateB_t& generateB, const H_t& H)
+     294           3 :       : m_generateA(generateA), m_generateB(generateB)
+     295             :     {
+     296           3 :       Base_class::H = H;
+     297           3 :     };
+     298             : 
+     299             :     /* predict() method //{ */
+     300             :   /*!
+     301             :     * \brief Applies the prediction (time) step of the Kalman filter.
+     302             :     *
+     303             :     * This method applies the linear Kalman filter prediction step to the state and covariance
+     304             :     * passed in \p sc using the input \p u and process noise \p Q. The process noise covariance
+     305             :     * \p Q is scaled by the \p dt parameter. The updated state and covariance after
+     306             :     * the prediction step is returned.
+     307             :     *
+     308             :     * \param sc          The state and covariance to which the prediction step is to be applied.
+     309             :     * \param u           The input vector to be used for prediction.
+     310             :     * \param Q           The process noise covariance matrix to be used for prediction.
+     311             :     * \param dt          Used to scale the process noise covariance \p Q and to generate the state transition and input to state mapping matrices \p A and \B using the functions, passed in the object's constructor.
+     312             :     * \return            The state and covariance after the prediction step.
+     313             :     *
+     314             :     * \note Note that the \p dt parameter is used to scale the process noise covariance \p Q and to generate the system matrices #A or #B using the functions, passed in the constructor!
+     315             :     */
+     316       16344 :     virtual statecov_t predict(const statecov_t& sc, const u_t& u, const Q_t& Q, double dt) const override
+     317             :     {
+     318       16344 :       statecov_t ret;
+     319       16344 :       A_t A = m_generateA(dt);
+     320       16344 :       B_t B = m_generateB(dt);
+     321       16344 :       ret.x = Base_class::state_predict(A, sc.x, B, u);
+     322       16344 :       ret.P = Base_class::covariance_predict(A, sc.P, Q, dt);
+     323       32688 :       return ret;
+     324             :     };
+     325             :     //}
+     326             :     
+     327             :   private:
+     328             :     generateA_t m_generateA;
+     329             :     generateB_t m_generateB;
+     330             :   };
+     331             :   //}
+     332             : 
+     333             :   /* class LKF_MRS_odom //{ */
+     334             :   class LKF_MRS_odom : public LKF<3, 1, 1>
+     335             :   {
+     336             :   public:
+     337             :     /* LKF definitions (typedefs, constants etc) //{ */
+     338             :     static const int n = 3;
+     339             :     static const int m = 1;
+     340             :     static const int p = 1;
+     341             :     using Base_class = LKF<n, m, p>;
+     342             : 
+     343             :     using x_t = typename Base_class::x_t;
+     344             :     using u_t = typename Base_class::u_t;
+     345             :     using z_t = typename Base_class::z_t;
+     346             :     using P_t = typename Base_class::P_t;
+     347             :     using R_t = typename Base_class::R_t;
+     348             :     using statecov_t = typename Base_class::statecov_t;
+     349             :     using A_t = typename Base_class::A_t;  // measurement mapping p*n
+     350             :     using B_t = typename Base_class::B_t;  // process covariance n*n
+     351             :     using H_t = typename Base_class::H_t;  // measurement mapping p*n
+     352             :     using Q_t = typename Base_class::Q_t;  // process covariance n*n
+     353             : 
+     354             :     using coeff_A_t = A_t;                            // matrix of constant coefficients in matrix A
+     355             :     typedef Eigen::Matrix<unsigned, n, n> dtexp_A_t;  // matrix of dt exponents in matrix A
+     356             :     using coeff_B_t = B_t;                            // matrix of constant coefficients in matrix B
+     357             :     typedef Eigen::Matrix<unsigned, n, m> dtexp_B_t;  // matrix of dt exponents in matrix B
+     358             :     //}
+     359             : 
+     360             :   public:
+     361             :     LKF_MRS_odom(const std::vector<H_t>& Hs, const double default_dt = 1);
+     362             :     virtual statecov_t predict(const statecov_t& sc, const u_t& u, const Q_t& Q, double dt) const override;
+     363             :     virtual statecov_t correct(const statecov_t& sc, const z_t& z, const R_t& R, int param = 0) const;
+     364             : 
+     365             :   public:
+     366             :     x_t state_predict_optimized(const x_t& x_prev, const u_t& u, double dt) const;
+     367             :     P_t covariance_predict_optimized(const P_t& P, const Q_t& Q, double dt) const;
+     368             : 
+     369             :   private:
+     370             :     std::vector<H_t> m_Hs;
+     371             :   };
+     372             :   //}
+     373             : 
+     374             : }  // namespace mrs_lib
+     375             : 
+     376             : #endif // LKFSYSTEMMODELS_H
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/lkf.h.gcov.overview.html b/mrs_lib/include/mrs_lib/lkf.h.gcov.overview.html new file mode 100644 index 0000000000..1e9597d534 --- /dev/null +++ b/mrs_lib/include/mrs_lib/lkf.h.gcov.overview.html @@ -0,0 +1,114 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/lkf.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/include/mrs_lib/lkf.h.gcov.png b/mrs_lib/include/mrs_lib/lkf.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..05cf672e576224906233fe48ec21708336bc253d GIT binary patch literal 1750 zcmV;{1}XW8P)=6legnx+l_P+MYm!lPS#C}Nxki0KGD^nk)CSbq7WG>_kok@cd06$*#L+i(P!undeF?0}4}V4Hzz zJ18#dU<`x^)|f2w8ts?S9mr(jg5_EX9Z{SlgrGC5OBg5+90x}FcnhS}ATGu}PHqq0 z9H`2W#l_^TZjekUtj_|*&rwA46m~SJJrxlejK}O~=|G+dGlAqyJ)i_=7cgR#(qj#A z&?)?>Um0-Rk%*Z-AQ7e`$lN9OwM zTGJTxEY2F*Hs#m~I6zSda%m~6O3Ec=ZNh8dDk12SpWFt&TyD#_bjQ?(5OCOzf!Fg6 zaEKz_$_m4n*8>6ozou&4L(U}oE&9`_ra*gT@5P^rtTT^ za5S4Hav>kMm71um62Iq!CF?`;j5Hv@(%H=RnARB`3aTZC$vTCR3#iDm%|#WcT@>|@ z1cYhJIvOoA%@H?C&a}AJ&0MbOdR_iPmjyU`-E87XqX9T;Tht6V`XiD)up9L zlUN&uisw$!vkHf`hDf4>qHY$dB4f}JJ@E1h%s+5q$LZu|3K$ELk*po}=Z?n5LJCHT z{FDPY&k|8`P^mn#22x7h(w89Blk}rOYLm&@NRY1s`fNQ@q*{$g%KSclB zEhEPszc#6*cbwCle+1z)4_7m@34Gbru0m4{Y23qOa3$`68(+$rHZPJG-HdF#6S21_XQZI(&$ z;z*Fzhrm{Y{EZ8B~yZ~tVV^X0VsN{DI9_ks3Bh1L@r;A&0c5MZFi z9b+?hSzsH*z`iOY=JD>3_+alU0C@XkS1XFk;woBKuY!#Dm~O~}iKYj(njK+Gwb8vG zVcUEgXZ4CrgZCj|8(Z3E?7f>d#rg{@zZA&ku?IREe1&3h{s}!Ghr%~fbPtKbs|w^V zfS=p&byNKGVZ8X6ZZ((ZG#wzYXUIWLBE5eUKX@3g?Ud~3t$xiLLz~{Z(!?Ivyqb6R z!Y(5R5H8f^=Uy22fB3mF&$k|a23>_ebNE>bG5wYkNVA)960qDBzEw{)>%hv%=C3)^ zbk4Q}_udm;;8(N&y@;zjBC?jNz%QxnyE{#%1OHd{9Uz@jm~LC&HiEihOx@MQ$}24z-zRls#8bC&;+v)$A(vKiojj3b#V sYQfaRxmlm>Jiz7HX$@zTer%uSA5hR)7d&;<(*OVf07*qoM6N<$f>Mk-2LJ#7 literal 0 HcmV?d00001 diff --git a/mrs_lib/include/mrs_lib/msg_extractor.h.func-sort-c.html b/mrs_lib/include/mrs_lib/msg_extractor.h.func-sort-c.html new file mode 100644 index 0000000000..484f03850c --- /dev/null +++ b/mrs_lib/include/mrs_lib/msg_extractor.h.func-sort-c.html @@ -0,0 +1,256 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/msg_extractor.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - msg_extractor.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:339933.3 %
Date:2024-04-18 23:11:36Functions:154434.1 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::getHeading(boost::shared_ptr<geometry_msgs::PoseWithCovariance_<std::allocator<void> > const> const&)0
mrs_lib::getHeading(boost::shared_ptr<geometry_msgs::Pose_<std::allocator<void> > const> const&)0
mrs_lib::getHeading(boost::shared_ptr<mrs_msgs::Reference_<std::allocator<void> > const> const&)0
mrs_lib::getHeading(boost::shared_ptr<mrs_msgs::TrackerCommand_<std::allocator<void> > const> const&)0
mrs_lib::getHeading(boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > const> const&)0
mrs_lib::getHeading(mrs_msgs::TrackerCommand_<std::allocator<void> > const&)0
mrs_lib::getPosition(boost::shared_ptr<geometry_msgs::PoseWithCovariance_<std::allocator<void> > const> const&)0
mrs_lib::getPosition(boost::shared_ptr<geometry_msgs::TwistWithCovariance_<std::allocator<void> > const> const&)0
mrs_lib::getPosition(boost::shared_ptr<geometry_msgs::Pose_<std::allocator<void> > const> const&)0
mrs_lib::getPosition(boost::shared_ptr<geometry_msgs::Twist_<std::allocator<void> > const> const&)0
mrs_lib::getPosition(boost::shared_ptr<mrs_msgs::Reference_<std::allocator<void> > const> const&)0
mrs_lib::getPosition(boost::shared_ptr<mrs_msgs::TrackerCommand_<std::allocator<void> > const> const&)0
mrs_lib::getPosition(boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > const> const&)0
mrs_lib::getVelocity(geometry_msgs::TwistWithCovariance_<std::allocator<void> > const&)0
mrs_lib::getVelocity(geometry_msgs::Twist_<std::allocator<void> > const&)0
mrs_lib::getVelocity(boost::shared_ptr<mrs_msgs::TrackerCommand_<std::allocator<void> > const> const&)0
mrs_lib::getVelocity(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const> const&)0
mrs_lib::getVelocity(mrs_msgs::TrackerCommand_<std::allocator<void> > const&)0
mrs_lib::getVelocity(nav_msgs::Odometry_<std::allocator<void> > const&)0
mrs_lib::getXYZ(geometry_msgs::Vector3_<std::allocator<void> > const&)0
mrs_lib::getXYZ(boost::shared_ptr<geometry_msgs::Point_<std::allocator<void> > const> const&)0
mrs_lib::getXYZ(boost::shared_ptr<geometry_msgs::Vector3_<std::allocator<void> > const> const&)0
mrs_lib::getYaw(geometry_msgs::PoseWithCovariance_<std::allocator<void> > const&)0
mrs_lib::getYaw(geometry_msgs::Pose_<std::allocator<void> > const&)0
mrs_lib::getYaw(boost::shared_ptr<geometry_msgs::PoseWithCovariance_<std::allocator<void> > const> const&)0
mrs_lib::getYaw(boost::shared_ptr<geometry_msgs::Pose_<std::allocator<void> > const> const&)0
mrs_lib::getYaw(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const> const&)0
mrs_lib::getYaw(nav_msgs::Odometry_<std::allocator<void> > const&)0
mrs_lib::getPose(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const> const&)0
mrs_lib::getHeading(mrs_msgs::Reference_<std::allocator<void> > const&)360
mrs_lib::getHeading(mrs_msgs::ReferenceStamped_<std::allocator<void> > const&)360
mrs_lib::getPosition(mrs_msgs::Reference_<std::allocator<void> > const&)360
mrs_lib::getPosition(mrs_msgs::TrackerCommand_<std::allocator<void> > const&)360
mrs_lib::getPosition(mrs_msgs::ReferenceStamped_<std::allocator<void> > const&)360
mrs_lib::getPose(nav_msgs::Odometry_<std::allocator<void> > const&)1594
mrs_lib::getHeading(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const> const&)205701
mrs_lib::getHeading(nav_msgs::Odometry_<std::allocator<void> > const&)205701
mrs_lib::getPosition(geometry_msgs::Pose_<std::allocator<void> > const&)205702
mrs_lib::getHeading(geometry_msgs::PoseWithCovariance_<std::allocator<void> > const&)205703
mrs_lib::getPosition(geometry_msgs::PoseWithCovariance_<std::allocator<void> > const&)205703
mrs_lib::getHeading(geometry_msgs::Pose_<std::allocator<void> > const&)205704
mrs_lib::getPosition(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const> const&)205704
mrs_lib::getPosition(nav_msgs::Odometry_<std::allocator<void> > const&)205704
mrs_lib::getXYZ(geometry_msgs::Point_<std::allocator<void> > const&)206423
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/msg_extractor.h.func.html b/mrs_lib/include/mrs_lib/msg_extractor.h.func.html new file mode 100644 index 0000000000..6ff98bdba2 --- /dev/null +++ b/mrs_lib/include/mrs_lib/msg_extractor.h.func.html @@ -0,0 +1,256 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/msg_extractor.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - msg_extractor.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:339933.3 %
Date:2024-04-18 23:11:36Functions:154434.1 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::getHeading(geometry_msgs::PoseWithCovariance_<std::allocator<void> > const&)205703
mrs_lib::getHeading(geometry_msgs::Pose_<std::allocator<void> > const&)205704
mrs_lib::getHeading(boost::shared_ptr<geometry_msgs::PoseWithCovariance_<std::allocator<void> > const> const&)0
mrs_lib::getHeading(boost::shared_ptr<geometry_msgs::Pose_<std::allocator<void> > const> const&)0
mrs_lib::getHeading(boost::shared_ptr<mrs_msgs::Reference_<std::allocator<void> > const> const&)0
mrs_lib::getHeading(boost::shared_ptr<mrs_msgs::TrackerCommand_<std::allocator<void> > const> const&)0
mrs_lib::getHeading(boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > const> const&)0
mrs_lib::getHeading(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const> const&)205701
mrs_lib::getHeading(mrs_msgs::Reference_<std::allocator<void> > const&)360
mrs_lib::getHeading(mrs_msgs::TrackerCommand_<std::allocator<void> > const&)0
mrs_lib::getHeading(mrs_msgs::ReferenceStamped_<std::allocator<void> > const&)360
mrs_lib::getHeading(nav_msgs::Odometry_<std::allocator<void> > const&)205701
mrs_lib::getPosition(geometry_msgs::PoseWithCovariance_<std::allocator<void> > const&)205703
mrs_lib::getPosition(geometry_msgs::Pose_<std::allocator<void> > const&)205702
mrs_lib::getPosition(boost::shared_ptr<geometry_msgs::PoseWithCovariance_<std::allocator<void> > const> const&)0
mrs_lib::getPosition(boost::shared_ptr<geometry_msgs::TwistWithCovariance_<std::allocator<void> > const> const&)0
mrs_lib::getPosition(boost::shared_ptr<geometry_msgs::Pose_<std::allocator<void> > const> const&)0
mrs_lib::getPosition(boost::shared_ptr<geometry_msgs::Twist_<std::allocator<void> > const> const&)0
mrs_lib::getPosition(boost::shared_ptr<mrs_msgs::Reference_<std::allocator<void> > const> const&)0
mrs_lib::getPosition(boost::shared_ptr<mrs_msgs::TrackerCommand_<std::allocator<void> > const> const&)0
mrs_lib::getPosition(boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > const> const&)0
mrs_lib::getPosition(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const> const&)205704
mrs_lib::getPosition(mrs_msgs::Reference_<std::allocator<void> > const&)360
mrs_lib::getPosition(mrs_msgs::TrackerCommand_<std::allocator<void> > const&)360
mrs_lib::getPosition(mrs_msgs::ReferenceStamped_<std::allocator<void> > const&)360
mrs_lib::getPosition(nav_msgs::Odometry_<std::allocator<void> > const&)205704
mrs_lib::getVelocity(geometry_msgs::TwistWithCovariance_<std::allocator<void> > const&)0
mrs_lib::getVelocity(geometry_msgs::Twist_<std::allocator<void> > const&)0
mrs_lib::getVelocity(boost::shared_ptr<mrs_msgs::TrackerCommand_<std::allocator<void> > const> const&)0
mrs_lib::getVelocity(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const> const&)0
mrs_lib::getVelocity(mrs_msgs::TrackerCommand_<std::allocator<void> > const&)0
mrs_lib::getVelocity(nav_msgs::Odometry_<std::allocator<void> > const&)0
mrs_lib::getXYZ(geometry_msgs::Point_<std::allocator<void> > const&)206423
mrs_lib::getXYZ(geometry_msgs::Vector3_<std::allocator<void> > const&)0
mrs_lib::getXYZ(boost::shared_ptr<geometry_msgs::Point_<std::allocator<void> > const> const&)0
mrs_lib::getXYZ(boost::shared_ptr<geometry_msgs::Vector3_<std::allocator<void> > const> const&)0
mrs_lib::getYaw(geometry_msgs::PoseWithCovariance_<std::allocator<void> > const&)0
mrs_lib::getYaw(geometry_msgs::Pose_<std::allocator<void> > const&)0
mrs_lib::getYaw(boost::shared_ptr<geometry_msgs::PoseWithCovariance_<std::allocator<void> > const> const&)0
mrs_lib::getYaw(boost::shared_ptr<geometry_msgs::Pose_<std::allocator<void> > const> const&)0
mrs_lib::getYaw(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const> const&)0
mrs_lib::getYaw(nav_msgs::Odometry_<std::allocator<void> > const&)0
mrs_lib::getPose(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const> const&)0
mrs_lib::getPose(nav_msgs::Odometry_<std::allocator<void> > const&)1594
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/msg_extractor.h.gcov.frameset.html b/mrs_lib/include/mrs_lib/msg_extractor.h.gcov.frameset.html new file mode 100644 index 0000000000..3c229c2d36 --- /dev/null +++ b/mrs_lib/include/mrs_lib/msg_extractor.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/msg_extractor.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/include/mrs_lib/msg_extractor.h.gcov.html b/mrs_lib/include/mrs_lib/msg_extractor.h.gcov.html new file mode 100644 index 0000000000..e76cfc98e7 --- /dev/null +++ b/mrs_lib/include/mrs_lib/msg_extractor.h.gcov.html @@ -0,0 +1,775 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/msg_extractor.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - msg_extractor.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:339933.3 %
Date:2024-04-18 23:11:36Functions:154434.1 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : // clang: TomasFormat
+       2             : /**  \file
+       3             :  *   \brief utility functions for getting stuff from ROS msgs
+       4             :  *   \author Tomas Baca - tomas.baca@fel.cvut.cz
+       5             :  */
+       6             : #ifndef MRS_LIB_MSG_EXTRACTOR_H
+       7             : #define MRS_LIB_MSG_EXTRACTOR_H
+       8             : 
+       9             : #include <mrs_msgs/TrackerCommand.h>
+      10             : #include <mrs_msgs/Reference.h>
+      11             : #include <mrs_msgs/ReferenceStamped.h>
+      12             : 
+      13             : #include <nav_msgs/Odometry.h>
+      14             : 
+      15             : #include <mrs_lib/attitude_converter.h>
+      16             : 
+      17             : namespace mrs_lib
+      18             : {
+      19             : 
+      20             : /* geometry_msgs::Point //{ */
+      21             : 
+      22             : /**
+      23             :  * @brief get XYZ from geometry_msgs::Point
+      24             :  *
+      25             :  * @param data point
+      26             :  *
+      27             :  * @return x, y, z
+      28             :  */
+      29      206423 : std::tuple<double, double, double> getXYZ(const geometry_msgs::Point& data) {
+      30             : 
+      31      206423 :   double x = data.x;
+      32      206423 :   double y = data.y;
+      33      206423 :   double z = data.z;
+      34             : 
+      35      412843 :   return std::tuple(x, y, z);
+      36             : }
+      37             : 
+      38             : /**
+      39             :  * @brief get XYZ from geometry_msgs::PointConstPtr
+      40             :  *
+      41             :  * @param data point (ConstPtr)
+      42             :  *
+      43             :  * @return x, y, z
+      44             :  */
+      45           0 : std::tuple<double, double, double> getXYZ(const geometry_msgs::PointConstPtr& data) {
+      46             : 
+      47           0 :   return getXYZ(*data);
+      48             : }
+      49             : 
+      50             : //}
+      51             : 
+      52             : /* geometry_msgs::Vector3 //{ */
+      53             : 
+      54             : /**
+      55             :  * @brief get XYZ from geometry_msgs::Vector3
+      56             :  *
+      57             :  * @param data vector3
+      58             :  *
+      59             :  * @return x, y, z
+      60             :  */
+      61           0 : std::tuple<double, double, double> getXYZ(const geometry_msgs::Vector3& data) {
+      62             : 
+      63           0 :   double x = data.x;
+      64           0 :   double y = data.y;
+      65           0 :   double z = data.z;
+      66             : 
+      67           0 :   return std::tuple(x, y, z);
+      68             : }
+      69             : 
+      70             : /**
+      71             :  * @brief get XYZ from geometry_msgs::Vector3ConstPtr
+      72             :  *
+      73             :  * @param data vector3 (ConstPtr)
+      74             :  *
+      75             :  * @return x, y, z
+      76             :  */
+      77           0 : std::tuple<double, double, double> getXYZ(const geometry_msgs::Vector3ConstPtr& data) {
+      78             : 
+      79           0 :   return getXYZ(*data);
+      80             : }
+      81             : 
+      82             : //}
+      83             : 
+      84             : /* geometry_msgs::Pose //{ */
+      85             : 
+      86             : /* getPosition() //{ */
+      87             : 
+      88             : /**
+      89             :  * @brief get position from geometry_msgs::Pose
+      90             :  *
+      91             :  * @param data pose
+      92             :  *
+      93             :  * @return x, y, z
+      94             :  */
+      95      205702 : std::tuple<double, double, double> getPosition(const geometry_msgs::Pose& data) {
+      96             : 
+      97      205702 :   return getXYZ(data.position);
+      98             : }
+      99             : 
+     100             : /**
+     101             :  * @brief get position from geometry_msgs::PoseConstPtr
+     102             :  *
+     103             :  * @param data pose (ConstPtr)
+     104             :  *
+     105             :  * @return x, y, z
+     106             :  */
+     107           0 : std::tuple<double, double, double> getPosition(const geometry_msgs::PoseConstPtr& data) {
+     108             : 
+     109           0 :   return getPosition(*data);
+     110             : }
+     111             : 
+     112             : //}
+     113             : 
+     114             : /* getHeading() //{ */
+     115             : 
+     116             : /**
+     117             :  * @brief get heading from geometry_msgs::Pose
+     118             :  *
+     119             :  * @param data pose
+     120             :  *
+     121             :  * @return heading
+     122             :  */
+     123      205704 : double getHeading(const geometry_msgs::Pose& data) {
+     124             : 
+     125      205704 :   return mrs_lib::AttitudeConverter(data.orientation).getHeading();
+     126             : }
+     127             : 
+     128             : /**
+     129             :  * @brief get heading from geometry_msgs::PoseConstPtr
+     130             :  *
+     131             :  * @param data pose (ConstPtr)
+     132             :  *
+     133             :  * @return heading
+     134             :  */
+     135           0 : double getHeading(const geometry_msgs::PoseConstPtr& data) {
+     136             : 
+     137           0 :   return getHeading(*data);
+     138             : }
+     139             : 
+     140             : //}
+     141             : 
+     142             : /* getYaw() //{ */
+     143             : 
+     144             : /**
+     145             :  * @brief get yaw from geometry_msgs::Pose
+     146             :  *
+     147             :  * @param data pose
+     148             :  *
+     149             :  * @return yaw
+     150             :  */
+     151           0 : double getYaw(const geometry_msgs::Pose& data) {
+     152             : 
+     153           0 :   return mrs_lib::AttitudeConverter(data.orientation).getYaw();
+     154             : }
+     155             : 
+     156             : /**
+     157             :  * @brief get yaw from geometry_msgs::PoseConstPtr
+     158             :  *
+     159             :  * @param data pose (ConstPtr)
+     160             :  *
+     161             :  * @return yaw
+     162             :  */
+     163           0 : double getYaw(const geometry_msgs::PoseConstPtr& data) {
+     164             : 
+     165           0 :   return getYaw(*data);
+     166             : }
+     167             : 
+     168             : //}
+     169             : 
+     170             : //}
+     171             : 
+     172             : /* geometry_msgs::PoseWithCovariance //{ */
+     173             : 
+     174             : /* getPosition() //{ */
+     175             : 
+     176             : /**
+     177             :  * @brief get position from geometry_msgs::PoseWithCovariance
+     178             :  *
+     179             :  * @param data pose with covariance
+     180             :  *
+     181             :  * @return x, y, z
+     182             :  */
+     183      205703 : std::tuple<double, double, double> getPosition(const geometry_msgs::PoseWithCovariance& data) {
+     184             : 
+     185      205703 :   return getPosition(data.pose);
+     186             : }
+     187             : 
+     188             : /**
+     189             :  * @brief get position from geometry_msgs::PoseWithCovarianceConstPtr
+     190             :  *
+     191             :  * @param data pose with covariance (ConstPtr)
+     192             :  *
+     193             :  * @return x, y, z
+     194             :  */
+     195           0 : std::tuple<double, double, double> getPosition(const geometry_msgs::PoseWithCovarianceConstPtr& data) {
+     196             : 
+     197           0 :   return getPosition(*data);
+     198             : }
+     199             : 
+     200             : //}
+     201             : 
+     202             : /* getHeading() //{ */
+     203             : 
+     204             : /**
+     205             :  * @brief get heading from geometry_msgs::PoseWithCovariance
+     206             :  *
+     207             :  * @param data pose with covariance
+     208             :  *
+     209             :  * @return heading
+     210             :  */
+     211      205703 : double getHeading(const geometry_msgs::PoseWithCovariance& data) {
+     212             : 
+     213      205703 :   return getHeading(data.pose);
+     214             : }
+     215             : 
+     216             : /**
+     217             :  * @brief get heading from geometry_msgs::PoseWithCovarianceConstPtr
+     218             :  *
+     219             :  * @param data pose with covariance (ConstPtr)
+     220             :  *
+     221             :  * @return heading
+     222             :  */
+     223           0 : double getHeading(const geometry_msgs::PoseWithCovarianceConstPtr& data) {
+     224             : 
+     225           0 :   return getHeading(*data);
+     226             : }
+     227             : 
+     228             : //}
+     229             : 
+     230             : /* getYaw() //{ */
+     231             : 
+     232             : /**
+     233             :  * @brief get yaw from geometry_msgs::PoseWithCovariance
+     234             :  *
+     235             :  * @param data pose with covariance
+     236             :  *
+     237             :  * @return yaw
+     238             :  */
+     239           0 : double getYaw(const geometry_msgs::PoseWithCovariance& data) {
+     240             : 
+     241           0 :   return getYaw(data.pose);
+     242             : }
+     243             : 
+     244             : /**
+     245             :  * @brief get yaw from geometry_msgs::PoseWithCovarianceConstPtr
+     246             :  *
+     247             :  * @param data pose with covariance (ConstPtr)
+     248             :  *
+     249             :  * @return yaw
+     250             :  */
+     251           0 : double getYaw(const geometry_msgs::PoseWithCovarianceConstPtr& data) {
+     252             : 
+     253           0 :   return getYaw(*data);
+     254             : }
+     255             : 
+     256             : //}
+     257             : 
+     258             : //}
+     259             : 
+     260             : /* geometry_msgs::Twist //{ */
+     261             : 
+     262             : /* getVelocity() //{ */
+     263             : 
+     264             : /**
+     265             :  * @brief get velocity from geometry_msgs::Twist
+     266             :  *
+     267             :  * @param data twist
+     268             :  *
+     269             :  * @return x, y, z
+     270             :  */
+     271           0 : std::tuple<double, double, double> getVelocity(const geometry_msgs::Twist& data) {
+     272             : 
+     273           0 :   return getXYZ(data.linear);
+     274             : }
+     275             : 
+     276             : /**
+     277             :  * @brief get position from geometry_msgs::TwistConstPtr
+     278             :  *
+     279             :  * @param data twist (ConstPtr)
+     280             :  *
+     281             :  * @return x, y, z
+     282             :  */
+     283           0 : std::tuple<double, double, double> getPosition(const geometry_msgs::TwistConstPtr& data) {
+     284             : 
+     285           0 :   return getVelocity(*data);
+     286             : }
+     287             : 
+     288             : //}
+     289             : 
+     290             : //}
+     291             : 
+     292             : /* geometry_msgs::TwistWithCovariance //{ */
+     293             : 
+     294             : /* getVelocity() //{ */
+     295             : 
+     296             : /**
+     297             :  * @brief get velocity from geometry_msgs::TwistWithCovariance
+     298             :  *
+     299             :  * @param data twistwithcovariance
+     300             :  *
+     301             :  * @return x, y, z
+     302             :  */
+     303           0 : std::tuple<double, double, double> getVelocity(const geometry_msgs::TwistWithCovariance& data) {
+     304             : 
+     305           0 :   return getVelocity(data.twist);
+     306             : }
+     307             : 
+     308             : /**
+     309             :  * @brief get position from geometry_msgs::TwistWithCovarianceConstPtr
+     310             :  *
+     311             :  * @param data twistwithcovariance (ConstPtr)
+     312             :  *
+     313             :  * @return x, y, z
+     314             :  */
+     315           0 : std::tuple<double, double, double> getPosition(const geometry_msgs::TwistWithCovarianceConstPtr& data) {
+     316             : 
+     317           0 :   return getVelocity(*data);
+     318             : }
+     319             : 
+     320             : //}
+     321             : 
+     322             : //}
+     323             : 
+     324             : /* nav_msgs::Odometry //{ */
+     325             : 
+     326             : /* getPosition() //{ */
+     327             : 
+     328             : /**
+     329             :  * @brief get position from nav_msgs::Odometry
+     330             :  *
+     331             :  * @param data odometry
+     332             :  *
+     333             :  * @return x, y, z
+     334             :  */
+     335      205704 : std::tuple<double, double, double> getPosition(const nav_msgs::Odometry& data) {
+     336             : 
+     337      205704 :   return getPosition(data.pose);
+     338             : }
+     339             : 
+     340             : /**
+     341             :  * @brief get position from nav_msgs::OdometryConstPtr
+     342             :  *
+     343             :  * @param data odometry (ConstPtr)
+     344             :  *
+     345             :  * @return x, y, z
+     346             :  */
+     347      205704 : std::tuple<double, double, double> getPosition(const nav_msgs::OdometryConstPtr& data) {
+     348             : 
+     349      205704 :   return getPosition(*data);
+     350             : }
+     351             : 
+     352             : //}
+     353             : 
+     354             : /* getVelocity() //{ */
+     355             : 
+     356             : /**
+     357             :  * @brief get position from nav_msgs::Odometry
+     358             :  *
+     359             :  * @param data odometry
+     360             :  *
+     361             :  * @return x, y, z
+     362             :  */
+     363           0 : std::tuple<double, double, double> getVelocity(const nav_msgs::Odometry& data) {
+     364             : 
+     365           0 :   return getVelocity(data.twist);
+     366             : }
+     367             : 
+     368             : /**
+     369             :  * @brief get velocity from nav_msgs::OdometryConstPtr
+     370             :  *
+     371             :  * @param data odometry (ConstPtr)
+     372             :  *
+     373             :  * @return x, y, z
+     374             :  */
+     375           0 : std::tuple<double, double, double> getVelocity(const nav_msgs::OdometryConstPtr& data) {
+     376             : 
+     377           0 :   return getVelocity(*data);
+     378             : }
+     379             : 
+     380             : //}
+     381             : 
+     382             : /* getHeading() //{ */
+     383             : 
+     384             : /**
+     385             :  * @brief get heading from nav_msgs::Odometry
+     386             :  *
+     387             :  * @param data odometry
+     388             :  *
+     389             :  * @return heading
+     390             :  */
+     391      205701 : double getHeading(const nav_msgs::Odometry& data) {
+     392             : 
+     393      205701 :   return getHeading(data.pose);
+     394             : }
+     395             : 
+     396             : /**
+     397             :  * @brief get heading from nav_msgs::OdometryConstPtr
+     398             :  *
+     399             :  * @param data odometry (ConstPtr)
+     400             :  *
+     401             :  * @return heading
+     402             :  */
+     403      205701 : double getHeading(const nav_msgs::OdometryConstPtr& data) {
+     404             : 
+     405      205701 :   return getHeading(*data);
+     406             : }
+     407             : 
+     408             : //}
+     409             : 
+     410             : /* getYaw() //{ */
+     411             : 
+     412             : /**
+     413             :  * @brief get yaw from nav_msgs::Odometry
+     414             :  *
+     415             :  * @param data odometry
+     416             :  *
+     417             :  * @return yaw
+     418             :  */
+     419           0 : double getYaw(const nav_msgs::Odometry& data) {
+     420             : 
+     421           0 :   return getYaw(data.pose);
+     422             : }
+     423             : 
+     424             : /**
+     425             :  * @brief get yaw from nav_msgs::OdometryConstPtr
+     426             :  *
+     427             :  * @param data odometry (ConstPtr)
+     428             :  *
+     429             :  * @return yaw
+     430             :  */
+     431           0 : double getYaw(const nav_msgs::OdometryConstPtr& data) {
+     432             : 
+     433           0 :   return getYaw(*data);
+     434             : }
+     435             : 
+     436             : //}
+     437             : 
+     438             : /* getPose() //{ */
+     439             : 
+     440             : /**
+     441             :  * @brief returns the Pose part of the nav_msgs::Odometry message
+     442             :  *
+     443             :  * @param data odometry
+     444             :  *
+     445             :  * @return pose
+     446             :  */
+     447        1594 : geometry_msgs::Pose getPose(const nav_msgs::Odometry& data) {
+     448             : 
+     449        1594 :   return data.pose.pose;
+     450             : }
+     451             : 
+     452             : /**
+     453             :  * @brief returns the Pose part of the nav_msgs::OdometryConstPtr message
+     454             :  *
+     455             :  * @param data odometry (ConstPtr)
+     456             :  *
+     457             :  * @return pose
+     458             :  */
+     459           0 : geometry_msgs::Pose getPose(const nav_msgs::OdometryConstPtr& data) {
+     460             : 
+     461           0 :   return getPose(*data);
+     462             : }
+     463             : 
+     464             : //}
+     465             : 
+     466             : //}
+     467             : 
+     468             : /* mrs_msgs::TrackerCommand //{ */
+     469             : 
+     470             : /* getPosition() //{ */
+     471             : 
+     472             : /**
+     473             :  * @brief get position data from mrs_msgs::TrackerCommand
+     474             :  *
+     475             :  * @param data position command
+     476             :  *
+     477             :  * @return x, y, z
+     478             :  */
+     479         360 : std::tuple<double, double, double> getPosition(const mrs_msgs::TrackerCommand& data) {
+     480             : 
+     481         360 :   return getXYZ(data.position);
+     482             : }
+     483             : 
+     484             : /**
+     485             :  * @brief get position data from mrs_msgs::TrackerCommandConstPtr
+     486             :  *
+     487             :  * @param data position command (ConstPtr)
+     488             :  *
+     489             :  * @return x, y, z
+     490             :  */
+     491           0 : std::tuple<double, double, double> getPosition(const mrs_msgs::TrackerCommandConstPtr& data) {
+     492             : 
+     493           0 :   return getPosition(*data);
+     494             : }
+     495             : 
+     496             : //}
+     497             : 
+     498             : /* getVelocity() //{ */
+     499             : 
+     500             : /**
+     501             :  * @brief get velocity data from mrs_msgs::TrackerCommand
+     502             :  *
+     503             :  * @param data position command
+     504             :  *
+     505             :  * @return x, y, z
+     506             :  */
+     507           0 : std::tuple<double, double, double> getVelocity(const mrs_msgs::TrackerCommand& data) {
+     508             : 
+     509           0 :   return getXYZ(data.velocity);
+     510             : }
+     511             : 
+     512             : /**
+     513             :  * @brief get velocity data from mrs_msgs::TrackerCommandConstPtr
+     514             :  *
+     515             :  * @param data position command (ConstPtr)
+     516             :  *
+     517             :  * @return x, y, z
+     518             :  */
+     519           0 : std::tuple<double, double, double> getVelocity(const mrs_msgs::TrackerCommandConstPtr& data) {
+     520             : 
+     521           0 :   return getVelocity(*data);
+     522             : }
+     523             : 
+     524             : //}
+     525             : 
+     526             : /* getHeading() //{ */
+     527             : 
+     528             : /**
+     529             :  * @brief get heading from mrs_msgs::TrackerCommand
+     530             :  *
+     531             :  * @param data position command
+     532             :  *
+     533             :  * @return heading
+     534             :  */
+     535           0 : double getHeading(const mrs_msgs::TrackerCommand& data) {
+     536             : 
+     537           0 :   double heading = 0;
+     538             : 
+     539           0 :   if (data.use_heading) {
+     540             : 
+     541           0 :     heading = data.heading;
+     542             : 
+     543           0 :   } else if (data.use_orientation) {
+     544             : 
+     545           0 :     heading = mrs_lib::AttitudeConverter(data.orientation).getHeading();
+     546             :   }
+     547             : 
+     548           0 :   return heading;
+     549             : }
+     550             : 
+     551             : /**
+     552             :  * @brief get heading from mrs_msgs::TrackerCommandConstPtr
+     553             :  *
+     554             :  * @param data position command (ConstPtr)
+     555             :  *
+     556             :  * @return heading
+     557             :  */
+     558           0 : double getHeading(const mrs_msgs::TrackerCommandConstPtr& data) {
+     559             : 
+     560           0 :   return getHeading(*data);
+     561             : }
+     562             : 
+     563             : //}
+     564             : 
+     565             : //}
+     566             : 
+     567             : /* mrs_msgs::Reference //{ */
+     568             : 
+     569             : /* getPosition() //{ */
+     570             : 
+     571             : /**
+     572             :  * @brief get position from mrs_msgs::Reference
+     573             :  *
+     574             :  * @param data reference
+     575             :  *
+     576             :  * @return x, y, z
+     577             :  */
+     578         360 : std::tuple<double, double, double> getPosition(const mrs_msgs::Reference& data) {
+     579             : 
+     580         360 :   return getXYZ(data.position);
+     581             : }
+     582             : 
+     583             : /**
+     584             :  * @brief get position from mrs_msgs::ReferenceConstPtr
+     585             :  *
+     586             :  * @param data reference (ContrPtr)
+     587             :  *
+     588             :  * @return x, y, z
+     589             :  */
+     590           0 : std::tuple<double, double, double> getPosition(const mrs_msgs::ReferenceConstPtr& data) {
+     591             : 
+     592           0 :   return getPosition(*data);
+     593             : }
+     594             : 
+     595             : //}
+     596             : 
+     597             : /* getHeading() //{ */
+     598             : 
+     599             : /**
+     600             :  * @brief get heading from mrs_msgs::Reference
+     601             :  *
+     602             :  * @param data reference
+     603             :  *
+     604             :  * @return heading
+     605             :  */
+     606         360 : double getHeading(const mrs_msgs::Reference& data) {
+     607             : 
+     608         360 :   return data.heading;
+     609             : }
+     610             : 
+     611             : /**
+     612             :  * @brief get heading from mrs_msgs::ReferenceConstPtr
+     613             :  *
+     614             :  * @param data reference (ContrPtr)
+     615             :  *
+     616             :  * @return heading
+     617             :  */
+     618           0 : double getHeading(const mrs_msgs::ReferenceConstPtr& data) {
+     619             : 
+     620           0 :   return getHeading(*data);
+     621             : }
+     622             : 
+     623             : //}
+     624             : 
+     625             : //}
+     626             : 
+     627             : /* mrs_msgs::ReferenceStamped //{ */
+     628             : 
+     629             : /* getPosition() //{ */
+     630             : 
+     631             : /**
+     632             :  * @brief get position from mrs_msgs::ReferenceStamped
+     633             :  *
+     634             :  * @param data reference stamped
+     635             :  *
+     636             :  * @return x, y, z
+     637             :  */
+     638         360 : std::tuple<double, double, double> getPosition(const mrs_msgs::ReferenceStamped& data) {
+     639             : 
+     640         360 :   return getPosition(data.reference);
+     641             : }
+     642             : 
+     643             : /**
+     644             :  * @brief get position from mrs_msgs::ReferenceStampedConstPtr
+     645             :  *
+     646             :  * @param data reference stamped (ContrPtr)
+     647             :  *
+     648             :  * @return x, y, z
+     649             :  */
+     650           0 : std::tuple<double, double, double> getPosition(const mrs_msgs::ReferenceStampedConstPtr& data) {
+     651             : 
+     652           0 :   return getPosition(*data);
+     653             : }
+     654             : 
+     655             : //}
+     656             : 
+     657             : /* getHeading() //{ */
+     658             : 
+     659             : /**
+     660             :  * @brief get heading from mrs_msgs::ReferenceStamped
+     661             :  *
+     662             :  * @param data referencestamped
+     663             :  *
+     664             :  * @return heading
+     665             :  */
+     666         360 : double getHeading(const mrs_msgs::ReferenceStamped& data) {
+     667             : 
+     668         360 :   return getHeading(data.reference);
+     669             : }
+     670             : 
+     671             : /**
+     672             :  * @brief get heading from mrs_msgs::ReferenceStampedConstPtr
+     673             :  *
+     674             :  * @param data referencestamped (ContrPtr)
+     675             :  *
+     676             :  * @return heading
+     677             :  */
+     678           0 : double getHeading(const mrs_msgs::ReferenceStampedConstPtr& data) {
+     679             : 
+     680           0 :   return getHeading(*data);
+     681             : }
+     682             : 
+     683             : //}
+     684             : 
+     685             : //}
+     686             : 
+     687             : }  // namespace mrs_lib
+     688             : 
+     689             : //}
+     690             : 
+     691             : #endif  // MRS_LIB_MSG_EXTRACTOR_H
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/msg_extractor.h.gcov.overview.html b/mrs_lib/include/mrs_lib/msg_extractor.h.gcov.overview.html new file mode 100644 index 0000000000..41496f11e9 --- /dev/null +++ b/mrs_lib/include/mrs_lib/msg_extractor.h.gcov.overview.html @@ -0,0 +1,193 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/msg_extractor.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/include/mrs_lib/msg_extractor.h.gcov.png b/mrs_lib/include/mrs_lib/msg_extractor.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..8043ecf807c268d9ebf3ec73e92b93e3796c8069 GIT binary patch literal 1287 zcmV+i1^D`jP)o6G8|QE17xcIDPQ~O}I%wnMSorb!w5W z0Y!DQCakha+q@xH*lxd^|F-j=&QM(1pFiEYu!)Tr=-RiB`&d+9L}*2{sBI|FFr12D z9}Ps**N^XGBATa9-HYGtB}|XjE7fZGp0&-MU3~y zLwt28Vw=vzJ;CfTj(Z+oiqUxIVNwc_du-_?agUWt8H(7Zb8!!+tu>-BvZwjuL8lZF z_W=BI9qwUdp480VsfcYl8}}d-qy2I8d18`3+Vb&2kyV_fh;2F>_aGEgZ0)l5U8}gP z>t;OloV>cwE*D6123-0OUKcJx&&|AwB62gAtu<36*qS4=uXUkU?ob!nLAyBj|LCDIBo5(3y(=!tqZvj(|3Ff^Oxrygkox~V3rHN<&Ti95B4t4JqSex zTOaIQ>q0I>{^!l))rGbqw&^Q8!G@|8270X^`{@VM)(o-mdQXQL}`1POm8-^ zau49yAH}3S&Fy7RBgD~S;nnsu8QvOV<(}-ecG#O}Yrvk@$$RANX*%yM&pimmgnh2{ zElNAYkz(P+_B5^g%X1GxF>z1RviDv0G+W+^E7~8`?vdSkILz*ox?h&(p74<3*8qAr z`Ju%^P_cO49&vWC!xZr7{R2%1_Tc+-T~z=8002ovPDHLkV1gERfj9sF literal 0 HcmV?d00001 diff --git a/mrs_lib/include/mrs_lib/mutex.h.func-sort-c.html b/mrs_lib/include/mrs_lib/mutex.h.func-sort-c.html new file mode 100644 index 0000000000..49ff39ef67 --- /dev/null +++ b/mrs_lib/include/mrs_lib/mutex.h.func-sort-c.html @@ -0,0 +1,400 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/mutex.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - mutex.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:1111100.0 %
Date:2024-04-18 23:11:36Functions:678083.8 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
std::tuple<double, double, double, double> mrs_lib::get_mutexed<double, double, double, double>(std::mutex&, double&, double&, double&, double&)0
mrs_msgs::Float64ArrayStamped_<std::allocator<void> > const mrs_lib::get_mutexed<mrs_msgs::Float64ArrayStamped_<std::allocator<void> > const>(std::mutex&, mrs_msgs::Float64ArrayStamped_<std::allocator<void> > const&)0
mrs_lib::KalmanFilter<2, 1, 1>::statecov_t const mrs_lib::get_mutexed<mrs_lib::KalmanFilter<2, 1, 1>::statecov_t const>(std::mutex&, mrs_lib::KalmanFilter<2, 1, 1>::statecov_t const&)0
Eigen::Matrix<double, 2, 2, 0, 2, 2> mrs_lib::get_mutexed<Eigen::Matrix<double, 2, 2, 0, 2, 2> >(std::mutex&, Eigen::Matrix<double, 2, 2, 0, 2, 2>&)0
mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > mrs_lib::get_mutexed<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >(std::mutex&, mrs_msgs::SpeedTrackerCommand_<std::allocator<void> >&)0
mrs_lib::KalmanFilter<2, 1, 1>::statecov_t mrs_lib::get_mutexed<mrs_lib::KalmanFilter<2, 1, 1>::statecov_t>(std::mutex&, mrs_lib::KalmanFilter<2, 1, 1>::statecov_t&)0
auto mrs_lib::set_mutexed<Eigen::Matrix<double, 2, 1, 0, 2, 1> >(std::mutex&, Eigen::Matrix<double, 2, 1, 0, 2, 1>, Eigen::Matrix<double, 2, 1, 0, 2, 1>&)0
auto mrs_lib::set_mutexed<Eigen::Matrix<double, 2, 2, 0, 2, 2> >(std::mutex&, Eigen::Matrix<double, 2, 2, 0, 2, 2>, Eigen::Matrix<double, 2, 2, 0, 2, 2>&)0
auto mrs_lib::set_mutexed<Eigen::Matrix<double, 3, 1, 0, 3, 1> >(std::mutex&, Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1>&)0
auto mrs_lib::set_mutexed<Eigen::Matrix<double, 3, 3, 0, 3, 3> >(std::mutex&, Eigen::Matrix<double, 3, 3, 0, 3, 3>, Eigen::Matrix<double, 3, 3, 0, 3, 3>&)0
auto mrs_lib::set_mutexed<Eigen::Matrix<double, 6, 1, 0, 6, 1> >(std::mutex&, Eigen::Matrix<double, 6, 1, 0, 6, 1>, Eigen::Matrix<double, 6, 1, 0, 6, 1>&)0
auto mrs_lib::set_mutexed<Eigen::Matrix<double, 6, 6, 0, 6, 6> >(std::mutex&, Eigen::Matrix<double, 6, 6, 0, 6, 6>, Eigen::Matrix<double, 6, 6, 0, 6, 6>&)0
auto mrs_lib::set_mutexed<mrs_lib::KalmanFilter<2, 1, 1>::statecov_t>(std::mutex&, mrs_lib::KalmanFilter<2, 1, 1>::statecov_t, mrs_lib::KalmanFilter<2, 1, 1>::statecov_t&)0
mrs_msgs::ConstraintsOverrideRequest_<std::allocator<void> > mrs_lib::get_mutexed<mrs_msgs::ConstraintsOverrideRequest_<std::allocator<void> > >(std::mutex&, mrs_msgs::ConstraintsOverrideRequest_<std::allocator<void> >&)1
mrs_uav_trajectory_generation::drsConfig mrs_lib::get_mutexed<mrs_uav_trajectory_generation::drsConfig>(std::mutex&, mrs_uav_trajectory_generation::drsConfig&)39
auto mrs_lib::set_mutexed<mrs_uav_trajectory_generation::drsConfig>(std::mutex&, mrs_uav_trajectory_generation::drsConfig, mrs_uav_trajectory_generation::drsConfig&)91
auto mrs_lib::set_mutexed<mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> > >(std::mutex&, mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> >, mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> >&)113
auto mrs_lib::set_mutexed<mrs_uav_controllers::mpc_controllerConfig>(std::mutex&, mrs_uav_controllers::mpc_controllerConfig, mrs_uav_controllers::mpc_controllerConfig&)182
auto mrs_lib::set_mutexed<mrs_uav_controllers::se3_controllerConfig>(std::mutex&, mrs_uav_controllers::se3_controllerConfig, mrs_uav_controllers::se3_controllerConfig&)183
mrs_msgs::ObstacleSectors_<std::allocator<void> > mrs_lib::get_mutexed<mrs_msgs::ObstacleSectors_<std::allocator<void> > >(std::mutex&, mrs_msgs::ObstacleSectors_<std::allocator<void> >&)435
mrs_msgs::VelocityReference_<std::allocator<void> > mrs_lib::get_mutexed<mrs_msgs::VelocityReference_<std::allocator<void> > >(std::mutex&, mrs_msgs::VelocityReference_<std::allocator<void> >&)494
mrs_msgs::ReferenceStamped_<std::allocator<void> > mrs_lib::get_mutexed<mrs_msgs::ReferenceStamped_<std::allocator<void> > >(std::mutex&, mrs_msgs::ReferenceStamped_<std::allocator<void> >&)1107
auto mrs_lib::set_mutexed<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >(std::mutex&, mrs_msgs::DynamicsConstraints_<std::allocator<void> >, mrs_msgs::DynamicsConstraints_<std::allocator<void> >&)2036
auto mrs_lib::set_mutexed<mrs_uav_controllers::se3_controller::Gains_t>(std::mutex&, mrs_uav_controllers::se3_controller::Gains_t, mrs_uav_controllers::se3_controller::Gains_t&)4326
int mrs_lib::get_mutexed<int>(std::mutex&, int&)7505
std::tuple<int, double> mrs_lib::get_mutexed<int, double>(std::mutex&, int&, double&)12157
std::tuple<bool, bool, ros::Time, ros::Time> mrs_lib::get_mutexed<bool, bool, ros::Time, ros::Time>(std::mutex&, bool&, bool&, ros::Time&, ros::Time&)12789
auto mrs_lib::set_mutexed<mrs_uav_controllers::mpc_controller::Gains_t>(std::mutex&, mrs_uav_controllers::mpc_controller::Gains_t, mrs_uav_controllers::mpc_controller::Gains_t&)13726
std::optional<double> mrs_lib::get_mutexed<std::optional<double> >(std::mutex&, std::optional<double>&)16264
std::tuple<double, double> mrs_lib::get_mutexed<double, double>(std::mutex&, double&, double&)17048
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const mrs_lib::get_mutexed<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const>(std::mutex&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)17081
std::tuple<double, double, double, double, double, double, double> mrs_lib::get_mutexed<double, double, double, double, double, double, double>(std::mutex&, double&, double&, double&, double&, double&, double&, double&)23263
std::tuple<double, double, double> mrs_lib::get_mutexed<double, double, double>(std::mutex&, double&, double&, double&)27865
mrs_uav_controllers::se3_controller::Gains_t mrs_lib::get_mutexed<mrs_uav_controllers::se3_controller::Gains_t>(std::mutex&, mrs_uav_controllers::se3_controller::Gains_t&)31279
auto mrs_lib::set_mutexed<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::mutex&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&)32707
mrs_uav_controllers::se3_controllerConfig mrs_lib::get_mutexed<mrs_uav_controllers::se3_controllerConfig>(std::mutex&, mrs_uav_controllers::se3_controllerConfig&)55858
std::tuple<Eigen::Matrix<double, -1, 1, 0, -1, 1>, double> mrs_lib::get_mutexed<Eigen::Matrix<double, -1, 1, 0, -1, 1>, double>(std::mutex&, Eigen::Matrix<double, -1, 1, 0, -1, 1>&, double&)64564
mrs_msgs::MpcPredictionFullState_<std::allocator<void> > mrs_lib::get_mutexed<mrs_msgs::MpcPredictionFullState_<std::allocator<void> > >(std::mutex&, mrs_msgs::MpcPredictionFullState_<std::allocator<void> >&)64564
mrs_uav_controllers::mpc_controller::Gains_t mrs_lib::get_mutexed<mrs_uav_controllers::mpc_controller::Gains_t>(std::mutex&, mrs_uav_controllers::mpc_controller::Gains_t&)69252
std::tuple<bool, double, double> mrs_lib::get_mutexed<bool, double, double>(std::mutex&, bool&, double&, double&)70716
mrs_uav_trackers::mpc_trackerConfig mrs_lib::get_mutexed<mrs_uav_trackers::mpc_trackerConfig>(std::mutex&, mrs_uav_trackers::mpc_trackerConfig&)70716
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > mrs_lib::get_mutexed<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::mutex&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&)77689
auto mrs_lib::set_mutexed<mrs_uav_managers::Controller::ControlOutput>(std::mutex&, mrs_uav_managers::Controller::ControlOutput, mrs_uav_managers::Controller::ControlOutput&)93854
mrs_uav_controllers::mpc_controllerConfig mrs_lib::get_mutexed<mrs_uav_controllers::mpc_controllerConfig>(std::mutex&, mrs_uav_controllers::mpc_controllerConfig&)125720
auto mrs_lib::set_mutexed<mrs_msgs::Float64Stamped_<std::allocator<void> > >(std::mutex&, mrs_msgs::Float64Stamped_<std::allocator<void> >, mrs_msgs::Float64Stamped_<std::allocator<void> >&)132616
mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> > mrs_lib::get_mutexed<mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> > >(std::mutex&, mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> >&)144137
Eigen::Matrix<double, 6, 6, 0, 6, 6> mrs_lib::get_mutexed<Eigen::Matrix<double, 6, 6, 0, 6, 6> >(std::mutex&, Eigen::Matrix<double, 6, 6, 0, 6, 6>&)171798
Eigen::Matrix<double, 1, 1, 0, 1, 1> const mrs_lib::get_mutexed<Eigen::Matrix<double, 1, 1, 0, 1, 1> const>(std::mutex&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&)182857
mrs_msgs::UavState_<std::allocator<void> > const mrs_lib::get_mutexed<mrs_msgs::UavState_<std::allocator<void> > const>(std::mutex&, mrs_msgs::UavState_<std::allocator<void> > const&)183919
Eigen::Matrix<double, 2, 2, 0, 2, 2> const mrs_lib::get_mutexed<Eigen::Matrix<double, 2, 2, 0, 2, 2> const>(std::mutex&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&)189980
auto mrs_lib::set_mutexed<std::optional<Eigen::Matrix<double, 3, 1, 0, 3, 1> > >(std::mutex&, std::optional<Eigen::Matrix<double, 3, 1, 0, 3, 1> >, std::optional<Eigen::Matrix<double, 3, 1, 0, 3, 1> >&)192821
std::tuple<std::optional<double>, std::optional<double> > mrs_lib::get_mutexed<std::optional<double>, std::optional<double> >(std::mutex&, std::optional<double>&, std::optional<double>&)193858
std::tuple<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> > mrs_lib::get_mutexed<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(std::mutex&, Eigen::Matrix<double, -1, -1, 0, -1, -1>&, Eigen::Matrix<double, -1, -1, 0, -1, -1>&)208169
std::optional<Eigen::Matrix<double, 3, 1, 0, 3, 1> > mrs_lib::get_mutexed<std::optional<Eigen::Matrix<double, 3, 1, 0, 3, 1> > >(std::mutex&, std::optional<Eigen::Matrix<double, 3, 1, 0, 3, 1> >&)210122
Eigen::Matrix<double, -1, -1, 0, -1, -1> mrs_lib::get_mutexed<Eigen::Matrix<double, -1, -1, 0, -1, -1> >(std::mutex&, Eigen::Matrix<double, -1, -1, 0, -1, -1>&)226036
mrs_msgs::DynamicsConstraints_<std::allocator<void> > mrs_lib::get_mutexed<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >(std::mutex&, mrs_msgs::DynamicsConstraints_<std::allocator<void> >&)244159
mrs_msgs::Float64Stamped_<std::allocator<void> > const mrs_lib::get_mutexed<mrs_msgs::Float64Stamped_<std::allocator<void> > const>(std::mutex&, mrs_msgs::Float64Stamped_<std::allocator<void> > const&)271401
Eigen::Matrix<double, 3, 3, 0, 3, 3> mrs_lib::get_mutexed<Eigen::Matrix<double, 3, 3, 0, 3, 3> >(std::mutex&, Eigen::Matrix<double, 3, 3, 0, 3, 3>&)292750
std::tuple<mrs_msgs::UavState_<std::allocator<void> >, double> mrs_lib::get_mutexed<mrs_msgs::UavState_<std::allocator<void> >, double>(std::mutex&, mrs_msgs::UavState_<std::allocator<void> >&, double&)297645
std::vector<double, std::allocator<double> > const mrs_lib::get_mutexed<std::vector<double, std::allocator<double> > const>(std::mutex&, std::vector<double, std::allocator<double> > const&)310514
nav_msgs::Odometry_<std::allocator<void> > const mrs_lib::get_mutexed<nav_msgs::Odometry_<std::allocator<void> > const>(std::mutex&, nav_msgs::Odometry_<std::allocator<void> > const&)339202
auto mrs_lib::set_mutexed<mrs_lib::KalmanFilter<6, 2, 2>::statecov_t>(std::mutex&, mrs_lib::KalmanFilter<6, 2, 2>::statecov_t, mrs_lib::KalmanFilter<6, 2, 2>::statecov_t&)364918
mrs_lib::KalmanFilter<6, 2, 2>::statecov_t mrs_lib::get_mutexed<mrs_lib::KalmanFilter<6, 2, 2>::statecov_t>(std::mutex&, mrs_lib::KalmanFilter<6, 2, 2>::statecov_t&)365032
auto mrs_lib::set_mutexed<nav_msgs::Odometry_<std::allocator<void> > >(std::mutex&, nav_msgs::Odometry_<std::allocator<void> >, nav_msgs::Odometry_<std::allocator<void> >&)367751
auto mrs_lib::set_mutexed<mrs_msgs::Float64ArrayStamped_<std::allocator<void> > >(std::mutex&, mrs_msgs::Float64ArrayStamped_<std::allocator<void> >, mrs_msgs::Float64ArrayStamped_<std::allocator<void> >&)500220
Eigen::Matrix<double, 2, 1, 0, 2, 1> const mrs_lib::get_mutexed<Eigen::Matrix<double, 2, 1, 0, 2, 1> const>(std::mutex&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&)555506
std::optional<mrs_msgs::TrackerCommand_<std::allocator<void> > > mrs_lib::get_mutexed<std::optional<mrs_msgs::TrackerCommand_<std::allocator<void> > > >(std::mutex&, std::optional<mrs_msgs::TrackerCommand_<std::allocator<void> > >&)626436
double const mrs_lib::get_mutexed<double const>(std::mutex&, double const&)662831
mrs_uav_managers::Controller::ControlOutput mrs_lib::get_mutexed<mrs_uav_managers::Controller::ControlOutput>(std::mutex&, mrs_uav_managers::Controller::ControlOutput&)718279
auto mrs_lib::set_mutexed<mrs_lib::KalmanFilter<3, 1, 1>::statecov_t>(std::mutex&, mrs_lib::KalmanFilter<3, 1, 1>::statecov_t, mrs_lib::KalmanFilter<3, 1, 1>::statecov_t&)733469
mrs_lib::KalmanFilter<3, 1, 1>::statecov_t mrs_lib::get_mutexed<mrs_lib::KalmanFilter<3, 1, 1>::statecov_t>(std::mutex&, mrs_lib::KalmanFilter<3, 1, 1>::statecov_t&)734321
ros::Time mrs_lib::get_mutexed<ros::Time>(std::mutex&, ros::Time&)880487
unsigned int mrs_lib::get_mutexed<unsigned int>(std::mutex&, unsigned int&)888397
mrs_msgs::UavState_<std::allocator<void> > mrs_lib::get_mutexed<mrs_msgs::UavState_<std::allocator<void> > >(std::mutex&, mrs_msgs::UavState_<std::allocator<void> >&)921311
auto mrs_lib::set_mutexed<mrs_msgs::UavState_<std::allocator<void> > >(std::mutex&, mrs_msgs::UavState_<std::allocator<void> >, mrs_msgs::UavState_<std::allocator<void> >&)944658
double mrs_lib::get_mutexed<double>(std::mutex&, double&)955972
auto mrs_lib::set_mutexed<double>(std::mutex&, double, double&)1027198
mrs_lib::KalmanFilter<3, 1, 1>::statecov_t const mrs_lib::get_mutexed<mrs_lib::KalmanFilter<3, 1, 1>::statecov_t const>(std::mutex&, mrs_lib::KalmanFilter<3, 1, 1>::statecov_t const&)2296221
mrs_uav_managers::estimation_manager::StateMachine::SMState_t const mrs_lib::get_mutexed<mrs_uav_managers::estimation_manager::StateMachine::SMState_t const>(std::mutex&, mrs_uav_managers::estimation_manager::StateMachine::SMState_t const&)2389302
mrs_lib::KalmanFilter<6, 2, 2>::statecov_t const mrs_lib::get_mutexed<mrs_lib::KalmanFilter<6, 2, 2>::statecov_t const>(std::mutex&, mrs_lib::KalmanFilter<6, 2, 2>::statecov_t const&)2547274
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/mutex.h.func.html b/mrs_lib/include/mrs_lib/mutex.h.func.html new file mode 100644 index 0000000000..aa1ca852a1 --- /dev/null +++ b/mrs_lib/include/mrs_lib/mutex.h.func.html @@ -0,0 +1,400 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/mutex.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - mutex.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:1111100.0 %
Date:2024-04-18 23:11:36Functions:678083.8 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
std::tuple<Eigen::Matrix<double, -1, 1, 0, -1, 1>, double> mrs_lib::get_mutexed<Eigen::Matrix<double, -1, 1, 0, -1, 1>, double>(std::mutex&, Eigen::Matrix<double, -1, 1, 0, -1, 1>&, double&)64564
std::tuple<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> > mrs_lib::get_mutexed<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(std::mutex&, Eigen::Matrix<double, -1, -1, 0, -1, -1>&, Eigen::Matrix<double, -1, -1, 0, -1, -1>&)208169
std::tuple<mrs_msgs::UavState_<std::allocator<void> >, double> mrs_lib::get_mutexed<mrs_msgs::UavState_<std::allocator<void> >, double>(std::mutex&, mrs_msgs::UavState_<std::allocator<void> >&, double&)297645
std::tuple<std::optional<double>, std::optional<double> > mrs_lib::get_mutexed<std::optional<double>, std::optional<double> >(std::mutex&, std::optional<double>&, std::optional<double>&)193858
std::tuple<bool, bool, ros::Time, ros::Time> mrs_lib::get_mutexed<bool, bool, ros::Time, ros::Time>(std::mutex&, bool&, bool&, ros::Time&, ros::Time&)12789
std::tuple<bool, double, double> mrs_lib::get_mutexed<bool, double, double>(std::mutex&, bool&, double&, double&)70716
std::tuple<double, double> mrs_lib::get_mutexed<double, double>(std::mutex&, double&, double&)17048
std::tuple<double, double, double> mrs_lib::get_mutexed<double, double, double>(std::mutex&, double&, double&, double&)27865
std::tuple<double, double, double, double> mrs_lib::get_mutexed<double, double, double, double>(std::mutex&, double&, double&, double&, double&)0
std::tuple<double, double, double, double, double, double, double> mrs_lib::get_mutexed<double, double, double, double, double, double, double>(std::mutex&, double&, double&, double&, double&, double&, double&, double&)23263
std::tuple<int, double> mrs_lib::get_mutexed<int, double>(std::mutex&, int&, double&)12157
mrs_uav_managers::estimation_manager::StateMachine::SMState_t const mrs_lib::get_mutexed<mrs_uav_managers::estimation_manager::StateMachine::SMState_t const>(std::mutex&, mrs_uav_managers::estimation_manager::StateMachine::SMState_t const&)2389302
Eigen::Matrix<double, 1, 1, 0, 1, 1> const mrs_lib::get_mutexed<Eigen::Matrix<double, 1, 1, 0, 1, 1> const>(std::mutex&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&)182857
Eigen::Matrix<double, 2, 1, 0, 2, 1> const mrs_lib::get_mutexed<Eigen::Matrix<double, 2, 1, 0, 2, 1> const>(std::mutex&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&)555506
Eigen::Matrix<double, 2, 2, 0, 2, 2> const mrs_lib::get_mutexed<Eigen::Matrix<double, 2, 2, 0, 2, 2> const>(std::mutex&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&)189980
mrs_msgs::Float64Stamped_<std::allocator<void> > const mrs_lib::get_mutexed<mrs_msgs::Float64Stamped_<std::allocator<void> > const>(std::mutex&, mrs_msgs::Float64Stamped_<std::allocator<void> > const&)271401
mrs_msgs::Float64ArrayStamped_<std::allocator<void> > const mrs_lib::get_mutexed<mrs_msgs::Float64ArrayStamped_<std::allocator<void> > const>(std::mutex&, mrs_msgs::Float64ArrayStamped_<std::allocator<void> > const&)0
mrs_msgs::UavState_<std::allocator<void> > const mrs_lib::get_mutexed<mrs_msgs::UavState_<std::allocator<void> > const>(std::mutex&, mrs_msgs::UavState_<std::allocator<void> > const&)183919
nav_msgs::Odometry_<std::allocator<void> > const mrs_lib::get_mutexed<nav_msgs::Odometry_<std::allocator<void> > const>(std::mutex&, nav_msgs::Odometry_<std::allocator<void> > const&)339202
mrs_lib::KalmanFilter<2, 1, 1>::statecov_t const mrs_lib::get_mutexed<mrs_lib::KalmanFilter<2, 1, 1>::statecov_t const>(std::mutex&, mrs_lib::KalmanFilter<2, 1, 1>::statecov_t const&)0
mrs_lib::KalmanFilter<3, 1, 1>::statecov_t const mrs_lib::get_mutexed<mrs_lib::KalmanFilter<3, 1, 1>::statecov_t const>(std::mutex&, mrs_lib::KalmanFilter<3, 1, 1>::statecov_t const&)2296221
mrs_lib::KalmanFilter<6, 2, 2>::statecov_t const mrs_lib::get_mutexed<mrs_lib::KalmanFilter<6, 2, 2>::statecov_t const>(std::mutex&, mrs_lib::KalmanFilter<6, 2, 2>::statecov_t const&)2547274
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const mrs_lib::get_mutexed<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const>(std::mutex&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)17081
std::vector<double, std::allocator<double> > const mrs_lib::get_mutexed<std::vector<double, std::allocator<double> > const>(std::mutex&, std::vector<double, std::allocator<double> > const&)310514
double const mrs_lib::get_mutexed<double const>(std::mutex&, double const&)662831
mrs_uav_managers::Controller::ControlOutput mrs_lib::get_mutexed<mrs_uav_managers::Controller::ControlOutput>(std::mutex&, mrs_uav_managers::Controller::ControlOutput&)718279
mrs_uav_trackers::mpc_trackerConfig mrs_lib::get_mutexed<mrs_uav_trackers::mpc_trackerConfig>(std::mutex&, mrs_uav_trackers::mpc_trackerConfig&)70716
mrs_uav_controllers::mpc_controller::Gains_t mrs_lib::get_mutexed<mrs_uav_controllers::mpc_controller::Gains_t>(std::mutex&, mrs_uav_controllers::mpc_controller::Gains_t&)69252
mrs_uav_controllers::se3_controller::Gains_t mrs_lib::get_mutexed<mrs_uav_controllers::se3_controller::Gains_t>(std::mutex&, mrs_uav_controllers::se3_controller::Gains_t&)31279
mrs_uav_controllers::mpc_controllerConfig mrs_lib::get_mutexed<mrs_uav_controllers::mpc_controllerConfig>(std::mutex&, mrs_uav_controllers::mpc_controllerConfig&)125720
mrs_uav_controllers::se3_controllerConfig mrs_lib::get_mutexed<mrs_uav_controllers::se3_controllerConfig>(std::mutex&, mrs_uav_controllers::se3_controllerConfig&)55858
mrs_uav_trajectory_generation::drsConfig mrs_lib::get_mutexed<mrs_uav_trajectory_generation::drsConfig>(std::mutex&, mrs_uav_trajectory_generation::drsConfig&)39
ros::Time mrs_lib::get_mutexed<ros::Time>(std::mutex&, ros::Time&)880487
Eigen::Matrix<double, 2, 2, 0, 2, 2> mrs_lib::get_mutexed<Eigen::Matrix<double, 2, 2, 0, 2, 2> >(std::mutex&, Eigen::Matrix<double, 2, 2, 0, 2, 2>&)0
Eigen::Matrix<double, 3, 3, 0, 3, 3> mrs_lib::get_mutexed<Eigen::Matrix<double, 3, 3, 0, 3, 3> >(std::mutex&, Eigen::Matrix<double, 3, 3, 0, 3, 3>&)292750
Eigen::Matrix<double, 6, 6, 0, 6, 6> mrs_lib::get_mutexed<Eigen::Matrix<double, 6, 6, 0, 6, 6> >(std::mutex&, Eigen::Matrix<double, 6, 6, 0, 6, 6>&)171798
Eigen::Matrix<double, -1, -1, 0, -1, -1> mrs_lib::get_mutexed<Eigen::Matrix<double, -1, -1, 0, -1, -1> >(std::mutex&, Eigen::Matrix<double, -1, -1, 0, -1, -1>&)226036
mrs_msgs::ObstacleSectors_<std::allocator<void> > mrs_lib::get_mutexed<mrs_msgs::ObstacleSectors_<std::allocator<void> > >(std::mutex&, mrs_msgs::ObstacleSectors_<std::allocator<void> >&)435
mrs_msgs::ReferenceStamped_<std::allocator<void> > mrs_lib::get_mutexed<mrs_msgs::ReferenceStamped_<std::allocator<void> > >(std::mutex&, mrs_msgs::ReferenceStamped_<std::allocator<void> >&)1107
mrs_msgs::VelocityReference_<std::allocator<void> > mrs_lib::get_mutexed<mrs_msgs::VelocityReference_<std::allocator<void> > >(std::mutex&, mrs_msgs::VelocityReference_<std::allocator<void> >&)494
mrs_msgs::DynamicsConstraints_<std::allocator<void> > mrs_lib::get_mutexed<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >(std::mutex&, mrs_msgs::DynamicsConstraints_<std::allocator<void> >&)244159
mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > mrs_lib::get_mutexed<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >(std::mutex&, mrs_msgs::SpeedTrackerCommand_<std::allocator<void> >&)0
mrs_msgs::MpcPredictionFullState_<std::allocator<void> > mrs_lib::get_mutexed<mrs_msgs::MpcPredictionFullState_<std::allocator<void> > >(std::mutex&, mrs_msgs::MpcPredictionFullState_<std::allocator<void> >&)64564
mrs_msgs::ConstraintsOverrideRequest_<std::allocator<void> > mrs_lib::get_mutexed<mrs_msgs::ConstraintsOverrideRequest_<std::allocator<void> > >(std::mutex&, mrs_msgs::ConstraintsOverrideRequest_<std::allocator<void> >&)1
mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> > mrs_lib::get_mutexed<mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> > >(std::mutex&, mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> >&)144137
mrs_msgs::UavState_<std::allocator<void> > mrs_lib::get_mutexed<mrs_msgs::UavState_<std::allocator<void> > >(std::mutex&, mrs_msgs::UavState_<std::allocator<void> >&)921311
mrs_lib::KalmanFilter<2, 1, 1>::statecov_t mrs_lib::get_mutexed<mrs_lib::KalmanFilter<2, 1, 1>::statecov_t>(std::mutex&, mrs_lib::KalmanFilter<2, 1, 1>::statecov_t&)0
mrs_lib::KalmanFilter<3, 1, 1>::statecov_t mrs_lib::get_mutexed<mrs_lib::KalmanFilter<3, 1, 1>::statecov_t>(std::mutex&, mrs_lib::KalmanFilter<3, 1, 1>::statecov_t&)734321
mrs_lib::KalmanFilter<6, 2, 2>::statecov_t mrs_lib::get_mutexed<mrs_lib::KalmanFilter<6, 2, 2>::statecov_t>(std::mutex&, mrs_lib::KalmanFilter<6, 2, 2>::statecov_t&)365032
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > mrs_lib::get_mutexed<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::mutex&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&)77689
std::optional<Eigen::Matrix<double, 3, 1, 0, 3, 1> > mrs_lib::get_mutexed<std::optional<Eigen::Matrix<double, 3, 1, 0, 3, 1> > >(std::mutex&, std::optional<Eigen::Matrix<double, 3, 1, 0, 3, 1> >&)210122
std::optional<mrs_msgs::TrackerCommand_<std::allocator<void> > > mrs_lib::get_mutexed<std::optional<mrs_msgs::TrackerCommand_<std::allocator<void> > > >(std::mutex&, std::optional<mrs_msgs::TrackerCommand_<std::allocator<void> > >&)626436
std::optional<double> mrs_lib::get_mutexed<std::optional<double> >(std::mutex&, std::optional<double>&)16264
double mrs_lib::get_mutexed<double>(std::mutex&, double&)955972
int mrs_lib::get_mutexed<int>(std::mutex&, int&)7505
unsigned int mrs_lib::get_mutexed<unsigned int>(std::mutex&, unsigned int&)888397
auto mrs_lib::set_mutexed<mrs_uav_managers::Controller::ControlOutput>(std::mutex&, mrs_uav_managers::Controller::ControlOutput, mrs_uav_managers::Controller::ControlOutput&)93854
auto mrs_lib::set_mutexed<mrs_uav_controllers::mpc_controller::Gains_t>(std::mutex&, mrs_uav_controllers::mpc_controller::Gains_t, mrs_uav_controllers::mpc_controller::Gains_t&)13726
auto mrs_lib::set_mutexed<mrs_uav_controllers::se3_controller::Gains_t>(std::mutex&, mrs_uav_controllers::se3_controller::Gains_t, mrs_uav_controllers::se3_controller::Gains_t&)4326
auto mrs_lib::set_mutexed<mrs_uav_controllers::mpc_controllerConfig>(std::mutex&, mrs_uav_controllers::mpc_controllerConfig, mrs_uav_controllers::mpc_controllerConfig&)182
auto mrs_lib::set_mutexed<mrs_uav_controllers::se3_controllerConfig>(std::mutex&, mrs_uav_controllers::se3_controllerConfig, mrs_uav_controllers::se3_controllerConfig&)183
auto mrs_lib::set_mutexed<mrs_uav_trajectory_generation::drsConfig>(std::mutex&, mrs_uav_trajectory_generation::drsConfig, mrs_uav_trajectory_generation::drsConfig&)91
auto mrs_lib::set_mutexed<Eigen::Matrix<double, 2, 1, 0, 2, 1> >(std::mutex&, Eigen::Matrix<double, 2, 1, 0, 2, 1>, Eigen::Matrix<double, 2, 1, 0, 2, 1>&)0
auto mrs_lib::set_mutexed<Eigen::Matrix<double, 2, 2, 0, 2, 2> >(std::mutex&, Eigen::Matrix<double, 2, 2, 0, 2, 2>, Eigen::Matrix<double, 2, 2, 0, 2, 2>&)0
auto mrs_lib::set_mutexed<Eigen::Matrix<double, 3, 1, 0, 3, 1> >(std::mutex&, Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1>&)0
auto mrs_lib::set_mutexed<Eigen::Matrix<double, 3, 3, 0, 3, 3> >(std::mutex&, Eigen::Matrix<double, 3, 3, 0, 3, 3>, Eigen::Matrix<double, 3, 3, 0, 3, 3>&)0
auto mrs_lib::set_mutexed<Eigen::Matrix<double, 6, 1, 0, 6, 1> >(std::mutex&, Eigen::Matrix<double, 6, 1, 0, 6, 1>, Eigen::Matrix<double, 6, 1, 0, 6, 1>&)0
auto mrs_lib::set_mutexed<Eigen::Matrix<double, 6, 6, 0, 6, 6> >(std::mutex&, Eigen::Matrix<double, 6, 6, 0, 6, 6>, Eigen::Matrix<double, 6, 6, 0, 6, 6>&)0
auto mrs_lib::set_mutexed<mrs_msgs::Float64Stamped_<std::allocator<void> > >(std::mutex&, mrs_msgs::Float64Stamped_<std::allocator<void> >, mrs_msgs::Float64Stamped_<std::allocator<void> >&)132616
auto mrs_lib::set_mutexed<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >(std::mutex&, mrs_msgs::DynamicsConstraints_<std::allocator<void> >, mrs_msgs::DynamicsConstraints_<std::allocator<void> >&)2036
auto mrs_lib::set_mutexed<mrs_msgs::Float64ArrayStamped_<std::allocator<void> > >(std::mutex&, mrs_msgs::Float64ArrayStamped_<std::allocator<void> >, mrs_msgs::Float64ArrayStamped_<std::allocator<void> >&)500220
auto mrs_lib::set_mutexed<mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> > >(std::mutex&, mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> >, mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> >&)113
auto mrs_lib::set_mutexed<mrs_msgs::UavState_<std::allocator<void> > >(std::mutex&, mrs_msgs::UavState_<std::allocator<void> >, mrs_msgs::UavState_<std::allocator<void> >&)944658
auto mrs_lib::set_mutexed<nav_msgs::Odometry_<std::allocator<void> > >(std::mutex&, nav_msgs::Odometry_<std::allocator<void> >, nav_msgs::Odometry_<std::allocator<void> >&)367751
auto mrs_lib::set_mutexed<mrs_lib::KalmanFilter<2, 1, 1>::statecov_t>(std::mutex&, mrs_lib::KalmanFilter<2, 1, 1>::statecov_t, mrs_lib::KalmanFilter<2, 1, 1>::statecov_t&)0
auto mrs_lib::set_mutexed<mrs_lib::KalmanFilter<3, 1, 1>::statecov_t>(std::mutex&, mrs_lib::KalmanFilter<3, 1, 1>::statecov_t, mrs_lib::KalmanFilter<3, 1, 1>::statecov_t&)733469
auto mrs_lib::set_mutexed<mrs_lib::KalmanFilter<6, 2, 2>::statecov_t>(std::mutex&, mrs_lib::KalmanFilter<6, 2, 2>::statecov_t, mrs_lib::KalmanFilter<6, 2, 2>::statecov_t&)364918
auto mrs_lib::set_mutexed<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::mutex&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&)32707
auto mrs_lib::set_mutexed<std::optional<Eigen::Matrix<double, 3, 1, 0, 3, 1> > >(std::mutex&, std::optional<Eigen::Matrix<double, 3, 1, 0, 3, 1> >, std::optional<Eigen::Matrix<double, 3, 1, 0, 3, 1> >&)192821
auto mrs_lib::set_mutexed<double>(std::mutex&, double, double&)1027198
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/mutex.h.gcov.frameset.html b/mrs_lib/include/mrs_lib/mutex.h.gcov.frameset.html new file mode 100644 index 0000000000..c07acea5c8 --- /dev/null +++ b/mrs_lib/include/mrs_lib/mutex.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/mutex.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/include/mrs_lib/mutex.h.gcov.html b/mrs_lib/include/mrs_lib/mutex.h.gcov.html new file mode 100644 index 0000000000..a8e86e370f --- /dev/null +++ b/mrs_lib/include/mrs_lib/mutex.h.gcov.html @@ -0,0 +1,260 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/mutex.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - mutex.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:1111100.0 %
Date:2024-04-18 23:11:36Functions:678083.8 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : /**  \file
+       2             :      \brief Defines helper routines for getting and setting variables under mutex locks
+       3             :      \author Tomas Baca - tomas.baca@fel.cvut.cz
+       4             :  */
+       5             : #ifndef MUTEX_H
+       6             : #define MUTEX_H
+       7             : 
+       8             : #include <iostream>
+       9             : #include <mutex>
+      10             : #include <tuple>
+      11             : 
+      12             : namespace mrs_lib
+      13             : {
+      14             : 
+      15             : /**
+      16             :  * @brief thread-safe getter and setter for values of variables (args)
+      17             :  *
+      18             :  * @tparam GetArgs types of the variables to get
+      19             :  * @tparam SetArgs types of the variables to set
+      20             :  * @param mut mutex which protects the variables
+      21             :  * @param get tuple of variable references to obtain the values from
+      22             :  * @param to_set tuple of variable references to set the new values from \p from_set
+      23             :  * @param from_set tuple of the new values to be set to \p to_set
+      24             :  *
+      25             :  * @return tuple of the values from \p get
+      26             :  */
+      27             : template <class... GetArgs, class... SetArgs>
+      28             : std::tuple<GetArgs...> get_set_mutexed(std::mutex& mut, std::tuple<GetArgs&...> get, std::tuple<SetArgs...> from_set, std::tuple<SetArgs&...> to_set) {
+      29             : 
+      30             :   std::scoped_lock lock(mut);
+      31             : 
+      32             :   std::tuple<GetArgs...> result = get;
+      33             :   to_set = from_set;
+      34             : 
+      35             :   return result;
+      36             : }
+      37             : 
+      38             : /**
+      39             :  * @brief thread-safe getter for values of variables (args)
+      40             :  *
+      41             :  * @tparam Args types of the variables
+      42             :  * @param mut mutex which protects the variables
+      43             :  * @param args variables to obtain the values from
+      44             :  *
+      45             :  * @return std::tuple of the values
+      46             :  */
+      47             : template <class... Args>
+      48      928074 : std::tuple<Args...> get_mutexed(std::mutex& mut, Args&... args) {
+      49             : 
+      50     1856148 :   std::scoped_lock lock(mut);
+      51             : 
+      52      928074 :   std::tuple result = std::tuple(args...);
+      53             : 
+      54     1856148 :   return result;
+      55             : }
+      56             : 
+      57             : 
+      58             : /**
+      59             :  * @brief thread-safe getter a value from a variable
+      60             :  *
+      61             :  * @tparam T type of the variable
+      62             :  * @param mut mutex which protects the variable
+      63             :  * @param arg variable to obtain the value from
+      64             :  *
+      65             :  * @return value of the variable
+      66             :  */
+      67             : template <class T>
+      68    17846248 : T get_mutexed(std::mutex& mut, T& arg) {
+      69             : 
+      70    29397852 :   std::scoped_lock lock(mut);
+      71             : 
+      72    35686057 :   return arg;
+      73             : }
+      74             : 
+      75             : /**
+      76             :  * @brief base case of the variadic template for set_mutexed()
+      77             :  *
+      78             :  * @tparam T variable type
+      79             :  * @param what value to set
+      80             :  * @param where reference to be set
+      81             :  */
+      82             : template <class T>
+      83             : void set_mutexed_impl(const T what, T& where) {
+      84             : 
+      85             :   where = what;
+      86             : }
+      87             : 
+      88             : /**
+      89             :  * @brief general case of the variadic template for set_mutexed()
+      90             :  *
+      91             :  * @tparam T type of the next variable to set
+      92             :  * @tparam Args types of the rest of the variables
+      93             :  * @param what value to set
+      94             :  * @param where reference to be set
+      95             :  * @param args the remaining arguments
+      96             :  */
+      97             : template <class T, class... Args>
+      98             : void set_mutexed_impl(const T what, T& where, Args... args) {
+      99             : 
+     100             :   where = what;
+     101             : 
+     102             :   set_mutexed_impl(args...);
+     103             : }
+     104             : 
+     105             : /**
+     106             :  * @brief thread-safe setter for a variable
+     107             :  *
+     108             :  * @tparam T type of the variable
+     109             :  * @param mut mutex to be locked
+     110             :  * @param what value to set
+     111             :  * @param where reference to be set
+     112             :  *
+     113             :  * @return
+     114             :  */
+     115             : template <class T>
+     116     4410869 : auto set_mutexed(std::mutex& mut, const T what, T& where) {
+     117             : 
+     118     7769869 :   std::scoped_lock lock(mut);
+     119             : 
+     120     4401925 :   where = what;
+     121             : 
+     122     8815281 :   return where;
+     123             : }
+     124             : 
+     125             : /**
+     126             :  * @brief thread-safe setter for multiple variables
+     127             :  *
+     128             :  * example:
+     129             :  *   set_mutexed(my_mutex_, a, a_, b, b_, c, c_);
+     130             :  *   where a, b, c are the values to be set
+     131             :  *         a_, b_, c_ are the variables to be updated
+     132             :  *
+     133             :  * @tparam Args types of the variables
+     134             :  * @param mut mutex to be locked
+     135             :  * @param args
+     136             :  *
+     137             :  * @return alternating list of values that were just set
+     138             :  */
+     139             : template <class... Args>
+     140             : auto set_mutexed(std::mutex& mut, Args&... args) {
+     141             : 
+     142             :   std::scoped_lock lock(mut);
+     143             : 
+     144             :   set_mutexed_impl(args...);
+     145             : 
+     146             :   return std::tuple(args...);
+     147             : }
+     148             : 
+     149             : /**
+     150             :  * @brief thread-safe setter for multiple variables
+     151             :  *
+     152             :  * example:
+     153             :  *   set_mutexed(mu_mutex, std::tuple(a, b, c), std::forward_as_tuple(a_, b_, c_));
+     154             :  *   where a, b, c are the values to be set
+     155             :  *         a_, b_, c_ are the updated variables
+     156             :  *
+     157             :  * @tparam Args types of the variables
+     158             :  * @param mut mutex to be locked
+     159             :  * @param from std::tuple of the values
+     160             :  * @param to std::tuple of reference to the variablaes
+     161             :  *
+     162             :  * @return
+     163             :  */
+     164             : template <class... Args>
+     165             : auto set_mutexed(std::mutex& mut, const std::tuple<Args...> from, std::tuple<Args&...> to) {
+     166             : 
+     167             :   std::scoped_lock lock(mut);
+     168             : 
+     169             :   to = from;
+     170             : 
+     171             :   return to;
+     172             : }
+     173             : 
+     174             : }  // namespace mrs_lib
+     175             : 
+     176             : #endif
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/mutex.h.gcov.overview.html b/mrs_lib/include/mrs_lib/mutex.h.gcov.overview.html new file mode 100644 index 0000000000..3b0784eb80 --- /dev/null +++ b/mrs_lib/include/mrs_lib/mutex.h.gcov.overview.html @@ -0,0 +1,64 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/mutex.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/include/mrs_lib/mutex.h.gcov.png b/mrs_lib/include/mrs_lib/mutex.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..133eb4e0006b637a7fd96542303131f705ad7624 GIT binary patch literal 739 zcmV<90v!E`P)7|?WU-uAaUzR(5L09Z+v1q`*rF@#f&0R)y(WRk!}I}W4ls3S zL%{1Ah-H~+$P5I9W)UC~i!pJS8gUyCnEWLXN-S-F?731Y!x*~$p=}SxNLvHtscmz3 zdnjYjQ=VcfEb-TzK_{KiJfyVwBb4@R{GG|jKz?j8(ji$wT z+v2Pn*#hnGcfj%Ms%FFhv_e4+fARWEf=d9*B~XH{it9L3}0XmTdaewHKl}UMrts>XV8qkb%_aHnnf&%b%J{U zaqH-6bGE!dcuEYCvj;Rj}Sj-7_fxn*s z5=9BX&N_lt)}t> zUH8wBpq;4k!5VMQon&0V|0n?MI*SiZzwCQ(0f1f_VT*^_s;}_{0NZ~}1{wEWoj*#k V+z?^s1XKV3002ovPDHLkV1nIISQ-ET literal 0 HcmV?d00001 diff --git a/mrs_lib/include/mrs_lib/param_loader.h.func-sort-c.html b/mrs_lib/include/mrs_lib/param_loader.h.func-sort-c.html new file mode 100644 index 0000000000..1b6b175eb2 --- /dev/null +++ b/mrs_lib/include/mrs_lib/param_loader.h.func-sort-c.html @@ -0,0 +1,392 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/param_loader.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - param_loader.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:27130090.3 %
Date:2024-04-18 23:11:36Functions:7878100.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::ParamLoader::loadParam2(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, XmlRpc::XmlRpcValue const&)1
XmlRpc::XmlRpcValue mrs_lib::ParamLoader::loadParam2<XmlRpc::XmlRpcValue>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, XmlRpc::XmlRpcValue const&)1
mrs_lib::ParamLoader::print_warning(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1
void mrs_lib::ParamLoader::loadMatrixArray<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<Eigen::Matrix<double, -1, -1, 0, -1, -1>, std::allocator<Eigen::Matrix<double, -1, -1, 0, -1, -1> > >&)1
void mrs_lib::ParamLoader::loadMatrixArray<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<Eigen::Matrix<double, -1, -1, 0, -1, -1>, std::allocator<Eigen::Matrix<double, -1, -1, 0, -1, -1> > >&, std::vector<Eigen::Matrix<double, -1, -1, 0, -1, -1>, std::allocator<Eigen::Matrix<double, -1, -1, 0, -1, -1> > > const&)1
Eigen::Matrix<float, -1, -1, 0, -1, -1> mrs_lib::ParamLoader::loadMatrixKnown2<float>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int, int)1
Eigen::Matrix<float, -1, -1, 0, -1, -1> mrs_lib::ParamLoader::loadMatrixKnown2<float, Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<float>, Eigen::Matrix<float, -1, -1, 0, -1, -1> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::MatrixBase<Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<float>, Eigen::Matrix<float, -1, -1, 0, -1, -1> > > const&, int, int)1
bool mrs_lib::ParamLoader::loadMatrixStatic<0, 0, double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<double, 0, 0, ((Eigen::StorageOptions)0)|((((0)==(1))&&((0)!=(1)))?((Eigen::StorageOptions)1) : ((((0)==(1))&&((0)!=(1)))?((Eigen::StorageOptions)0) : ((Eigen::StorageOptions)0))), 0, 0>&)1
bool mrs_lib::ParamLoader::loadMatrixStatic<3, 3, float, Eigen::Product<Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<float>, Eigen::Matrix<float, 3, 3, 0, 3, 3> >, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<float>, Eigen::Matrix<float, 3, 3, 0, 3, 3> >, 0> >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<float, 3, 3, ((Eigen::StorageOptions)0)|((((3)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)1) : ((((3)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)0) : ((Eigen::StorageOptions)0))), 3, 3>&, Eigen::MatrixBase<Eigen::Product<Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<float>, Eigen::Matrix<float, 3, 3, 0, 3, 3> >, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<float>, Eigen::Matrix<float, 3, 3, 0, 3, 3> >, 0> > const&)1
bool mrs_lib::ParamLoader::loadMatrixDynamic<double, Eigen::CwiseBinaryOp<Eigen::internal::scalar_product_op<double, double>, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> const> const, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> > const> >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<double, -1, -1, 0, -1, -1>&, Eigen::MatrixBase<Eigen::CwiseBinaryOp<Eigen::internal::scalar_product_op<double, double>, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> const> const, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> > const> > const&, int, int)1
bool mrs_lib::ParamLoader::loadMatrixDynamic<double, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<double, -1, -1, 0, -1, -1>&, Eigen::MatrixBase<Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> > > const&, int, int)1
Eigen::Matrix<double, 0, 0, ((Eigen::StorageOptions)0)|((((0)==(1))&&((0)!=(1)))?((Eigen::StorageOptions)1) : ((((0)==(1))&&((0)!=(1)))?((Eigen::StorageOptions)0) : ((Eigen::StorageOptions)0))), 0, 0> mrs_lib::ParamLoader::loadMatrixStatic2<0, 0, double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1
Eigen::Matrix<float, 3, 3, ((Eigen::StorageOptions)0)|((((3)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)1) : ((((3)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)0) : ((Eigen::StorageOptions)0))), 3, 3> mrs_lib::ParamLoader::loadMatrixStatic2<3, 3, float>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1
Eigen::Matrix<float, 3, 3, ((Eigen::StorageOptions)0)|((((3)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)1) : ((((3)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)0) : ((Eigen::StorageOptions)0))), 3, 3> mrs_lib::ParamLoader::loadMatrixStatic2<3, 3, float, Eigen::Product<Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<float>, Eigen::Matrix<float, 3, 3, 0, 3, 3> >, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<float>, Eigen::Matrix<float, 3, 3, 0, 3, 3> >, 0> >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::MatrixBase<Eigen::Product<Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<float>, Eigen::Matrix<float, 3, 3, 0, 3, 3> >, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<float>, Eigen::Matrix<float, 3, 3, 0, 3, 3> >, 0> > const&)1
bool mrs_lib::ParamLoader::loadParamReusable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&)1
Eigen::Matrix<double, -1, -1, 0, -1, -1> mrs_lib::ParamLoader::loadMatrixDynamic2<double, Eigen::CwiseBinaryOp<Eigen::internal::scalar_product_op<double, double>, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> const> const, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> > const> >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::MatrixBase<Eigen::CwiseBinaryOp<Eigen::internal::scalar_product_op<double, double>, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> const> const, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> > const> > const&, int, int)1
std::pair<Eigen::Matrix<double, 0, 0, ((Eigen::StorageOptions)0)|((((0)==(1))&&((0)!=(1)))?((Eigen::StorageOptions)1) : ((((0)==(1))&&((0)!=(1)))?((Eigen::StorageOptions)0) : ((Eigen::StorageOptions)0))), 0, 0>, bool> mrs_lib::ParamLoader::loadMatrixStatic_internal<0, 0, double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<double, 0, 0, ((Eigen::StorageOptions)0)|((((0)==(1))&&((0)!=(1)))?((Eigen::StorageOptions)1) : ((((0)==(1))&&((0)!=(1)))?((Eigen::StorageOptions)0) : ((Eigen::StorageOptions)0))), 0, 0> const&, mrs_lib::ParamLoader::optional_t, mrs_lib::ParamLoader::unique_t)1
bool mrs_lib::ParamLoader::loadMatrixKnown<float>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<float, -1, -1, 0, -1, -1>&, int, int)2
bool mrs_lib::ParamLoader::loadMatrixKnown<float, Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<float>, Eigen::Matrix<float, -1, -1, 0, -1, -1> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<float, -1, -1, 0, -1, -1>&, Eigen::MatrixBase<Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<float>, Eigen::Matrix<float, -1, -1, 0, -1, -1> > > const&, int, int)2
std::vector<Eigen::Matrix<double, -1, -1, 0, -1, -1>, std::allocator<Eigen::Matrix<double, -1, -1, 0, -1, -1> > > mrs_lib::ParamLoader::loadMatrixArray2<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<Eigen::Matrix<double, -1, -1, 0, -1, -1>, std::allocator<Eigen::Matrix<double, -1, -1, 0, -1, -1> > > const&)2
bool mrs_lib::ParamLoader::loadMatrixStatic<3, 3, float, Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<float>, Eigen::Matrix<float, 3, 3, 0, 3, 3> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<float, 3, 3, ((Eigen::StorageOptions)0)|((((3)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)1) : ((((3)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)0) : ((Eigen::StorageOptions)0))), 3, 3>&, Eigen::MatrixBase<Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<float>, Eigen::Matrix<float, 3, 3, 0, 3, 3> > > const&)2
mrs_lib::ParamLoader::loadParam(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, XmlRpc::XmlRpcValue&, XmlRpc::XmlRpcValue const&)2
bool mrs_lib::ParamLoader::loadParam<XmlRpc::XmlRpcValue>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, XmlRpc::XmlRpcValue&, XmlRpc::XmlRpcValue const&)2
mrs_lib::ParamLoader::printValue(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, XmlRpc::XmlRpcValue&)3
std::vector<Eigen::Matrix<double, -1, -1, 0, -1, -1>, std::allocator<Eigen::Matrix<double, -1, -1, 0, -1, -1> > > mrs_lib::ParamLoader::loadMatrixArray2<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)3
bool mrs_lib::ParamLoader::loadMatrixStatic<3, 3, float>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<float, 3, 3, ((Eigen::StorageOptions)0)|((((3)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)1) : ((((3)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)0) : ((Eigen::StorageOptions)0))), 3, 3>&)3
mrs_lib::ParamLoader::resetLoadedSuccessfully()3
mrs_lib::ParamLoader::loadParam(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, XmlRpc::XmlRpcValue&)3
bool mrs_lib::ParamLoader::loadParam<XmlRpc::XmlRpcValue>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, XmlRpc::XmlRpcValue&)3
std::pair<Eigen::Matrix<float, -1, -1, 0, -1, -1>, bool> mrs_lib::ParamLoader::loadMatrixKnown_internal<float>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<float, -1, -1, 0, -1, -1> const&, int, int, mrs_lib::ParamLoader::optional_t, mrs_lib::ParamLoader::unique_t)4
mrs_lib::ParamLoader::printValue_recursive(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, XmlRpc::XmlRpcValue&, unsigned int)5
std::vector<Eigen::Matrix<double, -1, -1, 0, -1, -1>, std::allocator<Eigen::Matrix<double, -1, -1, 0, -1, -1> > > mrs_lib::ParamLoader::loadMatrixArray_internal<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<Eigen::Matrix<double, -1, -1, 0, -1, -1>, std::allocator<Eigen::Matrix<double, -1, -1, 0, -1, -1> > > const&, mrs_lib::ParamLoader::optional_t, mrs_lib::ParamLoader::unique_t)5
mrs_lib::ParamLoader::resolved(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)5
std::pair<Eigen::Matrix<float, 3, 3, ((Eigen::StorageOptions)0)|((((3)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)1) : ((((3)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)0) : ((Eigen::StorageOptions)0))), 3, 3>, bool> mrs_lib::ParamLoader::loadMatrixStatic_internal<3, 3, float>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<float, 3, 3, ((Eigen::StorageOptions)0)|((((3)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)1) : ((((3)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)0) : ((Eigen::StorageOptions)0))), 3, 3> const&, mrs_lib::ParamLoader::optional_t, mrs_lib::ParamLoader::unique_t)6
std::pair<XmlRpc::XmlRpcValue, bool> mrs_lib::ParamLoader::load<XmlRpc::XmlRpcValue>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, XmlRpc::XmlRpcValue const&, mrs_lib::ParamLoader::optional_t, mrs_lib::ParamLoader::unique_t)6
mrs_lib::ParamLoader::printError(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)7
void mrs_lib::ParamLoader::printValue<float>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<float, -1, -1, 0, -1, -1> const&)8
std::pair<Eigen::Matrix<float, -1, -1, 0, -1, -1>, bool> mrs_lib::ParamLoader::loadMatrixX<float>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<float, -1, -1, 0, -1, -1> const&, int, int, mrs_lib::ParamLoader::optional_t, mrs_lib::ParamLoader::unique_t, mrs_lib::ParamLoader::swap_t, bool)10
mrs_lib::ParamLoader::resetUniques()20
bool mrs_lib::ParamLoader::loadParam<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)39
Eigen::Matrix<double, -1, -1, 0, -1, -1> mrs_lib::ParamLoader::loadMatrixDynamic2<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int, int)72
bool mrs_lib::ParamLoader::loadMatrixDynamic<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<double, -1, -1, 0, -1, -1>&, int, int)74
bool mrs_lib::ParamLoader::loadMatrixStatic<3, 3, double, Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<double>, Eigen::Matrix<double, 3, 3, 0, 3, 3> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<double, 3, 3, ((Eigen::StorageOptions)0)|((((3)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)1) : ((((3)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)0) : ((Eigen::StorageOptions)0))), 3, 3>&, Eigen::MatrixBase<Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<double>, Eigen::Matrix<double, 3, 3, 0, 3, 3> > > const&)91
bool mrs_lib::ParamLoader::loadMatrixDynamic<double, Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<double>, Eigen::Matrix<double, 4, 4, 0, 4, 4> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<double, -1, -1, 0, -1, -1>&, Eigen::MatrixBase<Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<double>, Eigen::Matrix<double, 4, 4, 0, 4, 4> > > const&, int, int)91
std::pair<Eigen::Matrix<double, 3, 3, ((Eigen::StorageOptions)0)|((((3)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)1) : ((((3)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)0) : ((Eigen::StorageOptions)0))), 3, 3>, bool> mrs_lib::ParamLoader::loadMatrixStatic_internal<3, 3, double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<double, 3, 3, ((Eigen::StorageOptions)0)|((((3)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)1) : ((((3)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)0) : ((Eigen::StorageOptions)0))), 3, 3> const&, mrs_lib::ParamLoader::optional_t, mrs_lib::ParamLoader::unique_t)91
std::pair<Eigen::Matrix<double, -1, -1, 0, -1, -1>, bool> mrs_lib::ParamLoader::loadMatrixDynamic_internal<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, int, int, mrs_lib::ParamLoader::optional_t, mrs_lib::ParamLoader::unique_t)167
bool mrs_lib::ParamLoader::loadMatrixKnown<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<double, -1, -1, 0, -1, -1>&, int, int)364
std::pair<Eigen::Matrix<double, -1, -1, 0, -1, -1>, bool> mrs_lib::ParamLoader::loadMatrixKnown_internal<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, int, int, mrs_lib::ParamLoader::optional_t, mrs_lib::ParamLoader::unique_t)364
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > mrs_lib::ParamLoader::loadParam2<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)455
std::pair<Eigen::Matrix<double, -1, -1, 0, -1, -1>, bool> mrs_lib::ParamLoader::loadMatrixX<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, int, int, mrs_lib::ParamLoader::optional_t, mrs_lib::ParamLoader::unique_t, mrs_lib::ParamLoader::swap_t, bool)628
void mrs_lib::ParamLoader::printValue<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<double, -1, -1, 0, -1, -1> const&)632
bool mrs_lib::ParamLoader::loadParam<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, double&, double const&)728
void mrs_lib::ParamLoader::printValue<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<double, std::allocator<double> > const&)1001
std::pair<std::vector<double, std::allocator<double> >, bool> mrs_lib::ParamLoader::load<std::vector<double, std::allocator<double> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<double, std::allocator<double> > const&, mrs_lib::ParamLoader::optional_t, mrs_lib::ParamLoader::unique_t)1001
bool mrs_lib::ParamLoader::loadParam<std::vector<double, std::allocator<double> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<double, std::allocator<double> >&)1001
mrs_lib::ParamLoader::ParamLoader(ros::NodeHandle const&, std::basic_string_view<char, std::char_traits<char> >)1541
mrs_lib::ParamLoader::setPrefix(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1816
mrs_lib::ParamLoader::addYamlFileFromParam(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)2451
void mrs_lib::ParamLoader::printValue<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&)3197
std::pair<std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, bool> mrs_lib::ParamLoader::load<std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, mrs_lib::ParamLoader::optional_t, mrs_lib::ParamLoader::unique_t)3198
bool mrs_lib::ParamLoader::loadParam<std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&)3198
mrs_lib::ParamLoader::ParamLoader(ros::NodeHandle const&, bool, std::basic_string_view<char, std::char_traits<char> >)3551
mrs_lib::ParamLoader::loadedSuccessfully()3983
void mrs_lib::ParamLoader::printValue<int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int const&)4608
std::pair<int, bool> mrs_lib::ParamLoader::load<int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int const&, mrs_lib::ParamLoader::optional_t, mrs_lib::ParamLoader::unique_t)4608
bool mrs_lib::ParamLoader::loadParam<int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int&)4608
bool mrs_lib::ParamLoader::loadParam<bool>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool&, bool const&)5387
mrs_lib::ParamLoader::addYamlFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)10107
bool mrs_lib::ParamLoader::loadParam<bool>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool&)10714
bool mrs_lib::ParamLoader::loadParam<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&)14943
void mrs_lib::ParamLoader::printValue<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)15438
std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool> mrs_lib::ParamLoader::load<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, mrs_lib::ParamLoader::optional_t, mrs_lib::ParamLoader::unique_t)15438
void mrs_lib::ParamLoader::printValue<bool>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&)16101
std::pair<bool, bool> mrs_lib::ParamLoader::load<bool>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&, mrs_lib::ParamLoader::optional_t, mrs_lib::ParamLoader::unique_t)16101
bool mrs_lib::ParamLoader::loadParam<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, double&)36571
void mrs_lib::ParamLoader::printValue<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, double const&)37299
std::pair<double, bool> mrs_lib::ParamLoader::load<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, double const&, mrs_lib::ParamLoader::optional_t, mrs_lib::ParamLoader::unique_t)37299
mrs_lib::ParamLoader::check_duplicit_loading(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)78292
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/param_loader.h.func.html b/mrs_lib/include/mrs_lib/param_loader.h.func.html new file mode 100644 index 0000000000..dd37ffed16 --- /dev/null +++ b/mrs_lib/include/mrs_lib/param_loader.h.func.html @@ -0,0 +1,392 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/param_loader.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - param_loader.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:27130090.3 %
Date:2024-04-18 23:11:36Functions:7878100.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::ParamLoader::loadParam2(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, XmlRpc::XmlRpcValue const&)1
XmlRpc::XmlRpcValue mrs_lib::ParamLoader::loadParam2<XmlRpc::XmlRpcValue>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, XmlRpc::XmlRpcValue const&)1
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > mrs_lib::ParamLoader::loadParam2<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)455
mrs_lib::ParamLoader::printError(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)7
mrs_lib::ParamLoader::printValue(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, XmlRpc::XmlRpcValue&)3
void mrs_lib::ParamLoader::printValue<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&)3197
void mrs_lib::ParamLoader::printValue<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)15438
void mrs_lib::ParamLoader::printValue<bool>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&)16101
void mrs_lib::ParamLoader::printValue<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<double, -1, -1, 0, -1, -1> const&)632
void mrs_lib::ParamLoader::printValue<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<double, std::allocator<double> > const&)1001
void mrs_lib::ParamLoader::printValue<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, double const&)37299
void mrs_lib::ParamLoader::printValue<float>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<float, -1, -1, 0, -1, -1> const&)8
void mrs_lib::ParamLoader::printValue<int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int const&)4608
mrs_lib::ParamLoader::addYamlFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)10107
std::pair<Eigen::Matrix<double, -1, -1, 0, -1, -1>, bool> mrs_lib::ParamLoader::loadMatrixX<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, int, int, mrs_lib::ParamLoader::optional_t, mrs_lib::ParamLoader::unique_t, mrs_lib::ParamLoader::swap_t, bool)628
std::pair<Eigen::Matrix<float, -1, -1, 0, -1, -1>, bool> mrs_lib::ParamLoader::loadMatrixX<float>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<float, -1, -1, 0, -1, -1> const&, int, int, mrs_lib::ParamLoader::optional_t, mrs_lib::ParamLoader::unique_t, mrs_lib::ParamLoader::swap_t, bool)10
mrs_lib::ParamLoader::resetUniques()20
mrs_lib::ParamLoader::print_warning(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1
void mrs_lib::ParamLoader::loadMatrixArray<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<Eigen::Matrix<double, -1, -1, 0, -1, -1>, std::allocator<Eigen::Matrix<double, -1, -1, 0, -1, -1> > >&)1
void mrs_lib::ParamLoader::loadMatrixArray<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<Eigen::Matrix<double, -1, -1, 0, -1, -1>, std::allocator<Eigen::Matrix<double, -1, -1, 0, -1, -1> > >&, std::vector<Eigen::Matrix<double, -1, -1, 0, -1, -1>, std::allocator<Eigen::Matrix<double, -1, -1, 0, -1, -1> > > const&)1
bool mrs_lib::ParamLoader::loadMatrixKnown<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<double, -1, -1, 0, -1, -1>&, int, int)364
bool mrs_lib::ParamLoader::loadMatrixKnown<float>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<float, -1, -1, 0, -1, -1>&, int, int)2
bool mrs_lib::ParamLoader::loadMatrixKnown<float, Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<float>, Eigen::Matrix<float, -1, -1, 0, -1, -1> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<float, -1, -1, 0, -1, -1>&, Eigen::MatrixBase<Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<float>, Eigen::Matrix<float, -1, -1, 0, -1, -1> > > const&, int, int)2
std::vector<Eigen::Matrix<double, -1, -1, 0, -1, -1>, std::allocator<Eigen::Matrix<double, -1, -1, 0, -1, -1> > > mrs_lib::ParamLoader::loadMatrixArray2<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)3
std::vector<Eigen::Matrix<double, -1, -1, 0, -1, -1>, std::allocator<Eigen::Matrix<double, -1, -1, 0, -1, -1> > > mrs_lib::ParamLoader::loadMatrixArray2<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<Eigen::Matrix<double, -1, -1, 0, -1, -1>, std::allocator<Eigen::Matrix<double, -1, -1, 0, -1, -1> > > const&)2
Eigen::Matrix<float, -1, -1, 0, -1, -1> mrs_lib::ParamLoader::loadMatrixKnown2<float>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int, int)1
Eigen::Matrix<float, -1, -1, 0, -1, -1> mrs_lib::ParamLoader::loadMatrixKnown2<float, Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<float>, Eigen::Matrix<float, -1, -1, 0, -1, -1> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::MatrixBase<Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<float>, Eigen::Matrix<float, -1, -1, 0, -1, -1> > > const&, int, int)1
bool mrs_lib::ParamLoader::loadMatrixStatic<0, 0, double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<double, 0, 0, ((Eigen::StorageOptions)0)|((((0)==(1))&&((0)!=(1)))?((Eigen::StorageOptions)1) : ((((0)==(1))&&((0)!=(1)))?((Eigen::StorageOptions)0) : ((Eigen::StorageOptions)0))), 0, 0>&)1
bool mrs_lib::ParamLoader::loadMatrixStatic<3, 3, double, Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<double>, Eigen::Matrix<double, 3, 3, 0, 3, 3> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<double, 3, 3, ((Eigen::StorageOptions)0)|((((3)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)1) : ((((3)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)0) : ((Eigen::StorageOptions)0))), 3, 3>&, Eigen::MatrixBase<Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<double>, Eigen::Matrix<double, 3, 3, 0, 3, 3> > > const&)91
bool mrs_lib::ParamLoader::loadMatrixStatic<3, 3, float>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<float, 3, 3, ((Eigen::StorageOptions)0)|((((3)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)1) : ((((3)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)0) : ((Eigen::StorageOptions)0))), 3, 3>&)3
bool mrs_lib::ParamLoader::loadMatrixStatic<3, 3, float, Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<float>, Eigen::Matrix<float, 3, 3, 0, 3, 3> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<float, 3, 3, ((Eigen::StorageOptions)0)|((((3)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)1) : ((((3)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)0) : ((Eigen::StorageOptions)0))), 3, 3>&, Eigen::MatrixBase<Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<float>, Eigen::Matrix<float, 3, 3, 0, 3, 3> > > const&)2
bool mrs_lib::ParamLoader::loadMatrixStatic<3, 3, float, Eigen::Product<Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<float>, Eigen::Matrix<float, 3, 3, 0, 3, 3> >, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<float>, Eigen::Matrix<float, 3, 3, 0, 3, 3> >, 0> >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<float, 3, 3, ((Eigen::StorageOptions)0)|((((3)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)1) : ((((3)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)0) : ((Eigen::StorageOptions)0))), 3, 3>&, Eigen::MatrixBase<Eigen::Product<Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<float>, Eigen::Matrix<float, 3, 3, 0, 3, 3> >, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<float>, Eigen::Matrix<float, 3, 3, 0, 3, 3> >, 0> > const&)1
bool mrs_lib::ParamLoader::loadMatrixDynamic<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<double, -1, -1, 0, -1, -1>&, int, int)74
bool mrs_lib::ParamLoader::loadMatrixDynamic<double, Eigen::CwiseBinaryOp<Eigen::internal::scalar_product_op<double, double>, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> const> const, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> > const> >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<double, -1, -1, 0, -1, -1>&, Eigen::MatrixBase<Eigen::CwiseBinaryOp<Eigen::internal::scalar_product_op<double, double>, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> const> const, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> > const> > const&, int, int)1
bool mrs_lib::ParamLoader::loadMatrixDynamic<double, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<double, -1, -1, 0, -1, -1>&, Eigen::MatrixBase<Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> > > const&, int, int)1
bool mrs_lib::ParamLoader::loadMatrixDynamic<double, Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<double>, Eigen::Matrix<double, 4, 4, 0, 4, 4> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<double, -1, -1, 0, -1, -1>&, Eigen::MatrixBase<Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<double>, Eigen::Matrix<double, 4, 4, 0, 4, 4> > > const&, int, int)91
Eigen::Matrix<double, 0, 0, ((Eigen::StorageOptions)0)|((((0)==(1))&&((0)!=(1)))?((Eigen::StorageOptions)1) : ((((0)==(1))&&((0)!=(1)))?((Eigen::StorageOptions)0) : ((Eigen::StorageOptions)0))), 0, 0> mrs_lib::ParamLoader::loadMatrixStatic2<0, 0, double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1
Eigen::Matrix<float, 3, 3, ((Eigen::StorageOptions)0)|((((3)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)1) : ((((3)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)0) : ((Eigen::StorageOptions)0))), 3, 3> mrs_lib::ParamLoader::loadMatrixStatic2<3, 3, float>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1
Eigen::Matrix<float, 3, 3, ((Eigen::StorageOptions)0)|((((3)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)1) : ((((3)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)0) : ((Eigen::StorageOptions)0))), 3, 3> mrs_lib::ParamLoader::loadMatrixStatic2<3, 3, float, Eigen::Product<Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<float>, Eigen::Matrix<float, 3, 3, 0, 3, 3> >, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<float>, Eigen::Matrix<float, 3, 3, 0, 3, 3> >, 0> >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::MatrixBase<Eigen::Product<Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<float>, Eigen::Matrix<float, 3, 3, 0, 3, 3> >, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<float>, Eigen::Matrix<float, 3, 3, 0, 3, 3> >, 0> > const&)1
bool mrs_lib::ParamLoader::loadParamReusable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&)1
Eigen::Matrix<double, -1, -1, 0, -1, -1> mrs_lib::ParamLoader::loadMatrixDynamic2<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int, int)72
Eigen::Matrix<double, -1, -1, 0, -1, -1> mrs_lib::ParamLoader::loadMatrixDynamic2<double, Eigen::CwiseBinaryOp<Eigen::internal::scalar_product_op<double, double>, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> const> const, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> > const> >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::MatrixBase<Eigen::CwiseBinaryOp<Eigen::internal::scalar_product_op<double, double>, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> const> const, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> > const> > const&, int, int)1
mrs_lib::ParamLoader::loadedSuccessfully()3983
mrs_lib::ParamLoader::addYamlFileFromParam(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)2451
mrs_lib::ParamLoader::printValue_recursive(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, XmlRpc::XmlRpcValue&, unsigned int)5
mrs_lib::ParamLoader::check_duplicit_loading(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)78292
mrs_lib::ParamLoader::resetLoadedSuccessfully()3
std::vector<Eigen::Matrix<double, -1, -1, 0, -1, -1>, std::allocator<Eigen::Matrix<double, -1, -1, 0, -1, -1> > > mrs_lib::ParamLoader::loadMatrixArray_internal<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<Eigen::Matrix<double, -1, -1, 0, -1, -1>, std::allocator<Eigen::Matrix<double, -1, -1, 0, -1, -1> > > const&, mrs_lib::ParamLoader::optional_t, mrs_lib::ParamLoader::unique_t)5
std::pair<Eigen::Matrix<double, -1, -1, 0, -1, -1>, bool> mrs_lib::ParamLoader::loadMatrixKnown_internal<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, int, int, mrs_lib::ParamLoader::optional_t, mrs_lib::ParamLoader::unique_t)364
std::pair<Eigen::Matrix<float, -1, -1, 0, -1, -1>, bool> mrs_lib::ParamLoader::loadMatrixKnown_internal<float>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<float, -1, -1, 0, -1, -1> const&, int, int, mrs_lib::ParamLoader::optional_t, mrs_lib::ParamLoader::unique_t)4
std::pair<Eigen::Matrix<double, 0, 0, ((Eigen::StorageOptions)0)|((((0)==(1))&&((0)!=(1)))?((Eigen::StorageOptions)1) : ((((0)==(1))&&((0)!=(1)))?((Eigen::StorageOptions)0) : ((Eigen::StorageOptions)0))), 0, 0>, bool> mrs_lib::ParamLoader::loadMatrixStatic_internal<0, 0, double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<double, 0, 0, ((Eigen::StorageOptions)0)|((((0)==(1))&&((0)!=(1)))?((Eigen::StorageOptions)1) : ((((0)==(1))&&((0)!=(1)))?((Eigen::StorageOptions)0) : ((Eigen::StorageOptions)0))), 0, 0> const&, mrs_lib::ParamLoader::optional_t, mrs_lib::ParamLoader::unique_t)1
std::pair<Eigen::Matrix<double, 3, 3, ((Eigen::StorageOptions)0)|((((3)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)1) : ((((3)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)0) : ((Eigen::StorageOptions)0))), 3, 3>, bool> mrs_lib::ParamLoader::loadMatrixStatic_internal<3, 3, double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<double, 3, 3, ((Eigen::StorageOptions)0)|((((3)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)1) : ((((3)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)0) : ((Eigen::StorageOptions)0))), 3, 3> const&, mrs_lib::ParamLoader::optional_t, mrs_lib::ParamLoader::unique_t)91
std::pair<Eigen::Matrix<float, 3, 3, ((Eigen::StorageOptions)0)|((((3)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)1) : ((((3)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)0) : ((Eigen::StorageOptions)0))), 3, 3>, bool> mrs_lib::ParamLoader::loadMatrixStatic_internal<3, 3, float>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<float, 3, 3, ((Eigen::StorageOptions)0)|((((3)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)1) : ((((3)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)0) : ((Eigen::StorageOptions)0))), 3, 3> const&, mrs_lib::ParamLoader::optional_t, mrs_lib::ParamLoader::unique_t)6
std::pair<Eigen::Matrix<double, -1, -1, 0, -1, -1>, bool> mrs_lib::ParamLoader::loadMatrixDynamic_internal<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, int, int, mrs_lib::ParamLoader::optional_t, mrs_lib::ParamLoader::unique_t)167
std::pair<XmlRpc::XmlRpcValue, bool> mrs_lib::ParamLoader::load<XmlRpc::XmlRpcValue>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, XmlRpc::XmlRpcValue const&, mrs_lib::ParamLoader::optional_t, mrs_lib::ParamLoader::unique_t)6
std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool> mrs_lib::ParamLoader::load<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, mrs_lib::ParamLoader::optional_t, mrs_lib::ParamLoader::unique_t)15438
std::pair<std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, bool> mrs_lib::ParamLoader::load<std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, mrs_lib::ParamLoader::optional_t, mrs_lib::ParamLoader::unique_t)3198
std::pair<std::vector<double, std::allocator<double> >, bool> mrs_lib::ParamLoader::load<std::vector<double, std::allocator<double> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<double, std::allocator<double> > const&, mrs_lib::ParamLoader::optional_t, mrs_lib::ParamLoader::unique_t)1001
std::pair<bool, bool> mrs_lib::ParamLoader::load<bool>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&, mrs_lib::ParamLoader::optional_t, mrs_lib::ParamLoader::unique_t)16101
std::pair<double, bool> mrs_lib::ParamLoader::load<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, double const&, mrs_lib::ParamLoader::optional_t, mrs_lib::ParamLoader::unique_t)37299
std::pair<int, bool> mrs_lib::ParamLoader::load<int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int const&, mrs_lib::ParamLoader::optional_t, mrs_lib::ParamLoader::unique_t)4608
mrs_lib::ParamLoader::resolved(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)5
mrs_lib::ParamLoader::loadParam(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, XmlRpc::XmlRpcValue&)3
mrs_lib::ParamLoader::loadParam(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, XmlRpc::XmlRpcValue&, XmlRpc::XmlRpcValue const&)2
bool mrs_lib::ParamLoader::loadParam<XmlRpc::XmlRpcValue>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, XmlRpc::XmlRpcValue&)3
bool mrs_lib::ParamLoader::loadParam<XmlRpc::XmlRpcValue>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, XmlRpc::XmlRpcValue&, XmlRpc::XmlRpcValue const&)2
bool mrs_lib::ParamLoader::loadParam<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&)14943
bool mrs_lib::ParamLoader::loadParam<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)39
bool mrs_lib::ParamLoader::loadParam<std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&)3198
bool mrs_lib::ParamLoader::loadParam<std::vector<double, std::allocator<double> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<double, std::allocator<double> >&)1001
bool mrs_lib::ParamLoader::loadParam<bool>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool&)10714
bool mrs_lib::ParamLoader::loadParam<bool>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool&, bool const&)5387
bool mrs_lib::ParamLoader::loadParam<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, double&)36571
bool mrs_lib::ParamLoader::loadParam<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, double&, double const&)728
bool mrs_lib::ParamLoader::loadParam<int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int&)4608
mrs_lib::ParamLoader::setPrefix(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1816
mrs_lib::ParamLoader::ParamLoader(ros::NodeHandle const&, std::basic_string_view<char, std::char_traits<char> >)1541
mrs_lib::ParamLoader::ParamLoader(ros::NodeHandle const&, bool, std::basic_string_view<char, std::char_traits<char> >)3551
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/param_loader.h.gcov.frameset.html b/mrs_lib/include/mrs_lib/param_loader.h.gcov.frameset.html new file mode 100644 index 0000000000..2d925674cf --- /dev/null +++ b/mrs_lib/include/mrs_lib/param_loader.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/param_loader.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/include/mrs_lib/param_loader.h.gcov.html b/mrs_lib/include/mrs_lib/param_loader.h.gcov.html new file mode 100644 index 0000000000..90d6dfe25e --- /dev/null +++ b/mrs_lib/include/mrs_lib/param_loader.h.gcov.html @@ -0,0 +1,1452 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/param_loader.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - param_loader.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:27130090.3 %
Date:2024-04-18 23:11:36Functions:7878100.0 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : // clang: MatousFormat
+       2             : /**  \file
+       3             :      \brief Defines ParamLoader - a convenience class for loading static ROS parameters.
+       4             :      \author Matouš Vrba - vrbamato@fel.cvut.cz
+       5             :  */
+       6             : 
+       7             : #ifndef PARAM_LOADER_H
+       8             : #define PARAM_LOADER_H
+       9             : 
+      10             : #include <ros/ros.h>
+      11             : #include <string>
+      12             : #include <map>
+      13             : #include <unordered_set>
+      14             : #include <iostream>
+      15             : #include <Eigen/Dense>
+      16             : #include <std_msgs/ColorRGBA.h>
+      17             : #include <mrs_lib/param_provider.h>
+      18             : 
+      19             : namespace mrs_lib
+      20             : {
+      21             : 
+      22             : /*** ParamLoader CLASS //{ **/
+      23             : 
+      24             : /**
+      25             : * \brief Convenience class for loading parameters from rosparam server.
+      26             : *
+      27             : * The parameters can be loaded as compulsory. If a compulsory parameter is not found
+      28             : * on the rosparam server (e.g. because it is missing in the launchfile or the yaml config file),
+      29             : * an internal flag is set to false, indicating that the parameter loading procedure failed.
+      30             : * This flag can be checked using the loaded_successfully() method after all parameters were
+      31             : * attempted to be loaded (see usage example usage below).
+      32             : *
+      33             : * The loaded parameter names and corresponding values are printed to stdout by default
+      34             : * for user convenience. Special cases such as loading of Eigen matrices or loading
+      35             : * of std::vectors of various values are also provided.
+      36             : *
+      37             : * To load parameters into the `rosparam` server, use a launchfile prefferably.
+      38             : * See documentation of ROS launchfiles here: http://wiki.ros.org/roslaunch/XML.
+      39             : * Specifically, the `param` XML tag is used for loading parameters directly from the launchfile: http://wiki.ros.org/roslaunch/XML/param,
+      40             : * and the `rosparam` XML tag tag is used for loading parameters from a `yaml` file: http://wiki.ros.org/roslaunch/XML/rosparam.
+      41             : *
+      42             : */
+      43             : class ParamLoader
+      44             : {
+      45             : 
+      46             : private:
+      47             :   enum unique_t
+      48             :   {
+      49             :     UNIQUE = true,
+      50             :     REUSABLE = false
+      51             :   };
+      52             :   enum optional_t
+      53             :   {
+      54             :     OPTIONAL = true,
+      55             :     COMPULSORY = false
+      56             :   };
+      57             :   enum swap_t
+      58             :   {
+      59             :     SWAP = true,
+      60             :     NO_SWAP = false
+      61             :   };
+      62             : 
+      63             :   template <typename T>
+      64             :   using MatrixX = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>;
+      65             : 
+      66             : private:
+      67             :   bool m_load_successful, m_print_values;
+      68             :   std::string m_node_name;
+      69             :   std::string m_prefix;
+      70             :   const ros::NodeHandle& m_nh;
+      71             :   mrs_lib::ParamProvider m_pp;
+      72             :   std::unordered_set<std::string> m_loaded_params;
+      73             : 
+      74             :   /* printing helper functions //{ */
+      75             :   /* printError and print_warning functions //{*/
+      76           7 :   void printError(const std::string& str)
+      77             :   {
+      78           7 :     if (m_node_name.empty())
+      79           7 :       ROS_ERROR_STREAM(str);
+      80             :     else
+      81           0 :       ROS_ERROR_STREAM("[" << m_node_name << "]: " << str);
+      82           7 :   }
+      83           1 :   void print_warning(const std::string& str)
+      84             :   {
+      85           1 :     if (m_node_name.empty())
+      86           1 :       ROS_WARN_STREAM(str);
+      87             :     else
+      88           0 :       ROS_WARN_STREAM("[" << m_node_name << "]: " << str);
+      89           1 :   }
+      90             :   //}
+      91             : 
+      92             :   /* printValue function and overloads //{ */
+      93             : 
+      94             :   template <typename T>
+      95       73446 :   void printValue(const std::string& name, const T& value)
+      96             :   {
+      97       73446 :     if (m_node_name.empty())
+      98       40984 :       std::cout << "\t" << name << ":\t" << value << std::endl;
+      99             :     else
+     100       32461 :       ROS_INFO_STREAM("[" << m_node_name << "]: parameter '" << name << "':\t" << value);
+     101       73446 :   }
+     102             : 
+     103             :   template <typename T>
+     104        4198 :   void printValue(const std::string& name, const std::vector<T>& value)
+     105             :   {
+     106        8396 :     std::stringstream strstr;
+     107        4198 :     if (m_node_name.empty())
+     108        2034 :       strstr << "\t";
+     109        4198 :     strstr << name << ":\t";
+     110        4198 :     size_t it = 0;
+     111       14672 :     for (const auto& elem : value)
+     112             :     {
+     113       10474 :       strstr << elem;
+     114       10474 :       if (it < value.size() - 1)
+     115        6742 :         strstr << ", ";
+     116       10474 :       it++;
+     117             :     }
+     118        4198 :     if (m_node_name.empty())
+     119        2034 :       std::cout << strstr.str() << std::endl;
+     120             :     else
+     121        2164 :       ROS_INFO_STREAM("[" << m_node_name << "]: parameter '" << strstr.str());
+     122        4198 :   }
+     123             : 
+     124             :   template <typename T1, typename T2>
+     125             :   void printValue(const std::string& name, const std::map<T1, T2>& value)
+     126             :   {
+     127             :     std::stringstream strstr;
+     128             :     if (m_node_name.empty())
+     129             :       strstr << "\t";
+     130             :     strstr << name << ":" << std::endl;
+     131             :     size_t it = 0;
+     132             :     for (const auto& pair : value)
+     133             :     {
+     134             :       strstr << pair.first << " = " << pair.second;
+     135             :       if (it < value.size() - 1)
+     136             :         strstr << std::endl;
+     137             :       it++;
+     138             :     }
+     139             :     if (m_node_name.empty())
+     140             :       std::cout << strstr.str() << std::endl;
+     141             :     else
+     142             :       ROS_INFO_STREAM("[" << m_node_name << "]: parameter '" << strstr.str());
+     143             :   }
+     144             : 
+     145             :   template <typename T>
+     146         640 :   void printValue(const std::string& name, const MatrixX<T>& value)
+     147             :   {
+     148        1280 :     std::stringstream strstr;
+     149             :     /* const Eigen::IOFormat fmt(4, 0, ", ", "\n", "\t\t[", "]"); */
+     150             :     /* strstr << value.format(fmt); */
+     151        1920 :     const Eigen::IOFormat fmt;
+     152         640 :     strstr << value.format(fmt);
+     153         640 :     if (m_node_name.empty())
+     154          94 :       std::cout << "\t" << name << ":\t" << std::endl << strstr.str() << std::endl;
+     155             :     else
+     156         546 :       ROS_INFO_STREAM("[" << m_node_name << "]: parameter '" << name << "':" << std::endl << strstr.str());
+     157         640 :   }
+     158             : 
+     159           5 :   std::string printValue_recursive(const std::string& name, XmlRpc::XmlRpcValue& value, unsigned depth = 0)
+     160             :   {
+     161          10 :     std::stringstream strstr;
+     162           8 :     for (unsigned it = 0; it < depth; it++)
+     163           3 :       strstr << "\t";
+     164           5 :     strstr << name << ":";
+     165           5 :     switch (value.getType())
+     166             :     {
+     167           1 :       case XmlRpc::XmlRpcValue::TypeArray:
+     168             :         {
+     169           2 :           for (int it = 0; it < value.size(); it++)
+     170             :           {
+     171           1 :             strstr << std::endl;
+     172           2 :             const std::string name = "[" + std::to_string(it) + "]";
+     173           1 :             strstr << printValue_recursive(name, value[it], depth+1);
+     174             :           }
+     175           1 :           break;
+     176             :         }
+     177           1 :       case XmlRpc::XmlRpcValue::TypeStruct:
+     178             :         {
+     179           1 :           int it = 0;
+     180           2 :           for (auto& pair : value)
+     181             :           {
+     182           1 :             strstr << std::endl;
+     183           1 :             strstr << printValue_recursive(pair.first, pair.second, depth+1);
+     184           1 :             it++;
+     185             :           }
+     186           1 :           break;
+     187             :         }
+     188           3 :       default:
+     189             :         {
+     190           3 :           strstr << "\t" << value;
+     191           3 :           break;
+     192             :         }
+     193             :     }
+     194          10 :     return strstr.str();
+     195             :   }
+     196             : 
+     197           3 :   void printValue(const std::string& name, XmlRpc::XmlRpcValue& value)
+     198             :   {
+     199           6 :     const std::string txt = printValue_recursive(name, value);
+     200           3 :     if (m_node_name.empty())
+     201           3 :       std::cout << txt << std::endl;
+     202             :     else
+     203           0 :       ROS_INFO_STREAM("[" << m_node_name << "]: parameter '" << txt);
+     204           3 :   }
+     205             : 
+     206             :   //}
+     207             :   
+     208           5 :   std::string resolved(const std::string& param_name)
+     209             :   {
+     210           5 :     return m_nh.resolveName(param_name);
+     211             :   }
+     212             :   //}
+     213             : 
+     214             :   /* check_duplicit_loading checks whether the parameter was already loaded - returns true if yes //{ */
+     215       78292 :   bool check_duplicit_loading(const std::string& name)
+     216             :   {
+     217       78292 :     if (m_loaded_params.count(name))
+     218             :     {
+     219           2 :       printError(std::string("Tried to load parameter ") + name + std::string(" twice"));
+     220           2 :       m_load_successful = false;
+     221           2 :       return true;
+     222             :     } else
+     223             :     {
+     224       78290 :       return false;
+     225             :     }
+     226             :   }
+     227             :   //}
+     228             : 
+     229             :   /* helper functions for loading dynamic Eigen matrices //{ */
+     230             :   // loadMatrixX helper function for loading dynamic Eigen matrices //{
+     231             :   template <typename T>
+     232         638 :   std::pair<MatrixX<T>, bool> loadMatrixX(const std::string& name, const MatrixX<T>& default_value, int rows, int cols = Eigen::Dynamic, optional_t optional = OPTIONAL, unique_t unique = UNIQUE, swap_t swap = NO_SWAP, bool printValues = true)
+     233             :   {
+     234        1276 :     const std::string name_prefixed = m_prefix + name;
+     235        1276 :     MatrixX<T> loaded = default_value;
+     236         638 :     bool used_rosparam_value = false;
+     237             :     // first, check if the user already tried to load this parameter
+     238         638 :     if (unique && check_duplicit_loading(name_prefixed))
+     239           0 :       return {loaded, used_rosparam_value};
+     240             : 
+     241             :     // this function only accepts dynamic columns (you can always transpose the matrix afterward)
+     242         638 :     if (rows < 0)
+     243             :     {
+     244             :       // if the parameter was compulsory, alert the user and set the flag
+     245           0 :       printError(std::string("Invalid expected matrix dimensions for parameter ") + resolved(name_prefixed));
+     246           0 :       m_load_successful = false;
+     247           0 :       return {loaded, used_rosparam_value};
+     248             :     }
+     249         638 :     const bool expect_zero_matrix = rows == 0;
+     250         638 :     if (expect_zero_matrix)
+     251             :     {
+     252           1 :       if (cols > 0)
+     253             :       {
+     254           0 :         printError(std::string("Invalid expected matrix dimensions for parameter ") + resolved(name_prefixed) + ". One dimension indicates zero matrix, but other expects non-zero.");
+     255           0 :         m_load_successful = false;
+     256           0 :         return {loaded, used_rosparam_value};
+     257             :       }
+     258             :     }
+     259             : 
+     260         638 :     bool cur_load_successful = true;
+     261         638 :     bool check_size_exact = true;
+     262         638 :     if (cols <= 0)  // this means that the cols dimension is dynamic or a zero matrix is expected
+     263         165 :       check_size_exact = false;
+     264             : 
+     265        1276 :     std::vector<T> tmp_vec;
+     266             :     // try to load the parameter
+     267         638 :     const bool success = m_pp.getParam(name_prefixed, tmp_vec);
+     268             :     // check if the loaded vector has correct length
+     269         638 :     bool correct_size = (int)tmp_vec.size() == rows * cols;
+     270         638 :     if (!check_size_exact && !expect_zero_matrix)
+     271         164 :       correct_size = (int)tmp_vec.size() % rows == 0;  // if the cols dimension is dynamic, the size just has to be divisable by rows
+     272             : 
+     273         638 :     if (success && correct_size)
+     274             :     {
+     275             :       // if successfully loaded, everything is in order
+     276             :       // transform the vector to the matrix
+     277         538 :       if (cols <= 0 && rows > 0)
+     278         164 :         cols = tmp_vec.size() / rows;
+     279         538 :       if (swap)
+     280          72 :         std::swap(rows, cols);
+     281         538 :       loaded = Eigen::Map<Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>, Eigen::Unaligned>(tmp_vec.data(), rows, cols);
+     282         538 :       used_rosparam_value = true;
+     283             :     } else
+     284             :     {
+     285         100 :       if (success && !correct_size)
+     286             :       {
+     287             :         // warn the user that this parameter was not successfully loaded because of wrong vector length (might be an oversight)
+     288           3 :         std::string warning =
+     289             :             std::string("Matrix parameter ") + name_prefixed
+     290             :             + std::string(" could not be loaded because the vector has a wrong length " + std::to_string(tmp_vec.size()) + " instead of expected ");
+     291             :         // process the message correctly based on whether the loaded matrix should be dynamic or static
+     292           1 :         if (cols <= 0)  // for dynamic matrices
+     293           0 :           warning = warning + std::string("number divisible by ") + std::to_string(rows);
+     294             :         else  // for static matrices
+     295           1 :           warning = warning + std::to_string(rows * cols);
+     296           1 :         print_warning(warning);
+     297             :       }
+     298             :       // if it was not loaded, the default value is used (set at the beginning of the function)
+     299         100 :       if (!optional)
+     300             :       {
+     301             :         // if the parameter was compulsory, alert the user and set the flag
+     302           3 :         printError(std::string("Could not load non-optional parameter ") + resolved(name_prefixed));
+     303           3 :         cur_load_successful = false;
+     304             :       }
+     305             :     }
+     306             : 
+     307             :     // check if load was a success
+     308         638 :     if (cur_load_successful)
+     309             :     {
+     310         635 :       if (m_print_values && printValues)
+     311         630 :         printValue(name_prefixed, loaded);
+     312         635 :       m_loaded_params.insert(name_prefixed);
+     313             :     } else
+     314             :     {
+     315           3 :       m_load_successful = false;
+     316             :     }
+     317             :     // finally, return the resulting value
+     318         638 :     return {loaded, used_rosparam_value};
+     319             :   }
+     320             :   //}
+     321             : 
+     322             :   /* loadMatrixStatic_internal helper function for loading static Eigen matrices //{ */
+     323             :   template <int rows, int cols, typename T>
+     324          98 :   std::pair<Eigen::Matrix<T, rows, cols>, bool> loadMatrixStatic_internal(const std::string& name, const Eigen::Matrix<T, rows, cols>& default_value, optional_t optional, unique_t unique)
+     325             :   {
+     326         294 :     const auto [dynamic, loaded_ok] = loadMatrixX(name, MatrixX<T>(default_value), rows, cols, optional, unique, NO_SWAP);
+     327         196 :     return {dynamic, loaded_ok};
+     328             :   }
+     329             :   //}
+     330             : 
+     331             :   /* loadMatrixKnown_internal helper function for loading EigenXd matrices with known dimensions //{ */
+     332             :   template <typename T>
+     333         368 :   std::pair<MatrixX<T>, bool> loadMatrixKnown_internal(const std::string& name, const MatrixX<T>& default_value, int rows, int cols, optional_t optional, unique_t unique)
+     334             :   {
+     335         736 :     MatrixX<T> loaded = default_value;
+     336             :     // first, check that at least one dimension is set
+     337         368 :     if (rows <= 0 || cols <= 0)
+     338             :     {
+     339           0 :       printError(std::string("Invalid expected matrix dimensions for parameter ") + resolved(name) + std::string(" (use loadMatrixDynamic?)"));
+     340           0 :       m_load_successful = false;
+     341           0 :       return {loaded, false};
+     342             :     }
+     343             : 
+     344         368 :     return loadMatrixX(name, default_value, rows, cols, optional, unique, NO_SWAP);
+     345             :   }
+     346             :   //}
+     347             : 
+     348             :   /* loadMatrixDynamic_internal helper function for loading Eigen matrices with one dynamic (unspecified) dimension //{ */
+     349             :   template <typename T>
+     350         167 :   std::pair<MatrixX<T>, bool> loadMatrixDynamic_internal(const std::string& name, const MatrixX<T>& default_value, int rows, int cols, optional_t optional, unique_t unique)
+     351             :   {
+     352         334 :     MatrixX<T> loaded = default_value;
+     353             : 
+     354             :     // next, check that at least one dimension is set
+     355         167 :     if (rows <= 0 && cols <= 0)
+     356             :     {
+     357           0 :       printError(std::string("Invalid expected matrix dimensions for parameter ") + resolved(name) + std::string(" (at least one dimension must be specified)"));
+     358           0 :       m_load_successful = false;
+     359           0 :       return {loaded, false};
+     360             :     }
+     361             : 
+     362         167 :     swap_t swap = NO_SWAP;
+     363         167 :     if (rows <= 0)
+     364             :     {
+     365          72 :       std::swap(rows, cols);
+     366          72 :       swap = SWAP;
+     367             :     }
+     368         167 :     return loadMatrixX(name, default_value, rows, cols, optional, unique, swap);
+     369             :   }
+     370             :   //}
+     371             :   //}
+     372             : 
+     373             :   /* loadMatrixArray_internal helper function for loading an array of EigenXd matrices with known dimensions //{ */
+     374             :   template <typename T>
+     375           5 :   std::vector<MatrixX<T>> loadMatrixArray_internal(const std::string& name, const std::vector<MatrixX<T>>& default_value, optional_t optional, unique_t unique)
+     376             :   {
+     377          10 :     const std::string name_prefixed = m_prefix + name;
+     378             :     int rows;
+     379          10 :     std::vector<int> cols;
+     380           5 :     bool success = true;
+     381           5 :     success = success && m_pp.getParam(name_prefixed + "/rows", rows);
+     382           5 :     success = success && m_pp.getParam(name_prefixed + "/cols", cols);
+     383             : 
+     384          10 :     std::vector<MatrixX<T>> loaded;
+     385           5 :     loaded.reserve(cols.size());
+     386             : 
+     387           5 :     int total_cols = 0;
+     388             :     /* check correctness of loaded parameters so far calculate the total dimension //{ */
+     389             : 
+     390           5 :     if (!success)
+     391             :     {
+     392           0 :       printError(std::string("Failed to load ") + resolved(name_prefixed) + std::string("/rows or ") + resolved(name_prefixed) + std::string("/cols"));
+     393           0 :       m_load_successful = false;
+     394           0 :       return default_value;
+     395             :     }
+     396           5 :     if (rows < 0)
+     397             :     {
+     398           0 :       printError(std::string("Invalid expected matrix dimensions for parameter ") + resolved(name_prefixed) + std::string(" (rows and cols must be >= 0)"));
+     399           0 :       m_load_successful = false;
+     400           0 :       return default_value;
+     401             :     }
+     402          15 :     for (const auto& col : cols)
+     403             :     {
+     404          10 :       if (col < 0)
+     405             :       {
+     406           0 :         printError(std::string("Invalid expected matrix dimensions for parameter ") + resolved(name_prefixed) + std::string(" (rows and cols must be >= 0)"));
+     407           0 :         m_load_successful = false;
+     408           0 :         return default_value;
+     409             :       }
+     410          10 :       total_cols += col;
+     411             :     }
+     412             :     
+     413             :     //}
+     414             : 
+     415          15 :     const auto [loaded_matrix, loaded_ok] = loadMatrixX(name + "/data", MatrixX<T>(), rows, total_cols, optional, unique, NO_SWAP, false);
+     416             :     /* std::cout << "loaded_matrix: " << loaded_matrix << std::endl; */
+     417             :     /* std::cout << "loaded_matrix: " << loaded_matrix.rows() << "x" << loaded_matrix.cols() << std::endl; */
+     418             :     /* std::cout << "expected dims: " << rows << "x" << total_cols << std::endl; */
+     419           5 :     if (loaded_matrix.rows() != rows || loaded_matrix.cols() != total_cols)
+     420             :     {
+     421           0 :       m_load_successful = false;
+     422           0 :       return default_value;
+     423             :     }
+     424             : 
+     425           5 :     int cols_loaded = 0;
+     426          15 :     for (unsigned it = 0; it < cols.size(); it++)
+     427             :     {
+     428          10 :       const int cur_cols = cols.at(it);
+     429          10 :       const MatrixX<T> cur_mat = loaded_matrix.block(0, cols_loaded, rows, cur_cols);
+     430             :       /* std::cout << "cur_mat: " << cur_mat << std::endl; */
+     431          10 :       loaded.push_back(cur_mat);
+     432          10 :       cols_loaded += cur_cols;
+     433          10 :       printValue(name_prefixed + "/matrix#" + std::to_string(it), cur_mat);
+     434             :     }
+     435           5 :     return loaded;
+     436             :   }
+     437             :   //}
+     438             : 
+     439             :   /* load helper function for generic types //{ */
+     440             :   // This function tries to load a parameter with name 'name' and a default value.
+     441             :   // You can use the flag 'optional' to not throw a ROS_ERROR when the parameter
+     442             :   // cannot be loaded and the flag 'printValues' to set whether the loaded
+     443             :   // value and name of the parameter should be printed to cout.
+     444             :   // If 'optional' is set to false and the parameter could not be loaded,
+     445             :   // the flag 'load_successful' is set to false and a ROS_ERROR message
+     446             :   // is printer.
+     447             :   // If 'unique' flag is set to false then the parameter is not checked
+     448             :   // for being loaded twice.
+     449             :   // Returns a tuple, containing either the loaded or the default value and a bool,
+     450             :   // indicating if the value was loaded (true) or the default value was used (false).
+     451             :   template <typename T>
+     452       77651 :   std::pair<T, bool> load(const std::string& name, const T& default_value, optional_t optional = OPTIONAL, unique_t unique = UNIQUE)
+     453             :   {
+     454      155302 :     const std::string name_prefixed = m_prefix + name;
+     455       97294 :     T loaded = default_value;
+     456       77651 :     if (unique && check_duplicit_loading(name_prefixed))
+     457           2 :       return {loaded, false};
+     458             : 
+     459       77649 :     bool cur_load_successful = true;
+     460             :     // try to load the parameter
+     461       77649 :     const bool success = m_pp.getParam(name_prefixed, loaded);
+     462       77649 :     if (!success)
+     463             :     {
+     464             :       // if it was not loaded, set the default value
+     465        1395 :       loaded = default_value;
+     466        1395 :       if (!optional)
+     467             :       {
+     468             :         // if the parameter was compulsory, alert the user and set the flag
+     469           2 :         printError(std::string("Could not load non-optional parameter ") + resolved(name_prefixed));
+     470           2 :         cur_load_successful = false;
+     471             :       }
+     472             :     }
+     473             : 
+     474       77649 :     if (cur_load_successful)
+     475             :     {
+     476             :       // everything is fine and just print the name_prefixed and value if required
+     477       77647 :       if (m_print_values)
+     478       77647 :         printValue(name_prefixed, loaded);
+     479             :       // mark the param name_prefixed as successfully loaded
+     480       77647 :       m_loaded_params.insert(name_prefixed);
+     481             :     } else
+     482             :     {
+     483           2 :       m_load_successful = false;
+     484             :     }
+     485             :     // finally, return the resulting value
+     486       77649 :     return {loaded, success};
+     487             :   }
+     488             :   //}
+     489             : 
+     490             : public:
+     491             :   /*!
+     492             :     * \brief Main constructor.
+     493             :     *
+     494             :     * \param nh            The parameters will be loaded from rosparam using this node handle.
+     495             :     * \param printValues  If true, the loaded values will be printed to stdout using std::cout or ROS_INFO if node_name is not empty.
+     496             :     * \param node_name     Optional node name used when printing the loaded values or loading errors.
+     497             :     */
+     498        3551 :   ParamLoader(const ros::NodeHandle& nh, bool printValues = true, std::string_view node_name = std::string())
+     499        3551 :       : m_load_successful(true),
+     500             :         m_print_values(printValues),
+     501             :         m_node_name(node_name),
+     502             :         m_nh(nh),
+     503        3551 :         m_pp(nh, m_node_name)
+     504             :   {
+     505             :     /* std::cout << "Initialized1 ParamLoader for node " << node_name << std::endl; */
+     506        3551 :   }
+     507             : 
+     508             :   /* Constructor overloads //{ */
+     509             :   /*!
+     510             :     * \brief Convenience overload to enable writing ParamLoader pl(nh, node_name);
+     511             :     *
+     512             :     * \param nh            The parameters will be loaded from rosparam using this node handle.
+     513             :     * \param node_name     Optional node name used when printing the loaded values or loading errors.
+     514             :     */
+     515        1541 :   ParamLoader(const ros::NodeHandle& nh, std::string_view node_name)
+     516        1541 :       : ParamLoader(nh, true, node_name)
+     517             :   {
+     518             :     /* std::cout << "Initialized2 ParamLoader for node " << node_name << std::endl; */
+     519        1541 :   }
+     520             : 
+     521             :   /*!
+     522             :     * \brief Convenience overload to enable writing ParamLoader pl(nh, "node_name");
+     523             :     *
+     524             :     * \param nh            The parameters will be loaded from rosparam using this node handle.
+     525             :     * \param node_name     Optional node name used when printing the loaded values or loading errors.
+     526             :     */
+     527             :   ParamLoader(const std::string& filepath, const ros::NodeHandle& nh)
+     528             :     : ParamLoader(nh, "none")
+     529             :   {
+     530             :     YAML::Node node = YAML::Load(filepath);
+     531             :   }
+     532             :   //}
+     533             : 
+     534             :   /* setPrefix function //{ */
+     535             :   
+     536             :   /*!
+     537             :     * \brief All loaded parameters will be prefixed with this string.
+     538             :     *
+     539             :     * \param prefix  the prefix to be applied to all loaded parameters from now on.
+     540             :     */
+     541        1816 :   void setPrefix(const std::string& prefix)
+     542             :   {
+     543        1816 :     m_prefix = prefix;
+     544        1816 :   }
+     545             :   
+     546             :   //}
+     547             : 
+     548             :   /* getPrefix function //{ */
+     549             :   
+     550             :   /*!
+     551             :     * \brief Returns the current parameter name prefix.
+     552             :     *
+     553             :     * \return the current prefix to be applied to the loaded parameters.
+     554             :     */
+     555             :   std::string getPrefix()
+     556             :   {
+     557             :     return m_prefix;
+     558             :   }
+     559             :   
+     560             :   //}
+     561             : 
+     562             :   /* addYamlFile() function //{ */
+     563             :   
+     564             :   /*!
+     565             :     * \brief Adds the specified file as a source of static parameters.
+     566             :     *
+     567             :     * \param filepath The full path to the yaml file to be loaded.
+     568             :     * \return true if loading and parsing the file was successful, false otherwise.
+     569             :     */
+     570       10107 :   bool addYamlFile(const std::string& filepath)
+     571             :   {
+     572       10107 :     return m_pp.addYamlFile(filepath);
+     573             :   }
+     574             :   //}
+     575             : 
+     576             :   /* addYamlFileFromParam() function //{ */
+     577             :   
+     578             :   /*!
+     579             :     * \brief Loads a filepath from a parameter loads that file as a YAML.
+     580             :     *
+     581             :     * \param param_name Name of the parameter from which to load the YAML filename to be loaded.
+     582             :     * \return true      if loading and parsing the file was successful, false otherwise.
+     583             :     */
+     584        2451 :   bool addYamlFileFromParam(const std::string& param_name)
+     585             :   {
+     586        4902 :     std::string filepath;
+     587        2451 :     if (!loadParam(param_name, filepath))
+     588           0 :       return false;
+     589        2451 :     return m_pp.addYamlFile(filepath);
+     590             :   }
+     591             :   //}
+     592             : 
+     593             :   /* loadedSuccessfully function //{ */
+     594             :   /*!
+     595             :     * \brief Indicates whether all compulsory parameters were successfully loaded.
+     596             :     *
+     597             :     * \return false if any compulsory parameter was not loaded (is not present at rosparam server). Otherwise returns true.
+     598             :     */
+     599        3983 :   bool loadedSuccessfully()
+     600             :   {
+     601        3983 :     return m_load_successful;
+     602             :   }
+     603             :   //}
+     604             : 
+     605             :   /* resetLoadedSuccessfully function //{ */
+     606             :   /*!
+     607             :     * \brief Resets the loadedSuccessfully flag back to true.
+     608             :     */
+     609           3 :   void resetLoadedSuccessfully()
+     610             :   {
+     611           3 :     m_load_successful = true;
+     612           3 :   }
+     613             :   //}
+     614             : 
+     615             :   /* resetUniques function //{ */
+     616             :   /*!
+     617             :     * \brief Resets the list of already loaded parameter names used when checking for uniqueness.
+     618             :     */
+     619          20 :   void resetUniques()
+     620             :   {
+     621          20 :     m_loaded_params.clear();
+     622          20 :   }
+     623             :   //}
+     624             : 
+     625             :   /* loadParam function for optional parameters //{ */
+     626             :   /*!
+     627             :     * \brief Loads a parameter from the rosparam server with a default value.
+     628             :     *
+     629             :     * If the parameter with the specified name is not found on the rosparam server (e.g. because it is not specified in the launchfile or yaml config file),
+     630             :     * the default value is used.
+     631             :     * Using this method, the parameter can only be loaded once using the same ParamLoader instance without error.
+     632             :     *
+     633             :     * \param name          Name of the parameter in the rosparam server.
+     634             :     * \param out_value     Reference to the variable to which the parameter value will be stored (such as a class member variable).
+     635             :     * \param default_value This value will be used if the parameter name is not found in the rosparam server.
+     636             :     * \return              true if the parameter was loaded from \p rosparam, false if the default value was used.
+     637             :     */
+     638             :   template <typename T>
+     639        6156 :   bool loadParam(const std::string& name, T& out_value, const T& default_value)
+     640             :   {
+     641        6156 :     const auto [ret, success] = load<T>(name, default_value, OPTIONAL, UNIQUE);
+     642        6156 :     out_value = ret;
+     643        6197 :     return success;
+     644             :   }
+     645             :   /*!
+     646             :     * \brief Loads a parameter from the rosparam server with a default value.
+     647             :     *
+     648             :     * If the parameter with the specified name is not found on the rosparam server (e.g. because it is not specified in the launchfile or yaml config file),
+     649             :     * the default value is used.
+     650             :     * Using this method, the parameter can only be loaded once using the same ParamLoader instance without error.
+     651             :     *
+     652             :     * \param name          Name of the parameter in the rosparam server.
+     653             :     * \param default_value This value will be used if the parameter name is not found in the rosparam server.
+     654             :     * \return              The loaded parameter value.
+     655             :     */
+     656             :   template <typename T>
+     657         456 :   T loadParam2(const std::string& name, const T& default_value)
+     658             :   {
+     659         912 :     const auto loaded = load<T>(name, default_value, OPTIONAL, UNIQUE);
+     660         912 :     return loaded.first;
+     661             :   }
+     662             :   /*!
+     663             :     * \brief Loads a parameter from the rosparam server with a default value.
+     664             :     *
+     665             :     * If the parameter with the specified name is not found on the rosparam server (e.g. because it is not specified in the launchfile or yaml config file),
+     666             :     * the default value is used.
+     667             :     * Using this method, the parameter can be loaded multiple times using the same ParamLoader instance without error.
+     668             :     *
+     669             :     * \param name          Name of the parameter in the rosparam server.
+     670             :     * \param out_value     Reference to the variable to which the parameter value will be stored (such as a class member variable).
+     671             :     * \param default_value This value will be used if the parameter name is not found in the rosparam server.
+     672             :     * \return              true if the parameter was loaded from \p rosparam, false if the default value was used.
+     673             :     */
+     674             :   template <typename T>
+     675             :   bool loadParamReusable(const std::string& name, T& out_value, const T& default_value)
+     676             :   {
+     677             :     const auto [ret, success] = load<T>(name, default_value, OPTIONAL, REUSABLE);
+     678             :     out_value = ret;
+     679             :     return success;
+     680             :   }
+     681             :   /*!
+     682             :     * \brief Loads an optional reusable parameter from the rosparam server.
+     683             :     *
+     684             :     * If the parameter with the specified name is not found on the rosparam server (e.g. because it is not specified in the launchfile or yaml config file),
+     685             :     * the default value is used.
+     686             :     * Using this method, the parameter can be loaded multiple times using the same ParamLoader instance without error.
+     687             :     *
+     688             :     * \param name          Name of the parameter in the rosparam server.
+     689             :     * \param default_value This value will be used if the parameter name is not found in the rosparam server.
+     690             :     * \return              The loaded parameter value.
+     691             :     */
+     692             :   template <typename T>
+     693             :   T loadParamReusable2(const std::string& name, const T& default_value)
+     694             :   {
+     695             :     const auto [ret, success] = load<T>(name, default_value, OPTIONAL, REUSABLE);
+     696             :     return ret;
+     697             :   }
+     698             :   //}
+     699             : 
+     700             :   /* loadParam function for compulsory parameters //{ */
+     701             :   /*!
+     702             :     * \brief Loads a compulsory parameter from the rosparam server.
+     703             :     *
+     704             :     * If the parameter with the specified name is not found on the rosparam server (e.g. because it is not specified in the launchfile or yaml config file),
+     705             :     * the loading process is unsuccessful (loaded_successfully() will return false).
+     706             :     * Using this method, the parameter can only be loaded once using the same ParamLoader instance without error.
+     707             :     *
+     708             :     * \param name          Name of the parameter in the rosparam server.
+     709             :     * \param out_value     Reference to the variable to which the parameter value will be stored (such as a class member variable).
+     710             :     * \return              true if the parameter was loaded from \p rosparam, false if the default value was used.
+     711             :     */
+     712             :   template <typename T>
+     713       71038 :   bool loadParam(const std::string& name, T& out_value)
+     714             :   {
+     715       90183 :     const auto [ret, success] = load<T>(name, T(), COMPULSORY, UNIQUE);
+     716       71038 :     out_value = ret;
+     717       90183 :     return success;
+     718             :   }
+     719             :   /*!
+     720             :     * \brief Loads a compulsory parameter from the rosparam server.
+     721             :     *
+     722             :     * If the parameter with the specified name is not found on the rosparam server (e.g. because it is not specified in the launchfile or yaml config file),
+     723             :     * the loading process is unsuccessful (loaded_successfully() will return false).
+     724             :     * Using this method, the parameter can only be loaded once using the same ParamLoader instance without error.
+     725             :     *
+     726             :     * \param name          Name of the parameter in the rosparam server.
+     727             :     * \return              The loaded parameter value.
+     728             :     */
+     729             :   template <typename T>
+     730             :   T loadParam2(const std::string& name)
+     731             :   {
+     732             :     const auto [ret, success] = load<T>(name, T(), COMPULSORY, UNIQUE);
+     733             :     return ret;
+     734             :   }
+     735             :   /*!
+     736             :     * \brief Loads a compulsory parameter from the rosparam server.
+     737             :     *
+     738             :     * If the parameter with the specified name is not found on the rosparam server (e.g. because it is not specified in the launchfile or yaml config file),
+     739             :     * the loading process is unsuccessful (loaded_successfully() will return false).
+     740             :     * Using this method, the parameter can be loaded multiple times using the same ParamLoader instance without error.
+     741             :     *
+     742             :     * \param name          Name of the parameter in the rosparam server.
+     743             :     * \param out_value     Reference to the variable to which the parameter value will be stored (such as a class member variable).
+     744             :     * \return              true if the parameter was loaded from \p rosparam, false if the default value was used.
+     745             :     */
+     746             :   template <typename T>
+     747           1 :   bool loadParamReusable(const std::string& name, T& out_value)
+     748             :   {
+     749           2 :     const auto [ret, success] = load<T>(name, T(), COMPULSORY, REUSABLE);
+     750           1 :     out_value = ret;
+     751           2 :     return success;
+     752             :   }
+     753             :   /*!
+     754             :     * \brief Loads a compulsory parameter from the rosparam server.
+     755             :     *
+     756             :     * If the parameter with the specified name is not found on the rosparam server (e.g. because it is not specified in the launchfile or yaml config file),
+     757             :     * the loading process is unsuccessful (loaded_successfully() will return false).
+     758             :     * Using this method, the parameter can be loaded multiple times using the same ParamLoader instance without error.
+     759             :     *
+     760             :     * \param name          Name of the parameter in the rosparam server.
+     761             :     * \return              The loaded parameter value.
+     762             :     */
+     763             :   template <typename T>
+     764             :   T loadParamReusable2(const std::string& name)
+     765             :   {
+     766             :     const auto [ret, success] = load<T>(name, T(), COMPULSORY, REUSABLE);
+     767             :     return ret;
+     768             :   }
+     769             :   //}
+     770             : 
+     771             :   /* loadParam specializations for ros::Duration type //{ */
+     772             : 
+     773             :   /*!
+     774             :     * \brief An overload for loading ros::Duration.
+     775             :     *
+     776             :     * The duration will be loaded as a \p double, representing a number of seconds, and then converted to ros::Duration.
+     777             :     *
+     778             :     * \param name          Name of the parameter in the rosparam server.
+     779             :     * \param out_value     Reference to the variable to which the parameter value will be stored (such as a class member variable).
+     780             :     * \param default_value This value will be used if the parameter name is not found in the rosparam server.
+     781             :     * \return              true if the parameter was loaded from \p rosparam, false if the default value was used.
+     782             :     */
+     783             :   bool loadParam(const std::string& name, ros::Duration& out, const ros::Duration& default_value)
+     784             :   {
+     785             :     double secs;
+     786             :     const bool ret = loadParam<double>(name, secs, default_value.toSec());
+     787             :     out = ros::Duration(secs);
+     788             :     return ret;
+     789             :   }
+     790             : 
+     791             :   /*!
+     792             :     * \brief An overload for loading ros::Duration.
+     793             :     *
+     794             :     * The duration will be loaded as a \p double, representing a number of seconds, and then converted to ros::Duration.
+     795             :     *
+     796             :     * \param name          Name of the parameter in the rosparam server.
+     797             :     * \param out_value     Reference to the variable to which the parameter value will be stored (such as a class member variable).
+     798             :     * \return              true if the parameter was loaded from \p rosparam, false if the default value was used.
+     799             :     */
+     800             :   bool loadParam(const std::string& name, ros::Duration& out)
+     801             :   {
+     802             :     double secs;
+     803             :     const bool ret = loadParam<double>(name, secs);
+     804             :     out = ros::Duration(secs);
+     805             :     return ret;
+     806             :   }
+     807             :   
+     808             :   //}
+     809             : 
+     810             :   /* loadParam specializations for std_msgs::ColorRGBA type //{ */
+     811             : 
+     812             :   /*!
+     813             :     * \brief An overload for loading std_msgs::ColorRGBA.
+     814             :     *
+     815             :     * The color will be loaded as several \p double -typed variables, representing the R, G, B and A color elements.
+     816             :     *
+     817             :     * \param name          Name of the parameter in the rosparam server.
+     818             :     * \param out_value     Reference to the variable to which the parameter value will be stored (such as a class member variable).
+     819             :     * \param default_value This value will be used if the parameter name is not found in the rosparam server.
+     820             :     * \return              true if the parameter was loaded from \p rosparam, false if the default value was used.
+     821             :     */
+     822             :   bool loadParam(const std::string& name, std_msgs::ColorRGBA& out, const std_msgs::ColorRGBA& default_value = {})
+     823             :   {
+     824             :     std_msgs::ColorRGBA res;
+     825             :     bool ret = true;
+     826             :     ret = ret & loadParam(name+"/r", res.r, default_value.r);
+     827             :     ret = ret & loadParam(name+"/g", res.g, default_value.g);
+     828             :     ret = ret & loadParam(name+"/b", res.b, default_value.b);
+     829             :     ret = ret & loadParam(name+"/a", res.a, default_value.a);
+     830             :     if (ret)
+     831             :       out = res;
+     832             :     return ret;
+     833             :   }
+     834             : 
+     835             :   /*!
+     836             :     * \brief An overload for loading std_msgs::ColorRGBA.
+     837             :     *
+     838             :     * The color will be loaded as several \p double -typed variables, representing the R, G, B and A color elements.
+     839             :     *
+     840             :     * \param name          Name of the parameter in the rosparam server.
+     841             :     * \param default_value This value will be used if the parameter name is not found in the rosparam server.
+     842             :     * \return              The loaded parameter value.
+     843             :     */
+     844             :   std_msgs::ColorRGBA loadParam2(const std::string& name, const std_msgs::ColorRGBA& default_value = {})
+     845             :   {
+     846             :     std_msgs::ColorRGBA ret;
+     847             :     loadParam(name, ret, default_value);
+     848             :     return ret;
+     849             :   }
+     850             : 
+     851             :   //}
+     852             : 
+     853             :   /* loadParam specializations for XmlRpc::Value type //{ */
+     854             : 
+     855             :   /*!
+     856             :     * \brief An overload for loading an optional XmlRpc::XmlRpcValue.
+     857             :     *
+     858             :     * This can be used if you want to manually parse some more complex parameter but still take advantage of ParamLoader.
+     859             :     * \warning  XmlRpc::XmlRpcValue must be loaded from a rosparam server and not directly from a YAML file
+     860             :     * (i.e. you cannot use it to load parameters from a file added using the addYamlFile() or addYamlFileFromParam() methods).
+     861             :     *
+     862             :     * \param name          Name of the parameter in the rosparam server.
+     863             :     * \param out_value     Reference to the variable to which the parameter value will be stored (such as a class member variable).
+     864             :     * \param default_value This value will be used if the parameter name is not found in the rosparam server.
+     865             :     * \return              true if the parameter was loaded from \p rosparam, false if the default value was used.
+     866             :     */
+     867           2 :   bool loadParam(const std::string& name, XmlRpc::XmlRpcValue& out, const XmlRpc::XmlRpcValue& default_value)
+     868             :   {
+     869           2 :     return loadParam<XmlRpc::XmlRpcValue>(name, out, default_value);
+     870             :   }
+     871             : 
+     872             :   /*!
+     873             :     * \brief An overload for loading a compulsory XmlRpc::XmlRpcValue.
+     874             :     *
+     875             :     * This can be used if you want to manually parse some more complex parameter but still take advantage of ParamLoader.
+     876             :     * \warning  XmlRpc::XmlRpcValue must be loaded from a rosparam server and not directly from a YAML file
+     877             :     * (i.e. you cannot use it to load parameters from a file added using the addYamlFile() or addYamlFileFromParam() methods).
+     878             :     *
+     879             :     * \param name          Name of the parameter in the rosparam server.
+     880             :     * \param out_value     Reference to the variable to which the parameter value will be stored (such as a class member variable).
+     881             :     * \return              true if the parameter was loaded from \p rosparam, false if the default value was used.
+     882             :     */
+     883           3 :   bool loadParam(const std::string& name, XmlRpc::XmlRpcValue& out)
+     884             :   {
+     885           3 :     return loadParam<XmlRpc::XmlRpcValue>(name, out);
+     886             :   }
+     887             : 
+     888             :   /*!
+     889             :     * \brief An overload for loading an optional XmlRpc::XmlRpcValue.
+     890             :     *
+     891             :     * This can be used if you want to manually parse some more complex parameter but still take advantage of ParamLoader.
+     892             :     * \warning  XmlRpc::XmlRpcValue must be loaded from a rosparam server and not directly from a YAML file
+     893             :     * (i.e. you cannot use it to load parameters from a file added using the addYamlFile() or addYamlFileFromParam() methods).
+     894             :     *
+     895             :     * \param name          Name of the parameter in the rosparam server.
+     896             :     * \param default_value This value will be used if the parameter name is not found in the rosparam server.
+     897             :     * \return              the loaded parameter.
+     898             :     */
+     899           1 :   XmlRpc::XmlRpcValue loadParam2(const std::string& name, const XmlRpc::XmlRpcValue& default_value)
+     900             :   {
+     901           1 :     return loadParam2<XmlRpc::XmlRpcValue>(name, default_value);
+     902             :   }
+     903             : 
+     904             :   //}
+     905             : 
+     906             :   /* loadParam specializations and convenience functions for Eigen dynamic matrix type //{ */
+     907             : 
+     908             :   /*!
+     909             :     * \brief An overload for loading Eigen matrices.
+     910             :     *
+     911             :     * Matrix dimensions are deduced from the provided default value.
+     912             :     * For compulsory Eigen matrices, use loadMatrixStatic(), loadMatrixKnown() or loadMatrixDynamic().
+     913             :     * If the parameter with the specified name is not found on the rosparam server (e.g. because it is not specified in the launchfile or yaml config file),
+     914             :     * the default value is used.
+     915             :     * Using this method, the parameter can only be loaded once using the same ParamLoader instance without error.
+     916             :     *
+     917             :     * \param name          Name of the parameter in the rosparam server.
+     918             :     * \param out_value     Reference to the variable to which the parameter value will be stored (such as a class member variable).
+     919             :     * \param default_value This value will be used if the parameter name is not found in the rosparam server.
+     920             :     * \return              True if loaded successfully, false otherwise.
+     921             :     */
+     922             :   template <typename T>
+     923             :   bool loadParam(const std::string& name, MatrixX<T>& mat, const MatrixX<T>& default_value)
+     924             :   {
+     925             :     const int rows = default_value.rows();
+     926             :     const int cols = default_value.cols();
+     927             :     const bool loaded_ok = loadMatrixDynamic(name, mat, default_value, rows, cols);
+     928             :     return loaded_ok;
+     929             :   }
+     930             : 
+     931             :   /*!
+     932             :     * \brief An overload for loading Eigen matrices.
+     933             :     *
+     934             :     * Matrix dimensions are deduced from the provided default value.
+     935             :     * For compulsory Eigen matrices, use loadMatrixStatic(), loadMatrixKnown() or loadMatrixDynamic().
+     936             :     * If the parameter with the specified name is not found on the rosparam server (e.g. because it is not specified in the launchfile or yaml config file),
+     937             :     * the default value is used.
+     938             :     * Using this method, the parameter can only be loaded once using the same ParamLoader instance without error.
+     939             :     *
+     940             :     * \param name          Name of the parameter in the rosparam server.
+     941             :     * \param default_value This value will be used if the parameter name is not found in the rosparam server.
+     942             :     * \return              The loaded parameter value.
+     943             :     */
+     944             :   template <typename T>
+     945             :   MatrixX<T> loadParam2(const std::string& name, const MatrixX<T>& default_value)
+     946             :   {
+     947             :     MatrixX<T> ret;
+     948             :     loadParam(name, ret, default_value);
+     949             :     return ret;
+     950             :   }
+     951             :   
+     952             :   //}
+     953             : 
+     954             :   // loadMatrixStatic function for loading of static Eigen::Matrices //{
+     955             : 
+     956             :   /*!
+     957             :     * \brief Specialized method for loading compulsory Eigen matrix parameters.
+     958             :     *
+     959             :     * This variant assumes that the matrix dimensions are known in compiletime.
+     960             :     * If the dimensions of the loaded matrix do not match the specified number of rows and columns, the loading process is unsuccessful (loaded_successfully() will return false).
+     961             :     * If the parameter with the specified name is not found on the rosparam server (e.g. because it is not specified in the launchfile or yaml config file),
+     962             :     * the loading process is unsuccessful.
+     963             :     * Using this method, the parameter can only be loaded once using the same ParamLoader instance without error.
+     964             :     *
+     965             :     * \tparam rows  Expected number of rows of the matrix.
+     966             :     * \tparam cols  Expected number of columns of the matrix.
+     967             :     *
+     968             :     * \param name  Name of the parameter in the rosparam server.
+     969             :     * \param mat   Reference to the variable to which the parameter value will be stored (such as a class member variable).
+     970             :     * \return      true if loaded successfully, false otherwise.
+     971             :     *
+     972             :     */
+     973             :   template <int rows, int cols, typename T>
+     974           4 :   bool loadMatrixStatic(const std::string& name, Eigen::Matrix<T, rows, cols>& mat)
+     975             :   {
+     976           4 :     const auto [ret, loaded_ok] = loadMatrixStatic_internal<rows, cols, T>(name, Eigen::Matrix<T, rows, cols>::Zero(), COMPULSORY, UNIQUE);
+     977           4 :     mat = ret;
+     978           4 :     return loaded_ok;
+     979             :   }
+     980             : 
+     981             :   /*!
+     982             :     * \brief Specialized method for loading Eigen matrix parameters with default value.
+     983             :     *
+     984             :     * This variant assumes that the matrix dimensions are known in compiletime.
+     985             :     * If the dimensions of the loaded matrix do not match the specified number of rows and columns, the loading process is unsuccessful (loaded_successfully() will return false).
+     986             :     * If the parameter with the specified name is not found on the rosparam server (e.g. because it is not specified in the launchfile or yaml config file),
+     987             :     * the default value is used.
+     988             :     * Using this method, the parameter can only be loaded once using the same ParamLoader instance without error.
+     989             :     *
+     990             :     * \tparam rows          Expected number of rows of the matrix.
+     991             :     * \tparam cols          Expected number of columns of the matrix.
+     992             :     *
+     993             :     * \param name          Name of the parameter in the rosparam server.
+     994             :     * \param mat           Reference to the variable to which the parameter value will be stored (such as a class member variable).
+     995             :     * \param default_value This value will be used if the parameter name is not found in the rosparam server.
+     996             :     * \return              true if the parameter was loaded from \p rosparam, false if the default value was used.
+     997             :     *
+     998             :     */
+     999             :   template <int rows, int cols, typename T, typename Derived>
+    1000          94 :   bool loadMatrixStatic(const std::string& name, Eigen::Matrix<T, rows, cols>& mat, const Eigen::MatrixBase<Derived>& default_value)
+    1001             :   {
+    1002          94 :     const auto [ret, loaded_ok] = loadMatrixStatic_internal<rows, cols, T>(name, Eigen::Matrix<T, rows, cols>(default_value), OPTIONAL, UNIQUE);
+    1003          94 :     mat = ret;
+    1004          94 :     return loaded_ok;
+    1005             :   }
+    1006             : 
+    1007             :   /*!
+    1008             :     * \brief Specialized method for loading compulsory Eigen matrix parameters.
+    1009             :     *
+    1010             :     * This variant assumes that the matrix dimensions are known in compiletime.
+    1011             :     * If the dimensions of the loaded matrix do not match the specified number of rows and columns, the loading process is unsuccessful (loaded_successfully() will return false).
+    1012             :     * If the parameter with the specified name is not found on the rosparam server (e.g. because it is not specified in the launchfile or yaml config file),
+    1013             :     * the loading process is unsuccessful.
+    1014             :     * Using this method, the parameter can only be loaded once using the same ParamLoader instance without error.
+    1015             :     *
+    1016             :     * \tparam rows  Expected number of rows of the matrix.
+    1017             :     * \tparam cols  Expected number of columns of the matrix.
+    1018             :     *
+    1019             :     * \param name  Name of the parameter in the rosparam server.
+    1020             :     * \return      The loaded parameter value.
+    1021             :     *
+    1022             :     */
+    1023             :   template <int rows, int cols, typename T = double>
+    1024           2 :   Eigen::Matrix<T, rows, cols> loadMatrixStatic2(const std::string& name)
+    1025             :   {
+    1026           2 :     Eigen::Matrix<T, rows, cols> ret;
+    1027           2 :     loadMatrixStatic(name, ret);
+    1028           2 :     return ret;
+    1029             :   }
+    1030             : 
+    1031             :   /*!
+    1032             :     * \brief Specialized method for loading Eigen matrix parameters with default value.
+    1033             :     *
+    1034             :     * This variant assumes that the matrix dimensions are known in compiletime.
+    1035             :     * If the dimensions of the loaded matrix do not match the specified number of rows and columns, the loading process is unsuccessful (loaded_successfully() will return false).
+    1036             :     * If the parameter with the specified name is not found on the rosparam server (e.g. because it is not specified in the launchfile or yaml config file),
+    1037             :     * the default value is used.
+    1038             :     * Using this method, the parameter can only be loaded once using the same ParamLoader instance without error.
+    1039             :     *
+    1040             :     * \tparam rows          Expected number of rows of the matrix.
+    1041             :     * \tparam cols          Expected number of columns of the matrix.
+    1042             :     *
+    1043             :     * \param name          Name of the parameter in the rosparam server.
+    1044             :     * \param default_value This value will be used if the parameter name is not found in the rosparam server.
+    1045             :     * \return              The loaded parameter value.
+    1046             :     *
+    1047             :     */
+    1048             :   template <int rows, int cols, typename T, typename Derived>
+    1049           1 :   Eigen::Matrix<T, rows, cols> loadMatrixStatic2(const std::string& name, const Eigen::MatrixBase<Derived>& default_value)
+    1050             :   {
+    1051           1 :     Eigen::Matrix<T, rows, cols> ret;
+    1052           1 :     loadMatrixStatic(name, ret, default_value);
+    1053           1 :     return ret;
+    1054             :   }
+    1055             :   //}
+    1056             : 
+    1057             :   // loadMatrixKnown function for loading of Eigen matrices with known dimensions //{
+    1058             : 
+    1059             :   /*!
+    1060             :     * \brief Specialized method for loading compulsory Eigen matrix parameters.
+    1061             :     *
+    1062             :     * This variant assumes that the matrix dimensions are known in runtime, but not compiletime.
+    1063             :     * If the dimensions of the loaded matrix do not match the specified number of rows and columns, the loading process is unsuccessful (loaded_successfully() will return false).
+    1064             :     * If the parameter with the specified name is not found on the rosparam server (e.g. because it is not specified in the launchfile or yaml config file),
+    1065             :     * the loading process is unsuccessful.
+    1066             :     * Using this method, the parameter can only be loaded once using the same ParamLoader instance without error.
+    1067             :     *
+    1068             :     * \param name  Name of the parameter in the rosparam server.
+    1069             :     * \param mat   Reference to the variable to which the parameter value will be stored (such as a class member variable).
+    1070             :     * \param rows  Expected number of rows of the matrix.
+    1071             :     * \param cols  Expected number of columns of the matrix.
+    1072             :     * \return      true if loaded successfully, false otherwise.
+    1073             :     */
+    1074             :   template <typename T>
+    1075         366 :   bool loadMatrixKnown(const std::string& name, MatrixX<T>& mat, int rows, int cols)
+    1076             :   {
+    1077         732 :     const auto [ret, loaded_ok] = loadMatrixKnown_internal(name, MatrixX<T>(), rows, cols, COMPULSORY, UNIQUE);
+    1078         366 :     mat = ret;
+    1079         732 :     return loaded_ok;
+    1080             :   }
+    1081             : 
+    1082             :   /*!
+    1083             :     * \brief Specialized method for loading Eigen matrix parameters with default value.
+    1084             :     *
+    1085             :     * This variant assumes that the matrix dimensions are known in runtime, but not compiletime.
+    1086             :     * If the dimensions of the loaded matrix do not match the specified number of rows and columns, the loading process is unsuccessful (loaded_successfully() will return false).
+    1087             :     * If the parameter with the specified name is not found on the rosparam server (e.g. because it is not specified in the launchfile or yaml config file),
+    1088             :     * the default value is used.
+    1089             :     * Using this method, the parameter can only be loaded once using the same ParamLoader instance without error.
+    1090             :     *
+    1091             :     * \param name          Name of the parameter in the rosparam server.
+    1092             :     * \param mat           Reference to the variable to which the parameter value will be stored (such as a class member variable).
+    1093             :     * \param default_value This value will be used if the parameter name is not found in the rosparam server.
+    1094             :     * \param rows          Expected number of rows of the matrix.
+    1095             :     * \param cols          Expected number of columns of the matrix.
+    1096             :     * \return              true if the parameter was loaded from \p rosparam, false if the default value was used.
+    1097             :     */
+    1098             :   template <typename T, typename Derived>
+    1099           2 :   bool loadMatrixKnown(const std::string& name, MatrixX<T>& mat, const Eigen::MatrixBase<Derived>& default_value, int rows, int cols)
+    1100             :   {
+    1101           4 :     const auto [ret, loaded_ok] = loadMatrixKnown_internal(name, MatrixX<T>(default_value), rows, cols, OPTIONAL, UNIQUE);
+    1102           2 :     mat = ret;
+    1103           4 :     return loaded_ok;
+    1104             :   }
+    1105             : 
+    1106             :   /*!
+    1107             :     * \brief Specialized method for loading compulsory Eigen matrix parameters.
+    1108             :     *
+    1109             :     * This variant assumes that the matrix dimensions are known in runtime, but not compiletime.
+    1110             :     * If the dimensions of the loaded matrix do not match the specified number of rows and columns, the loading process is unsuccessful (loaded_successfully() will return false).
+    1111             :     * If the parameter with the specified name is not found on the rosparam server (e.g. because it is not specified in the launchfile or yaml config file),
+    1112             :     * the loading process is unsuccessful.
+    1113             :     * Using this method, the parameter can only be loaded once using the same ParamLoader instance without error.
+    1114             :     *
+    1115             :     * \param name  Name of the parameter in the rosparam server.
+    1116             :     * \param rows  Expected number of rows of the matrix.
+    1117             :     * \param cols  Expected number of columns of the matrix.
+    1118             :     * \return      The loaded parameter value.
+    1119             :     */
+    1120             :   template <typename T = double>
+    1121           1 :   MatrixX<T> loadMatrixKnown2(const std::string& name, int rows, int cols)
+    1122             :   {
+    1123           1 :     MatrixX<T> ret;
+    1124           1 :     loadMatrixKnown(name, ret, rows, cols);
+    1125           1 :     return ret;
+    1126             :   }
+    1127             : 
+    1128             :   /*!
+    1129             :     * \brief Specialized method for loading Eigen matrix parameters with default value.
+    1130             :     *
+    1131             :     * This variant assumes that the matrix dimensions are known in runtime, but not compiletime.
+    1132             :     * If the dimensions of the loaded matrix do not match the specified number of rows and columns, the loading process is unsuccessful (loaded_successfully() will return false).
+    1133             :     * If the parameter with the specified name is not found on the rosparam server (e.g. because it is not specified in the launchfile or yaml config file),
+    1134             :     * the default value is used.
+    1135             :     * Using this method, the parameter can only be loaded once using the same ParamLoader instance without error.
+    1136             :     *
+    1137             :     * \param name          Name of the parameter in the rosparam server.
+    1138             :     * \param default_value This value will be used if the parameter name is not found in the rosparam server.
+    1139             :     * \param rows          Expected number of rows of the matrix.
+    1140             :     * \param cols          Expected number of columns of the matrix.
+    1141             :     * \return              The loaded parameter value.
+    1142             :     */
+    1143             :   template <typename T, typename Derived>
+    1144           1 :   MatrixX<T> loadMatrixKnown2(const std::string& name, const Eigen::MatrixBase<Derived>& default_value, int rows, int cols)
+    1145             :   {
+    1146           1 :     MatrixX<T> ret;
+    1147           1 :     loadMatrixKnown(name, ret, default_value, rows, cols);
+    1148           1 :     return ret;
+    1149             :   }
+    1150             :   //}
+    1151             : 
+    1152             :   // loadMatrixDynamic function for half-dynamic loading of MatrixX<T> //{
+    1153             : 
+    1154             :   /*!
+    1155             :     * \brief Specialized method for loading compulsory dynamic Eigen matrix parameters.
+    1156             :     *
+    1157             :     * This variant assumes that the only one of the matrix dimensions are known, the other is selected based on the loaded value.
+    1158             :     * If the dimensions of the loaded matrix do not match the specified number of rows and columns, the loading process is unsuccessful (loaded_successfully() will return false).
+    1159             :     * If the parameter with the specified name is not found on the rosparam server (e.g. because it is not specified in the launchfile or yaml config file),
+    1160             :     * the loading process is unsuccessful.
+    1161             :     * Using this method, the parameter can only be loaded once using the same ParamLoader instance without error.
+    1162             :     *
+    1163             :     * \param name  Name of the parameter in the rosparam server.
+    1164             :     * \param mat   Reference to the variable to which the parameter value will be stored (such as a class member variable).
+    1165             :     * \param rows  Expected number of rows of the matrix (negative value indicates that the number of rows is to be deduced from the specified number of columns and the size of the loaded array).
+    1166             :     * \param cols  Expected number of columns of the matrix (negative value indicates that the number of columns is to be deduced from the specified number of rows and the size of the loaded array).
+    1167             :     * \return      true if loaded successfully, false otherwise.
+    1168             :     */
+    1169             :   template <typename T>
+    1170          74 :   bool loadMatrixDynamic(const std::string& name, MatrixX<T>& mat, int rows, int cols)
+    1171             :   {
+    1172         148 :     const auto [ret, loaded_ok] = loadMatrixDynamic_internal(name, MatrixX<T>(), rows, cols, COMPULSORY, UNIQUE);
+    1173          74 :     mat = ret;
+    1174         148 :     return loaded_ok;
+    1175             :   }
+    1176             : 
+    1177             :   /*!
+    1178             :     * \brief Specialized method for loading compulsory dynamic Eigen matrix parameters.
+    1179             :     *
+    1180             :     * This variant assumes that the only one of the matrix dimensions are known, the other is selected based on the loaded value.
+    1181             :     * If the dimensions of the loaded matrix do not match the specified number of rows and columns, the loading process is unsuccessful (loaded_successfully() will return false).
+    1182             :     * If the parameter with the specified name is not found on the rosparam server (e.g. because it is not specified in the launchfile or yaml config file),
+    1183             :     * the default value is used.
+    1184             :     * Using this method, the parameter can only be loaded once using the same ParamLoader instance without error.
+    1185             :     *
+    1186             :     * \param name          Name of the parameter in the rosparam server.
+    1187             :     * \param default_value This value will be used if the parameter name is not found in the rosparam server.
+    1188             :     * \param mat           Reference to the variable to which the parameter value will be stored (such as a class member variable).
+    1189             :     * \param rows          Expected number of rows of the matrix (negative value indicates that the number of rows is to be deduced from the specified number of columns and the size of the loaded array).
+    1190             :     * \param cols          Expected number of columns of the matrix (negative value indicates that the number of columns is to be deduced from the specified number of rows and the size of the loaded array).
+    1191             :     * \return              true if the parameter was loaded from \p rosparam, false if the default value was used.
+    1192             :     */
+    1193             :   template <typename T, typename Derived>
+    1194          93 :   bool loadMatrixDynamic(const std::string& name, MatrixX<T>& mat, const Eigen::MatrixBase<Derived>& default_value, int rows, int cols)
+    1195             :   {
+    1196         186 :     const auto [ret, loaded_ok] = loadMatrixDynamic_internal(name, MatrixX<T>(default_value), rows, cols, OPTIONAL, UNIQUE);
+    1197          93 :     mat = ret;
+    1198         186 :     return loaded_ok;
+    1199             :   }
+    1200             : 
+    1201             :   /*!
+    1202             :     * \brief Specialized method for loading compulsory dynamic Eigen matrix parameters.
+    1203             :     *
+    1204             :     * This variant assumes that the only one of the matrix dimensions are known, the other is selected based on the loaded value.
+    1205             :     * If the dimensions of the loaded matrix do not match the specified number of rows and columns, the loading process is unsuccessful (loaded_successfully() will return false).
+    1206             :     * If the parameter with the specified name is not found on the rosparam server (e.g. because it is not specified in the launchfile or yaml config file),
+    1207             :     * the loading process is unsuccessful.
+    1208             :     * Using this method, the parameter can only be loaded once using the same ParamLoader instance without error.
+    1209             :     *
+    1210             :     * \param name  Name of the parameter in the rosparam server.
+    1211             :     * \param rows  Expected number of rows of the matrix (negative value indicates that the number of rows is to be deduced from the specified number of columns and the size of the loaded array).
+    1212             :     * \param cols  Expected number of columns of the matrix (negative value indicates that the number of columns is to be deduced from the specified number of rows and the size of the loaded array).
+    1213             :     * \return      The loaded parameter value.
+    1214             :     */
+    1215             :   template <typename T = double>
+    1216          72 :   MatrixX<T> loadMatrixDynamic2(const std::string& name, int rows, int cols)
+    1217             :   {
+    1218          72 :     MatrixX<T> ret;
+    1219          72 :     loadMatrixDynamic(name, ret, rows, cols);
+    1220          72 :     return ret;
+    1221             :   }
+    1222             : 
+    1223             :   /*!
+    1224             :     * \brief Specialized method for loading compulsory dynamic Eigen matrix parameters.
+    1225             :     *
+    1226             :     * This variant assumes that the only one of the matrix dimensions are known, the other is selected based on the loaded value.
+    1227             :     * If the dimensions of the loaded matrix do not match the specified number of rows and columns, the loading process is unsuccessful (loaded_successfully() will return false).
+    1228             :     * If the parameter with the specified name is not found on the rosparam server (e.g. because it is not specified in the launchfile or yaml config file),
+    1229             :     * the default value is used.
+    1230             :     * Using this method, the parameter can only be loaded once using the same ParamLoader instance without error.
+    1231             :     *
+    1232             :     * \param name          Name of the parameter in the rosparam server.
+    1233             :     * \param default_value This value will be used if the parameter name is not found in the rosparam server.
+    1234             :     * \param rows          Expected number of rows of the matrix (negative value indicates that the number of rows is to be deduced from the specified number of columns and the size of the loaded array).
+    1235             :     * \param cols          Expected number of columns of the matrix (negative value indicates that the number of columns is to be deduced from the specified number of rows and the size of the loaded array).
+    1236             :     * \return              The loaded parameter value.
+    1237             :     */
+    1238             :   template <typename T, typename Derived>
+    1239           1 :   MatrixX<T> loadMatrixDynamic2(const std::string& name, const Eigen::MatrixBase<Derived>& default_value, int rows, int cols)
+    1240             :   {
+    1241           1 :     MatrixX<T> ret;
+    1242           1 :     loadMatrixDynamic(name, ret, default_value, rows, cols);
+    1243           1 :     return ret;
+    1244             :   }
+    1245             : 
+    1246             :   //}
+    1247             : 
+    1248             :   // loadMatrixArray function for loading of an array of MatrixX<T> with known dimensions //{
+    1249             :   /*!
+    1250             :     * \brief Specialized method for loading compulsory parameters, interpreted as an array of dynamic Eigen matrices.
+    1251             :     *
+    1252             :     * The number of rows and columns of the matrices to be loaded is specified in the \c rosparam parameter. Specifically, the \c name/rows value specifies the
+    1253             :     * number of rows, which must be common to all the loaded matrices (i.e. it is one integer >= 0), and the \c name/cols value specifies the number of columns of
+    1254             :     * each matrix (i.e. it is an array of integers > 0). The \c name/data array contains the values of the elements of the matrices and it must have length
+    1255             :     * \f$ r\sum_i c_i \f$, where \f$ r \f$ is the common number of rows and \f$ c_i \f$ is the number of columns of the \f$ i \f$-th matrix.
+    1256             :     * A typical structure of a \c yaml file, specifying the
+    1257             :     * matrix array to be loaded using this method, is
+    1258             :     *
+    1259             :     * \code{.yaml}
+    1260             :     *
+    1261             :     * matrix_array:
+    1262             :     *   rows: 3
+    1263             :     *   cols: [1, 2]
+    1264             :     *   data: [-5.0, 0.0, 23.0,
+    1265             :     *          -5.0, 0.0, 12.0,
+    1266             :     *           2.0,   4.0,  7.0]
+    1267             :     *
+    1268             :     * \endcode
+    1269             :     *
+    1270             :     * which will be loaded as a \c std::vector, containing one \f$ 3\times 1 \f$ matrix and one \f$ 3\times 2 \f$ matrix.
+    1271             :     *
+    1272             :     * If the dimensions of the loaded matrices do not match the specified number of rows and columns, the loading process is unsuccessful (loaded_successfully() will return false).
+    1273             :     * If the parameter with the specified name is not found on the \c rosparam server (e.g. because it is not specified in the launchfile or yaml config file),
+    1274             :     * the loading process is unsuccessful.
+    1275             :     * Using this method, the parameter can only be loaded once using the same ParamLoader instance without error.
+    1276             :     *
+    1277             :     * \param name  Name of the parameter in the rosparam server.
+    1278             :     * \param mat   Reference to the variable to which the parameter value will be stored (such as a class member variable).
+    1279             :     *
+    1280             :     */
+    1281             :   template <typename T>
+    1282           1 :   void loadMatrixArray(const std::string& name, std::vector<MatrixX<T>>& mat)
+    1283             :   {
+    1284           1 :     mat = loadMatrixArray2<double>(name);
+    1285           1 :   }
+    1286             : 
+    1287             :   /*!
+    1288             :     * \brief Specialized method for loading compulsory parameters, interpreted as an array of dynamic Eigen matrices.
+    1289             :     *
+    1290             :     * This overload of the loadMatrixArray() method takes a default value for the parameter, which is used in case a \c rosparam with the specified name is not
+    1291             :     * found in the \c rosparam server, instead of causing an unsuccessful load. This makes specifying the parameter value in the \c rosparam server optional.
+    1292             :     *
+    1293             :     * \param name           Name of the parameter in the rosparam server.
+    1294             :     * \param mat            Reference to the variable to which the parameter value will be stored (such as a class member variable).
+    1295             :     * \param default_value  The default value to be used in case the parameter is not found on the \c rosparam server.
+    1296             :     *
+    1297             :     */
+    1298             :   template <typename T>
+    1299           1 :   void loadMatrixArray(const std::string& name, std::vector<MatrixX<T>>& mat, const std::vector<MatrixX<T>>& default_value)
+    1300             :   {
+    1301           1 :     mat = loadMatrixArray2(name, default_value);
+    1302           1 :   }
+    1303             : 
+    1304             :   /*!
+    1305             :     * \brief Specialized method for loading compulsory parameters, interpreted as an array of dynamic Eigen matrices.
+    1306             :     *
+    1307             :     * This method works in the same way as the loadMatrixArray() method for compulsory parameters, except that the loaded
+    1308             :     * parameter is returned and not stored in the reference parameter.
+    1309             :     *
+    1310             :     * \param name           Name of the parameter in the rosparam server.
+    1311             :     * \returns              The loaded parameter or a default constructed object of the respective type.
+    1312             :     *
+    1313             :     */
+    1314             :   template <typename T = double>
+    1315           3 :   std::vector<MatrixX<T>> loadMatrixArray2(const std::string& name)
+    1316             :   {
+    1317           3 :     return loadMatrixArray_internal(name, std::vector<MatrixX<T>>(), COMPULSORY, UNIQUE);
+    1318             :   }
+    1319             : 
+    1320             :   /*!
+    1321             :     * \brief Specialized method for loading compulsory parameters, interpreted as an array of dynamic Eigen matrices.
+    1322             :     *
+    1323             :     * This method works in the same way as the loadMatrixArray() method for optional parameters, except that the loaded
+    1324             :     * parameter is returned and not stored in the reference parameter.
+    1325             :     *
+    1326             :     * \param name           Name of the parameter in the rosparam server.
+    1327             :     * \param default_value  The default value to be used in case the parameter is not found on the \c rosparam server.
+    1328             :     * \returns              The loaded parameter or the default value.
+    1329             :     *
+    1330             :     */
+    1331             :   template <typename T>
+    1332           2 :   std::vector<MatrixX<T>> loadMatrixArray2(const std::string& name, const std::vector<MatrixX<T>>& default_value)
+    1333             :   {
+    1334           2 :     return loadMatrixArray_internal(name, default_value, OPTIONAL, UNIQUE);
+    1335             :   }
+    1336             :   //}
+    1337             : 
+    1338             :   //}
+    1339             : 
+    1340             : };
+    1341             : //}
+    1342             : 
+    1343             :   /*!
+    1344             :     * \brief An overload for loading ros::Duration.
+    1345             :     *
+    1346             :     * The duration will be loaded as a \p double, representing a number of seconds, and then converted to ros::Duration.
+    1347             :     *
+    1348             :     * \param name          Name of the parameter in the rosparam server.
+    1349             :     * \param default_value This value will be used if the parameter name is not found in the rosparam server.
+    1350             :     * \return              The loaded parameter value.
+    1351             :     */
+    1352             :   template <>
+    1353             :   ros::Duration ParamLoader::loadParam2<ros::Duration>(const std::string& name, const ros::Duration& default_value);
+    1354             : 
+    1355             :   /*!
+    1356             :     * \brief An overload for loading ros::Duration.
+    1357             :     *
+    1358             :     * The duration will be loaded as a \p double, representing a number of seconds, and then converted to ros::Duration.
+    1359             :     *
+    1360             :     * \param name          Name of the parameter in the rosparam server.
+    1361             :     * \return              The loaded parameter value.
+    1362             :     */
+    1363             :   template <>
+    1364             :   ros::Duration ParamLoader::loadParam2<ros::Duration>(const std::string& name);
+    1365             : 
+    1366             : }  // namespace mrs_lib
+    1367             : 
+    1368             : #endif  // PARAM_LOADER_H
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/param_loader.h.gcov.overview.html b/mrs_lib/include/mrs_lib/param_loader.h.gcov.overview.html new file mode 100644 index 0000000000..06a945b67d --- /dev/null +++ b/mrs_lib/include/mrs_lib/param_loader.h.gcov.overview.html @@ -0,0 +1,362 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/param_loader.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/include/mrs_lib/param_loader.h.gcov.png b/mrs_lib/include/mrs_lib/param_loader.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..a4d4e2202f27269e5f25a66abde48f1cb954de81 GIT binary patch literal 4406 zcmV-65y|d}P)?dmV;-Eh=eLQB(e%tMAqI2=3>TAChE z6XB?B!BO9Imv2F+82;!2@QoQAj zkZ*hw+~lD>kBvuS_ys)H7n4V__?8Tj14BX9V)A&?$??GD*tSgA3lD6N#b*AEqjsTa z*s(Q>FI^&ZLG;^$kUUBuzJO5&9u0r8XjMUvArLy4CJh32(&l-_<3&-IavBKMTUI zudn~;`u>T(e*XLZ?|Xgy^F^0oFn2MS8O2m1JXbs&?)${EiUp+f6JLMr6OWG4itvP2 zH$=IPqtfivR3ZMqrv*=R(mm$#qP)jOKAATu>%Uhv`2;r54`wgIVP>gTZTeHG(3soVzSj z(~53d24hz)@q63Kk;;|&bgptiEYOSqI9#Jxg%Un5B4Asl4<3TrBg-2i4Kbe z?N3BPugQ?8L=gksHlZy$!y3n0`gE=Mm9q0N>MFAwHLdHWJ{7l2VaV$m^}guiUJ)@v zp@ND+PE=&i$?YHaTr*jh(>#}Sk_W;8t06yBE< zcFoH|GF@tfx+o>GBy|`PF4*Kuan(JBR`-HXDi|RsP41pPcIQM8YUQ|{nFh>kGc)(Y zM=^!tU|83-eG1E&k?OsQf#+J)^b@C0VN0!3IL>`e7>qgukVdNCwAM7MuU4oa?irhw z=49C#i;U3hhP%q}c&Q2AQ#tOG4C&~&Fn8=i=L=0YI`+bl)(O>kJbcty27o1JCv#7i z(wB`-V4Uw4k3u;1%1746nL{R0qeT+-+zdrhLw#8Ls8X8AV9lWE!Ql1cF{Fj3zzmW* zTw?ZI0QNay2t>{+&9uS}#D*+RKz0$Y0lr|V_nBtKPz?CCgfNFxEoyQUD-g{|2c3bM zal-aOFrT>rRIY6>Q}h9B_;<9}Y|Otl*R;J=ztSASlw^!E`^%u%+gUGmgAgF z?_w9L0mT3jkfiM6y^|I8g46ewA&A3c$Q;Sm2O#)NLlqru0_)mZyXF_ zODFE3T-Q4s<4o)mbhK5{Q+Sv9$o6b*8J84%phx&&drzq*+ybxgmE1|Z+4Qby(92R7 zi_Ja&DV%{JRZn5sF6(k3IhayRzX&}eP+HNWh>(g=-@)d}QdopYPS{DNEPXs-$%n)n zSLE92s;;HjBB^AHmNwswz?TN)Hpy-9JS`<1&9u#PiM?)UCmJ(Di(freyi6^nlEPxb zi@7W6oo{Bb`ApAuO8yGfH0Q1}@RO!5<0^_*eG7CQfurZkDhwgnvj>X>JOS_r^Xi_e z20*i$c7;(;Un7Ljtg|CWuZ7CoYiYt{8Uld}8Ks9pG+}do*wvxu*bE zE60g;C&2?VFtSp%g$P1C7+ep;v!lX3-2Zs%6+Ct|{XD(?WzWUA(k=tg z@mpt=xrbX#cnYycBf`1XR+VE);flqi8G}VLq3)V)rNrB*eLfoV2JS6EjVIdIK|XFO_^KVv!LF-Vl`3*bGNyO36to1nkmZG2Nu4IDNzDpp=sF~PZc19oLo3_Kd38UP zR2@~b(n$yK+4TGamXuLHJw9(dmoUQ%ycD3NQe6mrr=TvmJ?A-*~6XEvq397sQl<(Jt>FvLe12^?`Btv|W{gx^)SPY~8gl z$ItTB0oU=XQj@e5XmZ8LH&}qkmalreZOd14nhmr7Vpi7jp?`nLkN$P3Zh$Cwiz6pcpegr^H=7jn5j zxs;6&;mB3&oWZdHw9Z8Mslb)DSl|oamwzf}<|RP!7w0-V4uDmHDl}s8&I`)kz>G%` z?2xQJesrod^mM7Iad{P@4FD%i1nZ!uTGHdMk=ciJYrJrvNF^R#GhU8Wv>ds!DEe>ZI45D z#Zd)930T=fE+0gN2rC&_<(&vUQ?W&z&(-y5{1th&Gvo(j*gZ)O~Yk(q1Q>DWi-&e&(BH`AAx8D7Xm1GG_` zeg2wVrDNyqKzB?h+UMNJaf@#knD9hu`jNsx`s7@`UalgtyV11GnouKETa@%XNX^$&Gz% zc%QHgn_2qem91`urXx^2-pdBCsuqAiGaAPdYF{T5_fZuH16(e^cg9nb-%}MXYr|=+ zsRTG;++IL3A>1AMg+FJnD^TaRIlxZ$(bAVlsOMKx9>2Nf>kcI2v~Xa=UrDBMJ2!J@!6=%+cCQ2=LsI+p$~m zZHg{D&!`6>?@1bfbq|t?FxkVRnj_x=VfWkB%chT1F7@?6_^(GPJ>bf*Xb1f;aJMbJ z6>!xY>+U1$_aF}|*H*u5%7qZ+uR|x`dz{;k`^dFWbjIpF0`eNRt^4Y2?=wYoqLcnA zggVOuEOkce`X=Q))zzehMq%;f$YH z)IW%*y&eFrFvywV_yBhZ+~38c6+LY{E(PJG@c1#L$AvRB?CJ5yfZ5`bZa$31!a6=1 zk7|z9;De0-0PU1MRswccoo(wP3F6!%XLu6?A%b6wm4tvVrr+AEM0th7xAswABb-4O z>aPsn=r&r115^e`wyjXtyQP*El*IiCC6ChkC zXrY(^FEA|~$&O-yCb{QU|6H*Eg)L%DwuYzmk(+TsWogF2{7%*w7yn^wiuQmu8%#p4 z#R(gz)`a$b27uaW2<{vM;2~spseSC*kdV|rYt3qV`gVs2dtrhPbkdg}d4E$MZAQuy zT3Y5R-&&L%%qcU}dGFSu@;k>lv53b9Yfjt~NySl*U+S+%4S>*EMA1tbfagR29@^|0 zfd=8$2%HssOo^~*1g5=FO0U%PJC*{+D_Z+lih&$Ip~5FrsD=uDlzEt%enhWpUs@@@ zOJ~lDciD;ldk!~1md)?-%^T};Y_Z7*ucz0a2;hAqfFP9Y(elGH9sAe-m``fhV*u!k z*E->`2H?cd6e&f)28aW=~ui0l$4_OL_ z@MepV^!o4m>xa^2=rP&wEuj=Cu$(TFHn;QUY+CyCC5N1)i4zd*Vb28}+fjT&;Eue{xI0g(VDY}cao(8y5 zPiT8Q4Av1aU9v$yITSU6u9sQ6)(vdyzZPf>P1+eLkoEVx^ithO7eJ5fM@F5Ij zH1@W^pkd*VjABfb3*Zq5C5aQ-k%=cvA~?mMPq;X3AD;wVTWppAw>$^ny@5+fiLXG| zQ@|c*0a4^V*ahNf8;laT$X?_T9OaPv&^CQeYM*5Z1v2gEDUy$ZGyd_yiTGRNQD+|; zz$HPM`*?yO9RT-;gQsd=4))xY+@m?F*L{y4%b!1I7}Kt-)P#w{bXEmPGoV1usd8n} wp7#2~bA9D0G;I6uRMI)h6s*m+r07*qoM6N<$f)oynZvX%Q literal 0 HcmV?d00001 diff --git a/mrs_lib/include/mrs_lib/publisher_handler.h.func-sort-c.html b/mrs_lib/include/mrs_lib/publisher_handler.h.func-sort-c.html new file mode 100644 index 0000000000..4bf2a85b21 --- /dev/null +++ b/mrs_lib/include/mrs_lib/publisher_handler.h.func-sort-c.html @@ -0,0 +1,556 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/publisher_handler.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - publisher_handler.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:44100.0 %
Date:2024-04-18 23:11:36Functions:11811999.2 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::PublisherHandler_impl<mrs_msgs::EstimatorDiagnostics_<std::allocator<void> > >::~PublisherHandler_impl()0
mrs_lib::PublisherHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::PublisherHandler()1
mrs_lib::PublisherHandler_impl<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::~PublisherHandler_impl()1
mrs_lib::PublisherHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::PublisherHandler()2
mrs_lib::PublisherHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::~PublisherHandler()2
mrs_lib::PublisherHandler<std_msgs::Int64_<std::allocator<void> > >::~PublisherHandler()2
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::~PublisherHandler_impl()2
mrs_lib::PublisherHandler_impl<std_msgs::Int64_<std::allocator<void> > >::~PublisherHandler_impl()2
mrs_lib::PublisherHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::~PublisherHandler()4
mrs_lib::PublisherHandler<std_msgs::Bool_<std::allocator<void> > >::PublisherHandler()31
mrs_lib::PublisherHandler_impl<std_msgs::Bool_<std::allocator<void> > >::~PublisherHandler_impl()31
mrs_lib::PublisherHandler<std_msgs::Bool_<std::allocator<void> > >::~PublisherHandler()62
mrs_lib::PublisherHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::PublisherHandler()91
mrs_lib::PublisherHandler<mrs_msgs::ControlError_<std::allocator<void> > >::PublisherHandler()91
mrs_lib::PublisherHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::PublisherHandler()91
mrs_lib::PublisherHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::PublisherHandler()91
mrs_lib::PublisherHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::PublisherHandler()91
mrs_lib::PublisherHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::PublisherHandler()91
mrs_lib::PublisherHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::PublisherHandler()91
mrs_lib::PublisherHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::PublisherHandler()91
mrs_lib::PublisherHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::PublisherHandler()91
mrs_lib::PublisherHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::PublisherHandler()91
mrs_lib::PublisherHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::PublisherHandler()91
mrs_lib::PublisherHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::PublisherHandler()91
mrs_lib::PublisherHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::PublisherHandler()91
mrs_lib::PublisherHandler<mrs_msgs::Path_<std::allocator<void> > >::PublisherHandler()91
mrs_lib::PublisherHandler<std_msgs::Empty_<std::allocator<void> > >::PublisherHandler()91
mrs_lib::PublisherHandler<std_msgs::String_<std::allocator<void> > >::PublisherHandler()91
mrs_lib::PublisherHandler_impl<geometry_msgs::PoseStamped_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<mrs_msgs::ControlError_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<mrs_msgs::EstimatorInput_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<mrs_msgs::TrackerCommand_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiActuatorCmd_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiPositionCmd_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiAccelerationHdgCmd_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiVelocityHdgRateCmd_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiAccelerationHdgRateCmd_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<mrs_msgs::Path_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<std_msgs::Empty_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<std_msgs::String_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiVelocityHdgCmd_<std::allocator<void> > >::~PublisherHandler_impl()92
mrs_lib::PublisherHandler_impl<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::~PublisherHandler_impl()97
mrs_lib::PublisherHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::~PublisherHandler()182
mrs_lib::PublisherHandler<mrs_msgs::ControlError_<std::allocator<void> > >::~PublisherHandler()182
mrs_lib::PublisherHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::~PublisherHandler()182
mrs_lib::PublisherHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::~PublisherHandler()182
mrs_lib::PublisherHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::~PublisherHandler()182
mrs_lib::PublisherHandler<mrs_msgs::HwApiActuatorCmd_<std::allocator<void> > >::PublisherHandler()182
mrs_lib::PublisherHandler<mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> > >::PublisherHandler()182
mrs_lib::PublisherHandler<mrs_msgs::HwApiPositionCmd_<std::allocator<void> > >::PublisherHandler()182
mrs_lib::PublisherHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::~PublisherHandler()182
mrs_lib::PublisherHandler<mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> > >::PublisherHandler()182
mrs_lib::PublisherHandler<mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> > >::PublisherHandler()182
mrs_lib::PublisherHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::~PublisherHandler()182
mrs_lib::PublisherHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::~PublisherHandler()182
mrs_lib::PublisherHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::~PublisherHandler()182
mrs_lib::PublisherHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::~PublisherHandler()182
mrs_lib::PublisherHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::~PublisherHandler()182
mrs_lib::PublisherHandler<mrs_msgs::HwApiAccelerationHdgCmd_<std::allocator<void> > >::PublisherHandler()182
mrs_lib::PublisherHandler<mrs_msgs::HwApiVelocityHdgRateCmd_<std::allocator<void> > >::PublisherHandler()182
mrs_lib::PublisherHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::~PublisherHandler()182
mrs_lib::PublisherHandler<mrs_msgs::HwApiAccelerationHdgRateCmd_<std::allocator<void> > >::PublisherHandler()182
mrs_lib::PublisherHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::~PublisherHandler()182
mrs_lib::PublisherHandler<mrs_msgs::Path_<std::allocator<void> > >::~PublisherHandler()182
mrs_lib::PublisherHandler<std_msgs::Empty_<std::allocator<void> > >::~PublisherHandler()182
mrs_lib::PublisherHandler<std_msgs::String_<std::allocator<void> > >::~PublisherHandler()182
mrs_lib::PublisherHandler<mrs_msgs::HwApiVelocityHdgCmd_<std::allocator<void> > >::PublisherHandler()183
mrs_lib::PublisherHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::PublisherHandler()189
mrs_lib::PublisherHandler<mrs_msgs::UavState_<std::allocator<void> > >::PublisherHandler()189
mrs_lib::PublisherHandler_impl<mrs_msgs::UavState_<std::allocator<void> > >::~PublisherHandler_impl()189
mrs_lib::PublisherHandler_impl<mrs_msgs::Float64ArrayStamped_<std::allocator<void> > >::~PublisherHandler_impl()264
mrs_lib::PublisherHandler<mrs_msgs::HwApiActuatorCmd_<std::allocator<void> > >::~PublisherHandler()273
mrs_lib::PublisherHandler<mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> > >::~PublisherHandler()273
mrs_lib::PublisherHandler<mrs_msgs::HwApiPositionCmd_<std::allocator<void> > >::~PublisherHandler()273
mrs_lib::PublisherHandler<mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> > >::~PublisherHandler()273
mrs_lib::PublisherHandler<mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> > >::~PublisherHandler()273
mrs_lib::PublisherHandler<mrs_msgs::HwApiAccelerationHdgCmd_<std::allocator<void> > >::~PublisherHandler()273
mrs_lib::PublisherHandler<mrs_msgs::HwApiVelocityHdgRateCmd_<std::allocator<void> > >::~PublisherHandler()273
mrs_lib::PublisherHandler<mrs_msgs::HwApiAccelerationHdgRateCmd_<std::allocator<void> > >::~PublisherHandler()273
mrs_lib::PublisherHandler<mrs_msgs::HwApiVelocityHdgCmd_<std::allocator<void> > >::~PublisherHandler()275
mrs_lib::PublisherHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::~PublisherHandler()286
mrs_lib::PublisherHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::PublisherHandler()361
mrs_lib::PublisherHandler_impl<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::~PublisherHandler_impl()361
mrs_lib::PublisherHandler<geometry_msgs::PoseArray_<std::allocator<void> > >::PublisherHandler()364
mrs_lib::PublisherHandler<std_msgs::Float64_<std::allocator<void> > >::PublisherHandler()364
mrs_lib::PublisherHandler_impl<geometry_msgs::PoseArray_<std::allocator<void> > >::~PublisherHandler_impl()364
mrs_lib::PublisherHandler_impl<std_msgs::Float64_<std::allocator<void> > >::~PublisherHandler_impl()364
mrs_lib::PublisherHandler<mrs_msgs::UavState_<std::allocator<void> > >::~PublisherHandler()378
mrs_lib::PublisherHandler_impl<nav_msgs::Odometry_<std::allocator<void> > >::~PublisherHandler_impl()447
mrs_lib::PublisherHandler_impl<mrs_msgs::Float64Stamped_<std::allocator<void> > >::~PublisherHandler_impl()525
mrs_lib::PublisherHandler<mrs_msgs::EstimatorDiagnostics_<std::allocator<void> > >::PublisherHandler()529
mrs_lib::PublisherHandler<mrs_msgs::EstimatorDiagnostics_<std::allocator<void> > >::~PublisherHandler()529
mrs_lib::PublisherHandler<visualization_msgs::MarkerArray_<std::allocator<void> > >::PublisherHandler()546
mrs_lib::PublisherHandler_impl<visualization_msgs::MarkerArray_<std::allocator<void> > >::~PublisherHandler_impl()546
mrs_lib::PublisherHandler<nav_msgs::Odometry_<std::allocator<void> > >::PublisherHandler()561
mrs_lib::PublisherHandler<mrs_msgs::Float64ArrayStamped_<std::allocator<void> > >::PublisherHandler()627
mrs_lib::PublisherHandler<mrs_msgs::EstimatorCorrection_<std::allocator<void> > >::PublisherHandler()692
mrs_lib::PublisherHandler_impl<mrs_msgs::EstimatorCorrection_<std::allocator<void> > >::~PublisherHandler_impl()692
mrs_lib::PublisherHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::~PublisherHandler()722
mrs_lib::PublisherHandler<geometry_msgs::PoseArray_<std::allocator<void> > >::~PublisherHandler()728
mrs_lib::PublisherHandler<std_msgs::Float64_<std::allocator<void> > >::~PublisherHandler()728
mrs_lib::PublisherHandler<mrs_msgs::Float64ArrayStamped_<std::allocator<void> > >::~PublisherHandler()891
mrs_lib::PublisherHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::PublisherHandler()962
mrs_lib::PublisherHandler<visualization_msgs::MarkerArray_<std::allocator<void> > >::~PublisherHandler()1092
mrs_lib::PublisherHandler<mrs_msgs::EstimatorCorrection_<std::allocator<void> > >::~PublisherHandler()1384
mrs_lib::PublisherHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::~PublisherHandler()1487
mrs_lib::PublisherHandler<nav_msgs::Odometry_<std::allocator<void> > >::~PublisherHandler()145032
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/publisher_handler.h.func.html b/mrs_lib/include/mrs_lib/publisher_handler.h.func.html new file mode 100644 index 0000000000..27d955e927 --- /dev/null +++ b/mrs_lib/include/mrs_lib/publisher_handler.h.func.html @@ -0,0 +1,556 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/publisher_handler.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - publisher_handler.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:44100.0 %
Date:2024-04-18 23:11:36Functions:11811999.2 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::PublisherHandler<geometry_msgs::PoseArray_<std::allocator<void> > >::PublisherHandler()364
mrs_lib::PublisherHandler<geometry_msgs::PoseArray_<std::allocator<void> > >::~PublisherHandler()728
mrs_lib::PublisherHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::PublisherHandler()91
mrs_lib::PublisherHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::~PublisherHandler()182
mrs_lib::PublisherHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::PublisherHandler()189
mrs_lib::PublisherHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::~PublisherHandler()286
mrs_lib::PublisherHandler<visualization_msgs::MarkerArray_<std::allocator<void> > >::PublisherHandler()546
mrs_lib::PublisherHandler<visualization_msgs::MarkerArray_<std::allocator<void> > >::~PublisherHandler()1092
mrs_lib::PublisherHandler<mrs_msgs::ControlError_<std::allocator<void> > >::PublisherHandler()91
mrs_lib::PublisherHandler<mrs_msgs::ControlError_<std::allocator<void> > >::~PublisherHandler()182
mrs_lib::PublisherHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::PublisherHandler()91
mrs_lib::PublisherHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::~PublisherHandler()182
mrs_lib::PublisherHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::PublisherHandler()962
mrs_lib::PublisherHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::~PublisherHandler()1487
mrs_lib::PublisherHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::PublisherHandler()91
mrs_lib::PublisherHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::~PublisherHandler()182
mrs_lib::PublisherHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::PublisherHandler()361
mrs_lib::PublisherHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::~PublisherHandler()722
mrs_lib::PublisherHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::PublisherHandler()2
mrs_lib::PublisherHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::~PublisherHandler()4
mrs_lib::PublisherHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::PublisherHandler()1
mrs_lib::PublisherHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::~PublisherHandler()2
mrs_lib::PublisherHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::PublisherHandler()91
mrs_lib::PublisherHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::~PublisherHandler()182
mrs_lib::PublisherHandler<mrs_msgs::HwApiActuatorCmd_<std::allocator<void> > >::PublisherHandler()182
mrs_lib::PublisherHandler<mrs_msgs::HwApiActuatorCmd_<std::allocator<void> > >::~PublisherHandler()273
mrs_lib::PublisherHandler<mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> > >::PublisherHandler()182
mrs_lib::PublisherHandler<mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> > >::~PublisherHandler()273
mrs_lib::PublisherHandler<mrs_msgs::HwApiPositionCmd_<std::allocator<void> > >::PublisherHandler()182
mrs_lib::PublisherHandler<mrs_msgs::HwApiPositionCmd_<std::allocator<void> > >::~PublisherHandler()273
mrs_lib::PublisherHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::PublisherHandler()91
mrs_lib::PublisherHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::~PublisherHandler()182
mrs_lib::PublisherHandler<mrs_msgs::EstimatorCorrection_<std::allocator<void> > >::PublisherHandler()692
mrs_lib::PublisherHandler<mrs_msgs::EstimatorCorrection_<std::allocator<void> > >::~PublisherHandler()1384
mrs_lib::PublisherHandler<mrs_msgs::Float64ArrayStamped_<std::allocator<void> > >::PublisherHandler()627
mrs_lib::PublisherHandler<mrs_msgs::Float64ArrayStamped_<std::allocator<void> > >::~PublisherHandler()891
mrs_lib::PublisherHandler<mrs_msgs::HwApiVelocityHdgCmd_<std::allocator<void> > >::PublisherHandler()183
mrs_lib::PublisherHandler<mrs_msgs::HwApiVelocityHdgCmd_<std::allocator<void> > >::~PublisherHandler()275
mrs_lib::PublisherHandler<mrs_msgs::EstimatorDiagnostics_<std::allocator<void> > >::PublisherHandler()529
mrs_lib::PublisherHandler<mrs_msgs::EstimatorDiagnostics_<std::allocator<void> > >::~PublisherHandler()529
mrs_lib::PublisherHandler<mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> > >::PublisherHandler()182
mrs_lib::PublisherHandler<mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> > >::~PublisherHandler()273
mrs_lib::PublisherHandler<mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> > >::PublisherHandler()182
mrs_lib::PublisherHandler<mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> > >::~PublisherHandler()273
mrs_lib::PublisherHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::PublisherHandler()91
mrs_lib::PublisherHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::~PublisherHandler()182
mrs_lib::PublisherHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::PublisherHandler()91
mrs_lib::PublisherHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::~PublisherHandler()182
mrs_lib::PublisherHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::PublisherHandler()91
mrs_lib::PublisherHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::~PublisherHandler()182
mrs_lib::PublisherHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::PublisherHandler()91
mrs_lib::PublisherHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::~PublisherHandler()182
mrs_lib::PublisherHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::PublisherHandler()91
mrs_lib::PublisherHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::~PublisherHandler()182
mrs_lib::PublisherHandler<mrs_msgs::HwApiAccelerationHdgCmd_<std::allocator<void> > >::PublisherHandler()182
mrs_lib::PublisherHandler<mrs_msgs::HwApiAccelerationHdgCmd_<std::allocator<void> > >::~PublisherHandler()273
mrs_lib::PublisherHandler<mrs_msgs::HwApiVelocityHdgRateCmd_<std::allocator<void> > >::PublisherHandler()182
mrs_lib::PublisherHandler<mrs_msgs::HwApiVelocityHdgRateCmd_<std::allocator<void> > >::~PublisherHandler()273
mrs_lib::PublisherHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::PublisherHandler()91
mrs_lib::PublisherHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::~PublisherHandler()182
mrs_lib::PublisherHandler<mrs_msgs::HwApiAccelerationHdgRateCmd_<std::allocator<void> > >::PublisherHandler()182
mrs_lib::PublisherHandler<mrs_msgs::HwApiAccelerationHdgRateCmd_<std::allocator<void> > >::~PublisherHandler()273
mrs_lib::PublisherHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::PublisherHandler()91
mrs_lib::PublisherHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::~PublisherHandler()182
mrs_lib::PublisherHandler<mrs_msgs::Path_<std::allocator<void> > >::PublisherHandler()91
mrs_lib::PublisherHandler<mrs_msgs::Path_<std::allocator<void> > >::~PublisherHandler()182
mrs_lib::PublisherHandler<mrs_msgs::UavState_<std::allocator<void> > >::PublisherHandler()189
mrs_lib::PublisherHandler<mrs_msgs::UavState_<std::allocator<void> > >::~PublisherHandler()378
mrs_lib::PublisherHandler<nav_msgs::Odometry_<std::allocator<void> > >::PublisherHandler()561
mrs_lib::PublisherHandler<nav_msgs::Odometry_<std::allocator<void> > >::~PublisherHandler()145032
mrs_lib::PublisherHandler<std_msgs::Bool_<std::allocator<void> > >::PublisherHandler()31
mrs_lib::PublisherHandler<std_msgs::Bool_<std::allocator<void> > >::~PublisherHandler()62
mrs_lib::PublisherHandler<std_msgs::Empty_<std::allocator<void> > >::PublisherHandler()91
mrs_lib::PublisherHandler<std_msgs::Empty_<std::allocator<void> > >::~PublisherHandler()182
mrs_lib::PublisherHandler<std_msgs::Int64_<std::allocator<void> > >::~PublisherHandler()2
mrs_lib::PublisherHandler<std_msgs::String_<std::allocator<void> > >::PublisherHandler()91
mrs_lib::PublisherHandler<std_msgs::String_<std::allocator<void> > >::~PublisherHandler()182
mrs_lib::PublisherHandler<std_msgs::Float64_<std::allocator<void> > >::PublisherHandler()364
mrs_lib::PublisherHandler<std_msgs::Float64_<std::allocator<void> > >::~PublisherHandler()728
mrs_lib::PublisherHandler_impl<geometry_msgs::PoseArray_<std::allocator<void> > >::~PublisherHandler_impl()364
mrs_lib::PublisherHandler_impl<geometry_msgs::PoseStamped_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::~PublisherHandler_impl()97
mrs_lib::PublisherHandler_impl<visualization_msgs::MarkerArray_<std::allocator<void> > >::~PublisherHandler_impl()546
mrs_lib::PublisherHandler_impl<mrs_msgs::ControlError_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<mrs_msgs::EstimatorInput_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<mrs_msgs::Float64Stamped_<std::allocator<void> > >::~PublisherHandler_impl()525
mrs_lib::PublisherHandler_impl<mrs_msgs::TrackerCommand_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::~PublisherHandler_impl()361
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::~PublisherHandler_impl()2
mrs_lib::PublisherHandler_impl<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::~PublisherHandler_impl()1
mrs_lib::PublisherHandler_impl<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiActuatorCmd_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiPositionCmd_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<mrs_msgs::EstimatorCorrection_<std::allocator<void> > >::~PublisherHandler_impl()692
mrs_lib::PublisherHandler_impl<mrs_msgs::Float64ArrayStamped_<std::allocator<void> > >::~PublisherHandler_impl()264
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiVelocityHdgCmd_<std::allocator<void> > >::~PublisherHandler_impl()92
mrs_lib::PublisherHandler_impl<mrs_msgs::EstimatorDiagnostics_<std::allocator<void> > >::~PublisherHandler_impl()0
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiAccelerationHdgCmd_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiVelocityHdgRateCmd_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<mrs_msgs::HwApiAccelerationHdgRateCmd_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<mrs_msgs::Path_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<mrs_msgs::UavState_<std::allocator<void> > >::~PublisherHandler_impl()189
mrs_lib::PublisherHandler_impl<nav_msgs::Odometry_<std::allocator<void> > >::~PublisherHandler_impl()447
mrs_lib::PublisherHandler_impl<std_msgs::Bool_<std::allocator<void> > >::~PublisherHandler_impl()31
mrs_lib::PublisherHandler_impl<std_msgs::Empty_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<std_msgs::Int64_<std::allocator<void> > >::~PublisherHandler_impl()2
mrs_lib::PublisherHandler_impl<std_msgs::String_<std::allocator<void> > >::~PublisherHandler_impl()91
mrs_lib::PublisherHandler_impl<std_msgs::Float64_<std::allocator<void> > >::~PublisherHandler_impl()364
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/publisher_handler.h.gcov.frameset.html b/mrs_lib/include/mrs_lib/publisher_handler.h.gcov.frameset.html new file mode 100644 index 0000000000..79755e1cb1 --- /dev/null +++ b/mrs_lib/include/mrs_lib/publisher_handler.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/publisher_handler.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/include/mrs_lib/publisher_handler.h.gcov.html b/mrs_lib/include/mrs_lib/publisher_handler.h.gcov.html new file mode 100644 index 0000000000..0657f5f58f --- /dev/null +++ b/mrs_lib/include/mrs_lib/publisher_handler.h.gcov.html @@ -0,0 +1,256 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/publisher_handler.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - publisher_handler.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:44100.0 %
Date:2024-04-18 23:11:36Functions:11811999.2 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : /**  \file
+       2             :      \brief Defines PublisherHandler and related convenience classes for upgrading the ROS publisher
+       3             :      \author Tomas Baca - tomas.baca@fel.cvut.cz
+       4             :  */
+       5             : #ifndef PUBLISHER_HANDLER_H
+       6             : #define PUBLISHER_HANDLER_H
+       7             : 
+       8             : #include <ros/ros.h>
+       9             : #include <ros/package.h>
+      10             : 
+      11             : #include <atomic>
+      12             : #include <string>
+      13             : #include <mutex>
+      14             : 
+      15             : namespace mrs_lib
+      16             : {
+      17             : 
+      18             : /* class PublisherHandler_impl //{ */
+      19             : 
+      20             : /**
+      21             :  * @brief implementation of the publisher handler
+      22             :  */
+      23             : template <class TopicType>
+      24             : class PublisherHandler_impl {
+      25             : 
+      26             : public:
+      27             :   /**
+      28             :    * @brief default constructor
+      29             :    */
+      30             :   PublisherHandler_impl(void);
+      31             : 
+      32             :   /**
+      33             :    * @brief default destructor
+      34             :    */
+      35        6161 :   ~PublisherHandler_impl(void){};
+      36             : 
+      37             :   /**
+      38             :    * @brief constructor
+      39             :    *
+      40             :    * @param nh ROS node handler
+      41             :    * @param address topic address
+      42             :    * @param buffer_size buffer size
+      43             :    * @param latch latching
+      44             :    */
+      45             :   PublisherHandler_impl(ros::NodeHandle& nh, const std::string& address, const unsigned int& buffer_size = 1, const bool& latch = false,
+      46             :                         const double& rate = 0.0);
+      47             : 
+      48             :   /**
+      49             :    * @brief publish message
+      50             :    *
+      51             :    * @param msg data
+      52             :    *
+      53             :    */
+      54             :   void publish(const TopicType& msg);
+      55             : 
+      56             :   /**
+      57             :    * @brief publish message, boost ptr overload
+      58             :    *
+      59             :    * @param msg
+      60             :    */
+      61             :   void publish(const boost::shared_ptr<TopicType>& msg);
+      62             : 
+      63             :   /**
+      64             :    * @brief publish message, boost const ptr overload
+      65             :    *
+      66             :    * @param msg
+      67             :    */
+      68             :   void publish(const boost::shared_ptr<TopicType const>& msg);
+      69             : 
+      70             :   /**
+      71             :    * @brief get number of subscribers
+      72             :    *
+      73             :    * @return the number of subscribers
+      74             :    */
+      75             :   unsigned int getNumSubscribers(void);
+      76             : 
+      77             : private:
+      78             :   ros::Publisher    publisher_;
+      79             :   std::mutex        mutex_publisher_;
+      80             :   std::atomic<bool> publisher_initialized_;
+      81             : 
+      82             :   bool      throttle_ = false;
+      83             :   double    throttle_min_dt_;
+      84             :   ros::Time last_time_published_;
+      85             : };
+      86             : 
+      87             : //}
+      88             : 
+      89             : /* class PublisherHandler //{ */
+      90             : 
+      91             : /**
+      92             :  * @brief user wrapper of the publisher handler implementation
+      93             :  */
+      94             : template <class TopicType>
+      95             : class PublisherHandler {
+      96             : 
+      97             : public:
+      98             :   /**
+      99             :    * @brief generic constructor
+     100             :    */
+     101        8513 :   PublisherHandler(void){};
+     102             : 
+     103             :   /**
+     104             :    * @brief generic destructor
+     105             :    */
+     106      158698 :   ~PublisherHandler(void){};
+     107             : 
+     108             :   /**
+     109             :    * @brief operator=
+     110             :    *
+     111             :    * @param other
+     112             :    *
+     113             :    * @return
+     114             :    */
+     115             :   PublisherHandler& operator=(const PublisherHandler& other);
+     116             : 
+     117             :   /**
+     118             :    * @brief copy constructor
+     119             :    *
+     120             :    * @param other
+     121             :    */
+     122             :   PublisherHandler(const PublisherHandler& other);
+     123             : 
+     124             :   /**
+     125             :    * @brief constructor
+     126             :    *
+     127             :    * @param nh ROS node handler
+     128             :    * @param address topic address
+     129             :    * @param buffer_size buffer size
+     130             :    * @param latch latching
+     131             :    */
+     132         224 :   PublisherHandler(ros::NodeHandle& nh, const std::string& address, const unsigned int& buffer_size = 1, const bool& latch = false, const double& rate = 0);
+     133             : 
+     134             :   /**
+     135             :    * @brief publish message
+     136             :    *
+     137             :    * @param msg
+     138             :    */
+     139             :   void publish(const TopicType& msg);
+     140             : 
+     141             :   /**
+     142             :    * @brief publish message, boost ptr overload
+     143             :    *
+     144             :    * @param msg
+     145             :    */
+     146             :   void publish(const boost::shared_ptr<TopicType>& msg);
+     147             : 
+     148             :   /**
+     149             :    * @brief publish message, boost const ptr overload
+     150             :    *
+     151             :    * @param msg
+     152             :    */
+     153             :   void publish(const boost::shared_ptr<TopicType const>& msg);
+     154             : 
+     155             :   /**
+     156             :    * @brief get number of subscribers
+     157             :    *
+     158             :    * @return the number of subscribers
+     159             :    */
+     160             :   unsigned int getNumSubscribers(void);
+     161             : 
+     162             : private:
+     163             :   std::shared_ptr<PublisherHandler_impl<TopicType>> impl_;
+     164             : };
+     165             : 
+     166             : //}
+     167             : 
+     168             : }  // namespace mrs_lib
+     169             : 
+     170             : #include <mrs_lib/impl/publisher_handler.hpp>
+     171             : 
+     172             : #endif  // PUBLISHER_HANDLER_H
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/publisher_handler.h.gcov.overview.html b/mrs_lib/include/mrs_lib/publisher_handler.h.gcov.overview.html new file mode 100644 index 0000000000..f7a333c6d4 --- /dev/null +++ b/mrs_lib/include/mrs_lib/publisher_handler.h.gcov.overview.html @@ -0,0 +1,63 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/publisher_handler.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/include/mrs_lib/publisher_handler.h.gcov.png b/mrs_lib/include/mrs_lib/publisher_handler.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..2e1368f216e722628217c675653cec3b3eb2b964 GIT binary patch literal 572 zcmV-C0>k}@P)jIAVzQI3tdiO%^l}?ut?wSfv!tU=`04H9tJcLlr+lB{7K683_n#T%WJ{My@|tq@(patK5dhlgse{rQX(#CEF!X)&kewkVJscYV zsh+Cni4?QkaVndNnwyi^g`d6UpdOhmj*hlizMtk!up88{?APwdz~*6pUFgIHJZqfZ zU)Sxm5A+Edm8FN=p}Q_YRe)Ev*KpzvO@DoRy&~=C#U1HI?e%Az87@#Bn!pBh=L`hY zcFlZv#r_#+YBZDz*{KT%Hw+b2U!Xf`XuQWgagWA9{Q1~!{_f>3ybtfLE_+j_H~@GL zXCm+(&P3onoJohx4-IE;avXzxVN7A_|NCx}Mn<1h?rE)5c5(kNrF{`P`xrm~0000< KMNUMnLSTX}3jTlq literal 0 HcmV?d00001 diff --git a/mrs_lib/include/mrs_lib/quadratic_throttle_model.h.func-sort-c.html b/mrs_lib/include/mrs_lib/quadratic_throttle_model.h.func-sort-c.html new file mode 100644 index 0000000000..62726ab87b --- /dev/null +++ b/mrs_lib/include/mrs_lib/quadratic_throttle_model.h.func-sort-c.html @@ -0,0 +1,88 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/quadratic_throttle_model.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - quadratic_throttle_model.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:44100.0 %
Date:2024-04-18 23:11:36Functions:22100.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::quadratic_throttle_model::forceToThrottle(mrs_lib::quadratic_throttle_model::MotorParams_t, double)77058
mrs_lib::quadratic_throttle_model::throttleToForce(mrs_lib::quadratic_throttle_model::MotorParams_t, double)113517
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/quadratic_throttle_model.h.func.html b/mrs_lib/include/mrs_lib/quadratic_throttle_model.h.func.html new file mode 100644 index 0000000000..d9c977be0c --- /dev/null +++ b/mrs_lib/include/mrs_lib/quadratic_throttle_model.h.func.html @@ -0,0 +1,88 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/quadratic_throttle_model.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - quadratic_throttle_model.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:44100.0 %
Date:2024-04-18 23:11:36Functions:22100.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::quadratic_throttle_model::forceToThrottle(mrs_lib::quadratic_throttle_model::MotorParams_t, double)77058
mrs_lib::quadratic_throttle_model::throttleToForce(mrs_lib::quadratic_throttle_model::MotorParams_t, double)113517
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/quadratic_throttle_model.h.gcov.frameset.html b/mrs_lib/include/mrs_lib/quadratic_throttle_model.h.gcov.frameset.html new file mode 100644 index 0000000000..aa416cc5c8 --- /dev/null +++ b/mrs_lib/include/mrs_lib/quadratic_throttle_model.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/quadratic_throttle_model.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/include/mrs_lib/quadratic_throttle_model.h.gcov.html b/mrs_lib/include/mrs_lib/quadratic_throttle_model.h.gcov.html new file mode 100644 index 0000000000..da5e42dd31 --- /dev/null +++ b/mrs_lib/include/mrs_lib/quadratic_throttle_model.h.gcov.html @@ -0,0 +1,117 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/quadratic_throttle_model.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - quadratic_throttle_model.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:44100.0 %
Date:2024-04-18 23:11:36Functions:22100.0 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : #ifndef QUADRATIC_THRUST_MODEL_H
+       2             : #define QUADRATIC_THRUST_MODEL_H
+       3             : 
+       4             : #include <cmath>
+       5             : 
+       6             : namespace mrs_lib
+       7             : {
+       8             : 
+       9             : namespace quadratic_throttle_model
+      10             : {
+      11             : 
+      12             : typedef struct
+      13             : {
+      14             :   double A;
+      15             :   double B;
+      16             :   int    n_motors;
+      17             : } MotorParams_t;
+      18             : 
+      19      113517 : double inline throttleToForce(const MotorParams_t motor_params, const double throttle) {
+      20             : 
+      21      113517 :   return motor_params.n_motors * pow((throttle - motor_params.B) / motor_params.A, 2);
+      22             : }
+      23             : 
+      24       77058 : double inline forceToThrottle(const MotorParams_t motor_params, const double force) {
+      25             : 
+      26       77058 :   return sqrt(force / motor_params.n_motors) * motor_params.A + motor_params.B;
+      27             : }
+      28             : 
+      29             : }  // namespace quadratic_throttle_model
+      30             : 
+      31             : }  // namespace mrs_lib
+      32             : 
+      33             : #endif  // QUADRATIC_THRUST_MODEL_H
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/quadratic_throttle_model.h.gcov.overview.html b/mrs_lib/include/mrs_lib/quadratic_throttle_model.h.gcov.overview.html new file mode 100644 index 0000000000..9573c3e7be --- /dev/null +++ b/mrs_lib/include/mrs_lib/quadratic_throttle_model.h.gcov.overview.html @@ -0,0 +1,29 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/quadratic_throttle_model.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/include/mrs_lib/quadratic_throttle_model.h.gcov.png b/mrs_lib/include/mrs_lib/quadratic_throttle_model.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..901c7c88f43a90c594501dfbb1127c48124c4bee GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^0YI$C!VDz$I2!%}QW60^A+G=b|6c_J%iqVwzWUF= zunH&+rp|e9UJ7J$7I;J!GcfQS0b$0e+I-SL!4^*!#}JF&vr}Gk9#G(EdCYc_YnS7u z|9Prn&0vw(Q~TY^(TcNTKb^))zg~3C21Kw6xUb@7~OREMwa1s?Ub`De3_ k`@TQpy=s3*@}p|TV@0+L6F;BJ1iFX8)78&qol`;+04uX!xBvhE literal 0 HcmV?d00001 diff --git a/mrs_lib/include/mrs_lib/repredictor.h.func-sort-c.html b/mrs_lib/include/mrs_lib/repredictor.h.func-sort-c.html new file mode 100644 index 0000000000..29e9dad564 --- /dev/null +++ b/mrs_lib/include/mrs_lib/repredictor.h.func-sort-c.html @@ -0,0 +1,256 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/repredictor.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - repredictor.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:10011190.1 %
Date:2024-04-18 23:11:36Functions:204445.5 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::correctFrom(mrs_lib::KalmanFilter<3, 1, 1>::statecov_t const&, mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::info_t const&)0
mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::predictFrom(mrs_lib::KalmanFilter<3, 1, 1>::statecov_t const&, mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::info_t const&, ros::Time const&, ros::Time const&)0
std::enable_if<!(false), void>::type mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::addMeasurement<false>(Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, ros::Time const&, std::shared_ptr<mrs_lib::varstepLKF<3, 1, 1> > const&, double const&)0
std::enable_if<!(false), void>::type mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::addInputChangeWithNoise<false>(Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 3, 3, 0, 3, 3> const&, ros::Time const&, std::shared_ptr<mrs_lib::varstepLKF<3, 1, 1> > const&)0
mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::info_t::updateUsing(mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::info_t const&)0
mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::info_t::info_t(ros::Time const&)0
mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::info_t::info_t(ros::Time const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 3, 3, 0, 3, 3> const&, std::shared_ptr<mrs_lib::varstepLKF<3, 1, 1> > const&)0
mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::info_t::info_t(ros::Time const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, std::shared_ptr<mrs_lib::varstepLKF<3, 1, 1> > const&, mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::info_t const&, int const&)0
mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::addInfo(mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::info_t const&, boost::cb_details::iterator<boost::circular_buffer<mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::info_t, std::allocator<mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::info_t> >, boost::cb_details::nonconst_traits<boost::cb_details::allocator_traits<std::allocator<mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::info_t> > > > const&)0
mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::earlier(mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::info_t const&, mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::info_t const&)0
std::enable_if<!(false), mrs_lib::KalmanFilter<3, 1, 1>::statecov_t>::type mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::predictTo<false>(ros::Time const&)0
mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::Repredictor(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, Eigen::Matrix<double, 3, 3, 0, 3, 3> const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 3, 3, 0, 3, 3> const&, ros::Time const&, std::shared_ptr<mrs_lib::varstepLKF<3, 1, 1> > const&, unsigned int)0
mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::correctFrom(mrs_lib::KalmanFilter<6, 2, 2>::statecov_t const&, mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::info_t const&)0
mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::predictFrom(mrs_lib::KalmanFilter<6, 2, 2>::statecov_t const&, mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::info_t const&, ros::Time const&, ros::Time const&)0
std::enable_if<!(false), void>::type mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::addMeasurement<false>(Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&, ros::Time const&, std::shared_ptr<mrs_lib::varstepLKF<6, 2, 2> > const&, double const&)0
std::enable_if<!(false), void>::type mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::addInputChangeWithNoise<false>(Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 6, 6, 0, 6, 6> const&, ros::Time const&, std::shared_ptr<mrs_lib::varstepLKF<6, 2, 2> > const&)0
mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::info_t::updateUsing(mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::info_t const&)0
mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::info_t::info_t(ros::Time const&)0
mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::info_t::info_t(ros::Time const&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&, std::shared_ptr<mrs_lib::varstepLKF<6, 2, 2> > const&, mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::info_t const&, int const&)0
mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::info_t::info_t(ros::Time const&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 6, 6, 0, 6, 6> const&, std::shared_ptr<mrs_lib::varstepLKF<6, 2, 2> > const&)0
mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::addInfo(mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::info_t const&, boost::cb_details::iterator<boost::circular_buffer<mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::info_t, std::allocator<mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::info_t> >, boost::cb_details::nonconst_traits<boost::cb_details::allocator_traits<std::allocator<mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::info_t> > > > const&)0
mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::earlier(mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::info_t const&, mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::info_t const&)0
std::enable_if<!(false), mrs_lib::KalmanFilter<6, 2, 2>::statecov_t>::type mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::predictTo<false>(ros::Time const&)0
mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::Repredictor(Eigen::Matrix<double, 6, 1, 0, 6, 1> const&, Eigen::Matrix<double, 6, 6, 0, 6, 6> const&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 6, 6, 0, 6, 6> const&, ros::Time const&, std::shared_ptr<mrs_lib::varstepLKF<6, 2, 2> > const&, unsigned int)0
mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::Repredictor(Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&, ros::Time const&, std::shared_ptr<mrs_lib::varstepLKF<2, 1, 1> > const&, unsigned int)1
mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, true>::info_t::info_t(ros::Time const&)2
mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, true>::Repredictor(Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&, ros::Time const&, std::shared_ptr<mrs_lib::varstepLKF<2, 1, 1> > const&, unsigned int)2
std::enable_if<!(false), void>::type mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::addMeasurement<false>(Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, ros::Time const&, std::shared_ptr<mrs_lib::varstepLKF<2, 1, 1> > const&, double const&)100
mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::info_t::info_t(ros::Time const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, std::shared_ptr<mrs_lib::varstepLKF<2, 1, 1> > const&, mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::info_t const&, int const&)100
std::enable_if<!(false), mrs_lib::KalmanFilter<2, 1, 1>::statecov_t>::type mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::predictTo<false>(ros::Time const&)102
std::enable_if<true, void>::type mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, true>::addInputChange<true>(Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, ros::Time const&, std::shared_ptr<mrs_lib::varstepLKF<2, 1, 1> > const&)109
std::enable_if<true, void>::type mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, true>::addInputChangeWithNoise<true>(Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&, ros::Time const&, std::shared_ptr<mrs_lib::varstepLKF<2, 1, 1> > const&)187
std::enable_if<!(false), void>::type mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::addInputChangeWithNoise<false>(Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&, ros::Time const&, std::shared_ptr<mrs_lib::varstepLKF<2, 1, 1> > const&)200
mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::info_t::info_t(ros::Time const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&, std::shared_ptr<mrs_lib::varstepLKF<2, 1, 1> > const&)200
mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::addInfo(mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::info_t const&, boost::cb_details::iterator<boost::circular_buffer<mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::info_t, std::allocator<mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::info_t> >, boost::cb_details::nonconst_traits<boost::cb_details::allocator_traits<std::allocator<mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::info_t> > > > const&)300
mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, true>::correctFrom(mrs_lib::KalmanFilter<2, 1, 1>::statecov_t const&, mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, true>::info_t const&)303
std::enable_if<true, void>::type mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, true>::addMeasurement<true>(Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, ros::Time const&, std::shared_ptr<mrs_lib::varstepLKF<2, 1, 1> > const&, double const&)303
mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, true>::predictFrom(mrs_lib::KalmanFilter<2, 1, 1>::statecov_t const&, mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, true>::info_t const&, ros::Time const&, ros::Time const&)606
std::enable_if<true, mrs_lib::KalmanFilter<2, 1, 1>::statecov_t>::type mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, true>::predictTo<true>(ros::Time const&)606
mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::info_t::info_t(ros::Time const&)623
mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::earlier(mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::info_t const&, mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::info_t const&)2053
mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::correctFrom(mrs_lib::KalmanFilter<2, 1, 1>::statecov_t const&, mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::info_t const&)5150
mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::info_t::updateUsing(mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::info_t const&)5771
mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::predictFrom(mrs_lib::KalmanFilter<2, 1, 1>::statecov_t const&, mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::info_t const&, ros::Time const&, ros::Time const&)15235
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/repredictor.h.func.html b/mrs_lib/include/mrs_lib/repredictor.h.func.html new file mode 100644 index 0000000000..124807d275 --- /dev/null +++ b/mrs_lib/include/mrs_lib/repredictor.h.func.html @@ -0,0 +1,256 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/repredictor.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - repredictor.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:10011190.1 %
Date:2024-04-18 23:11:36Functions:204445.5 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::correctFrom(mrs_lib::KalmanFilter<2, 1, 1>::statecov_t const&, mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::info_t const&)5150
mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::predictFrom(mrs_lib::KalmanFilter<2, 1, 1>::statecov_t const&, mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::info_t const&, ros::Time const&, ros::Time const&)15235
std::enable_if<!(false), void>::type mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::addMeasurement<false>(Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, ros::Time const&, std::shared_ptr<mrs_lib::varstepLKF<2, 1, 1> > const&, double const&)100
std::enable_if<!(false), void>::type mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::addInputChangeWithNoise<false>(Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&, ros::Time const&, std::shared_ptr<mrs_lib::varstepLKF<2, 1, 1> > const&)200
mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::info_t::updateUsing(mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::info_t const&)5771
mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::info_t::info_t(ros::Time const&)623
mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::info_t::info_t(ros::Time const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&, std::shared_ptr<mrs_lib::varstepLKF<2, 1, 1> > const&)200
mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::info_t::info_t(ros::Time const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, std::shared_ptr<mrs_lib::varstepLKF<2, 1, 1> > const&, mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::info_t const&, int const&)100
mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::addInfo(mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::info_t const&, boost::cb_details::iterator<boost::circular_buffer<mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::info_t, std::allocator<mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::info_t> >, boost::cb_details::nonconst_traits<boost::cb_details::allocator_traits<std::allocator<mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::info_t> > > > const&)300
mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::earlier(mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::info_t const&, mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::info_t const&)2053
std::enable_if<!(false), mrs_lib::KalmanFilter<2, 1, 1>::statecov_t>::type mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::predictTo<false>(ros::Time const&)102
mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, false>::Repredictor(Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&, ros::Time const&, std::shared_ptr<mrs_lib::varstepLKF<2, 1, 1> > const&, unsigned int)1
mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, true>::correctFrom(mrs_lib::KalmanFilter<2, 1, 1>::statecov_t const&, mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, true>::info_t const&)303
mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, true>::predictFrom(mrs_lib::KalmanFilter<2, 1, 1>::statecov_t const&, mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, true>::info_t const&, ros::Time const&, ros::Time const&)606
std::enable_if<true, void>::type mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, true>::addInputChange<true>(Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, ros::Time const&, std::shared_ptr<mrs_lib::varstepLKF<2, 1, 1> > const&)109
std::enable_if<true, void>::type mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, true>::addMeasurement<true>(Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, ros::Time const&, std::shared_ptr<mrs_lib::varstepLKF<2, 1, 1> > const&, double const&)303
std::enable_if<true, void>::type mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, true>::addInputChangeWithNoise<true>(Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&, ros::Time const&, std::shared_ptr<mrs_lib::varstepLKF<2, 1, 1> > const&)187
mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, true>::info_t::info_t(ros::Time const&)2
std::enable_if<true, mrs_lib::KalmanFilter<2, 1, 1>::statecov_t>::type mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, true>::predictTo<true>(ros::Time const&)606
mrs_lib::Repredictor<mrs_lib::varstepLKF<2, 1, 1>, true>::Repredictor(Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&, ros::Time const&, std::shared_ptr<mrs_lib::varstepLKF<2, 1, 1> > const&, unsigned int)2
mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::correctFrom(mrs_lib::KalmanFilter<3, 1, 1>::statecov_t const&, mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::info_t const&)0
mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::predictFrom(mrs_lib::KalmanFilter<3, 1, 1>::statecov_t const&, mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::info_t const&, ros::Time const&, ros::Time const&)0
std::enable_if<!(false), void>::type mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::addMeasurement<false>(Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, ros::Time const&, std::shared_ptr<mrs_lib::varstepLKF<3, 1, 1> > const&, double const&)0
std::enable_if<!(false), void>::type mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::addInputChangeWithNoise<false>(Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 3, 3, 0, 3, 3> const&, ros::Time const&, std::shared_ptr<mrs_lib::varstepLKF<3, 1, 1> > const&)0
mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::info_t::updateUsing(mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::info_t const&)0
mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::info_t::info_t(ros::Time const&)0
mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::info_t::info_t(ros::Time const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 3, 3, 0, 3, 3> const&, std::shared_ptr<mrs_lib::varstepLKF<3, 1, 1> > const&)0
mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::info_t::info_t(ros::Time const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, std::shared_ptr<mrs_lib::varstepLKF<3, 1, 1> > const&, mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::info_t const&, int const&)0
mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::addInfo(mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::info_t const&, boost::cb_details::iterator<boost::circular_buffer<mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::info_t, std::allocator<mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::info_t> >, boost::cb_details::nonconst_traits<boost::cb_details::allocator_traits<std::allocator<mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::info_t> > > > const&)0
mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::earlier(mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::info_t const&, mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::info_t const&)0
std::enable_if<!(false), mrs_lib::KalmanFilter<3, 1, 1>::statecov_t>::type mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::predictTo<false>(ros::Time const&)0
mrs_lib::Repredictor<mrs_lib::varstepLKF<3, 1, 1>, false>::Repredictor(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, Eigen::Matrix<double, 3, 3, 0, 3, 3> const&, Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, Eigen::Matrix<double, 3, 3, 0, 3, 3> const&, ros::Time const&, std::shared_ptr<mrs_lib::varstepLKF<3, 1, 1> > const&, unsigned int)0
mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::correctFrom(mrs_lib::KalmanFilter<6, 2, 2>::statecov_t const&, mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::info_t const&)0
mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::predictFrom(mrs_lib::KalmanFilter<6, 2, 2>::statecov_t const&, mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::info_t const&, ros::Time const&, ros::Time const&)0
std::enable_if<!(false), void>::type mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::addMeasurement<false>(Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&, ros::Time const&, std::shared_ptr<mrs_lib::varstepLKF<6, 2, 2> > const&, double const&)0
std::enable_if<!(false), void>::type mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::addInputChangeWithNoise<false>(Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 6, 6, 0, 6, 6> const&, ros::Time const&, std::shared_ptr<mrs_lib::varstepLKF<6, 2, 2> > const&)0
mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::info_t::updateUsing(mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::info_t const&)0
mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::info_t::info_t(ros::Time const&)0
mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::info_t::info_t(ros::Time const&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&, std::shared_ptr<mrs_lib::varstepLKF<6, 2, 2> > const&, mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::info_t const&, int const&)0
mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::info_t::info_t(ros::Time const&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 6, 6, 0, 6, 6> const&, std::shared_ptr<mrs_lib::varstepLKF<6, 2, 2> > const&)0
mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::addInfo(mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::info_t const&, boost::cb_details::iterator<boost::circular_buffer<mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::info_t, std::allocator<mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::info_t> >, boost::cb_details::nonconst_traits<boost::cb_details::allocator_traits<std::allocator<mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::info_t> > > > const&)0
mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::earlier(mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::info_t const&, mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::info_t const&)0
std::enable_if<!(false), mrs_lib::KalmanFilter<6, 2, 2>::statecov_t>::type mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::predictTo<false>(ros::Time const&)0
mrs_lib::Repredictor<mrs_lib::varstepLKF<6, 2, 2>, false>::Repredictor(Eigen::Matrix<double, 6, 1, 0, 6, 1> const&, Eigen::Matrix<double, 6, 6, 0, 6, 6> const&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 6, 6, 0, 6, 6> const&, ros::Time const&, std::shared_ptr<mrs_lib::varstepLKF<6, 2, 2> > const&, unsigned int)0
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/repredictor.h.gcov.frameset.html b/mrs_lib/include/mrs_lib/repredictor.h.gcov.frameset.html new file mode 100644 index 0000000000..d18e49adfb --- /dev/null +++ b/mrs_lib/include/mrs_lib/repredictor.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/repredictor.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/include/mrs_lib/repredictor.h.gcov.html b/mrs_lib/include/mrs_lib/repredictor.h.gcov.html new file mode 100644 index 0000000000..7bc40b7c2f --- /dev/null +++ b/mrs_lib/include/mrs_lib/repredictor.h.gcov.html @@ -0,0 +1,637 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/repredictor.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - repredictor.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:10011190.1 %
Date:2024-04-18 23:11:36Functions:204445.5 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : #ifndef REPREDICTOR_H
+       2             : #define REPREDICTOR_H
+       3             : 
+       4             : #include <Eigen/Dense>
+       5             : #include <boost/circular_buffer.hpp>
+       6             : #include <std_msgs/Time.h>
+       7             : #include <functional>
+       8             : #include <ros/ros.h>
+       9             : #include <mrs_lib/utils.h>
+      10             : 
+      11             : namespace mrs_lib
+      12             : {
+      13             :   /**
+      14             :    * \brief Implementation of the Repredictor for fusing measurements with variable delays.
+      15             :    *
+      16             :    * A standard state-space system model is assumed for the repredictor with system inputs and measurements,
+      17             :    * generated from the system state vector. The inputs and measurements may be delayed with varying durations (an older measurement may become available after
+      18             :    * a newer one). A typical use-case scenario is when you have one "fast" but imprecise sensor and one "slow" but precise sensor and you want to use them both
+      19             :    * to get a good prediction (eg. height from the Garmin LiDAR, which comes at 100Hz, and position from a SLAM, which comes at 10Hz with a long delay). If the
+      20             :    * slow sensor is significantly slower than the fast one, fusing its measurement at the time it arrives without taking into account the sensor's delay may
+      21             :    * significantly bias your latest estimate.
+      22             :    *
+      23             :    * To accomodate this, the Repredictor keeps a buffer of N last inputs and measurements (N is specified
+      24             :    * in the constructor). This buffer is then used to re-predict the desired state to a specific time, as
+      25             :    * requested by the user. Note that the re-prediction is evaluated in a lazy manner only when the user requests it,
+      26             :    * so it goes through the whole history buffer every time a prediction is requested.
+      27             :    *
+      28             :    * The Repredictor utilizes a fusion Model (specified as the template parameter), which should implement
+      29             :    * the predict() and correct() methods. This Model is used for fusing the system inputs and measurements
+      30             :    * as well as for predictions. Typically, this Model will be some kind of a Kalman Filter (LKF, UKF etc.).
+      31             :    * \note The Model should be able to accomodate predictions with varying time steps in order for
+      32             :    * the Repredictor to work correctly (see eg. the varstepLKF class).
+      33             :    *
+      34             :    * \tparam Model                  the prediction and correction model (eg. a Kalman Filter).
+      35             :    * \tparam disable_reprediction   if true, reprediction is disabled and the class will act like a dumb LKF (for evaluation purposes).
+      36             :    *
+      37             :    */
+      38             :   template <class Model, bool disable_reprediction=false>
+      39             :   class Repredictor
+      40             :   {
+      41             :   public:
+      42             :     /* states, inputs etc. definitions (typedefs, constants etc) //{ */
+      43             : 
+      44             :     using x_t = typename Model::x_t;                  /*!< \brief State vector type \f$n \times 1\f$ */
+      45             :     using u_t = typename Model::u_t;                  /*!< \brief Input vector type \f$m \times 1\f$ */
+      46             :     using z_t = typename Model::z_t;                  /*!< \brief Measurement vector type \f$p \times 1\f$ */
+      47             :     using P_t = typename Model::P_t;                  /*!< \brief State uncertainty covariance matrix type \f$n \times n\f$ */
+      48             :     using R_t = typename Model::R_t;                  /*!< \brief Measurement noise covariance matrix type \f$p \times p\f$ */
+      49             :     using Q_t = typename Model::Q_t;                  /*!< \brief Process noise covariance matrix type \f$n \times n\f$ */
+      50             :     using statecov_t = typename Model::statecov_t;    /*!< \brief Helper struct for passing around the state and its covariance in one variable */
+      51             :     using ModelPtr = typename std::shared_ptr<Model>; /*!< \brief Shorthand type for a shared pointer-to-Model */
+      52             : 
+      53             :     //}
+      54             : 
+      55             :     /* predictTo() method //{ */
+      56             :     /*!
+      57             :      * \brief Estimates the system state and covariance matrix at the specified time.
+      58             :      *
+      59             :      * The measurement and system input histories are used to estimate the state vector and
+      60             :      * covariance matrix values at the specified time, which are returned.
+      61             :      *
+      62             :      * \param to_stamp   The desired time at which the state vector and covariance matrix should be estimated.
+      63             :      * \return           Returns the estimated state vector and covariance matrix in a single struct.
+      64             :      *
+      65             :      */
+      66             :     template<bool check=disable_reprediction>
+      67         102 :     std::enable_if_t<!check, statecov_t> predictTo(const ros::Time& to_stamp)
+      68             :     {
+      69         102 :       assert(!m_history.empty());
+      70         102 :       auto hist_it = std::begin(m_history);
+      71         102 :       if (hist_it->is_measurement)
+      72             :       {
+      73             :         // if the first history point is measurement, don't use it for correction (to prevent it from being used twice)
+      74           0 :         hist_it->is_measurement = false;
+      75             :       }
+      76             :       // cur_stamp corresponds to the time point of cur_sc estimation
+      77         102 :       auto cur_stamp = hist_it->stamp;
+      78             :       // cur_sc is the current state and covariance estimate
+      79         102 :       auto cur_sc = m_sc;
+      80       15133 :       do
+      81             :       {
+      82       15235 :         cur_sc.stamp = hist_it->stamp;
+      83             :         // do the correction if current history point is a measurement
+      84       15235 :         if ((hist_it->is_measurement))
+      85        5150 :           cur_sc = correctFrom(cur_sc, *hist_it);
+      86             : 
+      87             :         // decide whether to predict to the next history point or straight to the desired stamp already
+      88             :         // (whichever comes sooner or directly to the desired stamp if no further history point is available)
+      89       15235 :         ros::Time next_stamp = to_stamp;
+      90       15235 :         if ((hist_it + 1) != std::end(m_history) && (hist_it + 1)->stamp <= to_stamp)
+      91       15133 :           next_stamp = (hist_it + 1)->stamp;
+      92             : 
+      93             :         // do the prediction
+      94       15235 :         cur_sc = predictFrom(cur_sc, *hist_it, cur_stamp, next_stamp);
+      95       15235 :         cur_stamp = next_stamp;
+      96             : 
+      97             :         // increment the history pointer
+      98       15235 :         hist_it++;
+      99       15235 :       } while (hist_it != std::end(m_history) && hist_it->stamp <= to_stamp);
+     100         102 :       cur_sc.stamp = to_stamp;
+     101         204 :       return cur_sc;
+     102             :     }
+     103             : 
+     104             :     /*!
+     105             :      * \brief Estimates the system state and covariance matrix at the specified time.
+     106             :      *
+     107             :      * The measurement and system input histories are used to estimate the state vector and
+     108             :      * covariance matrix values at the specified time, which are returned.
+     109             :      *
+     110             :      * \param to_stamp   The desired time at which the state vector and covariance matrix should be estimated.
+     111             :      * \return           Returns the estimated state vector and covariance matrix in a single struct.
+     112             :      *
+     113             :      * \note This is the variant of the method when reprediction is disabled and will function like a dumb LKF.
+     114             :      *
+     115             :      */
+     116             :     template<bool check=disable_reprediction>
+     117         606 :     std::enable_if_t<check, statecov_t> predictTo(const ros::Time& to_stamp)
+     118             :     {
+     119         606 :       assert(!m_history.empty());
+     120         606 :       const auto& info = m_history.front();
+     121         606 :       auto sc = predictFrom(m_sc, info, info.stamp, to_stamp);
+     122         606 :       sc.stamp = to_stamp;
+     123         606 :       return sc;
+     124             :     }
+     125             :     //}
+     126             : 
+     127             :     /* addInputChangeWithNoise() method //{ */
+     128             :     /*!
+     129             :      * \brief Adds one system input to the history buffer, removing the oldest element in the buffer if it is full.
+     130             :      *
+     131             :      * \param u      The system input vector to be added.
+     132             :      * \param Q      The process noise covariance matrix.
+     133             :      * \param stamp  Time stamp of the input vector and covariance matrix.
+     134             :      * \param model  Optional pointer to a specific Model to be used with this input (eg. mapping it to different states). If it equals to nullptr, the default
+     135             :      * model specified in the constructor will be used.
+     136             :      *
+     137             :      * \note The system input vector will not be added if it is older than the oldest element in the history buffer.
+     138             :      *
+     139             :      */
+     140             :     template<bool check=disable_reprediction>
+     141         200 :     std::enable_if_t<!check> addInputChangeWithNoise(const u_t& u, const Q_t& Q, const ros::Time& stamp, const ModelPtr& model = nullptr)
+     142             :     {
+     143         400 :       const info_t info(stamp, u, Q, model);
+     144             :       // find the next point in the history buffer
+     145         200 :       const auto next_it = std::lower_bound(std::begin(m_history), std::end(m_history), info, &Repredictor<Model>::earlier);
+     146             :       // add the point to the history buffer
+     147         200 :       const auto added = addInfo(info, next_it);
+     148             :       // update all measurements following the newly added system input up to the next system input
+     149         200 :       if (added != std::end(m_history))
+     150        5871 :         for (auto it = added + 1; it != std::end(m_history) && it->is_measurement; it++)
+     151        5671 :           it->updateUsing(info);
+     152         200 :     }
+     153             : 
+     154             :     /*!
+     155             :      * \brief Adds one system input to the history buffer, removing the oldest element in the buffer if it is full.
+     156             :      *
+     157             :      * \param u      The system input vector to be added.
+     158             :      * \param Q      The process noise covariance matrix.
+     159             :      * \param stamp  Time stamp of the input vector and covariance matrix.
+     160             :      * \param model  Optional pointer to a specific Model to be used with this input (eg. mapping it to different states). If it equals to nullptr, the default
+     161             :      * model specified in the constructor will be used.
+     162             :      *
+     163             :      * \note This is the variant of the method when reprediction is disabled and will function like a dumb LKF.
+     164             :      *
+     165             :      */
+     166             :     template<bool check=disable_reprediction>
+     167         187 :     std::enable_if_t<check> addInputChangeWithNoise(const u_t& u, const Q_t& Q, [[maybe_unused]] const ros::Time& stamp, const ModelPtr& model = nullptr)
+     168             :     {
+     169         187 :       if (m_history.empty())
+     170           2 :         m_history.push_back({stamp});
+     171         187 :       m_history.front().u = u;
+     172         187 :       m_history.front().Q = Q;
+     173         187 :       m_history.front().stamp = stamp;
+     174         187 :       m_history.front().predict_model = model;
+     175         187 :     }
+     176             :     //}
+     177             : 
+     178             :     /* addInputChange() method //{ */
+     179             :     /*!
+     180             :      * \brief Adds one system input to the history buffer, removing the oldest element in the buffer if it is full.
+     181             :      *
+     182             :      * \param u      The system input vector to be added.
+     183             :      * \param stamp  Time stamp of the input vector and covariance matrix.
+     184             :      * \param model  Optional pointer to a specific Model to be used with this input (eg. mapping it to different states). If it equals to nullptr, the default
+     185             :      * model specified in the constructor will be used.
+     186             :      *
+     187             :      * \note The system input vector will not be added if it is older than the oldest element in the history buffer.
+     188             :      *
+     189             :      */
+     190             :     template<bool check=disable_reprediction>
+     191             :     std::enable_if_t<!check> addInputChange(const u_t& u, const ros::Time& stamp, const ModelPtr& model = nullptr)
+     192             :     {
+     193             :       assert(!m_history.empty());
+     194             :       // find the next point in the history buffer
+     195             :       const auto next_it = std::lower_bound(std::begin(m_history), std::end(m_history), stamp, &Repredictor<Model>::earlier);
+     196             :       // get the previous history point (or the first one to avoid out of bounds)
+     197             :       const auto prev_it = next_it == std::begin(m_history) ? next_it : next_it - 1;
+     198             :       // initialize a new history info point
+     199             :       const info_t info(stamp, u, prev_it->Q, model);
+     200             :       // add the point to the history buffer
+     201             :       const auto added = addInfo(info, next_it);
+     202             :       // update all measurements following the newly added system input up to the next system input
+     203             :       if (added != std::end(m_history))
+     204             :         for (auto it = added + 1; it != std::end(m_history) && it->is_measurement; it++)
+     205             :           it->updateUsing(info);
+     206             :     }
+     207             : 
+     208             :     /*!
+     209             :      * \brief Adds one system input to the history buffer, removing the oldest element in the buffer if it is full.
+     210             :      *
+     211             :      * \param u      The system input vector to be added.
+     212             :      * \param stamp  Time stamp of the input vector and covariance matrix.
+     213             :      * \param model  Optional pointer to a specific Model to be used with this input (eg. mapping it to different states). If it equals to nullptr, the default
+     214             :      * model specified in the constructor will be used.
+     215             :      *
+     216             :      * \note This is the variant of the method when reprediction is disabled and will function like a dumb LKF.
+     217             :      *
+     218             :      */
+     219             :     template<bool check=disable_reprediction>
+     220         109 :     std::enable_if_t<check> addInputChange(const u_t& u, [[maybe_unused]] const ros::Time& stamp, const ModelPtr& model = nullptr)
+     221             :     {
+     222         109 :       if (m_history.empty())
+     223           0 :         m_history.push_back({stamp});
+     224         109 :       m_history.front().u = u;
+     225         109 :       m_history.front().stamp = stamp;
+     226         109 :       m_history.front().predict_model = model;
+     227         109 :     }
+     228             :     //}
+     229             : 
+     230             :     /* addProcessNoiseChange() method //{ */
+     231             :     /*!
+     232             :      * \brief Adds one system input to the history buffer, removing the oldest element in the buffer if it is full.
+     233             :      *
+     234             :      * \param Q      The process noise covariance matrix.
+     235             :      * \param stamp  Time stamp of the input vector and covariance matrix.
+     236             :      * \param model  Optional pointer to a specific Model to be used with this covariance matrix (eg. mapping it to different states). If it equals to nullptr,
+     237             :      * the default model specified in the constructor will be used.
+     238             :      *
+     239             :      * \note The new element will not be added if it is older than the oldest element in the history buffer.
+     240             :      *
+     241             :      */
+     242             :     template<bool check=disable_reprediction>
+     243             :     std::enable_if_t<!check> addProcessNoiseChange(const Q_t& Q, const ros::Time& stamp, const ModelPtr& model = nullptr)
+     244             :     {
+     245             :       assert(!m_history.empty());
+     246             :       // find the next point in the history buffer
+     247             :       const auto next_it = std::lower_bound(std::begin(m_history), std::end(m_history), stamp, &Repredictor<Model>::earlier);
+     248             :       // get the previous history point (or the first one to avoid out of bounds)
+     249             :       const auto prev_it = next_it == std::begin(m_history) ? next_it : next_it - 1;
+     250             :       // initialize a new history info point
+     251             :       const info_t info(stamp, prev_it->u, Q, model);
+     252             :       // add the point to the history buffer
+     253             :       const auto added = addInfo(info, next_it);
+     254             :       // update all measurements following the newly added system input up to the next system input
+     255             :       if (added != std::end(m_history))
+     256             :         for (auto it = added + 1; it != std::end(m_history) && it->is_measurement; it++)
+     257             :           it->updateUsing(info);
+     258             :     }
+     259             : 
+     260             :     /*!
+     261             :      * \brief Adds one system input to the history buffer, removing the oldest element in the buffer if it is full.
+     262             :      *
+     263             :      * \param Q      The process noise covariance matrix.
+     264             :      * \param stamp  Time stamp of the input vector and covariance matrix.
+     265             :      * \param model  Optional pointer to a specific Model to be used with this covariance matrix (eg. mapping it to different states). If it equals to nullptr,
+     266             :      * the default model specified in the constructor will be used.
+     267             :      *
+     268             :      * \note This is the variant of the method when reprediction is disabled and will function like a dumb LKF.
+     269             :      *
+     270             :      */
+     271             :     template<bool check=disable_reprediction>
+     272             :     std::enable_if_t<check> addProcessNoiseChange(const Q_t& Q, [[maybe_unused]] const ros::Time& stamp, const ModelPtr& model = nullptr)
+     273             :     {
+     274             :       if (m_history.empty())
+     275             :         m_history.push_back({stamp});
+     276             :       m_history.front().Q = Q;
+     277             :       m_history.front().stamp = stamp;
+     278             :       m_history.front().predict_model = model;
+     279             :     }
+     280             :     //}
+     281             : 
+     282             :     /* addMeasurement() method //{ */
+     283             :     /*!
+     284             :      * \brief Adds one measurement to the history buffer, removing the oldest element in the buffer if it is full.
+     285             :      *
+     286             :      * \param z      The measurement vector to be added.
+     287             :      * \param R      The measurement noise covariance matrix, corresponding to the measurement vector.
+     288             :      * \param stamp  Time stamp of the measurement vector and covariance matrix.
+     289             :      * \param model  Optional pointer to a specific Model to be used with this measurement (eg. mapping it from different states). If it equals to nullptr, the
+     290             :      * default model specified in the constructor will be used.
+     291             :      *
+     292             :      * \note The measurement vector will not be added if it is older than the oldest element in the history buffer.
+     293             :      *
+     294             :      */
+     295             :     template<bool check=disable_reprediction>
+     296         100 :     std::enable_if_t<!check> addMeasurement(const z_t& z, const R_t& R, const ros::Time& stamp, const ModelPtr& model = nullptr, const double& meas_id = -1)
+     297             :     {
+     298         100 :       assert(!m_history.empty());
+     299             :       // helper variable for searching of the next point in the history buffer
+     300         100 :       const auto next_it = std::lower_bound(std::begin(m_history), std::end(m_history), stamp, &Repredictor<Model>::earlier);
+     301             :       // get the previous history point (or the first one to avoid out of bounds)
+     302         100 :       const auto prev_it = next_it == std::begin(m_history) ? next_it : next_it - 1;
+     303             :       // initialize a new history info point
+     304         100 :       const info_t info(stamp, z, R, model, *prev_it, meas_id);
+     305             :       // add the point to the history buffer
+     306         100 :       addInfo(info, next_it);
+     307         100 :     }
+     308             : 
+     309             :     /*!
+     310             :      * \brief Adds one measurement to the history buffer, removing the oldest element in the buffer if it is full.
+     311             :      *
+     312             :      * \param z      The measurement vector to be added.
+     313             :      * \param R      The measurement noise covariance matrix, corresponding to the measurement vector.
+     314             :      * \param stamp  Time stamp of the measurement vector and covariance matrix.
+     315             :      * \param model  Optional pointer to a specific Model to be used with this measurement (eg. mapping it from different states). If it equals to nullptr, the
+     316             :      * default model specified in the constructor will be used.
+     317             :      *
+     318             :      * \note This is the variant of the method when reprediction is disabled and will function like a dumb LKF.
+     319             :      *
+     320             :      */
+     321             :     template<bool check=disable_reprediction>
+     322         303 :     std::enable_if_t<check> addMeasurement(const z_t& z, const R_t& R, const ros::Time& stamp, const ModelPtr& model = nullptr, const double& meas_id = -1)
+     323             :     {
+     324         303 :       if (m_history.empty())
+     325           0 :         m_history.push_back({stamp});
+     326         303 :       auto& info = m_history.front();
+     327         303 :       const ros::Time to_stamp = stamp > info.stamp ? stamp : info.stamp;
+     328         303 :       const auto sc = predictTo(to_stamp);
+     329         303 :       info.z = z;
+     330         303 :       info.R = R;
+     331         303 :       info.stamp = to_stamp;
+     332         303 :       info.is_measurement = true;
+     333         303 :       info.meas_id = meas_id;
+     334         303 :       info.correct_model = model;
+     335         303 :       m_sc = correctFrom(sc, info);
+     336         303 :     }
+     337             :     //}
+     338             : 
+     339             :   public:
+     340             :     /* constructor //{ */
+     341             : 
+     342             :     /*!
+     343             :      * \brief The main constructor.
+     344             :      *
+     345             :      * Initializes the Repredictor with the necessary initial and default values.
+     346             :      *
+     347             :      * \param x0             Initial state.
+     348             :      * \param P0             Covariance matrix of the initial state uncertainty.
+     349             :      * \param u0             Initial system input.
+     350             :      * \param Q0             Default covariance matrix of the process noise.
+     351             :      * \param t0             Time stamp of the initial state.
+     352             :      * \param model          Default prediction and correction model.
+     353             :      * \param hist_len       Length of the history buffer for system inputs and measurements.
+     354             :      */
+     355           3 :     Repredictor(const x_t& x0, const P_t& P0, const u_t& u0, const Q_t& Q0, const ros::Time& t0, const ModelPtr& model, const unsigned hist_len)
+     356           3 :         : m_sc{x0, P0}, m_default_model(model), m_history(history_t(hist_len))
+     357             :     {
+     358           3 :       assert(hist_len > 0);
+     359           3 :       addInputChangeWithNoise(u0, Q0, t0, model);
+     360           3 :     };
+     361             : 
+     362             :     /*!
+     363             :      * \brief Empty constructor.
+     364             :      *
+     365             :      */
+     366             :     Repredictor(){};
+     367             : 
+     368             :     /*!
+     369             :      * \brief Variation of the constructor for cases without a system input.
+     370             :      *
+     371             :      * Initializes the Repredictor with the necessary initial and default values.
+     372             :      * Assumes the system input is zero at t0.
+     373             :      *
+     374             :      * \param x0             Initial state.
+     375             :      * \param P0             Covariance matrix of the initial state uncertainty.
+     376             :      * \param Q0             Default covariance matrix of the process noise.
+     377             :      * \param t0             Time stamp of the initial state.
+     378             :      * \param model          Default prediction and correction model.
+     379             :      * \param hist_len       Length of the history buffer for system inputs and measurements.
+     380             :      */
+     381             :     Repredictor(const x_t& x0, const P_t& P0, const Q_t& Q0, const ros::Time& t0, const ModelPtr& model, const unsigned hist_len)
+     382             :         : m_sc{x0, P0}, m_default_model(model), m_history(history_t(hist_len))
+     383             :     {
+     384             :       assert(hist_len > 0);
+     385             :       const u_t u0{0};
+     386             :       addInputChangeWithNoise(u0, Q0, t0, model);
+     387             :     };
+     388             :     //}
+     389             : 
+     390             :   protected:
+     391             :     // state and covariance corresponding to the oldest element in the history buffer
+     392             :     statecov_t m_sc;
+     393             :     // default model to use for updates
+     394             :     ModelPtr m_default_model;
+     395             : 
+     396             :   private:
+     397             :     /* helper structs and usings //{ */
+     398             : 
+     399             :     struct info_t
+     400             :     {
+     401             :       ros::Time stamp;
+     402             : 
+     403             :       // system input-related information
+     404             :       u_t u;
+     405             :       Q_t Q;
+     406             :       ModelPtr predict_model;
+     407             : 
+     408             :       // measurement-related information (unused in case is_measurement=false)
+     409             :       z_t z;
+     410             :       R_t R;
+     411             :       ModelPtr correct_model;
+     412             :       bool is_measurement;
+     413             :       int meas_id;
+     414             : 
+     415             :       // constructor for a dummy info (for searching in the history)
+     416         625 :       info_t(const ros::Time& stamp) : stamp(stamp), is_measurement(false){};
+     417             : 
+     418             :       // constructor for a system input
+     419         200 :       info_t(const ros::Time& stamp, const u_t& u, const Q_t& Q, const ModelPtr& model)
+     420         200 :           : stamp(stamp), u(u), Q(Q), predict_model(model), is_measurement(false){};
+     421             : 
+     422             :       // constructor for a measurement
+     423         100 :       info_t(const ros::Time& stamp, const z_t& z, const R_t& R, const ModelPtr& model, const info_t& prev_info, const int& meas_id)
+     424         100 :           : stamp(stamp), z(z), R(R), correct_model(model), is_measurement(true), meas_id(meas_id)
+     425             :       {
+     426         100 :         updateUsing(prev_info);
+     427         100 :       };
+     428             : 
+     429             :       // copy system input-related information from a previous info
+     430        5771 :       void updateUsing(const info_t& info)
+     431             :       {
+     432        5771 :         u = info.u;
+     433        5771 :         Q = info.Q;
+     434        5771 :         predict_model = info.predict_model;
+     435        5771 :       };
+     436             :     };
+     437             : 
+     438             : 
+     439             :     //}
+     440             : 
+     441             :   protected:
+     442             :     using history_t = boost::circular_buffer<info_t>;
+     443             :     // the history buffer
+     444             :     history_t m_history;
+     445             : 
+     446             :     // | ---------------- helper debugging methods ---------------- |
+     447             :     /* checkMonotonicity() method //{ */
+     448             :     template <typename T>
+     449             :     bool checkMonotonicity(const T& buf)
+     450             :     {
+     451             :       if (buf.empty())
+     452             :         return true;
+     453             :       for (auto it = std::begin(buf) + 1; it != std::end(buf); it++)
+     454             :         if (earlier(*it, *(it - 1)))
+     455             :           return false;
+     456             :       return true;
+     457             :     }
+     458             :     //}
+     459             : 
+     460             :     /* printBuffer() method //{ */
+     461             :     template <typename T>
+     462             :     void printBuffer(const T& buf)
+     463             :     {
+     464             :       if (buf.empty())
+     465             :         return;
+     466             :       const auto first_stamp = buf.front().stamp;
+     467             :       std::cerr << "first stamp: " << first_stamp << std::endl;
+     468             :       for (size_t it = 0; it < buf.size(); it++)
+     469             :       {
+     470             :         std::cerr << it << ":\t" << buf.at(it).stamp - first_stamp << std::endl;
+     471             :       }
+     472             :     }
+     473             :     //}
+     474             : 
+     475             :   private:
+     476             :     // | -------------- helper implementation methods ------------- |
+     477             : 
+     478             :     /* addInfo() method //{ */
+     479         300 :     typename history_t::iterator addInfo(const info_t& info, const typename history_t::iterator& next_it)
+     480             :     {
+     481             :       // check if the new element would be added before the first element of the history buffer and ignore it if so
+     482         300 :       if (next_it == std::begin(m_history) && !m_history.empty())
+     483             :       {
+     484           0 :         ROS_WARN_STREAM_THROTTLE(1.0, "[Repredictor]: Added history point is older than the oldest by "
+     485             :                                           << (next_it->stamp - info.stamp).toSec()
+     486             :                                           << "s. Ignoring it! Consider increasing the history buffer size (currently: " << m_history.size() << ")");
+     487           0 :         return std::end(m_history);
+     488             :       }
+     489             : 
+     490             :       // check if adding a new element would throw out the oldest one
+     491         300 :       if (m_history.size() == m_history.capacity())
+     492             :       {  // if so, first update m_sc
+     493             :         // figure out, what will be the oldest element in the buffer after inserting the newly received one
+     494           0 :         auto new_oldest = m_history.front();
+     495           0 :         if (m_history.size() == 1 || (m_history.size() > 1 && info.stamp > m_history.at(0).stamp && info.stamp < m_history.at(1).stamp))
+     496             :         {
+     497           0 :           new_oldest = info;
+     498           0 :         } else if (m_history.size() > 1)
+     499             :         {
+     500           0 :           new_oldest = m_history.at(1);
+     501             :         }
+     502             :         // update m_sc to the time of the new oldest element (after inserting the new element)
+     503           0 :         m_sc = predictTo(new_oldest.stamp);
+     504             :         // insert the new element into the history buffer, causing the original oldest element to be removed
+     505             :       }
+     506             : 
+     507             :       // add the new point finally
+     508         300 :       const auto ret = m_history.insert(next_it, info);
+     509             :       /* debug check //{ */
+     510             : 
+     511             : #ifdef REPREDICTOR_DEBUG
+     512             :       if (!checkMonotonicity(m_history))
+     513             :       {
+     514             :         std::cerr << "History buffer is not monotonous after modification!" << std::endl;
+     515             :       }
+     516             :       std::cerr << "Added info (" << m_history.size() << " total)" << std::endl;
+     517             : #endif
+     518             : 
+     519             :       //}
+     520         300 :       return ret;
+     521             :     }
+     522             :     //}
+     523             : 
+     524             :     /* earlier() method //{ */
+     525        2053 :     static bool earlier(const info_t& ob1, const info_t& ob2)
+     526             :     {
+     527        2053 :       return ob1.stamp < ob2.stamp;
+     528             :     }
+     529             :     //}
+     530             : 
+     531             :     /* predictFrom() method //{ */
+     532       15841 :     statecov_t predictFrom(const statecov_t& sc, const info_t& inpt, const ros::Time& from_stamp, const ros::Time& to_stamp)
+     533             :     {
+     534       31682 :       const auto model = inpt.predict_model == nullptr ? m_default_model : inpt.predict_model;
+     535       15841 :       const auto dt = (to_stamp - from_stamp).toSec();
+     536       31682 :       return model->predict(sc, inpt.u, inpt.Q, dt);
+     537             :     }
+     538             :     //}
+     539             : 
+     540             :     /* correctFrom() method //{ */
+     541        5453 :     statecov_t correctFrom(const statecov_t& sc, const info_t& meas)
+     542             :     {
+     543        5453 :       assert(meas.is_measurement);
+     544       10906 :       const auto model = meas.correct_model == nullptr ? m_default_model : meas.correct_model;
+     545        5453 :       auto sc_tmp = sc;
+     546       10906 :       return model->correct(sc_tmp, meas.z, meas.R);
+     547             :     }
+     548             :     //}
+     549             :   };
+     550             : }  // namespace mrs_lib
+     551             : 
+     552             : 
+     553             : #endif  // REPREDICTOR_H
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/repredictor.h.gcov.overview.html b/mrs_lib/include/mrs_lib/repredictor.h.gcov.overview.html new file mode 100644 index 0000000000..a170247acb --- /dev/null +++ b/mrs_lib/include/mrs_lib/repredictor.h.gcov.overview.html @@ -0,0 +1,159 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/repredictor.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/include/mrs_lib/repredictor.h.gcov.png b/mrs_lib/include/mrs_lib/repredictor.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..aa92389ebb5f6d1f6a537e734264aed4e4dcf929 GIT binary patch literal 2387 zcmV-Z39R;sP)@QT39+@`)}ol^*Y#&#K6GpjduqED3YwtlAkO&=ag$p%e1)x z-EG4Kh|&$1r|=D+594vK32+YQC+%*TBz`Dvzdqcm0}yRzNOXzsB({2S1N4%H4W%He zcS9niNl_x{?MkRYeS<83+owbrxBoy~CE~V1^X;$!-aaJa9N&|mWDsG8OJx%AnM#Gr}MKUa$Cml!nN$LMIhy#yjdy+t-K@DKM;xB_%e2 zn69-8hyq0VpsG?pdE-ujDhNqKGKOe12`Yd@y#^we=tpaJD4k?^WXk|!i=a*%=`}e8 zwQNnI%Y?EQv>eB*=8=WYTy`&MjpV{6eH7!KXE_ zZb&$t&Ze#AmEKEzIo$xu$d6cE@EIBBYt)JT>; zxAs@t^?G~x(`g&vwfDmv;KJS|1ELPX%oBk)qjS`k2( z9Nhvxo!BalJ9FzzLEg6u>_(~mTlGc)Y%Fbz@zh$`+OxF9(~%0uIz-a}t3}b|_PVID zlLR^qcW8Cnm58Sp5lzH{K*e;w3W{#ruBF%XWhny*MSIO*YZ7^g@?PF*l8p+LxuGS+ zHKVEdfK!pq5ysnJA-30|QHn)h*p@WxjkPBjNg9Wwoe?+Ce#h(Y90UoH~$j{EG?&Zqz`=1c%h>+ZZCXU9!_nNjz|4keNY1> z7sFU{#hh!a@omwTxY`*3N)?{&t&(_5U^r|&Fz*3nFa|rY;#9@LUT7j0N1eUcf_`m! zOlf27I!^+{o2Nj0;`&bL>W+4^UQ=tFL~vu?+lRd8+}I@bwP_J>SVsI+B^d`7{Lgt zPUR;VNoZgZ_Fy!zA@!)@>kLPR$9b0xkGi@!0JVm1<~GgYj1($p(PF7 z;!^kxckvVkY%rQ-1uPrzMGK!I46V~el4c>NkR*)|g3B)V2zr1YvZV1FDZUyhJ~;z8 zm{pLsx6djZZGAXdcRkB4ua*7WZk|$%#dLXyaa*GF^f~}|yz^o|mvXQp{d-K_)2w@$kB?YRrdks-cCe}pj>NE6qs>)3y3mk?j$M_iUMu zb-XSdV!N>yqtPR|*_O|^0GTG`Djj!qllB3|lMgkgA)pgsbkKa#NlC=`z&_Gu|0mC+ zsVjI%`y&NtPM7(3S{Gx4^vgraPmL66W=V9c=OH!Ut)PijXR^55whHE?EVNTPK4Y8) zQG3vv%mVCB&Mt1Rdiq?7->0*d_F8Q4_$8WWl;DvL7Znr92$M49B;vY%w^X4X{-VLe5xk>Z`5QD%-wKULGV1^}-3 zbJi-Kpd>+(GdRuOSgAfk2W=YCX(Xc#>H8}D%$s71B#os>9nIzAJPt+w5+0-H;z$J( zK=+Y6S0nKxHFC+PcyPAj5ksLPh6B?6UYA~m{v|-E6(-V*$kACVyrR7`RiJEopN`#e zG{`^uw3D9!50A2{FXk($ZpL|5;n9p9le6q%|3^7OGw{%(I=U^su;_sF>#!_P<=ET2Hy811}w78vBL0uX6BD~q7E|_+hw6RXA%%;Br$|Q|zg#=D3s@uYEa1XW2#Hul#oTyL1<0Za-kV@WtPuXd%mlN|iH{ zz9{9vvmYW4i3lkhA0A z2DZLbwksBXSNGv4r+K-VRmw>+!WIPRz*{{y3d#5}|UW#|9^002ovPDHLk FV1iP8dXNAB literal 0 HcmV?d00001 diff --git a/mrs_lib/include/mrs_lib/safety_zone/index-detail-sort-f.html b/mrs_lib/include/mrs_lib/safety_zone/index-detail-sort-f.html new file mode 100644 index 0000000000..7c9bd1139e --- /dev/null +++ b/mrs_lib/include/mrs_lib/safety_zone/index-detail-sort-f.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/safety_zone + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/safety_zoneHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:080.0 %
Date:2024-04-18 23:11:36Functions:040.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
safety_zone.h +
0.0%
+
0.0 %0 / 20.0 %0 / 1
polygon.h +
0.0%
+
0.0 %0 / 60.0 %0 / 3
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/safety_zone/index-detail-sort-l.html b/mrs_lib/include/mrs_lib/safety_zone/index-detail-sort-l.html new file mode 100644 index 0000000000..85fa9f79ea --- /dev/null +++ b/mrs_lib/include/mrs_lib/safety_zone/index-detail-sort-l.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/safety_zone + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/safety_zoneHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:080.0 %
Date:2024-04-18 23:11:36Functions:040.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
safety_zone.h +
0.0%
+
0.0 %0 / 20.0 %0 / 1
polygon.h +
0.0%
+
0.0 %0 / 60.0 %0 / 3
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/safety_zone/index-detail.html b/mrs_lib/include/mrs_lib/safety_zone/index-detail.html new file mode 100644 index 0000000000..e7272a022b --- /dev/null +++ b/mrs_lib/include/mrs_lib/safety_zone/index-detail.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/safety_zone + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/safety_zoneHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:080.0 %
Date:2024-04-18 23:11:36Functions:040.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
polygon.h +
0.0%
+
0.0 %0 / 60.0 %0 / 3
safety_zone.h +
0.0%
+
0.0 %0 / 20.0 %0 / 1
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/safety_zone/index-sort-f.html b/mrs_lib/include/mrs_lib/safety_zone/index-sort-f.html new file mode 100644 index 0000000000..f8c2b1b3b8 --- /dev/null +++ b/mrs_lib/include/mrs_lib/safety_zone/index-sort-f.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/safety_zone + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/safety_zoneHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:080.0 %
Date:2024-04-18 23:11:36Functions:040.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
safety_zone.h +
0.0%
+
0.0 %0 / 20.0 %0 / 1
polygon.h +
0.0%
+
0.0 %0 / 60.0 %0 / 3
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/safety_zone/index-sort-l.html b/mrs_lib/include/mrs_lib/safety_zone/index-sort-l.html new file mode 100644 index 0000000000..eae5b86605 --- /dev/null +++ b/mrs_lib/include/mrs_lib/safety_zone/index-sort-l.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/safety_zone + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/safety_zoneHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:080.0 %
Date:2024-04-18 23:11:36Functions:040.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
safety_zone.h +
0.0%
+
0.0 %0 / 20.0 %0 / 1
polygon.h +
0.0%
+
0.0 %0 / 60.0 %0 / 3
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/safety_zone/index.html b/mrs_lib/include/mrs_lib/safety_zone/index.html new file mode 100644 index 0000000000..d059f2a590 --- /dev/null +++ b/mrs_lib/include/mrs_lib/safety_zone/index.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/safety_zone + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/safety_zoneHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:080.0 %
Date:2024-04-18 23:11:36Functions:040.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
polygon.h +
0.0%
+
0.0 %0 / 60.0 %0 / 3
safety_zone.h +
0.0%
+
0.0 %0 / 20.0 %0 / 1
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/safety_zone/polygon.h.func-sort-c.html b/mrs_lib/include/mrs_lib/safety_zone/polygon.h.func-sort-c.html new file mode 100644 index 0000000000..36bde902c2 --- /dev/null +++ b/mrs_lib/include/mrs_lib/safety_zone/polygon.h.func-sort-c.html @@ -0,0 +1,92 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/safety_zone/polygon.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/safety_zone - polygon.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:060.0 %
Date:2024-04-18 23:11:36Functions:030.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::Polygon::ExtraVertices::what() const0
mrs_lib::Polygon::WrongNumberOfColumns::what() const0
mrs_lib::Polygon::WrongNumberOfVertices::what() const0
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/safety_zone/polygon.h.func.html b/mrs_lib/include/mrs_lib/safety_zone/polygon.h.func.html new file mode 100644 index 0000000000..18b69322a8 --- /dev/null +++ b/mrs_lib/include/mrs_lib/safety_zone/polygon.h.func.html @@ -0,0 +1,92 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/safety_zone/polygon.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/safety_zone - polygon.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:060.0 %
Date:2024-04-18 23:11:36Functions:030.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::Polygon::ExtraVertices::what() const0
mrs_lib::Polygon::WrongNumberOfColumns::what() const0
mrs_lib::Polygon::WrongNumberOfVertices::what() const0
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/safety_zone/polygon.h.gcov.frameset.html b/mrs_lib/include/mrs_lib/safety_zone/polygon.h.gcov.frameset.html new file mode 100644 index 0000000000..8b592d08da --- /dev/null +++ b/mrs_lib/include/mrs_lib/safety_zone/polygon.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/safety_zone/polygon.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/include/mrs_lib/safety_zone/polygon.h.gcov.html b/mrs_lib/include/mrs_lib/safety_zone/polygon.h.gcov.html new file mode 100644 index 0000000000..cb19582a7d --- /dev/null +++ b/mrs_lib/include/mrs_lib/safety_zone/polygon.h.gcov.html @@ -0,0 +1,136 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/safety_zone/polygon.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/safety_zone - polygon.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:060.0 %
Date:2024-04-18 23:11:36Functions:030.0 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : // clang: TomasFormat
+       2             : #ifndef MRS_LIB_POLYGON_H
+       3             : #define MRS_LIB_POLYGON_H
+       4             : 
+       5             : #include <ros/ros.h>
+       6             : #include <eigen3/Eigen/Eigen>
+       7             : #include <vector>
+       8             : #include <geometry_msgs/Point.h>
+       9             : #include <mrs_lib/safety_zone/line_operations.h>
+      10             : 
+      11             : namespace mrs_lib
+      12             : {
+      13             : class Polygon {
+      14             : public:
+      15             :   Polygon(const Eigen::MatrixXd vertices);
+      16             : 
+      17             :   bool isPointInside(const double px, const double py);
+      18             :   bool doesSectionIntersect(const double startX, const double startY, const double endX, const double endY);
+      19             :   bool isClockwise();
+      20             :   void inflateSelf(double amount);
+      21             : 
+      22             :   std::vector<geometry_msgs::Point> getPointMessageVector(const double z);
+      23             : 
+      24             : private:
+      25             :   Eigen::MatrixXd vertices;
+      26             : 
+      27             : public:
+      28             :   // exceptions
+      29             :   struct WrongNumberOfVertices : public std::exception
+      30             :   {
+      31           0 :     const char* what() const throw() {
+      32           0 :       return "Polygon: wrong number of vertices was supplied!";
+      33             :     }
+      34             :   };
+      35             : 
+      36             :   struct WrongNumberOfColumns : public std::exception
+      37             :   {
+      38           0 :     const char* what() const throw() {
+      39           0 :       return "Polygon: wrong number of colums, it should be =2!";
+      40             :     }
+      41             :   };
+      42             : 
+      43             :   struct ExtraVertices : public std::exception
+      44             :   {
+      45           0 :     const char* what() const throw() {
+      46           0 :       return "Polygon: useless vertices detected, polygon methods may break!";
+      47             :     }
+      48             :   };
+      49             : };
+      50             : }  // namespace mrs_lib
+      51             : 
+      52             : #endif  // MRS_LIB_POLYGON_H
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/safety_zone/polygon.h.gcov.overview.html b/mrs_lib/include/mrs_lib/safety_zone/polygon.h.gcov.overview.html new file mode 100644 index 0000000000..3a568cf9a5 --- /dev/null +++ b/mrs_lib/include/mrs_lib/safety_zone/polygon.h.gcov.overview.html @@ -0,0 +1,33 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/safety_zone/polygon.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/include/mrs_lib/safety_zone/polygon.h.gcov.png b/mrs_lib/include/mrs_lib/safety_zone/polygon.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..69c6e8249f4419ea60e73f57611e818597436175 GIT binary patch literal 337 zcmeAS@N?(olHy`uVBq!ia0vp^0YGfR!VDzeM=iPpq$C1-LR|m<|Gx?dmcNgUef6J# zVHHpuOr7)IycEdhEbxddW?X?_wfUrhg7-aL978-h&xUsL9#P=QHuETJ;yv_l zwT!=jKeuP;+m|{aEh%#nda48j6jdK=WDT9?W-5Hv!)wCVGcHRjR9F4&?V8P&wrH0l zYv;tQ{4dKZToN)kHmM>qTYD`~>&gdj!ff zE*HJCIw^nk`X48Z_Xu(sh{@jPaWKwMisF9|!!gJGLnX`mbpoC13bZDEZu)%9qTFR) zh=ryc|B=)~3H(aB&40A3ZBDmKf0Tc7Q$_t@YPE{xr-x#T&EFW_?r3;s-?6d8WIJoo b+20JO`5O;uuKc40^eTg=tDnm{r-UW|8XSfQ literal 0 HcmV?d00001 diff --git a/mrs_lib/include/mrs_lib/safety_zone/safety_zone.h.func-sort-c.html b/mrs_lib/include/mrs_lib/safety_zone/safety_zone.h.func-sort-c.html new file mode 100644 index 0000000000..2eb3cdde0b --- /dev/null +++ b/mrs_lib/include/mrs_lib/safety_zone/safety_zone.h.func-sort-c.html @@ -0,0 +1,84 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/safety_zone/safety_zone.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/safety_zone - safety_zone.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:020.0 %
Date:2024-04-18 23:11:36Functions:010.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::SafetyZone::BorderError::what() const0
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/safety_zone/safety_zone.h.func.html b/mrs_lib/include/mrs_lib/safety_zone/safety_zone.h.func.html new file mode 100644 index 0000000000..03d828ed08 --- /dev/null +++ b/mrs_lib/include/mrs_lib/safety_zone/safety_zone.h.func.html @@ -0,0 +1,84 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/safety_zone/safety_zone.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/safety_zone - safety_zone.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:020.0 %
Date:2024-04-18 23:11:36Functions:010.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::SafetyZone::BorderError::what() const0
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/safety_zone/safety_zone.h.gcov.frameset.html b/mrs_lib/include/mrs_lib/safety_zone/safety_zone.h.gcov.frameset.html new file mode 100644 index 0000000000..b372dc445a --- /dev/null +++ b/mrs_lib/include/mrs_lib/safety_zone/safety_zone.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/safety_zone/safety_zone.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/include/mrs_lib/safety_zone/safety_zone.h.gcov.html b/mrs_lib/include/mrs_lib/safety_zone/safety_zone.h.gcov.html new file mode 100644 index 0000000000..ecf1175172 --- /dev/null +++ b/mrs_lib/include/mrs_lib/safety_zone/safety_zone.h.gcov.html @@ -0,0 +1,121 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/safety_zone/safety_zone.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib/safety_zone - safety_zone.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:020.0 %
Date:2024-04-18 23:11:36Functions:010.0 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : // clang: TomasFormat
+       2             : #ifndef MRS_LIB_SAFETYZONE_H
+       3             : #define MRS_LIB_SAFETYZONE_H
+       4             : 
+       5             : #include <mrs_lib/safety_zone/polygon.h>
+       6             : #include <visualization_msgs/Marker.h>
+       7             : #include <eigen3/Eigen/Eigen>
+       8             : #include <vector>
+       9             : 
+      10             : namespace mrs_lib
+      11             : {
+      12             : class SafetyZone {
+      13             : public:
+      14             :   SafetyZone(Polygon outerBorder);
+      15             :   ~SafetyZone();
+      16             : 
+      17             :   SafetyZone(const Eigen::MatrixXd& outerBorderMatrix);
+      18             : 
+      19             :   bool isPointValid(const double px, const double py);
+      20             :   bool isPathValid(const double p1x, const double p1y, const double p2x, const double p2y);
+      21             : 
+      22             :   Polygon getBorder();
+      23             : 
+      24             : private:
+      25             :   Polygon* outerBorder;
+      26             : 
+      27             : public:
+      28             :   struct BorderError : public std::exception
+      29             :   {
+      30           0 :     const char* what() const throw() {
+      31           0 :       return "SafeZone: Wrong configuration for the border";
+      32             :     }
+      33             :   };
+      34             : };
+      35             : }  // namespace mrs_lib
+      36             : 
+      37             : #endif  // MRS_LIB_SAFETYZONE_H
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/safety_zone/safety_zone.h.gcov.overview.html b/mrs_lib/include/mrs_lib/safety_zone/safety_zone.h.gcov.overview.html new file mode 100644 index 0000000000..20ffd7de34 --- /dev/null +++ b/mrs_lib/include/mrs_lib/safety_zone/safety_zone.h.gcov.overview.html @@ -0,0 +1,30 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/safety_zone/safety_zone.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/include/mrs_lib/safety_zone/safety_zone.h.gcov.png b/mrs_lib/include/mrs_lib/safety_zone/safety_zone.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..1b39b2911483785bd7a8e252290372648cd02641 GIT binary patch literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^0YI$E!VDzUFBHE4QW60^A+G=b|6c_J%iqVwzWUF= zunH&+rp|e9UJ7J$7I;J!GcfQS0b$0e+I-SL!DXH$Xhoi1$?<^|$XXd{aqZ z@a?+Nrut{KJqP__-W)l)eS=`_BawZ+ioN1V8Co_XvbSaKZg6;E-mvA~rPO(wMHgk6 VNwG-e^8j7U;OXk;vd$@?2>?zzaFhT5 literal 0 HcmV?d00001 diff --git a/mrs_lib/include/mrs_lib/scope_timer.h.func-sort-c.html b/mrs_lib/include/mrs_lib/scope_timer.h.func-sort-c.html new file mode 100644 index 0000000000..99c0967259 --- /dev/null +++ b/mrs_lib/include/mrs_lib/scope_timer.h.func-sort-c.html @@ -0,0 +1,92 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/scope_timer.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - scope_timer.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:2633.3 %
Date:2024-04-18 23:11:36Functions:1333.3 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::ScopeTimerLogger::loggingEnabled()0
mrs_lib::ScopeTimerLogger::shouldLog()0
mrs_lib::ScopeTimer::time_point::time_point(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)5161631
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/scope_timer.h.func.html b/mrs_lib/include/mrs_lib/scope_timer.h.func.html new file mode 100644 index 0000000000..928c0b87ef --- /dev/null +++ b/mrs_lib/include/mrs_lib/scope_timer.h.func.html @@ -0,0 +1,92 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/scope_timer.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - scope_timer.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:2633.3 %
Date:2024-04-18 23:11:36Functions:1333.3 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::ScopeTimer::time_point::time_point(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)5161631
mrs_lib::ScopeTimerLogger::loggingEnabled()0
mrs_lib::ScopeTimerLogger::shouldLog()0
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/scope_timer.h.gcov.frameset.html b/mrs_lib/include/mrs_lib/scope_timer.h.gcov.frameset.html new file mode 100644 index 0000000000..bb60579787 --- /dev/null +++ b/mrs_lib/include/mrs_lib/scope_timer.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/scope_timer.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/include/mrs_lib/scope_timer.h.gcov.html b/mrs_lib/include/mrs_lib/scope_timer.h.gcov.html new file mode 100644 index 0000000000..bc0a2e2bd4 --- /dev/null +++ b/mrs_lib/include/mrs_lib/scope_timer.h.gcov.html @@ -0,0 +1,248 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/scope_timer.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - scope_timer.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:2633.3 %
Date:2024-04-18 23:11:36Functions:1333.3 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : /**  \file
+       2             :  *   \brief Simple timer which times a duration of its scope, with additional optional checkpoints.
+       3             :  *   \author Daniel Hert - hertdani@fel.cvut.cz
+       4             :  */
+       5             : #ifndef SCOPE_TIMER_H
+       6             : #define SCOPE_TIMER_H
+       7             : 
+       8             : #include <ros/ros.h>
+       9             : #include <chrono>
+      10             : #include <iostream>
+      11             : #include <fstream>
+      12             : #include <iomanip>
+      13             : #include <mutex>
+      14             : /* #include <ctime> */
+      15             : 
+      16             : namespace mrs_lib
+      17             : {
+      18             : 
+      19             : /*//{ ScopeTimerLogger class */
+      20             : 
+      21             : /**
+      22             :  * @brief Simple file logger of scope timer and its checkpoints
+      23             :  */
+      24             : class ScopeTimerLogger {
+      25             : 
+      26             : public:
+      27             :   /**
+      28             :    * @brief The basic constructor with a user-defined path to the logger file, enable flag and float-logging precision
+      29             :    */
+      30             :   ScopeTimerLogger(const std::string& logfile, const bool enable_logging = true, const int log_precision = 10);
+      31             : 
+      32             :   /**
+      33             :    * @brief The basic destructor which closes the logging file
+      34             :    */
+      35             :   ~ScopeTimerLogger();
+      36             : 
+      37             :   /**
+      38             :    * @brief Returns true if a non-empty path to a logger file was given by the user
+      39             :    */
+      40           0 :   bool shouldLog() {
+      41           0 :     return _should_log_;
+      42             :   }
+      43             : 
+      44             :   /**
+      45             :    * @brief Returns true if the enable flag was set to true, a non-empty path to a logger file was given by the user and the logger file stream was successfully
+      46             :    * opened.
+      47             :    */
+      48           0 :   bool loggingEnabled() {
+      49           0 :     return _logging_enabled_;
+      50             :   }
+      51             : 
+      52             :   /**
+      53             :    * @brief Returns the path to the log.
+      54             :    */
+      55             :   std::string getLogFilepath() {
+      56             :     return _log_filepath_;
+      57             :   }
+      58             : 
+      59             :   using chrono_tp = std::chrono::time_point<std::chrono::steady_clock>;
+      60             : 
+      61             :   /**
+      62             :    * @brief Writes the time data of the given scope and empty checkpoints into the logger stream.
+      63             :    */
+      64             :   void log(const std::string& scope, const chrono_tp& time_start, const chrono_tp& time_end);
+      65             : 
+      66             :   /**
+      67             :    * @brief Writes the time data of the given scope and checkpoint labels into the logger stream.
+      68             :    */
+      69             :   void log(const std::string& scope, const std::string& label_from, const std::string& label_to, const chrono_tp& time_start, const chrono_tp& time_end);
+      70             : 
+      71             : private:
+      72             :   bool          _logging_enabled_ = false;
+      73             :   bool          _should_log_      = false;
+      74             :   std::string   _log_filepath_;
+      75             :   std::ofstream _logstream_;
+      76             :   std::mutex    _mutex_logstream_;
+      77             : };
+      78             : 
+      79             : /*//}*/
+      80             : 
+      81             : /**
+      82             :  * @brief Simple timer which will time a duration of a scope and checkpoints inside the scope in ros time and std::chrono time.
+      83             :  */
+      84             : class ScopeTimer {
+      85             : public:
+      86             :   /* time_point() helper struct //{ */
+      87             :   struct time_point
+      88             :   {
+      89             :     using chrono_tp = std::chrono::time_point<std::chrono::steady_clock>;
+      90             : 
+      91             :   public:
+      92     5161631 :     time_point(const std::string& label) : ros_time(ros::Time::now()), chrono_time(std::chrono::steady_clock::now()), label(label) {
+      93     5161380 :     }
+      94             : 
+      95             :     time_point(const std::string& label, const ros::Time& ros_time) : ros_time(ros_time), label(label) {
+      96             :       // helper types to make the code slightly more readable
+      97             :       using float_seconds   = std::chrono::duration<float>;
+      98             :       using chrono_duration = std::chrono::steady_clock::duration;
+      99             :       // prepare ros and chrono current times to minimize their difference
+     100             :       const auto ros_now    = ros::Time::now();
+     101             :       const auto chrono_now = std::chrono::steady_clock::now();
+     102             :       // calculate how old is ros_time
+     103             :       const auto ros_dt = ros_now - ros_time;
+     104             :       // cast ros_dt to chrono type
+     105             :       const auto chrono_dt = std::chrono::duration_cast<chrono_duration>(float_seconds(ros_dt.toSec()));
+     106             :       // calculate ros_time in chrono time and set it to chrono_time
+     107             :       chrono_time = chrono_now - chrono_dt;
+     108             :     }
+     109             : 
+     110             :     ros::Time   ros_time;
+     111             :     chrono_tp   chrono_time;
+     112             :     std::string label;
+     113             :   };
+     114             :   //}
+     115             : 
+     116             : public:
+     117             :   /**
+     118             :    * @brief The basic constructor with a user-defined label of the timer, throttled period and file logger.
+     119             :    */
+     120             :   ScopeTimer(const std::string& label, const ros::Duration& throttle_period = ros::Duration(0), const bool enable = true,
+     121             :              const std::shared_ptr<ScopeTimerLogger> scope_timer_logger = nullptr);
+     122             : 
+     123             :   /**
+     124             :    * @brief The basic constructor with a user-defined label of the timer and a pre-start time, which will also be measured.
+     125             :    */
+     126             :   ScopeTimer(const std::string& label, const time_point& tp0, const ros::Duration& throttle_period = ros::Duration(0), const bool enable = true,
+     127             :              const std::shared_ptr<ScopeTimerLogger> scope_timer_logger = nullptr);
+     128             : 
+     129             :   /**
+     130             :    * @brief The basic constructor with a user-defined label of the timer and file logger.
+     131             :    */
+     132             :   ScopeTimer(const std::string& label, const std::shared_ptr<ScopeTimerLogger> scope_timer_logger, const bool enable = true);
+     133             : 
+     134             :   /**
+     135             :    * @brief Checkpoint, prints the time passed until the point this function is called.
+     136             :    */
+     137             :   void checkpoint(const std::string& label);
+     138             : 
+     139             :   /**
+     140             :    * @brief Getter for scope timer lifetime
+     141             :    *
+     142             :    * @return lifetime as floating point milliseconds
+     143             :    */
+     144             :   float getLifetime();
+     145             : 
+     146             :   /**
+     147             :    * @brief The basic destructor which prints out or logs the scope times, if enabled.
+     148             :    */
+     149             :   ~ScopeTimer();
+     150             : 
+     151             : private:
+     152             :   std::string             _timer_label_;
+     153             :   bool                    _enable_print_or_log;
+     154             :   ros::Duration           _throttle_period_;
+     155             :   std::vector<time_point> checkpoints;
+     156             : 
+     157             :   std::shared_ptr<ScopeTimerLogger> _logger_ = nullptr;
+     158             : 
+     159             :   static std::unordered_map<std::string, ros::Time> last_print_times;
+     160             : };
+     161             : 
+     162             : }  // namespace mrs_lib
+     163             : 
+     164             : #endif
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/scope_timer.h.gcov.overview.html b/mrs_lib/include/mrs_lib/scope_timer.h.gcov.overview.html new file mode 100644 index 0000000000..82f8580772 --- /dev/null +++ b/mrs_lib/include/mrs_lib/scope_timer.h.gcov.overview.html @@ -0,0 +1,61 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/scope_timer.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/include/mrs_lib/scope_timer.h.gcov.png b/mrs_lib/include/mrs_lib/scope_timer.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..d57ab8c0703ba94fdd794b60b6475e555513d985 GIT binary patch literal 777 zcmV+k1NQuhP)<}7j3 zxrRs>_JFGeLNsPr?+Qn&IfG`S=o<3?vJ)hU zjAZ~dhqBB;Jj)NpJoctB;8UAh9a`dqF$4OxIgSP-PXv;_1F;fDX6CW)&;6w5qe17B@U0r+Y6Q1l9h?T!Z=(6(!i`f=Z1Ee9liJg|S=kHM1_;Lw^erM{3NIurD< zjRu378I8)E*k~ZS9J4GuCF1Z?RNL{#nRt26U&cbf5JiYA(~Lam@z zr^t`RCZ%smU>U`(w)(it^w$NeAqx5rR{-KsMk + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/service_client_handler.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - service_client_handler.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:33100.0 %
Date:2024-04-18 23:11:36Functions:2424100.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::ServiceClientHandler<mrs_msgs::ConstraintsOverride>::ServiceClientHandler()1
mrs_lib::ServiceClientHandler_impl<mrs_msgs::ConstraintsOverride>::~ServiceClientHandler_impl()1
mrs_lib::ServiceClientHandler<mrs_msgs::Float64Srv>::ServiceClientHandler()2
mrs_lib::ServiceClientHandler<mrs_msgs::ConstraintsOverride>::~ServiceClientHandler()2
mrs_lib::ServiceClientHandler_impl<mrs_msgs::Float64Srv>::~ServiceClientHandler_impl()2
mrs_lib::ServiceClientHandler<mrs_msgs::Float64Srv>::~ServiceClientHandler()4
mrs_lib::ServiceClientHandler<mrs_msgs::DynamicsConstraintsSrv>::ServiceClientHandler()91
mrs_lib::ServiceClientHandler<mrs_msgs::Vec1>::ServiceClientHandler()91
mrs_lib::ServiceClientHandler_impl<mrs_msgs::DynamicsConstraintsSrv>::~ServiceClientHandler_impl()91
mrs_lib::ServiceClientHandler_impl<mrs_msgs::Vec1>::~ServiceClientHandler_impl()91
mrs_lib::ServiceClientHandler<mrs_msgs::ReferenceStampedSrv>::ServiceClientHandler()92
mrs_lib::ServiceClientHandler_impl<mrs_msgs::ReferenceStampedSrv>::~ServiceClientHandler_impl()92
mrs_lib::ServiceClientHandler<mrs_msgs::DynamicsConstraintsSrv>::~ServiceClientHandler()182
mrs_lib::ServiceClientHandler<mrs_msgs::Vec1>::~ServiceClientHandler()182
mrs_lib::ServiceClientHandler<mrs_msgs::String>::ServiceClientHandler()182
mrs_lib::ServiceClientHandler_impl<mrs_msgs::String>::~ServiceClientHandler_impl()182
mrs_lib::ServiceClientHandler<mrs_msgs::ReferenceStampedSrv>::~ServiceClientHandler()184
mrs_lib::ServiceClientHandler<mrs_msgs::String>::~ServiceClientHandler()364
mrs_lib::ServiceClientHandler<std_srvs::SetBool>::ServiceClientHandler()548
mrs_lib::ServiceClientHandler_impl<std_srvs::SetBool>::~ServiceClientHandler_impl()548
mrs_lib::ServiceClientHandler<std_srvs::Trigger>::ServiceClientHandler()1002
mrs_lib::ServiceClientHandler_impl<std_srvs::Trigger>::~ServiceClientHandler_impl()1002
mrs_lib::ServiceClientHandler<std_srvs::SetBool>::~ServiceClientHandler()1096
mrs_lib::ServiceClientHandler<std_srvs::Trigger>::~ServiceClientHandler()1913
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/service_client_handler.h.func.html b/mrs_lib/include/mrs_lib/service_client_handler.h.func.html new file mode 100644 index 0000000000..af7e4f7e02 --- /dev/null +++ b/mrs_lib/include/mrs_lib/service_client_handler.h.func.html @@ -0,0 +1,176 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/service_client_handler.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - service_client_handler.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:33100.0 %
Date:2024-04-18 23:11:36Functions:2424100.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::ServiceClientHandler<mrs_msgs::Float64Srv>::ServiceClientHandler()2
mrs_lib::ServiceClientHandler<mrs_msgs::Float64Srv>::~ServiceClientHandler()4
mrs_lib::ServiceClientHandler<mrs_msgs::ConstraintsOverride>::ServiceClientHandler()1
mrs_lib::ServiceClientHandler<mrs_msgs::ConstraintsOverride>::~ServiceClientHandler()2
mrs_lib::ServiceClientHandler<mrs_msgs::ReferenceStampedSrv>::ServiceClientHandler()92
mrs_lib::ServiceClientHandler<mrs_msgs::ReferenceStampedSrv>::~ServiceClientHandler()184
mrs_lib::ServiceClientHandler<mrs_msgs::DynamicsConstraintsSrv>::ServiceClientHandler()91
mrs_lib::ServiceClientHandler<mrs_msgs::DynamicsConstraintsSrv>::~ServiceClientHandler()182
mrs_lib::ServiceClientHandler<mrs_msgs::Vec1>::ServiceClientHandler()91
mrs_lib::ServiceClientHandler<mrs_msgs::Vec1>::~ServiceClientHandler()182
mrs_lib::ServiceClientHandler<mrs_msgs::String>::ServiceClientHandler()182
mrs_lib::ServiceClientHandler<mrs_msgs::String>::~ServiceClientHandler()364
mrs_lib::ServiceClientHandler<std_srvs::SetBool>::ServiceClientHandler()548
mrs_lib::ServiceClientHandler<std_srvs::SetBool>::~ServiceClientHandler()1096
mrs_lib::ServiceClientHandler<std_srvs::Trigger>::ServiceClientHandler()1002
mrs_lib::ServiceClientHandler<std_srvs::Trigger>::~ServiceClientHandler()1913
mrs_lib::ServiceClientHandler_impl<mrs_msgs::Float64Srv>::~ServiceClientHandler_impl()2
mrs_lib::ServiceClientHandler_impl<mrs_msgs::ConstraintsOverride>::~ServiceClientHandler_impl()1
mrs_lib::ServiceClientHandler_impl<mrs_msgs::ReferenceStampedSrv>::~ServiceClientHandler_impl()92
mrs_lib::ServiceClientHandler_impl<mrs_msgs::DynamicsConstraintsSrv>::~ServiceClientHandler_impl()91
mrs_lib::ServiceClientHandler_impl<mrs_msgs::Vec1>::~ServiceClientHandler_impl()91
mrs_lib::ServiceClientHandler_impl<mrs_msgs::String>::~ServiceClientHandler_impl()182
mrs_lib::ServiceClientHandler_impl<std_srvs::SetBool>::~ServiceClientHandler_impl()548
mrs_lib::ServiceClientHandler_impl<std_srvs::Trigger>::~ServiceClientHandler_impl()1002
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/service_client_handler.h.gcov.frameset.html b/mrs_lib/include/mrs_lib/service_client_handler.h.gcov.frameset.html new file mode 100644 index 0000000000..6bee985b3e --- /dev/null +++ b/mrs_lib/include/mrs_lib/service_client_handler.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/service_client_handler.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/include/mrs_lib/service_client_handler.h.gcov.html b/mrs_lib/include/mrs_lib/service_client_handler.h.gcov.html new file mode 100644 index 0000000000..7954efc4ac --- /dev/null +++ b/mrs_lib/include/mrs_lib/service_client_handler.h.gcov.html @@ -0,0 +1,327 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/service_client_handler.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - service_client_handler.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:33100.0 %
Date:2024-04-18 23:11:36Functions:2424100.0 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : /**  \file
+       2             :      \brief Defines ServiceClientHandler and related convenience classes for upgrading the ROS service client
+       3             :      \author Tomas Baca - tomas.baca@fel.cvut.cz
+       4             :  */
+       5             : #ifndef SERVICE_CLIENT_HANDLER_H
+       6             : #define SERVICE_CLIENT_HANDLER_H
+       7             : 
+       8             : #include <ros/ros.h>
+       9             : #include <ros/package.h>
+      10             : 
+      11             : #include <string>
+      12             : #include <future>
+      13             : #include <mutex>
+      14             : 
+      15             : namespace mrs_lib
+      16             : {
+      17             : 
+      18             : /* class ServiceClientHandler_impl //{ */
+      19             : 
+      20             : /**
+      21             :  * @brief implementation of the service client handler
+      22             :  */
+      23             : template <class ServiceType>
+      24             : class ServiceClientHandler_impl {
+      25             : 
+      26             : public:
+      27             :   /**
+      28             :    * @brief default constructor
+      29             :    */
+      30             :   ServiceClientHandler_impl(void);
+      31             : 
+      32             :   /**
+      33             :    * @brief default destructor
+      34             :    */
+      35        2009 :   ~ServiceClientHandler_impl(void){};
+      36             : 
+      37             :   /**
+      38             :    * @brief constructor
+      39             :    *
+      40             :    * @param nh ROS node handler
+      41             :    * @param address service address
+      42             :    */
+      43             :   ServiceClientHandler_impl(ros::NodeHandle& nh, const std::string& address);
+      44             : 
+      45             :   /**
+      46             :    * @brief "classic" synchronous service call
+      47             :    *
+      48             :    * @param srv data
+      49             :    *
+      50             :    * @return true when success
+      51             :    */
+      52             :   bool call(ServiceType& srv);
+      53             : 
+      54             :   /**
+      55             :    * @brief "classic" synchronous service call with repeats after an error
+      56             :    *
+      57             :    * @param srv data
+      58             :    * @param attempts how many attempts for the call
+      59             :    *
+      60             :    * @return  true when success
+      61             :    */
+      62             :   bool call(ServiceType& srv, const int& attempts);
+      63             : 
+      64             :   /**
+      65             :    * @brief "classic" synchronous service call with repeats after an error
+      66             :    *
+      67             :    * @param srv data
+      68             :    * @param attempts how many attempts for the call
+      69             :    * @param repeat_delay how long to wait before repeating the call
+      70             :    *
+      71             :    * @return  true when success
+      72             :    */
+      73             :   bool call(ServiceType& srv, const int& attempts, const double& repeat_delay);
+      74             : 
+      75             :   /**
+      76             :    * @brief asynchronous service call
+      77             :    *
+      78             :    * @param srv data
+      79             :    *
+      80             :    * @return future result
+      81             :    */
+      82             :   std::future<ServiceType> callAsync(ServiceType& srv);
+      83             : 
+      84             :   /**
+      85             :    * @brief asynchronous service call with repeates after an error
+      86             :    *
+      87             :    * @param srv data
+      88             :    * @param attempts how many attempts for the call
+      89             :    *
+      90             :    * @return future result
+      91             :    */
+      92             :   std::future<ServiceType> callAsync(ServiceType& srv, const int& attempts);
+      93             : 
+      94             :   /**
+      95             :    * @brief asynchronous service call with repeates after an error
+      96             :    *
+      97             :    * @param srv data
+      98             :    * @param attempts how many attempts for the call
+      99             :    * @param repeat_delay how long to wait before repeating the call
+     100             :    *
+     101             :    * @return future result
+     102             :    */
+     103             :   std::future<ServiceType> callAsync(ServiceType& srv, const int& attempts, const double& repeat_delay);
+     104             : 
+     105             : private:
+     106             :   ros::ServiceClient service_client_;
+     107             :   std::mutex         mutex_service_client_;
+     108             :   std::atomic<bool>  service_initialized_;
+     109             : 
+     110             :   std::string _address_;
+     111             : 
+     112             :   ServiceType async_data_;
+     113             :   int         async_attempts_;
+     114             :   double      async_repeat_delay_;
+     115             :   std::mutex  mutex_async_;
+     116             : 
+     117             :   ServiceType asyncRun(void);
+     118             : };
+     119             : 
+     120             : //}
+     121             : 
+     122             : /* class ServiceClientHandler //{ */
+     123             : 
+     124             : /**
+     125             :  * @brief user wrapper of the service client handler implementation
+     126             :  */
+     127             : template <class ServiceType>
+     128             : class ServiceClientHandler {
+     129             : 
+     130             : public:
+     131             :   /**
+     132             :    * @brief generic constructor
+     133             :    */
+     134        2009 :   ServiceClientHandler(void){};
+     135             : 
+     136             :   /**
+     137             :    * @brief generic destructor
+     138             :    */
+     139        3927 :   ~ServiceClientHandler(void){};
+     140             : 
+     141             :   /**
+     142             :    * @brief operator=
+     143             :    *
+     144             :    * @param other
+     145             :    *
+     146             :    * @return
+     147             :    */
+     148             :   ServiceClientHandler& operator=(const ServiceClientHandler& other);
+     149             : 
+     150             :   /**
+     151             :    * @brief copy constructor
+     152             :    *
+     153             :    * @param other
+     154             :    */
+     155             :   ServiceClientHandler(const ServiceClientHandler& other);
+     156             : 
+     157             :   /**
+     158             :    * @brief constructor
+     159             :    *
+     160             :    * @param nh ROS node handler
+     161             :    * @param address service address
+     162             :    */
+     163             :   ServiceClientHandler(ros::NodeHandle& nh, const std::string& address);
+     164             : 
+     165             :   /**
+     166             :    * @brief initializer
+     167             :    *
+     168             :    * @param nh ROS node handler
+     169             :    * @param address service address
+     170             :    */
+     171             :   void initialize(ros::NodeHandle& nh, const std::string& address);
+     172             : 
+     173             :   /**
+     174             :    * @brief "standard" synchronous call
+     175             :    *
+     176             :    * @param srv data
+     177             :    *
+     178             :    * @return true when success
+     179             :    */
+     180             :   bool call(ServiceType& srv);
+     181             : 
+     182             :   /**
+     183             :    * @brief "standard" synchronous call with repeats after failure
+     184             :    *
+     185             :    * @param srv data
+     186             :    * @param attempts how many attempts for the call
+     187             :    *
+     188             :    * @return true when success
+     189             :    */
+     190             :   bool call(ServiceType& srv, const int& attempts);
+     191             : 
+     192             :   /**
+     193             :    * @brief "standard" synchronous call with repeats after failure
+     194             :    *
+     195             :    * @param srv data
+     196             :    * @param attempts how many attempts for the call
+     197             :    * @param repeat_delay how long to wait before repeating the call
+     198             :    *
+     199             :    * @return true when success
+     200             :    */
+     201             :   bool call(ServiceType& srv, const int& attempts, const double& repeat_delay);
+     202             : 
+     203             :   /**
+     204             :    * @brief asynchronous call
+     205             :    *
+     206             :    * @param srv data
+     207             :    *
+     208             :    * @return future result
+     209             :    */
+     210             :   std::future<ServiceType> callAsync(ServiceType& srv);
+     211             : 
+     212             :   /**
+     213             :    * @brief asynchronous call with repeats after failure
+     214             :    *
+     215             :    * @param srv data
+     216             :    * @param attempts how many attemps for the call
+     217             :    *
+     218             :    * @return future result
+     219             :    */
+     220             :   std::future<ServiceType> callAsync(ServiceType& srv, const int& attempts);
+     221             : 
+     222             :   /**
+     223             :    * @brief asynchronous call with repeats after failure
+     224             :    *
+     225             :    * @param srv data
+     226             :    * @param attempts how many attemps for the call
+     227             :    * @param repeat_delay how long to wait before repeating the call
+     228             :    *
+     229             :    * @return future result
+     230             :    */
+     231             :   std::future<ServiceType> callAsync(ServiceType& srv, const int& attempts, const double& repeat_delay);
+     232             : 
+     233             : private:
+     234             :   std::shared_ptr<ServiceClientHandler_impl<ServiceType>> impl_;
+     235             : };
+     236             : 
+     237             : //}
+     238             : 
+     239             : }  // namespace mrs_lib
+     240             : 
+     241             : #include <mrs_lib/impl/service_client_handler.hpp>
+     242             : 
+     243             : #endif  // SERVICE_CLIENT_HANDLER_H
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/service_client_handler.h.gcov.overview.html b/mrs_lib/include/mrs_lib/service_client_handler.h.gcov.overview.html new file mode 100644 index 0000000000..49a39afd93 --- /dev/null +++ b/mrs_lib/include/mrs_lib/service_client_handler.h.gcov.overview.html @@ -0,0 +1,81 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/service_client_handler.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/include/mrs_lib/service_client_handler.h.gcov.png b/mrs_lib/include/mrs_lib/service_client_handler.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..1f77d70b09707c50b06bd68bf8ff5cf1bfc35fd8 GIT binary patch literal 689 zcmV;i0#5yjP)N=w&DXGh)NcNV9X*KZ$UKn;|9Ec z%=R(v35*q7{{(}P>|P0=Oz*;#7R(h3iU)aC#R`HW)W(Qamehh{>?1^!sFsFWp&A0= zl#G2^>Rz}35b_MrFN!_2nhZAqv?$0D9Q%2dM9)cT`LU)JW~ulYys+DxDG3S@U%%=2 zc^!@A@V`fbEty-H0YX5BxEB6O9f)}>iZ&+&RRO9CDDX2uRP%^l6CNgqlE-6^c0?PN zO3hag4uR$&yGSSDKo95*nm{t8^JIjJC+edVe#P(IwLAX1?$LnPil&ZeEnw=CG zpcSXwex4PXIo0g+5DGZqfJ)V*H)pd?qu9U_B1VF8%d?0Lc`QOKLs}OFZrE=H9@}rr zTcObK#eCxZ}&H!66aVyy(-h{|HNEpFbXNKO-z`xN3jR8f8VKE+FNub+IipVp_i z!kOv>x?VI^sDL(dU>HM!e zviA>ttw)Qf=aF8%WoBM~V}DrxF%a%gQp~*%y0OoS%tigjJ4a^Ljs1iWp51>eO}f6C zJ+S|nSuR#ks=9s6U}oMeBXe&5@vf2i_8+CHlfnG^gyt23f3-IVI|)b_J%|f~%vkyd XJM*UY61ZA500000NkvXXu0mjf!D=)% literal 0 HcmV?d00001 diff --git a/mrs_lib/include/mrs_lib/subscribe_handler.h.func-sort-c.html b/mrs_lib/include/mrs_lib/subscribe_handler.h.func-sort-c.html new file mode 100644 index 0000000000..8f077fc905 --- /dev/null +++ b/mrs_lib/include/mrs_lib/subscribe_handler.h.func-sort-c.html @@ -0,0 +1,3044 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/subscribe_handler.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - subscribe_handler.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:444989.8 %
Date:2024-04-18 23:11:36Functions:38974152.5 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::getMsg()0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::ProcTfToWorld<1>::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_state_estimators::ProcTfToWorld<1>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::ProcTfToWorld<1>::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_state_estimators::ProcTfToWorld<1>*)0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::SubscribeHandler<mrs_uav_state_estimators::ProcTfToWorld<1>>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_state_estimators::ProcTfToWorld<1>::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_state_estimators::ProcTfToWorld<1>*)0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<sensor_msgs::Imu_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<sensor_msgs::Imu_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*)0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<sensor_msgs::Imu_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<sensor_msgs::Imu_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*)0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::SubscribeHandler<mrs_uav_state_estimators::Correction<1>>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<sensor_msgs::Imu_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*)0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::SubscribeHandler<mrs_uav_state_estimators::Correction<2>>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<sensor_msgs::Imu_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*)0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::getMsg()0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<sensor_msgs::Range_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<sensor_msgs::Range_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*)0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::SubscribeHandler<mrs_uav_state_estimators::Correction<2>>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<sensor_msgs::Range_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*)0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::start()0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::getMsg()0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<geometry_msgs::PoseStamped_<std::allocator<void> > const>)> const&)0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<geometry_msgs::PoseStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<geometry_msgs::PoseStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*)0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<geometry_msgs::PoseStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<geometry_msgs::PoseStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*)0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::SubscribeHandler<mrs_uav_state_estimators::Correction<1>>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<geometry_msgs::PoseStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*)0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::SubscribeHandler<mrs_uav_state_estimators::Correction<2>>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<geometry_msgs::PoseStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*)0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >&&)0
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*)0
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::SubscribeHandler<mrs_uav_state_estimators::Correction<1>>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*)0
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::TfMappingOrigin::*)(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>), mrs_uav_managers::TfMappingOrigin*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::TfMappingOrigin::*)(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>), mrs_uav_managers::TfMappingOrigin*)0
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::SubscribeHandler<mrs_uav_managers::TfMappingOrigin>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_managers::TfMappingOrigin::*)(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>), mrs_uav_managers::TfMappingOrigin*)0
mrs_lib::SubscribeHandler<geometry_msgs::PoseWithCovarianceStamped_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<geometry_msgs::PoseWithCovarianceStamped_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<geometry_msgs::PoseWithCovarianceStamped_<std::allocator<void> > >::start()0
mrs_lib::SubscribeHandler<geometry_msgs::PoseWithCovarianceStamped_<std::allocator<void> > >::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::TfMappingOrigin::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_managers::TfMappingOrigin*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::TfMappingOrigin::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_managers::TfMappingOrigin*)0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*)0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*)0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<mrs_uav_managers::TfMappingOrigin>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_managers::TfMappingOrigin::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_managers::TfMappingOrigin*)0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<mrs_uav_managers::control_manager::ControlManager>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<mrs_uav_state_estimators::Correction<1>>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*)0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<mrs_uav_state_estimators::Correction<2>>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*)0
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::hasMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::hasMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::hasMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseWithCovarianceStamped_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseWithCovarianceStamped_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseWithCovarianceStamped_<std::allocator<void> > >::hasMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseWithCovarianceStamped_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseWithCovarianceStamped_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseWithCovarianceStamped_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseWithCovarianceStamped_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::ProcTfToWorld<1>::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_state_estimators::ProcTfToWorld<1>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::ProcTfToWorld<1>::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_state_estimators::ProcTfToWorld<1>*)::{lambda()#1}::operator()() const0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<sensor_msgs::Imu_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<sensor_msgs::Imu_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*)::{lambda()#1}::operator()() const0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<sensor_msgs::Imu_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<sensor_msgs::Imu_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*)::{lambda()#1}::operator()() const0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<sensor_msgs::Range_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<sensor_msgs::Range_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*)::{lambda()#1}::operator()() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<geometry_msgs::PoseStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<geometry_msgs::PoseStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*)::{lambda()#1}::operator()() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<geometry_msgs::PoseStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<geometry_msgs::PoseStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*)::{lambda()#1}::operator()() const0
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*)::{lambda()#1}::operator()() const0
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::TfMappingOrigin::*)(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>), mrs_uav_managers::TfMappingOrigin*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::TfMappingOrigin::*)(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>), mrs_uav_managers::TfMappingOrigin*)::{lambda()#1}::operator()() const0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::TfMappingOrigin::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_managers::TfMappingOrigin*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::TfMappingOrigin::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_managers::TfMappingOrigin*)::{lambda()#1}::operator()() const0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)::{lambda()#1}::operator()() const0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*)::{lambda()#1}::operator()() const0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*)::{lambda()#1}::operator()() const0
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::SubscribeHandler<void (*)(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>)>(mrs_lib::SubscribeHandlerOptions const&, std::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)> const&, void (*)(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>))1
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::SubscribeHandler<void (*)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&), void (*)(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>)>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (*)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&), void (*)(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>))1
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<Tester>(mrs_lib::SubscribeHandlerOptions const&, void (Tester::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), Tester*)1
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<void (Tester::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), Tester*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (Tester::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), Tester*)1
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::topicName[abi:cxx11]() const1
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::SubscribeHandler<void (*)(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>)>(mrs_lib::SubscribeHandlerOptions const&, std::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)> const&, void (*)(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>))::{lambda()#1}::operator()() const1
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::SubscribeHandler<void (*)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&), void (*)(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>)>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (*)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&), void (*)(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>))::{lambda()#1}::operator()() const1
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<void (Tester::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), Tester*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (Tester::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), Tester*)::{lambda()#1}::operator()() const1
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*)2
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::SubscribeHandler<mrs_uav_state_estimators::Correction<1>>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*)2
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*)::{lambda()#1}::operator()() const2
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::getMsg()3
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::getMsg()3
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*)3
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::SubscribeHandler<mrs_uav_managers::transform_manager::TransformManager>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*)3
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*)::{lambda()#1}::operator()() const3
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*)4
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::SubscribeHandler<mrs_uav_state_estimators::Correction<2>>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*)4
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*)4
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::SubscribeHandler<mrs_uav_state_estimators::Correction<2>>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*)4
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*)::{lambda()#1}::operator()() const4
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*)::{lambda()#1}::operator()() const4
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::stop()5
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::getMsg()5
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::lastMsgTime() const5
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::hasMsg() const6
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::start()9
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>)> const&)9
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >&&)9
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::start()10
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >&&)10
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::FutureTrajectory_<std::allocator<void> > const>)> const&)10
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_trackers::mpc_tracker::MpcTracker::*)(boost::shared_ptr<mrs_msgs::FutureTrajectory_<std::allocator<void> > const>), mrs_uav_trackers::mpc_tracker::MpcTracker*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_trackers::mpc_tracker::MpcTracker::*)(boost::shared_ptr<mrs_msgs::FutureTrajectory_<std::allocator<void> > const>), mrs_uav_trackers::mpc_tracker::MpcTracker*)10
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::SubscribeHandler<mrs_uav_trackers::mpc_tracker::MpcTracker>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_trackers::mpc_tracker::MpcTracker::*)(boost::shared_ptr<mrs_msgs::FutureTrajectory_<std::allocator<void> > const>), mrs_uav_trackers::mpc_tracker::MpcTracker*)10
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::start()10
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >&&)10
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > const>)> const&)10
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_trackers::mpc_tracker::MpcTracker::*)(boost::shared_ptr<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > const>), mrs_uav_trackers::mpc_tracker::MpcTracker*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_trackers::mpc_tracker::MpcTracker::*)(boost::shared_ptr<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > const>), mrs_uav_trackers::mpc_tracker::MpcTracker*)10
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::SubscribeHandler<mrs_uav_trackers::mpc_tracker::MpcTracker>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_trackers::mpc_tracker::MpcTracker::*)(boost::shared_ptr<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > const>), mrs_uav_trackers::mpc_tracker::MpcTracker*)10
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_trackers::mpc_tracker::MpcTracker::*)(boost::shared_ptr<mrs_msgs::FutureTrajectory_<std::allocator<void> > const>), mrs_uav_trackers::mpc_tracker::MpcTracker*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_trackers::mpc_tracker::MpcTracker::*)(boost::shared_ptr<mrs_msgs::FutureTrajectory_<std::allocator<void> > const>), mrs_uav_trackers::mpc_tracker::MpcTracker*)::{lambda()#1}::operator()() const10
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_trackers::mpc_tracker::MpcTracker::*)(boost::shared_ptr<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > const>), mrs_uav_trackers::mpc_tracker::MpcTracker*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_trackers::mpc_tracker::MpcTracker::*)(boost::shared_ptr<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > const>), mrs_uav_trackers::mpc_tracker::MpcTracker*)::{lambda()#1}::operator()() const10
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::hasMsg() const16
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::~SubscribeHandler()20
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::~SubscribeHandler()20
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::getMsg()22
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::start()31
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<sensor_msgs::Imu_<std::allocator<void> > const>)> const&)31
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)31
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >&&)31
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)31
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_autostart::automatic_start::AutomaticStart::*)(boost::shared_ptr<mrs_msgs::HwApiStatus_<std::allocator<void> > const>), mrs_uav_autostart::automatic_start::AutomaticStart*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_autostart::automatic_start::AutomaticStart::*)(boost::shared_ptr<mrs_msgs::HwApiStatus_<std::allocator<void> > const>), mrs_uav_autostart::automatic_start::AutomaticStart*)31
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::SubscribeHandler<mrs_uav_autostart::automatic_start::AutomaticStart>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_autostart::automatic_start::AutomaticStart::*)(boost::shared_ptr<mrs_msgs::HwApiStatus_<std::allocator<void> > const>), mrs_uav_autostart::automatic_start::AutomaticStart*)31
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::start()31
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > const>)> const&)31
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::SubscribeHandler()31
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)31
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >&&)31
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::start()31
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > const>)> const&)31
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::SubscribeHandler()31
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_autostart::automatic_start::AutomaticStart::*)(boost::shared_ptr<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > const>), mrs_uav_autostart::automatic_start::AutomaticStart*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_autostart::automatic_start::AutomaticStart::*)(boost::shared_ptr<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > const>), mrs_uav_autostart::automatic_start::AutomaticStart*)31
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::SubscribeHandler<mrs_uav_autostart::automatic_start::AutomaticStart>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_autostart::automatic_start::AutomaticStart::*)(boost::shared_ptr<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > const>), mrs_uav_autostart::automatic_start::AutomaticStart*)31
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >&&)31
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const31
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const31
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_autostart::automatic_start::AutomaticStart::*)(boost::shared_ptr<mrs_msgs::HwApiStatus_<std::allocator<void> > const>), mrs_uav_autostart::automatic_start::AutomaticStart*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_autostart::automatic_start::AutomaticStart::*)(boost::shared_ptr<mrs_msgs::HwApiStatus_<std::allocator<void> > const>), mrs_uav_autostart::automatic_start::AutomaticStart*)::{lambda()#1}::operator()() const31
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const31
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_autostart::automatic_start::AutomaticStart::*)(boost::shared_ptr<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > const>), mrs_uav_autostart::automatic_start::AutomaticStart*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_autostart::automatic_start::AutomaticStart::*)(boost::shared_ptr<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > const>), mrs_uav_autostart::automatic_start::AutomaticStart*)::{lambda()#1}::operator()() const31
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::~SubscribeHandler()62
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::~SubscribeHandler()62
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::lastMsgTime() const87
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::lastMsgTime() const87
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*)88
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::SubscribeHandler<mrs_uav_managers::transform_manager::TransformManager>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*)88
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*)::{lambda()#1}::operator()() const88
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::getMsg()89
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::hasMsg() const89
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::uav_manager::UavManager::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_managers::uav_manager::UavManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::uav_manager::UavManager::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_managers::uav_manager::UavManager*)91
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)91
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::SubscribeHandler<mrs_uav_managers::uav_manager::UavManager>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_managers::uav_manager::UavManager::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_managers::uav_manager::UavManager*)91
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::SubscribeHandler<mrs_uav_managers::control_manager::ControlManager>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)91
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)91
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<sensor_msgs::Joy_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<sensor_msgs::Joy_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)91
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::SubscribeHandler<mrs_uav_managers::control_manager::ControlManager>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<sensor_msgs::Joy_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)91
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*)91
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::SubscribeHandler<mrs_uav_managers::transform_manager::TransformManager>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*)91
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)91
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::HwApiStatus_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::HwApiStatus_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)91
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::SubscribeHandler<mrs_uav_managers::control_manager::ControlManager>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::HwApiStatus_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)91
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<mrs_msgs::HwApiAltitude_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<mrs_msgs::HwApiAltitude_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*)91
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::SubscribeHandler<mrs_uav_managers::transform_manager::TransformManager>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<mrs_msgs::HwApiAltitude_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*)91
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<mrs_msgs::Float64Stamped_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<mrs_msgs::Float64Stamped_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*)91
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::SubscribeHandler<mrs_uav_managers::transform_manager::TransformManager>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<mrs_msgs::Float64Stamped_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*)91
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::start()91
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::HwApiRcChannels_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::SubscribeHandler()91
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::HwApiRcChannels_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::HwApiRcChannels_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)91
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::SubscribeHandler<mrs_uav_managers::control_manager::ControlManager>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::HwApiRcChannels_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)91
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >&&)91
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::start()91
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::ObstacleSectors_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::SubscribeHandler()91
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)91
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >&&)91
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::start()91
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::SubscribeHandler()91
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)91
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::SubscribeHandler<mrs_uav_managers::control_manager::ControlManager>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)91
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >&&)91
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::start()91
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::DynamicsConstraints_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::SubscribeHandler()91
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)91
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >&&)91
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::start()91
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::SubscribeHandler()91
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_trackers::speed_tracker::SpeedTracker::*)(boost::shared_ptr<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > const>), mrs_uav_trackers::speed_tracker::SpeedTracker*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_trackers::speed_tracker::SpeedTracker::*)(boost::shared_ptr<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > const>), mrs_uav_trackers::speed_tracker::SpeedTracker*)91
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::SubscribeHandler<mrs_uav_trackers::speed_tracker::SpeedTracker>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_trackers::speed_tracker::SpeedTracker::*)(boost::shared_ptr<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > const>), mrs_uav_trackers::speed_tracker::SpeedTracker*)91
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >&&)91
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::start()91
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::TrajectoryReference_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::SubscribeHandler()91
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::TrajectoryReference_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::TrajectoryReference_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)91
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::SubscribeHandler<mrs_uav_managers::control_manager::ControlManager>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::TrajectoryReference_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)91
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >&&)91
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::start()91
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::SubscribeHandler()91
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)91
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >&&)91
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::start()91
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::SubscribeHandler()91
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)91
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >&&)91
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::start()91
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::SubscribeHandler()91
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)91
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::SubscribeHandler<mrs_uav_managers::control_manager::ControlManager>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)91
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >&&)91
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::start()91
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::SubscribeHandler()91
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)91
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >&&)91
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::start()91
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::Path_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::SubscribeHandler()91
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_trajectory_generation::MrsTrajectoryGeneration::*)(boost::shared_ptr<mrs_msgs::Path_<std::allocator<void> > const>), mrs_uav_trajectory_generation::MrsTrajectoryGeneration*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_trajectory_generation::MrsTrajectoryGeneration::*)(boost::shared_ptr<mrs_msgs::Path_<std::allocator<void> > const>), mrs_uav_trajectory_generation::MrsTrajectoryGeneration*)91
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::SubscribeHandler<mrs_uav_trajectory_generation::MrsTrajectoryGeneration>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_trajectory_generation::MrsTrajectoryGeneration::*)(boost::shared_ptr<mrs_msgs::Path_<std::allocator<void> > const>), mrs_uav_trajectory_generation::MrsTrajectoryGeneration*)91
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >&&)91
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)91
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*)91
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_trajectory_generation::MrsTrajectoryGeneration::*)(boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const>), mrs_uav_trajectory_generation::MrsTrajectoryGeneration*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_trajectory_generation::MrsTrajectoryGeneration::*)(boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const>), mrs_uav_trajectory_generation::MrsTrajectoryGeneration*)91
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::SubscribeHandler<mrs_uav_managers::control_manager::ControlManager>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)91
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::SubscribeHandler<mrs_uav_managers::transform_manager::TransformManager>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*)91
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::SubscribeHandler<mrs_uav_trajectory_generation::MrsTrajectoryGeneration>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_trajectory_generation::MrsTrajectoryGeneration::*)(boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const>), mrs_uav_trajectory_generation::MrsTrajectoryGeneration*)91
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::uav_manager::UavManager::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_managers::uav_manager::UavManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::uav_manager::UavManager::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_managers::uav_manager::UavManager*)91
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<mrs_uav_managers::uav_manager::UavManager>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_managers::uav_manager::UavManager::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_managers::uav_manager::UavManager*)91
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::uav_manager::UavManager::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_managers::uav_manager::UavManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::uav_manager::UavManager::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_managers::uav_manager::UavManager*)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<sensor_msgs::Joy_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<sensor_msgs::Joy_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::HwApiStatus_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::HwApiStatus_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<mrs_msgs::HwApiAltitude_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<mrs_msgs::HwApiAltitude_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<mrs_msgs::Float64Stamped_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<mrs_msgs::Float64Stamped_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::HwApiRcChannels_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::HwApiRcChannels_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_trackers::speed_tracker::SpeedTracker::*)(boost::shared_ptr<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > const>), mrs_uav_trackers::speed_tracker::SpeedTracker*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_trackers::speed_tracker::SpeedTracker::*)(boost::shared_ptr<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > const>), mrs_uav_trackers::speed_tracker::SpeedTracker*)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::TrajectoryReference_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::TrajectoryReference_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_trajectory_generation::MrsTrajectoryGeneration::*)(boost::shared_ptr<mrs_msgs::Path_<std::allocator<void> > const>), mrs_uav_trajectory_generation::MrsTrajectoryGeneration*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_trajectory_generation::MrsTrajectoryGeneration::*)(boost::shared_ptr<mrs_msgs::Path_<std::allocator<void> > const>), mrs_uav_trajectory_generation::MrsTrajectoryGeneration*)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_trajectory_generation::MrsTrajectoryGeneration::*)(boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const>), mrs_uav_trajectory_generation::MrsTrajectoryGeneration*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_trajectory_generation::MrsTrajectoryGeneration::*)(boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const>), mrs_uav_trajectory_generation::MrsTrajectoryGeneration*)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::uav_manager::UavManager::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_managers::uav_manager::UavManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::uav_manager::UavManager::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_managers::uav_manager::UavManager*)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)92
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::topicName[abi:cxx11]() const92
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::hasMsg() const92
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const92
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::ProcTfToWorld<2>::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_state_estimators::ProcTfToWorld<2>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::ProcTfToWorld<2>::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_state_estimators::ProcTfToWorld<2>*)93
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::SubscribeHandler<mrs_uav_state_estimators::ProcTfToWorld<2>>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_state_estimators::ProcTfToWorld<2>::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_state_estimators::ProcTfToWorld<2>*)93
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*)93
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::SubscribeHandler<mrs_uav_state_estimators::Correction<2>>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*)93
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::ProcTfToWorld<2>::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_state_estimators::ProcTfToWorld<2>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::ProcTfToWorld<2>::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_state_estimators::ProcTfToWorld<2>*)::{lambda()#1}::operator()() const93
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*)::{lambda()#1}::operator()() const93
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>)> const&)94
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >&&)94
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)95
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const95
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)97
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*)97
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::HdgPassthrough::*)(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>), mrs_uav_state_estimators::HdgPassthrough*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::HdgPassthrough::*)(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>), mrs_uav_state_estimators::HdgPassthrough*)97
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::SubscribeHandler<mrs_uav_state_estimators::Correction<1>>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*)97
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::SubscribeHandler<mrs_uav_state_estimators::HdgPassthrough>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_state_estimators::HdgPassthrough::*)(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>), mrs_uav_state_estimators::HdgPassthrough*)97
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::TfSource::*)(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>), mrs_uav_managers::TfSource*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::TfSource::*)(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>), mrs_uav_managers::TfSource*)97
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::HdgPassthrough::*)(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::HdgPassthrough*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::HdgPassthrough::*)(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::HdgPassthrough*)97
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::SubscribeHandler<mrs_uav_managers::TfSource>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_managers::TfSource::*)(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>), mrs_uav_managers::TfSource*)97
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::SubscribeHandler<mrs_uav_state_estimators::HdgPassthrough>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_state_estimators::HdgPassthrough::*)(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::HdgPassthrough*)97
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::start()97
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::EstimatorOutput_<std::allocator<void> > const>)> const&)97
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::SubscribeHandler()97
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)97
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >&&)97
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const97
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*)::{lambda()#1}::operator()() const97
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::HdgPassthrough::*)(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>), mrs_uav_state_estimators::HdgPassthrough*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::HdgPassthrough::*)(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>), mrs_uav_state_estimators::HdgPassthrough*)::{lambda()#1}::operator()() const97
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::TfSource::*)(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>), mrs_uav_managers::TfSource*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::TfSource::*)(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>), mrs_uav_managers::TfSource*)::{lambda()#1}::operator()() const97
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::HdgPassthrough::*)(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::HdgPassthrough*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::HdgPassthrough::*)(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::HdgPassthrough*)::{lambda()#1}::operator()() const97
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const97
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::start()98
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::TfSource::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_managers::TfSource*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::TfSource::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_managers::TfSource*)98
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<mrs_uav_managers::TfSource>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_managers::TfSource::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_managers::TfSource*)98
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::TfSource::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_managers::TfSource*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::TfSource::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_managers::TfSource*)::{lambda()#1}::operator()() const98
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::topicName[abi:cxx11]() const105
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::topicName[abi:cxx11]() const116
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<sensor_msgs::Range_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<sensor_msgs::Range_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*)146
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::SubscribeHandler<mrs_uav_state_estimators::Correction<1>>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<sensor_msgs::Range_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*)146
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<sensor_msgs::Range_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<sensor_msgs::Range_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*)::{lambda()#1}::operator()() const146
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::start()177
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<sensor_msgs::Range_<std::allocator<void> > const>)> const&)177
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >&&)177
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::lastMsgTime() const179
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::start()182
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<sensor_msgs::Joy_<std::allocator<void> > const>)> const&)182
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::SubscribeHandler()182
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >&&)182
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::start()182
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::TrackerCommand_<std::allocator<void> > const>)> const&)182
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::SubscribeHandler()182
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)182
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >&&)182
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::~SubscribeHandler()182
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::~SubscribeHandler()182
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::~SubscribeHandler()182
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::~SubscribeHandler()182
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::~SubscribeHandler()182
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::~SubscribeHandler()182
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::~SubscribeHandler()182
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::~SubscribeHandler()182
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::~SubscribeHandler()182
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::~SubscribeHandler()182
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::~SubscribeHandler()182
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::start()182
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<std_msgs::Float64_<std::allocator<void> > const>)> const&)182
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::SubscribeHandler()182
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)182
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >&&)182
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const182
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const182
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::start()186
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::HwApiAltitude_<std::allocator<void> > const>)> const&)186
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >&&)186
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::SubscribeHandler()189
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::~SubscribeHandler()194
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::start()213
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::HwApiStatus_<std::allocator<void> > const>)> const&)213
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::SubscribeHandler()213
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >&&)213
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::SubscribeHandler()213
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >&&)213
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)264
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const264
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::getMsg()267
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)273
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::start()273
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const>)> const&)273
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::SubscribeHandler()273
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >&&)273
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const273
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::start()282
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>)> const&)282
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >&&)282
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::start()295
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>)> const&)295
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >&&)295
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::lastMsgTime() const299
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::start()304
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::HwApiCapabilities_<std::allocator<void> > const>)> const&)304
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)304
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const304
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::SubscribeHandler()346
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::~SubscribeHandler()346
mrs_lib::SubscribeHandler<geometry_msgs::PoseWithCovarianceStamped_<std::allocator<void> > >::SubscribeHandler()346
mrs_lib::SubscribeHandler<geometry_msgs::PoseWithCovarianceStamped_<std::allocator<void> > >::~SubscribeHandler()346
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::SubscribeHandler()347
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::start()355
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::EstimatorInput_<std::allocator<void> > const>)> const&)355
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::SubscribeHandler()355
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)355
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >&&)355
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const355
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::start()363
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>)> const&)363
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >&&)363
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::~SubscribeHandler()364
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::start()364
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::Float64Stamped_<std::allocator<void> > const>)> const&)364
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::SubscribeHandler()364
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >&&)364
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::~SubscribeHandler()364
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::~SubscribeHandler()364
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::SubscribeHandler()366
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::~SubscribeHandler()375
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::SubscribeHandler()377
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::SubscribeHandler()377
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::start()395
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > const>)> const&)395
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::SubscribeHandler()395
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)395
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >&&)395
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::start()395
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > const>)> const&)395
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::SubscribeHandler()395
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)395
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >&&)395
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const395
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const395
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::~SubscribeHandler()408
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::getMsg()419
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::~SubscribeHandler()426
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::SubscribeHandler()437
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::~SubscribeHandler()441
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::~SubscribeHandler()446
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::~SubscribeHandler()517
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::SubscribeHandler()540
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::getMsg()546
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::~SubscribeHandler()546
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::hasMsg() const546
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::start()549
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>)> const&)549
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >&&)549
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::~SubscribeHandler()554
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::~SubscribeHandler()710
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler()719
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::~SubscribeHandler()728
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::~SubscribeHandler()729
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::~SubscribeHandler()790
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::~SubscribeHandler()790
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::getMsg()792
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::~SubscribeHandler()835
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::~SubscribeHandler()1001
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::SubscribeHandler()1242
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::~SubscribeHandler()1791
mrs_lib::SubscribeHandlerOptions::SubscribeHandlerOptions()2362
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::hasMsg() const2466
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::getMsg()3730
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::getMsg()3736
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::getMsg()9944
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::hasMsg() const9944
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::getMsg()14143
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::hasMsg() const16528
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::hasMsg() const17816
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::hasMsg() const18488
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::hasMsg() const18685
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::hasMsg() const18705
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::getMsg()19916
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::getMsg()34694
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::lastMsgTime() const34694
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::getMsg()41355
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::hasMsg() const50249
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::hasMsg() const63356
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::getMsg()65470
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::hasMsg() const68432
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::hasMsg() const141535
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::getMsg()162667
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::hasMsg() const162667
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::getMsg()183010
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::lastMsgTime() const194033
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::getMsg()209179
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::hasMsg() const226567
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::hasMsg() const377616
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::getMsg()382356
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::lastMsgTime() const404867
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::hasMsg() const498935
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::newMsg() const513977
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::getMsg()699087
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::getMsg()806285
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::hasMsg() const897403
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/subscribe_handler.h.func.html b/mrs_lib/include/mrs_lib/subscribe_handler.h.func.html new file mode 100644 index 0000000000..0b6d0db47a --- /dev/null +++ b/mrs_lib/include/mrs_lib/subscribe_handler.h.func.html @@ -0,0 +1,3044 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/subscribe_handler.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - subscribe_handler.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:444989.8 %
Date:2024-04-18 23:11:36Functions:38974152.5 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::start()363
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::getMsg()0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>)> const&)363
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::SubscribeHandler()366
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::uav_manager::UavManager::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_managers::uav_manager::UavManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::uav_manager::UavManager::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_managers::uav_manager::UavManager*)91
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)91
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*)88
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::ProcTfToWorld<1>::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_state_estimators::ProcTfToWorld<1>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::ProcTfToWorld<1>::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_state_estimators::ProcTfToWorld<1>*)0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::ProcTfToWorld<2>::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_state_estimators::ProcTfToWorld<2>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::ProcTfToWorld<2>::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_state_estimators::ProcTfToWorld<2>*)93
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::SubscribeHandler<mrs_uav_managers::uav_manager::UavManager>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_managers::uav_manager::UavManager::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_managers::uav_manager::UavManager*)91
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::SubscribeHandler<mrs_uav_managers::control_manager::ControlManager>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)91
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::SubscribeHandler<mrs_uav_managers::transform_manager::TransformManager>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*)88
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::SubscribeHandler<mrs_uav_state_estimators::ProcTfToWorld<1>>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_state_estimators::ProcTfToWorld<1>::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_state_estimators::ProcTfToWorld<1>*)0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::SubscribeHandler<mrs_uav_state_estimators::ProcTfToWorld<2>>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_state_estimators::ProcTfToWorld<2>::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_state_estimators::ProcTfToWorld<2>*)93
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::~SubscribeHandler()729
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >&&)363
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::start()31
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::getMsg()9944
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<sensor_msgs::Imu_<std::allocator<void> > const>)> const&)31
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::SubscribeHandler()377
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)31
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<sensor_msgs::Imu_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<sensor_msgs::Imu_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*)0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<sensor_msgs::Imu_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<sensor_msgs::Imu_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*)0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::SubscribeHandler<mrs_uav_state_estimators::Correction<1>>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<sensor_msgs::Imu_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*)0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::SubscribeHandler<mrs_uav_state_estimators::Correction<2>>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<sensor_msgs::Imu_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*)0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::~SubscribeHandler()408
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >&&)31
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::start()182
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::getMsg()0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<sensor_msgs::Joy_<std::allocator<void> > const>)> const&)182
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::SubscribeHandler()182
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)91
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<sensor_msgs::Joy_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<sensor_msgs::Joy_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)91
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::SubscribeHandler<mrs_uav_managers::control_manager::ControlManager>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<sensor_msgs::Joy_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)91
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::~SubscribeHandler()364
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >&&)182
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::start()177
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::getMsg()14143
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<sensor_msgs::Range_<std::allocator<void> > const>)> const&)177
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::SubscribeHandler()377
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)31
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<sensor_msgs::Range_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<sensor_msgs::Range_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*)146
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<sensor_msgs::Range_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<sensor_msgs::Range_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*)0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::SubscribeHandler<mrs_uav_state_estimators::Correction<1>>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<sensor_msgs::Range_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*)146
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::SubscribeHandler<mrs_uav_state_estimators::Correction<2>>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<sensor_msgs::Range_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*)0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::~SubscribeHandler()554
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >&&)177
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::start()0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::getMsg()0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<geometry_msgs::PoseStamped_<std::allocator<void> > const>)> const&)0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::SubscribeHandler()346
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<geometry_msgs::PoseStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<geometry_msgs::PoseStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*)0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<geometry_msgs::PoseStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<geometry_msgs::PoseStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*)0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::SubscribeHandler<mrs_uav_state_estimators::Correction<1>>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<geometry_msgs::PoseStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*)0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::SubscribeHandler<mrs_uav_state_estimators::Correction<2>>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<geometry_msgs::PoseStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*)0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::~SubscribeHandler()346
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >&&)0
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::stop()5
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::start()98
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::getMsg()3736
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>)> const&)94
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::SubscribeHandler()347
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*)0
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*)93
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::SubscribeHandler<void (*)(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>)>(mrs_lib::SubscribeHandlerOptions const&, std::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)> const&, void (*)(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>))1
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::SubscribeHandler<void (*)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&), void (*)(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>)>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (*)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&), void (*)(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>))1
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::SubscribeHandler<mrs_uav_state_estimators::Correction<1>>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*)0
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::SubscribeHandler<mrs_uav_state_estimators::Correction<2>>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*)93
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::~SubscribeHandler()441
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >&&)94
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::start()295
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::getMsg()183010
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>)> const&)295
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::SubscribeHandler()540
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)97
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*)97
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*)4
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::HdgPassthrough::*)(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>), mrs_uav_state_estimators::HdgPassthrough*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::HdgPassthrough::*)(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>), mrs_uav_state_estimators::HdgPassthrough*)97
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::SubscribeHandler<mrs_uav_state_estimators::Correction<1>>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*)97
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::SubscribeHandler<mrs_uav_state_estimators::Correction<2>>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*)4
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::SubscribeHandler<mrs_uav_state_estimators::HdgPassthrough>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_state_estimators::HdgPassthrough::*)(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>), mrs_uav_state_estimators::HdgPassthrough*)97
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::~SubscribeHandler()835
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >&&)295
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::start()549
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::getMsg()699087
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>)> const&)549
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::SubscribeHandler()1242
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)264
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::TfMappingOrigin::*)(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>), mrs_uav_managers::TfMappingOrigin*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::TfMappingOrigin::*)(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>), mrs_uav_managers::TfMappingOrigin*)0
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*)91
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::TfSource::*)(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>), mrs_uav_managers::TfSource*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::TfSource::*)(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>), mrs_uav_managers::TfSource*)97
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::HdgPassthrough::*)(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::HdgPassthrough*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::HdgPassthrough::*)(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::HdgPassthrough*)97
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::SubscribeHandler<mrs_uav_managers::TfMappingOrigin>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_managers::TfMappingOrigin::*)(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>), mrs_uav_managers::TfMappingOrigin*)0
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::SubscribeHandler<mrs_uav_managers::transform_manager::TransformManager>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*)91
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::SubscribeHandler<mrs_uav_managers::TfSource>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_managers::TfSource::*)(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>), mrs_uav_managers::TfSource*)97
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::SubscribeHandler<mrs_uav_state_estimators::HdgPassthrough>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_state_estimators::HdgPassthrough::*)(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::HdgPassthrough*)97
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::~SubscribeHandler()1791
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >&&)549
mrs_lib::SubscribeHandler<geometry_msgs::PoseWithCovarianceStamped_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<geometry_msgs::PoseWithCovarianceStamped_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<geometry_msgs::PoseWithCovarianceStamped_<std::allocator<void> > >::start()0
mrs_lib::SubscribeHandler<geometry_msgs::PoseWithCovarianceStamped_<std::allocator<void> > >::getMsg()0
mrs_lib::SubscribeHandler<geometry_msgs::PoseWithCovarianceStamped_<std::allocator<void> > >::SubscribeHandler()346
mrs_lib::SubscribeHandler<geometry_msgs::PoseWithCovarianceStamped_<std::allocator<void> > >::~SubscribeHandler()346
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::start()213
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::getMsg()267
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::HwApiStatus_<std::allocator<void> > const>)> const&)213
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::SubscribeHandler()213
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)91
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::HwApiStatus_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::HwApiStatus_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)91
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_autostart::automatic_start::AutomaticStart::*)(boost::shared_ptr<mrs_msgs::HwApiStatus_<std::allocator<void> > const>), mrs_uav_autostart::automatic_start::AutomaticStart*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_autostart::automatic_start::AutomaticStart::*)(boost::shared_ptr<mrs_msgs::HwApiStatus_<std::allocator<void> > const>), mrs_uav_autostart::automatic_start::AutomaticStart*)31
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::SubscribeHandler<mrs_uav_managers::control_manager::ControlManager>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::HwApiStatus_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)91
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::SubscribeHandler<mrs_uav_autostart::automatic_start::AutomaticStart>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_autostart::automatic_start::AutomaticStart::*)(boost::shared_ptr<mrs_msgs::HwApiStatus_<std::allocator<void> > const>), mrs_uav_autostart::automatic_start::AutomaticStart*)31
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::~SubscribeHandler()426
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >&&)213
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::start()186
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::getMsg()162667
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::HwApiAltitude_<std::allocator<void> > const>)> const&)186
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::SubscribeHandler()189
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)95
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<mrs_msgs::HwApiAltitude_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<mrs_msgs::HwApiAltitude_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*)91
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::SubscribeHandler<mrs_uav_managers::transform_manager::TransformManager>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<mrs_msgs::HwApiAltitude_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*)91
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::~SubscribeHandler()375
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >&&)186
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::start()355
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::getMsg()382356
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::EstimatorInput_<std::allocator<void> > const>)> const&)355
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::SubscribeHandler()355
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)355
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::~SubscribeHandler()710
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >&&)355
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::start()364
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::getMsg()41355
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::Float64Stamped_<std::allocator<void> > const>)> const&)364
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::SubscribeHandler()364
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)273
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<mrs_msgs::Float64Stamped_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<mrs_msgs::Float64Stamped_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*)91
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::SubscribeHandler<mrs_uav_managers::transform_manager::TransformManager>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<mrs_msgs::Float64Stamped_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*)91
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::~SubscribeHandler()728
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >&&)364
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::start()182
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::getMsg()792
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::TrackerCommand_<std::allocator<void> > const>)> const&)182
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::SubscribeHandler()182
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)182
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::~SubscribeHandler()364
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >&&)182
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::start()97
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::EstimatorOutput_<std::allocator<void> > const>)> const&)97
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::SubscribeHandler()97
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)97
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::~SubscribeHandler()194
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >&&)97
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::start()91
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::getMsg()546
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::HwApiRcChannels_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::SubscribeHandler()91
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::HwApiRcChannels_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::HwApiRcChannels_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)91
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::SubscribeHandler<mrs_uav_managers::control_manager::ControlManager>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::HwApiRcChannels_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)91
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::~SubscribeHandler()182
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >&&)91
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::start()91
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::getMsg()419
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::ObstacleSectors_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::SubscribeHandler()91
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)91
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::~SubscribeHandler()182
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >&&)91
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::start()10
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >&&)10
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::FutureTrajectory_<std::allocator<void> > const>)> const&)10
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_trackers::mpc_tracker::MpcTracker::*)(boost::shared_ptr<mrs_msgs::FutureTrajectory_<std::allocator<void> > const>), mrs_uav_trackers::mpc_tracker::MpcTracker*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_trackers::mpc_tracker::MpcTracker::*)(boost::shared_ptr<mrs_msgs::FutureTrajectory_<std::allocator<void> > const>), mrs_uav_trackers::mpc_tracker::MpcTracker*)10
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::SubscribeHandler<mrs_uav_trackers::mpc_tracker::MpcTracker>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_trackers::mpc_tracker::MpcTracker::*)(boost::shared_ptr<mrs_msgs::FutureTrajectory_<std::allocator<void> > const>), mrs_uav_trackers::mpc_tracker::MpcTracker*)10
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::~SubscribeHandler()20
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::start()91
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::SubscribeHandler()91
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)91
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::SubscribeHandler<mrs_uav_managers::control_manager::ControlManager>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)91
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::~SubscribeHandler()182
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >&&)91
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::start()304
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::getMsg()19916
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::HwApiCapabilities_<std::allocator<void> > const>)> const&)304
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::SubscribeHandler()213
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)304
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::~SubscribeHandler()517
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >&&)213
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::start()91
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::getMsg()22
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::DynamicsConstraints_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::SubscribeHandler()91
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)91
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::~SubscribeHandler()182
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >&&)91
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::start()91
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::SubscribeHandler()91
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_trackers::speed_tracker::SpeedTracker::*)(boost::shared_ptr<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > const>), mrs_uav_trackers::speed_tracker::SpeedTracker*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_trackers::speed_tracker::SpeedTracker::*)(boost::shared_ptr<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > const>), mrs_uav_trackers::speed_tracker::SpeedTracker*)91
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::SubscribeHandler<mrs_uav_trackers::speed_tracker::SpeedTracker>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_trackers::speed_tracker::SpeedTracker::*)(boost::shared_ptr<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > const>), mrs_uav_trackers::speed_tracker::SpeedTracker*)91
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::~SubscribeHandler()182
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >&&)91
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::start()91
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::TrajectoryReference_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::SubscribeHandler()91
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::TrajectoryReference_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::TrajectoryReference_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)91
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::SubscribeHandler<mrs_uav_managers::control_manager::ControlManager>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::TrajectoryReference_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)91
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::~SubscribeHandler()182
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >&&)91
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::start()91
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::getMsg()5
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::SubscribeHandler()91
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)91
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::~SubscribeHandler()182
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >&&)91
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::start()395
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::getMsg()65470
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > const>)> const&)395
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::SubscribeHandler()395
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)395
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::~SubscribeHandler()790
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >&&)395
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::start()10
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >&&)10
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > const>)> const&)10
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_trackers::mpc_tracker::MpcTracker::*)(boost::shared_ptr<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > const>), mrs_uav_trackers::mpc_tracker::MpcTracker*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_trackers::mpc_tracker::MpcTracker::*)(boost::shared_ptr<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > const>), mrs_uav_trackers::mpc_tracker::MpcTracker*)10
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::SubscribeHandler<mrs_uav_trackers::mpc_tracker::MpcTracker>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_trackers::mpc_tracker::MpcTracker::*)(boost::shared_ptr<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > const>), mrs_uav_trackers::mpc_tracker::MpcTracker*)10
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::~SubscribeHandler()20
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::start()31
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > const>)> const&)31
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::SubscribeHandler()31
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)31
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::~SubscribeHandler()62
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >&&)31
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::start()91
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::getMsg()3
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::SubscribeHandler()91
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)91
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::~SubscribeHandler()182
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >&&)91
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::start()31
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > const>)> const&)31
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::SubscribeHandler()31
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_autostart::automatic_start::AutomaticStart::*)(boost::shared_ptr<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > const>), mrs_uav_autostart::automatic_start::AutomaticStart*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_autostart::automatic_start::AutomaticStart::*)(boost::shared_ptr<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > const>), mrs_uav_autostart::automatic_start::AutomaticStart*)31
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::SubscribeHandler<mrs_uav_autostart::automatic_start::AutomaticStart>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_autostart::automatic_start::AutomaticStart::*)(boost::shared_ptr<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > const>), mrs_uav_autostart::automatic_start::AutomaticStart*)31
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::~SubscribeHandler()62
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >&&)31
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::start()91
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::SubscribeHandler()91
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)91
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::SubscribeHandler<mrs_uav_managers::control_manager::ControlManager>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)91
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::~SubscribeHandler()182
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >&&)91
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::start()395
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::getMsg()806285
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > const>)> const&)395
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::SubscribeHandler()395
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)395
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::~SubscribeHandler()790
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >&&)395
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::start()91
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::getMsg()3
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::SubscribeHandler()91
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)91
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::~SubscribeHandler()182
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >&&)91
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::start()91
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::getMsg()0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::Path_<std::allocator<void> > const>)> const&)91
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::SubscribeHandler()91
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_trajectory_generation::MrsTrajectoryGeneration::*)(boost::shared_ptr<mrs_msgs::Path_<std::allocator<void> > const>), mrs_uav_trajectory_generation::MrsTrajectoryGeneration*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_trajectory_generation::MrsTrajectoryGeneration::*)(boost::shared_ptr<mrs_msgs::Path_<std::allocator<void> > const>), mrs_uav_trajectory_generation::MrsTrajectoryGeneration*)91
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::SubscribeHandler<mrs_uav_trajectory_generation::MrsTrajectoryGeneration>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_trajectory_generation::MrsTrajectoryGeneration::*)(boost::shared_ptr<mrs_msgs::Path_<std::allocator<void> > const>), mrs_uav_trajectory_generation::MrsTrajectoryGeneration*)91
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::~SubscribeHandler()182
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >&&)91
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::start()9
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::getMsg()89
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>)> const&)9
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::SubscribeHandler()437
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*)3
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*)2
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*)4
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::SubscribeHandler<mrs_uav_managers::transform_manager::TransformManager>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*)3
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::SubscribeHandler<mrs_uav_state_estimators::Correction<1>>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*)2
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::SubscribeHandler<mrs_uav_state_estimators::Correction<2>>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*)4
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::~SubscribeHandler()446
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >&&)9
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::start()273
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::getMsg()3730
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const>)> const&)273
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::SubscribeHandler()273
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)91
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*)91
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_trajectory_generation::MrsTrajectoryGeneration::*)(boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const>), mrs_uav_trajectory_generation::MrsTrajectoryGeneration*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_trajectory_generation::MrsTrajectoryGeneration::*)(boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const>), mrs_uav_trajectory_generation::MrsTrajectoryGeneration*)91
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::SubscribeHandler<mrs_uav_managers::control_manager::ControlManager>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)91
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::SubscribeHandler<mrs_uav_managers::transform_manager::TransformManager>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*)91
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::SubscribeHandler<mrs_uav_trajectory_generation::MrsTrajectoryGeneration>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_trajectory_generation::MrsTrajectoryGeneration::*)(boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const>), mrs_uav_trajectory_generation::MrsTrajectoryGeneration*)91
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::~SubscribeHandler()546
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >&&)273
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::start()282
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::getMsg()209179
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>)> const&)282
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler()719
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<Tester>(mrs_lib::SubscribeHandlerOptions const&, void (Tester::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), Tester*)1
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)92
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<void (Tester::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), Tester*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (Tester::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), Tester*)1
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::uav_manager::UavManager::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_managers::uav_manager::UavManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::uav_manager::UavManager::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_managers::uav_manager::UavManager*)91
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::TfMappingOrigin::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_managers::TfMappingOrigin*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::TfMappingOrigin::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_managers::TfMappingOrigin*)0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::TfSource::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_managers::TfSource*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::TfSource::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_managers::TfSource*)98
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*)0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*)0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<mrs_uav_managers::uav_manager::UavManager>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_managers::uav_manager::UavManager::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_managers::uav_manager::UavManager*)91
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<mrs_uav_managers::TfMappingOrigin>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_managers::TfMappingOrigin::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_managers::TfMappingOrigin*)0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<mrs_uav_managers::control_manager::ControlManager>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<mrs_uav_managers::TfSource>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_managers::TfSource::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_managers::TfSource*)98
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<mrs_uav_state_estimators::Correction<1>>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*)0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<mrs_uav_state_estimators::Correction<2>>(mrs_lib::SubscribeHandlerOptions const&, void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*)0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::~SubscribeHandler()1001
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >&&)282
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::waitForNew(ros::WallDuration const&)0
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::stop()0
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::start()182
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::getMsg()34694
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::SubscribeHandler(mrs_lib::SubscribeHandlerOptions const&, std::function<void (boost::shared_ptr<std_msgs::Float64_<std::allocator<void> > const>)> const&)182
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::SubscribeHandler()182
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)182
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::~SubscribeHandler()364
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::operator=(mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >&&)182
mrs_lib::SubscribeHandlerOptions::SubscribeHandlerOptions()2362
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::hasMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::hasMsg() const9944
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::hasMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::hasMsg() const17816
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::hasMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::lastMsgTime() const5
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::hasMsg() const16528
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::hasMsg() const377616
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::hasMsg() const897403
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::topicName[abi:cxx11]() const116
mrs_lib::SubscribeHandler<geometry_msgs::PoseWithCovarianceStamped_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseWithCovarianceStamped_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseWithCovarianceStamped_<std::allocator<void> > >::hasMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseWithCovarianceStamped_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseWithCovarianceStamped_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseWithCovarianceStamped_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseWithCovarianceStamped_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::lastMsgTime() const179
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::hasMsg() const18685
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::hasMsg() const162667
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::lastMsgTime() const404867
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::newMsg() const513977
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::hasMsg() const63356
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::hasMsg() const16
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::hasMsg() const546
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::lastMsgTime() const299
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::hasMsg() const2466
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::hasMsg() const18705
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::topicName[abi:cxx11]() const92
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::hasMsg() const6
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::hasMsg() const92
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::hasMsg() const68432
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::hasMsg() const18488
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::lastMsgTime() const87
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::hasMsg() const141535
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::topicName[abi:cxx11]() const105
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::lastMsgTime() const87
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::hasMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::hasMsg() const89
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::lastMsgTime() const194033
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::hasMsg() const226567
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::lastMsgTime() const0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::hasMsg() const498935
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::topicName[abi:cxx11]() const1
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::lastMsgTime() const34694
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::subscribedTopicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::hasMsg() const50249
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::newMsg() const0
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::peekMsg() const0
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::usedMsg() const0
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::topicName[abi:cxx11]() const0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::uav_manager::UavManager::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_managers::uav_manager::UavManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::uav_manager::UavManager::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_managers::uav_manager::UavManager*)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*)::{lambda()#1}::operator()() const88
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::ProcTfToWorld<1>::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_state_estimators::ProcTfToWorld<1>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::ProcTfToWorld<1>::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_state_estimators::ProcTfToWorld<1>*)::{lambda()#1}::operator()() const0
mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::ProcTfToWorld<2>::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_state_estimators::ProcTfToWorld<2>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::ProcTfToWorld<2>::*)(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>), mrs_uav_state_estimators::ProcTfToWorld<2>*)::{lambda()#1}::operator()() const93
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const31
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<sensor_msgs::Imu_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<sensor_msgs::Imu_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*)::{lambda()#1}::operator()() const0
mrs_lib::SubscribeHandler<sensor_msgs::Imu_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<sensor_msgs::Imu_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<sensor_msgs::Imu_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*)::{lambda()#1}::operator()() const0
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<sensor_msgs::Joy_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<sensor_msgs::Joy_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<sensor_msgs::Joy_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const31
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<sensor_msgs::Range_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<sensor_msgs::Range_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*)::{lambda()#1}::operator()() const146
mrs_lib::SubscribeHandler<sensor_msgs::Range_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<sensor_msgs::Range_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<sensor_msgs::Range_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*)::{lambda()#1}::operator()() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<geometry_msgs::PoseStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<geometry_msgs::PoseStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*)::{lambda()#1}::operator()() const0
mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<geometry_msgs::PoseStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<geometry_msgs::PoseStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*)::{lambda()#1}::operator()() const0
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*)::{lambda()#1}::operator()() const0
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*)::{lambda()#1}::operator()() const93
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::SubscribeHandler<void (*)(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>)>(mrs_lib::SubscribeHandlerOptions const&, std::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)> const&, void (*)(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>))::{lambda()#1}::operator()() const1
mrs_lib::SubscribeHandler<geometry_msgs::PointStamped_<std::allocator<void> > >::SubscribeHandler<void (*)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&), void (*)(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>)>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (*)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&), void (*)(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>))::{lambda()#1}::operator()() const1
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const97
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*)::{lambda()#1}::operator()() const97
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*)::{lambda()#1}::operator()() const4
mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::HdgPassthrough::*)(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>), mrs_uav_state_estimators::HdgPassthrough*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::HdgPassthrough::*)(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>), mrs_uav_state_estimators::HdgPassthrough*)::{lambda()#1}::operator()() const97
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const264
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::TfMappingOrigin::*)(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>), mrs_uav_managers::TfMappingOrigin*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::TfMappingOrigin::*)(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>), mrs_uav_managers::TfMappingOrigin*)::{lambda()#1}::operator()() const0
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::TfSource::*)(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>), mrs_uav_managers::TfSource*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::TfSource::*)(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>), mrs_uav_managers::TfSource*)::{lambda()#1}::operator()() const97
mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::HdgPassthrough::*)(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::HdgPassthrough*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::HdgPassthrough::*)(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>), mrs_uav_state_estimators::HdgPassthrough*)::{lambda()#1}::operator()() const97
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::HwApiStatus_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::HwApiStatus_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_autostart::automatic_start::AutomaticStart::*)(boost::shared_ptr<mrs_msgs::HwApiStatus_<std::allocator<void> > const>), mrs_uav_autostart::automatic_start::AutomaticStart*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_autostart::automatic_start::AutomaticStart::*)(boost::shared_ptr<mrs_msgs::HwApiStatus_<std::allocator<void> > const>), mrs_uav_autostart::automatic_start::AutomaticStart*)::{lambda()#1}::operator()() const31
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const95
mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<mrs_msgs::HwApiAltitude_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<mrs_msgs::HwApiAltitude_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const355
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const273
mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<mrs_msgs::Float64Stamped_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<mrs_msgs::Float64Stamped_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const182
mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const97
mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::HwApiRcChannels_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::HwApiRcChannels_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_trackers::mpc_tracker::MpcTracker::*)(boost::shared_ptr<mrs_msgs::FutureTrajectory_<std::allocator<void> > const>), mrs_uav_trackers::mpc_tracker::MpcTracker*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_trackers::mpc_tracker::MpcTracker::*)(boost::shared_ptr<mrs_msgs::FutureTrajectory_<std::allocator<void> > const>), mrs_uav_trackers::mpc_tracker::MpcTracker*)::{lambda()#1}::operator()() const10
mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const304
mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_trackers::speed_tracker::SpeedTracker::*)(boost::shared_ptr<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > const>), mrs_uav_trackers::speed_tracker::SpeedTracker*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_trackers::speed_tracker::SpeedTracker::*)(boost::shared_ptr<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > const>), mrs_uav_trackers::speed_tracker::SpeedTracker*)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::TrajectoryReference_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::TrajectoryReference_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const395
mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_trackers::mpc_tracker::MpcTracker::*)(boost::shared_ptr<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > const>), mrs_uav_trackers::mpc_tracker::MpcTracker*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_trackers::mpc_tracker::MpcTracker::*)(boost::shared_ptr<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > const>), mrs_uav_trackers::mpc_tracker::MpcTracker*)::{lambda()#1}::operator()() const10
mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const31
mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_autostart::automatic_start::AutomaticStart::*)(boost::shared_ptr<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > const>), mrs_uav_autostart::automatic_start::AutomaticStart*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_autostart::automatic_start::AutomaticStart::*)(boost::shared_ptr<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > const>), mrs_uav_autostart::automatic_start::AutomaticStart*)::{lambda()#1}::operator()() const31
mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const395
mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<mrs_msgs::Path_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_trajectory_generation::MrsTrajectoryGeneration::*)(boost::shared_ptr<mrs_msgs::Path_<std::allocator<void> > const>), mrs_uav_trajectory_generation::MrsTrajectoryGeneration*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_trajectory_generation::MrsTrajectoryGeneration::*)(boost::shared_ptr<mrs_msgs::Path_<std::allocator<void> > const>), mrs_uav_trajectory_generation::MrsTrajectoryGeneration*)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*)::{lambda()#1}::operator()() const3
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*)::{lambda()#1}::operator()() const2
mrs_lib::SubscribeHandler<mrs_msgs::RtkGps_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*)::{lambda()#1}::operator()() const4
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::transform_manager::TransformManager::*)(boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const>), mrs_uav_managers::transform_manager::TransformManager*)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<mrs_msgs::UavState_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_trajectory_generation::MrsTrajectoryGeneration::*)(boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const>), mrs_uav_trajectory_generation::MrsTrajectoryGeneration*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_trajectory_generation::MrsTrajectoryGeneration::*)(boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const>), mrs_uav_trajectory_generation::MrsTrajectoryGeneration*)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const92
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<void (Tester::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), Tester*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (Tester::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), Tester*)::{lambda()#1}::operator()() const1
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::uav_manager::UavManager::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_managers::uav_manager::UavManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::uav_manager::UavManager::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_managers::uav_manager::UavManager*)::{lambda()#1}::operator()() const91
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::TfMappingOrigin::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_managers::TfMappingOrigin*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::TfMappingOrigin::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_managers::TfMappingOrigin*)::{lambda()#1}::operator()() const0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::control_manager::ControlManager::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_managers::control_manager::ControlManager*)::{lambda()#1}::operator()() const0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_managers::TfSource::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_managers::TfSource*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_managers::TfSource::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_managers::TfSource*)::{lambda()#1}::operator()() const98
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<1>::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<1>*)::{lambda()#1}::operator()() const0
mrs_lib::SubscribeHandler<nav_msgs::Odometry_<std::allocator<void> > >::SubscribeHandler<void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (mrs_uav_state_estimators::Correction<2>::*)(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>), mrs_uav_state_estimators::Correction<2>*)::{lambda()#1}::operator()() const0
mrs_lib::SubscribeHandler<std_msgs::Float64_<std::allocator<void> > >::SubscribeHandler<>(mrs_lib::SubscribeHandlerOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const182
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/subscribe_handler.h.gcov.frameset.html b/mrs_lib/include/mrs_lib/subscribe_handler.h.gcov.frameset.html new file mode 100644 index 0000000000..9acc9fca74 --- /dev/null +++ b/mrs_lib/include/mrs_lib/subscribe_handler.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/subscribe_handler.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/include/mrs_lib/subscribe_handler.h.gcov.html b/mrs_lib/include/mrs_lib/subscribe_handler.h.gcov.html new file mode 100644 index 0000000000..f0f7215e8c --- /dev/null +++ b/mrs_lib/include/mrs_lib/subscribe_handler.h.gcov.html @@ -0,0 +1,548 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/subscribe_handler.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - subscribe_handler.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:444989.8 %
Date:2024-04-18 23:11:36Functions:38974152.5 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : // clang: MatousFormat
+       2             : /**  \file
+       3             :      \brief Defines SubscribeHandler and related convenience classes for subscribing to ROS topics.
+       4             :      \author Matouš Vrba - vrbamato@fel.cvut.cz
+       5             :  */
+       6             : 
+       7             : #ifndef SUBRSCRIBE_HANDLER_H
+       8             : #define SUBRSCRIBE_HANDLER_H
+       9             : 
+      10             : #include <ros/ros.h>
+      11             : #include <mrs_lib/timeout_manager.h>
+      12             : 
+      13             : namespace mrs_lib
+      14             : {
+      15             : 
+      16             :   static const ros::Duration no_timeout = ros::Duration(0);
+      17             : 
+      18             :   /* struct SubscribeHandlerOptions //{ */
+      19             :   
+      20             :   /**
+      21             :   * \brief A helper class to simplify setup of SubscribeHandler construction.
+      22             :   * This class is passed to the SubscribeHandler constructor and specifies its common options.
+      23             :   *
+      24             :   * \note Any option, passed directly to the SubscribeHandler constructor outside this structure, *OVERRIDES* values in this structure.
+      25             :   * The values in this structure can be thought of as default common values for all SubscribeHandler objects you want to create,
+      26             :   * and values passed directly to the constructor as specific options for the concrete handler.
+      27             :   *
+      28             :   */
+      29             :   struct SubscribeHandlerOptions
+      30             :   {
+      31             :     SubscribeHandlerOptions(const ros::NodeHandle& nh) : nh(nh) {}
+      32        2362 :     SubscribeHandlerOptions() = default;
+      33             :   
+      34             :     ros::NodeHandle nh;  /*!< \brief The ROS NodeHandle to be used for subscription. */
+      35             :   
+      36             :     std::string node_name = {};  /*!< \brief Name of the ROS node, using this handle (used for messages printed to console). */
+      37             :   
+      38             :     std::string topic_name = {};  /*!< \brief Name of the ROS topic to be handled. */
+      39             : 
+      40             :     std::shared_ptr<mrs_lib::TimeoutManager> timeout_manager = nullptr;  /*!< \brief Will be used for handling message timouts if necessary. If no manager is specified, it will be created with rate equal to half of \p no_message_timeout. */
+      41             :   
+      42             :     ros::Duration no_message_timeout = mrs_lib::no_timeout;  /*!< \brief If no new message is received for this duration, the \p timeout_callback function will be called. If \p timeout_callback is empty, an error message will be printed to the console. */
+      43             :   
+      44             :     std::function<void(const std::string& topic_name, const ros::Time& last_msg)> timeout_callback = {};  /*!< \brief This function will be called if no new message is received for the \p no_message_timeout duration. If this variable is empty, an error message will be printed to the console. */
+      45             :   
+      46             :     bool threadsafe = true;  /*!< \brief If true, all methods of the SubscribeHandler will be mutexed (using a recursive mutex) to avoid data races. */
+      47             :   
+      48             :     bool autostart = true;  /*!< \brief If true, the SubscribeHandler will be started after construction. Otherwise it has to be started using the start() method */
+      49             :   
+      50             :     uint32_t queue_size = 3;  /*!< \brief This parameter is passed to the NodeHandle when subscribing to the topic */
+      51             :   
+      52             :     ros::TransportHints transport_hints = ros::TransportHints();  /*!< \brief This parameter is passed to the NodeHandle when subscribing to the topic */
+      53             :   };
+      54             :   
+      55             :   //}
+      56             : 
+      57             :   /* SubscribeHandler class //{ */
+      58             :   /**
+      59             :   * \brief The main class for ROS topic subscription, message timeout handling etc.
+      60             :   *
+      61             :   * This class handles the raw ROS Subscriber for a specified topic. The last message received on the topic is remembered
+      62             :   * and may be retrieved by calling the getMsg() method. To check whether at least one message was received, use hasMsg()
+      63             :   * (if no message was received and you call getMsg(), a nullptr is returned and an error message is printed). To check
+      64             :   * whether a new message has arrived since the last call to getMsg(), use newMsg() (useful to check whether a new message
+      65             :   * needs to be processed in a loop or ROS Timer callback).
+      66             :   *
+      67             :   * A timeout callback function may be specified, which is called if no message is received on the topic for a specified
+      68             :   * timeout (use the \p timeout_callback and \p no_message_timeout parameters). If the timeout callback is not set by the
+      69             :   * user, an error message is printed to the console after the timeout by default.
+      70             :   *
+      71             :   * A message callback function may be specified, which is called whenever a new message is received (use the
+      72             :   * \p message_callback parameter).
+      73             :   *
+      74             :   * The callbacks and timeouts may be stopped and started using the stop() and start() methods.
+      75             :   *
+      76             :   * For more details, see the example below (I recommend starting with the simple_example which covers most use-cases).
+      77             :   *
+      78             :   */
+      79             :   template <typename MessageType>
+      80             :   class SubscribeHandler
+      81             :   {
+      82             :     public:
+      83             :     /*!
+      84             :       * \brief Convenience type for the template parameter to enable nice aliasing.
+      85             :       */
+      86             :       using message_type = MessageType;
+      87             : 
+      88             :     /*!
+      89             :       * \brief Type for the timeout callback function.
+      90             :       */
+      91             :       using timeout_callback_t = std::function<void(const std::string& topic_name, const ros::Time& last_msg)>;
+      92             : 
+      93             :     /*!
+      94             :       * \brief Convenience type for the message callback function.
+      95             :       */
+      96             :       using message_callback_t = std::function<void(typename MessageType::ConstPtr)>;
+      97             : 
+      98             :     public:
+      99             :     /*!
+     100             :       * \brief Returns the last received message on the topic, handled by this SubscribeHandler.
+     101             :       * Use hasMsg() first to check if at least one message is available or newMsg() to check if a new message
+     102             :       * since the last call to getMsg() is available.
+     103             :       *
+     104             :       * \return the last received message.
+     105             :       */
+     106     2637718 :       virtual typename MessageType::ConstPtr getMsg() {assert(m_pimpl); return m_pimpl->getMsg();};
+     107             : 
+     108             :     /*!
+     109             :       * \brief Returns the last received message on the topic without modifying the newMsg() or usedMsg() flags.
+     110             :       *
+     111             :       * \return the last received message.
+     112             :       */
+     113           0 :       virtual typename MessageType::ConstPtr peekMsg() const {assert(m_pimpl); return m_pimpl->peekMsg();};
+     114             : 
+     115             :     /*!
+     116             :       * \brief Used to check whether at least one message has been received on the handled topic.
+     117             :       *
+     118             :       * \return true if at least one message was received, otherwise false.
+     119             :       */
+     120     2590141 :       virtual bool hasMsg() const {assert(m_pimpl); return m_pimpl->hasMsg();};
+     121             : 
+     122             :     /*!
+     123             :       * \brief Used to check whether at least one message has been received on the handled topic since the last call to getMsg().
+     124             :       *
+     125             :       * \return true if at least one message was received, otherwise false.
+     126             :       */
+     127      513977 :       virtual bool newMsg() const {assert(m_pimpl); return m_pimpl->newMsg();};
+     128             : 
+     129             :     /*!
+     130             :       * \brief Used to check whether getMsg() was called at least once on this SubscribeHandler.
+     131             :       *
+     132             :       * \return true if getMsg() was called at least once, otherwise false.
+     133             :       */
+     134           0 :       virtual bool usedMsg() const {assert(m_pimpl); return m_pimpl->usedMsg();};
+     135             : 
+     136             :     /*!
+     137             :       * \brief Blocks until new data becomes available or until the timeout runs out or until a spurious wake-up.
+     138             :       *
+     139             :       * \return the message if a new message is available after waking up, \p nullptr otherwise.
+     140             :       */
+     141           0 :       virtual typename MessageType::ConstPtr waitForNew(const ros::WallDuration& timeout) {assert(m_pimpl); return m_pimpl->waitForNew(timeout);};
+     142             : 
+     143             :     /*!
+     144             :       * \brief Returns time of the last received message on the topic, handled by this SubscribeHandler.
+     145             :       *
+     146             :       * \return time when the last message was received.
+     147             :       */
+     148      634251 :       virtual ros::Time lastMsgTime() const {assert(m_pimpl); return m_pimpl->lastMsgTime();};
+     149             : 
+     150             :     /*!
+     151             :       * \brief Returns the resolved (full) name of the topic, handled by this SubscribeHandler.
+     152             :       *
+     153             :       * \return name of the handled topic.
+     154             :       */
+     155         314 :       virtual std::string topicName() const {assert(m_pimpl); return m_pimpl->topicName();};
+     156             : 
+     157             :     /*!
+     158             :       * \brief Returns the subscribed (unresolved) name of the topic, handled by this SubscribeHandler.
+     159             :       *
+     160             :       * \return name of the handled topic.
+     161             :       */
+     162           0 :       virtual std::string subscribedTopicName() const {assert(m_pimpl); return m_pimpl->m_topic_name;};
+     163             : 
+     164             :     /*!
+     165             :       * \brief Enables the callbacks for the handled topic.
+     166             :       *
+     167             :       * If the SubscribeHandler object is stopped using the stop() method, no callbacks will be called
+     168             :       * until the start() method is called.
+     169             :       */
+     170        6015 :       virtual void start() {assert(m_pimpl); return m_pimpl->start();};
+     171             : 
+     172             :     /*!
+     173             :       * \brief Disables the callbacks for the handled topic.
+     174             :       *
+     175             :       * All messages after this method is called will be ignored until start() is called again.
+     176             :       * Timeout checking will also be disabled.
+     177             :       */
+     178           5 :       virtual void stop() {assert(m_pimpl); return m_pimpl->stop();};
+     179             : 
+     180             :     public:
+     181             :     /*!
+     182             :       * \brief Default constructor to avoid having to use pointers.
+     183             :       *
+     184             :       * It does nothing and the SubscribeHandler it constructs will also do nothing.
+     185             :       * Use some of the other constructors for actual construction of a usable SubscribeHandler.
+     186             :       */
+     187        9200 :       SubscribeHandler() {};
+     188             : 
+     189             :     /*!
+     190             :       * \brief Main constructor.
+     191             :       *
+     192             :       * \param options    The common options struct (see documentation of SubscribeHandlerOptions).
+     193             :       * \param topic_name Name of the topic to be handled by this subscribed.
+     194             :       * \param args       Remaining arguments to be parsed (see other constructors).
+     195             :       *
+     196             :       */
+     197             :       template<class ... Types>
+     198        6011 :       SubscribeHandler(
+     199             :             const SubscribeHandlerOptions& options,
+     200             :             const std::string& topic_name,
+     201             :             Types ... args
+     202             :           )
+     203             :       :
+     204             :         SubscribeHandler(
+     205        6011 :             [options, topic_name]()
+     206             :             {
+     207       12022 :               SubscribeHandlerOptions opts = options;
+     208        6011 :               opts.topic_name = topic_name;
+     209       12022 :               return opts;
+     210             :             }(),
+     211             :             args...
+     212        6011 :             )
+     213             :       {
+     214        6011 :       }
+     215             : 
+     216             :     /*!
+     217             :       * \brief Convenience constructor overload.
+     218             :       *
+     219             :       * \param options          The common options struct (see documentation of SubscribeHandlerOptions).
+     220             :       * \param message_callback The callback function to call when a new message is received (you can leave this argument empty and just use the newMsg()/hasMsg() and getMsg() interface).
+     221             :       *
+     222             :       */
+     223        6011 :       SubscribeHandler(
+     224             :             const SubscribeHandlerOptions& options,
+     225             :             const message_callback_t& message_callback = {}
+     226             :           )
+     227        6011 :       {
+     228        6011 :         if (options.threadsafe)
+     229             :         {
+     230        6011 :           m_pimpl = std::make_unique<ImplThreadsafe>
+     231             :             (
+     232             :               options,
+     233             :               message_callback
+     234             :             );
+     235             :         }
+     236             :         else
+     237             :         {
+     238           0 :           m_pimpl = std::make_unique<Impl>
+     239             :             (
+     240             :               options,
+     241             :               message_callback
+     242             :             );
+     243             :         }
+     244        6011 :         if (options.autostart)
+     245        6010 :           start();
+     246        6011 :       };
+     247             : 
+     248             :     /*!
+     249             :       * \brief Convenience constructor overload.
+     250             :       *
+     251             :       * \param options          The common options struct (see documentation of SubscribeHandlerOptions).
+     252             :       * \param timeout_callback The callback function to call when a new message is not received for the duration, specified in \p options or in the \p no_message_timeout parameter.
+     253             :       * \param args             Remaining arguments to be parsed (see other constructors).
+     254             :       *
+     255             :       */
+     256             :       template <class ... Types>
+     257           1 :       SubscribeHandler(
+     258             :             const SubscribeHandlerOptions& options,
+     259             :             const timeout_callback_t& timeout_callback,
+     260             :             Types ... args
+     261             :           )
+     262             :       :
+     263             :         SubscribeHandler(
+     264           1 :             [options, timeout_callback]()
+     265             :             {
+     266           2 :               SubscribeHandlerOptions opts = options;
+     267           1 :               opts.timeout_callback = timeout_callback;
+     268           2 :               return opts;
+     269             :             }(),
+     270             :             args...
+     271           1 :             )
+     272             :       {
+     273           1 :       }
+     274             : 
+     275             :     /*!
+     276             :       * \brief Convenience constructor overload.
+     277             :       *
+     278             :       * \param options          The common options struct (see documentation of SubscribeHandlerOptions).
+     279             :       * \param timeout_callback The callback method to call when a new message is not received for the duration, specified in \p options or in the \p no_message_timeout parameter.
+     280             :       * \param obj1             The object on which the callback method \p timeout_callback will be called.
+     281             :       * \param args             Remaining arguments to be parsed (see other constructors).
+     282             :       *
+     283             :       */
+     284             :       template <class ObjectType1, class ... Types>
+     285             :       SubscribeHandler(
+     286             :             const SubscribeHandlerOptions& options,
+     287             :             void (ObjectType1::*const timeout_callback) (const std::string& topic_name, const ros::Time& last_msg),
+     288             :             ObjectType1* const obj1,
+     289             :             Types ... args
+     290             :           )
+     291             :       :
+     292             :         SubscribeHandler(
+     293             :             [options, timeout_callback, obj1]()
+     294             :             {
+     295             :               SubscribeHandlerOptions opts = options;
+     296             :               opts.timeout_callback = timeout_callback == nullptr ? timeout_callback_t() : std::bind(timeout_callback, obj1, std::placeholders::_1, std::placeholders::_2);
+     297             :               return opts;
+     298             :             }(),
+     299             :             args...
+     300             :             )
+     301             :       {
+     302             :       }
+     303             : 
+     304             :     /*!
+     305             :       * \brief Convenience constructor overload.
+     306             :       *
+     307             :       * \param options          The common options struct (see documentation of SubscribeHandlerOptions).
+     308             :       * \param message_callback The callback method to call when a new message is received.
+     309             :       * \param obj2             The object on which the callback method \p timeout_callback will be called.
+     310             :       * \param args             Remaining arguments to be parsed (see other constructors).
+     311             :       *
+     312             :       */
+     313             :       template <class ObjectType2, class ... Types>
+     314        2549 :       SubscribeHandler(
+     315             :             const SubscribeHandlerOptions& options,
+     316             :             void (ObjectType2::*const message_callback) (typename MessageType::ConstPtr),
+     317             :             ObjectType2* const obj2,
+     318             :             Types ... args
+     319             :           )
+     320             :       :
+     321             :         SubscribeHandler(
+     322             :             options,
+     323        5098 :             message_callback == nullptr ? message_callback_t() : std::bind(message_callback, obj2, std::placeholders::_1),
+     324             :             args...
+     325        2549 :             )
+     326             :       {
+     327        2549 :       }
+     328             : 
+     329             :     /*!
+     330             :       * \brief Convenience constructor overload.
+     331             :       *
+     332             :       * \param options          The common options struct (see documentation of SubscribeHandlerOptions).
+     333             :       * \param message_callback The callback method to call when a new message is received.
+     334             :       * \param obj2             The object on which the callback method \p timeout_callback will be called.
+     335             :       * \param timeout_callback The callback method to call when a new message is not received for the duration, specified in \p options or in the \p no_message_timeout parameter.
+     336             :       * \param obj1             The object on which the callback method \p timeout_callback will be called.
+     337             :       * \param args             Remaining arguments to be parsed (see other constructors).
+     338             :       *
+     339             :       */
+     340             :      template <class ObjectType1, class ObjectType2, class ... Types>
+     341             :      SubscribeHandler(
+     342             :            const SubscribeHandlerOptions& options,
+     343             :            void (ObjectType2::*const message_callback) (typename MessageType::ConstPtr),
+     344             :            ObjectType2* const obj2,
+     345             :            void (ObjectType1::*const timeout_callback) (const std::string& topic_name, const ros::Time& last_msg),
+     346             :            ObjectType1* const obj1,
+     347             :            Types ... args
+     348             :          )
+     349             :      :
+     350             :        SubscribeHandler(
+     351             :             [options, timeout_callback, obj1]()
+     352             :             {
+     353             :               SubscribeHandlerOptions opts = options;
+     354             :               opts.timeout_callback = timeout_callback == nullptr ? timeout_callback_t() : std::bind(timeout_callback, obj1, std::placeholders::_1, std::placeholders::_2);
+     355             :               return opts;
+     356             :             }(),
+     357             :             message_callback == nullptr ? message_callback_t() : std::bind(message_callback, obj2, std::placeholders::_1),
+     358             :             args...
+     359             :             )
+     360             :      {
+     361             :      }
+     362             : 
+     363             :     /*!
+     364             :       * \brief Convenience constructor overload.
+     365             :       *
+     366             :       * \param options            The common options struct (see documentation of SubscribeHandlerOptions).
+     367             :       * \param no_message_timeout If no message is received for this duration, the timeout callback function is called. If no timeout callback is specified, an error message is printed to the console.
+     368             :       * \param args               Remaining arguments to be parsed (see other constructors).
+     369             :       *
+     370             :       */
+     371             :       template<class ... Types>
+     372             :       SubscribeHandler(
+     373             :             const SubscribeHandlerOptions& options,
+     374             :             const ros::Duration& no_message_timeout,
+     375             :             Types ... args
+     376             :           )
+     377             :       :
+     378             :         SubscribeHandler(
+     379             :             [options, no_message_timeout]()
+     380             :             {
+     381             :               SubscribeHandlerOptions opts = options;
+     382             :               opts.no_message_timeout = no_message_timeout;
+     383             :               return opts;
+     384             :             }(),
+     385             :             args...
+     386             :             )
+     387             :       {
+     388             :       }
+     389             : 
+     390             :     /*!
+     391             :       * \brief Convenience constructor overload.
+     392             :       *
+     393             :       * \param options          The common options struct (see documentation of SubscribeHandlerOptions).
+     394             :       * \param timeout_manager  The manager for timeout callbacks.
+     395             :       * \param args             Remaining arguments to be parsed (see other constructors).
+     396             :       *
+     397             :       */
+     398             :       template <class ... Types>
+     399             :       SubscribeHandler(
+     400             :             const SubscribeHandlerOptions& options,
+     401             :             mrs_lib::TimeoutManager& timeout_manager,
+     402             :             Types ... args
+     403             :           )
+     404             :       :
+     405             :         SubscribeHandler(
+     406             :             options,
+     407             :             timeout_manager = timeout_manager,
+     408             :             args...
+     409             :             )
+     410             :       {
+     411             :       }
+     412             : 
+     413       15231 :       ~SubscribeHandler() = default;
+     414             :       // delete copy constructor and assignment operator (forbid copying shandlers)
+     415             :       SubscribeHandler(const SubscribeHandler&) = delete;
+     416             :       SubscribeHandler& operator=(const SubscribeHandler&) = delete;
+     417             :       // define only move constructor and assignemnt operator
+     418          20 :       SubscribeHandler(SubscribeHandler&& other)
+     419          20 :       {
+     420          20 :         this->m_pimpl = std::move(other.m_pimpl);
+     421          20 :         other.m_pimpl = nullptr;
+     422          20 :       }
+     423        5900 :       SubscribeHandler& operator=(SubscribeHandler&& other)
+     424             :       {
+     425        5900 :         this->m_pimpl = std::move(other.m_pimpl);
+     426        5900 :         other.m_pimpl = nullptr;
+     427        5900 :         return *this;
+     428             :       }
+     429             : 
+     430             :     private:
+     431             :       class Impl;
+     432             :       class ImplThreadsafe;
+     433             :       std::unique_ptr<Impl> m_pimpl;
+     434             :   };
+     435             :   //}
+     436             : 
+     437             : /*!
+     438             :   * \brief Helper alias for convenient extraction of handled message type from a SubscribeHandlerPtr.
+     439             :   */
+     440             :   template<typename SubscribeHandler>
+     441             :   using message_type = typename SubscribeHandler::message_type;
+     442             : 
+     443             : /*!
+     444             :   * \brief Helper function for object construstion e.g. in case of member objects.
+     445             :   * This function is useful to avoid specifying object template parameters twice - once in definition of the variable and second time during object construction.
+     446             :   * This function can deduce the template parameters from the type of the already defined object, because it returns the newly constructed object as a reference
+     447             :   * argument and not as a return type.
+     448             :   *
+     449             :   * \param object The object to be constructed.
+     450             :   * \param args   These arguments are passed to the object constructor.
+     451             :   */
+     452             :   template<typename Class, class ... Types>
+     453             :   void construct_object(
+     454             :         Class& object,
+     455             :         Types ... args
+     456             :       )
+     457             :   {
+     458             :     object = Class(args...);
+     459             :   }
+     460             : }
+     461             : 
+     462             : #include <mrs_lib/impl/subscribe_handler.hpp>
+     463             : 
+     464             : #endif // SUBRSCRIBE_HANDLER_H
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/subscribe_handler.h.gcov.overview.html b/mrs_lib/include/mrs_lib/subscribe_handler.h.gcov.overview.html new file mode 100644 index 0000000000..056386c498 --- /dev/null +++ b/mrs_lib/include/mrs_lib/subscribe_handler.h.gcov.overview.html @@ -0,0 +1,136 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/subscribe_handler.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/include/mrs_lib/subscribe_handler.h.gcov.png b/mrs_lib/include/mrs_lib/subscribe_handler.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..b6e9ccb1d3175600727e604938e2df9a1db1b393 GIT binary patch literal 1783 zcmVGAf72gj3K5r zbz2ND5}}4FQEmJ&0qHg3YyO-C@r%I16(bOAcI{2~uIrUq&|?~*Fbke#KB6~6I8Vnr z*#`C}y~&UtGp8aqYx()_!9H3$vYLf#J|t)Of*?k(LiRez2b~a-7VDb>@sJ(OR zSPm&vvJ`~KR`Ok-ZVqcFgM8B6WXF=d6m!tz668ytM&>Z-6K5u6q!$AOc%jcH>3fS({;hPmwMn+C2MvDs~C)tCPOw1-3bupJYJgBin5(kdU98OtK zN-*pu2VTAz1vBYHiE0uiLlN>kL#(mB6FXs73unw;3sz_yc$`3{Fzh2wZJ5Y%O{q?O z6g)UZIm3|l&g)}FbTz%1oSPcWrg26f^ROQycTEwZjt5oF07LA8$5R1_ppf;LRN)NXH-nI=1IRZ;*ZXa1Jm$BBU5$hac6W< z>vHD0c*JRm88FCYuB0SXfeBrz8I(kg#WX;~w>RzSqhg>oXf`nCRNAM4{w5XvjlTQ9 zi<_&mKLc=%xTNe^@O*xL-tYJCpTGOpo!b|_@K;}}ps7tqC`HZ1s>Z;0N`fAZxipr! zT+JxJq3Mhs445)zWWji4^t|CQ!b8ANjVo;ChlhY6?T6suCbcma-FuA(#UuKr*Q4ycwyjT-@Af7jjOV# z1}X6BnolZtX|LeqUB29-p!+za)O=u=YT11ec{{UJ2gnCyJ$DS0)QGKqEA> zyv^&elvmKyrlVVS{8|Sfw;woTVV40RMpHY^Ip6CV;4}VE?-si#x8M(3=8X zL5s=>ou>R#tqPAJ6&N4mRxM#Slrw2_gpYNmF=oCUVf0`e;s!TL)>@Lh6M z1b;Q9l#Bu*NR%Sm|N54f;T}SbW~y~$N6c$RxX$#k;(w-iXq@Ae&+a*xjc`l|iCimSGlp%iNo zmj%`H0CA`Bg?F!~%P6IkY8v=0l;Y7Tx!)1|3+Xzm-Sze((0I;u;~&MXuQxstxT(KY zX(e(pqT9~%KW^TUqLm<}a6q|Gi{807Q{a<@olDO1>&?kSZ5w1K*wbh>t$iprRF+ck ziO$Ts4mAXAeRMQ)PEX@CnHIEgiUfFjEjoFq{_I)!@FN41v;5;w+=cL$!u>PPEJ%xJ zh?{xIOs}QF171_jPJ9*c4`*F09O$uQMu)yez?5JhmHe;jSDyG-brQgzcQ(Vv?+oq; zK?^@BX1I#M8`Opk0%sintuOW+}mrx)Rs|8>y8oYETAgY|8< Z{{wkhUB=a#p|$`3002ovPDHLkV1nx6SeyU= literal 0 HcmV?d00001 diff --git a/mrs_lib/include/mrs_lib/timeout_manager.h.func-sort-c.html b/mrs_lib/include/mrs_lib/timeout_manager.h.func-sort-c.html new file mode 100644 index 0000000000..8b827f516d --- /dev/null +++ b/mrs_lib/include/mrs_lib/timeout_manager.h.func-sort-c.html @@ -0,0 +1,80 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/timeout_manager.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - timeout_manager.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:44100.0 %
Date:2024-04-18 23:11:36Functions:00-
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + +

Function Name Sort by function nameHit count Sort by hit count
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/timeout_manager.h.func.html b/mrs_lib/include/mrs_lib/timeout_manager.h.func.html new file mode 100644 index 0000000000..36e3191b19 --- /dev/null +++ b/mrs_lib/include/mrs_lib/timeout_manager.h.func.html @@ -0,0 +1,80 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/timeout_manager.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - timeout_manager.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:44100.0 %
Date:2024-04-18 23:11:36Functions:00-
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + +

Function Name Sort by function nameHit count Sort by hit count
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/timeout_manager.h.gcov.frameset.html b/mrs_lib/include/mrs_lib/timeout_manager.h.gcov.frameset.html new file mode 100644 index 0000000000..e77822ab61 --- /dev/null +++ b/mrs_lib/include/mrs_lib/timeout_manager.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/timeout_manager.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/include/mrs_lib/timeout_manager.h.gcov.html b/mrs_lib/include/mrs_lib/timeout_manager.h.gcov.html new file mode 100644 index 0000000000..6475fbef2d --- /dev/null +++ b/mrs_lib/include/mrs_lib/timeout_manager.h.gcov.html @@ -0,0 +1,169 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/timeout_manager.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - timeout_manager.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:44100.0 %
Date:2024-04-18 23:11:36Functions:00-
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : // clang: MatousFormat
+       2             : /**  \file
+       3             :      \brief TODO
+       4             :      \author Matouš Vrba - vrbamato@fel.cvut.cz
+       5             :  */
+       6             : 
+       7             : #ifndef TIMEOUT_MANAGER_H
+       8             : #define TIMEOUT_MANAGER_H
+       9             : 
+      10             : #include <ros/ros.h>
+      11             : 
+      12             : namespace mrs_lib
+      13             : {
+      14             :   /* TimeoutManager class //{ */
+      15             :   /**
+      16             :   * \brief TODO
+      17             :   *
+      18             :   */
+      19             :   class TimeoutManager
+      20             :   {
+      21             :     public:
+      22             :       // | ---------------------- public types ---------------------- |
+      23             :       using timeout_id_t = size_t;
+      24             :       using callback_t = std::function<void(const ros::Time&)>;
+      25             : 
+      26             :     public:
+      27             :       // | --------------------- public methods --------------------- |
+      28             : 
+      29             :     /*!
+      30             :       * \brief TODO
+      31             :       *
+      32             :       */
+      33             :       TimeoutManager(const ros::NodeHandle& nh, const ros::Rate& update_rate);
+      34             : 
+      35          77 :       timeout_id_t registerNew(const ros::Duration& timeout, const callback_t& callback, const ros::Time& last_reset = ros::Time::now(), const bool oneshot = false, const bool autostart = true);
+      36             : 
+      37      148813 :       void reset(const timeout_id_t id, const ros::Time& time = ros::Time::now());
+      38             : 
+      39             :       void pause(const timeout_id_t id);
+      40             : 
+      41          81 :       void start(const timeout_id_t id, const ros::Time& time = ros::Time::now());
+      42             : 
+      43             :       void pauseAll();
+      44             : 
+      45           2 :       void startAll(const ros::Time& time = ros::Time::now());
+      46             : 
+      47             :       void change(const timeout_id_t id, const ros::Duration& timeout, const callback_t& callback, const ros::Time& last_reset = ros::Time::now(), const bool oneshot = false, const bool autostart = true);
+      48             : 
+      49             :       ros::Time lastReset(const timeout_id_t id);
+      50             : 
+      51             :       bool started(const timeout_id_t id);
+      52             : 
+      53             :       /* implementation details //{ */
+      54             :       
+      55             :       private:
+      56             :         // | ---------------------- private types --------------------- |
+      57             :         struct timeout_info_t
+      58             :         {
+      59             :           bool oneshot;
+      60             :           bool started;
+      61             :           callback_t callback;
+      62             :           ros::Duration timeout;
+      63             :           ros::Time last_reset;
+      64             :           ros::Time last_callback;
+      65             :         };
+      66             :       
+      67             :       private:
+      68             :         // | --------------------- private methods -------------------- |
+      69             :         void main_timer_callback([[maybe_unused]] const ros::TimerEvent& evt);
+      70             :       
+      71             :       private:
+      72             :         // | ------------------------- members ------------------------ |
+      73             :         std::recursive_mutex m_mtx;
+      74             :         timeout_id_t m_last_id;
+      75             :         std::vector<timeout_info_t> m_timeouts;
+      76             :       
+      77             :         ros::Timer m_main_timer;
+      78             :       
+      79             :       //}
+      80             : 
+      81             :   };
+      82             :   //}
+      83             : }
+      84             : 
+      85             : #endif // TIMEOUT_MANAGER_H
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/timeout_manager.h.gcov.overview.html b/mrs_lib/include/mrs_lib/timeout_manager.h.gcov.overview.html new file mode 100644 index 0000000000..bc8b5520c4 --- /dev/null +++ b/mrs_lib/include/mrs_lib/timeout_manager.h.gcov.overview.html @@ -0,0 +1,42 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/timeout_manager.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/include/mrs_lib/timeout_manager.h.gcov.png b/mrs_lib/include/mrs_lib/timeout_manager.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..8fad76eb55ea38224226aeafae950c60603e0c51 GIT binary patch literal 435 zcmV;k0ZjghP)FbGV30AJ7_B>(?gH76boi%nZP&RAz%mP1g-o|!nA8yb_>Ak{J@2IPED z(QvE76Xq8;Zb5G+Q-BuNDP}a87$YJ2@BoU!otC!W0Elu@E;9fG2_2ljUcy zeedj?1eRACO;ed}82YA;lgv+B^kFb%aEJ$&%+KeDnOkjZCRF>Y>n}7 z63Ti0yY4{9GUF;Ti4T5V#Rb56dy_r(|@l~>CSqvT + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/timer.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - timer.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:44100.0 %
Date:2024-04-18 23:11:36Functions:6785.7 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::MRSTimer::~MRSTimer()0
mrs_lib::ThreadTimer::~ThreadTimer()8
mrs_lib::ThreadTimer::~ThreadTimer().28
mrs_lib::ROSTimer::~ROSTimer()8
mrs_lib::ROSTimer::~ROSTimer().28
mrs_lib::MRSTimer::MRSTimer()16
mrs_lib::MRSTimer::~MRSTimer().216
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/timer.h.func.html b/mrs_lib/include/mrs_lib/timer.h.func.html new file mode 100644 index 0000000000..69adc45c4b --- /dev/null +++ b/mrs_lib/include/mrs_lib/timer.h.func.html @@ -0,0 +1,108 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/timer.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - timer.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:44100.0 %
Date:2024-04-18 23:11:36Functions:6785.7 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::ThreadTimer::~ThreadTimer()8
mrs_lib::ThreadTimer::~ThreadTimer().28
mrs_lib::MRSTimer::MRSTimer()16
mrs_lib::MRSTimer::~MRSTimer()0
mrs_lib::MRSTimer::~MRSTimer().216
mrs_lib::ROSTimer::~ROSTimer()8
mrs_lib::ROSTimer::~ROSTimer().28
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/timer.h.gcov.frameset.html b/mrs_lib/include/mrs_lib/timer.h.gcov.frameset.html new file mode 100644 index 0000000000..558a47b8e4 --- /dev/null +++ b/mrs_lib/include/mrs_lib/timer.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/timer.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/include/mrs_lib/timer.h.gcov.html b/mrs_lib/include/mrs_lib/timer.h.gcov.html new file mode 100644 index 0000000000..dac2bef4c8 --- /dev/null +++ b/mrs_lib/include/mrs_lib/timer.h.gcov.html @@ -0,0 +1,355 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/timer.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - timer.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:44100.0 %
Date:2024-04-18 23:11:36Functions:6785.7 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : #ifndef MRS_TIMER_H
+       2             : #define MRS_TIMER_H
+       3             : 
+       4             : #include <ros/ros.h>
+       5             : #include <thread>
+       6             : #include <mutex>
+       7             : #include <condition_variable>
+       8             : #include <atomic>
+       9             : 
+      10             : namespace mrs_lib
+      11             : {
+      12             :   bool breakable_sleep(const ros::Duration& dur, const std::atomic<bool>& continue_sleep);
+      13             : 
+      14             :   /**
+      15             :    * @brief Common wrapper representing the functionality of the ros::Timer.
+      16             :    *
+      17             :    * The implementation can then use either ros::Timer (the ROSTimer class)
+      18             :    * or threads and synchronization primitives from the C++ standard library
+      19             :    * (the ThreadTimer class). Both these variants implement the same interface.
+      20             :    *
+      21             :    * @note Functionality of the two implementations differs in some details.
+      22             :    */
+      23             :   class MRSTimer
+      24             :   {
+      25             :     public:
+      26             :     using callback_t = std::function<void(const ros::TimerEvent&)>;
+      27             : 
+      28             :     /**
+      29             :      * @brief stop the timer
+      30             :      */
+      31             :     virtual void stop() = 0;
+      32             : 
+      33             :     /**
+      34             :      * @brief start the timer
+      35             :      */
+      36             :     virtual void start() = 0;
+      37             : 
+      38             :     /**
+      39             :      * @brief set the timer period/duration
+      40             :      *
+      41             :      * @param duration
+      42             :      * @param reset
+      43             :      */
+      44             :     virtual void setPeriod(const ros::Duration& duration, const bool reset = true) = 0;
+      45             : 
+      46             :     /**
+      47             :      * @brief change the callback method 
+      48             :      *
+      49             :      * Usable e.g. for running thread with a specific parameter if you bind it using std::bind
+      50             :      *
+      51             :      * @param callback          callback method to be called.
+      52             :      */
+      53             :     virtual void setCallback(const std::function<void(const ros::TimerEvent&)>& callback) = 0;
+      54             : 
+      55             :     /**
+      56             :      * @brief returns true if callbacks should be called
+      57             :      *
+      58             :      * @return true if timer is running
+      59             :      */
+      60             :     virtual bool running() = 0;
+      61             : 
+      62          16 :     virtual ~MRSTimer() = default;
+      63             :     MRSTimer(const MRSTimer&) = default;
+      64             :     MRSTimer(MRSTimer&&) = default;
+      65             :     MRSTimer& operator=(const MRSTimer&) = default;
+      66             :     MRSTimer& operator=(MRSTimer&&) = default;
+      67             : 
+      68             :     protected:
+      69          16 :     MRSTimer() = default;
+      70             :   };
+      71             : 
+      72             :   // | ------------------------ ROSTimer ------------------------ |
+      73             : 
+      74             :   /* class ROSTimer //{ */
+      75             : 
+      76             :   /**
+      77             :    * @brief ros::Timer wrapper. The interface is the same as with ros::Timer, except for the initialization method.
+      78             :    */
+      79             :   class ROSTimer : public MRSTimer {
+      80             :   public:
+      81             :     ROSTimer();
+      82             : 
+      83             :     /**
+      84             :      * @brief Constructs the object.
+      85             :      *
+      86             :      * @tparam ObjectType
+      87             :      * @param nh                            ROS node handle to be used for creating the underlying ros::Timer object.
+      88             :      * @param rate                          rate at which the callback should be called.
+      89             :      * @param ObjectType::*const callback   callback method to be called.
+      90             :      * @param obj                           object for the method.
+      91             :      * @param oneshot                       whether the callback should only be called once after starting.
+      92             :      * @param autostart                     whether the timer should immediately start after construction.
+      93             :      */
+      94             :     template <class ObjectType>
+      95             :     ROSTimer(const ros::NodeHandle& nh, const ros::Rate& rate, void (ObjectType::*const callback)(const ros::TimerEvent&), ObjectType* const obj,
+      96             :              const bool oneshot = false, const bool autostart = true);
+      97             : 
+      98             :     /**
+      99             :      * @brief full constructor
+     100             :      *
+     101             :      * @tparam ObjectType
+     102             :      * @param nh                            ROS node handle to be used for creating the underlying ros::Timer object.
+     103             :      * @param duration                      desired callback period.
+     104             :      * @param ObjectType::*const callback   callback method to be called.
+     105             :      * @param obj                           object for the method.
+     106             :      * @param oneshot                       whether the callback should only be called once after starting.
+     107             :      * @param autostart                     whether the timer should immediately start after construction.
+     108             :      */
+     109             :     template <class ObjectType>
+     110             :     ROSTimer(const ros::NodeHandle& nh, const ros::Duration& duration, void (ObjectType::*const callback)(const ros::TimerEvent&), ObjectType* const obj,
+     111             :              const bool oneshot = false, const bool autostart = true);
+     112             : 
+     113             :     /**
+     114             :      * @brief stop the timer
+     115             :      */
+     116             :     virtual void stop() override;
+     117             : 
+     118             :     /**
+     119             :      * @brief start the timer
+     120             :      */
+     121             :     virtual void start() override;
+     122             : 
+     123             :     /**
+     124             :      * @brief set the timer period/duration
+     125             :      *
+     126             :      * @param duration
+     127             :      * @param reset
+     128             :      */
+     129             :     virtual void setPeriod(const ros::Duration& duration, const bool reset = true) override;
+     130             : 
+     131             :     /**
+     132             :      * @brief change the callback method
+     133             :      *
+     134             :      * Usable e.g. for running thread with a specific parameter if you bind it using std::bind
+     135             :      *
+     136             :      * @param callback          callback method to be called.
+     137             :      */
+     138             :     virtual void setCallback(const std::function<void(const ros::TimerEvent&)>& callback) override;
+     139             : 
+     140             :     /**
+     141             :      * @brief returns true if callbacks should be called
+     142             :      *
+     143             :      * @return true if timer is running
+     144             :      */
+     145             :     virtual bool running() override;
+     146             : 
+     147          16 :     virtual ~ROSTimer() override {stop();};
+     148             :     // to keep rule of five since we have a custom destructor
+     149             :     ROSTimer(const ROSTimer&) = delete;
+     150             :     ROSTimer(ROSTimer&&) = delete;
+     151             :     ROSTimer& operator=(const ROSTimer&) = delete;
+     152             :     ROSTimer& operator=(ROSTimer&&) = delete;
+     153             : 
+     154             :   private:
+     155             :     std::mutex mutex_timer_;
+     156             : 
+     157             :     std::unique_ptr<ros::Timer> timer_;
+     158             :   };
+     159             : 
+     160             :   //}
+     161             : 
+     162             :   // | ----------------------- ThreadTimer ---------------------- |
+     163             : 
+     164             :   /* class ThreadTimer //{ */
+     165             : 
+     166             :   /**
+     167             :    * @brief Custom thread-based Timers with the same interface as mrs_lib::ROSTimer.
+     168             :    */
+     169             :   class ThreadTimer : public MRSTimer {
+     170             : 
+     171             :   public:
+     172             :     ThreadTimer();
+     173             : 
+     174             :     /**
+     175             :      * @brief Constructs the object.
+     176             :      *
+     177             :      * @tparam ObjectType
+     178             :      * @param nh                            ignored (used just for consistency with ROSTimer)
+     179             :      * @param rate                          rate at which the callback should be called.
+     180             :      * @param ObjectType::*const callback   callback method to be called.
+     181             :      * @param obj                           object for the method.
+     182             :      * @param oneshot                       whether the callback should only be called once after starting.
+     183             :      * @param autostart                     whether the timer should immediately start after construction.
+     184             :      */
+     185             :     template <class ObjectType>
+     186             :     ThreadTimer(const ros::NodeHandle& nh, const ros::Rate& rate, void (ObjectType::*const callback)(const ros::TimerEvent&), ObjectType* const obj,
+     187             :                 const bool oneshot = false, const bool autostart = true);
+     188             : 
+     189             :     /**
+     190             :      * @brief Constructs the object.
+     191             :      *
+     192             :      * @tparam ObjectType
+     193             :      * @param nh                            ignored (used just for consistency with ROSTimer)
+     194             :      * @param duration                      desired callback period.
+     195             :      * @param ObjectType::*const callback   callback method to be called.
+     196             :      * @param obj                           object for the method.
+     197             :      * @param oneshot                       whether the callback should only be called once after starting.
+     198             :      * @param autostart                     whether the timer should immediately start after construction.
+     199             :      */
+     200             :     template <class ObjectType>
+     201             :     ThreadTimer(const ros::NodeHandle& nh, const ros::Duration& duration, void (ObjectType::*const callback)(const ros::TimerEvent&), ObjectType* const obj,
+     202             :                 bool oneshot = false, const bool autostart = true);
+     203             : 
+     204             :     /**
+     205             :      * @brief stop the timer
+     206             :      *
+     207             :      * No more callbacks will be called after this method returns.
+     208             :      */
+     209             :     virtual void stop() override;
+     210             : 
+     211             :     /**
+     212             :      * @brief start the timer
+     213             :      *
+     214             :      * The first callback will be called in now + period.
+     215             :      *
+     216             :      * @note If the timer is already started, nothing will change.
+     217             :      */
+     218             :     virtual void start() override;
+     219             : 
+     220             :     /**
+     221             :      * @brief set the timer period/duration
+     222             :      *
+     223             :      * The new period will be applied after the next callback.
+     224             :      *
+     225             :      * @param duration the new desired callback period.
+     226             :      * @param reset    ignored in this implementation.
+     227             :      */
+     228             :     virtual void setPeriod(const ros::Duration& duration, const bool reset = true) override;
+     229             :     
+     230             :     /**
+     231             :      * @brief change the callback method
+     232             :      *
+     233             :      * Usable e.g. for running thread with a specific parameter if you bind it using std::bind
+     234             :      *
+     235             :      * @param callback          callback method to be called.
+     236             :      */
+     237             :     virtual void setCallback(const std::function<void(const ros::TimerEvent&)>& callback) override;
+     238             : 
+     239             :     /**
+     240             :      * @brief returns true if callbacks should be called
+     241             :      *
+     242             :      * @return true if timer is running
+     243             :      */
+     244             :     virtual bool running() override;
+     245             : 
+     246             :     /**
+     247             :      * @brief stops the timer and then destroys the object
+     248             :      *
+     249             :      * No more callbacks will be called when the destructor is started.
+     250             :      */
+     251          16 :     virtual ~ThreadTimer() override {stop();};
+     252             :     // to keep rule of five since we have a custom destructor
+     253             :     ThreadTimer(const ThreadTimer&) = delete;
+     254             :     ThreadTimer(ThreadTimer&&) = delete;
+     255             :     ThreadTimer& operator=(const ThreadTimer&) = delete;
+     256             :     ThreadTimer& operator=(ThreadTimer&&) = delete;
+     257             : 
+     258             :   private:
+     259             :     class Impl;
+     260             : 
+     261             :     std::unique_ptr<Impl> impl_;
+     262             : 
+     263             :   };  // namespace mrs_lib
+     264             : 
+     265             :   //}
+     266             : 
+     267             : #include <mrs_lib/impl/timer.hpp>
+     268             : 
+     269             : }  // namespace mrs_lib
+     270             : 
+     271             : #endif  // MRS_TIMER_H
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/timer.h.gcov.overview.html b/mrs_lib/include/mrs_lib/timer.h.gcov.overview.html new file mode 100644 index 0000000000..d88669cb74 --- /dev/null +++ b/mrs_lib/include/mrs_lib/timer.h.gcov.overview.html @@ -0,0 +1,88 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/timer.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/include/mrs_lib/timer.h.gcov.png b/mrs_lib/include/mrs_lib/timer.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..7b39300b63d0b8b3c26f48a5ebff8d932b14161e GIT binary patch literal 935 zcmV;Y16cftP)B8%(T`(U zA#=WBMF1CF1_~tAoSLB3wB9qhID)EY5bF;NXw0rrjSX-(rUn5I6AFtPa11Gcg#HQe zE_f2C;RF*cH~`O-js1AMUa$4Ftu)Dn~K2rAD4UkSMwq7W+zZGcHiPu=c zrXffD+=5;!&?IxI9zbTy9P z)0{)RwWl9ZGF?8SPAFC_>antqrC^khwi%V6D&cs3Hsn@er!g8VLEzF{3TnF{GKWp$ zQIMvM6pW+d${^8tNrfA<$vie>Kqw%3gjfimbKJ_N-Cc99{C%Egg@3vL?t{5$#wet| zKyA`b)9eky*{mAeQ4Eq4`=sqR`c;5&Z-*UH=NDb*m^jV(d&FTd#>C6ukl~H ztj9N&^7z13)RJ0gHl(#Ft}WQJZd!JXHC?Y*+-cP0uS7D*oYpvXLWvrSNfY*a`@*Cd z>)8~4hkjR}JNZ@*L_q(f$vxBvAbX9jk#rVklg9sbB$ZP=GfRBj3Em^A5-h4N@W$j0 zNyQ{>DHHkDaikEC_M3eBV+2PHm + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/transformer.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - transformer.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:516085.0 %
Date:2024-04-18 23:11:36Functions:141877.8 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
std::optional<boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > > > mrs_lib::Transformer::transformSingle<mrs_msgs::ReferenceStamped_<std::allocator<void> > >(boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > const> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)0
std::optional<boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > > > mrs_lib::Transformer::transformSingle<mrs_msgs::ReferenceStamped_<std::allocator<void> > >(boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)0
std::optional<boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > > > mrs_lib::Transformer::transform<mrs_msgs::ReferenceStamped_<std::allocator<void> > >(boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > const> const&, geometry_msgs::TransformStamped_<std::allocator<void> > const&)0
std::optional<boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > > > mrs_lib::Transformer::transform<mrs_msgs::ReferenceStamped_<std::allocator<void> > >(boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > > const&, geometry_msgs::TransformStamped_<std::allocator<void> > const&)0
std::optional<boost::shared_ptr<geometry_msgs::Quaternion_<std::allocator<void> > > > mrs_lib::Transformer::transformSingle<geometry_msgs::Quaternion_<std::allocator<void> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::shared_ptr<geometry_msgs::Quaternion_<std::allocator<void> > const> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)1
std::optional<boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > > > mrs_lib::Transformer::transformSingle<geometry_msgs::PointStamped_<std::allocator<void> > >(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1
std::optional<boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > > > mrs_lib::Transformer::transformSingle<geometry_msgs::PointStamped_<std::allocator<void> > >(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1
mrs_lib::Transformer::inverse(geometry_msgs::TransformStamped_<std::allocator<void> > const&)1
mrs_lib::Transformer::setLookupTimeout(ros::Duration)2
mrs_lib::Transformer::setDefaultPrefix(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)285
mrs_lib::Transformer::retryLookupNewest(bool)456
mrs_lib::Transformer::resolveFrame(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1026
mrs_lib::Transformer::setDefaultFrame(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)440503
mrs_lib::Transformer::frame_from[abi:cxx11](geometry_msgs::TransformStamped_<std::allocator<void> >&)1866721
mrs_lib::Transformer::create_transform(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&, geometry_msgs::Transform_<std::allocator<void> > const&)1866743
mrs_lib::Transformer::frame_from[abi:cxx11](geometry_msgs::TransformStamped_<std::allocator<void> > const&)1868772
mrs_lib::Transformer::frame_to[abi:cxx11](geometry_msgs::TransformStamped_<std::allocator<void> > const&)1868778
mrs_lib::Transformer::frame_to[abi:cxx11](geometry_msgs::TransformStamped_<std::allocator<void> >&)1869152
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/transformer.h.func.html b/mrs_lib/include/mrs_lib/transformer.h.func.html new file mode 100644 index 0000000000..eac64304de --- /dev/null +++ b/mrs_lib/include/mrs_lib/transformer.h.func.html @@ -0,0 +1,152 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/transformer.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - transformer.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:516085.0 %
Date:2024-04-18 23:11:36Functions:141877.8 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::Transformer::frame_from[abi:cxx11](geometry_msgs::TransformStamped_<std::allocator<void> > const&)1868772
mrs_lib::Transformer::frame_from[abi:cxx11](geometry_msgs::TransformStamped_<std::allocator<void> >&)1866721
mrs_lib::Transformer::resolveFrame(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1026
mrs_lib::Transformer::setDefaultFrame(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)440503
std::optional<boost::shared_ptr<geometry_msgs::Quaternion_<std::allocator<void> > > > mrs_lib::Transformer::transformSingle<geometry_msgs::Quaternion_<std::allocator<void> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::shared_ptr<geometry_msgs::Quaternion_<std::allocator<void> > const> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)1
std::optional<boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > > > mrs_lib::Transformer::transformSingle<geometry_msgs::PointStamped_<std::allocator<void> > >(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1
std::optional<boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > > > mrs_lib::Transformer::transformSingle<geometry_msgs::PointStamped_<std::allocator<void> > >(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1
std::optional<boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > > > mrs_lib::Transformer::transformSingle<mrs_msgs::ReferenceStamped_<std::allocator<void> > >(boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > const> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)0
std::optional<boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > > > mrs_lib::Transformer::transformSingle<mrs_msgs::ReferenceStamped_<std::allocator<void> > >(boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)0
mrs_lib::Transformer::create_transform(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&, geometry_msgs::Transform_<std::allocator<void> > const&)1866743
mrs_lib::Transformer::setDefaultPrefix(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)285
mrs_lib::Transformer::setLookupTimeout(ros::Duration)2
mrs_lib::Transformer::retryLookupNewest(bool)456
mrs_lib::Transformer::inverse(geometry_msgs::TransformStamped_<std::allocator<void> > const&)1
mrs_lib::Transformer::frame_to[abi:cxx11](geometry_msgs::TransformStamped_<std::allocator<void> > const&)1868778
mrs_lib::Transformer::frame_to[abi:cxx11](geometry_msgs::TransformStamped_<std::allocator<void> >&)1869152
std::optional<boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > > > mrs_lib::Transformer::transform<mrs_msgs::ReferenceStamped_<std::allocator<void> > >(boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > const> const&, geometry_msgs::TransformStamped_<std::allocator<void> > const&)0
std::optional<boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > > > mrs_lib::Transformer::transform<mrs_msgs::ReferenceStamped_<std::allocator<void> > >(boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > > const&, geometry_msgs::TransformStamped_<std::allocator<void> > const&)0
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/transformer.h.gcov.frameset.html b/mrs_lib/include/mrs_lib/transformer.h.gcov.frameset.html new file mode 100644 index 0000000000..b78146f575 --- /dev/null +++ b/mrs_lib/include/mrs_lib/transformer.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/transformer.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/include/mrs_lib/transformer.h.gcov.html b/mrs_lib/include/mrs_lib/transformer.h.gcov.html new file mode 100644 index 0000000000..087edc435f --- /dev/null +++ b/mrs_lib/include/mrs_lib/transformer.h.gcov.html @@ -0,0 +1,764 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/transformer.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - transformer.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:516085.0 %
Date:2024-04-18 23:11:36Functions:141877.8 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : // clang: MatousFormat
+       2             : 
+       3             : /**  \file Implements the Transformer class - wrapper for ROS's TF2 lookups and transformations.
+       4             :  *   \brief A wrapper for easier work with tf2 transformations.
+       5             :  *   \author Tomas Baca - tomas.baca@fel.cvut.cz
+       6             :  *   \author Matouš Vrba - matous.vrba@fel.cvut.cz
+       7             :  */
+       8             : #ifndef TRANSFORMER_H
+       9             : #define TRANSFORMER_H
+      10             : 
+      11             : /* #define EIGEN_DONT_VECTORIZE */
+      12             : /* #define EIGEN_DISABLE_UNALIGNED_ARRAY_ASSERT */
+      13             : 
+      14             : /* includes //{ */
+      15             : 
+      16             : #include <ros/ros.h>
+      17             : 
+      18             : #include <tf2_ros/transform_listener.h>
+      19             : #include <tf2_ros/buffer.h>
+      20             : #include <tf2_eigen/tf2_eigen.h>
+      21             : #include <tf2_geometry_msgs/tf2_geometry_msgs.h>
+      22             : #include <tf/transform_datatypes.h>
+      23             : #include <tf_conversions/tf_eigen.h>
+      24             : 
+      25             : #include <mrs_msgs/ReferenceStamped.h>
+      26             : 
+      27             : #include <geometry_msgs/PoseStamped.h>
+      28             : #include <geometry_msgs/Vector3Stamped.h>
+      29             : #include <std_msgs/Header.h>
+      30             : 
+      31             : #include <mrs_lib/geometry/misc.h>
+      32             : 
+      33             : #include <pcl_ros/point_cloud.h>
+      34             : #include <pcl_ros/transforms.h>
+      35             : #include <pcl_conversions/pcl_conversions.h>
+      36             : 
+      37             : #include <mutex>
+      38             : #include <experimental/type_traits>
+      39             : 
+      40             : //}
+      41             : 
+      42             : namespace tf2
+      43             : {
+      44             : 
+      45             :   template <typename pt_t>
+      46             :   void doTransform(const pcl::PointCloud<pt_t>& cloud_in, pcl::PointCloud<pt_t>& cloud_out, const geometry_msgs::TransformStamped& transform)
+      47             :   {
+      48             :     pcl_ros::transformPointCloud(cloud_in, cloud_out, transform.transform);
+      49             :     pcl_conversions::toPCL(transform.header.stamp, cloud_out.header.stamp);
+      50             :     cloud_out.header.frame_id = transform.header.frame_id;
+      51             :   }
+      52             : 
+      53             : }  // namespace tf2
+      54             : 
+      55             : namespace mrs_lib
+      56             : {
+      57             : 
+      58             :   static const std::string UTM_ORIGIN = "utm_origin";
+      59             :   static const std::string LATLON_ORIGIN = "latlon_origin";
+      60             : 
+      61             :   /**
+      62             :    * \brief A convenience wrapper class for ROS's native TF2 API to simplify transforming of various messages.
+      63             :    *
+      64             :    * Implements optional automatic frame prefix deduction, seamless transformation lattitude/longitude coordinates and UTM coordinates, simple transformation of MRS messages etc.
+      65             :    */
+      66             :   /* class Transformer //{ */
+      67             : 
+      68             :   class Transformer
+      69             :   {
+      70             : 
+      71             :   public:
+      72             :     /* Constructor, assignment operator and overloads //{ */
+      73             : 
+      74             :     /**
+      75             :      * \brief A convenience constructor that doesn't initialize anything.
+      76             :      *
+      77             :      * This constructor is just to enable usign the Transformer as a member variable of nodelets etc.
+      78             :      * To actually initialize the class, use the alternative constructor.
+      79             :      *
+      80             :      * \note This constructor doesn't initialize the TF2 transform listener and all calls to the transformation-related methods of an object constructed using this method will fail.
+      81             :      */
+      82             :     Transformer();
+      83             : 
+      84             :     /**
+      85             :      * \brief The main constructor that actually initializes stuff.
+      86             :      *
+      87             :      * This constructor initializes the class and the TF2 transform listener.
+      88             :      *
+      89             :      * \param node_name   the name of the node running the transformer, is used in ROS prints. If you don't care, just set it to an empty string.
+      90             :      * \param cache_time  duration of the transformation buffer's cache into the past that will be kept.
+      91             :      */
+      92             :     Transformer(const std::string& node_name, const ros::Duration& cache_time = ros::Duration(tf2_ros::Buffer::DEFAULT_CACHE_TIME));
+      93             : 
+      94             :     /**
+      95             :      * \brief The main constructor that actually initializes stuff.
+      96             :      *
+      97             :      * This constructor initializes the class and the TF2 transform listener.
+      98             :      *
+      99             :      * \param nh          the node handle to be used for subscribing to the transformations.
+     100             :      * \param node_name   the name of the node running the transformer, is used in ROS prints. If you don't care, just set it to an empty string.
+     101             :      * \param cache_time  duration of the transformation buffer's cache into the past that will be kept.
+     102             :      */
+     103             :     Transformer(const ros::NodeHandle& nh, const std::string& node_name = std::string(), const ros::Duration& cache_time = ros::Duration(tf2_ros::Buffer::DEFAULT_CACHE_TIME));
+     104             : 
+     105             :     /**
+     106             :      * \brief A convenience move assignment operator.
+     107             :      *
+     108             :      * This operator moves all data from the object that is being assigned from, invalidating it.
+     109             :      *
+     110             :      * \param  other  the object to assign from. It will be invalid after this method returns.
+     111             :      * \return        a reference to the object being assigned to.
+     112             :      */
+     113             :     Transformer& operator=(Transformer&& other);
+     114             : 
+     115             :     //}
+     116             : 
+     117             :     // | ------------------ Configuration methods ----------------- |
+     118             : 
+     119             :     /* setDefaultFrame() //{ */
+     120             : 
+     121             :     /**
+     122             :      * \brief Sets the default frame ID to be used instead of any empty frame ID.
+     123             :      *
+     124             :      * If you call e.g. the transform() method with a message that has an empty header.frame_id field, this value will be used instead.
+     125             :      *
+     126             :      * \param frame_id the default frame ID. Use an empty string to disable default frame ID deduction.
+     127             :      *
+     128             :      * \note Disabled by default.
+     129             :      */
+     130      440503 :     void setDefaultFrame(const std::string& frame_id)
+     131             :     {
+     132      880484 :       std::scoped_lock lck(mutex_);
+     133      440327 :       default_frame_id_ = frame_id;
+     134      440215 :     }
+     135             : 
+     136             :     //}
+     137             : 
+     138             :     /* setDefaultPrefix() //{ */
+     139             : 
+     140             :     /**
+     141             :      * \brief Sets the default frame ID prefix to be used if no prefix is present in the frame.
+     142             :      *
+     143             :      * If you call any method with a frame ID that doesn't begin with this string, it will be automatically prefixed including a forward slash between the prefix and raw frame ID.
+     144             :      * The forward slash should therefore *not* be included in the prefix.
+     145             :      *
+     146             :      * Example frame ID resolution assuming default prefix is "uav1":
+     147             :      *   "local_origin" -> "uav1/local_origin"
+     148             :      *
+     149             :      * \param prefix the default frame ID prefix (without the forward slash at the end). Use an empty string to disable default frame ID prefixing.
+     150             :      *
+     151             :      * \note Disabled by default. The prefix will be applied as a namespace (with a forward slash between the prefix and raw frame ID).
+     152             :      */
+     153         285 :     void setDefaultPrefix(const std::string& prefix)
+     154             :     {
+     155         570 :       std::scoped_lock lck(mutex_);
+     156         285 :       if (prefix.empty())
+     157           1 :         prefix_ = "";
+     158             :       else
+     159         284 :         prefix_ = prefix + "/";
+     160         285 :     }
+     161             : 
+     162             :     //}
+     163             : 
+     164             :     /* setLatLon() //{ */
+     165             : 
+     166             :     /**
+     167             :      * \brief Sets the curret lattitude and longitude for UTM zone calculation.
+     168             :      *
+     169             :      * The Transformer uses this to deduce the current UTM zone used for transforming stuff to latlon_origin.
+     170             :      *
+     171             :      * \param lat the latitude in degrees.
+     172             :      * \param lon the longitude in degrees.
+     173             :      *
+     174             :      * \note Any transformation to latlon_origin will fail if this function is not called first!
+     175             :      */
+     176             :     void setLatLon(const double lat, const double lon);
+     177             : 
+     178             :     //}
+     179             : 
+     180             :     /* setLookupTimeout() //{ */
+     181             : 
+     182             :     /**
+     183             :      * \brief Set a timeout for transform lookup.
+     184             :      *
+     185             :      * The transform lookup operation will block up to this duration if the transformation is not available immediately.
+     186             :      *
+     187             :      * \note Disabled by default.
+     188             :      *
+     189             :      * \param timeout the lookup timeout. Set to zero to disable blocking.
+     190             :      */
+     191           2 :     void setLookupTimeout(const ros::Duration timeout = ros::Duration(0))
+     192             :     {
+     193           2 :       std::scoped_lock lck(mutex_);
+     194           2 :       lookup_timeout_ = timeout;
+     195           2 :     }
+     196             : 
+     197             :     //}
+     198             : 
+     199             :     /* retryLookupNewest() //{ */
+     200             : 
+     201             :     /**
+     202             :      * \brief Enable/disable retry of a failed transform lookup with \p ros::Time(0).
+     203             :      *
+     204             :      * If enabled, a failed transform lookup will be retried.
+     205             :      * The new try will ignore the requested timestamp and will attempt to fetch the latest transformation between the two frames.
+     206             :      *
+     207             :      * \note Disabled by default.
+     208             :      *
+     209             :      * \param retry enables or disables retry.
+     210             :      */
+     211         456 :     void retryLookupNewest(const bool retry = true)
+     212             :     {
+     213         456 :       std::scoped_lock lck(mutex_);
+     214         456 :       retry_lookup_newest_ = retry;
+     215         456 :     }
+     216             : 
+     217             :     //}
+     218             :     
+     219             :     /* beQuiet() //{ */
+     220             : 
+     221             :     /**
+     222             :      * \brief Enable/disable some prints that may be too noisy.
+     223             :      *
+     224             :      * \param quiet enables or disables quiet mode.
+     225             :      *
+     226             :      * \note Disabled by default.
+     227             :      */
+     228             :     void beQuiet(const bool quiet = true)
+     229             :     {
+     230             :       std::scoped_lock lck(mutex_);
+     231             :       quiet_ = quiet;
+     232             :     }
+     233             : 
+     234             :     //}
+     235             : 
+     236             :     /* resolveFrame() //{ */
+     237             :     /**
+     238             :      * \brief Deduce the full frame ID from a shortened or empty string using current default prefix and default frame rules.
+     239             :      *
+     240             :      * Example assuming default prefix is "uav1" and default frame is "uav1/gps_origin":
+     241             :      *   "" -> "uav1/gps_origin"
+     242             :      *   "local_origin" -> "uav1/local_origin"
+     243             :      *
+     244             :      * \param frame_id The frame ID to be resolved.
+     245             :      *
+     246             :      * \return The resolved frame ID.
+     247             :      */
+     248        1026 :     std::string resolveFrame(const std::string& frame_id)
+     249             :     {
+     250        2052 :       std::scoped_lock lck(mutex_);
+     251        2052 :       return resolveFrameImpl(frame_id);
+     252             :     }
+     253             :     //}
+     254             : 
+     255             :     /* transformSingle() //{ */
+     256             : 
+     257             :     /**
+     258             :      * \brief Transforms a single variable to a new frame and returns it or \p std::nullopt if transformation fails.
+     259             :      *
+     260             :      * \param what the object to be transformed.
+     261             :      * \param to_frame the target frame ID.
+     262             :      *
+     263             :      * \return \p std::nullopt if failed, optional containing the transformed object otherwise.
+     264             :      */
+     265             :     template <class T>
+     266             :     [[nodiscard]] std::optional<T> transformSingle(const T& what, const std::string& to_frame);
+     267             : 
+     268             :     /**
+     269             :      * \brief Transforms a single variable to a new frame.
+     270             :      *
+     271             :      * A convenience override for shared pointers.
+     272             :      *
+     273             :      * \param what The object to be transformed.
+     274             :      * \param to_frame The target fram ID.
+     275             :      *
+     276             :      * \return \p std::nullopt if failed, optional containing the transformed object otherwise.
+     277             :      */
+     278             :     template <class T>
+     279           1 :     [[nodiscard]] std::optional<boost::shared_ptr<T>> transformSingle(const boost::shared_ptr<T>& what, const std::string& to_frame)
+     280             :     {
+     281           1 :       return transformSingle(boost::shared_ptr<const T>(what), to_frame);
+     282             :     }
+     283             : 
+     284             :     /**
+     285             :      * \brief Transforms a single variable to a new frame.
+     286             :      *
+     287             :      * A convenience override for shared pointers to const.
+     288             :      *
+     289             :      * \param what The object to be transformed.
+     290             :      * \param to_frame The target fram ID.
+     291             :      *
+     292             :      * \return \p std::nullopt if failed, optional containing the transformed object otherwise.
+     293             :      */
+     294             :     template <class T>
+     295           1 :     [[nodiscard]] std::optional<boost::shared_ptr<T>> transformSingle(const boost::shared_ptr<const T>& what, const std::string& to_frame)
+     296             :     {
+     297           2 :       auto ret = transformSingle(*what, to_frame);
+     298           1 :       if (ret == std::nullopt)
+     299           0 :         return std::nullopt;
+     300             :       else
+     301           1 :         return boost::make_shared<T>(std::move(ret.value()));
+     302             :     }
+     303             : 
+     304             :     /**
+     305             :      * \brief Transforms a single variable to a new frame and returns it or \p std::nullopt if transformation fails.
+     306             :      *
+     307             :      * A convenience overload for headerless variables.
+     308             :      *
+     309             :      * \param from_frame the original target frame ID.
+     310             :      * \param what the object to be transformed.
+     311             :      * \param to_frame the target frame ID.
+     312             :      * \param time_stamp the time of the transformation.
+     313             :      *
+     314             :      * \return \p std::nullopt if failed, optional containing the transformed object otherwise.
+     315             :      */
+     316             :     template <class T>
+     317             :     [[nodiscard]] std::optional<T> transformSingle(const std::string& from_frame, const T& what, const std::string& to_frame, const ros::Time& time_stamp = ros::Time(0));
+     318             : 
+     319             :     /**
+     320             :      * \brief Transforms a single variable to a new frame and returns it or \p std::nullopt if transformation fails.
+     321             :      *
+     322             :      * A convenience overload for shared pointers to headerless variables.
+     323             :      *
+     324             :      * \param from_frame the original target frame ID.
+     325             :      * \param what the object to be transformed.
+     326             :      * \param to_frame the target frame ID.
+     327             :      * \param time_stamp the time of the transformation.
+     328             :      *
+     329             :      * \return \p std::nullopt if failed, optional containing the transformed object otherwise.
+     330             :      */
+     331             :     template <class T>
+     332             :     [[nodiscard]] std::optional<boost::shared_ptr<T>> transformSingle(const std::string& from_frame, const boost::shared_ptr<T>& what, const std::string& to_frame, const ros::Time& time_stamp = ros::Time(0))
+     333             :     {
+     334             :       return transformSingle(from_frame, boost::shared_ptr<const T>(what), to_frame, time_stamp);
+     335             :     }
+     336             : 
+     337             :     /**
+     338             :      * \brief Transforms a single variable to a new frame and returns it or \p std::nullopt if transformation fails.
+     339             :      *
+     340             :      * A convenience overload for shared pointers to const headerless variables.
+     341             :      *
+     342             :      * \param from_frame the original target frame ID.
+     343             :      * \param what the object to be transformed.
+     344             :      * \param to_frame the target frame ID.
+     345             :      * \param time_stamp the time of the transformation.
+     346             :      *
+     347             :      * \return \p std::nullopt if failed, optional containing the transformed object otherwise.
+     348             :      */
+     349             :     template <class T>
+     350           1 :     [[nodiscard]] std::optional<boost::shared_ptr<T>> transformSingle(const std::string& from_frame, const boost::shared_ptr<const T>& what, const std::string& to_frame, const ros::Time& time_stamp = ros::Time(0))
+     351             :     {
+     352           1 :       auto ret = transformSingle(from_frame, *what, to_frame, time_stamp);
+     353           1 :       if (ret == std::nullopt)
+     354           0 :         return std::nullopt;
+     355             :       else
+     356           1 :         return boost::make_shared<T>(std::move(ret.value()));
+     357             :     }
+     358             : 
+     359             :     //}
+     360             : 
+     361             :     /* transform() //{ */
+     362             : 
+     363             :     /**
+     364             :      * \brief Transform a variable to new frame using a particular transformation.
+     365             :      *
+     366             :      * \param tf The transformation to be used.
+     367             :      * \param what The object to be transformed.
+     368             :      *
+     369             :      * \return \p std::nullopt if failed, optional containing the transformed object otherwise.
+     370             :      */
+     371             :     template <class T>
+     372             :     [[nodiscard]] std::optional<T> transform(const T& what, const geometry_msgs::TransformStamped& tf);
+     373             : 
+     374             :     /**
+     375             :      * \brief Transform a variable to new frame using a particular transformation.
+     376             :      *
+     377             :      * A convenience override for shared pointers to const.
+     378             :      *
+     379             :      * \param tf The transformation to be used.
+     380             :      * \param what The object to be transformed.
+     381             :      *
+     382             :      * \return \p std::nullopt if failed, optional containing the transformed object otherwise.
+     383             :      */
+     384             :     template <class T>
+     385           0 :     [[nodiscard]] std::optional<boost::shared_ptr<T>> transform(const boost::shared_ptr<const T>& what, const geometry_msgs::TransformStamped& tf)
+     386             :     {
+     387           0 :       auto ret = transform(*what, tf);
+     388           0 :       if (ret == std::nullopt)
+     389           0 :         return std::nullopt;
+     390             :       else
+     391           0 :         return boost::make_shared<T>(std::move(ret.value()));
+     392             :     }
+     393             : 
+     394             :     /**
+     395             :      * \brief Transform a variable to new frame using a particular transformation.
+     396             :      *
+     397             :      * A convenience override for shared pointers.
+     398             :      *
+     399             :      * \param tf The transformation to be used.
+     400             :      * \param what The object to be transformed.
+     401             :      *
+     402             :      * \return \p std::nullopt if failed, optional containing the transformed object otherwise.
+     403             :      */
+     404             :     template <class T>
+     405           0 :     [[nodiscard]] std::optional<boost::shared_ptr<T>> transform(const boost::shared_ptr<T>& what, const geometry_msgs::TransformStamped& tf)
+     406             :     {
+     407           0 :       return transform(boost::shared_ptr<const T>(what), tf);
+     408             :     }
+     409             : 
+     410             :     //}
+     411             : 
+     412             :     /* transformAsVector() method //{ */
+     413             :     /**
+     414             :      * \brief Transform an Eigen::Vector3d (interpreting it as a vector).
+     415             :      *
+     416             :      * Only the rotation will be applied to the variable.
+     417             :      *
+     418             :      * \param tf The transformation to be used.
+     419             :      * \param what The vector to be transformed.
+     420             :      *
+     421             :      * \return \p std::nullopt if failed, optional containing the transformed object otherwise.
+     422             :      */
+     423             :     [[nodiscard]] std::optional<Eigen::Vector3d> transformAsVector(const Eigen::Vector3d& what, const geometry_msgs::TransformStamped& tf);
+     424             : 
+     425             :     /**
+     426             :      * \brief Transform an Eigen::Vector3d (interpreting it as a vector).
+     427             :      *
+     428             :      * Only the rotation will be applied to the variable.
+     429             :      *
+     430             :      * \param from_frame  The current frame of \p what.
+     431             :      * \param what        The vector to be transformed.
+     432             :      * \param to_frame    The desired frame of \p what.
+     433             :      * \param time_stamp  From which time to take the transformation (use \p ros::Time(0) for the latest time).
+     434             :      *
+     435             :      * \return \p std::nullopt if failed, optional containing the transformed object otherwise.
+     436             :      */
+     437             :     [[nodiscard]] std::optional<Eigen::Vector3d> transformAsVector(const std::string& from_frame, const Eigen::Vector3d& what, const std::string& to_frame, const ros::Time& time_stamp = ros::Time(0));
+     438             :     //}
+     439             : 
+     440             :     /* transformAsPoint() method //{ */
+     441             :     /**
+     442             :      * \brief Transform an Eigen::Vector3d (interpreting it as a point).
+     443             :      *
+     444             :      * Both the rotation and translation will be applied to the variable.
+     445             :      *
+     446             :      * \param tf The transformation to be used.
+     447             :      * \param what The object to be transformed.
+     448             :      *
+     449             :      * \return \p std::nullopt if failed, optional containing the transformed object otherwise.
+     450             :      */
+     451             :     [[nodiscard]] std::optional<Eigen::Vector3d> transformAsPoint(const Eigen::Vector3d& what, const geometry_msgs::TransformStamped& tf);
+     452             : 
+     453             :     /**
+     454             :      * \brief Transform an Eigen::Vector3d (interpreting it as a point).
+     455             :      *
+     456             :      * Both the rotation and translation will be applied to the variable.
+     457             :      *
+     458             :      * \param from_frame  The current frame of \p what.
+     459             :      * \param what The object to be transformed.
+     460             :      * \param to_frame    The desired frame of \p what.
+     461             :      * \param time_stamp  From which time to take the transformation (use \p ros::Time(0) for the latest time).
+     462             :      *
+     463             :      * \return \p std::nullopt if failed, optional containing the transformed object otherwise.
+     464             :      */
+     465             :     [[nodiscard]] std::optional<Eigen::Vector3d> transformAsPoint(const std::string& from_frame, const Eigen::Vector3d& what, const std::string& to_frame, const ros::Time& time_stamp = ros::Time(0));
+     466             :     //}
+     467             : 
+     468             :     /* getTransform() //{ */
+     469             : 
+     470             :     /**
+     471             :      * \brief Obtains a transform between two frames in a given time.
+     472             :      *
+     473             :      * \param from_frame The original frame of the transformation.
+     474             :      * \param to_frame The target frame of the transformation.
+     475             :      * \param time_stamp The time stamp of the transformation. (0 will get the latest)
+     476             :      *
+     477             :      * \return \p std::nullopt if failed, optional containing the requested transformation otherwise.
+     478             :      */
+     479             :     [[nodiscard]] std::optional<geometry_msgs::TransformStamped> getTransform(const std::string& from_frame, const std::string& to_frame, const ros::Time& time_stamp = ros::Time(0));
+     480             : 
+     481             :     /**
+     482             :      * \brief Obtains a transform between two frames in a given time.
+     483             :      *
+     484             :      * This overload enables the user to select a different time of the source frame and the target frame.
+     485             :      *
+     486             :      * \param from_frame The original frame of the transformation.
+     487             :      * \param from_stamp The time at which the original frame should be evaluated. (0 will get the latest)
+     488             :      * \param to_frame The target frame of the transformation.
+     489             :      * \param to_stamp The time to which the data should be transformed. (0 will get the latest) 
+     490             :      * \param fixed_frame The frame that may be assumed constant in time (the "world" frame).
+     491             :      *
+     492             :      * \return \p std::nullopt if failed, optional containing the requested transformation otherwise.
+     493             :      *
+     494             :      * \note An example of when this API may be useful is explained here: http://wiki.ros.org/tf2/Tutorials/Time%20travel%20with%20tf2%20%28C%2B%2B%29
+     495             :      */
+     496             :     [[nodiscard]] std::optional<geometry_msgs::TransformStamped> getTransform(const std::string& from_frame, const ros::Time& from_stamp, const std::string& to_frame, const ros::Time& to_stamp, const std::string& fixed_frame);
+     497             : 
+     498             :     //}
+     499             : 
+     500             :   private:
+     501             :     /* private members, methods etc //{ */
+     502             : 
+     503             :     std::mutex mutex_;
+     504             : 
+     505             :     // keeps track whether a non-basic constructor was called and the transform listener is initialized
+     506             :     bool initialized_ = false;
+     507             :     std::string node_name_;
+     508             : 
+     509             :     std::unique_ptr<tf2_ros::Buffer> tf_buffer_;
+     510             :     std::unique_ptr<tf2_ros::TransformListener> tf_listener_ptr_;
+     511             : 
+     512             :     // user-configurable options
+     513             :     std::string default_frame_id_ = "";
+     514             :     std::string prefix_ = ""; // if not empty, includes the forward slash
+     515             :     bool quiet_ = false;
+     516             :     ros::Duration lookup_timeout_ = ros::Duration(0);
+     517             :     bool retry_lookup_newest_ = false;
+     518             : 
+     519             :     bool got_utm_zone_ = false;
+     520             :     std::array<char, 10> utm_zone_ = {};
+     521             : 
+     522             :     // returns the first namespace prefix of the frame (if any) includin the forward slash
+     523             :     std::string getFramePrefix(const std::string& frame_id);
+     524             : 
+     525             :     template <class T>
+     526             :     std::optional<T> transformImpl(const geometry_msgs::TransformStamped& tf, const T& what);
+     527             :     std::optional<mrs_msgs::ReferenceStamped> transformImpl(const geometry_msgs::TransformStamped& tf, const mrs_msgs::ReferenceStamped& what);
+     528             :     std::optional<Eigen::Vector3d> transformImpl(const geometry_msgs::TransformStamped& tf, const Eigen::Vector3d& what);
+     529             : 
+     530             :     [[nodiscard]] std::optional<geometry_msgs::TransformStamped> getTransformImpl(const std::string& from_frame, const std::string& to_frame, const ros::Time& time_stamp, const std::string& latlon_frame);
+     531             :     [[nodiscard]] std::optional<geometry_msgs::TransformStamped> getTransformImpl(const std::string& from_frame, const ros::Time& from_stamp, const std::string& to_frame, const ros::Time& to_stamp, const std::string& fixed_frame, const std::string& latlon_frame);
+     532             : 
+     533             :     std::string resolveFrameImpl(const std::string& frame_id);
+     534             : 
+     535             :     template <class T>
+     536             :     std::optional<T> doTransform(const T& what, const geometry_msgs::TransformStamped& tf);
+     537             : 
+     538             :     //}
+     539             : 
+     540             :     // | ------------------- some helper methods ------------------ |
+     541             :   public:
+     542             :     /* frame_from(), frame_to() and inverse() methods //{ */
+     543             :     
+     544             :     /**
+     545             :      * \brief A convenience function that returns the frame from which the message transforms.
+     546             :      *
+     547             :      * \param msg the message representing the transformation.
+     548             :      * \return    the frame from which the transformation in \msg transforms.
+     549             :      */
+     550     1868772 :     static constexpr const std::string& frame_from(const geometry_msgs::TransformStamped& msg)
+     551             :     {
+     552     1868772 :       return msg.child_frame_id;
+     553             :     }
+     554             :     
+     555             :     /**
+     556             :      * \brief A convenience function that returns the frame from which the message transforms.
+     557             :      *
+     558             :      * This overload returns a reference to the string in the message representing the frame id so that it can be modified.
+     559             :      *
+     560             :      * \param msg the message representing the transformation.
+     561             :      * \return    a reference to the field in the message containing the string with the frame id from which the transformation in \msg transforms.
+     562             :      */
+     563     1866721 :     static constexpr std::string& frame_from(geometry_msgs::TransformStamped& msg)
+     564             :     {
+     565     1866721 :       return msg.child_frame_id;
+     566             :     }
+     567             :     
+     568             :     /**
+     569             :      * \brief A convenience function that returns the frame to which the message transforms.
+     570             :      *
+     571             :      * \param msg the message representing the transformation.
+     572             :      * \return    the frame to which the transformation in \msg transforms.
+     573             :      */
+     574     1868778 :     static constexpr const std::string& frame_to(const geometry_msgs::TransformStamped& msg)
+     575             :     {
+     576     1868778 :       return msg.header.frame_id;
+     577             :     }
+     578             : 
+     579             :     /**
+     580             :      * \brief A convenience function that returns the frame to which the message transforms.
+     581             :      *
+     582             :      * This overload returns a reference to the string in the message representing the frame id so that it can be modified.
+     583             :      *
+     584             :      * \param msg the message representing the transformation.
+     585             :      * \return    a reference to the field in the message containing the string with the frame id to which the transformation in \msg transforms.
+     586             :      */
+     587     1869152 :     static constexpr std::string& frame_to(geometry_msgs::TransformStamped& msg)
+     588             :     {
+     589     1869152 :       return msg.header.frame_id;
+     590             :     }
+     591             : 
+     592             :     /**
+     593             :      * \brief A convenience function implements returns the inverse of the transform message as a one-liner.
+     594             :      *
+     595             :      * \param msg the message representing the transformation.
+     596             :      * \return    a new message representing an inverse of the original transformation.
+     597             :      */
+     598           1 :     static geometry_msgs::TransformStamped inverse(const geometry_msgs::TransformStamped& msg)
+     599             :     {
+     600           1 :       tf2::Transform tf2;
+     601           1 :       tf2::fromMsg(msg.transform, tf2);
+     602           1 :       tf2 = tf2.inverse();
+     603           2 :       return create_transform(frame_to(msg), frame_from(msg), msg.header.stamp, tf2::toMsg(tf2));
+     604             :     }
+     605             :     //}
+     606             : 
+     607             :   private:
+     608             :     /* create_transform() method //{ */
+     609             :     static geometry_msgs::TransformStamped create_transform(const std::string& from_frame, const std::string& to_frame, const ros::Time& time_stamp)
+     610             :     {
+     611             :       geometry_msgs::TransformStamped ret;
+     612             :       frame_from(ret) = from_frame;
+     613             :       frame_to(ret) = to_frame;
+     614             :       ret.header.stamp = time_stamp;
+     615             :       return ret;
+     616             :     }
+     617             : 
+     618     1866743 :     static geometry_msgs::TransformStamped create_transform(const std::string& from_frame, const std::string& to_frame, const ros::Time& time_stamp, const geometry_msgs::Transform& tf)
+     619             :     {
+     620     1866743 :       geometry_msgs::TransformStamped ret;
+     621     1866670 :       frame_from(ret) = from_frame;
+     622     1866759 :       frame_to(ret) = to_frame;
+     623     1866727 :       ret.header.stamp = time_stamp;
+     624     1866727 :       ret.transform = tf;
+     625     1866727 :       return ret;
+     626             :     }
+     627             :     //}
+     628             : 
+     629             :     /* copyChangeFrame() and related methods //{ */
+     630             : 
+     631             :     // helper type and member for detecting whether a message has a header using SFINAE
+     632             :     template<typename T>
+     633             :     using has_header_member_chk = decltype( std::declval<T&>().header );
+     634             :     template<typename T>
+     635             :     static constexpr bool has_header_member_v = std::experimental::is_detected<has_header_member_chk, T>::value;
+     636             :     
+     637             :     template <typename msg_t>
+     638             :     std_msgs::Header getHeader(const msg_t& msg);
+     639             :     template <typename pt_t>
+     640             :     std_msgs::Header getHeader(const pcl::PointCloud<pt_t>& cloud);
+     641             :     
+     642             :     template <typename msg_t>
+     643             :     void setHeader(msg_t& msg, const std_msgs::Header& header);
+     644             :     template <typename pt_t>
+     645             :     void setHeader(pcl::PointCloud<pt_t>& cloud, const std_msgs::Header& header);
+     646             :     
+     647             :     template <typename T>
+     648             :     T copyChangeFrame(const T& what, const std::string& frame_id);
+     649             :     
+     650             :     //}
+     651             : 
+     652             :     /* methods for converting between lattitude/longitude and UTM coordinates //{ */
+     653             :     geometry_msgs::Point LLtoUTM(const geometry_msgs::Point& what, const std::string& prefix);
+     654             :     geometry_msgs::PointStamped LLtoUTM(const geometry_msgs::PointStamped& what, const std::string& prefix);
+     655             :     geometry_msgs::Pose LLtoUTM(const geometry_msgs::Pose& what, const std::string& prefix);
+     656             :     geometry_msgs::PoseStamped LLtoUTM(const geometry_msgs::PoseStamped& what, const std::string& prefix);
+     657             :     
+     658             :     std::optional<geometry_msgs::Point> UTMtoLL(const geometry_msgs::Point& what, const std::string& prefix);
+     659             :     std::optional<geometry_msgs::PointStamped> UTMtoLL(const geometry_msgs::PointStamped& what, const std::string& prefix);
+     660             :     std::optional<geometry_msgs::Pose> UTMtoLL(const geometry_msgs::Pose& what, const std::string& prefix);
+     661             :     std::optional<geometry_msgs::PoseStamped> UTMtoLL(const geometry_msgs::PoseStamped& what, const std::string& prefix);
+     662             :     
+     663             :     // helper types and member for detecting whether the UTMtoLL and LLtoUTM methods are defined for a certain message
+     664             :     template<class Class, typename Message>
+     665             :     using UTMLL_method_chk = decltype(std::declval<Class>().UTMtoLL(std::declval<const Message&>(), ""));
+     666             :     template<class Class, typename Message>
+     667             :     using LLUTM_method_chk = decltype(std::declval<Class>().LLtoUTM(std::declval<const Message&>(), ""));
+     668             :     template<class Class, typename Message>
+     669             :     static constexpr bool UTMLL_exists_v = std::experimental::is_detected<UTMLL_method_chk, Class, Message>::value && std::experimental::is_detected<LLUTM_method_chk, Class, Message>::value;
+     670             :     //}
+     671             : 
+     672             :   };
+     673             : 
+     674             :   //}
+     675             : 
+     676             : }  // namespace mrs_lib
+     677             : 
+     678             : #include <mrs_lib/impl/transformer.hpp>
+     679             : 
+     680             : #endif  // TRANSFORMER_H
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/transformer.h.gcov.overview.html b/mrs_lib/include/mrs_lib/transformer.h.gcov.overview.html new file mode 100644 index 0000000000..5aceca5a90 --- /dev/null +++ b/mrs_lib/include/mrs_lib/transformer.h.gcov.overview.html @@ -0,0 +1,190 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/transformer.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/include/mrs_lib/transformer.h.gcov.png b/mrs_lib/include/mrs_lib/transformer.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..27e11b7f6dacb8da8eb743f04a00020774870f30 GIT binary patch literal 2328 zcmV+z3Fr2SP)+1pw=pWW&!q*Gr-mC)Dl3+}z0sGqSFbmd_p%$#a=njTw zXXgmBpt(gF3&M8oQwi=LU{f8AAZ!r1i{~SDt=teC8K*|{sBRyy5$vhoA`bd#YK=br zFT~dLGzVS^9_(IQ_34OK!9LMi({rq&glHBt^wO&OtY{~QF|Q80?R3p*eqd)Z)ii3G z^9vi*-pLIkcoD6v)ex-hx)m%|!)kD+Ph@~#wxX@kMC<}yLkdc0&?23Mej~WPZIc<7 zYU^PD+^w8XQLdE}s%#I4Um21E5y?j$!I>fmEj_7}njG^%V?@d?_XN*ph25k$W<7J{ z9g{(SmK8DQ*E+5sl7|(91nHk-^y$0&MG_S11mU6bjS1CJw9AA7^AiJ(C%50k!eh;6 z88Qcti>F6#ee8&(rO`0VHkxwRgyUhUr$OjLl!iRv92oKfN_^lz5pwKtTZV9muNrnG zwsjy0@%1c&hup>a;NP4F7$65l$f#COCMvOnMomS2_`S3qQnqD11rp;#le4vjaY3 zcUMw9!cJb8eR|x5tlHSeH;NLsTOam&MT)al%w;lC@P0W`=B)OR9)_!&9<=+YGfz%L z$>VbrFbIwoM5nvfVTDJAp1ioyLW)f^^OR{?`?NuPy_HLyt&E{SSas<2>a&G8E zG^Si0L>V%z47@G~;}5M0cTTJ*WM7)ZWmN;jZxotO4A0)sOtB(o2a3uZ30+BCj1iP8 zFv&tGnD-?r`Jop;qE2kYFY%cmpuKEw%4gQk_srpnrq^zKQabrclgsRGm^SlB?!@i81x`^c54?4GD z9Y{hvZo*2RV;+G=A-kkT@BafSpjUqIsD213C`R4i>vk_bdc)prgNNVU{5wrYdpbUb zI?ep$ejlH|V(f4y`jXAXCT`kT(2*&_MY!%oIWtP#ppYbsZo@oRks zyHgyt`?W{)bF4EIPjuO%J-9yNBTabCPV;AxA_cv*{r#-l-{O50{A&n$6dyl6KR)F6 zzTn6D^IpikAT*bVn~`fl3rsRweZ(xPVkv69Y6BRv+&W5D4Pw)wm7OHy| zsm^=Rd_`Q~xe9rI`W@JF?KPUi-O7o4BtdH*H6Lj~Zu0Us_B7cOI(_aVzMieq6qq7~ zqbBtuVh^$Bf!9gd5xvCaTV*J}54dMwL96OU>9bvgY*aMcwaU7pSqRb%#O@1NcGwd< zcMbJR@g<9_{Y!`sH6hOj6_EuVnC+$Znb04v&L7+lj_9bS zymC{oZuOC~N9bMDC$d_IOPjc1^Jy#C z0rn2Y6miXhKGk6Za=P&4sGnMd76t1ZL*JZkCUMR zNotdQcX20i95pj&FXh5Lp;DE5!cP@Sf{wcj==xW6XTf`Qntc8;+kxPtFBv@Bgp%0< zx?zwvjs%yHA`lIrQp&fK&5)vbkx2gbN0EYkZMod92X1|WUl&)u%$u-x*bAEQNBQ-k zdn&#QDO9e&Q@dPhLM^G3MlQN|O{m&!>)11Q0}h@}QwlOsn(|4IAKtK!*cpwm^ZwBL z3u}uGBqg1V?KX7> ztze7=(IIx9t1x_=Ty^vAZQx-AqQS4n&X0o6a+h!90{Q_xSls67Agu|wFyJ0_(GM=& zL)2StIcE?z01iZ|2!#q*H`k~I(&*Om9-4<}#9h@DqD;h8Nz*YH5KRy@naU#_gV~n9 zw$O8f*_jDVvIt7)bg}6ocLkkkNtcV0$TAiv-XhN?&f{jTW9417yEcT>WYvgU?I`aW zb=|gI2(8j*rwc8?jZmOd8r!zj?lobc(5RlQ1jVbU29;g6`J}o6 + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/ukf.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - ukf.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:040.0 %
Date:2024-04-18 23:11:36Functions:020.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::UKF<4, 1, 2>::inverse_exception::what() const0
mrs_lib::UKF<4, 1, 2>::square_root_exception::what() const0
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/ukf.h.func.html b/mrs_lib/include/mrs_lib/ukf.h.func.html new file mode 100644 index 0000000000..dc519a8e17 --- /dev/null +++ b/mrs_lib/include/mrs_lib/ukf.h.func.html @@ -0,0 +1,88 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/ukf.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - ukf.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:040.0 %
Date:2024-04-18 23:11:36Functions:020.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::UKF<4, 1, 2>::inverse_exception::what() const0
mrs_lib::UKF<4, 1, 2>::square_root_exception::what() const0
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/ukf.h.gcov.frameset.html b/mrs_lib/include/mrs_lib/ukf.h.gcov.frameset.html new file mode 100644 index 0000000000..931e85c953 --- /dev/null +++ b/mrs_lib/include/mrs_lib/ukf.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/ukf.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/include/mrs_lib/ukf.h.gcov.html b/mrs_lib/include/mrs_lib/ukf.h.gcov.html new file mode 100644 index 0000000000..f2a1f10c5e --- /dev/null +++ b/mrs_lib/include/mrs_lib/ukf.h.gcov.html @@ -0,0 +1,285 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/ukf.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - ukf.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:040.0 %
Date:2024-04-18 23:11:36Functions:020.0 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : // clang: MatousFormat
+       2             : #ifndef UKF_H
+       3             : #define UKF_H
+       4             : 
+       5             : /**  \file
+       6             :      \brief Defines UKF - a class implementing the Unscented Kalman Filter \cite UKF.
+       7             :      \author Tomáš Báča - bacatoma@fel.cvut.cz (original implementation)
+       8             :      \author Matouš Vrba - vrbamato@fel.cvut.cz (rewrite, documentation)
+       9             :  */
+      10             : 
+      11             : #include <mrs_lib/kalman_filter.h>
+      12             : 
+      13             : namespace mrs_lib
+      14             : {
+      15             : 
+      16             :   /**
+      17             :   * \brief Implementation of the Unscented Kalman filter \cite UKF.
+      18             :   *
+      19             :   * The Unscented Kalman filter (abbreviated UKF, \cite UKF) is a variant of the Kalman filter, which may be used
+      20             :   * for state filtration or estimation of non-linear systems as opposed to the Linear Kalman Filter
+      21             :   * (which is implemented in \ref LKF). The UKF tends to be more accurate than the simpler Extended Kalman Filter,
+      22             :   * espetially for highly non-linear systems. However, it is generally less stable than the LKF because of the extra
+      23             :   * matrix square root in the sigma points calculation, so it is recommended to use LKF for linear systems.
+      24             :   *
+      25             :   * The UKF C++ class itself is templated. This has its advantages and disadvantages. Main disadvantage is that it
+      26             :   * may be harder to use if you're not familiar with C++ templates, which, admittedly, can get somewhat messy,
+      27             :   * espetially during compilation. Another disadvantage is that if used unwisely, the compilation times can get
+      28             :   * much higher when using templates. The main advantage is compile-time checking (if it compiles, then it has
+      29             :   * a lower chance of crashing at runtime) and enabling more effective optimalizations during compilation. Also in case
+      30             :   * of Eigen, the code is arguably more readable when you use aliases to the specific Matrix instances instead of
+      31             :   * having Eigen::MatrixXd and Eigen::VectorXd everywhere.
+      32             :   *
+      33             :   * \tparam n_states         number of states of the system (length of the \f$ \mathbf{x} \f$ vector).
+      34             :   * \tparam n_inputs         number of inputs of the system (length of the \f$ \mathbf{u} \f$ vector).
+      35             :   * \tparam n_measurements   number of measurements of the system (length of the \f$ \mathbf{z} \f$ vector).
+      36             :   *
+      37             :   */
+      38             :   template <int n_states, int n_inputs, int n_measurements>
+      39             :   class UKF : KalmanFilter<n_states, n_inputs, n_measurements>
+      40             :   {
+      41             :   protected:
+      42             :     /* protected UKF definitions (typedefs, constants etc) //{ */
+      43             :     static constexpr int n = n_states;            /*!< \brief Length of the state vector of the system. */
+      44             :     static constexpr int m = n_inputs;            /*!< \brief Length of the input vector of the system. */
+      45             :     static constexpr int p = n_measurements;      /*!< \brief Length of the measurement vector of the system. */
+      46             :     static constexpr int w = 2 * n + 1;           /*!< \brief Number of sigma points/weights. */
+      47             : 
+      48             :     using Base_class = KalmanFilter<n, m, p>; /*!< \brief Base class of this class. */
+      49             : 
+      50             :     using X_t = typename Eigen::Matrix<double, n, w>;    /*!< \brief State sigma points matrix. */
+      51             :     using Z_t = typename Eigen::Matrix<double, p, w>;    /*!< \brief Measurement sigma points matrix. */
+      52             :     using Pzz_t = typename Eigen::Matrix<double, p, p>;  /*!< \brief Pzz helper matrix. */
+      53             :     using K_t = typename Eigen::Matrix<double, n, p>;    /*!< \brief Kalman gain matrix. */
+      54             :     //}
+      55             : 
+      56             :   public:
+      57             :     /* public UKF definitions (typedefs, constants etc) //{ */
+      58             :     //! state vector n*1 typedef
+      59             :     using x_t = typename Base_class::x_t;
+      60             :     //! input vector m*1 typedef
+      61             :     using u_t = typename Base_class::u_t;
+      62             :     //! measurement vector p*1 typedef
+      63             :     using z_t = typename Base_class::z_t;
+      64             :     //! state covariance n*n typedef
+      65             :     using P_t = typename Base_class::P_t;
+      66             :     //! measurement covariance p*p typedef
+      67             :     using R_t = typename Base_class::R_t;
+      68             :     //! process covariance n*n typedef
+      69             :     using Q_t = typename Base_class::Q_t;
+      70             :     //! weights vector (2n+1)*1 typedef
+      71             :     using W_t = typename Eigen::Matrix<double, w, 1>;
+      72             :     //! typedef of a helper struct for state and covariance
+      73             :     using statecov_t = typename Base_class::statecov_t;
+      74             :     //! function of the state transition model typedef
+      75             :     using transition_model_t = typename std::function<x_t(const x_t&, const u_t&, double)>;
+      76             :     //! function of the observation model typedef
+      77             :     using observation_model_t = typename std::function<z_t(const x_t&)>;
+      78             : 
+      79             :     //! is thrown when taking the square root of a matrix fails during sigma generation
+      80             :     struct square_root_exception : public std::exception
+      81             :     {
+      82           0 :       const char* what() const throw()
+      83             :       {
+      84           0 :         return "UKF: taking the square root of covariance update produced NANs!!!";
+      85             :       }
+      86             :     };
+      87             : 
+      88             :     //! is thrown when taking the inverse of a matrix fails during kalman gain calculation
+      89             :     struct inverse_exception : public std::exception
+      90             :     {
+      91           0 :       const char* what() const throw()
+      92             :       {
+      93           0 :         return "UKF: inverting of Pzz in correction update produced NANs!!!";
+      94             :       }
+      95             :     };
+      96             :     //}
+      97             : 
+      98             :   public:
+      99             :     /* UKF constructor //{ */
+     100             :   /*!
+     101             :     * \brief Convenience default constructor.
+     102             :     *
+     103             :     * This constructor should not be used if applicable. If used, the main constructor has to be called afterwards,
+     104             :     * otherwise the UKF object is invalid (not initialized).
+     105             :     */
+     106             :     UKF();
+     107             : 
+     108             :   /*!
+     109             :     * \brief The main constructor.
+     110             :     *
+     111             :     * \param alpha             Scaling parameter of the sigma generation (a small positive value, e.g. 1e-3).
+     112             :     * \param kappa             Secondary scaling parameter of the sigma generation (usually set to 0 or 1).
+     113             :     * \param beta              Incorporates prior knowledge about the distribution (for Gaussian distribution, 2 is optimal).
+     114             :     * \param transition_model  State transition model function.
+     115             :     * \param observation_model Observation model function.
+     116             :     */
+     117             :     UKF(const transition_model_t& transition_model, const observation_model_t& observation_model, const double alpha = 1e-3, const double kappa = 1, const double beta = 2);
+     118             :     //}
+     119             : 
+     120             :     /* correct() method //{ */
+     121             :   /*!
+     122             :     * \brief Implements the state correction step (measurement update).
+     123             :     *
+     124             :     * \param sc     Previous estimate of the state and covariance.
+     125             :     * \param z      Measurement vector.
+     126             :     * \param R      Measurement covariance matrix.
+     127             :     * \returns      The state and covariance after applying the correction step.
+     128             :     */
+     129             :     virtual statecov_t correct(const statecov_t& sc, const z_t& z, const R_t& R) const override;
+     130             :     //}
+     131             : 
+     132             :     /* predict() method //{ */
+     133             :   /*!
+     134             :     * \brief Implements the state prediction step (time update).
+     135             :     *
+     136             :     * \param sc     Previous estimate of the state and covariance.
+     137             :     * \param u      Input vector.
+     138             :     * \param Q      Process noise covariance matrix.
+     139             :     * \param dt     Duration since the previous estimate.
+     140             :     * \returns      The state and covariance after applying the correction step.
+     141             :     */
+     142             :     virtual statecov_t predict(const statecov_t& sc, const u_t& u, const Q_t& Q, double dt) const override;
+     143             :     //}
+     144             : 
+     145             :     /* setConstants() method //{ */
+     146             :   /*!
+     147             :     * \brief Changes the Unscented Transform parameters.
+     148             :     *
+     149             :     * \param alpha  Scaling parameter of the sigma generation (a small positive value - e.g. 1e-3).
+     150             :     * \param kappa  Secondary scaling parameter of the sigma generation (usually set to 0 or 1).
+     151             :     * \param beta   Incorporates prior knowledge about the distribution (for Gaussian distribution, 2 is optimal).
+     152             :     */
+     153             :     void setConstants(const double alpha, const double kappa, const double beta);
+     154             :     //}
+     155             : 
+     156             :     /* setTransitionModel() method //{ */
+     157             :   /*!
+     158             :     * \brief Changes the transition model function.
+     159             :     *
+     160             :     * \param transition_model   the new transition model
+     161             :     */
+     162             :     void setTransitionModel(const transition_model_t& transition_model);
+     163             :     //}
+     164             : 
+     165             :     /* setObservationModel() method //{ */
+     166             :   /*!
+     167             :     * \brief Changes the observation model function.
+     168             :     *
+     169             :     * \param observation_model   the new observation model
+     170             :     */
+     171             :     void setObservationModel(const observation_model_t& observation_model);
+     172             :     //}
+     173             : 
+     174             :   protected:
+     175             :     /* protected methods and member variables //{ */
+     176             : 
+     177             :     void computeWeights();
+     178             : 
+     179             :     X_t computeSigmas(const x_t& x, const P_t& P) const;
+     180             : 
+     181             :     P_t computePaSqrt(const P_t& P) const;
+     182             : 
+     183             :     Pzz_t computeInverse(const Pzz_t& Pzz) const;
+     184             : 
+     185             :     virtual K_t computeKalmanGain([[maybe_unused]] const x_t& x, [[maybe_unused]] const z_t& inn, const K_t& Pxz, const Pzz_t& Pzz) const;
+     186             : 
+     187             :     double m_alpha, m_kappa, m_beta, m_lambda;
+     188             :     W_t m_Wm;
+     189             :     W_t m_Wc;
+     190             : 
+     191             :     transition_model_t m_transition_model;
+     192             :     observation_model_t m_observation_model;
+     193             : 
+     194             :     //}
+     195             :   };
+     196             : 
+     197             : }  // namespace mrs_lib
+     198             : 
+     199             : #include <mrs_lib/impl/ukf.hpp>
+     200             : 
+     201             : #endif
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/ukf.h.gcov.overview.html b/mrs_lib/include/mrs_lib/ukf.h.gcov.overview.html new file mode 100644 index 0000000000..8e89cb65e2 --- /dev/null +++ b/mrs_lib/include/mrs_lib/ukf.h.gcov.overview.html @@ -0,0 +1,71 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/ukf.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/include/mrs_lib/ukf.h.gcov.png b/mrs_lib/include/mrs_lib/ukf.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..5ff0c195cf01462559c2d215ff73531ccba8b968 GIT binary patch literal 1009 zcmVVZnw*eF6UkbNPcKv^=)Z-0Q! zJpOCb3;)gt!h)(=>rYJ;mpx*?e&gkd>qz1kmlx2?w3*=waK{Re25iE{aA|0?LwBLB zD%286Hparp@?@rt*(q~@O)Lu-sI9YR762H%)eEeP>jsec>m_g>I57TPquSJ;^7_)G zl~uzFsa&#*h;7`MbptD>6a$h1=STrU&7%M#>-co5=@WT@1j~La&RkO*Q0pZH+5e`h%4MY>6srN0- z$SR+XQ6J4*Zz%@v&ysnrBU*_=R!G&-Dz#a~HFva!`Vn0Iuh;AId6&=USNVKiv#|r; z((dppW8bhOc$fSvrjGpTb*(`lNUriGOv_55oW(XQVH_PG4w zavd8@E@8?sqP-$Qx2>QKxbfj@wVfG&N8MbqsLd4+EA-zj7wcyGZ3zS=3>1Hv;(>w9#UIiu@RVGaezSpwS0PV2k z(d4><$_;we9s$V^YEQ6@<#4xsGlXYRyd1(=7i3_TvC?$w#2Fc7^oOxY`xK_H3cf6- zmjyrAP;3_k-`~47%$<=@MlX1mbQ0MD{K8ow`7)K2)ZO--xlP4qhR@Y{KBz~5=NRwW z>UW-cfWF13i@wVuJ1gbPCTY1E@dJWVze0>rV8+INwVVJOiEd6EJzn3NW*i7|x_U}X fFW?ibQFVU<_#_im^V@F%00000NkvXXu0mjfeC5`c literal 0 HcmV?d00001 diff --git a/mrs_lib/include/mrs_lib/utils.h.func-sort-c.html b/mrs_lib/include/mrs_lib/utils.h.func-sort-c.html new file mode 100644 index 0000000000..dbbdd549d9 --- /dev/null +++ b/mrs_lib/include/mrs_lib/utils.h.func-sort-c.html @@ -0,0 +1,100 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/utils.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - utils.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:1515100.0 %
Date:2024-04-18 23:11:36Functions:55100.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > mrs_lib::containerToString<boost::array<int, 3ul> >(boost::array<int, 3ul> const&, char const*)1
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > mrs_lib::containerToString<__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > > >(__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, char const*)1
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > mrs_lib::containerToString<__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > > >(__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > mrs_lib::containerToString<int const*>(int const*, int const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1
int mrs_lib::signum<double>(double)43534
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/utils.h.func.html b/mrs_lib/include/mrs_lib/utils.h.func.html new file mode 100644 index 0000000000..4aaa4952c7 --- /dev/null +++ b/mrs_lib/include/mrs_lib/utils.h.func.html @@ -0,0 +1,100 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/utils.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - utils.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:1515100.0 %
Date:2024-04-18 23:11:36Functions:55100.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > mrs_lib::containerToString<boost::array<int, 3ul> >(boost::array<int, 3ul> const&, char const*)1
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > mrs_lib::containerToString<__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > > >(__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, char const*)1
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > mrs_lib::containerToString<__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > > >(__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > mrs_lib::containerToString<int const*>(int const*, int const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1
int mrs_lib::signum<double>(double)43534
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/utils.h.gcov.frameset.html b/mrs_lib/include/mrs_lib/utils.h.gcov.frameset.html new file mode 100644 index 0000000000..aa11b08511 --- /dev/null +++ b/mrs_lib/include/mrs_lib/utils.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/utils.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/include/mrs_lib/utils.h.gcov.html b/mrs_lib/include/mrs_lib/utils.h.gcov.html new file mode 100644 index 0000000000..1c8f53ce3d --- /dev/null +++ b/mrs_lib/include/mrs_lib/utils.h.gcov.html @@ -0,0 +1,229 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/utils.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - utils.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:1515100.0 %
Date:2024-04-18 23:11:36Functions:55100.0 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : // clang: MatousFormat
+       2             : /**  \file
+       3             :      \brief Defines various general utility functions.
+       4             :      \author Matouš Vrba - vrbamato@fel.cvut.cz
+       5             :      \author Viktor Walter - walver.viktor@fel.cvut.cz
+       6             :      \author Tomáš Báča - baca.tomas@fel.cvut.cz
+       7             :  */
+       8             : #ifndef UTILS_H
+       9             : #define UTILS_H
+      10             : 
+      11             : #include <iterator>
+      12             : #include <vector>
+      13             : #include <sstream>
+      14             : #include <atomic>
+      15             : 
+      16             : namespace mrs_lib
+      17             : {
+      18             :   /* containerToString() function //{ */
+      19             : 
+      20             :   /**
+      21             :    * \brief Convenience function for converting container ranges to strings (e.g. for printing).
+      22             :    *
+      23             :    * \param begin        first element of the container that will be converted to \p std::string.
+      24             :    * \param end          one-after-the-last element of the container that will be converted to \p std::string.
+      25             :    * \param delimiter    will be used to separate the elements in the output.
+      26             :    * \return             elements of the container from \p begin to \p end (excluding), converted to string and separated by \p delimiter.
+      27             :    *
+      28             :    */
+      29             :   template <typename Iterator>
+      30           2 :   std::string containerToString(const Iterator begin, const Iterator end, const std::string& delimiter = ", ")
+      31             :   {
+      32           2 :     bool first = true;
+      33           4 :     std::ostringstream output;
+      34           7 :     for (Iterator it = begin; it != end; it++)
+      35             :     {
+      36           5 :       if (!first)
+      37           3 :         output << delimiter;
+      38           5 :       output << *it;
+      39           5 :       first = false;
+      40             :     }
+      41           4 :     return output.str();
+      42             :   }
+      43             : 
+      44             :   /**
+      45             :    * \brief Convenience function for converting container ranges to strings (e.g. for printing).
+      46             :    *
+      47             :    * \param begin        first element of the container that will be converted to \p std::string.
+      48             :    * \param end          one-after-the-last element of the container that will be converted to \p std::string.
+      49             :    * \param delimiter    will be used to separate the elements in the output.
+      50             :    * \return             elements of the container from \p begin to \p end (excluding), converted to string and separated by \p delimiter.
+      51             :    *
+      52             :    */
+      53             :   template <typename Iterator>
+      54           1 :   std::string containerToString(const Iterator begin, const Iterator end, const char* delimiter)
+      55             :   {
+      56           1 :     return containerToString(begin, end, std::string(delimiter));
+      57             :   }
+      58             : 
+      59             :   /**
+      60             :    * \brief Convenience function for converting containers to strings (e.g. for printing).
+      61             :    *
+      62             :    * \param cont         the container that will be converted to \p std::string.
+      63             :    * \param delimiter    will be used to separate the elements in the output.
+      64             :    * \return             elements of the container from \p begin to \p end (excluding), converted to string and separated by \p delimiter.
+      65             :    *
+      66             :    */
+      67             :   template <typename Container>
+      68             :   std::string containerToString(const Container& cont, const std::string& delimiter = ", ")
+      69             :   {
+      70             :     return containerToString(std::begin(cont), std::end(cont), delimiter);
+      71             :   }
+      72             : 
+      73             :   /**
+      74             :    * \brief Convenience function for converting containers to strings (e.g. for printing).
+      75             :    *
+      76             :    * \param cont         the container that will be converted to \p std::string.
+      77             :    * \param delimiter    will be used to separate the elements in the output.
+      78             :    * \return             elements of the container from \p begin to \p end (excluding), converted to string and separated by \p delimiter.
+      79             :    *
+      80             :    */
+      81             :   template <typename Container>
+      82           1 :   std::string containerToString(const Container& cont, const char* delimiter = ", ")
+      83             :   {
+      84           1 :     return containerToString(std::begin(cont), std::end(cont), std::string(delimiter));
+      85             :   }
+      86             : 
+      87             :   //}
+      88             : 
+      89             :   /* remove_const() function //{ */
+      90             : 
+      91             :   /**
+      92             :    * \brief Convenience class for removing const-ness from a container iterator.
+      93             :    *
+      94             :    * \param it    the iterator from which const-ness should be removed.
+      95             :    * \param cont  the corresponding container of the iterator.
+      96             :    * \return      a non-const iterator, pointing to the same element as \p it.
+      97             :    *
+      98             :    */
+      99             :   template <typename T>
+     100             :   typename T::iterator remove_const(const typename T::const_iterator& it, T& cont)
+     101             :   {
+     102             :     typename T::iterator ret = cont.begin();
+     103             :     std::advance(ret, std::distance((typename T::const_iterator)ret, it));
+     104             :     return ret;
+     105             :   }
+     106             : 
+     107             :   //}
+     108             : 
+     109             :   /**
+     110             :    * \brief Convenience class for automatically setting and unsetting an atomic boolean based on the object's scope.
+     111             :    * Useful e.g. for indicating whether a thread is running or not.
+     112             :    *
+     113             :    */
+     114             :   class AtomicScopeFlag
+     115             :   {
+     116             : 
+     117             :   public:
+     118             :   /**
+     119             :    * \brief The constructor. Sets the flag \p in to \p true.
+     120             :    *
+     121             :    * \param in  The flag to be set on construction of this object and reset (set to \p false) on its destruction.
+     122             :    *
+     123             :    */
+     124             :     AtomicScopeFlag(std::atomic<bool>& in);
+     125             :   /**
+     126             :    * \brief The destructor. Resets the variable given in the constructor to \p false.
+     127             :    *
+     128             :    */
+     129             :     ~AtomicScopeFlag();
+     130             : 
+     131             :   private:
+     132             :     std::atomic<bool>& variable;
+     133             :   };
+     134             : 
+     135             :   // branchless, templated, more efficient version of the signum function
+     136             :   // taken from https://stackoverflow.com/questions/1903954/is-there-a-standard-sign-function-signum-sgn-in-c-c
+     137             :   template <typename T>
+     138       43534 :   int signum(T val)
+     139             :   {
+     140       43534 :     return (T(0) < val) - (val < T(0));
+     141             :   }
+     142             : 
+     143             : }  // namespace mrs_lib
+     144             : 
+     145             : #endif
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/utils.h.gcov.overview.html b/mrs_lib/include/mrs_lib/utils.h.gcov.overview.html new file mode 100644 index 0000000000..d983ecb00f --- /dev/null +++ b/mrs_lib/include/mrs_lib/utils.h.gcov.overview.html @@ -0,0 +1,57 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/utils.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/include/mrs_lib/utils.h.gcov.png b/mrs_lib/include/mrs_lib/utils.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..3c5a1ba70c3b1da9d74597a8f6a3c0e7615a62c4 GIT binary patch literal 677 zcmV;W0$TlvP)l=4-G#Um_Yy`w6Rs=M&%v{=o`r-?%xM=OW>h&bqcU+TQz!t_l+ia=f`g{ zR3ebC>F<(@nc_|$XwYCW585V*GUF4_YnnA?2Y?xjsxXB|u>b-jM|J$g9D4!O!}y3( z>5n>1RXeh2o;lbn0z%RcBZC=;F0pmW%D84()+*GV>CMgDn&J{&GQ~*U=k)Y}ED75N zXW&vio5`7>J*xQp>7;&<(HwNLONQ3&6{vH)_G$2 z%brso?`BUU_fSR|oC)j;ukm1<{Ww+)E zv_~BY1xYIs0xvt6FdPj^V}SR0$bcsq-sw?u)~2MeU&YCx{HQABB;Ewpy!6`E%Y?EX zeaj!rxc6&3Vz|_MN;%5mz?GsVc{G)%nYbrtChOJd@xaP>uO0>`9EE$x`x^!6hQOmK zMHJ~S3CLLmhtCS`i41#bM9^E)gF*O)CiT%EpB>CyJZk2ow&~6} + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/vector_converter.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - vector_converter.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:55100.0 %
Date:2024-04-18 23:11:36Functions:3636100.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
geometry_msgs::Vector3_<std::allocator<void> > mrs_lib::convert<geometry_msgs::Vector3_<std::allocator<void> >, cv::Vec<double, 3> >(cv::Vec<double, 3> const&)1
geometry_msgs::Vector3_<std::allocator<void> > mrs_lib::convert<geometry_msgs::Vector3_<std::allocator<void> >, cv::Vec<float, 3> >(cv::Vec<float, 3> const&)1
geometry_msgs::Vector3_<std::allocator<void> > mrs_lib::convert<geometry_msgs::Vector3_<std::allocator<void> >, pcl::PointXYZ>(pcl::PointXYZ const&)1
geometry_msgs::Vector3_<std::allocator<void> > mrs_lib::convert<geometry_msgs::Vector3_<std::allocator<void> >, Eigen::Matrix<double, 3, 1, 0, 3, 1> >(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&)1
geometry_msgs::Vector3_<std::allocator<void> > mrs_lib::convert<geometry_msgs::Vector3_<std::allocator<void> >, Eigen::Matrix<float, 3, 1, 0, 3, 1> >(Eigen::Matrix<float, 3, 1, 0, 3, 1> const&)1
geometry_msgs::Vector3_<std::allocator<void> > mrs_lib::convert<geometry_msgs::Vector3_<std::allocator<void> >, geometry_msgs::Vector3_<std::allocator<void> > >(geometry_msgs::Vector3_<std::allocator<void> > const&)1
cv::Vec<double, 3> mrs_lib::convert<cv::Vec<double, 3>, geometry_msgs::Vector3_<std::allocator<void> > >(geometry_msgs::Vector3_<std::allocator<void> > const&)1
cv::Vec<double, 3> mrs_lib::convert<cv::Vec<double, 3>, pcl::PointXYZ>(pcl::PointXYZ const&)1
cv::Vec<double, 3> mrs_lib::convert<cv::Vec<double, 3>, Eigen::Matrix<double, 3, 1, 0, 3, 1> >(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&)1
cv::Vec<double, 3> mrs_lib::convert<cv::Vec<double, 3>, Eigen::Matrix<float, 3, 1, 0, 3, 1> >(Eigen::Matrix<float, 3, 1, 0, 3, 1> const&)1
cv::Vec<double, 3> mrs_lib::convert<cv::Vec<double, 3>, cv::Vec<float, 3> >(cv::Vec<float, 3> const&)1
cv::Vec<double, 3> mrs_lib::convert<cv::Vec<double, 3>, cv::Vec<double, 3> >(cv::Vec<double, 3> const&)1
cv::Vec<float, 3> mrs_lib::convert<cv::Vec<float, 3>, geometry_msgs::Vector3_<std::allocator<void> > >(geometry_msgs::Vector3_<std::allocator<void> > const&)1
cv::Vec<float, 3> mrs_lib::convert<cv::Vec<float, 3>, pcl::PointXYZ>(pcl::PointXYZ const&)1
cv::Vec<float, 3> mrs_lib::convert<cv::Vec<float, 3>, Eigen::Matrix<double, 3, 1, 0, 3, 1> >(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&)1
cv::Vec<float, 3> mrs_lib::convert<cv::Vec<float, 3>, Eigen::Matrix<float, 3, 1, 0, 3, 1> >(Eigen::Matrix<float, 3, 1, 0, 3, 1> const&)1
cv::Vec<float, 3> mrs_lib::convert<cv::Vec<float, 3>, cv::Vec<double, 3> >(cv::Vec<double, 3> const&)1
cv::Vec<float, 3> mrs_lib::convert<cv::Vec<float, 3>, cv::Vec<float, 3> >(cv::Vec<float, 3> const&)1
pcl::PointXYZ mrs_lib::convert<pcl::PointXYZ, geometry_msgs::Vector3_<std::allocator<void> > >(geometry_msgs::Vector3_<std::allocator<void> > const&)1
pcl::PointXYZ mrs_lib::convert<pcl::PointXYZ, cv::Vec<double, 3> >(cv::Vec<double, 3> const&)1
pcl::PointXYZ mrs_lib::convert<pcl::PointXYZ, cv::Vec<float, 3> >(cv::Vec<float, 3> const&)1
pcl::PointXYZ mrs_lib::convert<pcl::PointXYZ, Eigen::Matrix<double, 3, 1, 0, 3, 1> >(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&)1
pcl::PointXYZ mrs_lib::convert<pcl::PointXYZ, Eigen::Matrix<float, 3, 1, 0, 3, 1> >(Eigen::Matrix<float, 3, 1, 0, 3, 1> const&)1
pcl::PointXYZ mrs_lib::convert<pcl::PointXYZ, pcl::PointXYZ>(pcl::PointXYZ const&)1
Eigen::Matrix<double, 3, 1, 0, 3, 1> mrs_lib::convert<Eigen::Matrix<double, 3, 1, 0, 3, 1>, geometry_msgs::Vector3_<std::allocator<void> > >(geometry_msgs::Vector3_<std::allocator<void> > const&)1
Eigen::Matrix<double, 3, 1, 0, 3, 1> mrs_lib::convert<Eigen::Matrix<double, 3, 1, 0, 3, 1>, cv::Vec<double, 3> >(cv::Vec<double, 3> const&)1
Eigen::Matrix<double, 3, 1, 0, 3, 1> mrs_lib::convert<Eigen::Matrix<double, 3, 1, 0, 3, 1>, cv::Vec<float, 3> >(cv::Vec<float, 3> const&)1
Eigen::Matrix<double, 3, 1, 0, 3, 1> mrs_lib::convert<Eigen::Matrix<double, 3, 1, 0, 3, 1>, pcl::PointXYZ>(pcl::PointXYZ const&)1
Eigen::Matrix<double, 3, 1, 0, 3, 1> mrs_lib::convert<Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<float, 3, 1, 0, 3, 1> >(Eigen::Matrix<float, 3, 1, 0, 3, 1> const&)1
Eigen::Matrix<double, 3, 1, 0, 3, 1> mrs_lib::convert<Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1> >(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&)1
Eigen::Matrix<float, 3, 1, 0, 3, 1> mrs_lib::convert<Eigen::Matrix<float, 3, 1, 0, 3, 1>, geometry_msgs::Vector3_<std::allocator<void> > >(geometry_msgs::Vector3_<std::allocator<void> > const&)1
Eigen::Matrix<float, 3, 1, 0, 3, 1> mrs_lib::convert<Eigen::Matrix<float, 3, 1, 0, 3, 1>, cv::Vec<double, 3> >(cv::Vec<double, 3> const&)1
Eigen::Matrix<float, 3, 1, 0, 3, 1> mrs_lib::convert<Eigen::Matrix<float, 3, 1, 0, 3, 1>, cv::Vec<float, 3> >(cv::Vec<float, 3> const&)1
Eigen::Matrix<float, 3, 1, 0, 3, 1> mrs_lib::convert<Eigen::Matrix<float, 3, 1, 0, 3, 1>, pcl::PointXYZ>(pcl::PointXYZ const&)1
Eigen::Matrix<float, 3, 1, 0, 3, 1> mrs_lib::convert<Eigen::Matrix<float, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1> >(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&)1
Eigen::Matrix<float, 3, 1, 0, 3, 1> mrs_lib::convert<Eigen::Matrix<float, 3, 1, 0, 3, 1>, Eigen::Matrix<float, 3, 1, 0, 3, 1> >(Eigen::Matrix<float, 3, 1, 0, 3, 1> const&)1
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/vector_converter.h.func.html b/mrs_lib/include/mrs_lib/vector_converter.h.func.html new file mode 100644 index 0000000000..3a1e9ee4e9 --- /dev/null +++ b/mrs_lib/include/mrs_lib/vector_converter.h.func.html @@ -0,0 +1,224 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/vector_converter.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - vector_converter.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:55100.0 %
Date:2024-04-18 23:11:36Functions:3636100.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
geometry_msgs::Vector3_<std::allocator<void> > mrs_lib::convert<geometry_msgs::Vector3_<std::allocator<void> >, cv::Vec<double, 3> >(cv::Vec<double, 3> const&)1
geometry_msgs::Vector3_<std::allocator<void> > mrs_lib::convert<geometry_msgs::Vector3_<std::allocator<void> >, cv::Vec<float, 3> >(cv::Vec<float, 3> const&)1
geometry_msgs::Vector3_<std::allocator<void> > mrs_lib::convert<geometry_msgs::Vector3_<std::allocator<void> >, pcl::PointXYZ>(pcl::PointXYZ const&)1
geometry_msgs::Vector3_<std::allocator<void> > mrs_lib::convert<geometry_msgs::Vector3_<std::allocator<void> >, Eigen::Matrix<double, 3, 1, 0, 3, 1> >(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&)1
geometry_msgs::Vector3_<std::allocator<void> > mrs_lib::convert<geometry_msgs::Vector3_<std::allocator<void> >, Eigen::Matrix<float, 3, 1, 0, 3, 1> >(Eigen::Matrix<float, 3, 1, 0, 3, 1> const&)1
geometry_msgs::Vector3_<std::allocator<void> > mrs_lib::convert<geometry_msgs::Vector3_<std::allocator<void> >, geometry_msgs::Vector3_<std::allocator<void> > >(geometry_msgs::Vector3_<std::allocator<void> > const&)1
cv::Vec<double, 3> mrs_lib::convert<cv::Vec<double, 3>, geometry_msgs::Vector3_<std::allocator<void> > >(geometry_msgs::Vector3_<std::allocator<void> > const&)1
cv::Vec<double, 3> mrs_lib::convert<cv::Vec<double, 3>, pcl::PointXYZ>(pcl::PointXYZ const&)1
cv::Vec<double, 3> mrs_lib::convert<cv::Vec<double, 3>, Eigen::Matrix<double, 3, 1, 0, 3, 1> >(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&)1
cv::Vec<double, 3> mrs_lib::convert<cv::Vec<double, 3>, Eigen::Matrix<float, 3, 1, 0, 3, 1> >(Eigen::Matrix<float, 3, 1, 0, 3, 1> const&)1
cv::Vec<double, 3> mrs_lib::convert<cv::Vec<double, 3>, cv::Vec<float, 3> >(cv::Vec<float, 3> const&)1
cv::Vec<double, 3> mrs_lib::convert<cv::Vec<double, 3>, cv::Vec<double, 3> >(cv::Vec<double, 3> const&)1
cv::Vec<float, 3> mrs_lib::convert<cv::Vec<float, 3>, geometry_msgs::Vector3_<std::allocator<void> > >(geometry_msgs::Vector3_<std::allocator<void> > const&)1
cv::Vec<float, 3> mrs_lib::convert<cv::Vec<float, 3>, pcl::PointXYZ>(pcl::PointXYZ const&)1
cv::Vec<float, 3> mrs_lib::convert<cv::Vec<float, 3>, Eigen::Matrix<double, 3, 1, 0, 3, 1> >(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&)1
cv::Vec<float, 3> mrs_lib::convert<cv::Vec<float, 3>, Eigen::Matrix<float, 3, 1, 0, 3, 1> >(Eigen::Matrix<float, 3, 1, 0, 3, 1> const&)1
cv::Vec<float, 3> mrs_lib::convert<cv::Vec<float, 3>, cv::Vec<double, 3> >(cv::Vec<double, 3> const&)1
cv::Vec<float, 3> mrs_lib::convert<cv::Vec<float, 3>, cv::Vec<float, 3> >(cv::Vec<float, 3> const&)1
pcl::PointXYZ mrs_lib::convert<pcl::PointXYZ, geometry_msgs::Vector3_<std::allocator<void> > >(geometry_msgs::Vector3_<std::allocator<void> > const&)1
pcl::PointXYZ mrs_lib::convert<pcl::PointXYZ, cv::Vec<double, 3> >(cv::Vec<double, 3> const&)1
pcl::PointXYZ mrs_lib::convert<pcl::PointXYZ, cv::Vec<float, 3> >(cv::Vec<float, 3> const&)1
pcl::PointXYZ mrs_lib::convert<pcl::PointXYZ, Eigen::Matrix<double, 3, 1, 0, 3, 1> >(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&)1
pcl::PointXYZ mrs_lib::convert<pcl::PointXYZ, Eigen::Matrix<float, 3, 1, 0, 3, 1> >(Eigen::Matrix<float, 3, 1, 0, 3, 1> const&)1
pcl::PointXYZ mrs_lib::convert<pcl::PointXYZ, pcl::PointXYZ>(pcl::PointXYZ const&)1
Eigen::Matrix<double, 3, 1, 0, 3, 1> mrs_lib::convert<Eigen::Matrix<double, 3, 1, 0, 3, 1>, geometry_msgs::Vector3_<std::allocator<void> > >(geometry_msgs::Vector3_<std::allocator<void> > const&)1
Eigen::Matrix<double, 3, 1, 0, 3, 1> mrs_lib::convert<Eigen::Matrix<double, 3, 1, 0, 3, 1>, cv::Vec<double, 3> >(cv::Vec<double, 3> const&)1
Eigen::Matrix<double, 3, 1, 0, 3, 1> mrs_lib::convert<Eigen::Matrix<double, 3, 1, 0, 3, 1>, cv::Vec<float, 3> >(cv::Vec<float, 3> const&)1
Eigen::Matrix<double, 3, 1, 0, 3, 1> mrs_lib::convert<Eigen::Matrix<double, 3, 1, 0, 3, 1>, pcl::PointXYZ>(pcl::PointXYZ const&)1
Eigen::Matrix<double, 3, 1, 0, 3, 1> mrs_lib::convert<Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<float, 3, 1, 0, 3, 1> >(Eigen::Matrix<float, 3, 1, 0, 3, 1> const&)1
Eigen::Matrix<double, 3, 1, 0, 3, 1> mrs_lib::convert<Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1> >(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&)1
Eigen::Matrix<float, 3, 1, 0, 3, 1> mrs_lib::convert<Eigen::Matrix<float, 3, 1, 0, 3, 1>, geometry_msgs::Vector3_<std::allocator<void> > >(geometry_msgs::Vector3_<std::allocator<void> > const&)1
Eigen::Matrix<float, 3, 1, 0, 3, 1> mrs_lib::convert<Eigen::Matrix<float, 3, 1, 0, 3, 1>, cv::Vec<double, 3> >(cv::Vec<double, 3> const&)1
Eigen::Matrix<float, 3, 1, 0, 3, 1> mrs_lib::convert<Eigen::Matrix<float, 3, 1, 0, 3, 1>, cv::Vec<float, 3> >(cv::Vec<float, 3> const&)1
Eigen::Matrix<float, 3, 1, 0, 3, 1> mrs_lib::convert<Eigen::Matrix<float, 3, 1, 0, 3, 1>, pcl::PointXYZ>(pcl::PointXYZ const&)1
Eigen::Matrix<float, 3, 1, 0, 3, 1> mrs_lib::convert<Eigen::Matrix<float, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1> >(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&)1
Eigen::Matrix<float, 3, 1, 0, 3, 1> mrs_lib::convert<Eigen::Matrix<float, 3, 1, 0, 3, 1>, Eigen::Matrix<float, 3, 1, 0, 3, 1> >(Eigen::Matrix<float, 3, 1, 0, 3, 1> const&)1
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/vector_converter.h.gcov.frameset.html b/mrs_lib/include/mrs_lib/vector_converter.h.gcov.frameset.html new file mode 100644 index 0000000000..e28918f7a4 --- /dev/null +++ b/mrs_lib/include/mrs_lib/vector_converter.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/vector_converter.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/include/mrs_lib/vector_converter.h.gcov.html b/mrs_lib/include/mrs_lib/vector_converter.h.gcov.html new file mode 100644 index 0000000000..a1fa08ea1d --- /dev/null +++ b/mrs_lib/include/mrs_lib/vector_converter.h.gcov.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/vector_converter.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - vector_converter.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:55100.0 %
Date:2024-04-18 23:11:36Functions:3636100.0 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : // clang: MatousFormat
+       2             : /**  \file vector_converter.h
+       3             :      \brief Defines the convert() function for conversion between different vector representations (Eigen, OpenCV, tf2 etc.).
+       4             :      \author Matouš Vrba - vrbamato@fel.cvut.cz
+       5             :  */
+       6             : #ifndef VECTOR_CONVERTER_H
+       7             : #define VECTOR_CONVERTER_H
+       8             : 
+       9             : #include <tuple>
+      10             : 
+      11             : #include <mrs_lib/impl/vector_converter.hpp>
+      12             : 
+      13             : namespace mrs_lib
+      14             : {
+      15             : 
+      16             :   /*!
+      17             :    * \brief Converts between different vector representations.
+      18             :    *
+      19             :    * Usage (for full example, see the file vector_converter/example.cpp):
+      20             :    *
+      21             :    * `auto out = mrs_lib::convert<to_type>(in);`
+      22             :    *
+      23             :    * Supported types by default are: `Eigen::Vector3d`, `cv::Vec3d`, `geometry_msgs::Vector3`.
+      24             :    * If you want to use this with a new type, it should work automagically if it provides a reasonable API.
+      25             :    * If it doesn't work by default, you just need to implement the respective convertTo() and convertFrom() functions for that type (see the file impl/vector_converter.hpp and the example file vector_converter/example.cpp).
+      26             :    *
+      27             :    * \param in  The input vector to be converted to the \p ret_t type.
+      28             :    *
+      29             :    * \tparam ret_t Type of the return vector. You need to specify this when calling the function.
+      30             :    * \tparam in_t  Type of the input vector. This parameter is deduced by the compiler and doesn't need to be specified in usual cases.
+      31             :    *
+      32             :    */
+      33             :   template <typename ret_t, typename in_t>
+      34          36 :   ret_t convert(const in_t& in)
+      35             :   {
+      36          36 :     const auto [x, y, z] = impl::convertFrom(in);
+      37          36 :     ret_t ret;
+      38          36 :     impl::convertTo(ret, x, y, z);
+      39          66 :     return ret;
+      40             :   }
+      41             : 
+      42             : }
+      43             : 
+      44             : #endif // VECTOR_CONVERTER_H
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/vector_converter.h.gcov.overview.html b/mrs_lib/include/mrs_lib/vector_converter.h.gcov.overview.html new file mode 100644 index 0000000000..943e1c27f6 --- /dev/null +++ b/mrs_lib/include/mrs_lib/vector_converter.h.gcov.overview.html @@ -0,0 +1,31 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/vector_converter.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/include/mrs_lib/vector_converter.h.gcov.png b/mrs_lib/include/mrs_lib/vector_converter.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..0213761517fcd503a7734a61558dfce4281808fe GIT binary patch literal 366 zcmeAS@N?(olHy`uVBq!ia0vp^0YI$7!VDxC?klMPNr?cT5ZC|z|E~gqG_SB2M%>2yfa=luuJVf}zG{gTHW~)`*f}N$NhxBgI-QBu0 zUgYBYbF77KfvcK&J?5I!9x!5v+P_nwa?;v~tZ(h7W^8_X?C;`pk5hW98`P%gY{>b< z7T;ibT_bhtakp5upzE)WbRLzQUAZ<%?dy@5MS0FK{10b+p2m8+F!wdXX{$e1g+q;= zZh1Oo)8c;pBQuf?Dq3*`CP~d+ab(3zgM0SXH*URr$?%sUM$Ps3p-Hp7fZ@R4>FVdQ I&MBb@03ZyU+yDRo literal 0 HcmV?d00001 diff --git a/mrs_lib/include/mrs_lib/visual_object.h.func-sort-c.html b/mrs_lib/include/mrs_lib/visual_object.h.func-sort-c.html new file mode 100644 index 0000000000..8a52c2f19f --- /dev/null +++ b/mrs_lib/include/mrs_lib/visual_object.h.func-sort-c.html @@ -0,0 +1,84 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/visual_object.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - visual_object.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:22100.0 %
Date:2024-04-18 23:11:36Functions:11100.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::VisualObject::operator<(mrs_lib::VisualObject const&) const242
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/visual_object.h.func.html b/mrs_lib/include/mrs_lib/visual_object.h.func.html new file mode 100644 index 0000000000..412d508809 --- /dev/null +++ b/mrs_lib/include/mrs_lib/visual_object.h.func.html @@ -0,0 +1,84 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/visual_object.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - visual_object.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:22100.0 %
Date:2024-04-18 23:11:36Functions:11100.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::VisualObject::operator<(mrs_lib::VisualObject const&) const242
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/visual_object.h.gcov.frameset.html b/mrs_lib/include/mrs_lib/visual_object.h.gcov.frameset.html new file mode 100644 index 0000000000..c9a9cb38a2 --- /dev/null +++ b/mrs_lib/include/mrs_lib/visual_object.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/visual_object.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/include/mrs_lib/visual_object.h.gcov.html b/mrs_lib/include/mrs_lib/visual_object.h.gcov.html new file mode 100644 index 0000000000..2c74967129 --- /dev/null +++ b/mrs_lib/include/mrs_lib/visual_object.h.gcov.html @@ -0,0 +1,186 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/visual_object.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/include/mrs_lib - visual_object.h (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:22100.0 %
Date:2024-04-18 23:11:36Functions:11100.0 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : /**  \file
+       2             :      \brief Object abstraction for the Batch Visualizer
+       3             :      \author Petr Štibinger - stibipet@fel.cvut.cz
+       4             :  */
+       5             : 
+       6             : #ifndef BATCH_VISUALIZER__VISUAL_OBJECT_H
+       7             : #define BATCH_VISUALIZER__VISUAL_OBJECT_H
+       8             : 
+       9             : #include <Eigen/Core>
+      10             : #include <ros/time.h>
+      11             : #include <std_msgs/ColorRGBA.h>
+      12             : #include <geometry_msgs/Point.h>
+      13             : #include <mrs_lib/geometry/shapes.h>
+      14             : #include <mrs_msgs/Path.h>
+      15             : #include <mrs_msgs/TrajectoryReference.h>
+      16             : 
+      17             : #define DEFAULT_ELLIPSE_POINTS 64
+      18             : 
+      19             : namespace mrs_lib
+      20             : {
+      21             : 
+      22             : enum MarkerType
+      23             : {
+      24             :   POINT    = 0,
+      25             :   LINE     = 1,
+      26             :   TRIANGLE = 2
+      27             : };
+      28             : 
+      29             : class VisualObject {
+      30             : 
+      31             : 
+      32             : public:
+      33             :   VisualObject(const Eigen::Vector3d& point, const double r, const double g, const double b, const double a, const ros::Duration& timeout,
+      34             :                const unsigned long& id);
+      35             : 
+      36             :   VisualObject(const mrs_lib::geometry::Ray& ray, const double r, const double g, const double b, const double a, const ros::Duration& timeout,
+      37             :                const unsigned long& id);
+      38             : 
+      39             :   VisualObject(const mrs_lib::geometry::Triangle& triangle, const double r, const double g, const double b, const double a, const ros::Duration& timeout,
+      40             :                const bool filled, const unsigned long& id);
+      41             : 
+      42             :   VisualObject(const mrs_lib::geometry::Rectangle& rectangle, const double r, const double g, const double b, const double a, const ros::Duration& timeout,
+      43             :                const bool filled, const unsigned long& id);
+      44             : 
+      45             :   VisualObject(const mrs_lib::geometry::Cuboid& cuboid, const double r, const double g, const double b, const double a, const ros::Duration& timeout,
+      46             :                const bool filled, const unsigned long& id);
+      47             : 
+      48             :   VisualObject(const mrs_lib::geometry::Ellipse& ellipse, const double r, const double g, const double b, const double a, const ros::Duration& timeout,
+      49             :                const bool filled, const unsigned long& id, const int num_points = DEFAULT_ELLIPSE_POINTS);
+      50             : 
+      51             :   VisualObject(const mrs_lib::geometry::Cylinder& cylinder, const double r, const double g, const double b, const double a, const ros::Duration& timeout,
+      52             :                const bool filled, const bool capped, const unsigned long& id, const int num_sides = DEFAULT_ELLIPSE_POINTS);
+      53             : 
+      54             :   VisualObject(const mrs_lib::geometry::Cone& cone, const double r, const double g, const double b, const double a, const ros::Duration& timeout,
+      55             :                const bool filled, const bool capped, const unsigned long& id, const int num_sides = DEFAULT_ELLIPSE_POINTS);
+      56             : 
+      57             :   VisualObject(const mrs_msgs::Path& p, const double r, const double g, const double b, const double a, const ros::Duration& timeout, const bool filled,
+      58             :                const unsigned long& id);
+      59             : 
+      60             :   VisualObject(const mrs_msgs::TrajectoryReference& traj, const double r, const double g, const double b, const double a, const ros::Duration& timeout,
+      61             :                const bool filled, const unsigned long& id);
+      62             : 
+      63             : 
+      64             : public:
+      65             :   unsigned long getID() const;
+      66             :   int           getType() const;
+      67             :   bool          isTimedOut() const;
+      68             : 
+      69             :   const std::vector<geometry_msgs::Point> getPoints() const;
+      70             :   const std::vector<std_msgs::ColorRGBA>  getColors() const;
+      71             : 
+      72         242 :   bool operator<(const VisualObject& other) const {
+      73         242 :     return id_ < other.id_;
+      74             :   }
+      75             : 
+      76             :   bool operator>(const VisualObject& other) const {
+      77             :     return id_ > other.id_;
+      78             :   }
+      79             : 
+      80             :   bool operator==(const VisualObject& other) const {
+      81             :     return id_ == other.id_;
+      82             :   }
+      83             : 
+      84             : private:
+      85             :   const unsigned long               id_;
+      86             :   MarkerType                        type_;
+      87             :   std::vector<geometry_msgs::Point> points_;
+      88             :   std::vector<std_msgs::ColorRGBA>  colors_;
+      89             :   ros::Time                         timeout_time_;
+      90             : 
+      91             :   void addRay(const mrs_lib::geometry::Ray& ray, const double r, const double g, const double b, const double a);
+      92             : 
+      93             :   void addTriangle(const mrs_lib::geometry::Triangle& triangle, const double r, const double g, const double b, const double a, const bool filled);
+      94             : 
+      95             :   void addEllipse(const mrs_lib::geometry::Ellipse& ellipse, const double r, const double g, const double b, const double a, const bool filled,
+      96             :                   const int num_points);
+      97             : 
+      98             : };  // namespace batch_visualizer
+      99             : 
+     100             : }  // namespace mrs_lib
+     101             : 
+     102             : #endif
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/include/mrs_lib/visual_object.h.gcov.overview.html b/mrs_lib/include/mrs_lib/visual_object.h.gcov.overview.html new file mode 100644 index 0000000000..d12f1bdebc --- /dev/null +++ b/mrs_lib/include/mrs_lib/visual_object.h.gcov.overview.html @@ -0,0 +1,46 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/include/mrs_lib/visual_object.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/include/mrs_lib/visual_object.h.gcov.png b/mrs_lib/include/mrs_lib/visual_object.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..2e10038ce016599658d08255c1ff1a58c48536b4 GIT binary patch literal 493 zcmV+saxyxDMeS`bZ>XVXLfMj6TyyoCqrtw2lm0u z+o(BT9)Ca$kB$N})=&j%ZYAN~M-2fl?xgk-O5E?%?$Wmj&*fS>a()0krI)3KDBPQ< zbwrxU^|#FxFTAkosWR(uv15M}_ueAI2C<4{orGw`5gG}@y*-=U|C$HgxkA&LlV~x;9avy^{ zD4UE5G>^=dcMGuSb&_NEgJF^XJ)xiRS!%!{##?Fl?i#WPsloKLN2!F_$XG*)sD*#d joDtA2469xit&98vAi`i14~K$;00000NkvXXu0mjfj#t*F literal 0 HcmV?d00001 diff --git a/mrs_lib/src/attitude_converter/attitude_converter.cpp.func-sort-c.html b/mrs_lib/src/attitude_converter/attitude_converter.cpp.func-sort-c.html new file mode 100644 index 0000000000..2f0b57c3d2 --- /dev/null +++ b/mrs_lib/src/attitude_converter/attitude_converter.cpp.func-sort-c.html @@ -0,0 +1,244 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/attitude_converter/attitude_converter.cpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/attitude_converter - attitude_converter.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:21222494.6 %
Date:2024-04-18 23:11:36Functions:394195.1 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::AttitudeConverter::setYaw(double const&)0
mrs_lib::Vector3Converter::operator tf2::Vector3() const0
mrs_lib::EulerAttitude::EulerAttitude(double const&, double const&, double const&)1
mrs_lib::Vector3Converter::Vector3Converter(double const&, double const&, double const&)1
mrs_lib::AttitudeConverter::getExtrinsicRPY()1
mrs_lib::AttitudeConverter::getIntrinsicRPY()1
mrs_lib::AttitudeConverter::getRoll()1
mrs_lib::AttitudeConverter::getPitch()1
mrs_lib::AttitudeConverter::AttitudeConverter(tf::Quaternion)1
mrs_lib::AttitudeConverter::AttitudeConverter(tf2::Matrix3x3)1
mrs_lib::AttitudeConverter::AttitudeConverter(mrs_lib::EulerAttitude const&)1
mrs_lib::EulerAttitude::yaw() const1
mrs_lib::EulerAttitude::roll() const1
mrs_lib::EulerAttitude::pitch() const1
mrs_lib::Vector3Converter::operator geometry_msgs::Vector3_<std::allocator<void> >() const1
mrs_lib::AttitudeConverter::operator tf::Quaternion() const1
mrs_lib::AttitudeConverter::operator mrs_lib::EulerAttitude() const1
mrs_lib::AttitudeConverter::getVectorX()3
mrs_lib::AttitudeConverter::getVectorY()3
mrs_lib::Vector3Converter::Vector3Converter(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&)22095
mrs_lib::AttitudeConverter::getYawRateIntrinsic(double const&)97732
mrs_lib::AttitudeConverter::operator std::tuple<double&, double&, double&>()130267
mrs_lib::AttitudeConverter::getYaw()169294
mrs_lib::AttitudeConverter::calculateRPY()169299
mrs_lib::Vector3Converter::Vector3Converter(geometry_msgs::Vector3_<std::allocator<void> > const&)263237
mrs_lib::AttitudeConverter::setHeading(double const&)279643
mrs_lib::AttitudeConverter::getVectorZ()281643
mrs_lib::AttitudeConverter::getHeadingRate(mrs_lib::Vector3Converter const&)285329
mrs_lib::AttitudeConverter::operator tf2::Transform() const363150
mrs_lib::AttitudeConverter::operator tf2::Matrix3x3() const372449
mrs_lib::AttitudeConverter::AttitudeConverter(Eigen::Quaternion<double, 0>)416375
mrs_lib::Vector3Converter::operator Eigen::Matrix<double, 3, 1, 0, 3, 1>() const566978
mrs_lib::AttitudeConverter::operator tf2::Quaternion() const849682
mrs_lib::AttitudeConverter::AttitudeConverter(tf2::Quaternion)912870
mrs_lib::AttitudeConverter::AttitudeConverter(Eigen::Matrix<double, 3, 3, 0, 3, 3>)1141515
mrs_lib::AttitudeConverter::operator Eigen::Matrix<double, 3, 3, 0, 3, 3>() const1433174
mrs_lib::AttitudeConverter::getHeading()1533021
mrs_lib::AttitudeConverter::AttitudeConverter(geometry_msgs::Quaternion_<std::allocator<void> >)3390913
mrs_lib::AttitudeConverter::AttitudeConverter(double const&, double const&, double const&, mrs_lib::RPY_convention_t const&)6587976
mrs_lib::AttitudeConverter::operator geometry_msgs::Quaternion_<std::allocator<void> >() const7729141
mrs_lib::AttitudeConverter::validateOrientation()12446807
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/attitude_converter/attitude_converter.cpp.func.html b/mrs_lib/src/attitude_converter/attitude_converter.cpp.func.html new file mode 100644 index 0000000000..2e58b8d900 --- /dev/null +++ b/mrs_lib/src/attitude_converter/attitude_converter.cpp.func.html @@ -0,0 +1,244 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/attitude_converter/attitude_converter.cpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/attitude_converter - attitude_converter.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:21222494.6 %
Date:2024-04-18 23:11:36Functions:394195.1 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::EulerAttitude::EulerAttitude(double const&, double const&, double const&)1
mrs_lib::Vector3Converter::Vector3Converter(geometry_msgs::Vector3_<std::allocator<void> > const&)263237
mrs_lib::Vector3Converter::Vector3Converter(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&)22095
mrs_lib::Vector3Converter::Vector3Converter(double const&, double const&, double const&)1
mrs_lib::AttitudeConverter::getHeading()1533021
mrs_lib::AttitudeConverter::getVectorX()3
mrs_lib::AttitudeConverter::getVectorY()3
mrs_lib::AttitudeConverter::getVectorZ()281643
mrs_lib::AttitudeConverter::setHeading(double const&)279643
mrs_lib::AttitudeConverter::calculateRPY()169299
mrs_lib::AttitudeConverter::getHeadingRate(mrs_lib::Vector3Converter const&)285329
mrs_lib::AttitudeConverter::getExtrinsicRPY()1
mrs_lib::AttitudeConverter::getIntrinsicRPY()1
mrs_lib::AttitudeConverter::getYawRateIntrinsic(double const&)97732
mrs_lib::AttitudeConverter::validateOrientation()12446807
mrs_lib::AttitudeConverter::getYaw()169294
mrs_lib::AttitudeConverter::setYaw(double const&)0
mrs_lib::AttitudeConverter::getRoll()1
mrs_lib::AttitudeConverter::getPitch()1
mrs_lib::AttitudeConverter::AttitudeConverter(geometry_msgs::Quaternion_<std::allocator<void> >)3390913
mrs_lib::AttitudeConverter::AttitudeConverter(tf::Quaternion)1
mrs_lib::AttitudeConverter::AttitudeConverter(tf2::Quaternion)912870
mrs_lib::AttitudeConverter::AttitudeConverter(tf2::Matrix3x3)1
mrs_lib::AttitudeConverter::AttitudeConverter(Eigen::Quaternion<double, 0>)416375
mrs_lib::AttitudeConverter::AttitudeConverter(Eigen::Matrix<double, 3, 3, 0, 3, 3>)1141515
mrs_lib::AttitudeConverter::AttitudeConverter(mrs_lib::EulerAttitude const&)1
mrs_lib::AttitudeConverter::AttitudeConverter(double const&, double const&, double const&, mrs_lib::RPY_convention_t const&)6587976
mrs_lib::AttitudeConverter::operator std::tuple<double&, double&, double&>()130267
mrs_lib::EulerAttitude::yaw() const1
mrs_lib::EulerAttitude::roll() const1
mrs_lib::EulerAttitude::pitch() const1
mrs_lib::Vector3Converter::operator geometry_msgs::Vector3_<std::allocator<void> >() const1
mrs_lib::Vector3Converter::operator tf2::Vector3() const0
mrs_lib::Vector3Converter::operator Eigen::Matrix<double, 3, 1, 0, 3, 1>() const566978
mrs_lib::AttitudeConverter::operator geometry_msgs::Quaternion_<std::allocator<void> >() const7729141
mrs_lib::AttitudeConverter::operator tf::Quaternion() const1
mrs_lib::AttitudeConverter::operator tf2::Quaternion() const849682
mrs_lib::AttitudeConverter::operator tf2::Matrix3x3() const372449
mrs_lib::AttitudeConverter::operator tf2::Transform() const363150
mrs_lib::AttitudeConverter::operator Eigen::Matrix<double, 3, 3, 0, 3, 3>() const1433174
mrs_lib::AttitudeConverter::operator mrs_lib::EulerAttitude() const1
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/attitude_converter/attitude_converter.cpp.gcov.frameset.html b/mrs_lib/src/attitude_converter/attitude_converter.cpp.gcov.frameset.html new file mode 100644 index 0000000000..4736f83ffd --- /dev/null +++ b/mrs_lib/src/attitude_converter/attitude_converter.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/attitude_converter/attitude_converter.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/src/attitude_converter/attitude_converter.cpp.gcov.html b/mrs_lib/src/attitude_converter/attitude_converter.cpp.gcov.html new file mode 100644 index 0000000000..b8a210bf99 --- /dev/null +++ b/mrs_lib/src/attitude_converter/attitude_converter.cpp.gcov.html @@ -0,0 +1,561 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/attitude_converter/attitude_converter.cpp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/attitude_converter - attitude_converter.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:21222494.6 %
Date:2024-04-18 23:11:36Functions:394195.1 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : // clang: TomasFormat
+       2             : 
+       3             : #include <mrs_lib/attitude_converter.h>
+       4             : #include <mrs_lib/utils.h>
+       5             : 
+       6             : using quat_t = Eigen::Quaterniond;
+       7             : 
+       8             : namespace mrs_lib
+       9             : {
+      10             : 
+      11             : /* class EulerAttitude //{ */
+      12             : 
+      13           1 : EulerAttitude::EulerAttitude(const double& roll, const double& pitch, const double& yaw) : roll_(roll), pitch_(pitch), yaw_(yaw) {
+      14           1 : }
+      15             : 
+      16           1 : double EulerAttitude::roll(void) const {
+      17           1 :   return roll_;
+      18             : }
+      19             : 
+      20           1 : double EulerAttitude::pitch(void) const {
+      21           1 :   return pitch_;
+      22             : }
+      23             : 
+      24           1 : double EulerAttitude::yaw(void) const {
+      25           1 :   return yaw_;
+      26             : }
+      27             : 
+      28             : //}
+      29             : 
+      30             : /* class Vector3Converter //{ */
+      31             : 
+      32       22095 : Vector3Converter::Vector3Converter(const Eigen::Vector3d& vector3) {
+      33             : 
+      34       22095 :   vector3_[0] = vector3[0];
+      35       22095 :   vector3_[1] = vector3[1];
+      36       22095 :   vector3_[2] = vector3[2];
+      37       22095 : }
+      38             : 
+      39      263237 : Vector3Converter::Vector3Converter(const geometry_msgs::Vector3& vector3) {
+      40             : 
+      41      263205 :   vector3_[0] = vector3.x;
+      42      263217 :   vector3_[1] = vector3.y;
+      43      263159 :   vector3_[2] = vector3.z;
+      44      263182 : }
+      45             : 
+      46           1 : Vector3Converter::Vector3Converter(const double& x, const double& y, const double& z) {
+      47             : 
+      48           1 :   vector3_[0] = x;
+      49           1 :   vector3_[1] = y;
+      50           1 :   vector3_[2] = z;
+      51           1 : }
+      52             : 
+      53           0 : Vector3Converter::operator tf2::Vector3() const {
+      54             : 
+      55           0 :   return vector3_;
+      56             : }
+      57             : 
+      58      566978 : Vector3Converter::operator Eigen::Vector3d() const {
+      59             : 
+      60      566978 :   return Eigen::Vector3d(vector3_[0], vector3_[1], vector3_[2]);
+      61             : }
+      62             : 
+      63           1 : Vector3Converter::operator geometry_msgs::Vector3() const {
+      64             : 
+      65           1 :   geometry_msgs::Vector3 vector_3;
+      66             : 
+      67           1 :   vector_3.x = vector3_[0];
+      68           1 :   vector_3.y = vector3_[1];
+      69           1 :   vector_3.z = vector3_[2];
+      70             : 
+      71           1 :   return vector_3;
+      72             : }
+      73             : 
+      74             : //}
+      75             : 
+      76             : /* constructors //{ */
+      77             : 
+      78     6587976 : AttitudeConverter::AttitudeConverter(const double& roll, const double& pitch, const double& yaw, const RPY_convention_t& format) {
+      79             : 
+      80     6586019 :   switch (format) {
+      81             : 
+      82     6585869 :     case RPY_EXTRINSIC: {
+      83     6585869 :       tf2_quaternion_.setRPY(roll, pitch, yaw);
+      84     6586589 :       break;
+      85             :     }
+      86             : 
+      87           5 :     case RPY_INTRINSIC: {
+      88             : 
+      89           5 :       Eigen::Matrix3d Y, P, R;
+      90             : 
+      91           5 :       Y << cos(yaw), -sin(yaw), 0, sin(yaw), cos(yaw), 0, 0, 0, 1;
+      92             : 
+      93           5 :       P << cos(pitch), 0, sin(pitch), 0, 1, 0, -sin(pitch), 0, cos(pitch);
+      94             : 
+      95           5 :       R << 1, 0, 0, 0, cos(roll), -sin(roll), 0, sin(roll), cos(roll);
+      96             : 
+      97           5 :       tf2_quaternion_ = AttitudeConverter(R * P * Y);
+      98             : 
+      99           5 :       break;
+     100             :     }
+     101             :   }
+     102             : 
+     103     6586749 :   validateOrientation();
+     104     6587086 : }
+     105             : 
+     106           1 : AttitudeConverter::AttitudeConverter(const tf::Quaternion quaternion) {
+     107             : 
+     108           1 :   tf2_quaternion_.setX(quaternion.x());
+     109           1 :   tf2_quaternion_.setY(quaternion.y());
+     110           1 :   tf2_quaternion_.setZ(quaternion.z());
+     111           1 :   tf2_quaternion_.setW(quaternion.w());
+     112             : 
+     113           1 :   validateOrientation();
+     114           1 : }
+     115             : 
+     116     3390913 : AttitudeConverter::AttitudeConverter(const geometry_msgs::Quaternion quaternion) {
+     117     3390335 :   tf2_quaternion_.setX(quaternion.x);
+     118     3389741 :   tf2_quaternion_.setY(quaternion.y);
+     119     3390400 :   tf2_quaternion_.setZ(quaternion.z);
+     120     3390809 :   tf2_quaternion_.setW(quaternion.w);
+     121             : 
+     122     3390956 :   validateOrientation();
+     123     3389929 : }
+     124             : 
+     125           1 : AttitudeConverter::AttitudeConverter(const mrs_lib::EulerAttitude& euler_attitude) {
+     126           1 :   tf2_quaternion_.setRPY(euler_attitude.roll(), euler_attitude.pitch(), euler_attitude.yaw());
+     127             : 
+     128           1 :   validateOrientation();
+     129           1 : }
+     130             : 
+     131      416375 : AttitudeConverter::AttitudeConverter(const Eigen::Quaterniond quaternion) {
+     132      416375 :   tf2_quaternion_.setX(quaternion.x());
+     133      416375 :   tf2_quaternion_.setY(quaternion.y());
+     134      416375 :   tf2_quaternion_.setZ(quaternion.z());
+     135      416374 :   tf2_quaternion_.setW(quaternion.w());
+     136             : 
+     137      416375 :   validateOrientation();
+     138      416374 : }
+     139             : 
+     140     1141515 : AttitudeConverter::AttitudeConverter(const Eigen::Matrix3d matrix) {
+     141     1138926 :   Eigen::Quaterniond quaternion = Eigen::Quaterniond(matrix);
+     142             : 
+     143     1140293 :   tf2_quaternion_.setX(quaternion.x());
+     144     1139143 :   tf2_quaternion_.setY(quaternion.y());
+     145     1140110 :   tf2_quaternion_.setZ(quaternion.z());
+     146     1140198 :   tf2_quaternion_.setW(quaternion.w());
+     147             : 
+     148     1140217 :   validateOrientation();
+     149     1137647 : }
+     150             : 
+     151      912870 : AttitudeConverter::AttitudeConverter(const tf2::Quaternion quaternion) {
+     152             : 
+     153      910496 :   tf2_quaternion_ = quaternion;
+     154             : 
+     155      910496 :   validateOrientation();
+     156      910930 : }
+     157             : 
+     158           1 : AttitudeConverter::AttitudeConverter(const tf2::Matrix3x3 matrix) {
+     159             : 
+     160           1 :   matrix.getRotation(tf2_quaternion_);
+     161             : 
+     162           1 :   validateOrientation();
+     163           1 : }
+     164             : 
+     165             : //}
+     166             : 
+     167             : /* operators //{ */
+     168             : 
+     169      849682 : AttitudeConverter::operator tf2::Quaternion() const {
+     170      849682 :   return tf2_quaternion_;
+     171             : }
+     172             : 
+     173           1 : AttitudeConverter::operator tf::Quaternion() const {
+     174             : 
+     175           1 :   tf::Quaternion tf_quaternion;
+     176             : 
+     177           1 :   tf_quaternion.setX(tf2_quaternion_.x());
+     178           1 :   tf_quaternion.setY(tf2_quaternion_.y());
+     179           1 :   tf_quaternion.setZ(tf2_quaternion_.z());
+     180           1 :   tf_quaternion.setW(tf2_quaternion_.w());
+     181             : 
+     182           1 :   return tf_quaternion;
+     183             : }
+     184             : 
+     185     7729141 : AttitudeConverter::operator geometry_msgs::Quaternion() const {
+     186             : 
+     187     7729141 :   geometry_msgs::Quaternion geom_quaternion;
+     188             : 
+     189     7726992 :   geom_quaternion.x = tf2_quaternion_.x();
+     190     7721360 :   geom_quaternion.y = tf2_quaternion_.y();
+     191     7721051 :   geom_quaternion.z = tf2_quaternion_.z();
+     192     7723134 :   geom_quaternion.w = tf2_quaternion_.w();
+     193             : 
+     194     7724126 :   return geom_quaternion;
+     195             : }
+     196             : 
+     197           1 : AttitudeConverter::operator EulerAttitude() const {
+     198             : 
+     199             :   double roll, pitch, yaw;
+     200           1 :   tf2::Matrix3x3(tf2_quaternion_).getRPY(roll, pitch, yaw);
+     201             : 
+     202           2 :   return EulerAttitude(roll, pitch, yaw);
+     203             : }
+     204             : 
+     205     1433174 : AttitudeConverter::operator Eigen::Matrix3d() const {
+     206             : 
+     207     1433174 :   Eigen::Quaterniond quaternion(tf2_quaternion_.w(), tf2_quaternion_.x(), tf2_quaternion_.y(), tf2_quaternion_.z());
+     208             : 
+     209     2865743 :   return quaternion.toRotationMatrix();
+     210             : }
+     211             : 
+     212      130267 : AttitudeConverter::operator std::tuple<double&, double&, double&>() {
+     213             : 
+     214      130267 :   tf2::Matrix3x3(tf2_quaternion_).getRPY(roll_, pitch_, yaw_);
+     215             : 
+     216      130267 :   return std::tuple<double&, double&, double&>{roll_, pitch_, yaw_};
+     217             : }
+     218             : 
+     219      372449 : AttitudeConverter::operator tf2::Matrix3x3() const {
+     220             : 
+     221      372449 :   return tf2::Matrix3x3(tf2_quaternion_);
+     222             : }
+     223             : 
+     224      363150 : AttitudeConverter::operator tf2::Transform() const {
+     225             : 
+     226      363150 :   return tf2::Transform(tf2_quaternion_);
+     227             : }
+     228             : 
+     229             : //}
+     230             : 
+     231             : /* getters //{ */
+     232             : 
+     233      169294 : double AttitudeConverter::getYaw(void) {
+     234             : 
+     235      169294 :   calculateRPY();
+     236             : 
+     237      169294 :   return yaw_;
+     238             : }
+     239             : 
+     240           1 : double AttitudeConverter::getRoll(void) {
+     241             : 
+     242           1 :   calculateRPY();
+     243             : 
+     244           1 :   return roll_;
+     245             : }
+     246             : 
+     247           1 : double AttitudeConverter::getPitch(void) {
+     248             : 
+     249           1 :   calculateRPY();
+     250             : 
+     251           1 :   return pitch_;
+     252             : }
+     253             : 
+     254     1533021 : double AttitudeConverter::getHeading(void) {
+     255             : 
+     256     1533021 :   tf2::Vector3 b1 = tf2::Vector3(1, 0, 0);
+     257             : 
+     258     1532582 :   tf2::Vector3 x_new = tf2::Transform(tf2_quaternion_) * b1;
+     259             : 
+     260     1532197 :   if (fabs(x_new[0]) <= 1e-3 && fabs(x_new[1]) <= 1e-3) {
+     261           2 :     throw GetHeadingException();
+     262             :   }
+     263             : 
+     264     3061590 :   return atan2(x_new[1], x_new[0]);
+     265             : }
+     266             : 
+     267       97732 : double AttitudeConverter::getYawRateIntrinsic(const double& heading_rate) {
+     268             : 
+     269             :   // when the heading rate is very small, it does not make sense to compute the
+     270             :   // yaw rate (the math would break), return 0
+     271       97732 :   if (fabs(heading_rate) < 1e-3) {
+     272       70242 :     return 0;
+     273             :   }
+     274             : 
+     275             :   // prep
+     276       27490 :   Eigen::Matrix3d R = *this;
+     277             : 
+     278             :   // construct the heading orbital velocity vector
+     279       27490 :   Eigen::Vector3d heading_vector   = Eigen::Vector3d(R(0, 0), R(1, 0), 0);
+     280       27490 :   Eigen::Vector3d orbital_velocity = Eigen::Vector3d(0, 0, heading_rate).cross(heading_vector);
+     281             : 
+     282             :   // projector to the heading orbital velocity vector subspace
+     283       27490 :   Eigen::Vector3d b_orb = Eigen::Vector3d(0, 0, 1).cross(heading_vector);
+     284       27490 :   b_orb.normalize();
+     285       27490 :   Eigen::Matrix3d P = b_orb * b_orb.transpose();
+     286             : 
+     287             :   // project the body yaw orbital velocity vector base onto the heading orbital velocity vector subspace
+     288       27490 :   Eigen::Vector3d projected = P * R.col(1);
+     289             : 
+     290             : 
+     291       27490 :   double orbital_velocity_norm = orbital_velocity.norm();
+     292       27490 :   double projected_norm        = projected.norm();
+     293             : 
+     294       27490 :   if (fabs(projected_norm) < 1e-5) {
+     295           0 :     ROS_ERROR("[AttitudeConverter]: getYawRateIntrinsic(): \"projected_norm\" in denominator is almost zero!!!");
+     296           0 :     throw MathErrorException();
+     297             :   }
+     298             : 
+     299       27490 :   double direction = mrs_lib::signum(orbital_velocity.dot(projected));
+     300             : 
+     301       27490 :   double output_yaw_rate = direction * (orbital_velocity_norm / projected_norm);
+     302             : 
+     303       27490 :   if (!std::isfinite(output_yaw_rate)) {
+     304           0 :     ROS_ERROR("[AttitudeConverter]: getYawRateIntrinsic(): NaN detected in variable \"output_yaw_rate\"!!!");
+     305           0 :     throw MathErrorException();
+     306             :   }
+     307             : 
+     308             :   // extract the yaw rate
+     309       27490 :   return output_yaw_rate;
+     310             : }
+     311             : 
+     312      285329 : double AttitudeConverter::getHeadingRate(const Vector3Converter& attitude_rate) {
+     313             : 
+     314             :   // prep
+     315      285329 :   Eigen::Matrix3d R = *this;
+     316      285311 :   Eigen::Vector3d w = attitude_rate;
+     317             : 
+     318             :   // create the angular velocity tensor
+     319      285244 :   Eigen::Matrix3d W;
+     320      285239 :   W << 0, -w[2], w[1], w[2], 0, -w[0], -w[1], w[0], 0;
+     321             : 
+     322             :   // R derivative
+     323      285217 :   Eigen::Matrix3d R_d = R * W;
+     324             : 
+     325             :   // atan2 derivative
+     326      285292 :   double rx = R(0, 0);  // x-component of body X
+     327      285158 :   double ry = R(1, 0);  // y-component of body Y
+     328             : 
+     329      285217 :   double denom = rx * rx + ry * ry;
+     330             : 
+     331      285217 :   if (fabs(denom) <= 1e-5) {
+     332           0 :     ROS_ERROR("[AttitudeConverter]: getHeadingRate(): denominator near zero!!!");
+     333           0 :     throw MathErrorException();
+     334             :   }
+     335             : 
+     336      285217 :   double atan2_d_x = -ry / denom;
+     337      285217 :   double atan2_d_y = rx / denom;
+     338             : 
+     339             :   // atan2 total differential
+     340      285217 :   double heading_rate = atan2_d_x * R_d(0, 0) + atan2_d_y * R_d(1, 0);
+     341             : 
+     342      285274 :   return heading_rate;
+     343             : }
+     344             : 
+     345           3 : Vector3Converter AttitudeConverter::getVectorX(void) {
+     346             : 
+     347           3 :   tf2::Vector3 b1 = tf2::Vector3(1, 0, 0);
+     348             : 
+     349           3 :   tf2::Vector3 new_b1 = tf2::Transform(tf2_quaternion_) * b1;
+     350             : 
+     351           6 :   return Vector3Converter(new_b1);
+     352             : }
+     353             : 
+     354           3 : Vector3Converter AttitudeConverter::getVectorY(void) {
+     355             : 
+     356           3 :   tf2::Vector3 b2 = tf2::Vector3(0, 1, 0);
+     357             : 
+     358           3 :   tf2::Vector3 new_b2 = tf2::Transform(tf2_quaternion_) * b2;
+     359             : 
+     360           6 :   return Vector3Converter(new_b2);
+     361             : }
+     362             : 
+     363      281643 : Vector3Converter AttitudeConverter::getVectorZ(void) {
+     364             : 
+     365      281643 :   tf2::Vector3 b3 = tf2::Vector3(0, 0, 1);
+     366             : 
+     367      281645 :   tf2::Vector3 new_b3 = tf2::Transform(tf2_quaternion_) * b3;
+     368             : 
+     369      563290 :   return Vector3Converter(new_b3);
+     370             : }
+     371             : 
+     372           1 : std::tuple<double, double, double> AttitudeConverter::getExtrinsicRPY(void) {
+     373             : 
+     374           1 :   Eigen::Matrix3d rot = AttitudeConverter(*this);
+     375             : 
+     376           1 :   Eigen::Vector3d eulers = rot.eulerAngles(2, 1, 0);
+     377             : 
+     378           2 :   return std::tuple(eulers[2], eulers[1], eulers[0]);
+     379             : }
+     380             : 
+     381           1 : std::tuple<double, double, double> AttitudeConverter::getIntrinsicRPY(void) {
+     382             : 
+     383           1 :   Eigen::Matrix3d rot = AttitudeConverter(*this);
+     384             : 
+     385           1 :   Eigen::Vector3d eulers = rot.eulerAngles(0, 1, 2);
+     386             : 
+     387           2 :   return std::tuple(eulers[0], eulers[1], eulers[2]);
+     388             : }
+     389             : 
+     390             : //}
+     391             : 
+     392             : /* setters //{ */
+     393             : 
+     394           0 : AttitudeConverter AttitudeConverter::setYaw(const double& new_yaw) {
+     395             : 
+     396           0 :   auto [roll, pitch, yaw] = *this;
+     397             : 
+     398           0 :   std::ignore = yaw;
+     399             : 
+     400           0 :   return AttitudeConverter(roll, pitch, new_yaw);
+     401             : }
+     402             : 
+     403      279643 : AttitudeConverter AttitudeConverter::setHeading(const double& heading) {
+     404             : 
+     405             :   // get the Z unit vector after the original rotation
+     406      279643 :   Eigen::Vector3d b3 = getVectorZ();
+     407             : 
+     408             :   // check for singularity: z component of the thrust vector is 0
+     409      279644 :   if (fabs(b3[2]) < 1e-3) {
+     410           4 :     throw SetHeadingException();
+     411             :   }
+     412             : 
+     413             :   // get the desired heading as a vector in 3D
+     414      279640 :   Eigen::Vector3d h(cos(heading), sin(heading), 0);
+     415             : 
+     416      279641 :   Eigen::Matrix3d new_R;
+     417             : 
+     418      279635 :   new_R.col(2) = b3;
+     419             : 
+     420             :   // construct the oblique projection
+     421      279632 :   Eigen::Matrix3d projector_body_z_compl = (Eigen::Matrix3d::Identity(3, 3) - b3 * b3.transpose());
+     422             : 
+     423             :   // create a basis of the body-z complement subspace
+     424      558002 :   Eigen::MatrixXd A = Eigen::MatrixXd(3, 2);
+     425      279463 :   A.col(0)          = projector_body_z_compl.col(0);
+     426      279361 :   A.col(1)          = projector_body_z_compl.col(1);
+     427             : 
+     428             :   // create the basis of the projection null-space complement
+     429      557783 :   Eigen::MatrixXd B = Eigen::MatrixXd(3, 2);
+     430      279419 :   B.col(0)          = Eigen::Vector3d(1, 0, 0);
+     431      279330 :   B.col(1)          = Eigen::Vector3d(0, 1, 0);
+     432             : 
+     433             :   // oblique projector to <range_basis>
+     434      557052 :   Eigen::MatrixXd Bt_A               = B.transpose() * A;
+     435      557605 :   Eigen::MatrixXd Bt_A_pseudoinverse = ((Bt_A.transpose() * Bt_A).inverse()) * Bt_A.transpose();
+     436      278836 :   Eigen::MatrixXd oblique_projector  = A * Bt_A_pseudoinverse * B.transpose();
+     437             : 
+     438      278742 :   new_R.col(0) = oblique_projector * h;
+     439      278483 :   new_R.col(0).normalize();
+     440             : 
+     441             :   // | ------------------------- body y ------------------------- |
+     442             : 
+     443      278607 :   new_R.col(1) = new_R.col(2).cross(new_R.col(0));
+     444      276927 :   new_R.col(1).normalize();
+     445             : 
+     446      556684 :   return AttitudeConverter(new_R);
+     447             : }
+     448             : 
+     449             : //}
+     450             : 
+     451             : // | ------------------------ internal ------------------------ |
+     452             : 
+     453             : /* calculateRPY() //{ */
+     454             : 
+     455      169299 : void AttitudeConverter::calculateRPY(void) {
+     456             : 
+     457      169299 :   if (!got_rpy_) {
+     458             : 
+     459      169299 :     tf2::Matrix3x3(tf2_quaternion_).getRPY(roll_, pitch_, yaw_);
+     460             :   }
+     461      169299 : }
+     462             : 
+     463             : //}
+     464             : 
+     465             : /* validateOrientation() //{ */
+     466             : 
+     467    12446807 : void AttitudeConverter::validateOrientation(void) {
+     468             : 
+     469    24886326 :   if (!std::isfinite(tf2_quaternion_.x()) || !std::isfinite(tf2_quaternion_.y()) || !std::isfinite(tf2_quaternion_.z()) ||
+     470    12435723 :       !std::isfinite(tf2_quaternion_.w())) {
+     471           2 :     throw InvalidAttitudeException();
+     472             :   }
+     473    12438408 : }
+     474             : 
+     475             : //}
+     476             : 
+     477             : }  // namespace mrs_lib
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/attitude_converter/attitude_converter.cpp.gcov.overview.html b/mrs_lib/src/attitude_converter/attitude_converter.cpp.gcov.overview.html new file mode 100644 index 0000000000..09e6f1e033 --- /dev/null +++ b/mrs_lib/src/attitude_converter/attitude_converter.cpp.gcov.overview.html @@ -0,0 +1,140 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/attitude_converter/attitude_converter.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/src/attitude_converter/attitude_converter.cpp.gcov.png b/mrs_lib/src/attitude_converter/attitude_converter.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..2614538441222d07b06c41c37d10540a6b353539 GIT binary patch literal 1533 zcmV*mt7a)o-F8MFKD~?ZALlQz3x2$Yk`KktA<_v|4 ztgc!^+Y@>WnfeskB{qlEV1Z$Y?GePEHYOBik13<(_^oC zHuJ1BzfJ`_#9fQ(ao5W52Gw&e;Cbp1CVqatO-LP3&-sA!)$<3(%lvwOzTVGxEYHrd zJRPDIU`nD0I2I`cxJcG7+FVBqjfpt^rUyJ^`M@1ISxBgc3lJ6oX&8m!t{oqz0#bOa zN$UZ>Wp$mluuAYeDf&3ix%IkO)4}kwMfH7c^5EaNYhV&>ywEc|4fT$R|0DH}BdPspD zQzd;)ZsvUhc*xii=O*xWfFr_G0neQo_yLg`XXaACUa9Y_aC?oJnHD|0{tu)MA>ilN z4UD~jRfX$ZFXPdyr!smXF!l@0x0^yciF9FF<*Tn(kFNJfDn`V5cJg?kdXCzXPI~R3 zN9?HJLZ*2*u>9&)>fq{(=W%bT3EFBIkczQox|ae{glVZp1D-Y4?o%+z!I|+GF+eg# zxKiH@kRr^T{2F<6*DuUsUY(nF_chXm%swk&jaIJPTq!-7kX=ku^ueg9e?yw%{4*==ctgfluT7N<6Du{}`on;heD!n>rJxFR<;HI7PvpR5_KihlE+)^JjATu}l z>K<4brXG;YlzJLBJB6Q_ZSy#P3boWdaG_)uC3l!Gy*&Clj&1d2R+UB4&cX%Ezm<0w z_ssx-GfHSKbRNB7n09E_7LD=sJl3N$GmiN- zfpqUk63r-@#$hi2s`~+On8z(8T=3WB`TUE=JMU;yH#H#mTe1CYd3JWD4d^jjk77d_ z+X9FTbuiFDgQ>>pEr=c+_#Z!XtsS?VoQDH%W?KZk^}q)HEmE4cN=0^%K~;Tuf2Jp1~4zsrZzXvf|DG_DpP1>*}yYZ=aR z*aHvHr2!lia*4f#raa4-smi+gVp6VC0~}$grjg`i*yh6AoSR~U70qG}6tFEs4p2oeguvZ5pViah`F@!OzUYEjKR+Nrnx&16D$K6apgGa_? ztLFvMuq2H(eRa zm>74!c;X3TG?m}kFd#}uMlp7F&-E|t-_yD8e0oOSUTg!{k$mJBC2}u6`dv1&tcklo j`hS{h&bSK^Rowporw3}RyWQBl00000NkvXXu0mjfO#jd7 literal 0 HcmV?d00001 diff --git a/mrs_lib/src/attitude_converter/index-detail-sort-f.html b/mrs_lib/src/attitude_converter/index-detail-sort-f.html new file mode 100644 index 0000000000..def974581d --- /dev/null +++ b/mrs_lib/src/attitude_converter/index-detail-sort-f.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/attitude_converter + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/attitude_converterHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:21222494.6 %
Date:2024-04-18 23:11:36Functions:394195.1 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
attitude_converter.cpp +
94.6%94.6%
+
94.6 %212 / 22495.1 %39 / 41
<unnamed>94.6 %212 / 22495.1 %39 / 41
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/attitude_converter/index-detail-sort-l.html b/mrs_lib/src/attitude_converter/index-detail-sort-l.html new file mode 100644 index 0000000000..46f90ee551 --- /dev/null +++ b/mrs_lib/src/attitude_converter/index-detail-sort-l.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/attitude_converter + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/attitude_converterHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:21222494.6 %
Date:2024-04-18 23:11:36Functions:394195.1 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
attitude_converter.cpp +
94.6%94.6%
+
94.6 %212 / 22495.1 %39 / 41
<unnamed>94.6 %212 / 22495.1 %39 / 41
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/attitude_converter/index-detail.html b/mrs_lib/src/attitude_converter/index-detail.html new file mode 100644 index 0000000000..05e0d49ae1 --- /dev/null +++ b/mrs_lib/src/attitude_converter/index-detail.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/attitude_converter + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/attitude_converterHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:21222494.6 %
Date:2024-04-18 23:11:36Functions:394195.1 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
attitude_converter.cpp +
94.6%94.6%
+
94.6 %212 / 22495.1 %39 / 41
<unnamed>94.6 %212 / 22495.1 %39 / 41
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/attitude_converter/index-sort-f.html b/mrs_lib/src/attitude_converter/index-sort-f.html new file mode 100644 index 0000000000..2cc249de0c --- /dev/null +++ b/mrs_lib/src/attitude_converter/index-sort-f.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/attitude_converter + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/attitude_converterHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:21222494.6 %
Date:2024-04-18 23:11:36Functions:394195.1 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
attitude_converter.cpp +
94.6%94.6%
+
94.6 %212 / 22495.1 %39 / 41
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/attitude_converter/index-sort-l.html b/mrs_lib/src/attitude_converter/index-sort-l.html new file mode 100644 index 0000000000..ca30480d8a --- /dev/null +++ b/mrs_lib/src/attitude_converter/index-sort-l.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/attitude_converter + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/attitude_converterHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:21222494.6 %
Date:2024-04-18 23:11:36Functions:394195.1 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
attitude_converter.cpp +
94.6%94.6%
+
94.6 %212 / 22495.1 %39 / 41
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/attitude_converter/index.html b/mrs_lib/src/attitude_converter/index.html new file mode 100644 index 0000000000..5d169985da --- /dev/null +++ b/mrs_lib/src/attitude_converter/index.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/attitude_converter + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/attitude_converterHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:21222494.6 %
Date:2024-04-18 23:11:36Functions:394195.1 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
attitude_converter.cpp +
94.6%94.6%
+
94.6 %212 / 22495.1 %39 / 41
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/batch_visualizer/batch_visualizer.cpp.func-sort-c.html b/mrs_lib/src/batch_visualizer/batch_visualizer.cpp.func-sort-c.html new file mode 100644 index 0000000000..23b09999a2 --- /dev/null +++ b/mrs_lib/src/batch_visualizer/batch_visualizer.cpp.func-sort-c.html @@ -0,0 +1,172 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/batch_visualizer/batch_visualizer.cpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/batch_visualizer - batch_visualizer.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:16221774.7 %
Date:2024-04-18 23:11:36Functions:132356.5 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::BatchVisualizer::addEllipse(mrs_lib::geometry::Ellipse const&, double, double, double, double, bool, int, ros::Duration const&)0
mrs_lib::BatchVisualizer::addCylinder(mrs_lib::geometry::Cylinder const&, double, double, double, double, bool, bool, int, ros::Duration const&)0
mrs_lib::BatchVisualizer::addTriangle(mrs_lib::geometry::Triangle const&, double, double, double, double, bool, ros::Duration const&)0
mrs_lib::BatchVisualizer::addRectangle(mrs_lib::geometry::Rectangle const&, double, double, double, double, bool, ros::Duration const&)0
mrs_lib::BatchVisualizer::addTrajectory(mrs_msgs::TrajectoryReference_<std::allocator<void> > const&, double, double, double, double, bool, ros::Duration const&)0
mrs_lib::BatchVisualizer::setLinesScale(double)0
mrs_lib::BatchVisualizer::addRay(mrs_lib::geometry::Ray const&, double, double, double, double, ros::Duration const&)0
mrs_lib::BatchVisualizer::addCone(mrs_lib::geometry::Cone const&, double, double, double, double, bool, bool, int, ros::Duration const&)0
mrs_lib::BatchVisualizer::addPath(mrs_msgs::Path_<std::allocator<void> > const&, double, double, double, double, bool, ros::Duration const&)0
mrs_lib::BatchVisualizer::addCuboid(mrs_lib::geometry::Cuboid const&, double, double, double, double, bool, ros::Duration const&)0
mrs_lib::BatchVisualizer::setParentFrame(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)22
mrs_lib::BatchVisualizer::setPointsScale(double)22
mrs_lib::BatchVisualizer::addPoint(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, double, double, double, double, ros::Duration const&)79
mrs_lib::BatchVisualizer::initialize()182
mrs_lib::BatchVisualizer::BatchVisualizer(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)182
mrs_lib::BatchVisualizer::BatchVisualizer()182
mrs_lib::BatchVisualizer::clearBuffers()204
mrs_lib::BatchVisualizer::clearVisuals()204
mrs_lib::BatchVisualizer::~BatchVisualizer()364
mrs_lib::BatchVisualizer::addNullPoint()386
mrs_lib::BatchVisualizer::addNullLine()398
mrs_lib::BatchVisualizer::addNullTriangle()398
mrs_lib::BatchVisualizer::publish()398
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/batch_visualizer/batch_visualizer.cpp.func.html b/mrs_lib/src/batch_visualizer/batch_visualizer.cpp.func.html new file mode 100644 index 0000000000..dd8efb5098 --- /dev/null +++ b/mrs_lib/src/batch_visualizer/batch_visualizer.cpp.func.html @@ -0,0 +1,172 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/batch_visualizer/batch_visualizer.cpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/batch_visualizer - batch_visualizer.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:16221774.7 %
Date:2024-04-18 23:11:36Functions:132356.5 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::BatchVisualizer::addEllipse(mrs_lib::geometry::Ellipse const&, double, double, double, double, bool, int, ros::Duration const&)0
mrs_lib::BatchVisualizer::initialize()182
mrs_lib::BatchVisualizer::addCylinder(mrs_lib::geometry::Cylinder const&, double, double, double, double, bool, bool, int, ros::Duration const&)0
mrs_lib::BatchVisualizer::addNullLine()398
mrs_lib::BatchVisualizer::addTriangle(mrs_lib::geometry::Triangle const&, double, double, double, double, bool, ros::Duration const&)0
mrs_lib::BatchVisualizer::addNullPoint()386
mrs_lib::BatchVisualizer::addRectangle(mrs_lib::geometry::Rectangle const&, double, double, double, double, bool, ros::Duration const&)0
mrs_lib::BatchVisualizer::clearBuffers()204
mrs_lib::BatchVisualizer::clearVisuals()204
mrs_lib::BatchVisualizer::addTrajectory(mrs_msgs::TrajectoryReference_<std::allocator<void> > const&, double, double, double, double, bool, ros::Duration const&)0
mrs_lib::BatchVisualizer::setLinesScale(double)0
mrs_lib::BatchVisualizer::setParentFrame(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)22
mrs_lib::BatchVisualizer::setPointsScale(double)22
mrs_lib::BatchVisualizer::addNullTriangle()398
mrs_lib::BatchVisualizer::addRay(mrs_lib::geometry::Ray const&, double, double, double, double, ros::Duration const&)0
mrs_lib::BatchVisualizer::addCone(mrs_lib::geometry::Cone const&, double, double, double, double, bool, bool, int, ros::Duration const&)0
mrs_lib::BatchVisualizer::addPath(mrs_msgs::Path_<std::allocator<void> > const&, double, double, double, double, bool, ros::Duration const&)0
mrs_lib::BatchVisualizer::publish()398
mrs_lib::BatchVisualizer::addPoint(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, double, double, double, double, ros::Duration const&)79
mrs_lib::BatchVisualizer::addCuboid(mrs_lib::geometry::Cuboid const&, double, double, double, double, bool, ros::Duration const&)0
mrs_lib::BatchVisualizer::BatchVisualizer(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)182
mrs_lib::BatchVisualizer::BatchVisualizer()182
mrs_lib::BatchVisualizer::~BatchVisualizer()364
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/batch_visualizer/batch_visualizer.cpp.gcov.frameset.html b/mrs_lib/src/batch_visualizer/batch_visualizer.cpp.gcov.frameset.html new file mode 100644 index 0000000000..5a116ddf18 --- /dev/null +++ b/mrs_lib/src/batch_visualizer/batch_visualizer.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/batch_visualizer/batch_visualizer.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/src/batch_visualizer/batch_visualizer.cpp.gcov.html b/mrs_lib/src/batch_visualizer/batch_visualizer.cpp.gcov.html new file mode 100644 index 0000000000..ab9e434a32 --- /dev/null +++ b/mrs_lib/src/batch_visualizer/batch_visualizer.cpp.gcov.html @@ -0,0 +1,440 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/batch_visualizer/batch_visualizer.cpp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/batch_visualizer - batch_visualizer.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:16221774.7 %
Date:2024-04-18 23:11:36Functions:132356.5 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : #include <string>
+       2             : #include <mrs_lib/batch_visualizer.h>
+       3             : #include <mrs_lib/geometry/shapes.h>
+       4             : 
+       5             : namespace mrs_lib
+       6             : {
+       7             : 
+       8             : /* constructors */  //{
+       9         182 : BatchVisualizer::BatchVisualizer() {
+      10         182 : }
+      11             : 
+      12         364 : BatchVisualizer::~BatchVisualizer() {
+      13         364 : }
+      14             : 
+      15         182 : BatchVisualizer::BatchVisualizer(ros::NodeHandle &nh, const std::string marker_topic_name, const std::string parent_frame) {
+      16         182 :   this->parent_frame      = parent_frame;
+      17         182 :   this->marker_topic_name = marker_topic_name;
+      18         182 :   initialize();
+      19             : 
+      20         182 :   this->visual_pub = nh.advertise<visualization_msgs::MarkerArray>(marker_topic_name.c_str(), 1);
+      21         182 :   publish();
+      22         182 : }
+      23             : //}
+      24             : 
+      25             : /* setParentFrame //{ */
+      26             : 
+      27          22 : void BatchVisualizer::setParentFrame(const std::string parent_frame) {
+      28          22 :   this->parent_frame               = parent_frame;
+      29          22 :   points_marker.header.frame_id    = parent_frame;
+      30          22 :   triangles_marker.header.frame_id = parent_frame;
+      31          22 :   lines_marker.header.frame_id     = parent_frame;
+      32          22 : }
+      33             : 
+      34             : //}
+      35             : 
+      36             : /* initialize //{ */
+      37         182 : void BatchVisualizer::initialize() {
+      38         182 :   if (initialized) {
+      39           0 :     return;
+      40             :   }
+      41             : 
+      42             :   // setup points marker
+      43         182 :   std::stringstream ss;
+      44         182 :   ss << marker_topic_name << "_points";
+      45         182 :   points_marker.header.frame_id    = parent_frame;
+      46         182 :   points_marker.header.stamp       = ros::Time::now();
+      47         182 :   points_marker.ns                 = ss.str().c_str();
+      48         182 :   points_marker.action             = visualization_msgs::Marker::ADD;
+      49         182 :   points_marker.pose.orientation.w = 1.0;
+      50         182 :   points_marker.id                 = 8;
+      51         182 :   points_marker.type               = visualization_msgs::Marker::POINTS;
+      52             : 
+      53         182 :   points_marker.scale.x = points_scale;
+      54         182 :   points_marker.scale.y = points_scale;
+      55         182 :   points_marker.color.a = 1.0;
+      56             : 
+      57             :   // setup lines marker
+      58         182 :   ss.str(std::string());
+      59         182 :   ss << marker_topic_name << "_lines";
+      60         182 :   lines_marker.header.frame_id    = parent_frame;
+      61         182 :   lines_marker.header.stamp       = ros::Time::now();
+      62         182 :   lines_marker.ns                 = ss.str().c_str();
+      63         182 :   lines_marker.action             = visualization_msgs::Marker::ADD;
+      64         182 :   lines_marker.pose.orientation.w = 1.0;
+      65         182 :   lines_marker.id                 = 5;
+      66         182 :   lines_marker.type               = visualization_msgs::Marker::LINE_LIST;
+      67             : 
+      68         182 :   lines_marker.scale.x = lines_scale;
+      69         182 :   lines_marker.color.a = 1.0;
+      70             : 
+      71             :   // setup triangles marker
+      72         182 :   ss.str(std::string());
+      73         182 :   ss << marker_topic_name << "_triangles";
+      74         182 :   triangles_marker.header.frame_id    = parent_frame;
+      75         182 :   triangles_marker.header.stamp       = ros::Time::now();
+      76         182 :   triangles_marker.ns                 = ss.str().c_str();
+      77         182 :   triangles_marker.action             = visualization_msgs::Marker::ADD;
+      78         182 :   triangles_marker.pose.orientation.w = 1.0;
+      79         182 :   triangles_marker.id                 = 11;
+      80         182 :   triangles_marker.type               = visualization_msgs::Marker::TRIANGLE_LIST;
+      81             : 
+      82         182 :   triangles_marker.scale.x = 1;
+      83         182 :   triangles_marker.scale.y = 1;
+      84         182 :   triangles_marker.scale.z = 1;
+      85         182 :   triangles_marker.color.a = 1.0;
+      86             : 
+      87         182 :   ROS_INFO("[%s]: Batch visualizer loaded with default values", ros::this_node::getName().c_str());
+      88         182 :   initialized = true;
+      89             : }
+      90             : //}
+      91             : 
+      92             : /* addPoint //{ */
+      93          79 : void BatchVisualizer::addPoint(const Eigen::Vector3d &p, const double r, const double g, const double b, const double a, const ros::Duration &timeout) {
+      94             : 
+      95         158 :   VisualObject obj = VisualObject(p, r, g, b, a, timeout, uuid++);
+      96          79 :   visual_objects.insert(obj);
+      97          79 : }
+      98             : //}
+      99             : 
+     100             : /* addRay */  //{
+     101           0 : void BatchVisualizer::addRay(const mrs_lib::geometry::Ray &ray, const double r, const double g, const double b, const double a, const ros::Duration &timeout) {
+     102             : 
+     103           0 :   VisualObject obj = VisualObject(ray, r, g, b, a, timeout, uuid++);
+     104           0 :   visual_objects.insert(obj);
+     105           0 : }
+     106             : //}
+     107             : 
+     108             : /* addTriangle //{ */
+     109           0 : void BatchVisualizer::addTriangle(const mrs_lib::geometry::Triangle &tri, const double r, const double g, const double b, const double a, const bool filled,
+     110             :                                   const ros::Duration &timeout) {
+     111             : 
+     112           0 :   VisualObject obj = VisualObject(tri, r, g, b, a, timeout, filled, uuid++);
+     113           0 :   visual_objects.insert(obj);
+     114           0 : }
+     115             : //}
+     116             : 
+     117             : /* addRectangle //{ */
+     118           0 : void BatchVisualizer::addRectangle(const mrs_lib::geometry::Rectangle &rect, const double r, const double g, const double b, const double a, const bool filled,
+     119             :                                    const ros::Duration &timeout) {
+     120             : 
+     121           0 :   VisualObject obj = VisualObject(rect, r, g, b, a, timeout, filled, uuid++);
+     122           0 :   visual_objects.insert(obj);
+     123           0 : }
+     124             : //}
+     125             : 
+     126             : /* addCuboid //{ */
+     127           0 : void BatchVisualizer::addCuboid(const mrs_lib::geometry::Cuboid &cuboid, const double r, const double g, const double b, const double a, const bool filled,
+     128             :                                 const ros::Duration &timeout) {
+     129             : 
+     130           0 :   VisualObject obj = VisualObject(cuboid, r, g, b, a, timeout, filled, uuid++);
+     131           0 :   visual_objects.insert(obj);
+     132           0 : }
+     133             : //}
+     134             : 
+     135             : /* addEllipse //{ */
+     136           0 : void BatchVisualizer::addEllipse(const mrs_lib::geometry::Ellipse &ellipse, const double r, const double g, const double b, const double a, const bool filled,
+     137             :                                  const int num_points, const ros::Duration &timeout) {
+     138             : 
+     139           0 :   VisualObject obj = VisualObject(ellipse, r, g, b, a, timeout, filled, uuid++, num_points);
+     140           0 :   visual_objects.insert(obj);
+     141           0 : }
+     142             : //}
+     143             : 
+     144             : /* addCylinder //{ */
+     145           0 : void BatchVisualizer::addCylinder(const mrs_lib::geometry::Cylinder &cylinder, const double r, const double g, const double b, const double a,
+     146             :                                   const bool filled, const bool capped, const int sides, const ros::Duration &timeout) {
+     147           0 :   VisualObject obj = VisualObject(cylinder, r, g, b, a, timeout, filled, capped, uuid++, sides);
+     148           0 :   visual_objects.insert(obj);
+     149           0 : }
+     150             : //}
+     151             : 
+     152             : /* addCone //{ */
+     153           0 : void BatchVisualizer::addCone(const mrs_lib::geometry::Cone &cone, const double r, const double g, const double b, const double a, const bool filled,
+     154             :                               const bool capped, const int sides, const ros::Duration &timeout) {
+     155           0 :   VisualObject obj = VisualObject(cone, r, g, b, a, timeout, filled, capped, uuid++, sides);
+     156           0 :   visual_objects.insert(obj);
+     157           0 : }
+     158             : //}
+     159             : 
+     160             : /* addPath //{ */
+     161           0 : void BatchVisualizer::addPath(const mrs_msgs::Path &p, const double r, const double g, const double b, const double a, const bool filled,
+     162             :                               const ros::Duration &timeout) {
+     163           0 :   VisualObject obj = VisualObject(p, r, g, b, a, timeout, filled, uuid++);
+     164           0 :   visual_objects.insert(obj);
+     165           0 : }
+     166             : //}
+     167             : 
+     168             : /* addTrajectory //{ */
+     169           0 : void BatchVisualizer::addTrajectory(const mrs_msgs::TrajectoryReference &traj, const double r, const double g, const double b, const double a,
+     170             :                                     const bool filled, const ros::Duration &timeout) {
+     171           0 :   VisualObject obj = VisualObject(traj, r, g, b, a, timeout, filled, uuid++);
+     172           0 :   visual_objects.insert(obj);
+     173           0 : }
+     174             : //}
+     175             : 
+     176             : /* addNullPoint //{ */
+     177         386 : void BatchVisualizer::addNullPoint() {
+     178         386 :   geometry_msgs::Point p;
+     179         386 :   p.x = 10000.0;
+     180         386 :   p.y = 0.0;
+     181         386 :   p.z = 0.0;
+     182             : 
+     183         386 :   std_msgs::ColorRGBA c;
+     184         386 :   c.r = 1.0;
+     185         386 :   c.g = 1.0;
+     186         386 :   c.b = 1.0;
+     187         386 :   c.a = 1.0;
+     188             : 
+     189         386 :   points_marker.points.push_back(p);
+     190         386 :   points_marker.colors.push_back(c);
+     191         386 : }
+     192             : //}
+     193             : 
+     194             : /* addNullLine //{ */
+     195         398 : void BatchVisualizer::addNullLine() {
+     196         398 :   geometry_msgs::Point p1, p2;
+     197         398 :   p1.x = 10000.0;
+     198         398 :   p1.y = 0.0;
+     199         398 :   p1.z = 0.0;
+     200             : 
+     201         398 :   p2.x = 10001.0;
+     202         398 :   p2.y = 0.0;
+     203         398 :   p2.z = 0.0;
+     204             : 
+     205         398 :   std_msgs::ColorRGBA c;
+     206         398 :   c.r = 1.0;
+     207         398 :   c.g = 1.0;
+     208         398 :   c.b = 1.0;
+     209             : 
+     210         398 :   lines_marker.colors.push_back(c);
+     211         398 :   lines_marker.colors.push_back(c);
+     212             : 
+     213         398 :   lines_marker.points.push_back(p1);
+     214         398 :   lines_marker.points.push_back(p2);
+     215         398 : }
+     216             : //}
+     217             : 
+     218             : /* addNullTriangle //{ */
+     219         398 : void BatchVisualizer::addNullTriangle() {
+     220         398 :   geometry_msgs::Point p1, p2, p3;
+     221         398 :   p1.x = 10000.0;
+     222         398 :   p1.y = 0.0;
+     223         398 :   p1.z = 0.0;
+     224             : 
+     225         398 :   p2.x = 10001.0;
+     226         398 :   p2.y = 0.0;
+     227         398 :   p2.z = 0.0;
+     228             : 
+     229         398 :   std_msgs::ColorRGBA c;
+     230         398 :   c.r = 1.0;
+     231         398 :   c.g = 1.0;
+     232         398 :   c.b = 1.0;
+     233             : 
+     234         398 :   p3.x = 10001.0;
+     235         398 :   p3.y = 0.01;
+     236         398 :   p3.z = 0.0;
+     237         398 :   triangles_marker.colors.push_back(c);
+     238         398 :   triangles_marker.colors.push_back(c);
+     239         398 :   triangles_marker.colors.push_back(c);
+     240             : 
+     241         398 :   triangles_marker.points.push_back(p1);
+     242         398 :   triangles_marker.points.push_back(p2);
+     243         398 :   triangles_marker.points.push_back(p3);
+     244         398 : }
+     245             : //}
+     246             : 
+     247             : /* setPointsScale //{ */
+     248          22 : void BatchVisualizer::setPointsScale(const double scale) {
+     249          22 :   points_scale = scale;
+     250          22 : }
+     251             : //}
+     252             : 
+     253             : /* setLinesScale //{ */
+     254           0 : void BatchVisualizer::setLinesScale(const double scale) {
+     255           0 :   lines_scale = scale;
+     256           0 : }
+     257             : //}
+     258             : 
+     259             : /* clearBuffers //{ */
+     260         204 : void BatchVisualizer::clearBuffers() {
+     261         204 :   visual_objects.clear();
+     262         204 : }
+     263             : //}
+     264             : 
+     265             : /* clearVisuals //{ */
+     266         204 : void BatchVisualizer::clearVisuals() {
+     267         408 :   std::set<VisualObject> visual_objects_tmp;
+     268         204 :   visual_objects_tmp.insert(visual_objects.begin(), visual_objects.end());
+     269             : 
+     270         204 :   visual_objects.clear();
+     271         204 :   publish();
+     272             : 
+     273         204 :   visual_objects.insert(visual_objects_tmp.begin(), visual_objects_tmp.end());
+     274         204 : }
+     275             : //}
+     276             : 
+     277             : /* publish //{ */
+     278         398 : void BatchVisualizer::publish() {
+     279             : 
+     280         398 :   msg.markers.clear();
+     281         398 :   points_marker.points.clear();
+     282         398 :   points_marker.colors.clear();
+     283             : 
+     284         398 :   lines_marker.points.clear();
+     285         398 :   lines_marker.colors.clear();
+     286             : 
+     287         398 :   triangles_marker.points.clear();
+     288         398 :   triangles_marker.colors.clear();
+     289             : 
+     290             :   // fill marker messages and remove objects that have timed out
+     291         454 :   for (auto it = visual_objects.begin(); it != visual_objects.end();) {
+     292          56 :     if (it->isTimedOut()) {
+     293           0 :       it = visual_objects.erase(it);
+     294             :     } else {
+     295         112 :       auto points = it->getPoints();
+     296         112 :       auto colors = it->getColors();
+     297          56 :       switch (it->getType()) {
+     298          56 :         case MarkerType::POINT: {
+     299          56 :           points_marker.points.insert(points_marker.points.end(), points.begin(), points.end());
+     300          56 :           points_marker.colors.insert(points_marker.colors.end(), colors.begin(), colors.end());
+     301          56 :           break;
+     302             :         }
+     303           0 :         case MarkerType::LINE: {
+     304           0 :           lines_marker.points.insert(lines_marker.points.end(), points.begin(), points.end());
+     305           0 :           lines_marker.colors.insert(lines_marker.colors.end(), colors.begin(), colors.end());
+     306           0 :           break;
+     307             :         }
+     308           0 :         case MarkerType::TRIANGLE: {
+     309           0 :           triangles_marker.points.insert(triangles_marker.points.end(), points.begin(), points.end());
+     310           0 :           triangles_marker.colors.insert(triangles_marker.colors.end(), colors.begin(), colors.end());
+     311           0 :           break;
+     312             :         }
+     313             :       }
+     314          56 :       it++;
+     315             :     }
+     316             :   }
+     317             : 
+     318         398 :   auto now = ros::Time::now();
+     319             : 
+     320         398 :   if (!points_marker.points.empty()) {
+     321          12 :     points_marker.scale.x = points_scale;
+     322          12 :     points_marker.scale.y = points_scale;
+     323             :   } else {
+     324         386 :     addNullPoint();
+     325             :   }
+     326         398 :   points_marker.header.stamp = now;
+     327         398 :   msg.markers.push_back(points_marker);
+     328             : 
+     329         398 :   if (!lines_marker.points.empty()) {
+     330           0 :     lines_marker.scale.x = lines_scale;
+     331             :   } else {
+     332         398 :     addNullLine();
+     333             :   }
+     334         398 :   lines_marker.header.stamp = now;
+     335         398 :   msg.markers.push_back(lines_marker);
+     336             : 
+     337         398 :   if (!triangles_marker.points.empty()) {
+     338           0 :     triangles_marker.header.stamp = now;
+     339             :   } else {
+     340         398 :     addNullTriangle();
+     341             :   }
+     342         398 :   triangles_marker.header.stamp = now;
+     343         398 :   msg.markers.push_back(triangles_marker);
+     344             : 
+     345         398 :   if (msg.markers.empty()) {
+     346           0 :     addNullPoint();
+     347           0 :     points_marker.scale.x = 0.1;
+     348           0 :     points_marker.scale.y = 0.1;
+     349           0 :     msg.markers.push_back(points_marker);
+     350             :   }
+     351             : 
+     352         398 :   visual_pub.publish(msg);
+     353         398 : }
+     354             : //}
+     355             : 
+     356             : }  // namespace mrs_lib
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/batch_visualizer/batch_visualizer.cpp.gcov.overview.html b/mrs_lib/src/batch_visualizer/batch_visualizer.cpp.gcov.overview.html new file mode 100644 index 0000000000..4222da3c96 --- /dev/null +++ b/mrs_lib/src/batch_visualizer/batch_visualizer.cpp.gcov.overview.html @@ -0,0 +1,109 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/batch_visualizer/batch_visualizer.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/src/batch_visualizer/batch_visualizer.cpp.gcov.png b/mrs_lib/src/batch_visualizer/batch_visualizer.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..589d1dd69d27c156fbd83eb79cd9d9dd81c37ada GIT binary patch literal 1265 zcmV+#se&lDtK+-3^Gtsn^m|xG#8Agq4!f7`=a8$U5a@V)VUr;zei_G4=J>X%pO!)krPgM-N+0BR@@@4mq2rL%fA4?xSImT1L+D|xY)=HV;wS0c)dkn zTg0TyykwEQrv&1`Vq86>e%?_Jct#rl5dE~#43R}E3L4ngPuoUBKd@<_gNgu9w=pkM z>M^oFRdGEKRphucG3%E0gLI#sktz=~z0uEr_zBWQc@HOVZ8K6Cx6*T9w!=KiGzBn` zuZ5GgTHp|mHqt)`CL12TuQi!1j}d4$N)5M>B;1pJC&K9v01#g7vBK3Y;d=zy&3*>q z%2Vzuwanj%a9ZF1;i~y!sBH*G1pXf3AmcY8oNo)bEw{YM)x;Zj zrx3uR*=6u2{6GfitF2XAYAe?`zKDRn^zXL~4>AHn7`^1Hg$kcH21soHUKr zIRNCEHmX>|!{qUk-DjVbiJ}nhDTU%GGr8qTaXL9nr=6&D4Dblg#o{`4aX5e~-RtWG z`=eHO+1>j53Omm`&T};g`?kM$c)wRh1nw45L z4kY{9ym69%+8NXxs*SOopAJ74S*tCG$e&s%t)Ae9#94zc6F{EAdFSaf-*z0t3V&0%R6IxX3D3 z9eB*7>Leb?+-y#dIFoSJ3<8;@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/batch_visualizer + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/batch_visualizerHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:19243544.1 %
Date:2024-04-18 23:11:36Functions:204544.4 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
visual_object.cpp +
13.8%13.8%
+
13.8 %30 / 21831.8 %7 / 22
<unnamed>13.8 %30 / 21831.8 %7 / 22
batch_visualizer.cpp +
74.7%74.7%
+
74.7 %162 / 21756.5 %13 / 23
<unnamed>74.7 %162 / 21756.5 %13 / 23
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/batch_visualizer/index-detail-sort-l.html b/mrs_lib/src/batch_visualizer/index-detail-sort-l.html new file mode 100644 index 0000000000..43b5e6ab6c --- /dev/null +++ b/mrs_lib/src/batch_visualizer/index-detail-sort-l.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/batch_visualizer + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/batch_visualizerHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:19243544.1 %
Date:2024-04-18 23:11:36Functions:204544.4 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
visual_object.cpp +
13.8%13.8%
+
13.8 %30 / 21831.8 %7 / 22
<unnamed>13.8 %30 / 21831.8 %7 / 22
batch_visualizer.cpp +
74.7%74.7%
+
74.7 %162 / 21756.5 %13 / 23
<unnamed>74.7 %162 / 21756.5 %13 / 23
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/batch_visualizer/index-detail.html b/mrs_lib/src/batch_visualizer/index-detail.html new file mode 100644 index 0000000000..3a9ab507a9 --- /dev/null +++ b/mrs_lib/src/batch_visualizer/index-detail.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/batch_visualizer + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/batch_visualizerHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:19243544.1 %
Date:2024-04-18 23:11:36Functions:204544.4 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
batch_visualizer.cpp +
74.7%74.7%
+
74.7 %162 / 21756.5 %13 / 23
<unnamed>74.7 %162 / 21756.5 %13 / 23
visual_object.cpp +
13.8%13.8%
+
13.8 %30 / 21831.8 %7 / 22
<unnamed>13.8 %30 / 21831.8 %7 / 22
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/batch_visualizer/index-sort-f.html b/mrs_lib/src/batch_visualizer/index-sort-f.html new file mode 100644 index 0000000000..c41db4802c --- /dev/null +++ b/mrs_lib/src/batch_visualizer/index-sort-f.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/batch_visualizer + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/batch_visualizerHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:19243544.1 %
Date:2024-04-18 23:11:36Functions:204544.4 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
visual_object.cpp +
13.8%13.8%
+
13.8 %30 / 21831.8 %7 / 22
batch_visualizer.cpp +
74.7%74.7%
+
74.7 %162 / 21756.5 %13 / 23
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/batch_visualizer/index-sort-l.html b/mrs_lib/src/batch_visualizer/index-sort-l.html new file mode 100644 index 0000000000..f14c7a9091 --- /dev/null +++ b/mrs_lib/src/batch_visualizer/index-sort-l.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/batch_visualizer + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/batch_visualizerHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:19243544.1 %
Date:2024-04-18 23:11:36Functions:204544.4 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
visual_object.cpp +
13.8%13.8%
+
13.8 %30 / 21831.8 %7 / 22
batch_visualizer.cpp +
74.7%74.7%
+
74.7 %162 / 21756.5 %13 / 23
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/batch_visualizer/index.html b/mrs_lib/src/batch_visualizer/index.html new file mode 100644 index 0000000000..28b43d400c --- /dev/null +++ b/mrs_lib/src/batch_visualizer/index.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/batch_visualizer + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/batch_visualizerHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:19243544.1 %
Date:2024-04-18 23:11:36Functions:204544.4 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
batch_visualizer.cpp +
74.7%74.7%
+
74.7 %162 / 21756.5 %13 / 23
visual_object.cpp +
13.8%13.8%
+
13.8 %30 / 21831.8 %7 / 22
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/batch_visualizer/visual_object.cpp.func-sort-c.html b/mrs_lib/src/batch_visualizer/visual_object.cpp.func-sort-c.html new file mode 100644 index 0000000000..d0bb42bca1 --- /dev/null +++ b/mrs_lib/src/batch_visualizer/visual_object.cpp.func-sort-c.html @@ -0,0 +1,168 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/batch_visualizer/visual_object.cpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/batch_visualizer - visual_object.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:3021813.8 %
Date:2024-04-18 23:11:36Functions:72231.8 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::msgToEigen(geometry_msgs::Point_<std::allocator<void> > const&)0
mrs_lib::VisualObject::addEllipse(mrs_lib::geometry::Ellipse const&, double, double, double, double, bool, int)0
mrs_lib::VisualObject::addTriangle(mrs_lib::geometry::Triangle const&, double, double, double, double, bool)0
mrs_lib::VisualObject::addRay(mrs_lib::geometry::Ray const&, double, double, double, double)0
mrs_lib::VisualObject::VisualObject(mrs_msgs::TrajectoryReference_<std::allocator<void> > const&, double, double, double, double, ros::Duration const&, bool, unsigned long const&)0
mrs_lib::VisualObject::VisualObject(mrs_msgs::Path_<std::allocator<void> > const&, double, double, double, double, ros::Duration const&, bool, unsigned long const&)0
mrs_lib::VisualObject::VisualObject(mrs_lib::geometry::Ray const&, double, double, double, double, ros::Duration const&, unsigned long const&)0
mrs_lib::VisualObject::VisualObject(mrs_lib::geometry::Cone const&, double, double, double, double, ros::Duration const&, bool, bool, unsigned long const&, int)0
mrs_lib::VisualObject::VisualObject(mrs_lib::geometry::Cuboid const&, double, double, double, double, ros::Duration const&, bool, unsigned long const&)0
mrs_lib::VisualObject::VisualObject(mrs_lib::geometry::Ellipse const&, double, double, double, double, ros::Duration const&, bool, unsigned long const&, int)0
mrs_lib::VisualObject::VisualObject(mrs_lib::geometry::Cylinder const&, double, double, double, double, ros::Duration const&, bool, bool, unsigned long const&, int)0
mrs_lib::VisualObject::VisualObject(mrs_lib::geometry::Triangle const&, double, double, double, double, ros::Duration const&, bool, unsigned long const&)0
mrs_lib::VisualObject::VisualObject(mrs_lib::geometry::Rectangle const&, double, double, double, double, ros::Duration const&, bool, unsigned long const&)0
mrs_lib::buildEllipse(mrs_lib::geometry::Ellipse const&, int)0
mrs_lib::VisualObject::getID() const0
mrs_lib::VisualObject::isTimedOut() const56
mrs_lib::VisualObject::getType() const56
mrs_lib::VisualObject::getColors() const56
mrs_lib::VisualObject::getPoints() const56
mrs_lib::eigenToMsg(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&)79
mrs_lib::VisualObject::VisualObject(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, double, double, double, double, ros::Duration const&, unsigned long const&)79
mrs_lib::generateColor(double, double, double, double)79
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/batch_visualizer/visual_object.cpp.func.html b/mrs_lib/src/batch_visualizer/visual_object.cpp.func.html new file mode 100644 index 0000000000..46b6dc315d --- /dev/null +++ b/mrs_lib/src/batch_visualizer/visual_object.cpp.func.html @@ -0,0 +1,168 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/batch_visualizer/visual_object.cpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/batch_visualizer - visual_object.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:3021813.8 %
Date:2024-04-18 23:11:36Functions:72231.8 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::eigenToMsg(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&)79
mrs_lib::msgToEigen(geometry_msgs::Point_<std::allocator<void> > const&)0
mrs_lib::VisualObject::addEllipse(mrs_lib::geometry::Ellipse const&, double, double, double, double, bool, int)0
mrs_lib::VisualObject::addTriangle(mrs_lib::geometry::Triangle const&, double, double, double, double, bool)0
mrs_lib::VisualObject::addRay(mrs_lib::geometry::Ray const&, double, double, double, double)0
mrs_lib::VisualObject::VisualObject(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, double, double, double, double, ros::Duration const&, unsigned long const&)79
mrs_lib::VisualObject::VisualObject(mrs_msgs::TrajectoryReference_<std::allocator<void> > const&, double, double, double, double, ros::Duration const&, bool, unsigned long const&)0
mrs_lib::VisualObject::VisualObject(mrs_msgs::Path_<std::allocator<void> > const&, double, double, double, double, ros::Duration const&, bool, unsigned long const&)0
mrs_lib::VisualObject::VisualObject(mrs_lib::geometry::Ray const&, double, double, double, double, ros::Duration const&, unsigned long const&)0
mrs_lib::VisualObject::VisualObject(mrs_lib::geometry::Cone const&, double, double, double, double, ros::Duration const&, bool, bool, unsigned long const&, int)0
mrs_lib::VisualObject::VisualObject(mrs_lib::geometry::Cuboid const&, double, double, double, double, ros::Duration const&, bool, unsigned long const&)0
mrs_lib::VisualObject::VisualObject(mrs_lib::geometry::Ellipse const&, double, double, double, double, ros::Duration const&, bool, unsigned long const&, int)0
mrs_lib::VisualObject::VisualObject(mrs_lib::geometry::Cylinder const&, double, double, double, double, ros::Duration const&, bool, bool, unsigned long const&, int)0
mrs_lib::VisualObject::VisualObject(mrs_lib::geometry::Triangle const&, double, double, double, double, ros::Duration const&, bool, unsigned long const&)0
mrs_lib::VisualObject::VisualObject(mrs_lib::geometry::Rectangle const&, double, double, double, double, ros::Duration const&, bool, unsigned long const&)0
mrs_lib::buildEllipse(mrs_lib::geometry::Ellipse const&, int)0
mrs_lib::generateColor(double, double, double, double)79
mrs_lib::VisualObject::isTimedOut() const56
mrs_lib::VisualObject::getID() const0
mrs_lib::VisualObject::getType() const56
mrs_lib::VisualObject::getColors() const56
mrs_lib::VisualObject::getPoints() const56
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/batch_visualizer/visual_object.cpp.gcov.frameset.html b/mrs_lib/src/batch_visualizer/visual_object.cpp.gcov.frameset.html new file mode 100644 index 0000000000..fbafc2c961 --- /dev/null +++ b/mrs_lib/src/batch_visualizer/visual_object.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/batch_visualizer/visual_object.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/src/batch_visualizer/visual_object.cpp.gcov.html b/mrs_lib/src/batch_visualizer/visual_object.cpp.gcov.html new file mode 100644 index 0000000000..d308a504d5 --- /dev/null +++ b/mrs_lib/src/batch_visualizer/visual_object.cpp.gcov.html @@ -0,0 +1,435 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/batch_visualizer/visual_object.cpp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/batch_visualizer - visual_object.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:3021813.8 %
Date:2024-04-18 23:11:36Functions:72231.8 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : #include <mrs_lib/visual_object.h>
+       2             : 
+       3             : namespace mrs_lib
+       4             : {
+       5             : 
+       6             : /* utils //{ */
+       7             : 
+       8             : /* conversions //{ */
+       9          79 : geometry_msgs::Point eigenToMsg(const Eigen::Vector3d& v) {
+      10          79 :   geometry_msgs::Point p;
+      11          79 :   p.x = v.x();
+      12          79 :   p.y = v.y();
+      13          79 :   p.z = v.z();
+      14          79 :   return p;
+      15             : }
+      16             : 
+      17          79 : std_msgs::ColorRGBA generateColor(const double r, const double g, const double b, const double a) {
+      18          79 :   std_msgs::ColorRGBA c;
+      19          79 :   c.r = r;
+      20          79 :   c.g = g;
+      21          79 :   c.b = b;
+      22          79 :   c.a = a;
+      23          79 :   return c;
+      24             : }
+      25             : 
+      26           0 : Eigen::Vector3d msgToEigen(const geometry_msgs::Point& p) {
+      27           0 :   return Eigen::Vector3d(p.x, p.y, p.z);
+      28             : }
+      29             : //}
+      30             : 
+      31             : /* buildEllipse //{ */
+      32           0 : std::vector<Eigen::Vector3d> buildEllipse(const mrs_lib::geometry::Ellipse& ellipse, const int num_points) {
+      33           0 :   std::vector<Eigen::Vector3d> points;
+      34           0 :   double                       theta = 0;
+      35           0 :   for (int i = 0; i < num_points; i++) {
+      36           0 :     double          nom = (ellipse.a() * ellipse.b());
+      37           0 :     double          den = sqrt(((ellipse.b() * cos(theta)) * (ellipse.b() * cos(theta))) + ((ellipse.a() * sin(theta)) * (ellipse.a() * sin(theta))));
+      38           0 :     double          rho = nom / den;
+      39           0 :     Eigen::Vector3d point(rho * cos(theta), rho * sin(theta), 0);
+      40           0 :     point = ellipse.center() + ellipse.orientation() * point;
+      41           0 :     points.push_back(point);
+      42           0 :     theta += 2.0 * M_PI / num_points;
+      43             :   }
+      44           0 :   return points;
+      45             : }
+      46             : //}
+      47             : 
+      48             : //}
+      49             : 
+      50             : /* addRay //{ */
+      51           0 : void VisualObject::addRay(const mrs_lib::geometry::Ray& ray, const double r, const double g, const double b, const double a) {
+      52           0 :   type_ = MarkerType::LINE;
+      53           0 :   points_.push_back(eigenToMsg(ray.p1()));
+      54           0 :   points_.push_back(eigenToMsg(ray.p2()));
+      55           0 :   colors_.push_back(generateColor(r, g, b, a));
+      56           0 :   colors_.push_back(generateColor(r, g, b, a));
+      57           0 : }
+      58             : //}
+      59             : 
+      60             : /* addTriangle //{ */
+      61           0 : void VisualObject::addTriangle(const mrs_lib::geometry::Triangle& triangle, const double r, const double g, const double b, const double a, const bool filled) {
+      62           0 :   if (filled) {
+      63           0 :     type_ = MarkerType::TRIANGLE;
+      64           0 :     points_.push_back(eigenToMsg(triangle.a()));
+      65           0 :     points_.push_back(eigenToMsg(triangle.b()));
+      66           0 :     points_.push_back(eigenToMsg(triangle.c()));
+      67           0 :     colors_.push_back(generateColor(r, g, b, a));
+      68           0 :     colors_.push_back(generateColor(r, g, b, a));
+      69           0 :     colors_.push_back(generateColor(r, g, b, a));
+      70             :   } else {
+      71           0 :     type_ = MarkerType::LINE;
+      72           0 :     points_.push_back(eigenToMsg(triangle.a()));
+      73           0 :     points_.push_back(eigenToMsg(triangle.b()));
+      74           0 :     colors_.push_back(generateColor(r, g, b, a));
+      75           0 :     colors_.push_back(generateColor(r, g, b, a));
+      76             : 
+      77           0 :     points_.push_back(eigenToMsg(triangle.b()));
+      78           0 :     points_.push_back(eigenToMsg(triangle.c()));
+      79           0 :     colors_.push_back(generateColor(r, g, b, a));
+      80           0 :     colors_.push_back(generateColor(r, g, b, a));
+      81             : 
+      82           0 :     points_.push_back(eigenToMsg(triangle.c()));
+      83           0 :     points_.push_back(eigenToMsg(triangle.a()));
+      84           0 :     colors_.push_back(generateColor(r, g, b, a));
+      85           0 :     colors_.push_back(generateColor(r, g, b, a));
+      86             :   }
+      87           0 : }
+      88             : //}
+      89             : 
+      90             : /* addEllipse //{ */
+      91           0 : void VisualObject::addEllipse(const mrs_lib::geometry::Ellipse& ellipse, const double r, const double g, const double b, const double a, const bool filled,
+      92             :                               const int num_points) {
+      93             : 
+      94           0 :   std::vector<Eigen::Vector3d> points = buildEllipse(ellipse, num_points);
+      95           0 :   if (filled) {
+      96           0 :     for (int i = 0; i < num_points - 1; i++) {
+      97           0 :       mrs_lib::geometry::Triangle tri(ellipse.center(), points[i], points[i + 1]);
+      98           0 :       addTriangle(tri, r, g, b, a, true);
+      99             :     }
+     100           0 :     mrs_lib::geometry::Triangle tri(ellipse.center(), points[num_points - 1], points[0]);
+     101           0 :     addTriangle(tri, r, g, b, a, true);
+     102             : 
+     103             :   } else {
+     104           0 :     for (int i = 0; i < num_points - 1; i++) {
+     105           0 :       mrs_lib::geometry::Ray ray = mrs_lib::geometry::Ray::twopointCast(points[i], points[i + 1]);
+     106           0 :       addRay(ray, r, g, b, a);
+     107             :     }
+     108           0 :     mrs_lib::geometry::Ray ray = mrs_lib::geometry::Ray::twopointCast(points[num_points - 1], points[0]);
+     109           0 :     addRay(ray, r, g, b, a);
+     110             :   }
+     111           0 : }
+     112             : //}
+     113             : 
+     114             : /* Eigen::Vector3d //{ */
+     115          79 : VisualObject::VisualObject(const Eigen::Vector3d& point, const double r, const double g, const double b, const double a, const ros::Duration& timeout,
+     116          79 :                            const unsigned long& id)
+     117          79 :     : id_(id) {
+     118          79 :   type_ = MarkerType::POINT;
+     119          79 :   points_.push_back(eigenToMsg(point));
+     120          79 :   colors_.push_back(generateColor(r, g, b, a));
+     121          79 :   if (timeout.toSec() <= 0) {
+     122          79 :     timeout_time_ = ros::Time(0);
+     123             :   } else {
+     124           0 :     timeout_time_ = ros::Time::now() + timeout;
+     125             :   }
+     126          79 : }
+     127             : //}
+     128             : 
+     129             : /* mrs_lib::geometry::Ray //{ */
+     130           0 : VisualObject::VisualObject(const mrs_lib::geometry::Ray& ray, const double r, const double g, const double b, const double a, const ros::Duration& timeout,
+     131           0 :                            const unsigned long& id)
+     132           0 :     : id_(id) {
+     133           0 :   type_ = MarkerType::LINE;
+     134           0 :   addRay(ray, r, g, b, a);
+     135           0 :   if (timeout.toSec() <= 0) {
+     136           0 :     timeout_time_ = ros::Time(0);
+     137             :   } else {
+     138           0 :     timeout_time_ = ros::Time::now() + timeout;
+     139             :   }
+     140           0 : }
+     141             : //}
+     142             : 
+     143             : /* mrs_lib::geometry::Triangle //{ */
+     144           0 : VisualObject::VisualObject(const mrs_lib::geometry::Triangle& triangle, const double r, const double g, const double b, const double a,
+     145           0 :                            const ros::Duration& timeout, const bool filled, const unsigned long& id)
+     146           0 :     : id_(id) {
+     147           0 :   addTriangle(triangle, r, g, b, a, filled);
+     148           0 :   if (timeout.toSec() <= 0) {
+     149           0 :     timeout_time_ = ros::Time(0);
+     150             :   } else {
+     151           0 :     timeout_time_ = ros::Time::now() + timeout;
+     152             :   }
+     153           0 : }
+     154             : //}
+     155             : 
+     156             : /* mrs_lib::geometry::Rectangle //{ */
+     157           0 : VisualObject::VisualObject(const mrs_lib::geometry::Rectangle& rectangle, const double r, const double g, const double b, const double a,
+     158           0 :                            const ros::Duration& timeout, const bool filled, const unsigned long& id)
+     159           0 :     : id_(id) {
+     160           0 :   for (const auto& t : rectangle.triangles()) {
+     161           0 :     addTriangle(t, r, g, b, a, filled);
+     162             :   }
+     163           0 :   if (timeout.toSec() <= 0) {
+     164           0 :     timeout_time_ = ros::Time(0);
+     165             :   } else {
+     166           0 :     timeout_time_ = ros::Time::now() + timeout;
+     167             :   }
+     168           0 : }
+     169             : //}
+     170             : 
+     171             : /* mrs_lib::geometry::Cuboid //{ */
+     172           0 : VisualObject::VisualObject(const mrs_lib::geometry::Cuboid& cuboid, const double r, const double g, const double b, const double a,
+     173           0 :                            const ros::Duration& timeout, const bool filled, const unsigned long& id)
+     174           0 :     : id_(id) {
+     175             : 
+     176           0 :   for (int i = 0; i < 6; i++) {
+     177           0 :     for (const auto& t : cuboid.getRectangle(i).triangles()) {
+     178           0 :       addTriangle(t, r, g, b, a, filled);
+     179             :     }
+     180             :   }
+     181           0 :   if (timeout.toSec() <= 0) {
+     182           0 :     timeout_time_ = ros::Time(0);
+     183             :   } else {
+     184           0 :     timeout_time_ = ros::Time::now() + timeout;
+     185             :   }
+     186           0 : }
+     187             : //}
+     188             : 
+     189             : /* mrs_lib::geometry::Ellipse//{ */
+     190           0 : VisualObject::VisualObject(const mrs_lib::geometry::Ellipse& ellipse, const double r, const double g, const double b, const double a,
+     191           0 :                            const ros::Duration& timeout, const bool filled, const unsigned long& id, const int num_points)
+     192           0 :     : id_(id) {
+     193           0 :   addEllipse(ellipse, r, g, b, a, filled, num_points);
+     194           0 :   if (timeout.toSec() <= 0) {
+     195           0 :     timeout_time_ = ros::Time(0);
+     196             :   } else {
+     197           0 :     timeout_time_ = ros::Time::now() + timeout;
+     198             :   }
+     199           0 : }
+     200             : //}
+     201             : 
+     202             : /* mrs_lib::geometry::Cylinder //{ */
+     203           0 : VisualObject::VisualObject(const mrs_lib::geometry::Cylinder& cylinder, const double r, const double g, const double b, const double a,
+     204           0 :                            const ros::Duration& timeout, const bool filled, const bool capped, const unsigned long& id, const int num_sides)
+     205           0 :     : id_(id) {
+     206           0 :   if (capped) {
+     207           0 :     mrs_lib::geometry::Ellipse top    = cylinder.getCap(mrs_lib::geometry::Cylinder::TOP);
+     208           0 :     mrs_lib::geometry::Ellipse bottom = cylinder.getCap(mrs_lib::geometry::Cylinder::BOTTOM);
+     209           0 :     addEllipse(top, r, g, b, a, filled, num_sides);
+     210           0 :     addEllipse(bottom, r, g, b, a, filled, num_sides);
+     211             :   }
+     212           0 :   std::vector<Eigen::Vector3d> top_points    = buildEllipse(cylinder.getCap(mrs_lib::geometry::Cylinder::TOP), num_sides);
+     213           0 :   std::vector<Eigen::Vector3d> bottom_points = buildEllipse(cylinder.getCap(mrs_lib::geometry::Cylinder::BOTTOM), num_sides);
+     214           0 :   for (unsigned int i = 0; i < top_points.size() - 1; i++) {
+     215           0 :     mrs_lib::geometry::Rectangle rect(bottom_points[i], bottom_points[i + 1], top_points[i + 1], top_points[i]);
+     216           0 :     addTriangle(rect.triangles()[0], r, g, b, a, filled);
+     217           0 :     addTriangle(rect.triangles()[1], r, g, b, a, filled);
+     218             :   }
+     219           0 :   mrs_lib::geometry::Rectangle rect(bottom_points[bottom_points.size() - 1], bottom_points[0], top_points[0], top_points[top_points.size() - 1]);
+     220           0 :   addTriangle(rect.triangles()[0], r, g, b, a, filled);
+     221           0 :   addTriangle(rect.triangles()[1], r, g, b, a, filled);
+     222           0 :   if (timeout.toSec() <= 0) {
+     223           0 :     timeout_time_ = ros::Time(0);
+     224             :   } else {
+     225           0 :     timeout_time_ = ros::Time::now() + timeout;
+     226             :   }
+     227           0 : }
+     228             : //}
+     229             : 
+     230             : /* mrs_lib::geometry::Cone //{ */
+     231           0 : VisualObject::VisualObject(const mrs_lib::geometry::Cone& cone, const double r, const double g, const double b, const double a, const ros::Duration& timeout,
+     232           0 :                            const bool filled, const bool capped, const unsigned long& id, const int num_sides)
+     233           0 :     : id_(id) {
+     234           0 :   if (capped) {
+     235           0 :     mrs_lib::geometry::Ellipse cap = cone.getCap();
+     236           0 :     addEllipse(cap, r, g, b, a, filled, num_sides);
+     237             :   }
+     238           0 :   std::vector<Eigen::Vector3d> cap_points = buildEllipse(cone.getCap(), num_sides);
+     239           0 :   for (unsigned int i = 0; i < cap_points.size() - 1; i++) {
+     240           0 :     mrs_lib::geometry::Triangle tri(cap_points[i], cap_points[i + 1], cone.origin());
+     241           0 :     addTriangle(tri, r, g, b, a, filled);
+     242             :   }
+     243           0 :   mrs_lib::geometry::Triangle tri(cap_points[cap_points.size() - 1], cap_points[0], cone.origin());
+     244           0 :   addTriangle(tri, r, g, b, a, filled);
+     245           0 :   if (timeout.toSec() <= 0) {
+     246           0 :     timeout_time_ = ros::Time(0);
+     247             :   } else {
+     248           0 :     timeout_time_ = ros::Time::now() + timeout;
+     249             :   }
+     250           0 : }
+     251             : //}
+     252             : 
+     253             : /* mrs_msgs::Path //{ */
+     254           0 : VisualObject::VisualObject(const mrs_msgs::Path& p, const double r, const double g, const double b, const double a, const ros::Duration& timeout,
+     255           0 :                            const bool filled, const unsigned long& id)
+     256           0 :     : id_(id) {
+     257           0 :   if (p.points.size() < 2) {
+     258           0 :     return;
+     259             :   }
+     260           0 :   if (filled) {
+     261           0 :     for (size_t i = 0; i < p.points.size() - 1; i++) {
+     262           0 :       Eigen::Vector3d p1, p2;
+     263           0 :       p1.x()   = p.points[i].position.x;
+     264           0 :       p1.y()   = p.points[i].position.y;
+     265           0 :       p1.z()   = p.points[i].position.z;
+     266           0 :       p2.x()   = p.points[i + 1].position.x;
+     267           0 :       p2.y()   = p.points[i + 1].position.y;
+     268           0 :       p2.z()   = p.points[i + 1].position.z;
+     269           0 :       auto ray = mrs_lib::geometry::Ray::twopointCast(p1, p2);
+     270           0 :       addRay(ray, r, g, b, a);
+     271             :     }
+     272             :   } else {
+     273           0 :     type_ = MarkerType::POINT;
+     274           0 :     for (size_t i = 0; i < p.points.size(); i++) {
+     275           0 :       points_.push_back(p.points[i].position);
+     276           0 :       colors_.push_back(generateColor(r, g, b, a));
+     277             :     }
+     278             :   }
+     279           0 :   if (timeout.toSec() <= 0) {
+     280           0 :     timeout_time_ = ros::Time(0);
+     281             :   } else {
+     282           0 :     timeout_time_ = ros::Time::now() + timeout;
+     283             :   }
+     284             : }
+     285             : //}
+     286             : 
+     287             : /* mrs_msgs::TrajectoryReference //{ */
+     288           0 : VisualObject::VisualObject(const mrs_msgs::TrajectoryReference& traj, const double r, const double g, const double b, const double a,
+     289           0 :                            const ros::Duration& timeout, const bool filled, const unsigned long& id)
+     290           0 :     : id_(id) {
+     291           0 :   if (traj.points.size() < 2) {
+     292           0 :     return;
+     293             :   }
+     294           0 :   if (filled) {
+     295           0 :     for (size_t i = 0; i < traj.points.size() - 1; i++) {
+     296           0 :       Eigen::Vector3d p1, p2;
+     297           0 :       p1.x()   = traj.points[i].position.x;
+     298           0 :       p1.y()   = traj.points[i].position.y;
+     299           0 :       p1.z()   = traj.points[i].position.z;
+     300           0 :       p2.x()   = traj.points[i + 1].position.x;
+     301           0 :       p2.y()   = traj.points[i + 1].position.y;
+     302           0 :       p2.z()   = traj.points[i + 1].position.z;
+     303           0 :       auto ray = mrs_lib::geometry::Ray::twopointCast(p1, p2);
+     304           0 :       addRay(ray, r, g, b, a);
+     305             :     }
+     306             :   } else {
+     307           0 :     type_ = MarkerType::POINT;
+     308           0 :     for (size_t i = 0; i < traj.points.size(); i++) {
+     309           0 :       points_.push_back(traj.points[i].position);
+     310           0 :       colors_.push_back(generateColor(r, g, b, a));
+     311             :     }
+     312             :   }
+     313           0 :   if (timeout.toSec() <= 0) {
+     314           0 :     timeout_time_ = ros::Time(0);
+     315             :   } else {
+     316           0 :     timeout_time_ = ros::Time::now() + timeout;
+     317             :   }
+     318             : }
+     319             : //}
+     320             : 
+     321             : /* getID //{ */
+     322           0 : unsigned long VisualObject::getID() const {
+     323           0 :   return id_;
+     324             : }
+     325             : //}
+     326             : 
+     327             : /* getType //{ */
+     328          56 : int VisualObject::getType() const {
+     329          56 :   return type_;
+     330             : }
+     331             : //}
+     332             : 
+     333             : /* isTimedOut //{ */
+     334          56 : bool VisualObject::isTimedOut() const {
+     335          56 :   return !timeout_time_.isZero() && (timeout_time_ - ros::Time::now()).toSec() <= 0;
+     336             : }
+     337             : //}
+     338             : 
+     339             : /* getPoints //{ */
+     340          56 : const std::vector<geometry_msgs::Point> VisualObject::getPoints() const {
+     341          56 :   return points_;
+     342             : }
+     343             : //}
+     344             : 
+     345             : /* getColors //{ */
+     346          56 : const std::vector<std_msgs::ColorRGBA> VisualObject::getColors() const {
+     347          56 :   return colors_;
+     348             : }
+     349             : //}
+     350             : 
+     351             : }  // namespace mrs_lib
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/batch_visualizer/visual_object.cpp.gcov.overview.html b/mrs_lib/src/batch_visualizer/visual_object.cpp.gcov.overview.html new file mode 100644 index 0000000000..a95610f629 --- /dev/null +++ b/mrs_lib/src/batch_visualizer/visual_object.cpp.gcov.overview.html @@ -0,0 +1,108 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/batch_visualizer/visual_object.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/src/batch_visualizer/visual_object.cpp.gcov.png b/mrs_lib/src/batch_visualizer/visual_object.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..b55f768965809edc613746889e563a4b1d7241f7 GIT binary patch literal 1229 zcmV;;1Ty=HP)2Nbs` zoTWIMm+F|wabY=fTua7yD)2OcZ?1tqZfc870j#l2Yw;o2ic`x%3rtvl0Lx4PG`AX> zSp(Y;p0(%cBnKv%DmNZ|4n&W5{FpRoIqT;Gxdu>ZXVGxGz%vc^5Lf8?!DL)P<*I@5 zT-jfvkf~5LBdgkHnks(V$ZzVIdDk+qANw=*M+J*P)A!J7s}Gn8z(w@s}=n{PM>>>MLb z;));`^*Izs%PdZxQL$rMD`g|Pj^LI9jWNKc=)j_ZG9A`thB>x`VVi`M2b^oV>-U>T zGyCMIic~Xi5$HML#Ir|^ZOT!OJ<8wY*MdCdS+#urW46DGJx)b|>OOhea=t2RHPAe} zbZcExHZN(OfCtu%?41D4X7mWGfr-zV8LDQ+!xo0F1!};|GwguD9;>>GNQR|GA)Zxe zj=lztn_2HAQhS>!&cOvW7FRqj}<;${}1n(02btrfqpw-A4y&R z)_Oi6NcBP$XFaKqYFJM|C~s-5<{Ge`M8~~gH>%3LjDiR5HHvmr;f=yw8mlLc|Q1EgcU0*vOlLx#mV%xQ`hWm90;EW<-=PckKX&-L<=B1XAnLSH;fvDBj9-*#5_Uj)e4#yy3u#JrPrkvOg~3Zg_6&wTMgM zj|Vo=%;SLnI^u44y0jH>$<0a#bVb~(M-kJfM_kcYPQ0lU_D{*(Z&&WKe)>Lp3ESD% zINWBB#s&iS4T$#chy)bxRXFPHD%k3lHo@?G2d?wYCjO-8U_PH~fwG^4vf~~gB! + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/geometry/conversions.cpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/geometry - conversions.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:324669.6 %
Date:2024-04-18 23:11:36Functions:71070.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::geometry::toEigenMatrix(boost::array<double, 36ul> const&)0
mrs_lib::geometry::toCV(geometry_msgs::Vector3_<std::allocator<void> > const&)0
mrs_lib::geometry::fromEigen(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&)0
mrs_lib::geometry::toCV(geometry_msgs::Point_<std::allocator<void> > const&)1
mrs_lib::geometry::fromCV(cv::Point3_<double> const&)1
mrs_lib::geometry::toEigen(geometry_msgs::Vector3_<std::allocator<void> > const&)19
mrs_lib::geometry::fromEigenVec(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&)22
mrs_lib::geometry::toEigen(geometry_msgs::Point_<std::allocator<void> > const&)28
mrs_lib::geometry::fromEigen(Eigen::Quaternion<double, 0> const&)110061
mrs_lib::geometry::toEigen(geometry_msgs::Quaternion_<std::allocator<void> > const&)110062
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/geometry/conversions.cpp.func.html b/mrs_lib/src/geometry/conversions.cpp.func.html new file mode 100644 index 0000000000..ef7df42b0a --- /dev/null +++ b/mrs_lib/src/geometry/conversions.cpp.func.html @@ -0,0 +1,120 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/geometry/conversions.cpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/geometry - conversions.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:324669.6 %
Date:2024-04-18 23:11:36Functions:71070.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::geometry::fromEigenVec(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&)22
mrs_lib::geometry::toEigenMatrix(boost::array<double, 36ul> const&)0
mrs_lib::geometry::toCV(geometry_msgs::Point_<std::allocator<void> > const&)1
mrs_lib::geometry::toCV(geometry_msgs::Vector3_<std::allocator<void> > const&)0
mrs_lib::geometry::fromCV(cv::Point3_<double> const&)1
mrs_lib::geometry::toEigen(geometry_msgs::Quaternion_<std::allocator<void> > const&)110062
mrs_lib::geometry::toEigen(geometry_msgs::Point_<std::allocator<void> > const&)28
mrs_lib::geometry::toEigen(geometry_msgs::Vector3_<std::allocator<void> > const&)19
mrs_lib::geometry::fromEigen(Eigen::Quaternion<double, 0> const&)110061
mrs_lib::geometry::fromEigen(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&)0
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/geometry/conversions.cpp.gcov.frameset.html b/mrs_lib/src/geometry/conversions.cpp.gcov.frameset.html new file mode 100644 index 0000000000..98a653461f --- /dev/null +++ b/mrs_lib/src/geometry/conversions.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/geometry/conversions.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/src/geometry/conversions.cpp.gcov.html b/mrs_lib/src/geometry/conversions.cpp.gcov.html new file mode 100644 index 0000000000..cb8676e83e --- /dev/null +++ b/mrs_lib/src/geometry/conversions.cpp.gcov.html @@ -0,0 +1,178 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/geometry/conversions.cpp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/geometry - conversions.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:324669.6 %
Date:2024-04-18 23:11:36Functions:71070.0 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : #include <mrs_lib/geometry/conversions.h>
+       2             : 
+       3             : namespace mrs_lib
+       4             : {
+       5             :   namespace geometry
+       6             :   {
+       7             : 
+       8             :     /* conversions from/to Eigen //{ */
+       9             :     
+      10           0 :     geometry_msgs::Point fromEigen(const Eigen::Vector3d& what)
+      11             :     {
+      12           0 :       geometry_msgs::Point pt;
+      13           0 :       pt.x = what.x();
+      14           0 :       pt.y = what.y();
+      15           0 :       pt.z = what.z();
+      16           0 :       return pt;
+      17             :     }
+      18             :     
+      19          22 :     geometry_msgs::Vector3 fromEigenVec(const Eigen::Vector3d& what)
+      20             :     {
+      21          22 :       geometry_msgs::Vector3 pt;
+      22          22 :       pt.x = what.x();
+      23          22 :       pt.y = what.y();
+      24          22 :       pt.z = what.z();
+      25          22 :       return pt;
+      26             :     }
+      27             :     
+      28          28 :     Eigen::Vector3d toEigen(const geometry_msgs::Point& what)
+      29             :     {
+      30          28 :       return {what.x, what.y, what.z};
+      31             :     }
+      32             :     
+      33          19 :     Eigen::Vector3d toEigen(const geometry_msgs::Vector3& what)
+      34             :     {
+      35          19 :       return {what.x, what.y, what.z};
+      36             :     }
+      37             :     
+      38           0 :     Eigen::Matrix<double, 6, 6> toEigenMatrix(const boost::array<double, 36>& what)
+      39             :     {
+      40           0 :       Eigen::Matrix<double, 6, 6> ret;
+      41           0 :       for (int r = 0; r < 6; r++)
+      42           0 :         for (int c = 0; c < 6; c++)
+      43           0 :           ret(r, c) = what.at(6 * r + c);
+      44           0 :       return ret;
+      45             :     }
+      46             :     
+      47      110061 :     geometry_msgs::Quaternion fromEigen(const Eigen::Quaterniond& what)
+      48             :     {
+      49      110061 :       geometry_msgs::Quaternion q;
+      50      110062 :       q.x = what.x();
+      51      110061 :       q.y = what.y();
+      52      110061 :       q.z = what.z();
+      53      110061 :       q.w = what.w();
+      54      110061 :       return q;
+      55             :     }
+      56             :     
+      57      110062 :     Eigen::Quaterniond toEigen(const geometry_msgs::Quaternion& what)
+      58             :     {
+      59             :       // better to do this manually than through the constructor to avoid ambiguities (e.g. position of x and w)
+      60      110062 :       Eigen::Quaterniond q;
+      61      110062 :       q.x() = what.x;
+      62      110062 :       q.y() = what.y;
+      63      110062 :       q.z() = what.z;
+      64      110062 :       q.w() = what.w;
+      65      110062 :       return q;
+      66             :     }
+      67             :     
+      68             :     //}
+      69             : 
+      70             :     /* conversions from/to OpenCV //{ */
+      71             :     
+      72           1 :     geometry_msgs::Point fromCV(const cv::Point3d& what)
+      73             :     {
+      74           1 :       geometry_msgs::Point pt;
+      75           1 :       pt.x = what.x;
+      76           1 :       pt.y = what.y;
+      77           1 :       pt.z = what.z;
+      78           1 :       return pt;
+      79             :     }
+      80             :     
+      81           1 :     cv::Point3d toCV(const geometry_msgs::Point& what)
+      82             :     {
+      83           1 :       return {what.x, what.y, what.z};
+      84             :     }
+      85             :     
+      86           0 :     cv::Point3d toCV(const geometry_msgs::Vector3& what)
+      87             :     {
+      88           0 :       return {what.x, what.y, what.z};
+      89             :     }
+      90             :     
+      91             :     //}
+      92             : 
+      93             :   }
+      94             : }
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/geometry/conversions.cpp.gcov.overview.html b/mrs_lib/src/geometry/conversions.cpp.gcov.overview.html new file mode 100644 index 0000000000..7d113fc895 --- /dev/null +++ b/mrs_lib/src/geometry/conversions.cpp.gcov.overview.html @@ -0,0 +1,44 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/geometry/conversions.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/src/geometry/conversions.cpp.gcov.png b/mrs_lib/src/geometry/conversions.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..5a46c81f260e8d8a8c08cd829d3007493bf759f6 GIT binary patch literal 446 zcmV;v0YUzWP))a%5Q(iZDwZ>~SM>fqB$DL&a%jeJv#%>g3>p@_ zo0-zpqtyG3*)j2JoVnKE|plOZs#MMEH?+yM^cOu<+mC~a;5Dx+3g*S#0> z^CA>aIx+-?PGbnUxi>J&T`fd}X!zviLpk`X?KJFy9NQpkb^JY$`s&x};b6e$>1M_9r2&&rPm* o7DiIo6z(_7!W+s}%csSC0BpJVqo%=@)c^nh07*qoM6N<$g1hm+?EnA( literal 0 HcmV?d00001 diff --git a/mrs_lib/src/geometry/index-detail-sort-f.html b/mrs_lib/src/geometry/index-detail-sort-f.html new file mode 100644 index 0000000000..011e885195 --- /dev/null +++ b/mrs_lib/src/geometry/index-detail-sort-f.html @@ -0,0 +1,138 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/geometry + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/geometryHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:6744515.1 %
Date:2024-04-18 23:11:36Functions:159416.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
shapes.cpp +
0.0%
+
0.0 %0 / 3350.0 %0 / 68
misc.cpp +
54.7%54.7%
+
54.7 %35 / 6450.0 %8 / 16
<unnamed>54.7 %35 / 6450.0 %8 / 16
conversions.cpp +
69.6%69.6%
+
69.6 %32 / 4670.0 %7 / 10
<unnamed>69.6 %32 / 4670.0 %7 / 10
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/geometry/index-detail-sort-l.html b/mrs_lib/src/geometry/index-detail-sort-l.html new file mode 100644 index 0000000000..f715188d11 --- /dev/null +++ b/mrs_lib/src/geometry/index-detail-sort-l.html @@ -0,0 +1,138 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/geometry + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/geometryHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:6744515.1 %
Date:2024-04-18 23:11:36Functions:159416.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
shapes.cpp +
0.0%
+
0.0 %0 / 3350.0 %0 / 68
misc.cpp +
54.7%54.7%
+
54.7 %35 / 6450.0 %8 / 16
<unnamed>54.7 %35 / 6450.0 %8 / 16
conversions.cpp +
69.6%69.6%
+
69.6 %32 / 4670.0 %7 / 10
<unnamed>69.6 %32 / 4670.0 %7 / 10
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/geometry/index-detail.html b/mrs_lib/src/geometry/index-detail.html new file mode 100644 index 0000000000..247146afc7 --- /dev/null +++ b/mrs_lib/src/geometry/index-detail.html @@ -0,0 +1,138 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/geometry + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/geometryHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:6744515.1 %
Date:2024-04-18 23:11:36Functions:159416.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
conversions.cpp +
69.6%69.6%
+
69.6 %32 / 4670.0 %7 / 10
<unnamed>69.6 %32 / 4670.0 %7 / 10
misc.cpp +
54.7%54.7%
+
54.7 %35 / 6450.0 %8 / 16
<unnamed>54.7 %35 / 6450.0 %8 / 16
shapes.cpp +
0.0%
+
0.0 %0 / 3350.0 %0 / 68
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/geometry/index-sort-f.html b/mrs_lib/src/geometry/index-sort-f.html new file mode 100644 index 0000000000..26d9f7de9b --- /dev/null +++ b/mrs_lib/src/geometry/index-sort-f.html @@ -0,0 +1,122 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/geometry + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/geometryHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:6744515.1 %
Date:2024-04-18 23:11:36Functions:159416.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
shapes.cpp +
0.0%
+
0.0 %0 / 3350.0 %0 / 68
misc.cpp +
54.7%54.7%
+
54.7 %35 / 6450.0 %8 / 16
conversions.cpp +
69.6%69.6%
+
69.6 %32 / 4670.0 %7 / 10
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/geometry/index-sort-l.html b/mrs_lib/src/geometry/index-sort-l.html new file mode 100644 index 0000000000..8a106c48ae --- /dev/null +++ b/mrs_lib/src/geometry/index-sort-l.html @@ -0,0 +1,122 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/geometry + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/geometryHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:6744515.1 %
Date:2024-04-18 23:11:36Functions:159416.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
shapes.cpp +
0.0%
+
0.0 %0 / 3350.0 %0 / 68
misc.cpp +
54.7%54.7%
+
54.7 %35 / 6450.0 %8 / 16
conversions.cpp +
69.6%69.6%
+
69.6 %32 / 4670.0 %7 / 10
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/geometry/index.html b/mrs_lib/src/geometry/index.html new file mode 100644 index 0000000000..83cf21aa80 --- /dev/null +++ b/mrs_lib/src/geometry/index.html @@ -0,0 +1,122 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/geometry + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/geometryHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:6744515.1 %
Date:2024-04-18 23:11:36Functions:159416.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
conversions.cpp +
69.6%69.6%
+
69.6 %32 / 4670.0 %7 / 10
misc.cpp +
54.7%54.7%
+
54.7 %35 / 6450.0 %8 / 16
shapes.cpp +
0.0%
+
0.0 %0 / 3350.0 %0 / 68
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/geometry/misc.cpp.func-sort-c.html b/mrs_lib/src/geometry/misc.cpp.func-sort-c.html new file mode 100644 index 0000000000..dd6517c132 --- /dev/null +++ b/mrs_lib/src/geometry/misc.cpp.func-sort-c.html @@ -0,0 +1,144 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/geometry/misc.cpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/geometry - misc.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:356454.7 %
Date:2024-04-18 23:11:36Functions:81650.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::geometry::solidAngle(double, double, double)0
mrs_lib::geometry::invHaversin(double)0
mrs_lib::geometry::triangleArea(double, double, double)0
mrs_lib::geometry::quaternionBetween(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, double)0
mrs_lib::geometry::quaternionFromEuler(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&)0
mrs_lib::geometry::quaternionFromEuler(double, double, double)0
mrs_lib::geometry::sphericalTriangleArea(Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1>)0
mrs_lib::geometry::haversin(double)0
mrs_lib::geometry::angleBetween(Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&)3
mrs_lib::geometry::rotationBetween(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, double)3
mrs_lib::geometry::angleaxisBetween(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, double)3
mrs_lib::geometry::cross(Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 2, 1, 0, 2, 1>)3
mrs_lib::geometry::quaternionFromHeading(double)110068
mrs_lib::geometry::angleBetween(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, Eigen::Matrix<double, 3, 1, 0, 3, 1> const&)138799
mrs_lib::geometry::dist(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, Eigen::Matrix<double, 3, 1, 0, 3, 1> const&)194308
mrs_lib::geometry::dist(Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&)288960
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/geometry/misc.cpp.func.html b/mrs_lib/src/geometry/misc.cpp.func.html new file mode 100644 index 0000000000..f23348aa29 --- /dev/null +++ b/mrs_lib/src/geometry/misc.cpp.func.html @@ -0,0 +1,144 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/geometry/misc.cpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/geometry - misc.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:356454.7 %
Date:2024-04-18 23:11:36Functions:81650.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::geometry::solidAngle(double, double, double)0
mrs_lib::geometry::invHaversin(double)0
mrs_lib::geometry::angleBetween(Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&)3
mrs_lib::geometry::angleBetween(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, Eigen::Matrix<double, 3, 1, 0, 3, 1> const&)138799
mrs_lib::geometry::triangleArea(double, double, double)0
mrs_lib::geometry::rotationBetween(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, double)3
mrs_lib::geometry::angleaxisBetween(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, double)3
mrs_lib::geometry::quaternionBetween(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, double)0
mrs_lib::geometry::quaternionFromEuler(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&)0
mrs_lib::geometry::quaternionFromEuler(double, double, double)0
mrs_lib::geometry::quaternionFromHeading(double)110068
mrs_lib::geometry::sphericalTriangleArea(Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1>)0
mrs_lib::geometry::dist(Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&)288960
mrs_lib::geometry::dist(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, Eigen::Matrix<double, 3, 1, 0, 3, 1> const&)194308
mrs_lib::geometry::cross(Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 2, 1, 0, 2, 1>)3
mrs_lib::geometry::haversin(double)0
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/geometry/misc.cpp.gcov.frameset.html b/mrs_lib/src/geometry/misc.cpp.gcov.frameset.html new file mode 100644 index 0000000000..35b80de4af --- /dev/null +++ b/mrs_lib/src/geometry/misc.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/geometry/misc.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/src/geometry/misc.cpp.gcov.html b/mrs_lib/src/geometry/misc.cpp.gcov.html new file mode 100644 index 0000000000..4751ae7509 --- /dev/null +++ b/mrs_lib/src/geometry/misc.cpp.gcov.html @@ -0,0 +1,269 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/geometry/misc.cpp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/geometry - misc.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:356454.7 %
Date:2024-04-18 23:11:36Functions:81650.0 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : // clang: MatousFormat
+       2             : #include <mrs_lib/geometry/misc.h>
+       3             : 
+       4             : namespace mrs_lib
+       5             : {
+       6             :   namespace geometry
+       7             :   {
+       8             : 
+       9             :     // instantiation of common template values
+      10             :     vec_t<3 + 1> toHomogenous(const vec_t<3>& vec);
+      11             :     vec_t<2 + 1> toHomogenous(const vec_t<2>& vec);
+      12             : 
+      13             :     // | ----------------- Angle-related functions ---------------- |
+      14             : 
+      15             :     /* angle-related functions //{ */
+      16             : 
+      17             :     /* cross() //{ */
+      18             : 
+      19           3 :     double cross(const vec2_t& vec1, const vec2_t vec2)
+      20             :     {
+      21           3 :       return vec1.x() * vec2.y() - vec1.y() * vec2.x();
+      22             :     }
+      23             : 
+      24             :     //}
+      25             : 
+      26             :     /* angleBetween() //{ */
+      27             : 
+      28      138799 :     double angleBetween(const vec3_t& vec1, const vec3_t& vec2)
+      29             :     {
+      30      138799 :       const double sin_12 = vec1.cross(vec2).norm();
+      31      138791 :       const double cos_12 = vec1.dot(vec2);
+      32      138782 :       const double angle = std::atan2(sin_12, cos_12);
+      33      138782 :       return angle;
+      34             :     }
+      35             : 
+      36           3 :     double angleBetween(const vec2_t& vec1, const vec2_t& vec2)
+      37             :     {
+      38           3 :       const double sin_12 = cross(vec1, vec2);
+      39           3 :       const double cos_12 = vec1.dot(vec2);
+      40           3 :       const double angle = std::atan2(sin_12, cos_12);
+      41           3 :       return angle;
+      42             :     }
+      43             : 
+      44             :     //}
+      45             : 
+      46             :     /* angleaxisBetween() //{ */
+      47             : 
+      48           3 :     anax_t angleaxisBetween(const Eigen::Vector3d& vec1, const Eigen::Vector3d& vec2, const double tolerance)
+      49             :     {
+      50             :       // Find the rotation matrix to rotate vec1 to point in the direction of vec2
+      51           3 :       const Eigen::Vector3d a = vec1.normalized();
+      52           3 :       const Eigen::Vector3d b = vec2.normalized();
+      53           3 :       const Eigen::Vector3d v = a.cross(b);
+      54           3 :       const double sin_ab = v.norm();
+      55           3 :       const double cos_ab = a.dot(b);
+      56           3 :       const double angle = std::atan2(sin_ab, cos_ab);
+      57           3 :       anax_t ret;
+      58           3 :       if (abs(angle) < tolerance)
+      59           1 :         ret = anax_t(0.0, Eigen::Vector3d::UnitX());
+      60           2 :       else if (abs(abs(angle) - M_PI) < tolerance)
+      61           0 :         ret = anax_t(M_PI, Eigen::Vector3d::UnitX());
+      62             :       else
+      63           2 :         ret = anax_t(angle, v.normalized());
+      64           6 :       return ret;
+      65             :     }
+      66             : 
+      67             :     //}
+      68             : 
+      69             :     /* quaternionBetween() //{ */
+      70             : 
+      71           0 :     quat_t quaternionBetween(const Eigen::Vector3d& vec1, const Eigen::Vector3d& vec2, const double tolerance)
+      72             :     {
+      73           0 :       const auto rot = angleaxisBetween(vec1, vec2, tolerance);
+      74           0 :       const quat_t ret(rot);
+      75           0 :       return ret;
+      76             :     }
+      77             : 
+      78             :     /* quaternionFromEuler() overloads //{ */
+      79           0 :     quat_t quaternionFromEuler(double x, double y, double z)
+      80             :     {
+      81           0 :       return anax_t(x, vec3_t::UnitX()) * anax_t(y, vec3_t::UnitY()) * anax_t(z, vec3_t::UnitZ());
+      82             :     }
+      83             : 
+      84           0 :     quat_t quaternionFromEuler(const Eigen::Vector3d& euler)
+      85             :     {
+      86           0 :       return anax_t(euler.x(), vec3_t::UnitX()) * anax_t(euler.y(), vec3_t::UnitY())
+      87           0 :              * anax_t(euler.z(), vec3_t::UnitZ());
+      88             :     }
+      89             :     //}
+      90             : 
+      91             :     /* quaternionFromHeading //{ */
+      92      110068 :     quat_t quaternionFromHeading(const double heading)
+      93             :     {
+      94      220134 :       return quat_t(anax_t(heading, Eigen::Vector3d::UnitZ()));
+      95             :     }
+      96             :     //}
+      97             : 
+      98             :     //}
+      99             : 
+     100             :     /* rotationBetween() //{ */
+     101             : 
+     102           3 :     Eigen::Matrix3d rotationBetween(const Eigen::Vector3d& vec1, const Eigen::Vector3d& vec2, const double tolerance)
+     103             :     {
+     104           3 :       const auto rot = angleaxisBetween(vec1, vec2, tolerance);
+     105           3 :       const Eigen::Matrix3d ret(rot);
+     106           6 :       return ret;
+     107             :     }
+     108             : 
+     109             :     //}
+     110             : 
+     111             :     /* haversin() //{ */
+     112             : 
+     113           0 :     double haversin(const double angle)
+     114             :     {
+     115           0 :       return (1.0 - std::cos(angle)) / 2.0;
+     116             :     }
+     117             : 
+     118             :     //}
+     119             : 
+     120             :     /* invHaversin() //{ */
+     121             : 
+     122           0 :     double invHaversin(const double value)
+     123             :     {
+     124           0 :       return 2.0 * std::asin(std::sqrt(value));
+     125             :     }
+     126             : 
+     127             :     //}
+     128             : 
+     129             :     /* solidAngle() //{ */
+     130           0 :     double solidAngle(double a, double b, double c)
+     131             :     {
+     132           0 :       return invHaversin((haversin(c) - haversin(a - b)) / (std::sin(a) * std::sin(b)));
+     133             :     }
+     134             :     //}
+     135             : 
+     136             :     //}
+     137             : 
+     138             :     /* triangleArea() //{ */
+     139             : 
+     140           0 :     double triangleArea(const double a, const double b, const double c)
+     141             :     {
+     142           0 :       double s = (a + b + c) / 2.0;
+     143           0 :       return std::sqrt(s * (s - a) * (s - b) * (s - c));
+     144             :     }
+     145             : 
+     146             :     //}
+     147             : 
+     148             :     /* sphericalTriangleArea //{ */
+     149           0 :     double sphericalTriangleArea(Eigen::Vector3d a, Eigen::Vector3d b, Eigen::Vector3d c)
+     150             :     {
+     151           0 :       double ab = angleBetween(a, b);
+     152           0 :       double bc = angleBetween(b, c);
+     153           0 :       double ca = angleBetween(c, a);
+     154             : 
+     155           0 :       if (ab < 1e-3 and bc < 1e-3 and ca < 1e-3)
+     156             :       {
+     157           0 :         return triangleArea(ab, bc, ca);
+     158             :       }
+     159             : 
+     160           0 :       double A = solidAngle(ca, ab, bc);
+     161           0 :       double B = solidAngle(ab, bc, ca);
+     162           0 :       double C = solidAngle(bc, ca, ab);
+     163             : 
+     164           0 :       return A + B + C - M_PI;
+     165             :     }
+     166             :     //}
+     167             : 
+     168             :     /* vector distance //{ */
+     169             : 
+     170      288960 :     double dist(const vec2_t& a, const vec2_t& b)
+     171             :     {
+     172             : 
+     173      288960 :       return (a - b).norm();
+     174             :     }
+     175             : 
+     176      194308 :     double dist(const vec3_t& a, const vec3_t& b)
+     177             :     {
+     178             : 
+     179      194308 :       return (a - b).norm();
+     180             :     }
+     181             : 
+     182             :     //}
+     183             : 
+     184             :   }  // namespace geometry
+     185             : }  // namespace mrs_lib
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/geometry/misc.cpp.gcov.overview.html b/mrs_lib/src/geometry/misc.cpp.gcov.overview.html new file mode 100644 index 0000000000..bdcd7dc00e --- /dev/null +++ b/mrs_lib/src/geometry/misc.cpp.gcov.overview.html @@ -0,0 +1,67 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/geometry/misc.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/src/geometry/misc.cpp.gcov.png b/mrs_lib/src/geometry/misc.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..ae4a5f86166101e9403d16475182cfe6bae4cdaf GIT binary patch literal 747 zcmVX!Z#y-%&@+7LS{G9BH$opGoGF?W z)&8!N@Lg-wJX@&&W(Em>TVN~80F}C;jiY`2Ej;cCi5I~4@;EbQMnz5NYr`PJ=}JFt zqDL4>b=6QsURQcqp5#3-waU9t4S>Sy($`(U((1|N&xgRO^;lw40ZsMTt_Rk@6-Skq zoQ<33$Aws|@epzXoJ#nK1P&|`c%DaD0vo-NS3K6y^R93m(^*Kq1CQ8yu!j}_gtA+l z3qdO4NUzfc2~ZDN(kM_R1L|$;BmAy4On4MC4eavJ{r#xWV}9FW<50u@4_&yh0M0=X%260*yHjVmZp|$Hi4drgpb)zDHdds58TAGtN#T&DuOV~=Zi1g{|f#W}!w8&zP!3FwmKQVFb@w%%XkE* + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/geometry/shapes.cpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/geometry - shapes.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:03350.0 %
Date:2024-04-18 23:11:36Functions:0680.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::geometry::Ray::twopointCast(Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1>)0
mrs_lib::geometry::Ray::directionCast(Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1>)0
mrs_lib::geometry::Ray::Ray(Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1>)0
mrs_lib::geometry::Ray::Ray()0
mrs_lib::geometry::Ray::~Ray()0
mrs_lib::geometry::Cone::Cone(Eigen::Matrix<double, 3, 1, 0, 3, 1>, double, double, Eigen::Matrix<double, 3, 1, 0, 3, 1>)0
mrs_lib::geometry::Cone::Cone()0
mrs_lib::geometry::Cone::~Cone()0
mrs_lib::geometry::Cuboid::Cuboid(Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Quaternion<double, 0>)0
mrs_lib::geometry::Cuboid::Cuboid(Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1>)0
mrs_lib::geometry::Cuboid::Cuboid(std::vector<Eigen::Matrix<double, 3, 1, 0, 3, 1>, std::allocator<Eigen::Matrix<double, 3, 1, 0, 3, 1> > >)0
mrs_lib::geometry::Cuboid::Cuboid()0
mrs_lib::geometry::Cuboid::~Cuboid()0
mrs_lib::geometry::Ellipse::Ellipse(Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Quaternion<double, 0>, double, double)0
mrs_lib::geometry::Ellipse::Ellipse()0
mrs_lib::geometry::Ellipse::~Ellipse()0
mrs_lib::geometry::Cylinder::Cylinder(Eigen::Matrix<double, 3, 1, 0, 3, 1>, double, double, Eigen::Quaternion<double, 0>)0
mrs_lib::geometry::Cylinder::Cylinder()0
mrs_lib::geometry::Cylinder::~Cylinder()0
mrs_lib::geometry::Triangle::Triangle(Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1>)0
mrs_lib::geometry::Triangle::Triangle()0
mrs_lib::geometry::Triangle::~Triangle()0
mrs_lib::geometry::Rectangle::Rectangle(Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1>)0
mrs_lib::geometry::Rectangle::Rectangle(std::vector<Eigen::Matrix<double, 3, 1, 0, 3, 1>, std::allocator<Eigen::Matrix<double, 3, 1, 0, 3, 1> > >)0
mrs_lib::geometry::Rectangle::Rectangle()0
mrs_lib::geometry::Rectangle::~Rectangle()0
mrs_lib::geometry::Ray::p1() const0
mrs_lib::geometry::Ray::p2() const0
mrs_lib::geometry::Ray::direction() const0
mrs_lib::geometry::Cone::projectPoint(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&) const0
mrs_lib::geometry::Cone::h() const0
mrs_lib::geometry::Cone::theta() const0
mrs_lib::geometry::Cone::center() const0
mrs_lib::geometry::Cone::getCap() const0
mrs_lib::geometry::Cone::origin() const0
mrs_lib::geometry::Cone::direction() const0
mrs_lib::geometry::Cuboid::getRectangle(int) const0
mrs_lib::geometry::Cuboid::lookupPoints(int) const0
mrs_lib::geometry::Cuboid::intersectionRay(mrs_lib::geometry::Ray, double) const0
mrs_lib::geometry::Cuboid::center() const0
mrs_lib::geometry::Cuboid::vertices() const0
mrs_lib::geometry::Ellipse::orientation() const0
mrs_lib::geometry::Ellipse::a() const0
mrs_lib::geometry::Ellipse::b() const0
mrs_lib::geometry::Ellipse::center() const0
mrs_lib::geometry::Cylinder::orientation() const0
mrs_lib::geometry::Cylinder::h() const0
mrs_lib::geometry::Cylinder::r() const0
mrs_lib::geometry::Cylinder::center() const0
mrs_lib::geometry::Cylinder::getCap(int) const0
mrs_lib::geometry::Triangle::intersectionRay(mrs_lib::geometry::Ray, double) const0
mrs_lib::geometry::Triangle::a() const0
mrs_lib::geometry::Triangle::b() const0
mrs_lib::geometry::Triangle::c() const0
mrs_lib::geometry::Triangle::center() const0
mrs_lib::geometry::Triangle::normal() const0
mrs_lib::geometry::Triangle::vertices() const0
mrs_lib::geometry::Rectangle::intersectionRay(mrs_lib::geometry::Ray, double) const0
mrs_lib::geometry::Rectangle::a() const0
mrs_lib::geometry::Rectangle::b() const0
mrs_lib::geometry::Rectangle::c() const0
mrs_lib::geometry::Rectangle::d() const0
mrs_lib::geometry::Rectangle::solidAngleRelativeTo(Eigen::Matrix<double, 3, 1, 0, 3, 1>) const0
mrs_lib::geometry::Rectangle::center() const0
mrs_lib::geometry::Rectangle::normal() const0
mrs_lib::geometry::Rectangle::isFacing(Eigen::Matrix<double, 3, 1, 0, 3, 1>) const0
mrs_lib::geometry::Rectangle::vertices() const0
mrs_lib::geometry::Rectangle::triangles() const0
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/geometry/shapes.cpp.func.html b/mrs_lib/src/geometry/shapes.cpp.func.html new file mode 100644 index 0000000000..518d43b513 --- /dev/null +++ b/mrs_lib/src/geometry/shapes.cpp.func.html @@ -0,0 +1,352 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/geometry/shapes.cpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/geometry - shapes.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:03350.0 %
Date:2024-04-18 23:11:36Functions:0680.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::geometry::Ray::twopointCast(Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1>)0
mrs_lib::geometry::Ray::directionCast(Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1>)0
mrs_lib::geometry::Ray::Ray(Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1>)0
mrs_lib::geometry::Ray::Ray()0
mrs_lib::geometry::Ray::~Ray()0
mrs_lib::geometry::Cone::Cone(Eigen::Matrix<double, 3, 1, 0, 3, 1>, double, double, Eigen::Matrix<double, 3, 1, 0, 3, 1>)0
mrs_lib::geometry::Cone::Cone()0
mrs_lib::geometry::Cone::~Cone()0
mrs_lib::geometry::Cuboid::Cuboid(Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Quaternion<double, 0>)0
mrs_lib::geometry::Cuboid::Cuboid(Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1>)0
mrs_lib::geometry::Cuboid::Cuboid(std::vector<Eigen::Matrix<double, 3, 1, 0, 3, 1>, std::allocator<Eigen::Matrix<double, 3, 1, 0, 3, 1> > >)0
mrs_lib::geometry::Cuboid::Cuboid()0
mrs_lib::geometry::Cuboid::~Cuboid()0
mrs_lib::geometry::Ellipse::Ellipse(Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Quaternion<double, 0>, double, double)0
mrs_lib::geometry::Ellipse::Ellipse()0
mrs_lib::geometry::Ellipse::~Ellipse()0
mrs_lib::geometry::Cylinder::Cylinder(Eigen::Matrix<double, 3, 1, 0, 3, 1>, double, double, Eigen::Quaternion<double, 0>)0
mrs_lib::geometry::Cylinder::Cylinder()0
mrs_lib::geometry::Cylinder::~Cylinder()0
mrs_lib::geometry::Triangle::Triangle(Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1>)0
mrs_lib::geometry::Triangle::Triangle()0
mrs_lib::geometry::Triangle::~Triangle()0
mrs_lib::geometry::Rectangle::Rectangle(Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1>)0
mrs_lib::geometry::Rectangle::Rectangle(std::vector<Eigen::Matrix<double, 3, 1, 0, 3, 1>, std::allocator<Eigen::Matrix<double, 3, 1, 0, 3, 1> > >)0
mrs_lib::geometry::Rectangle::Rectangle()0
mrs_lib::geometry::Rectangle::~Rectangle()0
mrs_lib::geometry::Ray::p1() const0
mrs_lib::geometry::Ray::p2() const0
mrs_lib::geometry::Ray::direction() const0
mrs_lib::geometry::Cone::projectPoint(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&) const0
mrs_lib::geometry::Cone::h() const0
mrs_lib::geometry::Cone::theta() const0
mrs_lib::geometry::Cone::center() const0
mrs_lib::geometry::Cone::getCap() const0
mrs_lib::geometry::Cone::origin() const0
mrs_lib::geometry::Cone::direction() const0
mrs_lib::geometry::Cuboid::getRectangle(int) const0
mrs_lib::geometry::Cuboid::lookupPoints(int) const0
mrs_lib::geometry::Cuboid::intersectionRay(mrs_lib::geometry::Ray, double) const0
mrs_lib::geometry::Cuboid::center() const0
mrs_lib::geometry::Cuboid::vertices() const0
mrs_lib::geometry::Ellipse::orientation() const0
mrs_lib::geometry::Ellipse::a() const0
mrs_lib::geometry::Ellipse::b() const0
mrs_lib::geometry::Ellipse::center() const0
mrs_lib::geometry::Cylinder::orientation() const0
mrs_lib::geometry::Cylinder::h() const0
mrs_lib::geometry::Cylinder::r() const0
mrs_lib::geometry::Cylinder::center() const0
mrs_lib::geometry::Cylinder::getCap(int) const0
mrs_lib::geometry::Triangle::intersectionRay(mrs_lib::geometry::Ray, double) const0
mrs_lib::geometry::Triangle::a() const0
mrs_lib::geometry::Triangle::b() const0
mrs_lib::geometry::Triangle::c() const0
mrs_lib::geometry::Triangle::center() const0
mrs_lib::geometry::Triangle::normal() const0
mrs_lib::geometry::Triangle::vertices() const0
mrs_lib::geometry::Rectangle::intersectionRay(mrs_lib::geometry::Ray, double) const0
mrs_lib::geometry::Rectangle::a() const0
mrs_lib::geometry::Rectangle::b() const0
mrs_lib::geometry::Rectangle::c() const0
mrs_lib::geometry::Rectangle::d() const0
mrs_lib::geometry::Rectangle::solidAngleRelativeTo(Eigen::Matrix<double, 3, 1, 0, 3, 1>) const0
mrs_lib::geometry::Rectangle::center() const0
mrs_lib::geometry::Rectangle::normal() const0
mrs_lib::geometry::Rectangle::isFacing(Eigen::Matrix<double, 3, 1, 0, 3, 1>) const0
mrs_lib::geometry::Rectangle::vertices() const0
mrs_lib::geometry::Rectangle::triangles() const0
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/geometry/shapes.cpp.gcov.frameset.html b/mrs_lib/src/geometry/shapes.cpp.gcov.frameset.html new file mode 100644 index 0000000000..d1dafd1fc9 --- /dev/null +++ b/mrs_lib/src/geometry/shapes.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/geometry/shapes.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/src/geometry/shapes.cpp.gcov.html b/mrs_lib/src/geometry/shapes.cpp.gcov.html new file mode 100644 index 0000000000..3607197fb1 --- /dev/null +++ b/mrs_lib/src/geometry/shapes.cpp.gcov.html @@ -0,0 +1,730 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/geometry/shapes.cpp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/geometry - shapes.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:03350.0 %
Date:2024-04-18 23:11:36Functions:0680.0 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : // clang: MatousFormat
+       2             : #include <mrs_lib/geometry/shapes.h>
+       3             : #include <mrs_lib/geometry/misc.h>
+       4             : 
+       5             : namespace mrs_lib
+       6             : {
+       7             :   namespace geometry
+       8             :   {
+       9             : 
+      10             :     /* Ray //{ */
+      11             : 
+      12             :     /* constructors //{ */
+      13           0 :     Ray::Ray()
+      14             :     {
+      15           0 :       point1 = Eigen::Vector3d::Zero();
+      16           0 :       point2 = Eigen::Vector3d::Zero();
+      17           0 :     }
+      18             : 
+      19           0 :     Ray::Ray(Eigen::Vector3d p1, Eigen::Vector3d p2)
+      20             :     {
+      21           0 :       point1 = p1;
+      22           0 :       point2 = p2;
+      23           0 :     }
+      24             : 
+      25           0 :     Ray::~Ray()
+      26             :     {
+      27           0 :     }
+      28             :     //}
+      29             : 
+      30             :     /* getters //{ */
+      31           0 :     const Eigen::Vector3d Ray::p1() const
+      32             :     {
+      33           0 :       return point1;
+      34             :     }
+      35             : 
+      36           0 :     const Eigen::Vector3d Ray::p2() const
+      37             :     {
+      38           0 :       return point2;
+      39             :     }
+      40             : 
+      41           0 :     const Eigen::Vector3d Ray::direction() const
+      42             :     {
+      43           0 :       return (point2 - point1);
+      44             :     }
+      45             :     //}
+      46             : 
+      47             :     /* raycasting //{ */
+      48           0 :     Ray Ray::twopointCast(Eigen::Vector3d pointFrom, Eigen::Vector3d pointTo)
+      49             :     {
+      50           0 :       return Ray(pointFrom, pointTo);
+      51             :     }
+      52             : 
+      53           0 :     Ray Ray::directionCast(Eigen::Vector3d origin, Eigen::Vector3d direction)
+      54             :     {
+      55           0 :       return Ray(origin, origin + direction);
+      56             :     }
+      57             :     //}
+      58             : 
+      59             :     //}
+      60             : 
+      61             :     /* Triangle //{ */
+      62             : 
+      63             :     /* constructors //{ */
+      64           0 :     Triangle::Triangle()
+      65             :     {
+      66           0 :       point1 = Eigen::Vector3d(0, 0, 0);
+      67           0 :       point2 = Eigen::Vector3d(1, 0, 0);
+      68           0 :       point3 = Eigen::Vector3d(0, 0, 1);
+      69           0 :     }
+      70             : 
+      71           0 :     Triangle::Triangle(Eigen::Vector3d a, Eigen::Vector3d b, Eigen::Vector3d c)
+      72             :     {
+      73           0 :       point1 = a;
+      74           0 :       point2 = b;
+      75           0 :       point3 = c;
+      76           0 :     }
+      77             : 
+      78           0 :     Triangle::~Triangle()
+      79             :     {
+      80           0 :     }
+      81             :     //}
+      82             : 
+      83             :     /* getters //{ */
+      84           0 :     const Eigen::Vector3d Triangle::a() const
+      85             :     {
+      86           0 :       return point1;
+      87             :     }
+      88             : 
+      89           0 :     const Eigen::Vector3d Triangle::b() const
+      90             :     {
+      91           0 :       return point2;
+      92             :     }
+      93             : 
+      94           0 :     const Eigen::Vector3d Triangle::c() const
+      95             :     {
+      96           0 :       return point3;
+      97             :     }
+      98             : 
+      99           0 :     const Eigen::Vector3d Triangle::normal() const
+     100             :     {
+     101           0 :       Eigen::Vector3d n;
+     102           0 :       n = (point2 - point1).cross(point3 - point1);
+     103           0 :       return n.normalized();
+     104             :     }
+     105             : 
+     106           0 :     const Eigen::Vector3d Triangle::center() const
+     107             :     {
+     108           0 :       return (point1 + point2 + point3) / 3.0;
+     109             :     }
+     110             : 
+     111           0 :     const std::vector<Eigen::Vector3d> Triangle::vertices() const
+     112             :     {
+     113           0 :       std::vector<Eigen::Vector3d> vertices;
+     114           0 :       vertices.push_back(point1);
+     115           0 :       vertices.push_back(point2);
+     116           0 :       vertices.push_back(point3);
+     117           0 :       return vertices;
+     118             :     }
+     119             :     //}
+     120             : 
+     121             :     /* intersectionRay //{ */
+     122           0 :     const boost::optional<Eigen::Vector3d> Triangle::intersectionRay(Ray r, double epsilon) const
+     123             :     {
+     124             :       // The Möller–Trumbore algorithm
+     125             :       // https://en.wikipedia.org/wiki/M%C3%B6ller%E2%80%93Trumbore_intersection_algorithm
+     126           0 :       Eigen::Vector3d v1 = point2 - point1;
+     127           0 :       Eigen::Vector3d v2 = point3 - point1;
+     128           0 :       Eigen::Vector3d h = r.direction().cross(v2);
+     129           0 :       double res = v1.dot(h);
+     130           0 :       if (res > -epsilon && res < epsilon)
+     131             :       {
+     132           0 :         return boost::none;
+     133             :       }
+     134           0 :       double f = 1.0 / res;
+     135           0 :       Eigen::Vector3d s = r.p1() - point1;
+     136           0 :       double u = f * s.dot(h);
+     137           0 :       if (u < 0.0 || u > 1.0)
+     138             :       {
+     139           0 :         return boost::none;
+     140             :       }
+     141           0 :       Eigen::Vector3d q = s.cross(v1);
+     142           0 :       double v = f * r.direction().dot(q);
+     143           0 :       if (v < 0.0 || u + v > 1.0)
+     144             :       {
+     145           0 :         return boost::none;
+     146             :       }
+     147           0 :       double t = f * v2.dot(q);
+     148           0 :       if (t > epsilon)
+     149             :       {
+     150           0 :         Eigen::Vector3d ret = r.p1() + r.direction() * t;
+     151           0 :         return ret;
+     152             :       }
+     153           0 :       return boost::none;
+     154             :     }
+     155             :     //}
+     156             : 
+     157             :     //}
+     158             : 
+     159             :     /* Rectangle //{ */
+     160             : 
+     161             :     /* constructors //{ */
+     162           0 :     Rectangle::Rectangle()
+     163             :     {
+     164           0 :       point1 = Eigen::Vector3d(0, 0, 0);
+     165           0 :       point2 = Eigen::Vector3d(1, 0, 0);
+     166           0 :       point3 = Eigen::Vector3d(1, 1, 0);
+     167           0 :       point4 = Eigen::Vector3d(0, 1, 0);
+     168           0 :     }
+     169             : 
+     170           0 :     Rectangle::Rectangle(std::vector<Eigen::Vector3d> points)
+     171             :     {
+     172           0 :       point1 = points[0];
+     173           0 :       point2 = points[1];
+     174           0 :       point3 = points[2];
+     175           0 :       point4 = points[3];
+     176           0 :     }
+     177             : 
+     178           0 :     Rectangle::Rectangle(Eigen::Vector3d a, Eigen::Vector3d b, Eigen::Vector3d c, Eigen::Vector3d d)
+     179             :     {
+     180           0 :       point1 = a;
+     181           0 :       point2 = b;
+     182           0 :       point3 = c;
+     183           0 :       point4 = d;
+     184           0 :     }
+     185             : 
+     186           0 :     Rectangle::~Rectangle()
+     187             :     {
+     188           0 :     }
+     189             :     //}
+     190             : 
+     191             :     /* getters //{ */
+     192           0 :     const Eigen::Vector3d Rectangle::a() const
+     193             :     {
+     194           0 :       return point1;
+     195             :     }
+     196             : 
+     197           0 :     const Eigen::Vector3d Rectangle::b() const
+     198             :     {
+     199           0 :       return point2;
+     200             :     }
+     201             : 
+     202           0 :     const Eigen::Vector3d Rectangle::c() const
+     203             :     {
+     204           0 :       return point3;
+     205             :     }
+     206             : 
+     207           0 :     const Eigen::Vector3d Rectangle::d() const
+     208             :     {
+     209           0 :       return point4;
+     210             :     }
+     211             : 
+     212           0 :     const Eigen::Vector3d Rectangle::center() const
+     213             :     {
+     214           0 :       return (point1 + point2 + point3 + point4) / 4.0;
+     215             :     }
+     216             : 
+     217           0 :     const Eigen::Vector3d Rectangle::normal() const
+     218             :     {
+     219           0 :       Eigen::Vector3d n;
+     220           0 :       n = (point2 - point1).cross(point4 - point1);
+     221           0 :       return n.normalized();
+     222             :     }
+     223             : 
+     224           0 :     const std::vector<Eigen::Vector3d> Rectangle::vertices() const
+     225             :     {
+     226           0 :       std::vector<Eigen::Vector3d> vertices;
+     227           0 :       vertices.push_back(point1);
+     228           0 :       vertices.push_back(point2);
+     229           0 :       vertices.push_back(point3);
+     230           0 :       vertices.push_back(point4);
+     231           0 :       return vertices;
+     232             :     }
+     233             : 
+     234           0 :     const std::vector<Triangle> Rectangle::triangles() const
+     235             :     {
+     236           0 :       Triangle t1(point1, point2, point3);
+     237           0 :       Triangle t2(point1, point3, point4);
+     238             : 
+     239           0 :       std::vector<Triangle> triangles;
+     240           0 :       triangles.push_back(t1);
+     241           0 :       triangles.push_back(t2);
+     242           0 :       return triangles;
+     243             :     }
+     244             :     //}
+     245             : 
+     246             :     /* intersectionRay //{ */
+     247           0 :     const boost::optional<Eigen::Vector3d> Rectangle::intersectionRay(Ray r, double epsilon) const
+     248             :     {
+     249           0 :       Triangle t1 = triangles()[0];
+     250           0 :       Triangle t2 = triangles()[1];
+     251           0 :       auto result = t1.intersectionRay(r, epsilon);
+     252           0 :       if (result != boost::none)
+     253             :       {
+     254           0 :         return result;
+     255             :       }
+     256           0 :       return t2.intersectionRay(r, epsilon);
+     257             :     }
+     258             :     //}
+     259             : 
+     260             :     /* isFacing //{ */
+     261           0 :     bool Rectangle::isFacing(Eigen::Vector3d point) const
+     262             :     {
+     263           0 :       Eigen::Vector3d towards_point = point - center();
+     264           0 :       double dot_product = towards_point.dot(normal());
+     265           0 :       return dot_product > 0;
+     266             :     }
+     267             : 
+     268             :     //}
+     269             : 
+     270             :     /* solidAngleRelativeTo //{ */
+     271           0 :     double Rectangle::solidAngleRelativeTo(Eigen::Vector3d point) const
+     272             :     {
+     273           0 :       Eigen::Vector3d a = point1 - point;
+     274           0 :       Eigen::Vector3d b = point2 - point;
+     275           0 :       Eigen::Vector3d c = point3 - point;
+     276           0 :       Eigen::Vector3d d = point4 - point;
+     277             : 
+     278           0 :       a.normalize();
+     279           0 :       b.normalize();
+     280           0 :       c.normalize();
+     281           0 :       d.normalize();
+     282             : 
+     283           0 :       double t1 = mrs_lib::geometry::sphericalTriangleArea(a, b, c);
+     284           0 :       double t2 = mrs_lib::geometry::sphericalTriangleArea(c, d, a);
+     285             : 
+     286           0 :       return t1 + t2;
+     287             :     }
+     288             :     //}
+     289             : 
+     290             :     //}
+     291             : 
+     292             :     /* Cuboid //{ */
+     293             : 
+     294             :     /* constructors //{ */
+     295           0 :     Cuboid::Cuboid()
+     296             :     {
+     297           0 :       for (int i = 0; i < 8; i++)
+     298             :       {
+     299           0 :         points.push_back(Eigen::Vector3d::Zero());
+     300             :       }
+     301           0 :     }
+     302             : 
+     303           0 :     Cuboid::Cuboid(Eigen::Vector3d p0, Eigen::Vector3d p1, Eigen::Vector3d p2, Eigen::Vector3d p3, Eigen::Vector3d p4, Eigen::Vector3d p5, Eigen::Vector3d p6,
+     304           0 :                    Eigen::Vector3d p7)
+     305             :     {
+     306           0 :       points.push_back(p0);
+     307           0 :       points.push_back(p1);
+     308           0 :       points.push_back(p2);
+     309           0 :       points.push_back(p3);
+     310           0 :       points.push_back(p4);
+     311           0 :       points.push_back(p5);
+     312           0 :       points.push_back(p6);
+     313           0 :       points.push_back(p7);
+     314           0 :     }
+     315             : 
+     316           0 :     Cuboid::Cuboid(std::vector<Eigen::Vector3d> points)
+     317             :     {
+     318           0 :       this->points = points;
+     319           0 :     }
+     320             : 
+     321           0 :     Cuboid::Cuboid(Eigen::Vector3d center, Eigen::Vector3d size, Eigen::Quaterniond orientation)
+     322             :     {
+     323           0 :       Eigen::Vector3d p0(size.x() / 2.0, -size.y() / 2.0, -size.z() / 2.0);
+     324           0 :       Eigen::Vector3d p1(size.x() / 2.0, size.y() / 2.0, -size.z() / 2.0);
+     325           0 :       Eigen::Vector3d p2(size.x() / 2.0, size.y() / 2.0, size.z() / 2.0);
+     326           0 :       Eigen::Vector3d p3(size.x() / 2.0, -size.y() / 2.0, size.z() / 2.0);
+     327             : 
+     328           0 :       Eigen::Vector3d p4(-size.x() / 2.0, size.y() / 2.0, -size.z() / 2.0);
+     329           0 :       Eigen::Vector3d p5(-size.x() / 2.0, -size.y() / 2.0, -size.z() / 2.0);
+     330           0 :       Eigen::Vector3d p6(-size.x() / 2.0, -size.y() / 2.0, size.z() / 2.0);
+     331           0 :       Eigen::Vector3d p7(-size.x() / 2.0, size.y() / 2.0, size.z() / 2.0);
+     332             : 
+     333           0 :       p0 = center + orientation * p0;
+     334           0 :       p1 = center + orientation * p1;
+     335           0 :       p2 = center + orientation * p2;
+     336           0 :       p3 = center + orientation * p3;
+     337             : 
+     338           0 :       p4 = center + orientation * p4;
+     339           0 :       p5 = center + orientation * p5;
+     340           0 :       p6 = center + orientation * p6;
+     341           0 :       p7 = center + orientation * p7;
+     342             : 
+     343           0 :       points.push_back(p0);
+     344           0 :       points.push_back(p1);
+     345           0 :       points.push_back(p2);
+     346           0 :       points.push_back(p3);
+     347           0 :       points.push_back(p4);
+     348           0 :       points.push_back(p5);
+     349           0 :       points.push_back(p6);
+     350           0 :       points.push_back(p7);
+     351           0 :     }
+     352             : 
+     353           0 :     Cuboid::~Cuboid()
+     354             :     {
+     355           0 :     }
+     356             :     //}
+     357             : 
+     358             :     /* lookupPoints //{ */
+     359           0 :     std::vector<Eigen::Vector3d> Cuboid::lookupPoints(int face_idx) const
+     360             :     {
+     361           0 :       std::vector<Eigen::Vector3d> lookup;
+     362           0 :       switch (face_idx)
+     363             :       {
+     364           0 :         case Cuboid::FRONT:
+     365           0 :           lookup.push_back(points[0]);
+     366           0 :           lookup.push_back(points[1]);
+     367           0 :           lookup.push_back(points[2]);
+     368           0 :           lookup.push_back(points[3]);
+     369           0 :           break;
+     370           0 :         case Cuboid::BACK:
+     371           0 :           lookup.push_back(points[4]);
+     372           0 :           lookup.push_back(points[5]);
+     373           0 :           lookup.push_back(points[6]);
+     374           0 :           lookup.push_back(points[7]);
+     375           0 :           break;
+     376           0 :         case Cuboid::LEFT:
+     377           0 :           lookup.push_back(points[1]);
+     378           0 :           lookup.push_back(points[4]);
+     379           0 :           lookup.push_back(points[7]);
+     380           0 :           lookup.push_back(points[2]);
+     381           0 :           break;
+     382           0 :         case Cuboid::RIGHT:
+     383           0 :           lookup.push_back(points[5]);
+     384           0 :           lookup.push_back(points[0]);
+     385           0 :           lookup.push_back(points[3]);
+     386           0 :           lookup.push_back(points[6]);
+     387           0 :           break;
+     388           0 :         case Cuboid::BOTTOM:
+     389           0 :           lookup.push_back(points[5]);
+     390           0 :           lookup.push_back(points[4]);
+     391           0 :           lookup.push_back(points[1]);
+     392           0 :           lookup.push_back(points[0]);
+     393           0 :           break;
+     394           0 :         case Cuboid::TOP:
+     395           0 :           lookup.push_back(points[3]);
+     396           0 :           lookup.push_back(points[2]);
+     397           0 :           lookup.push_back(points[7]);
+     398           0 :           lookup.push_back(points[6]);
+     399           0 :           break;
+     400             :       }
+     401           0 :       return lookup;
+     402             :     }
+     403             :     //}
+     404             : 
+     405             :     /* getters //{ */
+     406           0 :     const std::vector<Eigen::Vector3d> Cuboid::vertices() const
+     407             :     {
+     408           0 :       return points;
+     409             :     }
+     410             : 
+     411           0 :     const Rectangle Cuboid::getRectangle(int face_idx) const
+     412             :     {
+     413           0 :       return Rectangle(lookupPoints(face_idx));
+     414             :     }
+     415             : 
+     416           0 :     const Eigen::Vector3d Cuboid::center() const
+     417             :     {
+     418           0 :       Eigen::Vector3d point_sum = points[0];
+     419           0 :       for (int i = 1; i < 8; i++)
+     420             :       {
+     421           0 :         point_sum += points[i];
+     422             :       }
+     423           0 :       return point_sum / 8.0;
+     424             :     }
+     425             :     //}
+     426             : 
+     427             :     /* intersectionRay //{ */
+     428           0 :     const std::vector<Eigen::Vector3d> Cuboid::intersectionRay(Ray r, double epsilon) const
+     429             :     {
+     430           0 :       std::vector<Eigen::Vector3d> ret;
+     431           0 :       for (int i = 0; i < 6; i++)
+     432             :       {
+     433           0 :         Rectangle side = getRectangle(i);
+     434           0 :         auto side_intersect = side.intersectionRay(r, epsilon);
+     435           0 :         if (side_intersect != boost::none)
+     436             :         {
+     437           0 :           ret.push_back(side_intersect.get());
+     438             :         }
+     439             :       }
+     440           0 :       return ret;
+     441             :     }
+     442             :     //}
+     443             : 
+     444             :     //}
+     445             : 
+     446             :     /* Ellipse //{ */
+     447             : 
+     448             :     /* constructors //{ */
+     449           0 :     Ellipse::Ellipse()
+     450             :     {
+     451           0 :     }
+     452             : 
+     453           0 :     Ellipse::~Ellipse()
+     454             :     {
+     455           0 :     }
+     456             : 
+     457           0 :     Ellipse::Ellipse(Eigen::Vector3d center, Eigen::Quaterniond orientation, double a, double b)
+     458             :     {
+     459           0 :       center_point = center;
+     460           0 :       absolute_orientation = orientation;
+     461           0 :       major_semi = a;
+     462           0 :       minor_semi = b;
+     463           0 :     }
+     464             :     //}
+     465             : 
+     466             :     /* getters //{ */
+     467           0 :     double Ellipse::a() const
+     468             :     {
+     469           0 :       return major_semi;
+     470             :     }
+     471             : 
+     472           0 :     double Ellipse::b() const
+     473             :     {
+     474           0 :       return minor_semi;
+     475             :     }
+     476             : 
+     477           0 :     const Eigen::Vector3d Ellipse::center() const
+     478             :     {
+     479           0 :       return center_point;
+     480             :     }
+     481             : 
+     482           0 :     const Eigen::Quaterniond Ellipse::orientation() const
+     483             :     {
+     484           0 :       return absolute_orientation;
+     485             :     }
+     486             : 
+     487             :     //}
+     488             : 
+     489             :     //}
+     490             : 
+     491             :     /* Cylinder //{ */
+     492             : 
+     493             :     /* constructors //{ */
+     494           0 :     Cylinder::Cylinder()
+     495             :     {
+     496           0 :     }
+     497             : 
+     498           0 :     Cylinder::~Cylinder()
+     499             :     {
+     500           0 :     }
+     501             : 
+     502           0 :     Cylinder::Cylinder(Eigen::Vector3d center, double radius, double height, Eigen::Quaterniond orientation)
+     503             :     {
+     504           0 :       this->center_point = center;
+     505           0 :       this->radius = radius;
+     506           0 :       this->height = height;
+     507           0 :       this->absolute_orientation = orientation;
+     508           0 :     }
+     509             :     //}
+     510             : 
+     511             :     /* getters //{ */
+     512           0 :     const Eigen::Vector3d Cylinder::center() const
+     513             :     {
+     514           0 :       return center_point;
+     515             :     }
+     516             : 
+     517           0 :     const Eigen::Quaterniond Cylinder::orientation() const
+     518             :     {
+     519           0 :       return absolute_orientation;
+     520             :     }
+     521             : 
+     522           0 :     double Cylinder::r() const
+     523             :     {
+     524           0 :       return radius;
+     525             :     }
+     526             : 
+     527           0 :     double Cylinder::h() const
+     528             :     {
+     529           0 :       return height;
+     530             :     }
+     531             : 
+     532           0 :     const Ellipse Cylinder::getCap(int index) const
+     533             :     {
+     534           0 :       Ellipse e;
+     535           0 :       Eigen::Vector3d ellipse_center;
+     536           0 :       switch (index)
+     537             :       {
+     538           0 :         case Cylinder::BOTTOM:
+     539           0 :           ellipse_center = center() - orientation() * (Eigen::Vector3d::UnitZ() * (h() / 2.0));
+     540           0 :           e = Ellipse(ellipse_center, orientation(), r(), r());
+     541           0 :           break;
+     542           0 :         case Cylinder::TOP:
+     543           0 :           ellipse_center = center() + orientation() * (Eigen::Vector3d::UnitZ() * (h() / 2.0));
+     544           0 :           e = Ellipse(ellipse_center, orientation(), r(), r());
+     545           0 :           break;
+     546             :       }
+     547           0 :       return e;
+     548             :     }
+     549             : 
+     550             :     //}
+     551             : 
+     552             :     //}
+     553             : 
+     554             :     /* Cone //{ */
+     555             : 
+     556             :     /* constructors //{ */
+     557           0 :     Cone::Cone()
+     558             :     {
+     559           0 :     }
+     560             : 
+     561           0 :     Cone::~Cone()
+     562             :     {
+     563           0 :     }
+     564             : 
+     565           0 :     Cone::Cone(Eigen::Vector3d origin_point, double angle, double height, Eigen::Vector3d absolute_direction)
+     566             :     {
+     567           0 :       this->origin_point = origin_point;
+     568           0 :       this->angle = angle;
+     569           0 :       this->height = height;
+     570           0 :       this->absolute_direction = absolute_direction.normalized();
+     571           0 :     }
+     572             :     //}
+     573             : 
+     574             :     /* getters //{ */
+     575           0 :     const Eigen::Vector3d Cone::origin() const
+     576             :     {
+     577           0 :       return origin_point;
+     578             :     }
+     579             : 
+     580           0 :     const Eigen::Vector3d Cone::direction() const
+     581             :     {
+     582           0 :       return absolute_direction;
+     583             :     }
+     584             : 
+     585           0 :     const Eigen::Vector3d Cone::center() const
+     586             :     {
+     587           0 :       return origin() + (0.5 * h()) * direction();
+     588             :     }
+     589             : 
+     590           0 :     double Cone::theta() const
+     591             :     {
+     592           0 :       return angle;
+     593             :     }
+     594             : 
+     595           0 :     double Cone::h() const
+     596             :     {
+     597           0 :       return height;
+     598             :     }
+     599             : 
+     600           0 :     const Ellipse Cone::getCap() const
+     601             :     {
+     602           0 :       Eigen::Vector3d ellipse_center = origin() + direction() * h();
+     603           0 :       Eigen::Quaterniond ellipse_orientation = Eigen::Quaterniond::FromTwoVectors(Eigen::Vector3d::UnitZ(), direction());
+     604           0 :       double cap_radius = std::tan(theta()) * h();
+     605           0 :       Ellipse e(ellipse_center, ellipse_orientation, cap_radius, cap_radius);
+     606           0 :       return e;
+     607             :     }
+     608             : 
+     609           0 :     const std::optional<Eigen::Vector3d> Cone::projectPoint(const Eigen::Vector3d& point) const
+     610             :     {
+     611             : 
+     612           0 :       Eigen::Vector3d point_vec = point - origin();
+     613           0 :       double point_axis_angle = acos((point_vec.dot(direction())) / (point_vec.norm() * direction().norm()));
+     614             : 
+     615             :       /* Eigen::Vector3d axis_projection = this->cone_axis_projector * point_vec + origin(); */
+     616             : 
+     617           0 :       Eigen::Vector3d axis_rot = direction().cross(point_vec);
+     618           0 :       axis_rot.normalize();
+     619             : 
+     620           0 :       Eigen::AngleAxis<double> my_quat(this->angle - point_axis_angle, axis_rot);
+     621             : 
+     622           0 :       Eigen::Vector3d point_on_cone = my_quat * point_vec + origin();
+     623             : 
+     624           0 :       Eigen::Vector3d vec_point_on_cone = point_on_cone - origin();
+     625           0 :       vec_point_on_cone.normalize();
+     626             : 
+     627           0 :       double beta = this->angle - point_axis_angle;
+     628             : 
+     629           0 :       if (point_axis_angle < this->angle)
+     630             :       {
+     631           0 :         return origin() + vec_point_on_cone * cos(beta) * point_vec.norm();
+     632           0 :       } else if ((point_axis_angle >= this->angle) && (point_axis_angle - this->angle) <= M_PI / 2.0)
+     633             :       {  // TODO: is this condition correct?
+     634           0 :         return origin() + vec_point_on_cone * cos(point_axis_angle - this->angle) * point_vec.norm();
+     635             :       } else
+     636             :       {
+     637           0 :         return {};
+     638             :       }
+     639             :     }
+     640             : 
+     641             :     //}
+     642             : 
+     643             :     //}
+     644             : 
+     645             :   }  // namespace geometry
+     646             : }  // namespace mrs_lib
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/geometry/shapes.cpp.gcov.overview.html b/mrs_lib/src/geometry/shapes.cpp.gcov.overview.html new file mode 100644 index 0000000000..5be5367fd4 --- /dev/null +++ b/mrs_lib/src/geometry/shapes.cpp.gcov.overview.html @@ -0,0 +1,182 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/geometry/shapes.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/src/geometry/shapes.cpp.gcov.png b/mrs_lib/src/geometry/shapes.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..a648ccdf3602fb84c64b5d246adb511476145fd2 GIT binary patch literal 1596 zcmV-C2E+M@P)t0{{R3FUJ9e0000OP)t-s|NsB0 zs;a7|?_FK${{R500003000620&P%hU00009a7bBm000ie000ie0hKEb8vpQ- z-wPHl5SPm+yO6z&PYOr^P9n+1@kR3M{@Z_g3O@S#`ToIR+h+E%QRNNPB1r)ds^Rpk*;#9^U&pUfTf}2cP8+^N zcKL2HZVH|n(n7|XmFis*GV~H7EzUGkmf6l3lNIgzD17Rs?g{F1xqFzUM8*vixNau% z{;hSzxJ@4GG1@~ak60qxRj`E^nMPMZpBCVOz_C7sQ%en+;lGl14+S3r9N9gX>@Rmd zDl7J?>-CS!UCEe|D9j}gz45${U7)gb2#HDesLDzbB`SP6xbAt&(zbfMALn*Y zq7)b~u&zQ=)(G$UtOFS=PT|Nf%$|&lo3ByPOuj9MtO>bd)>Jpnw&8LdHppNrjZH$R^`ywOrVs^ zt%0oKHC&(U_%V-sgh~XIR*h@XHwII?o_>-CQ^}DL%xi7a0Q=U6O+%VR)JZg(XF7Tw`$vIbl+3uU|>xeqYY5#>rfba%` zNra!8RW*>4h6a)nFOdm>F#Ay+(#gR8luRhMHKZ#5$JxhTuIv2tl`t7^ z(k&ui2whm;)%|wo-f0Bd%X05y}uucO218WNSWBom>|4$9az2@m;#;~T&&des$ zm9;c*P6B5K&Sj@ajslL9#o?DO!*kR7`o!l_V(}EdKHWW%4CGTddC|OW*0pTqz(|}X z+^&{ch@T|C!7OY_ex^ES6NwGUPbjZ==g_f^`LJq|B>EJPf0|}emX z4M6G~vIICgmcn!5yuXeqP@CUF07v*eUq$BR#1&{YdZhEnBo4~OLpJymY=g)wv}k_I z+f7C;NJO0C7Hv#dO@I7UwJw^(y4kS0ik4whUx}AlG)KJ!;XbB0BeaBRhBcQSHMv5D z1pde{)J!M(b^VbO{BaWigp(CXoin?qCA&u)$PcYl{-A|1S#ZN>2RuhSY`e3l>ozby z^Z7Q4VtXX`e|8J|9{QBJh5bfmoXgcOz&6}1jO&9oiF0_tEv$@E0NSa|k|=Zwvxgw! zKrHJP_Ilox?C{0H4+x(Rk?A!u+9fM0@7!6-EhO+m$zW6#^>J&IT1<102^_EZqP*0G z*X^l+voLySg*Wa6_d2%$UcTSJ&vdy8$ zk{muhlULEXznaP9YLk=kSfq_?GF#>W#4DA2*CG*aPc%5Vpqty6%$QtYA$4A{LDH%f zobkoZmr0CWizmcHS$k!2lajU9N{m@}6E9VIn+5LQY2zP1DEB2+bwco{nnC6vNXEOW u8QsJ6Nc;aklm)h=&%Y<@AI1P2+Jt}f$c2VCd;yIB0000 + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/math + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/mathHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:1717100.0 %
Date:2024-04-18 23:11:36Functions:11100.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
math.cpp +
100.0%
+
100.0 %17 / 17100.0 %1 / 1
<unnamed>100.0 %17 / 17100.0 %1 / 1
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/math/index-detail-sort-l.html b/mrs_lib/src/math/index-detail-sort-l.html new file mode 100644 index 0000000000..33430467f7 --- /dev/null +++ b/mrs_lib/src/math/index-detail-sort-l.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/math + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/mathHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:1717100.0 %
Date:2024-04-18 23:11:36Functions:11100.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
math.cpp +
100.0%
+
100.0 %17 / 17100.0 %1 / 1
<unnamed>100.0 %17 / 17100.0 %1 / 1
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/math/index-detail.html b/mrs_lib/src/math/index-detail.html new file mode 100644 index 0000000000..ae8b3d829a --- /dev/null +++ b/mrs_lib/src/math/index-detail.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/math + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/mathHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:1717100.0 %
Date:2024-04-18 23:11:36Functions:11100.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
math.cpp +
100.0%
+
100.0 %17 / 17100.0 %1 / 1
<unnamed>100.0 %17 / 17100.0 %1 / 1
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/math/index-sort-f.html b/mrs_lib/src/math/index-sort-f.html new file mode 100644 index 0000000000..4209ab339d --- /dev/null +++ b/mrs_lib/src/math/index-sort-f.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/math + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/mathHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:1717100.0 %
Date:2024-04-18 23:11:36Functions:11100.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
math.cpp +
100.0%
+
100.0 %17 / 17100.0 %1 / 1
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/math/index-sort-l.html b/mrs_lib/src/math/index-sort-l.html new file mode 100644 index 0000000000..a3adc71e10 --- /dev/null +++ b/mrs_lib/src/math/index-sort-l.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/math + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/mathHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:1717100.0 %
Date:2024-04-18 23:11:36Functions:11100.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
math.cpp +
100.0%
+
100.0 %17 / 17100.0 %1 / 1
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/math/index.html b/mrs_lib/src/math/index.html new file mode 100644 index 0000000000..d91132e32c --- /dev/null +++ b/mrs_lib/src/math/index.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/math + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/mathHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:1717100.0 %
Date:2024-04-18 23:11:36Functions:11100.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
math.cpp +
100.0%
+
100.0 %17 / 17100.0 %1 / 1
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/math/math.cpp.func-sort-c.html b/mrs_lib/src/math/math.cpp.func-sort-c.html new file mode 100644 index 0000000000..4b1df0796b --- /dev/null +++ b/mrs_lib/src/math/math.cpp.func-sort-c.html @@ -0,0 +1,84 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/math/math.cpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/math - math.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:1717100.0 %
Date:2024-04-18 23:11:36Functions:11100.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::probit(double)202
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/math/math.cpp.func.html b/mrs_lib/src/math/math.cpp.func.html new file mode 100644 index 0000000000..66a1133e26 --- /dev/null +++ b/mrs_lib/src/math/math.cpp.func.html @@ -0,0 +1,84 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/math/math.cpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/math - math.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:1717100.0 %
Date:2024-04-18 23:11:36Functions:11100.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::probit(double)202
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/math/math.cpp.gcov.frameset.html b/mrs_lib/src/math/math.cpp.gcov.frameset.html new file mode 100644 index 0000000000..55135a4804 --- /dev/null +++ b/mrs_lib/src/math/math.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/math/math.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/src/math/math.cpp.gcov.html b/mrs_lib/src/math/math.cpp.gcov.html new file mode 100644 index 0000000000..dda2310840 --- /dev/null +++ b/mrs_lib/src/math/math.cpp.gcov.html @@ -0,0 +1,149 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/math/math.cpp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/math - math.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:1717100.0 %
Date:2024-04-18 23:11:36Functions:11100.0 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : #include <mrs_lib/math.h>
+       2             : 
+       3             : namespace mrs_lib
+       4             : {
+       5             :   /* probit() function //{ */
+       6         202 :   double probit(const double quantile)
+       7             :   {
+       8             :     // polynomial coefficients of the numerator for rational polynomial approximation in the range (0.08; 0.92)
+       9             :     constexpr double a[4] =
+      10             :     {
+      11             :       2.50662823884,
+      12             :     -18.61500062529,
+      13             :      41.39119773534,
+      14             :     -25.44106049637
+      15             :     };
+      16             : 
+      17             :     // polynomial coefficients of the denominator for the rational polynomial approximation in the range (0.08; 0.92)
+      18             :     constexpr double b[4] =
+      19             :     {
+      20             :       -8.47351093090,
+      21             :       23.08336743743,
+      22             :      -21.06224101826,
+      23             :        3.13082909833
+      24             :     };
+      25             : 
+      26             :     // polynomial coefficients of the logarithmical approximation in the range (0; 0.08) U (0.92; 1)
+      27             :     constexpr double c[9] =
+      28             :     {
+      29             :       0.3374754822726147,
+      30             :       0.9761690190917186,
+      31             :       0.1607979714918209,
+      32             :       0.0276438810333863,
+      33             :       0.0038405729373609,
+      34             :       0.0003951896511919,
+      35             :       0.0000321767881768,
+      36             :       0.0000002888167364,
+      37             :       0.0000003960315187
+      38             :     };
+      39             : 
+      40             :     // correctly handle special values
+      41         202 :     if (quantile == 1.0)
+      42           1 :       return std::numeric_limits<double>::infinity();
+      43         201 :     if (quantile == 0.0)
+      44           1 :       return -std::numeric_limits<double>::infinity();
+      45         200 :     if (quantile < 0.0 || quantile > 1.0)
+      46           2 :       return std::numeric_limits<double>::quiet_NaN();
+      47             : 
+      48         198 :     const double y = quantile - 0.5;
+      49         198 :     if (std::abs(y) < 0.42)
+      50             :     {
+      51         168 :       const double r = y*y;
+      52         168 :       const double num = y*((( a[3]*r + a[2] )*r + a[1])*r + a[0]);
+      53         168 :       const double denom = (((( b[3]*r + b[2] )*r + b[1])*r + b[0])*r + 1);
+      54         168 :       return num/denom;
+      55             :     }
+      56             :     else
+      57             :     {
+      58          30 :       const double v = y > 0 ? 1.0 - quantile : quantile;
+      59          30 :       const double r = std::log(-std::log(v));
+      60          30 :       const double x = c[0] + r*( c[1] + r*( c[2] + r*( c[3] + r*( c[4] + r*( c[5] + r*( c[6] + r*( c[7] + r*c[8] )))))));
+      61          30 :       return y < 0 ? -x : x;
+      62             :     }
+      63             :   }
+      64             :   //}
+      65             : }
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/math/math.cpp.gcov.overview.html b/mrs_lib/src/math/math.cpp.gcov.overview.html new file mode 100644 index 0000000000..8ea3ed0ce0 --- /dev/null +++ b/mrs_lib/src/math/math.cpp.gcov.overview.html @@ -0,0 +1,37 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/math/math.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/src/math/math.cpp.gcov.png b/mrs_lib/src/math/math.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..11021a1f7a3fe1b16c9ed60780115ac61956a437 GIT binary patch literal 388 zcmeAS@N?(olHy`uVBq!ia0vp^0YL1?!VDz0Y_(eeq$C1-LR|m<|Gx?dmcNgUef6J# zVHHpuOr7)IycEdhEbxddW?X?_wfUqO7#M{-T^vI^I^TxHN;NC+EH*!&eSr7D zzjEnZM%SO5_wU^Pv> + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/median_filter + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/median_filterHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:829289.1 %
Date:2024-04-18 23:11:36Functions:161794.1 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
median_filter.cpp +
89.1%89.1%
+
89.1 %82 / 9294.1 %16 / 17
<unnamed>89.1 %82 / 9294.1 %16 / 17
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/median_filter/index-detail-sort-l.html b/mrs_lib/src/median_filter/index-detail-sort-l.html new file mode 100644 index 0000000000..a40b3a898d --- /dev/null +++ b/mrs_lib/src/median_filter/index-detail-sort-l.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/median_filter + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/median_filterHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:829289.1 %
Date:2024-04-18 23:11:36Functions:161794.1 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
median_filter.cpp +
89.1%89.1%
+
89.1 %82 / 9294.1 %16 / 17
<unnamed>89.1 %82 / 9294.1 %16 / 17
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/median_filter/index-detail.html b/mrs_lib/src/median_filter/index-detail.html new file mode 100644 index 0000000000..58f3e2c7c5 --- /dev/null +++ b/mrs_lib/src/median_filter/index-detail.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/median_filter + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/median_filterHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:829289.1 %
Date:2024-04-18 23:11:36Functions:161794.1 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
median_filter.cpp +
89.1%89.1%
+
89.1 %82 / 9294.1 %16 / 17
<unnamed>89.1 %82 / 9294.1 %16 / 17
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/median_filter/index-sort-f.html b/mrs_lib/src/median_filter/index-sort-f.html new file mode 100644 index 0000000000..59edc59486 --- /dev/null +++ b/mrs_lib/src/median_filter/index-sort-f.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/median_filter + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/median_filterHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:829289.1 %
Date:2024-04-18 23:11:36Functions:161794.1 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
median_filter.cpp +
89.1%89.1%
+
89.1 %82 / 9294.1 %16 / 17
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/median_filter/index-sort-l.html b/mrs_lib/src/median_filter/index-sort-l.html new file mode 100644 index 0000000000..d34022aca0 --- /dev/null +++ b/mrs_lib/src/median_filter/index-sort-l.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/median_filter + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/median_filterHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:829289.1 %
Date:2024-04-18 23:11:36Functions:161794.1 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
median_filter.cpp +
89.1%89.1%
+
89.1 %82 / 9294.1 %16 / 17
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/median_filter/index.html b/mrs_lib/src/median_filter/index.html new file mode 100644 index 0000000000..e4e31f5004 --- /dev/null +++ b/mrs_lib/src/median_filter/index.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/median_filter + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/median_filterHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:829289.1 %
Date:2024-04-18 23:11:36Functions:161794.1 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
median_filter.cpp +
89.1%89.1%
+
89.1 %82 / 9294.1 %16 / 17
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/median_filter/median_filter.cpp.func-sort-c.html b/mrs_lib/src/median_filter/median_filter.cpp.func-sort-c.html new file mode 100644 index 0000000000..7f25c785d9 --- /dev/null +++ b/mrs_lib/src/median_filter/median_filter.cpp.func-sort-c.html @@ -0,0 +1,148 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/median_filter/median_filter.cpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/median_filter - median_filter.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:829289.1 %
Date:2024-04-18 23:11:36Functions:161794.1 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::MedianFilter::operator=(mrs_lib::MedianFilter&&)0
mrs_lib::MedianFilter::MedianFilter(mrs_lib::MedianFilter const&)1
mrs_lib::MedianFilter::MedianFilter()1
mrs_lib::MedianFilter::initialized() const1
mrs_lib::MedianFilter::setMaxValue(double)2
mrs_lib::MedianFilter::setMinValue(double)2
mrs_lib::MedianFilter::setBufferLength(unsigned long)2
mrs_lib::MedianFilter::setMaxDifference(double)2
mrs_lib::MedianFilter::clear()2
mrs_lib::MedianFilter::addCheck(double)26
mrs_lib::MedianFilter::MedianFilter(mrs_lib::MedianFilter&&)77
mrs_lib::MedianFilter::operator=(mrs_lib::MedianFilter const&)78
mrs_lib::MedianFilter::MedianFilter(unsigned long, double, double, double)80
mrs_lib::MedianFilter::check(double)131287
mrs_lib::MedianFilter::median() const131314
mrs_lib::MedianFilter::full() const138815
mrs_lib::MedianFilter::add(double)138824
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/median_filter/median_filter.cpp.func.html b/mrs_lib/src/median_filter/median_filter.cpp.func.html new file mode 100644 index 0000000000..7eaa8f8ae3 --- /dev/null +++ b/mrs_lib/src/median_filter/median_filter.cpp.func.html @@ -0,0 +1,148 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/median_filter/median_filter.cpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/median_filter - median_filter.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:829289.1 %
Date:2024-04-18 23:11:36Functions:161794.1 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::MedianFilter::setMaxValue(double)2
mrs_lib::MedianFilter::setMinValue(double)2
mrs_lib::MedianFilter::setBufferLength(unsigned long)2
mrs_lib::MedianFilter::setMaxDifference(double)2
mrs_lib::MedianFilter::add(double)138824
mrs_lib::MedianFilter::check(double)131287
mrs_lib::MedianFilter::clear()2
mrs_lib::MedianFilter::addCheck(double)26
mrs_lib::MedianFilter::MedianFilter(mrs_lib::MedianFilter&&)77
mrs_lib::MedianFilter::MedianFilter(mrs_lib::MedianFilter const&)1
mrs_lib::MedianFilter::MedianFilter(unsigned long, double, double, double)80
mrs_lib::MedianFilter::MedianFilter()1
mrs_lib::MedianFilter::operator=(mrs_lib::MedianFilter&&)0
mrs_lib::MedianFilter::operator=(mrs_lib::MedianFilter const&)78
mrs_lib::MedianFilter::initialized() const1
mrs_lib::MedianFilter::full() const138815
mrs_lib::MedianFilter::median() const131314
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/median_filter/median_filter.cpp.gcov.frameset.html b/mrs_lib/src/median_filter/median_filter.cpp.gcov.frameset.html new file mode 100644 index 0000000000..13e545bd2d --- /dev/null +++ b/mrs_lib/src/median_filter/median_filter.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/median_filter/median_filter.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/src/median_filter/median_filter.cpp.gcov.html b/mrs_lib/src/median_filter/median_filter.cpp.gcov.html new file mode 100644 index 0000000000..72555df7d7 --- /dev/null +++ b/mrs_lib/src/median_filter/median_filter.cpp.gcov.html @@ -0,0 +1,286 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/median_filter/median_filter.cpp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/median_filter - median_filter.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:829289.1 %
Date:2024-04-18 23:11:36Functions:161794.1 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : #include <mrs_lib/median_filter.h>
+       2             : 
+       3             : namespace mrs_lib
+       4             : {
+       5             :   /* constructor overloads //{ */
+       6             : 
+       7          80 :   MedianFilter::MedianFilter(const size_t buffer_length, const double min_value, const double max_value, const double max_diff)
+       8             :     : m_median(std::nullopt),
+       9             :       m_min_valid(min_value),
+      10             :       m_max_valid(max_value),
+      11          80 :       m_max_diff(max_diff)
+      12             :   {
+      13          80 :     m_buffer.set_capacity(buffer_length);
+      14          80 :     m_buffer_sorted.reserve(buffer_length);
+      15          80 :   }
+      16             : 
+      17           1 :   MedianFilter::MedianFilter()
+      18             :     : m_median(std::nullopt),
+      19             :       m_min_valid(0.0),
+      20             :       m_max_valid(0.0),
+      21           1 :       m_max_diff(0.0)
+      22             :   {
+      23           1 :     m_buffer.set_capacity(0);
+      24           1 :   }
+      25             : 
+      26           1 :   MedianFilter::MedianFilter(const MedianFilter& other)
+      27             :   {
+      28           1 :     *this = other;
+      29           1 :   }
+      30             : 
+      31          77 :   MedianFilter::MedianFilter(MedianFilter&& other)
+      32             :   {
+      33          77 :     *this = other;
+      34          77 :   }
+      35             : 
+      36             :   //}
+      37             : 
+      38             :   /* operator=() method and overloads //{ */
+      39          78 :   MedianFilter& MedianFilter::operator=(const MedianFilter& other)
+      40             :   {
+      41          78 :     std::scoped_lock lck(other.m_mtx, m_mtx);
+      42             :   
+      43          78 :     m_buffer = other.m_buffer;
+      44          78 :     m_buffer_sorted = other.m_buffer_sorted;
+      45          78 :     m_median = other.m_median;
+      46             :   
+      47             :     // parameters specified by the user
+      48          78 :     m_min_valid = other.m_min_valid;
+      49          78 :     m_max_valid = other.m_max_valid;
+      50          78 :     m_max_diff = other.m_max_diff;
+      51             :   
+      52         156 :     return *this;
+      53             :   }
+      54             : 
+      55           0 :   MedianFilter& MedianFilter::operator=(MedianFilter&& other)
+      56             :   {
+      57           0 :     std::scoped_lock lck(other.m_mtx, m_mtx);
+      58             : 
+      59           0 :     m_buffer = std::move(other.m_buffer);
+      60           0 :     m_buffer_sorted = std::move(other.m_buffer_sorted);
+      61           0 :     m_median = std::move(other.m_median);
+      62             : 
+      63             :     // parameters specified by the user
+      64           0 :     m_min_valid = other.m_min_valid;
+      65           0 :     m_max_valid = other.m_max_valid;
+      66           0 :     m_max_diff = other.m_max_diff;
+      67             : 
+      68           0 :     return *this;
+      69             :   }
+      70             :   //}
+      71             : 
+      72             :   /* add() method //{ */
+      73      138824 :   void MedianFilter::add(const double value)
+      74             :   {
+      75      277607 :     std::scoped_lock lck(m_mtx);
+      76             :     // add the value to the buffer
+      77      138800 :     m_buffer.push_back(value);
+      78             :     // reset the cached median value
+      79      138811 :     m_median = std::nullopt;
+      80      138799 :   }
+      81             :   //}
+      82             : 
+      83             :   /* check() method //{ */
+      84      131287 :   bool MedianFilter::check(const double value)
+      85             :   {
+      86      131287 :     std::scoped_lock lck(m_mtx);
+      87             :     // check if all constraints are met
+      88      131285 :     const double diff = m_buffer.empty() ? 0.0 : std::abs(median() - value);
+      89      262559 :     return value > m_min_valid && value < m_max_valid && diff < m_max_diff;
+      90             :   }
+      91             :   //}
+      92             : 
+      93             :   /* addCheck() method //{ */
+      94          26 :   bool MedianFilter::addCheck(const double value)
+      95             :   {
+      96          52 :     std::scoped_lock lck(m_mtx);
+      97          26 :     add(value);
+      98          52 :     return check(value);
+      99             :   }
+     100             :   //}
+     101             : 
+     102             :   /* clear() method //{ */
+     103           2 :   void MedianFilter::clear()
+     104             :   {
+     105           4 :     std::scoped_lock lck(m_mtx);
+     106           2 :     m_median = std::nullopt;
+     107           2 :     m_buffer.clear();
+     108           2 :   }
+     109             :   //}
+     110             : 
+     111             :   /* full() method //{ */
+     112      138815 :   bool MedianFilter::full() const
+     113             :   {
+     114      277617 :     std::scoped_lock lck(m_mtx);
+     115      277604 :     return m_buffer.full();
+     116             :   }
+     117             :   //}
+     118             : 
+     119             :   /* median() method //{ */
+     120      131314 :   double MedianFilter::median() const
+     121             :   {
+     122      262624 :     std::scoped_lock lck(m_mtx);
+     123             :     // if the value was already calculated, just return it
+     124      131301 :     if (m_median.has_value())
+     125          18 :       return m_median.value();
+     126             :   
+     127             :     // check if there are even any numbers to calculate the median from
+     128      131289 :     if (m_buffer.empty())
+     129             :     {
+     130           4 :       m_median = std::numeric_limits<double>::quiet_NaN();
+     131           4 :       return m_median.value();
+     132             :     }
+     133             :   
+     134             :     // remove any elements from buffer_sorted
+     135      131282 :     m_buffer_sorted.clear();
+     136             :     // copy all elements from the input buffer to buffer_sorted
+     137      131277 :     m_buffer_sorted.insert(std::end(m_buffer_sorted), std::begin(m_buffer), std::end(m_buffer));
+     138             :     // check for the special case of the median when there is an even number of numbers in the set
+     139      131283 :     const bool even_set = m_buffer_sorted.size() % 2 == 0;
+     140             :   
+     141             :     // if it's an even set, we'll need one more element sorted than for an odd set of numbers
+     142      131263 :     const size_t median_pos = even_set ? std::ceil(m_buffer_sorted.size()/2.0) : std::floor(m_buffer_sorted.size()/2.0);
+     143             :     // actually sort the elements in buffer_sorted up to the n-th element
+     144      131262 :     std::nth_element(std::begin(m_buffer_sorted), std::begin(m_buffer_sorted)+median_pos, std::end(m_buffer_sorted));
+     145             :   
+     146             :     // special case for a median of an even set of numbers
+     147      131294 :     if (even_set)
+     148      131278 :       m_median = (m_buffer_sorted.at(median_pos) + m_buffer_sorted.at(median_pos-1))/2.0;
+     149             :     // the "normal" case with an odd set
+     150             :     else
+     151          16 :       m_median = m_buffer_sorted.at(median_pos);
+     152             :     // return the now-cached value
+     153      131286 :     return m_median.value();
+     154             :   }
+     155             :   //}
+     156             : 
+     157             :   /* initialized() method //{ */
+     158           1 :   bool MedianFilter::initialized() const
+     159             :   {
+     160           1 :     std::scoped_lock lck(m_mtx);
+     161           2 :     return m_buffer.size() > 0;
+     162             :   }
+     163             :   //}
+     164             : 
+     165             :   /* setBufferLength() method //{ */
+     166           2 :   void MedianFilter::setBufferLength(const size_t buffer_length)
+     167             :   {
+     168           4 :     std::scoped_lock lck(m_mtx);
+     169             :     // the median may change if the some values are discarded
+     170           2 :     if (buffer_length < m_buffer.size())
+     171           0 :       m_median = std::nullopt;
+     172             :   
+     173           2 :     m_buffer.set_capacity(buffer_length);
+     174           2 :     m_buffer_sorted.reserve(buffer_length);
+     175           2 :   }
+     176             :   //}
+     177             : 
+     178             :   /* setMinValue() method //{ */
+     179           2 :   void MedianFilter::setMinValue(const double min_value)
+     180             :   {
+     181           2 :     std::scoped_lock lck(m_mtx);
+     182           2 :     m_min_valid = min_value;
+     183           2 :   }
+     184             :   //}
+     185             : 
+     186             :   /* setMaxValue() method //{ */
+     187           2 :   void MedianFilter::setMaxValue(const double max_value)
+     188             :   {
+     189           2 :     std::scoped_lock lck(m_mtx);
+     190           2 :     m_max_valid = max_value;
+     191           2 :   }
+     192             :   //}
+     193             : 
+     194             :   /* setMaxDifference() method //{ */
+     195           2 :   void MedianFilter::setMaxDifference(const double max_diff)
+     196             :   {
+     197           2 :     std::scoped_lock lck(m_mtx);
+     198           2 :     m_max_diff = max_diff;
+     199           2 :   }
+     200             :   //}
+     201             : 
+     202             : } // namespace mrs_lib
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/median_filter/median_filter.cpp.gcov.overview.html b/mrs_lib/src/median_filter/median_filter.cpp.gcov.overview.html new file mode 100644 index 0000000000..f9295bd144 --- /dev/null +++ b/mrs_lib/src/median_filter/median_filter.cpp.gcov.overview.html @@ -0,0 +1,71 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/median_filter/median_filter.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/src/median_filter/median_filter.cpp.gcov.png b/mrs_lib/src/median_filter/median_filter.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..b9ea102b4e20dc14f5089f33c629964d0722e495 GIT binary patch literal 872 zcmV-u1DE`XP)?#D47~zV4R{20qwmlQQ?*Cb&s)6T zPH}7sC3BcfAv=e&rjVxZbZhD~ zU^@f$!VY5T54!|BMaABIVolQs69${1Vn3^$QQcEvJ~Nb+dFXRy#xW(a*j)(UK=|-d zcn6q4!X+ieTYTFoZcgp#=XXZ9;UUc;T=%K`eBug-jIp$soK(Z1fMXS>VvE~It{8>b za-G0wD$2mPenz?TQJ614j>{nB zm!`rqNz|oy=e2p)lxD^?n*atsLRfUiz|xc5aO}fJdk9+LDj)#qB|0sI{;`?K@ca#G z*d1;}%Ec(V&*xlMV#H)Y-q^-I+ZEo@0nED&>vl9n|HuHJy}R0#$18pTk3A*}9vuO+ z3g_~uL+av28#38siXfrtRV^Or^-SxYLU{e~$?s<-9h + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/param_loader + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/param_loaderHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:445580.0 %
Date:2024-04-18 23:11:36Functions:44100.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
param_provider.cpp +
80.0%80.0%
+
80.0 %44 / 55100.0 %4 / 4
<unnamed>80.0 %44 / 55100.0 %4 / 4
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/param_loader/index-detail-sort-l.html b/mrs_lib/src/param_loader/index-detail-sort-l.html new file mode 100644 index 0000000000..eb19c4f1e1 --- /dev/null +++ b/mrs_lib/src/param_loader/index-detail-sort-l.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/param_loader + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/param_loaderHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:445580.0 %
Date:2024-04-18 23:11:36Functions:44100.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
param_provider.cpp +
80.0%80.0%
+
80.0 %44 / 55100.0 %4 / 4
<unnamed>80.0 %44 / 55100.0 %4 / 4
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/param_loader/index-detail.html b/mrs_lib/src/param_loader/index-detail.html new file mode 100644 index 0000000000..226499ffdc --- /dev/null +++ b/mrs_lib/src/param_loader/index-detail.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/param_loader + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/param_loaderHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:445580.0 %
Date:2024-04-18 23:11:36Functions:44100.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
param_provider.cpp +
80.0%80.0%
+
80.0 %44 / 55100.0 %4 / 4
<unnamed>80.0 %44 / 55100.0 %4 / 4
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/param_loader/index-sort-f.html b/mrs_lib/src/param_loader/index-sort-f.html new file mode 100644 index 0000000000..c71b55b77e --- /dev/null +++ b/mrs_lib/src/param_loader/index-sort-f.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/param_loader + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/param_loaderHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:445580.0 %
Date:2024-04-18 23:11:36Functions:44100.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
param_provider.cpp +
80.0%80.0%
+
80.0 %44 / 55100.0 %4 / 4
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/param_loader/index-sort-l.html b/mrs_lib/src/param_loader/index-sort-l.html new file mode 100644 index 0000000000..c073fb00df --- /dev/null +++ b/mrs_lib/src/param_loader/index-sort-l.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/param_loader + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/param_loaderHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:445580.0 %
Date:2024-04-18 23:11:36Functions:44100.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
param_provider.cpp +
80.0%80.0%
+
80.0 %44 / 55100.0 %4 / 4
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/param_loader/index.html b/mrs_lib/src/param_loader/index.html new file mode 100644 index 0000000000..43d028df1e --- /dev/null +++ b/mrs_lib/src/param_loader/index.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/param_loader + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/param_loaderHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:445580.0 %
Date:2024-04-18 23:11:36Functions:44100.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
param_provider.cpp +
80.0%80.0%
+
80.0 %44 / 55100.0 %4 / 4
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/param_loader/param_provider.cpp.func-sort-c.html b/mrs_lib/src/param_loader/param_provider.cpp.func-sort-c.html new file mode 100644 index 0000000000..5f4bae96c8 --- /dev/null +++ b/mrs_lib/src/param_loader/param_provider.cpp.func-sort-c.html @@ -0,0 +1,96 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/param_loader/param_provider.cpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/param_loader - param_provider.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:445580.0 %
Date:2024-04-18 23:11:36Functions:44100.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::ParamProvider::getParam(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, XmlRpc::XmlRpcValue&) const4
mrs_lib::ParamProvider::ParamProvider(ros::NodeHandle const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool)3978
mrs_lib::ParamProvider::addYamlFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)13035
mrs_lib::ParamProvider::findYamlNode(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const86956
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/param_loader/param_provider.cpp.func.html b/mrs_lib/src/param_loader/param_provider.cpp.func.html new file mode 100644 index 0000000000..c795ba0d43 --- /dev/null +++ b/mrs_lib/src/param_loader/param_provider.cpp.func.html @@ -0,0 +1,96 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/param_loader/param_provider.cpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/param_loader - param_provider.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:445580.0 %
Date:2024-04-18 23:11:36Functions:44100.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::ParamProvider::addYamlFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)13035
mrs_lib::ParamProvider::ParamProvider(ros::NodeHandle const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool)3978
mrs_lib::ParamProvider::findYamlNode(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const86956
mrs_lib::ParamProvider::getParam(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, XmlRpc::XmlRpcValue&) const4
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/param_loader/param_provider.cpp.gcov.frameset.html b/mrs_lib/src/param_loader/param_provider.cpp.gcov.frameset.html new file mode 100644 index 0000000000..e288051dac --- /dev/null +++ b/mrs_lib/src/param_loader/param_provider.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/param_loader/param_provider.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/src/param_loader/param_provider.cpp.gcov.html b/mrs_lib/src/param_loader/param_provider.cpp.gcov.html new file mode 100644 index 0000000000..9066609f36 --- /dev/null +++ b/mrs_lib/src/param_loader/param_provider.cpp.gcov.html @@ -0,0 +1,200 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/param_loader/param_provider.cpp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/param_loader - param_provider.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:445580.0 %
Date:2024-04-18 23:11:36Functions:44100.0 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : #include <mrs_lib/param_provider.h>
+       2             : 
+       3             : namespace mrs_lib
+       4             : {
+       5             :   // Explicit instantiation of the tepmplated functions to precompile them into mrs_lib and speed up compilation of user program.
+       6             :   // Instantiating these functions should be sufficient to invoke precompilation of all templated ParamLoader functions.
+       7             : 
+       8             :   template bool ParamProvider::getParam<bool>(const std::string& name, bool& out_value) const;
+       9             :   template bool ParamProvider::getParam<int>(const std::string& name, int& out_value) const;
+      10             :   template bool ParamProvider::getParam<double>(const std::string& name, double& out_value) const;
+      11             :   template bool ParamProvider::getParam<std::string>(const std::string& name, std::string& out_value) const;
+      12             : 
+      13        3978 :   ParamProvider::ParamProvider(const ros::NodeHandle& nh, std::string node_name, const bool use_rosparam)
+      14        3978 :   : m_nh(nh), m_node_name(std::move(node_name)), m_use_rosparam(use_rosparam)
+      15             :   {
+      16        3978 :   }
+      17             : 
+      18       13035 :   bool ParamProvider::addYamlFile(const std::string& filepath)
+      19             :   {
+      20             :     try
+      21             :     {
+      22       26070 :       const auto loaded_yaml = YAML::LoadFile(filepath);
+      23       13035 :       YAML::Node root;
+      24       13035 :       root["root"] = loaded_yaml;
+      25       13035 :       m_yamls.emplace_back(root);
+      26       13035 :       return true;
+      27             :     }
+      28           0 :     catch (const YAML::ParserException& e)
+      29             :     {
+      30           0 :       ROS_ERROR_STREAM("[" << m_node_name << "]: Failed to parse file \"" << filepath << "\"! Parameters will not be loaded: " << e.what());
+      31           0 :       return false;
+      32             :     }
+      33           0 :     catch (const YAML::BadFile& e)
+      34             :     {
+      35           0 :       ROS_ERROR_STREAM("[" << m_node_name << "]: File \"" << filepath << "\" does not exist! Parameters will not be loaded: " << e.what());
+      36           0 :       return false;
+      37             :     }
+      38           0 :     catch (const YAML::Exception& e)
+      39             :     {
+      40           0 :       ROS_ERROR_STREAM("[" << m_node_name << "]: YAML-CPP threw an exception! Parameters will not be loaded: " << e.what());
+      41           0 :       return false;
+      42             :     }
+      43             :     return false;
+      44             :   }
+      45             : 
+      46           4 :   bool ParamProvider::getParam(const std::string& param_name, XmlRpc::XmlRpcValue& value_out) const
+      47             :   {
+      48           4 :     if (m_use_rosparam && m_nh.getParam(param_name, value_out))
+      49           2 :       return true;
+      50             : 
+      51             :     try
+      52             :     {
+      53           4 :       const auto found_node = findYamlNode(param_name);
+      54           2 :       if (found_node.has_value())
+      55           1 :         ROS_WARN_STREAM("[" << m_node_name << "]: Parameter \"" << param_name << "\" of desired type XmlRpc::XmlRpcValue is only available as a static parameter, which doesn't support loading of this type.");
+      56             :     }
+      57           0 :     catch (const YAML::Exception& e)
+      58             :     {
+      59           0 :       ROS_ERROR_STREAM("[" << m_node_name << "]: YAML-CPP threw an unknown exception: " << e.what());
+      60             :     }
+      61           2 :     return false;
+      62             :   }
+      63             : 
+      64       86956 :   std::optional<YAML::Node> ParamProvider::findYamlNode(const std::string& param_name) const
+      65             :   {
+      66      450424 :     for (const auto& yaml : m_yamls)
+      67             :     {
+      68             :       // Try to load the parameter sequentially as a map.
+      69      434951 :       auto cur_node_it = std::cbegin(yaml);
+      70             :       // The root should always be a pam
+      71      434953 :       if (!cur_node_it->second.IsMap())
+      72       13789 :         continue;
+      73             : 
+      74      421165 :       bool loaded = true;
+      75             :       {
+      76      421165 :         constexpr char delimiter = '/';
+      77      421165 :         auto substr_start = std::cbegin(param_name);
+      78      421165 :         auto substr_end = substr_start;
+      79      575248 :         do
+      80             :         {
+      81      996413 :           substr_end = std::find(substr_start, std::cend(param_name), delimiter);
+      82             :           // why can't substr or string_view take iterators? :'(
+      83      996408 :           const auto start_pos = std::distance(std::cbegin(param_name), substr_start);
+      84      996406 :           const auto count = std::distance(substr_start, substr_end);
+      85      996405 :           const std::string param_substr = param_name.substr(start_pos, count);
+      86      996408 :           substr_start = substr_end+1;
+      87             : 
+      88      996405 :           bool found = false;
+      89     4074399 :           for (auto node_it = std::cbegin(cur_node_it->second); node_it != std::cend(cur_node_it->second); ++node_it)
+      90             :           {
+      91     2081569 :             if (node_it->first.as<std::string>() == param_substr)
+      92             :             {
+      93      646732 :               cur_node_it = node_it;
+      94      646733 :               found = true;
+      95      646733 :               break;
+      96             :             }
+      97             :           }
+      98             : 
+      99      996412 :           if (!found)
+     100             :           {
+     101      349681 :             loaded = false;
+     102      349681 :             break;
+     103             :           }
+     104             :         }
+     105      646728 :         while (substr_end != std::end(param_name) && cur_node_it->second.IsMap());
+     106             :       }
+     107             : 
+     108      421165 :       if (loaded)
+     109             :       {
+     110      142969 :         return cur_node_it->second;
+     111             :       }
+     112             :     }
+     113             : 
+     114       15471 :     return std::nullopt;
+     115             :   }
+     116             : }
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/param_loader/param_provider.cpp.gcov.overview.html b/mrs_lib/src/param_loader/param_provider.cpp.gcov.overview.html new file mode 100644 index 0000000000..af67093666 --- /dev/null +++ b/mrs_lib/src/param_loader/param_provider.cpp.gcov.overview.html @@ -0,0 +1,49 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/param_loader/param_provider.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/src/param_loader/param_provider.cpp.gcov.png b/mrs_lib/src/param_loader/param_provider.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..774efb61cfe2d289995153e385a5e1b80dae2dc4 GIT binary patch literal 659 zcmV;E0&M+>P)UH@$AI|+MB1M3`qHF|E!oDf?bgK3?6rMp-U;Fe zkK`G?h@ZU?F^0bj--Qbpr3exw7(yf$`=T0=USw(Ffy90f6cO$@4uGZ05wP@%YmrB7 zimuxJg{!ko>U`6K(@W9(#RgL{-7JRvoEN({pfV zciJ*A6>A8b1@=HJk=uD1a~WgaCfQ}q)-3SqJnjO|?CX7z%eRZ*F82TOUkKRnl`VCWx@JzdJFITnc=4JpY|qGF~J04QPdN+K(K_HKko^Dt`huEBt+TKQp$D@?gXKJRFSB5@EeY@o&a6asd48e1TBei zIUIR)Kq!%!BPGd-9*Ln*S2V>vFyaOtQI3e3kjJXjM=`GB8P@|_d_6*fA8!F3{ne_w%LLQOOaCSoAxMXq@>8hddvA2?N tAl(lpE>rQT$L}9 + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/profiler + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/profilerHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:3910138.6 %
Date:2024-04-18 23:11:36Functions:91090.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
profiler.cpp +
38.6%38.6%
+
38.6 %39 / 10190.0 %9 / 10
<unnamed>38.6 %39 / 10190.0 %9 / 10
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/profiler/index-detail-sort-l.html b/mrs_lib/src/profiler/index-detail-sort-l.html new file mode 100644 index 0000000000..b70a9d91ab --- /dev/null +++ b/mrs_lib/src/profiler/index-detail-sort-l.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/profiler + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/profilerHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:3910138.6 %
Date:2024-04-18 23:11:36Functions:91090.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
profiler.cpp +
38.6%38.6%
+
38.6 %39 / 10190.0 %9 / 10
<unnamed>38.6 %39 / 10190.0 %9 / 10
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/profiler/index-detail.html b/mrs_lib/src/profiler/index-detail.html new file mode 100644 index 0000000000..597dbd1b59 --- /dev/null +++ b/mrs_lib/src/profiler/index-detail.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/profiler + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/profilerHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:3910138.6 %
Date:2024-04-18 23:11:36Functions:91090.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
profiler.cpp +
38.6%38.6%
+
38.6 %39 / 10190.0 %9 / 10
<unnamed>38.6 %39 / 10190.0 %9 / 10
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/profiler/index-sort-f.html b/mrs_lib/src/profiler/index-sort-f.html new file mode 100644 index 0000000000..32897878cf --- /dev/null +++ b/mrs_lib/src/profiler/index-sort-f.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/profiler + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/profilerHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:3910138.6 %
Date:2024-04-18 23:11:36Functions:91090.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
profiler.cpp +
38.6%38.6%
+
38.6 %39 / 10190.0 %9 / 10
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/profiler/index-sort-l.html b/mrs_lib/src/profiler/index-sort-l.html new file mode 100644 index 0000000000..ec23734311 --- /dev/null +++ b/mrs_lib/src/profiler/index-sort-l.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/profiler + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/profilerHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:3910138.6 %
Date:2024-04-18 23:11:36Functions:91090.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
profiler.cpp +
38.6%38.6%
+
38.6 %39 / 10190.0 %9 / 10
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/profiler/index.html b/mrs_lib/src/profiler/index.html new file mode 100644 index 0000000000..2c7afa19e6 --- /dev/null +++ b/mrs_lib/src/profiler/index.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/profiler + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/profilerHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:3910138.6 %
Date:2024-04-18 23:11:36Functions:91090.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
profiler.cpp +
38.6%38.6%
+
38.6 %39 / 10190.0 %9 / 10
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/profiler/profiler.cpp.func-sort-c.html b/mrs_lib/src/profiler/profiler.cpp.func-sort-c.html new file mode 100644 index 0000000000..c7c4f15dd9 --- /dev/null +++ b/mrs_lib/src/profiler/profiler.cpp.func-sort-c.html @@ -0,0 +1,120 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/profiler/profiler.cpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/profiler - profiler.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:3910138.6 %
Date:2024-04-18 23:11:36Functions:91090.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::Profiler::Profiler(mrs_lib::Profiler const&)0
mrs_lib::Profiler::Profiler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool)1275
mrs_lib::Profiler::Profiler()1275
mrs_lib::Profiler::operator=(mrs_lib::Profiler const&)1275
mrs_lib::Profiler::createRoutine(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, double, double, ros::TimerEvent)642907
mrs_lib::Routine::Routine(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, double, double, std::shared_ptr<ros::Publisher>, std::shared_ptr<std::mutex>, bool, ros::TimerEvent)643061
mrs_lib::Routine::Routine(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::shared_ptr<ros::Publisher>, std::shared_ptr<std::mutex>, bool)1849588
mrs_lib::Profiler::createRoutine(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)1849623
mrs_lib::Routine::end()2492561
mrs_lib::Routine::~Routine()2492675
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/profiler/profiler.cpp.func.html b/mrs_lib/src/profiler/profiler.cpp.func.html new file mode 100644 index 0000000000..60a8653597 --- /dev/null +++ b/mrs_lib/src/profiler/profiler.cpp.func.html @@ -0,0 +1,120 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/profiler/profiler.cpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/profiler - profiler.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:3910138.6 %
Date:2024-04-18 23:11:36Functions:91090.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::Routine::end()2492561
mrs_lib::Routine::Routine(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::shared_ptr<ros::Publisher>, std::shared_ptr<std::mutex>, bool)1849588
mrs_lib::Routine::Routine(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, double, double, std::shared_ptr<ros::Publisher>, std::shared_ptr<std::mutex>, bool, ros::TimerEvent)643061
mrs_lib::Routine::~Routine()2492675
mrs_lib::Profiler::createRoutine(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)1849623
mrs_lib::Profiler::createRoutine(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, double, double, ros::TimerEvent)642907
mrs_lib::Profiler::Profiler(mrs_lib::Profiler const&)0
mrs_lib::Profiler::Profiler(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool)1275
mrs_lib::Profiler::Profiler()1275
mrs_lib::Profiler::operator=(mrs_lib::Profiler const&)1275
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/profiler/profiler.cpp.gcov.frameset.html b/mrs_lib/src/profiler/profiler.cpp.gcov.frameset.html new file mode 100644 index 0000000000..c91c4fd036 --- /dev/null +++ b/mrs_lib/src/profiler/profiler.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/profiler/profiler.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/src/profiler/profiler.cpp.gcov.html b/mrs_lib/src/profiler/profiler.cpp.gcov.html new file mode 100644 index 0000000000..892ae48fe6 --- /dev/null +++ b/mrs_lib/src/profiler/profiler.cpp.gcov.html @@ -0,0 +1,301 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/profiler/profiler.cpp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/profiler - profiler.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:3910138.6 %
Date:2024-04-18 23:11:36Functions:91090.0 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : #include <mrs_lib/profiler.h>
+       2             : 
+       3             : namespace mrs_lib
+       4             : {
+       5             : 
+       6             : // | ------------------------ Profiler ------------------------ |
+       7             : 
+       8             : /* Profiler constructor //{ */
+       9             : 
+      10        1275 : Profiler::Profiler() {
+      11        1275 : }
+      12             : 
+      13        1275 : Profiler::Profiler(ros::NodeHandle& nh, std::string _node_name_, bool profiler_enabled) {
+      14             : 
+      15        1275 :   this->nh_                = std::make_shared<ros::NodeHandle>(nh);
+      16        1275 :   this->_node_name_        = _node_name_;
+      17        1275 :   this->_profiler_enabled_ = profiler_enabled;
+      18             : 
+      19        1275 :   if (profiler_enabled) {
+      20           0 :     mutex_publisher_ = std::make_unique<std::mutex>();
+      21           0 :     publisher_       = std::make_unique<ros::Publisher>(this->nh_->advertise<mrs_msgs::ProfilerUpdate>("profiler", 100, false));
+      22             :   }
+      23             : 
+      24        1275 :   ROS_INFO("[%s]: profiler initialized", _node_name_.c_str());
+      25             : 
+      26        1275 :   this->is_initialized_ = true;
+      27        1275 : }
+      28             : 
+      29           0 : Profiler::Profiler(const Profiler& other) {
+      30             : 
+      31           0 :   this->is_initialized_    = other.is_initialized_;
+      32           0 :   this->nh_                = other.nh_;
+      33           0 :   this->_node_name_        = other._node_name_;
+      34           0 :   this->_profiler_enabled_ = other._profiler_enabled_;
+      35             : 
+      36           0 :   if (this->_profiler_enabled_ && this->is_initialized_) {
+      37           0 :     mutex_publisher_ = std::make_unique<std::mutex>();
+      38           0 :     publisher_       = std::make_unique<ros::Publisher>(this->nh_->advertise<mrs_msgs::ProfilerUpdate>("profiler", 100, false));
+      39             :   }
+      40           0 : }
+      41             : 
+      42        1275 : Profiler& Profiler::operator=(const Profiler& other) {
+      43             : 
+      44        1275 :   if (this == &other) {
+      45           0 :     return *this;
+      46             :   }
+      47             : 
+      48        1275 :   this->is_initialized_    = other.is_initialized_;
+      49        1275 :   this->nh_                = other.nh_;
+      50        1275 :   this->_node_name_        = other._node_name_;
+      51        1275 :   this->_profiler_enabled_ = other._profiler_enabled_;
+      52             : 
+      53        1275 :   if (this->_profiler_enabled_ && this->is_initialized_) {
+      54           0 :     mutex_publisher_ = std::make_unique<std::mutex>();
+      55           0 :     publisher_       = std::make_unique<ros::Publisher>(this->nh_->advertise<mrs_msgs::ProfilerUpdate>("profiler", 100, false));
+      56             :   }
+      57             : 
+      58        1275 :   return *this;
+      59             : }
+      60             : 
+      61             : //}
+      62             : 
+      63             : /* Profiler::registerRoutine() for periodic //{ */
+      64             : 
+      65      642907 : Routine Profiler::createRoutine(std::string name, double expected_rate, double threshold, ros::TimerEvent event) {
+      66             : 
+      67      642907 :   return Routine(name, this->_node_name_, expected_rate, threshold, publisher_, mutex_publisher_, _profiler_enabled_, event);
+      68             : }
+      69             : 
+      70             : //}
+      71             : 
+      72             : /* Profiler::registerRoutine() normal //{ */
+      73             : 
+      74     1849623 : Routine Profiler::createRoutine(std::string name) {
+      75             : 
+      76     1849623 :   return Routine(name, this->_node_name_, publisher_, mutex_publisher_, _profiler_enabled_);
+      77             : }
+      78             : 
+      79             : //}
+      80             : 
+      81             : // | ------------------------- Routine ------------------------ |
+      82             : 
+      83             : /* Routine constructor for periodic //{ */
+      84             : 
+      85      643061 : Routine::Routine(std::string name, std::string node_name, double expected_rate, double threshold, std::shared_ptr<ros::Publisher> publisher,
+      86      643061 :                  std::shared_ptr<std::mutex> mutex_publisher, bool profiler_enabled, ros::TimerEvent event) {
+      87             : 
+      88      641955 :   if (!profiler_enabled) {
+      89      642050 :     return;
+      90             :   }
+      91             : 
+      92           1 :   _threshold_ = threshold;
+      93             : 
+      94           1 :   this->publisher_       = publisher;
+      95           0 :   this->mutex_publisher_ = mutex_publisher;
+      96             : 
+      97           0 :   this->_routine_name_  = name;
+      98           0 :   msg_out_.routine_name = name;
+      99             : 
+     100           0 :   this->_node_name_  = node_name;
+     101           0 :   msg_out_.node_name = node_name;
+     102             : 
+     103           0 :   this->_profiler_enabled_ = profiler_enabled;
+     104             : 
+     105           0 :   msg_out_.is_periodic   = true;
+     106           0 :   msg_out_.expected_rate = expected_rate;
+     107             : 
+     108           0 :   msg_out_.expected_start = event.current_expected.toSec();
+     109           0 :   msg_out_.real_start     = event.current_real.toSec();
+     110             : 
+     111           0 :   msg_out_.stamp     = ros::Time::now();
+     112           0 :   msg_out_.duration  = 0;
+     113           0 :   msg_out_.iteration = this->iteration_++;
+     114           0 :   msg_out_.event     = mrs_msgs::ProfilerUpdate::START;
+     115             : 
+     116           0 :   execution_start_ = ros::Time::now();
+     117             : 
+     118           0 :   double dt = msg_out_.real_start - msg_out_.expected_start;
+     119             : 
+     120           0 :   if (dt > _threshold_) {
+     121           0 :     ROS_WARN_THROTTLE(1.0, "[%s]: routine '%s' was lauched late by %.3f s!", _node_name_.c_str(), _routine_name_.c_str(), dt);
+     122             :   }
+     123             : 
+     124             :   {
+     125           0 :     std::scoped_lock lock(*mutex_publisher_);
+     126             : 
+     127             :     try {
+     128           0 :       publisher_->publish(mrs_msgs::ProfilerUpdateConstPtr(new mrs_msgs::ProfilerUpdate(msg_out_)));
+     129             :     }
+     130           0 :     catch (...) {
+     131           0 :       ROS_ERROR("Exception caught during publishing topic %s.", publisher_->getTopic().c_str());
+     132             :     }
+     133             :   }
+     134             : }
+     135             : 
+     136             : //}
+     137             : 
+     138             : /* Routine constructor for normal //{ */
+     139             : 
+     140     1849588 : Routine::Routine(std::string name, std::string node_name, std::shared_ptr<ros::Publisher> publisher, std::shared_ptr<std::mutex> mutex_publisher,
+     141     1849588 :                  bool profiler_enabled) {
+     142             : 
+     143     1848468 :   if (!profiler_enabled) {
+     144     1848483 :     return;
+     145             :   }
+     146             : 
+     147           0 :   this->publisher_       = publisher;
+     148           0 :   this->mutex_publisher_ = mutex_publisher;
+     149             : 
+     150           0 :   this->_routine_name_  = name;
+     151           0 :   msg_out_.routine_name = name;
+     152             : 
+     153           0 :   this->_node_name_  = node_name;
+     154           0 :   msg_out_.node_name = node_name;
+     155             : 
+     156           0 :   this->_profiler_enabled_ = profiler_enabled;
+     157             : 
+     158           0 :   msg_out_.is_periodic   = false;
+     159           0 :   msg_out_.expected_rate = 0;
+     160             : 
+     161           0 :   msg_out_.stamp      = ros::Time::now();
+     162           0 :   msg_out_.duration   = 0;
+     163           0 :   msg_out_.iteration  = this->iteration_++;
+     164           0 :   msg_out_.event      = mrs_msgs::ProfilerUpdate::START;
+     165           0 :   msg_out_.real_start = msg_out_.stamp.toSec();
+     166             : 
+     167           0 :   execution_start_ = ros::Time::now();
+     168             : 
+     169             :   {
+     170           0 :     std::scoped_lock lock(*mutex_publisher_);
+     171             : 
+     172             :     try {
+     173           0 :       publisher_->publish(mrs_msgs::ProfilerUpdateConstPtr(new mrs_msgs::ProfilerUpdate(msg_out_)));
+     174             :     }
+     175           0 :     catch (...) {
+     176           0 :       ROS_ERROR("Exception caught during publishing topic %s.", publisher_->getTopic().c_str());
+     177             :     }
+     178             :   }
+     179             : }
+     180             : 
+     181             : //}
+     182             : 
+     183             : /* end() //{ */
+     184             : 
+     185     2492561 : void Routine::end(void) {
+     186             : 
+     187     2492561 :   if (!_profiler_enabled_) {
+     188     2492117 :     return;
+     189             :   }
+     190             : 
+     191         444 :   ros::Time execution_end = ros::Time::now();
+     192             : 
+     193           0 :   msg_out_.stamp    = ros::Time::now();
+     194           0 :   msg_out_.duration = (execution_end - execution_start_).toSec();
+     195             : 
+     196           0 :   msg_out_.event = mrs_msgs::ProfilerUpdate::END;
+     197             : 
+     198             :   {
+     199           0 :     std::scoped_lock lock(*mutex_publisher_);
+     200             : 
+     201             :     try {
+     202           0 :       publisher_->publish(mrs_msgs::ProfilerUpdateConstPtr(new mrs_msgs::ProfilerUpdate(msg_out_)));
+     203             :     }
+     204           0 :     catch (...) {
+     205           0 :       ROS_ERROR("Exception caught during publishing topic %s.", publisher_->getTopic().c_str());
+     206             :     }
+     207             :   }
+     208             : }
+     209             : 
+     210             : //}
+     211             : 
+     212     2492360 : Routine::~Routine() {
+     213             : 
+     214     2492675 :   this->end();
+     215     2490867 : }
+     216             : 
+     217             : }  // namespace mrs_lib
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/profiler/profiler.cpp.gcov.overview.html b/mrs_lib/src/profiler/profiler.cpp.gcov.overview.html new file mode 100644 index 0000000000..f66727ff8b --- /dev/null +++ b/mrs_lib/src/profiler/profiler.cpp.gcov.overview.html @@ -0,0 +1,75 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/profiler/profiler.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/src/profiler/profiler.cpp.gcov.png b/mrs_lib/src/profiler/profiler.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..ee7178374126c2cf561db47acab37502e0a548ac GIT binary patch literal 841 zcmV-P1GfB$P)#D`p{NA#Z`qPgMIV2pE;X_TZh;%%g;)Eg0W6tn(>_b{M%ptm^s zPsg)q+5y15pa>VDBIjUM^aDy3Z+Jb<$%>I;+AYgBinU)V3l>mZ4|j@0y2ULj(a#mgsjs=aZ}6&9Z8Pk6yah}WOJ1*I+E_4GKMZE z&}CCi@w`n$xYd|Kg= zHMueQ!@7o4b~b>R@`?G)fZwK(hXLPJiu(aK55p zgu2R#)zD5LxD@(Ku^O88_BIwh2T(x+GUw1WXB;Nsg=wU?UUf%mSD-QPk;k~^TB1O^ zTpyWaq1!kkO^AAn7Nvw{=bA+e!{b(>*djvO)(l_&vVP5G*FzglA7G^FjWa~AkFr-8 zo~>i6&=(S)ouu)sin{oCXWU6vz?ofULRo{~T4;5^AK1}+hLIvVbAMa&jLv`{I+KYd zzX_;s?EgQVNwaYgcbfRl^^%Vp&?Jy8$%n$34f(jdTwws2QSfvo-*t!Vh>j6)6n2_1 z&|EMv@4<@99%-%D?Wn@rG*1-YrYTwMeYb3Ach-I@rE5p!uB*@t|9ok0!0i+OZj4Ik zT%^SEi0dOL(shkXib_cq%k@!-{}w43`YlpzWL6cF3;Sm0itWD}9{NG`k0k#9NVwS- T>2taX00000NkvXXu0mjfhUbsa literal 0 HcmV?d00001 diff --git a/mrs_lib/src/safety_zone/index-detail-sort-f.html b/mrs_lib/src/safety_zone/index-detail-sort-f.html new file mode 100644 index 0000000000..872c514144 --- /dev/null +++ b/mrs_lib/src/safety_zone/index-detail-sort-f.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/safety_zone + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/safety_zoneHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:314963.3 %
Date:2024-04-18 23:11:36Functions:8988.9 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
safety_zone.cpp +
60.0%60.0%
+
60.0 %15 / 2583.3 %5 / 6
<unnamed>60.0 %15 / 2583.3 %5 / 6
line_operations.cpp +
66.7%66.7%
+
66.7 %16 / 24100.0 %3 / 3
<unnamed>66.7 %16 / 24100.0 %3 / 3
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/safety_zone/index-detail-sort-l.html b/mrs_lib/src/safety_zone/index-detail-sort-l.html new file mode 100644 index 0000000000..361bbc5a03 --- /dev/null +++ b/mrs_lib/src/safety_zone/index-detail-sort-l.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/safety_zone + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/safety_zoneHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:314963.3 %
Date:2024-04-18 23:11:36Functions:8988.9 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
safety_zone.cpp +
60.0%60.0%
+
60.0 %15 / 2583.3 %5 / 6
<unnamed>60.0 %15 / 2583.3 %5 / 6
line_operations.cpp +
66.7%66.7%
+
66.7 %16 / 24100.0 %3 / 3
<unnamed>66.7 %16 / 24100.0 %3 / 3
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/safety_zone/index-detail.html b/mrs_lib/src/safety_zone/index-detail.html new file mode 100644 index 0000000000..7006461b8e --- /dev/null +++ b/mrs_lib/src/safety_zone/index-detail.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/safety_zone + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/safety_zoneHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:314963.3 %
Date:2024-04-18 23:11:36Functions:8988.9 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
line_operations.cpp +
66.7%66.7%
+
66.7 %16 / 24100.0 %3 / 3
<unnamed>66.7 %16 / 24100.0 %3 / 3
safety_zone.cpp +
60.0%60.0%
+
60.0 %15 / 2583.3 %5 / 6
<unnamed>60.0 %15 / 2583.3 %5 / 6
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/safety_zone/index-sort-f.html b/mrs_lib/src/safety_zone/index-sort-f.html new file mode 100644 index 0000000000..8290542d46 --- /dev/null +++ b/mrs_lib/src/safety_zone/index-sort-f.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/safety_zone + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/safety_zoneHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:314963.3 %
Date:2024-04-18 23:11:36Functions:8988.9 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
safety_zone.cpp +
60.0%60.0%
+
60.0 %15 / 2583.3 %5 / 6
line_operations.cpp +
66.7%66.7%
+
66.7 %16 / 24100.0 %3 / 3
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/safety_zone/index-sort-l.html b/mrs_lib/src/safety_zone/index-sort-l.html new file mode 100644 index 0000000000..3b0b5cbba8 --- /dev/null +++ b/mrs_lib/src/safety_zone/index-sort-l.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/safety_zone + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/safety_zoneHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:314963.3 %
Date:2024-04-18 23:11:36Functions:8988.9 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
safety_zone.cpp +
60.0%60.0%
+
60.0 %15 / 2583.3 %5 / 6
line_operations.cpp +
66.7%66.7%
+
66.7 %16 / 24100.0 %3 / 3
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/safety_zone/index.html b/mrs_lib/src/safety_zone/index.html new file mode 100644 index 0000000000..65f56e2eea --- /dev/null +++ b/mrs_lib/src/safety_zone/index.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/safety_zone + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/safety_zoneHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:314963.3 %
Date:2024-04-18 23:11:36Functions:8988.9 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
line_operations.cpp +
66.7%66.7%
+
66.7 %16 / 24100.0 %3 / 3
safety_zone.cpp +
60.0%60.0%
+
60.0 %15 / 2583.3 %5 / 6
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/safety_zone/line_operations.cpp.func-sort-c.html b/mrs_lib/src/safety_zone/line_operations.cpp.func-sort-c.html new file mode 100644 index 0000000000..37067f5af5 --- /dev/null +++ b/mrs_lib/src/safety_zone/line_operations.cpp.func-sort-c.html @@ -0,0 +1,92 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/safety_zone/line_operations.cpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/safety_zone - line_operations.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:162466.7 %
Date:2024-04-18 23:11:36Functions:33100.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
getScale(Eigen::Matrix<double, 1, 2, 1, 1, 2>, Eigen::Matrix<double, 1, 2, 1, 1, 2>, Eigen::Matrix<double, 1, 2, 1, 1, 2>)220
mrs_lib::Intersection::Intersection(bool, bool, Eigen::Matrix<double, 1, 2, 1, 1, 2>)252
mrs_lib::sectionIntersect(Eigen::Matrix<double, 1, 2, 1, 1, 2>, Eigen::Matrix<double, 1, 2, 1, 1, 2>, Eigen::Matrix<double, 1, 2, 1, 1, 2>, Eigen::Matrix<double, 1, 2, 1, 1, 2>)252
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/safety_zone/line_operations.cpp.func.html b/mrs_lib/src/safety_zone/line_operations.cpp.func.html new file mode 100644 index 0000000000..bbd051c662 --- /dev/null +++ b/mrs_lib/src/safety_zone/line_operations.cpp.func.html @@ -0,0 +1,92 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/safety_zone/line_operations.cpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/safety_zone - line_operations.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:162466.7 %
Date:2024-04-18 23:11:36Functions:33100.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
getScale(Eigen::Matrix<double, 1, 2, 1, 1, 2>, Eigen::Matrix<double, 1, 2, 1, 1, 2>, Eigen::Matrix<double, 1, 2, 1, 1, 2>)220
mrs_lib::Intersection::Intersection(bool, bool, Eigen::Matrix<double, 1, 2, 1, 1, 2>)252
mrs_lib::sectionIntersect(Eigen::Matrix<double, 1, 2, 1, 1, 2>, Eigen::Matrix<double, 1, 2, 1, 1, 2>, Eigen::Matrix<double, 1, 2, 1, 1, 2>, Eigen::Matrix<double, 1, 2, 1, 1, 2>)252
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/safety_zone/line_operations.cpp.gcov.frameset.html b/mrs_lib/src/safety_zone/line_operations.cpp.gcov.frameset.html new file mode 100644 index 0000000000..e4725be416 --- /dev/null +++ b/mrs_lib/src/safety_zone/line_operations.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/safety_zone/line_operations.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/src/safety_zone/line_operations.cpp.gcov.html b/mrs_lib/src/safety_zone/line_operations.cpp.gcov.html new file mode 100644 index 0000000000..9023142a80 --- /dev/null +++ b/mrs_lib/src/safety_zone/line_operations.cpp.gcov.html @@ -0,0 +1,143 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/safety_zone/line_operations.cpp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/safety_zone - line_operations.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:162466.7 %
Date:2024-04-18 23:11:36Functions:33100.0 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : #include <mrs_lib/safety_zone/line_operations.h>
+       2             : 
+       3             : /* getScale() //{ */
+       4             : 
+       5         220 : static double getScale(Eigen::RowVector2d start, Eigen::RowVector2d vector, Eigen::RowVector2d point) {
+       6             :   // Returns the scalar that produces: start + scale * vector = point
+       7             :   // Assuming that such scalar exists
+       8         220 :   return vector(0) != 0 ? (point(0) - start(0)) / vector(0) : (point(1) - start(1)) / vector(1);
+       9             : }
+      10             : 
+      11             : //}
+      12             : 
+      13             : namespace mrs_lib
+      14             : {
+      15         252 : Intersection::Intersection(bool intersect, bool parallel, Eigen::RowVector2d point) : point(std::move(point)), parallel(parallel), intersect(intersect){}
+      16             : 
+      17             : /* sectionIntersect() //{ */
+      18             : 
+      19         252 : Intersection sectionIntersect(Eigen::RowVector2d start1, Eigen::RowVector2d end1, Eigen::RowVector2d start2, Eigen::RowVector2d end2) {
+      20         252 :   Eigen::RowVector2d vector1 = end1 - start1;
+      21         252 :   Eigen::RowVector2d vector2 = end2 - start2;
+      22             : 
+      23             :   // x - cross product (in 2d is just a scalar of z)
+      24             :   // start1 + scale1 * vector1 = start2 + scale2 * vector2  // x vector2
+      25             :   // scale1 * vector1 x vector2 = (start2 - start1) x vector2
+      26             : 
+      27             :   // cross product
+      28         252 :   double cross            = vector1(0) * vector2(1) - vector1(1) * vector2(0);
+      29         252 :   double difference_cross = (start2(0) - start1(0)) * vector2(1) - (start2(1) - start1(1)) * vector2(0);
+      30             : 
+      31         252 :   if (cross == 0) {
+      32             :     // are parallel
+      33          32 :     if (difference_cross != 0)
+      34          32 :       return Intersection{false, true};
+      35             : 
+      36             :     // are collinear
+      37           0 :     double start2Scale = getScale(start1, vector1, start2);
+      38           0 :     if (0 <= start2Scale && start2Scale <= 1)
+      39           0 :       return Intersection{true, true, start2};
+      40           0 :     double end2Scale = getScale(start1, vector1, end2);
+      41           0 :     if (0 <= end2Scale && end2Scale <= 1)
+      42           0 :       return Intersection{true, true, end2};
+      43             : 
+      44           0 :     return Intersection{false, true};
+      45             :   }
+      46             : 
+      47         220 :   double             scale1 = difference_cross / cross;
+      48         220 :   Eigen::RowVector2d point  = start1 + scale1 * vector1;
+      49         220 :   double             scale2 = getScale(start2, vector2, point);
+      50             : 
+      51         220 :   if (0 <= scale1 && scale1 <= 1 && 0 <= scale2 && scale2 <= 1) {
+      52           0 :     return Intersection{true, false, point};
+      53             :   }
+      54         220 :   return Intersection{false, false};
+      55             : }
+      56             : 
+      57             : //}
+      58             : 
+      59             : }  // namespace mrs_lib
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/safety_zone/line_operations.cpp.gcov.overview.html b/mrs_lib/src/safety_zone/line_operations.cpp.gcov.overview.html new file mode 100644 index 0000000000..0299c5c2d4 --- /dev/null +++ b/mrs_lib/src/safety_zone/line_operations.cpp.gcov.overview.html @@ -0,0 +1,35 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/safety_zone/line_operations.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/src/safety_zone/line_operations.cpp.gcov.png b/mrs_lib/src/safety_zone/line_operations.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..f17bea8867e5900f80693d9429a08dd5c1c6f437 GIT binary patch literal 465 zcmV;?0WSWDP)x`S;$& zh!6sV;6o2ji*1r0-bIVAif(bpzgG0Gm;f;b+KCy$k6* zs4m;HHi$ik5mX|ecdHlV%1G1G#Q0wdsxjOFHw9s>yDgx~&V~I2Q7j6pwWdbYR+}PA z)a9H3)GF?29@(tQ}DV%D5I>#>bITI#a<(uasiqwRl`8#4}cAWZu~^8nKxqW5`|+ zD{t}~@5JhwJTDz@U9X8EsL|jQT1Q;3&qOhbB&eEjshWj7h-17`uxa4>$3$FNY>9oBsNWudC5U^nv{V0@Ny(PO3(N00000NkvXX Hu0mjfFxJW; literal 0 HcmV?d00001 diff --git a/mrs_lib/src/safety_zone/polygon/index-detail-sort-f.html b/mrs_lib/src/safety_zone/polygon/index-detail-sort-f.html new file mode 100644 index 0000000000..6d9468135d --- /dev/null +++ b/mrs_lib/src/safety_zone/polygon/index-detail-sort-f.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/safety_zone/polygon + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/safety_zone/polygonHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:4210340.8 %
Date:2024-04-18 23:11:36Functions:4850.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
polygon.cpp +
40.8%40.8%
+
40.8 %42 / 10350.0 %4 / 8
<unnamed>40.8 %42 / 10350.0 %4 / 8
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/safety_zone/polygon/index-detail-sort-l.html b/mrs_lib/src/safety_zone/polygon/index-detail-sort-l.html new file mode 100644 index 0000000000..6a9ce78d6c --- /dev/null +++ b/mrs_lib/src/safety_zone/polygon/index-detail-sort-l.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/safety_zone/polygon + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/safety_zone/polygonHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:4210340.8 %
Date:2024-04-18 23:11:36Functions:4850.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
polygon.cpp +
40.8%40.8%
+
40.8 %42 / 10350.0 %4 / 8
<unnamed>40.8 %42 / 10350.0 %4 / 8
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/safety_zone/polygon/index-detail.html b/mrs_lib/src/safety_zone/polygon/index-detail.html new file mode 100644 index 0000000000..2ee4bbcb84 --- /dev/null +++ b/mrs_lib/src/safety_zone/polygon/index-detail.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/safety_zone/polygon + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/safety_zone/polygonHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:4210340.8 %
Date:2024-04-18 23:11:36Functions:4850.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
polygon.cpp +
40.8%40.8%
+
40.8 %42 / 10350.0 %4 / 8
<unnamed>40.8 %42 / 10350.0 %4 / 8
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/safety_zone/polygon/index-sort-f.html b/mrs_lib/src/safety_zone/polygon/index-sort-f.html new file mode 100644 index 0000000000..9bd4d9cd31 --- /dev/null +++ b/mrs_lib/src/safety_zone/polygon/index-sort-f.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/safety_zone/polygon + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/safety_zone/polygonHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:4210340.8 %
Date:2024-04-18 23:11:36Functions:4850.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
polygon.cpp +
40.8%40.8%
+
40.8 %42 / 10350.0 %4 / 8
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/safety_zone/polygon/index-sort-l.html b/mrs_lib/src/safety_zone/polygon/index-sort-l.html new file mode 100644 index 0000000000..4f205b5251 --- /dev/null +++ b/mrs_lib/src/safety_zone/polygon/index-sort-l.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/safety_zone/polygon + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/safety_zone/polygonHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:4210340.8 %
Date:2024-04-18 23:11:36Functions:4850.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
polygon.cpp +
40.8%40.8%
+
40.8 %42 / 10350.0 %4 / 8
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/safety_zone/polygon/index.html b/mrs_lib/src/safety_zone/polygon/index.html new file mode 100644 index 0000000000..acc70c619c --- /dev/null +++ b/mrs_lib/src/safety_zone/polygon/index.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/safety_zone/polygon + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/safety_zone/polygonHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:4210340.8 %
Date:2024-04-18 23:11:36Functions:4850.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
polygon.cpp +
40.8%40.8%
+
40.8 %42 / 10350.0 %4 / 8
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/safety_zone/polygon/polygon.cpp.func-sort-c.html b/mrs_lib/src/safety_zone/polygon/polygon.cpp.func-sort-c.html new file mode 100644 index 0000000000..9bf1a616ee --- /dev/null +++ b/mrs_lib/src/safety_zone/polygon/polygon.cpp.func-sort-c.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/safety_zone/polygon/polygon.cpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/safety_zone/polygon - polygon.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:4210340.8 %
Date:2024-04-18 23:11:36Functions:4850.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::Polygon::inflateSelf(double)0
mrs_lib::Polygon::isClockwise()0
mrs_lib::lineIntersectGivenVector(Eigen::Matrix<double, 1, 2, 1, 1, 2>, Eigen::Matrix<double, 1, 2, 1, 1, 2>, Eigen::Matrix<double, 1, 2, 1, 1, 2>, Eigen::Matrix<double, 1, 2, 1, 1, 2>)0
mrs_lib::movePoint(Eigen::Matrix<double, 1, 2, 1, 1, 2>, double, Eigen::Matrix<double, 1, 2, 1, 1, 2>)0
mrs_lib::Polygon::doesSectionIntersect(double, double, double, double)63
mrs_lib::Polygon::Polygon(Eigen::Matrix<double, -1, -1, 0, -1, -1>)71
mrs_lib::Polygon::isPointInside(double, double)10026
mrs_lib::Polygon::getPointMessageVector(double)21974
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/safety_zone/polygon/polygon.cpp.func.html b/mrs_lib/src/safety_zone/polygon/polygon.cpp.func.html new file mode 100644 index 0000000000..ab1bb86b8a --- /dev/null +++ b/mrs_lib/src/safety_zone/polygon/polygon.cpp.func.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/safety_zone/polygon/polygon.cpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/safety_zone/polygon - polygon.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:4210340.8 %
Date:2024-04-18 23:11:36Functions:4850.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::Polygon::inflateSelf(double)0
mrs_lib::Polygon::isClockwise()0
mrs_lib::Polygon::isPointInside(double, double)10026
mrs_lib::Polygon::doesSectionIntersect(double, double, double, double)63
mrs_lib::Polygon::getPointMessageVector(double)21974
mrs_lib::Polygon::Polygon(Eigen::Matrix<double, -1, -1, 0, -1, -1>)71
mrs_lib::lineIntersectGivenVector(Eigen::Matrix<double, 1, 2, 1, 1, 2>, Eigen::Matrix<double, 1, 2, 1, 1, 2>, Eigen::Matrix<double, 1, 2, 1, 1, 2>, Eigen::Matrix<double, 1, 2, 1, 1, 2>)0
mrs_lib::movePoint(Eigen::Matrix<double, 1, 2, 1, 1, 2>, double, Eigen::Matrix<double, 1, 2, 1, 1, 2>)0
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/safety_zone/polygon/polygon.cpp.gcov.frameset.html b/mrs_lib/src/safety_zone/polygon/polygon.cpp.gcov.frameset.html new file mode 100644 index 0000000000..c64c98491c --- /dev/null +++ b/mrs_lib/src/safety_zone/polygon/polygon.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/safety_zone/polygon/polygon.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/src/safety_zone/polygon/polygon.cpp.gcov.html b/mrs_lib/src/safety_zone/polygon/polygon.cpp.gcov.html new file mode 100644 index 0000000000..1f7fb56c6e --- /dev/null +++ b/mrs_lib/src/safety_zone/polygon/polygon.cpp.gcov.html @@ -0,0 +1,290 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/safety_zone/polygon/polygon.cpp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/safety_zone/polygon - polygon.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:4210340.8 %
Date:2024-04-18 23:11:36Functions:4850.0 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : #include <mrs_lib/safety_zone/polygon.h>
+       2             : #include <mrs_lib/safety_zone/line_operations.h>
+       3             : 
+       4             : namespace mrs_lib
+       5             : {
+       6             : 
+       7             : /* Polygon() //{ */
+       8             : 
+       9          71 : Polygon::Polygon(const Eigen::MatrixXd vertices) : vertices(vertices) {
+      10             : 
+      11          71 :   if (vertices.cols() != 2) {
+      12           0 :     ROS_WARN("(Polygon) The supplied polygon has to have 2 cols. It has %lu.", vertices.cols());
+      13           0 :     throw WrongNumberOfColumns();
+      14             :   }
+      15          71 :   if (vertices.rows() < 3) {
+      16           0 :     ROS_WARN("(Polygon) The supplied polygon has to have at least 3 vertices. It has %lu.", vertices.rows());
+      17           0 :     throw WrongNumberOfVertices();
+      18             :   }
+      19             : 
+      20          71 :   Eigen::RowVector2d edge1;
+      21          71 :   Eigen::RowVector2d edge2 = vertices.row(1) - vertices.row(0);
+      22         355 :   for (int i = 0; i < vertices.rows(); ++i) {
+      23         284 :     edge1 = edge2;
+      24         284 :     edge2 = vertices.row((i + 2) % vertices.rows()) - vertices.row((i + 1) % vertices.rows());
+      25             : 
+      26         284 :     if (edge1(0) == 0 && edge1(1) == 0) {
+      27           0 :       ROS_WARN("(Polygon) Polygon edge %d is of length zero.", i);
+      28           0 :       throw ExtraVertices();
+      29             :     }
+      30         284 :     if (edge1(0) * edge2(1) == edge1(1) * edge2(0)) {
+      31           0 :       ROS_WARN("(Polygon) Adjacent Polygon edges at vertice %d are collinear.", (int)((i + 1) % vertices.rows()));
+      32           0 :       throw ExtraVertices();
+      33             :     }
+      34             :   }
+      35          71 : }
+      36             : 
+      37             : //}
+      38             : 
+      39             : /* isPointInside() //{ */
+      40             : 
+      41       10026 : bool Polygon::isPointInside(const double px, const double py) {
+      42             : 
+      43       10026 :   int count = 0;
+      44             : 
+      45             :   // Cast a horizontal ray and see how many times it intersects all the edges
+      46       50130 :   for (int i = 0; i < vertices.rows(); ++i) {
+      47       40104 :     double v1x = vertices(i, 0);
+      48       40104 :     double v1y = vertices(i, 1);
+      49       40104 :     double v2x = vertices((i + 1) % vertices.rows(), 0);
+      50       40104 :     double v2y = vertices((i + 1) % vertices.rows(), 1);
+      51             : 
+      52       40104 :     if (v1y > py && v2y > py)
+      53        9950 :       continue;
+      54       30154 :     if (v1y <= py && v2y <= py)
+      55       10254 :       continue;
+      56       19900 :     double intersect_x    = (v1y == v2y) ? v1x : (py - v1y) * (v2x - v1x) / (v2y - v1y) + v1x;
+      57       19900 :     bool   does_intersect = intersect_x > px;
+      58       19900 :     if (does_intersect)
+      59        9950 :       ++count;
+      60             :   }
+      61             : 
+      62       10026 :   return count % 2;
+      63             : }
+      64             : 
+      65             : //}
+      66             : 
+      67             : /* doesSectionIntersect() //{ */
+      68             : 
+      69          63 : bool Polygon::doesSectionIntersect(const double startX, const double startY, const double endX, const double endY) {
+      70             : 
+      71          63 :   Eigen::RowVector2d start{startX, startY};
+      72          63 :   Eigen::RowVector2d end{endX, endY};
+      73             : 
+      74         315 :   for (int i = 0; i < vertices.rows(); ++i) {
+      75             : 
+      76         252 :     Eigen::RowVector2d edgeStart = vertices.row(i);
+      77         252 :     Eigen::RowVector2d edgeEnd   = vertices.row((i + 1) % vertices.rows());
+      78             : 
+      79         252 :     if (sectionIntersect(start, end, edgeStart, edgeEnd).intersect) {
+      80           0 :       return true;
+      81             :     }
+      82             :   }
+      83             : 
+      84          63 :   return false;
+      85             : }
+      86             : 
+      87             : //}
+      88             : 
+      89             : /* isClockwise() //{ */
+      90             : 
+      91           0 : bool Polygon::isClockwise() {
+      92             : 
+      93           0 :   int edgeIndex = 0;
+      94           0 :   if (vertices(0, 1) == vertices(1, 1))
+      95           0 :     edgeIndex = 1;
+      96             : 
+      97             :   // get the midPoint of first edge
+      98           0 :   Eigen::RowVector2d center = (vertices.row(edgeIndex) + vertices.row(edgeIndex + 1)) / 2;
+      99             : 
+     100             :   // count the intersections for a horizontal ray starting at center
+     101           0 :   int intersection_count = 0;
+     102           0 :   for (int i = 0; i < vertices.rows(); ++i) {
+     103           0 :     if (i == edgeIndex)
+     104           0 :       continue;
+     105             : 
+     106           0 :     Eigen::MatrixXd edge(2, 2);
+     107           0 :     edge.row(0) = vertices.row(i);
+     108           0 :     edge.row(1) = vertices.row((i + 1) % vertices.rows());
+     109             : 
+     110           0 :     if ((edge(0, 1) <= center(1) && edge(1, 1) <= center(1)) || (edge(0, 1) > center(1) && edge(1, 1) > center(1)))
+     111           0 :       continue;
+     112           0 :     double intersect_x = edge(0, 0) + (edge(1, 0) - edge(0, 0)) / (edge(1, 1) - edge(0, 1)) * (center(1) - edge(0, 1));
+     113           0 :     if (intersect_x >= center(0))
+     114           0 :       ++intersection_count;
+     115             :   }
+     116             : 
+     117             :   // reverse depending on the direction of edge
+     118           0 :   bool clockwise = intersection_count % 2;
+     119           0 :   if (vertices(edgeIndex + 1, 1) < vertices(edgeIndex, 0))
+     120           0 :     clockwise = !clockwise;
+     121           0 :   return clockwise;
+     122             : }
+     123             : 
+     124             : //}
+     125             : 
+     126             : /* movePoint() //{ */
+     127             : 
+     128           0 : static Eigen::RowVector2d movePoint(Eigen::RowVector2d vector, double scale, Eigen::RowVector2d point) {
+     129             : 
+     130           0 :   double             length         = sqrt(vector(0) * vector(0) + vector(1) * vector(1));
+     131           0 :   Eigen::RowVector2d unitary_vector = vector / length;
+     132           0 :   return point + scale * unitary_vector;
+     133             : }
+     134             : 
+     135             : //}
+     136             : 
+     137             : /* lineIntersectGivenVector() //{ */
+     138             : 
+     139           0 : static Intersection lineIntersectGivenVector(Eigen::RowVector2d start1, Eigen::RowVector2d vector1, Eigen::RowVector2d start2, Eigen::RowVector2d vector2) {
+     140             : 
+     141           0 :   double cross            = vector1(0) * vector2(1) - vector1(1) * vector2(0);
+     142           0 :   double difference_cross = (start2(0) - start1(0)) * vector2(1) - (start2(1) - start1(1)) * vector1(0);
+     143             : 
+     144           0 :   if (cross == 0) {
+     145           0 :     if (difference_cross == 0) {
+     146           0 :       return Intersection{true, true, start1};
+     147             :     }
+     148           0 :     return Intersection{false, true};
+     149             :   }
+     150             : 
+     151           0 :   double             scale1 = difference_cross / cross;
+     152           0 :   Eigen::RowVector2d point  = start1 + scale1 * vector1;
+     153           0 :   return Intersection{true, false, point};
+     154             : }
+     155             : 
+     156             : //}
+     157             : 
+     158             : /* inflateSelf() //{ */
+     159             : 
+     160           0 : void Polygon::inflateSelf(double amount) {
+     161             : 
+     162             :   // Also supports negative numbers
+     163           0 :   Eigen::MatrixXd result{vertices.rows(), vertices.cols()};
+     164             : 
+     165           0 :   bool clockwise = isClockwise();
+     166           0 :   amount         = (clockwise ? 1 : -1) * amount;
+     167             : 
+     168           0 :   for (int i = 0; i < vertices.rows(); ++i) {
+     169           0 :     Eigen::RowVector2d pPrev    = vertices.row((i + vertices.rows() - 1) % vertices.rows());
+     170           0 :     Eigen::RowVector2d pCurrent = vertices.row(i);
+     171           0 :     Eigen::RowVector2d pNext    = vertices.row((i + 1) % vertices.rows());
+     172             : 
+     173           0 :     Eigen::RowVector2d vector1 = pCurrent - pPrev;
+     174           0 :     Eigen::RowVector2d vector2 = pNext - pCurrent;
+     175             :     // make them orthogonally counter-clockwise
+     176           0 :     Eigen::RowVector2d vectorOrthogonal1{-vector1(1), vector1(0)};
+     177           0 :     Eigen::RowVector2d vectorOrthogonal2{-vector2(1), vector2(0)};
+     178             :     // move the currentPoint in 2 directions
+     179           0 :     pPrev = movePoint(vectorOrthogonal1, amount, pCurrent);
+     180           0 :     pNext = movePoint(vectorOrthogonal2, amount, pCurrent);
+     181             : 
+     182             :     // add the intersection as a new point
+     183           0 :     result.row(i) = lineIntersectGivenVector(pPrev, vector1, pNext, vector2).point;
+     184             :   }
+     185             : 
+     186           0 :   vertices = result.replicate(result.rows(), result.cols());
+     187           0 : }
+     188             : 
+     189             : //}
+     190             : 
+     191             : /* getPointMessageVector() //{ */
+     192             : 
+     193       21974 : std::vector<geometry_msgs::Point> Polygon::getPointMessageVector(const double z) {
+     194       21974 :   std::vector<geometry_msgs::Point> points(vertices.rows());
+     195      109870 :   for (int i = 0; i < vertices.rows(); ++i) {
+     196       87896 :     points[i].x = vertices(i, 0);
+     197       87896 :     points[i].y = vertices(i, 1);
+     198       87896 :     points[i].z = z;
+     199             :   }
+     200             : 
+     201       21974 :   return points;
+     202             : }
+     203             : 
+     204             : //}
+     205             : 
+     206             : }  // namespace mrs_lib
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/safety_zone/polygon/polygon.cpp.gcov.overview.html b/mrs_lib/src/safety_zone/polygon/polygon.cpp.gcov.overview.html new file mode 100644 index 0000000000..9588a3df3c --- /dev/null +++ b/mrs_lib/src/safety_zone/polygon/polygon.cpp.gcov.overview.html @@ -0,0 +1,72 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/safety_zone/polygon/polygon.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/src/safety_zone/polygon/polygon.cpp.gcov.png b/mrs_lib/src/safety_zone/polygon/polygon.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..c5adcdf99ff4cbdb4f4d66b7c0b94eb7d1a120a0 GIT binary patch literal 1057 zcmV++1m63JP)$b|L8UA<<9=Mz;iKKL zc85A%)j`nM+>C0sP4({7g2YB=->8c@2R2p;@?r$K>&=yT$KdT}Al0K?NiI0!a}48<^f9CF$uEE6&Xh67|26T@sH z7?{ReS$eS%EQ?keA8+y23pTP@Y7kj9GEBiagRZv3^p8S}k;{~ln*bK@=b`v9j>8O7x3!hsfSt!0@1=dGtW8oJBV+H5d4pTv>`(hy&)*zj( zSqc|y+@OqrDq`;y@=DY6ai)T1whFiix`T|!T^oY}^bsykVh{1lIoYnb$6|g3+q6ka zf*0^Cb!{i`6ica*0WU1XBl+wQrpE`8=bAYR#+>13r*0wuh;W)wx`L2EJsdUqdoucs z>751lyhip9?uS{z_63)vC3)O8SRs2%HVsZky;{@1C6OjH!|f)7T9W|!bqF70M!(0mQFJONCbVxa9@L zEt4xx?zIhNaw$wKa~b+pJI7w~4+MWHxn3%U!8@&3TdVdCd`UBUtwQS~TOSiNmh!ro zhWj-I!~o{6fy$(QU~vh+tVn6(DpJg)18-I(*e?%98jJGqM(GOikoso`#x5IzI(Vpy za$DmyH0}s$eAkoe(FOy=H$Lqep^itkAk*Pwbrwp@aM;Wlm9T9LTBpIkM9swtu<$+6 z$R<*@dtRpp48Ije%?LqZv5O4oNNrewuL-@oAL{rSI2&^ b{<+`}Uto53>9?6+00000NkvXXu0mjfHe=(^ literal 0 HcmV?d00001 diff --git a/mrs_lib/src/safety_zone/safety_zone.cpp.func-sort-c.html b/mrs_lib/src/safety_zone/safety_zone.cpp.func-sort-c.html new file mode 100644 index 0000000000..c1e2181d63 --- /dev/null +++ b/mrs_lib/src/safety_zone/safety_zone.cpp.func-sort-c.html @@ -0,0 +1,104 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/safety_zone/safety_zone.cpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/safety_zone - safety_zone.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:152560.0 %
Date:2024-04-18 23:11:36Functions:5683.3 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::SafetyZone::SafetyZone(mrs_lib::Polygon)0
mrs_lib::SafetyZone::isPathValid(double, double, double, double)63
mrs_lib::SafetyZone::SafetyZone(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&)71
mrs_lib::SafetyZone::~SafetyZone()71
mrs_lib::SafetyZone::isPointValid(double, double)10026
mrs_lib::SafetyZone::getBorder()10987
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/safety_zone/safety_zone.cpp.func.html b/mrs_lib/src/safety_zone/safety_zone.cpp.func.html new file mode 100644 index 0000000000..810b190992 --- /dev/null +++ b/mrs_lib/src/safety_zone/safety_zone.cpp.func.html @@ -0,0 +1,104 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/safety_zone/safety_zone.cpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/safety_zone - safety_zone.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:152560.0 %
Date:2024-04-18 23:11:36Functions:5683.3 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::SafetyZone::isPathValid(double, double, double, double)63
mrs_lib::SafetyZone::isPointValid(double, double)10026
mrs_lib::SafetyZone::getBorder()10987
mrs_lib::SafetyZone::SafetyZone(mrs_lib::Polygon)0
mrs_lib::SafetyZone::SafetyZone(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&)71
mrs_lib::SafetyZone::~SafetyZone()71
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/safety_zone/safety_zone.cpp.gcov.frameset.html b/mrs_lib/src/safety_zone/safety_zone.cpp.gcov.frameset.html new file mode 100644 index 0000000000..3322088862 --- /dev/null +++ b/mrs_lib/src/safety_zone/safety_zone.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/safety_zone/safety_zone.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/src/safety_zone/safety_zone.cpp.gcov.html b/mrs_lib/src/safety_zone/safety_zone.cpp.gcov.html new file mode 100644 index 0000000000..95adf0487a --- /dev/null +++ b/mrs_lib/src/safety_zone/safety_zone.cpp.gcov.html @@ -0,0 +1,160 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/safety_zone/safety_zone.cpp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/safety_zone - safety_zone.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:152560.0 %
Date:2024-04-18 23:11:36Functions:5683.3 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : #include <mrs_lib/safety_zone/safety_zone.h>
+       2             : #include <mrs_lib/safety_zone/line_operations.h>
+       3             : 
+       4             : namespace mrs_lib
+       5             : {
+       6             : /* SafetyZone() //{ */
+       7             : 
+       8           0 : SafetyZone::SafetyZone(mrs_lib::Polygon border) {
+       9           0 :   outerBorder = new Polygon(border);
+      10           0 : }
+      11             : 
+      12             : //}
+      13             : 
+      14             : /* SafetyZone() //{ */
+      15             : 
+      16         142 : SafetyZone::~SafetyZone() {
+      17          71 :   delete outerBorder;
+      18          71 : }
+      19             : 
+      20             : //}
+      21             : 
+      22             : /* SafetyZone() //{ */
+      23             : 
+      24          71 : SafetyZone::SafetyZone(const Eigen::MatrixXd& outerBorderMatrix) {
+      25             : 
+      26             :   try {
+      27          71 :     outerBorder = new Polygon(outerBorderMatrix);
+      28             :   }
+      29           0 :   catch (const Polygon::WrongNumberOfVertices&) {
+      30           0 :     throw BorderError();
+      31             :   }
+      32           0 :   catch (const Polygon::WrongNumberOfColumns&) {
+      33           0 :     throw BorderError();
+      34             :   }
+      35           0 :   catch (const Polygon::ExtraVertices&) {
+      36           0 :     throw BorderError();
+      37             :   }
+      38          71 : }
+      39             : 
+      40             : //}
+      41             : 
+      42             : /* isPointValid() //{ */
+      43             : 
+      44       10026 : bool SafetyZone::isPointValid(const double px, const double py) {
+      45             : 
+      46       10026 :   if (!outerBorder->isPointInside(px, py)) {
+      47          76 :     return false;
+      48             :   }
+      49             : 
+      50        9950 :   return true;
+      51             : }
+      52             : 
+      53             : //}
+      54             : 
+      55             : /* isPathValid() //{ */
+      56             : 
+      57          63 : bool SafetyZone::isPathValid(const double p1x, const double p1y, const double p2x, const double p2y) {
+      58             : 
+      59          63 :   if (outerBorder->doesSectionIntersect(p1x, p1y, p2x, p2y)) {
+      60           0 :     return false;
+      61             :   }
+      62             : 
+      63          63 :   return true;
+      64             : }
+      65             : 
+      66             : //}
+      67             : 
+      68             : /* getBorder() //{ */
+      69             : 
+      70       10987 : Polygon SafetyZone::getBorder() {
+      71       10987 :   return *outerBorder;
+      72             : }
+      73             : 
+      74             : //}
+      75             : 
+      76             : }  // namespace mrs_lib
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/safety_zone/safety_zone.cpp.gcov.overview.html b/mrs_lib/src/safety_zone/safety_zone.cpp.gcov.overview.html new file mode 100644 index 0000000000..516836160f --- /dev/null +++ b/mrs_lib/src/safety_zone/safety_zone.cpp.gcov.overview.html @@ -0,0 +1,39 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/safety_zone/safety_zone.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/src/safety_zone/safety_zone.cpp.gcov.png b/mrs_lib/src/safety_zone/safety_zone.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..167b4f7e497806e1c5538d1ea552833672a06ad0 GIT binary patch literal 380 zcmeAS@N?(olHy`uVBq!ia0vp^0YL1-!VDxiv~}x%lth3}i0l9V|5pLQ^7pZ^ul_SI ztOAOIsdL_&mjcUg-y18yaI7 z%{TmBAEdP6g!??PYWMlaW!d{%T5MX_xDAgi5UEU>#?=(=ooAXfbwgx{^ptPA_pfEX zr8Q=~Zx;(p%CC$O zP7U7LAJccMt@r5KDfW90#J-#3(dd47R^nEljR%4XE7Kywv;{-LPkx;e_>ezFUC{o? zF6FZ(B4^i4cF>!}Zu))uYmWY?qhdFgoD=+88s=@YPEz7t@m-}D5rcW!T!tNP+a@o% z@J`_IIdj*CXR4B|CzhW5w0@=7b<>`Dovt!d$M*P_C!JL*md<&;soTa&apCeG>;_zJ VEeW!JlYl|R;OXk;vd$@?2>{; + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/scope_timer + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/scope_timerHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:2014214.1 %
Date:2024-04-18 23:11:36Functions:51050.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
scope_timer.cpp +
14.1%14.1%
+
14.1 %20 / 14250.0 %5 / 10
<unnamed>14.1 %20 / 14250.0 %5 / 10
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/scope_timer/index-detail-sort-l.html b/mrs_lib/src/scope_timer/index-detail-sort-l.html new file mode 100644 index 0000000000..dd77aab1cb --- /dev/null +++ b/mrs_lib/src/scope_timer/index-detail-sort-l.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/scope_timer + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/scope_timerHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:2014214.1 %
Date:2024-04-18 23:11:36Functions:51050.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
scope_timer.cpp +
14.1%14.1%
+
14.1 %20 / 14250.0 %5 / 10
<unnamed>14.1 %20 / 14250.0 %5 / 10
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/scope_timer/index-detail.html b/mrs_lib/src/scope_timer/index-detail.html new file mode 100644 index 0000000000..fb614df036 --- /dev/null +++ b/mrs_lib/src/scope_timer/index-detail.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/scope_timer + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/scope_timerHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:2014214.1 %
Date:2024-04-18 23:11:36Functions:51050.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
scope_timer.cpp +
14.1%14.1%
+
14.1 %20 / 14250.0 %5 / 10
<unnamed>14.1 %20 / 14250.0 %5 / 10
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/scope_timer/index-sort-f.html b/mrs_lib/src/scope_timer/index-sort-f.html new file mode 100644 index 0000000000..0030e2a8c6 --- /dev/null +++ b/mrs_lib/src/scope_timer/index-sort-f.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/scope_timer + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/scope_timerHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:2014214.1 %
Date:2024-04-18 23:11:36Functions:51050.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
scope_timer.cpp +
14.1%14.1%
+
14.1 %20 / 14250.0 %5 / 10
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/scope_timer/index-sort-l.html b/mrs_lib/src/scope_timer/index-sort-l.html new file mode 100644 index 0000000000..37f92e0a8c --- /dev/null +++ b/mrs_lib/src/scope_timer/index-sort-l.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/scope_timer + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/scope_timerHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:2014214.1 %
Date:2024-04-18 23:11:36Functions:51050.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
scope_timer.cpp +
14.1%14.1%
+
14.1 %20 / 14250.0 %5 / 10
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/scope_timer/index.html b/mrs_lib/src/scope_timer/index.html new file mode 100644 index 0000000000..b66950e0d0 --- /dev/null +++ b/mrs_lib/src/scope_timer/index.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/scope_timer + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/scope_timerHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:2014214.1 %
Date:2024-04-18 23:11:36Functions:51050.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
scope_timer.cpp +
14.1%14.1%
+
14.1 %20 / 14250.0 %5 / 10
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/scope_timer/scope_timer.cpp.func-sort-c.html b/mrs_lib/src/scope_timer/scope_timer.cpp.func-sort-c.html new file mode 100644 index 0000000000..f71731d77d --- /dev/null +++ b/mrs_lib/src/scope_timer/scope_timer.cpp.func-sort-c.html @@ -0,0 +1,120 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/scope_timer/scope_timer.cpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/scope_timer - scope_timer.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:2014214.1 %
Date:2024-04-18 23:11:36Functions:51050.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::ScopeTimer::getLifetime()0
mrs_lib::ScopeTimer::ScopeTimer(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Duration const&, bool, std::shared_ptr<mrs_lib::ScopeTimerLogger>)0
mrs_lib::ScopeTimer::ScopeTimer(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, mrs_lib::ScopeTimer::time_point const&, ros::Duration const&, bool, std::shared_ptr<mrs_lib::ScopeTimerLogger>)0
mrs_lib::ScopeTimerLogger::log(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::chrono::time_point<std::chrono::_V2::steady_clock, std::chrono::duration<long, std::ratio<1l, 1000000000l> > > const&, std::chrono::time_point<std::chrono::_V2::steady_clock, std::chrono::duration<long, std::ratio<1l, 1000000000l> > > const&)0
mrs_lib::ScopeTimerLogger::log(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::chrono::time_point<std::chrono::_V2::steady_clock, std::chrono::duration<long, std::ratio<1l, 1000000000l> > > const&, std::chrono::time_point<std::chrono::_V2::steady_clock, std::chrono::duration<long, std::ratio<1l, 1000000000l> > > const&)0
mrs_lib::ScopeTimerLogger::ScopeTimerLogger(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool, int)637
mrs_lib::ScopeTimerLogger::~ScopeTimerLogger()637
mrs_lib::ScopeTimer::checkpoint(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)4019097
mrs_lib::ScopeTimer::ScopeTimer(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mrs_lib::ScopeTimerLogger>, bool)5161614
mrs_lib::ScopeTimer::~ScopeTimer()5163859
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/scope_timer/scope_timer.cpp.func.html b/mrs_lib/src/scope_timer/scope_timer.cpp.func.html new file mode 100644 index 0000000000..50c03ca031 --- /dev/null +++ b/mrs_lib/src/scope_timer/scope_timer.cpp.func.html @@ -0,0 +1,120 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/scope_timer/scope_timer.cpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/scope_timer - scope_timer.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:2014214.1 %
Date:2024-04-18 23:11:36Functions:51050.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::ScopeTimer::checkpoint(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)4019097
mrs_lib::ScopeTimer::getLifetime()0
mrs_lib::ScopeTimer::ScopeTimer(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Duration const&, bool, std::shared_ptr<mrs_lib::ScopeTimerLogger>)0
mrs_lib::ScopeTimer::ScopeTimer(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, mrs_lib::ScopeTimer::time_point const&, ros::Duration const&, bool, std::shared_ptr<mrs_lib::ScopeTimerLogger>)0
mrs_lib::ScopeTimer::ScopeTimer(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mrs_lib::ScopeTimerLogger>, bool)5161614
mrs_lib::ScopeTimer::~ScopeTimer()5163859
mrs_lib::ScopeTimerLogger::log(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::chrono::time_point<std::chrono::_V2::steady_clock, std::chrono::duration<long, std::ratio<1l, 1000000000l> > > const&, std::chrono::time_point<std::chrono::_V2::steady_clock, std::chrono::duration<long, std::ratio<1l, 1000000000l> > > const&)0
mrs_lib::ScopeTimerLogger::log(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::chrono::time_point<std::chrono::_V2::steady_clock, std::chrono::duration<long, std::ratio<1l, 1000000000l> > > const&, std::chrono::time_point<std::chrono::_V2::steady_clock, std::chrono::duration<long, std::ratio<1l, 1000000000l> > > const&)0
mrs_lib::ScopeTimerLogger::ScopeTimerLogger(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool, int)637
mrs_lib::ScopeTimerLogger::~ScopeTimerLogger()637
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/scope_timer/scope_timer.cpp.gcov.frameset.html b/mrs_lib/src/scope_timer/scope_timer.cpp.gcov.frameset.html new file mode 100644 index 0000000000..56e3d2ae0a --- /dev/null +++ b/mrs_lib/src/scope_timer/scope_timer.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/scope_timer/scope_timer.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/src/scope_timer/scope_timer.cpp.gcov.html b/mrs_lib/src/scope_timer/scope_timer.cpp.gcov.html new file mode 100644 index 0000000000..d5855eac26 --- /dev/null +++ b/mrs_lib/src/scope_timer/scope_timer.cpp.gcov.html @@ -0,0 +1,345 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/scope_timer/scope_timer.cpp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/scope_timer - scope_timer.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:2014214.1 %
Date:2024-04-18 23:11:36Functions:51050.0 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : #include <mrs_lib/scope_timer.h>
+       2             : 
+       3             : namespace mrs_lib
+       4             : {
+       5             : 
+       6             : // | --------------------- ScopeTimerLogger --------------------- |
+       7             : 
+       8             : /*//{ ScopeTimerLogger constructor */
+       9         637 : ScopeTimerLogger::ScopeTimerLogger(const std::string& logfile, const bool enable_logging, const int log_precision)
+      10         637 :     : _logging_enabled_(enable_logging), _log_filepath_(logfile) {
+      11             : 
+      12         637 :   if (!_logging_enabled_) {
+      13         637 :     return;
+      14           0 :   } else if (logfile.empty()) {
+      15           0 :     _logging_enabled_ = false;
+      16           0 :     ROS_INFO("[%s] ScopeTimerLogger: Logfile path not specified. Skipping logging to file.", ros::this_node::getName().c_str());
+      17           0 :     return;
+      18             :   }
+      19           0 :   _should_log_ = true;
+      20             : 
+      21             :   try {
+      22           0 :     std::scoped_lock lock(_mutex_logstream_);
+      23             : 
+      24           0 :     _logstream_ = std::ofstream(logfile, std::ios_base::out | std::ios_base::trunc);
+      25             : 
+      26           0 :     if (!_logstream_.is_open()) {
+      27           0 :       _logging_enabled_ = false;
+      28           0 :       ROS_ERROR("[%s]: Scope timer failed to create log file with path (%s). Skipping logging.", ros::this_node::getName().c_str(), logfile.c_str());
+      29           0 :       return;
+      30             :     }
+      31             : 
+      32           0 :     _logstream_ << std::fixed << std::setprecision(log_precision);
+      33           0 :     _logstream_ << "#scope,label_from,label_to,sec_start,sec_end,sec_duration" << std::endl;
+      34           0 :     _logging_enabled_ = true;
+      35             :   }
+      36           0 :   catch (...) {
+      37           0 :     ROS_ERROR("[%s]: Scope timer logger could not open logger file at: %s. Skipping logging.", ros::this_node::getName().c_str(), logfile.c_str());
+      38           0 :     return;
+      39             :   }
+      40             : 
+      41           0 :   ROS_INFO("[%s]: Scope timer logger path: %s.", ros::this_node::getName().c_str(), logfile.c_str());
+      42             : }
+      43             : /*//}*/
+      44             : 
+      45             : /*//{ ScopeTimerLogger destructor */
+      46         637 : ScopeTimerLogger::~ScopeTimerLogger() {
+      47         637 :   if (_logging_enabled_) {
+      48           0 :     ROS_DEBUG("[%s]: ScopeTimerLogger: closing logstream.", ros::this_node::getName().c_str());
+      49           0 :     _logstream_.close();
+      50             :   }
+      51         637 : }
+      52             : /*//}*/
+      53             : 
+      54             : /*//{ ScopeTimerLogger::log() */
+      55           0 : void ScopeTimerLogger::log(const std::string& scope, const chrono_tp& time_start, const chrono_tp& time_end) {
+      56           0 :   log(scope, "", "", time_start, time_end);
+      57           0 : }
+      58             : 
+      59           0 : void ScopeTimerLogger::log(const std::string& scope, const std::string& label_from, const std::string& label_to, const chrono_tp& time_start,
+      60             :                            const chrono_tp& time_end) {
+      61             : 
+      62           0 :   if (!_logging_enabled_) {
+      63           0 :     return;
+      64             :   }
+      65             : 
+      66           0 :   const std::chrono::duration<double> duration_start = std::chrono::duration_cast<std::chrono::duration<double>>(time_start.time_since_epoch());
+      67           0 :   const std::chrono::duration<double> duration_end   = std::chrono::duration_cast<std::chrono::duration<double>>(time_end.time_since_epoch());
+      68           0 :   const std::chrono::duration<double> duration_total = std::chrono::duration_cast<std::chrono::duration<double>>(time_end - time_start);
+      69             : 
+      70             :   {
+      71           0 :     std::scoped_lock lock(_mutex_logstream_);
+      72           0 :     _logstream_ << scope.c_str() << "," << label_from.c_str() << "," << label_to.c_str() << "," << duration_start.count() << "," << duration_end.count() << ","
+      73           0 :                 << duration_total.count() << std::endl;
+      74             :   }
+      75             : }
+      76             : /*//}*/
+      77             : 
+      78             : // | ------------------------ ScopeTimer ------------------------ |
+      79             : 
+      80             : std::unordered_map<std::string, ros::Time> ScopeTimer::last_print_times;
+      81             : 
+      82             : /* ScopeTimer constructor //{ */
+      83             : 
+      84           0 : ScopeTimer::ScopeTimer(const std::string& label, const ros::Duration& throttle_period, const bool enable,
+      85           0 :                        const std::shared_ptr<ScopeTimerLogger> scope_timer_logger)
+      86           0 :     : _timer_label_(label), _enable_print_or_log(enable), _throttle_period_(throttle_period), _logger_(scope_timer_logger) {
+      87             : 
+      88           0 :   checkpoints.push_back(time_point("timer start"));
+      89             : 
+      90           0 :   ROS_DEBUG("[%s] Scope timer started, label: %s", ros::this_node::getName().c_str(), label.c_str());
+      91           0 : }
+      92             : 
+      93           0 : ScopeTimer::ScopeTimer(const std::string& label, const time_point& tp0, const ros::Duration& throttle_period, const bool enable,
+      94           0 :                        const std::shared_ptr<ScopeTimerLogger> scope_timer_logger)
+      95           0 :     : _timer_label_(label), _enable_print_or_log(enable), _throttle_period_(throttle_period), _logger_(scope_timer_logger) {
+      96             : 
+      97           0 :   checkpoints.push_back(tp0);
+      98           0 :   checkpoints.push_back(time_point("timer start"));
+      99             : 
+     100           0 :   ROS_DEBUG("[%s] Scope timer started with file logger (label: %s).", ros::this_node::getName().c_str(), label.c_str());
+     101           0 : }
+     102             : 
+     103     5161614 : ScopeTimer::ScopeTimer(const std::string& label, const std::shared_ptr<ScopeTimerLogger> scope_timer_logger, const bool enable)
+     104     5161614 :     : _timer_label_(label), _enable_print_or_log(enable), _throttle_period_(ros::Duration(0.0)), _logger_(scope_timer_logger) {
+     105             : 
+     106     5150584 :   checkpoints.push_back(time_point("timer start"));
+     107             : 
+     108     5149068 :   ROS_DEBUG("[%s] Scope timer started with file logger (label: %s).", ros::this_node::getName().c_str(), label.c_str());
+     109     5149068 : }
+     110             : 
+     111             : //}
+     112             : 
+     113             : /* ScopeTimer::checkpoint() //{ */
+     114             : 
+     115     4019097 : void ScopeTimer::checkpoint(const std::string& label) {
+     116             : 
+     117     4019097 :   if (_enable_print_or_log) {
+     118           0 :     checkpoints.push_back(time_point(label));
+     119             :   }
+     120     4019097 : }
+     121             : 
+     122             : //}
+     123             : 
+     124             : /* ScopeTimer::getLifetime() //{ */
+     125             : 
+     126           0 : float ScopeTimer::getLifetime() {
+     127           0 :   const auto lifetime_us = std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::steady_clock::now() - checkpoints.at(0).chrono_time).count();
+     128           0 :   return lifetime_us / 1000.0f;
+     129             : }
+     130             : 
+     131             : //}
+     132             : 
+     133             : /* ScopeTimer destructor //{ */
+     134             : 
+     135    15485122 : ScopeTimer::~ScopeTimer() {
+     136             : 
+     137     5163859 :   if (!_enable_print_or_log) {
+     138     5163903 :     return;
+     139             :   }
+     140             : 
+     141          13 :   const auto chrono_end_time = std::chrono::steady_clock::now();
+     142           0 :   const auto ros_end_time    = ros::Time::now();
+     143             : 
+     144             :   // if throttling is enabled, check time of last print and only print if applicable
+     145           0 :   if (!_throttle_period_.isZero()) {
+     146           0 :     bool       do_print = false;
+     147           0 :     const auto last_it  = last_print_times.find(_timer_label_);
+     148             :     // if this is the first print of this ScopeTimer
+     149           0 :     if (last_it == last_print_times.end()) {
+     150           0 :       do_print = true;
+     151           0 :       last_print_times.emplace(_timer_label_, ros_end_time);
+     152             :     } else {
+     153             :       // if this ScopeTimer was already printed, check how long ago
+     154           0 :       ros::Time& last_print_time = last_it->second;
+     155           0 :       if (ros_end_time - last_print_time > _throttle_period_) {
+     156             :         // if it was long ago enough, print again and update the last print time
+     157           0 :         do_print        = true;
+     158           0 :         last_print_time = ros_end_time;
+     159             :       }
+     160             :     }
+     161             : 
+     162           0 :     if (!do_print)
+     163           0 :       return;
+     164             :   }
+     165             : 
+     166             :   // If logger object exists and it should log (a path to a logger file was given by the user)
+     167           0 :   if (_logger_ && _logger_->shouldLog()) {
+     168             : 
+     169             :     // Enabled, if user sets the enable flag to true, a path to a logger file is given, and the logging stream was successfully opened
+     170           0 :     if (!_logger_->loggingEnabled()) {
+     171           0 :       return;
+     172             :     }
+     173             : 
+     174             :     // Log checkpoints, e.g., "SCOPE->checkpoint1;checkpoint1->checkpoint2"
+     175           0 :     std::string label_from = "";
+     176           0 :     for (size_t i = 1; i < checkpoints.size(); i++) {
+     177           0 :       const auto& checkpoint = checkpoints.at(i);
+     178           0 :       _logger_->log(_timer_label_, label_from, checkpoint.label, checkpoints.at(i - 1).chrono_time, checkpoint.chrono_time);
+     179           0 :       label_from = checkpoint.label;
+     180             :     }
+     181             : 
+     182             :     // Log entire scope from start to end
+     183           0 :     _logger_->log(_timer_label_, checkpoints.at(0).chrono_time, chrono_end_time);
+     184             : 
+     185             :   } else {
+     186             : 
+     187           0 :     checkpoints.push_back(time_point("scope end"));
+     188             : 
+     189           0 :     const int gap1 = 8;
+     190           0 :     const int gap2 = 8;
+     191           0 :     const int gap3 = 12;
+     192             : 
+     193           0 :     std::stringstream ss;
+     194           0 :     ss.precision(3);
+     195           0 :     ss << std::fixed;
+     196             : 
+     197           0 :     const char separator = ' ';
+     198             : 
+     199           0 :     int max_label_width = 5;
+     200           0 :     for (auto& el : checkpoints) {
+     201           0 :       el.label      = "(" + el.label + ")";
+     202           0 :       const int len = el.label.length();
+     203           0 :       if (len > max_label_width)
+     204           0 :         max_label_width = len;
+     205             :     }
+     206             : 
+     207           0 :     int width_label_column = 10;
+     208           0 :     for (unsigned long i = 1; i < checkpoints.size(); i++) {
+     209           0 :       const int len = (checkpoints.at(i).label + checkpoints.at(i - 1).label).length();
+     210           0 :       if (len > width_label_column)
+     211           0 :         width_label_column = len;
+     212             :     }
+     213           0 :     width_label_column += 7;
+     214             : 
+     215           0 :     ss << std::endl << std::left << std::setw(width_label_column) << std::setfill(separator) << " {label}";
+     216           0 :     ss << std::left << std::setw(gap1) << std::setfill(separator) << "";
+     217           0 :     ss << std::left << std::setw(gap2) << std::setfill(separator) << "{ROS time}";
+     218           0 :     ss << std::left << std::setw(gap3) << std::setfill(separator) << "";
+     219           0 :     ss << std::left << std::setw(gap2) << std::setfill(separator) << "{chrono time}" << std::endl;
+     220             : 
+     221           0 :     for (unsigned long i = 1; i < checkpoints.size(); i++) {
+     222             : 
+     223           0 :       const double ros_elapsed = (checkpoints.at(i).ros_time - checkpoints.at(i - 1).ros_time).toSec();
+     224           0 :       const int    ros_secs    = int(ros_elapsed);
+     225           0 :       const double ros_msecs   = std::fmod(ros_elapsed * 1000, 1000);
+     226             : 
+     227           0 :       const std::chrono::duration<double> chrono_elapsed = (checkpoints.at(i).chrono_time - checkpoints.at(i - 1).chrono_time);
+     228           0 :       const int                           chrono_secs    = int(chrono_elapsed.count());
+     229           0 :       const double                        chrono_msecs   = std::fmod(chrono_elapsed.count() * 1000, 1000);
+     230             : 
+     231           0 :       ss << std::left << std::setw(max_label_width) << std::setfill(separator) << checkpoints.at(i - 1).label;
+     232           0 :       ss << " -> ";
+     233           0 :       ss << std::left << std::setw(max_label_width) << std::setfill(separator) << checkpoints.at(i).label;
+     234             : 
+     235           0 :       ss << std::right << std::setw(gap1) << std::setfill(separator) << ros_secs << std::setw(0) << "s";
+     236           0 :       ss << std::right << std::setw(gap2) << std::setfill(separator) << ros_msecs << std::setw(0) << "ms";
+     237           0 :       ss << std::right << std::setw(gap3) << std::setfill(separator) << chrono_secs << std::setw(0) << "s";
+     238           0 :       ss << std::right << std::setw(gap2) << std::setfill(separator) << chrono_msecs << std::setw(0) << "ms" << std::endl;
+     239             :     }
+     240             : 
+     241           0 :     const double ros_elapsed = (ros_end_time - checkpoints.at(0).ros_time).toSec();
+     242           0 :     const int    ros_secs    = int(ros_elapsed);
+     243           0 :     const double ros_msecs   = std::fmod(ros_elapsed * 1000, 1000);
+     244             : 
+     245           0 :     const std::chrono::duration<double> chrono_elapsed = (chrono_end_time - checkpoints.at(0).chrono_time);
+     246           0 :     const int                           chrono_secs    = int(chrono_elapsed.count());
+     247           0 :     const double                        chrono_msecs   = std::fmod(chrono_elapsed.count() * 1000, 1000);
+     248             : 
+     249           0 :     ss << std::left << std::setw(width_label_column) << std::setfill(separator) << "TOTAL TIME";
+     250           0 :     ss << std::right << std::setw(gap1) << std::setfill(separator) << ros_secs << std::setw(0) << "s";
+     251           0 :     ss << std::right << std::setw(gap2) << std::setfill(separator) << ros_msecs << std::setw(0) << "ms";
+     252           0 :     ss << std::right << std::setw(gap3) << std::setfill(separator) << chrono_secs << std::setw(0) << "s";
+     253           0 :     ss << std::right << std::setw(gap2) << std::setfill(separator) << chrono_msecs << std::setw(0) << "ms" << std::endl;
+     254             : 
+     255           0 :     ROS_INFO("[%s]: Scope timer [%s] finished!%s", ros::this_node::getName().c_str(), _timer_label_.c_str(), ss.str().c_str());
+     256             :   }
+     257     5161103 : }
+     258             : 
+     259             : //}
+     260             : 
+     261             : }  // namespace mrs_lib
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/scope_timer/scope_timer.cpp.gcov.overview.html b/mrs_lib/src/scope_timer/scope_timer.cpp.gcov.overview.html new file mode 100644 index 0000000000..8fad4dc2df --- /dev/null +++ b/mrs_lib/src/scope_timer/scope_timer.cpp.gcov.overview.html @@ -0,0 +1,86 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/scope_timer/scope_timer.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/src/scope_timer/scope_timer.cpp.gcov.png b/mrs_lib/src/scope_timer/scope_timer.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..1da9040a91ee22c35f65971da31ab5417532af9e GIT binary patch literal 1280 zcmV+b1^@bqP)#&hXlvB)tz2;Yvu&Pmt{=i}_=T zTK4#!0jGfVp*J=aI^6T6eR)Xs@1Sq%sQA^8*Zq0o;p;v!$8mOmczl4ELn-E9|9_q% z;1LlDjn-e63vUqbZAXl?85BNxI0keVJ8+l3d^(Fq0PGIPH7Y;=#PQs~KD1G((P#rH zyC+S%IXnH(sL^|-FX?7imoy6FdTxyxRg2Amj$R%KzqZez+g$$p^_^5`D?+93qK zYs^|5W=fn@*a${SjlzDJ>v}(O3Lo*smkGcN|D;nV{MH9rEwIw46n#m$u(6|Ih;yEA zCGpV7px_F9BYgEMqbA1(h?LjinB(Hg8+EvlTIKSs3sF3L4!B1xG8P-@pGYc8V+YI^ zV%<{*cjI)S+A9YmO}+%KYRnsZDmsKb!nhNMJ22_rarme#{0l2X4+gT-+F+5~!?Fj=DGlO=k&Q)p*h?zF#z-_y$Y$m6UquPZKlIUZT+t@LsW`v}~`k zD1NV@G3scDVtABf4-~`d$vnJ-;iT7+(o4a0gB}25c31Hz=f_LH`W+-S_vqd8ki++n zxm(^qPFi-_cx*Nin;LcZapq9wf_~NqGAG(7X(LF|$ivLDvcHZ;b@YT~!~QK+j$2sJ z_`XT-z7W4Lwk!`^M`Pq3d)E`wc37H?ElLW(R(B`P<1GTb9Oh-M5&ETWY$tW%RISez zkydVp0;%H?q0ykrH`-?~fo{)7zf%^`&@`8{+Ksv=-9=Sk##whzL@&D3UnYM->4Q}v z6mc}aQO_;`X{~#V7J({4GoOF@k-Re-+N!&*AMXKR7H$v=8=c*8vcvHmDwKte=SwT< z76<@X9CLm{8{){j7`^O=cNyTD-RpZY8{G->9vUz13~O^^vJ7m5L;cWZY|kZ03e%NVQy6W<(y4SQ{QVn9OHUEp(DQEr zC*A868)>Seu^Di#5qW1EZmWJoN*lOnNh8Hv$k;j1(YDpwx+x27+zA03mZ;S@x3q@r zX=7KTW2k|RVs{-)=7Gn6c@_$OgwS=K&0W?*P4`^9s_~gAgnN3?#@*9fltuS&eUs?X zNzNJH*tqlMs{)qTc)6*u1*B)1AJkZM3#YSI2ZdInO)X3wHJ3c~Da_#hqkoH3XcUi7 z96l<3*GA#H!orI-_L7wWZd*WUJWi(s>TN6+`>IbJ0>jlw>MUtowK2zGp)5Tb`X2C! zA70b}UiXrWGQh1-2Kf4Z&7}%(@0pEU;9L2u(kKIb@n<`&a4bp9D3{u4fohG{3UFa% qP!GN+fTR!puZHgqO{?jTDt`k-lcJw@c_}ym0000 + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/timeout_manager + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/timeout_managerHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:496279.0 %
Date:2024-04-18 23:11:36Functions:91181.8 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
timeout_manager.cpp +
79.0%79.0%
+
79.0 %49 / 6281.8 %9 / 11
<unnamed>79.0 %49 / 6281.8 %9 / 11
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/timeout_manager/index-detail-sort-l.html b/mrs_lib/src/timeout_manager/index-detail-sort-l.html new file mode 100644 index 0000000000..a3faa5efc0 --- /dev/null +++ b/mrs_lib/src/timeout_manager/index-detail-sort-l.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/timeout_manager + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/timeout_managerHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:496279.0 %
Date:2024-04-18 23:11:36Functions:91181.8 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
timeout_manager.cpp +
79.0%79.0%
+
79.0 %49 / 6281.8 %9 / 11
<unnamed>79.0 %49 / 6281.8 %9 / 11
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/timeout_manager/index-detail.html b/mrs_lib/src/timeout_manager/index-detail.html new file mode 100644 index 0000000000..5ef4665781 --- /dev/null +++ b/mrs_lib/src/timeout_manager/index-detail.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/timeout_manager + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/timeout_managerHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:496279.0 %
Date:2024-04-18 23:11:36Functions:91181.8 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
timeout_manager.cpp +
79.0%79.0%
+
79.0 %49 / 6281.8 %9 / 11
<unnamed>79.0 %49 / 6281.8 %9 / 11
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/timeout_manager/index-sort-f.html b/mrs_lib/src/timeout_manager/index-sort-f.html new file mode 100644 index 0000000000..a0bdff5da2 --- /dev/null +++ b/mrs_lib/src/timeout_manager/index-sort-f.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/timeout_manager + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/timeout_managerHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:496279.0 %
Date:2024-04-18 23:11:36Functions:91181.8 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
timeout_manager.cpp +
79.0%79.0%
+
79.0 %49 / 6281.8 %9 / 11
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/timeout_manager/index-sort-l.html b/mrs_lib/src/timeout_manager/index-sort-l.html new file mode 100644 index 0000000000..3745c4e2c9 --- /dev/null +++ b/mrs_lib/src/timeout_manager/index-sort-l.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/timeout_manager + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/timeout_managerHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:496279.0 %
Date:2024-04-18 23:11:36Functions:91181.8 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
timeout_manager.cpp +
79.0%79.0%
+
79.0 %49 / 6281.8 %9 / 11
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/timeout_manager/index.html b/mrs_lib/src/timeout_manager/index.html new file mode 100644 index 0000000000..9d826bcf60 --- /dev/null +++ b/mrs_lib/src/timeout_manager/index.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/timeout_manager + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/timeout_managerHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:496279.0 %
Date:2024-04-18 23:11:36Functions:91181.8 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
timeout_manager.cpp +
79.0%79.0%
+
79.0 %49 / 6281.8 %9 / 11
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/timeout_manager/timeout_manager.cpp.func-sort-c.html b/mrs_lib/src/timeout_manager/timeout_manager.cpp.func-sort-c.html new file mode 100644 index 0000000000..f916a068fa --- /dev/null +++ b/mrs_lib/src/timeout_manager/timeout_manager.cpp.func-sort-c.html @@ -0,0 +1,124 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/timeout_manager/timeout_manager.cpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/timeout_manager - timeout_manager.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:496279.0 %
Date:2024-04-18 23:11:36Functions:91181.8 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::TimeoutManager::change(unsigned long, ros::Duration const&, std::function<void (ros::Time const&)> const&, ros::Time const&, bool, bool)0
mrs_lib::TimeoutManager::lastReset(unsigned long)0
mrs_lib::TimeoutManager::pauseAll()2
mrs_lib::TimeoutManager::startAll(ros::Time const&)4
mrs_lib::TimeoutManager::pause(unsigned long)9
mrs_lib::TimeoutManager::TimeoutManager(ros::NodeHandle const&, ros::Rate const&)87
mrs_lib::TimeoutManager::registerNew(ros::Duration const&, std::function<void (ros::Time const&)> const&, ros::Time const&, bool, bool)90
mrs_lib::TimeoutManager::start(unsigned long, ros::Time const&)90
mrs_lib::TimeoutManager::started(unsigned long)1562
mrs_lib::TimeoutManager::main_timer_callback(ros::TimerEvent const&)20182
mrs_lib::TimeoutManager::reset(unsigned long, ros::Time const&)183710
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/timeout_manager/timeout_manager.cpp.func.html b/mrs_lib/src/timeout_manager/timeout_manager.cpp.func.html new file mode 100644 index 0000000000..e402767525 --- /dev/null +++ b/mrs_lib/src/timeout_manager/timeout_manager.cpp.func.html @@ -0,0 +1,124 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/timeout_manager/timeout_manager.cpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/timeout_manager - timeout_manager.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:496279.0 %
Date:2024-04-18 23:11:36Functions:91181.8 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::TimeoutManager::registerNew(ros::Duration const&, std::function<void (ros::Time const&)> const&, ros::Time const&, bool, bool)90
mrs_lib::TimeoutManager::main_timer_callback(ros::TimerEvent const&)20182
mrs_lib::TimeoutManager::pause(unsigned long)9
mrs_lib::TimeoutManager::reset(unsigned long, ros::Time const&)183710
mrs_lib::TimeoutManager::start(unsigned long, ros::Time const&)90
mrs_lib::TimeoutManager::change(unsigned long, ros::Duration const&, std::function<void (ros::Time const&)> const&, ros::Time const&, bool, bool)0
mrs_lib::TimeoutManager::started(unsigned long)1562
mrs_lib::TimeoutManager::pauseAll()2
mrs_lib::TimeoutManager::startAll(ros::Time const&)4
mrs_lib::TimeoutManager::lastReset(unsigned long)0
mrs_lib::TimeoutManager::TimeoutManager(ros::NodeHandle const&, ros::Rate const&)87
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/timeout_manager/timeout_manager.cpp.gcov.frameset.html b/mrs_lib/src/timeout_manager/timeout_manager.cpp.gcov.frameset.html new file mode 100644 index 0000000000..40489ce963 --- /dev/null +++ b/mrs_lib/src/timeout_manager/timeout_manager.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/timeout_manager/timeout_manager.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/src/timeout_manager/timeout_manager.cpp.gcov.html b/mrs_lib/src/timeout_manager/timeout_manager.cpp.gcov.html new file mode 100644 index 0000000000..b04ec06ae3 --- /dev/null +++ b/mrs_lib/src/timeout_manager/timeout_manager.cpp.gcov.html @@ -0,0 +1,186 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/timeout_manager/timeout_manager.cpp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/timeout_manager - timeout_manager.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:496279.0 %
Date:2024-04-18 23:11:36Functions:91181.8 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : #include <mrs_lib/timeout_manager.h>
+       2             : 
+       3             : namespace mrs_lib
+       4             : {
+       5             : 
+       6          87 :   TimeoutManager::TimeoutManager(const ros::NodeHandle& nh, const ros::Rate& update_rate)
+       7          87 :     : m_last_id(0)
+       8             :   {
+       9          87 :     m_main_timer = nh.createTimer(update_rate, &TimeoutManager::main_timer_callback, this);
+      10          87 :   }
+      11             : 
+      12             : 
+      13          90 :   TimeoutManager::timeout_id_t TimeoutManager::registerNew(const ros::Duration& timeout, const callback_t& callback, const ros::Time& last_reset, const bool oneshot, const bool autostart)
+      14             :   {
+      15         180 :     std::scoped_lock lck(m_mtx);
+      16          90 :     const auto new_id = m_timeouts.size();
+      17          90 :     const timeout_info_t new_info = {oneshot, autostart, callback, timeout, last_reset, last_reset};
+      18          90 :     m_timeouts.push_back(new_info);
+      19         180 :     return new_id;
+      20             :   }
+      21             : 
+      22      183710 :   void TimeoutManager::reset(const timeout_id_t id, const ros::Time& time)
+      23             :   {
+      24      183710 :     std::scoped_lock lck(m_mtx);
+      25      183710 :     m_timeouts.at(id).last_reset = time;
+      26      183710 :   }
+      27             : 
+      28           9 :   void TimeoutManager::pause(const timeout_id_t id)
+      29             :   {
+      30           9 :     std::scoped_lock lck(m_mtx);
+      31           9 :     m_timeouts.at(id).started = false;
+      32           9 :   }
+      33             : 
+      34          90 :   void TimeoutManager::start(const timeout_id_t id, const ros::Time& time)
+      35             :   {
+      36          90 :     std::scoped_lock lck(m_mtx);
+      37          90 :     m_timeouts.at(id).started = true;
+      38          90 :     m_timeouts.at(id).last_reset = time;
+      39          90 :   }
+      40             : 
+      41           2 :   void TimeoutManager::pauseAll()
+      42             :   {
+      43           4 :     std::scoped_lock lck(m_mtx);
+      44          10 :     for (auto& timeout_info : m_timeouts)
+      45           8 :       timeout_info.started = false;
+      46           2 :   }
+      47             : 
+      48           4 :   void TimeoutManager::startAll(const ros::Time& time)
+      49             :   {
+      50           8 :     std::scoped_lock lck(m_mtx);
+      51          20 :     for (auto& timeout_info : m_timeouts)
+      52             :     {
+      53          16 :       timeout_info.started = true;
+      54          16 :       timeout_info.last_reset = time;
+      55             :     }
+      56           4 :   }
+      57             : 
+      58           0 :   void TimeoutManager::change(const timeout_id_t id, const ros::Duration& timeout, const callback_t& callback, const ros::Time& last_reset, const bool oneshot, const bool autostart)
+      59             :   {
+      60           0 :     std::scoped_lock lck(m_mtx);
+      61           0 :     auto& timeout_info = m_timeouts.at(id);
+      62           0 :     timeout_info.oneshot = oneshot;
+      63           0 :     timeout_info.started = autostart;
+      64           0 :     timeout_info.timeout = timeout;
+      65           0 :     timeout_info.callback = callback;
+      66           0 :     timeout_info.last_reset = last_reset;
+      67           0 :   }
+      68             : 
+      69           0 :   ros::Time TimeoutManager::lastReset(const timeout_id_t id)
+      70             :   {
+      71           0 :     std::scoped_lock lck(m_mtx);
+      72           0 :     return m_timeouts.at(id).last_reset;
+      73             :   }
+      74             : 
+      75        1562 :   bool TimeoutManager::started(const timeout_id_t id)
+      76             :   {
+      77        1562 :     std::scoped_lock lck(m_mtx);
+      78        3124 :     return m_timeouts.at(id).started;
+      79             :   }
+      80             : 
+      81       20182 :   void TimeoutManager::main_timer_callback([[maybe_unused]] const ros::TimerEvent &evt)
+      82             :   {
+      83       20182 :     const auto now = ros::Time::now();
+      84             : 
+      85       40364 :     std::scoped_lock lck(m_mtx);
+      86       46646 :     for (auto& timeout_info : m_timeouts)
+      87             :     {
+      88             :       // don't worry, this'll get optimized out by the compiler
+      89       26464 :       const bool started = timeout_info.started;
+      90       26464 :       const bool last_reset_timeout = now - timeout_info.last_reset >= timeout_info.timeout;
+      91       26464 :       const bool last_callback_timeout = now - timeout_info.last_callback >= timeout_info.timeout;
+      92       26464 :       if (started && last_reset_timeout && last_callback_timeout)
+      93             :       {
+      94        2082 :         timeout_info.callback(timeout_info.last_reset);
+      95        2082 :         timeout_info.last_callback = now;
+      96             :         // if the timeout is oneshot, pause it
+      97        2082 :         if (timeout_info.oneshot)
+      98           0 :           timeout_info.started = false;
+      99             :       }
+     100             :     }
+     101       20182 :   }
+     102             : }
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/timeout_manager/timeout_manager.cpp.gcov.overview.html b/mrs_lib/src/timeout_manager/timeout_manager.cpp.gcov.overview.html new file mode 100644 index 0000000000..0b582c4d4a --- /dev/null +++ b/mrs_lib/src/timeout_manager/timeout_manager.cpp.gcov.overview.html @@ -0,0 +1,46 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/timeout_manager/timeout_manager.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/src/timeout_manager/timeout_manager.cpp.gcov.png b/mrs_lib/src/timeout_manager/timeout_manager.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..c867c6a7540f7d57f11eda65b1d826deefd78012 GIT binary patch literal 512 zcmV+b0{{JqP)I*~y25zOg^hr1xiNM+LG`58W&G$N9I|OP#X`T26 zz@*c|b>>k1w4ja|9@(hw%rz(Ay>h5(ab;1n0$wqzKKOxp#J!%Up7I)M2LZn5^~iOmac@97IKq74SZ?s&eJvH{0Jg=d3&8 + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/timer + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/timerHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:10612584.8 %
Date:2024-04-18 23:11:36Functions:151883.3 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
timer.cpp +
84.8%84.8%
+
84.8 %106 / 12583.3 %15 / 18
<unnamed>84.8 %106 / 12583.3 %15 / 18
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/timer/index-detail-sort-l.html b/mrs_lib/src/timer/index-detail-sort-l.html new file mode 100644 index 0000000000..82564bacbb --- /dev/null +++ b/mrs_lib/src/timer/index-detail-sort-l.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/timer + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/timerHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:10612584.8 %
Date:2024-04-18 23:11:36Functions:151883.3 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
timer.cpp +
84.8%84.8%
+
84.8 %106 / 12583.3 %15 / 18
<unnamed>84.8 %106 / 12583.3 %15 / 18
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/timer/index-detail.html b/mrs_lib/src/timer/index-detail.html new file mode 100644 index 0000000000..6fbab04c89 --- /dev/null +++ b/mrs_lib/src/timer/index-detail.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/timer + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/timerHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:10612584.8 %
Date:2024-04-18 23:11:36Functions:151883.3 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
timer.cpp +
84.8%84.8%
+
84.8 %106 / 12583.3 %15 / 18
<unnamed>84.8 %106 / 12583.3 %15 / 18
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/timer/index-sort-f.html b/mrs_lib/src/timer/index-sort-f.html new file mode 100644 index 0000000000..e8eb09297a --- /dev/null +++ b/mrs_lib/src/timer/index-sort-f.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/timer + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/timerHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:10612584.8 %
Date:2024-04-18 23:11:36Functions:151883.3 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
timer.cpp +
84.8%84.8%
+
84.8 %106 / 12583.3 %15 / 18
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/timer/index-sort-l.html b/mrs_lib/src/timer/index-sort-l.html new file mode 100644 index 0000000000..2b93adc2d7 --- /dev/null +++ b/mrs_lib/src/timer/index-sort-l.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/timer + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/timerHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:10612584.8 %
Date:2024-04-18 23:11:36Functions:151883.3 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
timer.cpp +
84.8%84.8%
+
84.8 %106 / 12583.3 %15 / 18
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/timer/index.html b/mrs_lib/src/timer/index.html new file mode 100644 index 0000000000..36ee932850 --- /dev/null +++ b/mrs_lib/src/timer/index.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/timer + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/timerHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:10612584.8 %
Date:2024-04-18 23:11:36Functions:151883.3 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
timer.cpp +
84.8%84.8%
+
84.8 %106 / 12583.3 %15 / 18
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/timer/timer.cpp.func-sort-c.html b/mrs_lib/src/timer/timer.cpp.func-sort-c.html new file mode 100644 index 0000000000..2b1069c678 --- /dev/null +++ b/mrs_lib/src/timer/timer.cpp.func-sort-c.html @@ -0,0 +1,152 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/timer/timer.cpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/timer - timer.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:10612584.8 %
Date:2024-04-18 23:11:36Functions:151883.3 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::ThreadTimer::setCallback(std::function<void (ros::TimerEvent const&)> const&)0
mrs_lib::ThreadTimer::Impl::setCallback(std::function<void (ros::TimerEvent const&)> const&)0
mrs_lib::ROSTimer::setCallback(std::function<void (ros::TimerEvent const&)> const&)0
mrs_lib::ThreadTimer::Impl::setPeriod(ros::Duration const&, bool)8
mrs_lib::ThreadTimer::Impl::threadFcn()8
mrs_lib::ThreadTimer::Impl::Impl(std::function<void (ros::TimerEvent const&)> const&, ros::Duration const&, bool)8
mrs_lib::ThreadTimer::Impl::~Impl()8
mrs_lib::ThreadTimer::setPeriod(ros::Duration const&, bool)8
mrs_lib::ROSTimer::setPeriod(ros::Duration const&, bool)8
mrs_lib::ThreadTimer::Impl::stop()24
mrs_lib::ThreadTimer::Impl::start()24
mrs_lib::ThreadTimer::stop()24
mrs_lib::ThreadTimer::start()24
mrs_lib::ROSTimer::stop()24
mrs_lib::ROSTimer::start()24
mrs_lib::ThreadTimer::Impl::breakableSleep(ros::Time const&)208
mrs_lib::ThreadTimer::running()208
mrs_lib::ROSTimer::running()216
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/timer/timer.cpp.func.html b/mrs_lib/src/timer/timer.cpp.func.html new file mode 100644 index 0000000000..651d539b80 --- /dev/null +++ b/mrs_lib/src/timer/timer.cpp.func.html @@ -0,0 +1,152 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/timer/timer.cpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/timer - timer.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:10612584.8 %
Date:2024-04-18 23:11:36Functions:151883.3 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::ThreadTimer::setCallback(std::function<void (ros::TimerEvent const&)> const&)0
mrs_lib::ThreadTimer::Impl::setCallback(std::function<void (ros::TimerEvent const&)> const&)0
mrs_lib::ThreadTimer::Impl::breakableSleep(ros::Time const&)208
mrs_lib::ThreadTimer::Impl::stop()24
mrs_lib::ThreadTimer::Impl::start()24
mrs_lib::ThreadTimer::Impl::setPeriod(ros::Duration const&, bool)8
mrs_lib::ThreadTimer::Impl::threadFcn()8
mrs_lib::ThreadTimer::Impl::Impl(std::function<void (ros::TimerEvent const&)> const&, ros::Duration const&, bool)8
mrs_lib::ThreadTimer::Impl::~Impl()8
mrs_lib::ThreadTimer::stop()24
mrs_lib::ThreadTimer::start()24
mrs_lib::ThreadTimer::running()208
mrs_lib::ThreadTimer::setPeriod(ros::Duration const&, bool)8
mrs_lib::ROSTimer::setCallback(std::function<void (ros::TimerEvent const&)> const&)0
mrs_lib::ROSTimer::stop()24
mrs_lib::ROSTimer::start()24
mrs_lib::ROSTimer::running()216
mrs_lib::ROSTimer::setPeriod(ros::Duration const&, bool)8
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/timer/timer.cpp.gcov.frameset.html b/mrs_lib/src/timer/timer.cpp.gcov.frameset.html new file mode 100644 index 0000000000..0c8c06a90b --- /dev/null +++ b/mrs_lib/src/timer/timer.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/timer/timer.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/src/timer/timer.cpp.gcov.html b/mrs_lib/src/timer/timer.cpp.gcov.html new file mode 100644 index 0000000000..c749907bbf --- /dev/null +++ b/mrs_lib/src/timer/timer.cpp.gcov.html @@ -0,0 +1,364 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/timer/timer.cpp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/timer - timer.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:10612584.8 %
Date:2024-04-18 23:11:36Functions:151883.3 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : #include <mrs_lib/timer.h>
+       2             : 
+       3             : namespace mrs_lib
+       4             : {
+       5             : 
+       6             : // | ------------------------ ROSTimer ------------------------ |
+       7             : 
+       8             : /* stop() //{ */
+       9             : 
+      10          24 : void ROSTimer::stop() {
+      11             : 
+      12          48 :   std::scoped_lock lock(mutex_timer_);
+      13             : 
+      14          24 :   if (timer_) {
+      15          24 :     timer_->stop();
+      16             :   }
+      17          24 : }
+      18             : 
+      19             : //}
+      20             : 
+      21             : /* start() //{ */
+      22             : 
+      23          24 : void ROSTimer::start() {
+      24             : 
+      25          48 :   std::scoped_lock lock(mutex_timer_);
+      26             : 
+      27          24 :   if (timer_) {
+      28          24 :     timer_->start();
+      29             :   }
+      30          24 : }
+      31             : 
+      32             : //}
+      33             : 
+      34             : /* setPeriod() //{ */
+      35             : 
+      36           8 : void ROSTimer::setPeriod(const ros::Duration& duration, const bool reset) {
+      37             : 
+      38          16 :   std::scoped_lock lock(mutex_timer_);
+      39             : 
+      40           8 :   if (timer_) {
+      41           8 :     timer_->setPeriod(duration, reset);
+      42             :   }
+      43           8 : }
+      44             : 
+      45             : //}
+      46             : //
+      47             : /* setCallback() //{ */
+      48             : 
+      49           0 : void ROSTimer::setCallback([[maybe_unused]] const std::function<void(const ros::TimerEvent&)>& callback) {
+      50             : 
+      51           0 :   ROS_ERROR("[mrs_lib::ROSTimer]: setCallback(...) is not implemented for ROSTimer! Check [mrs_lib/src/timer/timer.cpp].");
+      52           0 : }
+      53             : 
+      54             : //}
+      55             : 
+      56             : /* running() //{ */
+      57             : 
+      58         216 : bool ROSTimer::running()
+      59             : {
+      60         432 :   std::scoped_lock lock(mutex_timer_);
+      61             : 
+      62         216 :   if (timer_)
+      63         216 :     return timer_->hasStarted();
+      64             :   else
+      65           0 :     return false;
+      66             : }
+      67             : 
+      68             : //}
+      69             : 
+      70             : // | ----------------------- ThreadTimer ---------------------- |
+      71             : 
+      72             : /* TheadTimer::start() //{ */
+      73             : 
+      74          24 : void ThreadTimer::start() {
+      75             : 
+      76          24 :   if (impl_) {
+      77          24 :     impl_->start();
+      78             :   }
+      79          24 : }
+      80             : 
+      81             : //}
+      82             : 
+      83             : /* ThreadTimer::stop() //{ */
+      84             : 
+      85          24 : void ThreadTimer::stop() {
+      86             : 
+      87          24 :   if (impl_) {
+      88          24 :     impl_->stop();
+      89             :   }
+      90          24 : }
+      91             : 
+      92             : //}
+      93             : 
+      94             : /* ThreadTimer::setPeriod() //{ */
+      95             : 
+      96           8 : void ThreadTimer::setPeriod(const ros::Duration& duration, [[maybe_unused]] const bool reset) {
+      97             : 
+      98           8 :   if (impl_) {
+      99           8 :     impl_->setPeriod(duration, reset);
+     100             :   }
+     101           8 : }
+     102             : 
+     103             : //}
+     104             : 
+     105             : /* ThreadTimer::setCallback() //{ */
+     106             : 
+     107           0 : void ThreadTimer::setCallback(const std::function<void(const ros::TimerEvent&)>& callback) {
+     108           0 :   if (impl_) {
+     109           0 :     impl_->setCallback(callback);
+     110             :   }
+     111           0 : }
+     112             : 
+     113             : //}
+     114             : 
+     115             : /* ThreadTimer::running() //{ */
+     116             : 
+     117         208 : bool ThreadTimer::running()
+     118             : {
+     119         208 :   if (impl_)
+     120         208 :     return impl_->running_;
+     121             :   else
+     122           0 :     return false;
+     123             : }
+     124             : 
+     125             : //}
+     126             : 
+     127             : /* ThreadTimer::Impl //{ */
+     128             : 
+     129           8 : ThreadTimer::Impl::Impl(const std::function<void(const ros::TimerEvent&)>& callback, const ros::Duration& delay_dur, const bool oneshot)
+     130           8 :   : callback_(callback), oneshot_(oneshot), delay_dur_(delay_dur)
+     131             : {
+     132           8 :   ending_  = false;
+     133           8 :   running_ = false;
+     134             : 
+     135           8 :   last_real_     = ros::Time(0);
+     136           8 :   last_expected_ = ros::Time(0);
+     137           8 :   next_expected_ = ros::Time(0);
+     138             : 
+     139           8 :   thread_ = std::thread(&ThreadTimer::Impl::threadFcn, this);
+     140           8 : }
+     141             : 
+     142           8 : ThreadTimer::Impl::~Impl()
+     143             : {
+     144             :   {
+     145             :     // signal the thread to end
+     146          16 :     std::scoped_lock lck(mutex_wakeup_, mutex_state_);
+     147           8 :     ending_ = true;
+     148           8 :     wakeup_cond_.notify_all();
+     149             :   }
+     150             :   // wait for it to die
+     151           8 :   thread_.join();
+     152           8 : }
+     153             : 
+     154          24 : void ThreadTimer::Impl::start()
+     155             : {
+     156          48 :   std::scoped_lock lck(mutex_wakeup_, mutex_state_);
+     157          24 :   if (!running_)
+     158             :   {
+     159          24 :     next_expected_ = ros::Time::now() + delay_dur_;
+     160          24 :     running_ = true;
+     161          24 :     wakeup_cond_.notify_all();
+     162             :   }
+     163          24 : }
+     164             : 
+     165          24 : void ThreadTimer::Impl::stop()
+     166             : {
+     167          48 :   std::scoped_lock lck(mutex_wakeup_, mutex_state_);
+     168          24 :   running_ = false;
+     169          24 :   wakeup_cond_.notify_all();
+     170          24 : }
+     171             : 
+     172           8 : void ThreadTimer::Impl::setPeriod(const ros::Duration& duration, [[maybe_unused]] const bool reset)
+     173             : {
+     174          16 :   std::scoped_lock lock(mutex_wakeup_, mutex_state_);
+     175           8 :   delay_dur_ = duration;
+     176             :   // gracefully handle the special case
+     177           8 :   if (duration == ros::Duration(0))
+     178           0 :     this->oneshot_  = true;
+     179           8 : }
+     180             : 
+     181           0 : void ThreadTimer::Impl::setCallback(const std::function<void(const ros::TimerEvent&)>& callback){
+     182           0 :   std::scoped_lock lock(mutex_state_);
+     183             : 
+     184           0 :   callback_ = callback;
+     185           0 : }
+     186             : 
+     187             : //}
+     188             : 
+     189             : /* ThreadTimer::breakableSleep() method //{ */
+     190         408 : bool ThreadTimer::Impl::breakableSleep(const ros::Time& until)
+     191             : {
+     192         408 :   while (ros::ok() && ros::Time::now() < until)
+     193             :   {
+     194         208 :     const std::chrono::nanoseconds dur {(until - ros::Time::now()).toNSec()};
+     195         208 :     const std::chrono::time_point<std::chrono::steady_clock> until_stl = std::chrono::steady_clock::now() + dur;
+     196         208 :     std::unique_lock lck(mutex_wakeup_);
+     197         208 :     if (!ending_ && running_)
+     198         208 :       wakeup_cond_.wait_until(lck, until_stl);
+     199             :     // check the flags while mutex_state_ is locked
+     200         208 :     if (ending_ || !running_)
+     201           8 :       return false;
+     202             :   }
+     203         200 :   return true;
+     204             : }
+     205             : //}
+     206             : 
+     207             : /* ThreadTimer::Impl::threadFcn() //{ */
+     208             : 
+     209         217 : void ThreadTimer::Impl::threadFcn()
+     210             : {
+     211         217 :   while (ros::ok() && !ending_)
+     212             :   {
+     213             :     {
+     214         217 :       std::unique_lock lck(mutex_wakeup_);
+     215             :       // if the timer is not yet started, wait for condition variable notification
+     216         217 :       if (!running_ && !ending_)
+     217          16 :         wakeup_cond_.wait(lck);
+     218             :       // The thread either got cv-notified, or running_ was already true, or it got woken up for some other reason.
+     219             :       // Check if the reason is that we should end (and end if it is).
+     220         217 :       if (ending_)
+     221           8 :         break;
+     222             :       // Check if the timer is still paused - probably was a spurious wake up (and restart the wait if it is).
+     223         209 :       if (!running_)
+     224           1 :         continue;
+     225             :     }
+     226             : 
+     227             :     // If the flow got here, the thread should attempt to wait for the specified duration.
+     228             :     // first, copy the delay we should wait for in a thread-safe manner
+     229         208 :     ros::Time next_expected;
+     230             :     {
+     231         208 :       std::scoped_lock lck(mutex_state_);
+     232         208 :       next_expected = next_expected_;
+     233             :     }
+     234         208 :     const bool interrupted = !breakableSleep(next_expected);
+     235         208 :     if (interrupted)
+     236           8 :       continue;
+     237             : 
+     238             :     {
+     239             :       // make sure the state doesn't change here
+     240         200 :       std::scoped_lock lck(mutex_state_);
+     241             :       // Again, check if everything is OK (the state may have changed while the thread was a sleeping beauty).
+     242             :       // Check if we should end (and end if it is so).
+     243         200 :       if (ending_)
+     244           0 :         break;
+     245             :       // Check if the timer is paused (and skip if it is so).
+     246         200 :       if (!running_)
+     247           0 :         continue;
+     248             : 
+     249             :       // If all is fine and dandy, actually run the callback function!
+     250             :       // if the timer is a oneshot-type, automatically pause it
+     251             :       // and do not fill out the expected fields in timer_event (we had no expectations...)
+     252         200 :       const ros::Time now = ros::Time::now();
+     253             :       // prepare the timer event
+     254         200 :       ros::TimerEvent timer_event;
+     255         200 :       if (oneshot_)
+     256             :       {
+     257           0 :         running_ = false;
+     258           0 :         timer_event.last_real        = last_real_;
+     259           0 :         timer_event.current_real     = now;
+     260             :       }
+     261             :       else
+     262             :       {
+     263         200 :         timer_event.last_expected    = last_expected_;
+     264         200 :         timer_event.last_real        = last_real_;
+     265         200 :         timer_event.current_expected = next_expected_;
+     266         200 :         timer_event.current_real     = now;
+     267             : 
+     268         200 :         last_expected_ = next_expected_;
+     269         200 :         next_expected_ = now + delay_dur_;
+     270             :       }
+     271         200 :       last_real_ = now;
+     272             :       // call the callback
+     273         200 :       callback_(timer_event);
+     274             :     }
+     275             :   }
+     276           8 : }
+     277             : 
+     278             : //}
+     279             : 
+     280             : }  // namespace mrs_lib
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/timer/timer.cpp.gcov.overview.html b/mrs_lib/src/timer/timer.cpp.gcov.overview.html new file mode 100644 index 0000000000..68ddfa09da --- /dev/null +++ b/mrs_lib/src/timer/timer.cpp.gcov.overview.html @@ -0,0 +1,90 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/timer/timer.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/src/timer/timer.cpp.gcov.png b/mrs_lib/src/timer/timer.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..2f7c0571b5cc53cf482a321add266e2bf17e76bc GIT binary patch literal 1151 zcmV-_1c3XAP)vcmGwMK@wmPAR65B($XevoEr)Bz2Gd{HP#KsGGjPF zFZbvHyMS@kYgh_SV!K@!*XTa~x_;)((OPX`7^50vX}x&|qP!s3+P5X@?)*?9t)&O- z%0i$JH?Wv~AdU_nRO`0R6P)-?&sp{V5EQ(|1o-QMVrp2VzKf1D_+vuaEcELCY4ht92Y@yFOGia+A}Iu zYkA8qY=$31xhCe;J-J#fZh&%C(ytb0K~)SrSzxKH=*dld39sXMfE)hPpz(kjo9O@-(Cj zGAz)cq!OnE#p5oVp<3=jD=f`2GyZ^i($(Cy3vZnu(djS;gkbDQ)HE**8vN-%w&!oSeRpCA-Hu5w$WrP zlbEMZ3&A{H!mfl-F%siw!_}J;x&quMS@EjRs)e>v2n3Kfb-1(gLW5gtD-7>@i&5O} ztO*P|U0%b8YPvUXi|_4NnuO+S?AV`DT;pl7R0A-C-BL>$t97LZSNzsn zp06SC;@QrRrAE?G0luf+DFIWN|>*~Ge_r$ zHUQ(%{&8?Sh79Q5KMqc`1B!M5-ZN5KB1>$g?o88!lgQ%mDg`=|YBt~tiAn8i1HDAX zR|5x?Q6jIC2l5Lcpe%YwAisnRsF9E~Pc)T`_KY-kX|4Z++kh{qM&0ih{{v)aVNF!% Roo)aC002ovPDHLkV1jbS5P1Lq literal 0 HcmV?d00001 diff --git a/mrs_lib/src/transform_broadcaster/index-detail-sort-f.html b/mrs_lib/src/transform_broadcaster/index-detail-sort-f.html new file mode 100644 index 0000000000..b5132a4322 --- /dev/null +++ b/mrs_lib/src/transform_broadcaster/index-detail-sort-f.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/transform_broadcaster + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/transform_broadcasterHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:163053.3 %
Date:2024-04-18 23:11:36Functions:2366.7 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
transform_broadcaster.cpp +
53.3%53.3%
+
53.3 %16 / 3066.7 %2 / 3
<unnamed>53.3 %16 / 3066.7 %2 / 3
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/transform_broadcaster/index-detail-sort-l.html b/mrs_lib/src/transform_broadcaster/index-detail-sort-l.html new file mode 100644 index 0000000000..5d99629d6a --- /dev/null +++ b/mrs_lib/src/transform_broadcaster/index-detail-sort-l.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/transform_broadcaster + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/transform_broadcasterHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:163053.3 %
Date:2024-04-18 23:11:36Functions:2366.7 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
transform_broadcaster.cpp +
53.3%53.3%
+
53.3 %16 / 3066.7 %2 / 3
<unnamed>53.3 %16 / 3066.7 %2 / 3
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/transform_broadcaster/index-detail.html b/mrs_lib/src/transform_broadcaster/index-detail.html new file mode 100644 index 0000000000..d5d9c7ba6a --- /dev/null +++ b/mrs_lib/src/transform_broadcaster/index-detail.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/transform_broadcaster + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/transform_broadcasterHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:163053.3 %
Date:2024-04-18 23:11:36Functions:2366.7 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
transform_broadcaster.cpp +
53.3%53.3%
+
53.3 %16 / 3066.7 %2 / 3
<unnamed>53.3 %16 / 3066.7 %2 / 3
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/transform_broadcaster/index-sort-f.html b/mrs_lib/src/transform_broadcaster/index-sort-f.html new file mode 100644 index 0000000000..2b831d871b --- /dev/null +++ b/mrs_lib/src/transform_broadcaster/index-sort-f.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/transform_broadcaster + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/transform_broadcasterHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:163053.3 %
Date:2024-04-18 23:11:36Functions:2366.7 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
transform_broadcaster.cpp +
53.3%53.3%
+
53.3 %16 / 3066.7 %2 / 3
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/transform_broadcaster/index-sort-l.html b/mrs_lib/src/transform_broadcaster/index-sort-l.html new file mode 100644 index 0000000000..ba70b21dd4 --- /dev/null +++ b/mrs_lib/src/transform_broadcaster/index-sort-l.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/transform_broadcaster + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/transform_broadcasterHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:163053.3 %
Date:2024-04-18 23:11:36Functions:2366.7 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
transform_broadcaster.cpp +
53.3%53.3%
+
53.3 %16 / 3066.7 %2 / 3
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/transform_broadcaster/index.html b/mrs_lib/src/transform_broadcaster/index.html new file mode 100644 index 0000000000..8751741feb --- /dev/null +++ b/mrs_lib/src/transform_broadcaster/index.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/transform_broadcaster + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/transform_broadcasterHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:163053.3 %
Date:2024-04-18 23:11:36Functions:2366.7 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
transform_broadcaster.cpp +
53.3%53.3%
+
53.3 %16 / 3066.7 %2 / 3
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/transform_broadcaster/transform_broadcaster.cpp.func-sort-c.html b/mrs_lib/src/transform_broadcaster/transform_broadcaster.cpp.func-sort-c.html new file mode 100644 index 0000000000..21a16be012 --- /dev/null +++ b/mrs_lib/src/transform_broadcaster/transform_broadcaster.cpp.func-sort-c.html @@ -0,0 +1,92 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/transform_broadcaster/transform_broadcaster.cpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/transform_broadcaster - transform_broadcaster.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:163053.3 %
Date:2024-04-18 23:11:36Functions:2366.7 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::TransformBroadcaster::sendTransform(std::vector<geometry_msgs::TransformStamped_<std::allocator<void> >, std::allocator<geometry_msgs::TransformStamped_<std::allocator<void> > > > const&)0
mrs_lib::TransformBroadcaster::TransformBroadcaster()173
mrs_lib::TransformBroadcaster::sendTransform(geometry_msgs::TransformStamped_<std::allocator<void> > const&)1865730
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/transform_broadcaster/transform_broadcaster.cpp.func.html b/mrs_lib/src/transform_broadcaster/transform_broadcaster.cpp.func.html new file mode 100644 index 0000000000..8b821514a9 --- /dev/null +++ b/mrs_lib/src/transform_broadcaster/transform_broadcaster.cpp.func.html @@ -0,0 +1,92 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/transform_broadcaster/transform_broadcaster.cpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/transform_broadcaster - transform_broadcaster.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:163053.3 %
Date:2024-04-18 23:11:36Functions:2366.7 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::TransformBroadcaster::sendTransform(geometry_msgs::TransformStamped_<std::allocator<void> > const&)1865730
mrs_lib::TransformBroadcaster::sendTransform(std::vector<geometry_msgs::TransformStamped_<std::allocator<void> >, std::allocator<geometry_msgs::TransformStamped_<std::allocator<void> > > > const&)0
mrs_lib::TransformBroadcaster::TransformBroadcaster()173
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/transform_broadcaster/transform_broadcaster.cpp.gcov.frameset.html b/mrs_lib/src/transform_broadcaster/transform_broadcaster.cpp.gcov.frameset.html new file mode 100644 index 0000000000..b73151ec52 --- /dev/null +++ b/mrs_lib/src/transform_broadcaster/transform_broadcaster.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/transform_broadcaster/transform_broadcaster.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/src/transform_broadcaster/transform_broadcaster.cpp.gcov.html b/mrs_lib/src/transform_broadcaster/transform_broadcaster.cpp.gcov.html new file mode 100644 index 0000000000..b98642b133 --- /dev/null +++ b/mrs_lib/src/transform_broadcaster/transform_broadcaster.cpp.gcov.html @@ -0,0 +1,140 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/transform_broadcaster/transform_broadcaster.cpp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/transform_broadcaster - transform_broadcaster.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:163053.3 %
Date:2024-04-18 23:11:36Functions:2366.7 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : #include <mrs_lib/transform_broadcaster.h>
+       2             : 
+       3             : namespace mrs_lib
+       4             : {
+       5             : 
+       6             : /* constructor //{ */
+       7         173 : TransformBroadcaster::TransformBroadcaster() {
+       8         173 :   broadcaster_ = tf2_ros::TransformBroadcaster();
+       9         173 : }
+      10             : //}
+      11             : 
+      12             : /* sendTransform (const geometry_msgs::TransformStamped &transform) //{ */
+      13     1865730 : void TransformBroadcaster::sendTransform(const geometry_msgs::TransformStamped &transform) {
+      14     3729746 :   std::string frames_from_to = transform.header.frame_id + transform.child_frame_id;
+      15     1862705 :   if (last_messages_.count(frames_from_to) > 0) {
+      16     1864047 :     if (transform.header.stamp > last_messages_[frames_from_to]) {
+      17     1576831 :       broadcaster_.sendTransform(transform);
+      18     1579211 :       last_messages_[frames_from_to] = transform.header.stamp;
+      19             :     } else {
+      20      284014 :       ROS_WARN_ONCE("[%s]: TF_REPEATED_DATA ignoring data with redundant timestamp. Transform from frame '%s' to frame '%s'", ros::this_node::getName().c_str(),
+      21             :                     transform.header.frame_id.c_str(), transform.child_frame_id.c_str());
+      22             :     }
+      23             :   } else {
+      24        1835 :     std::pair<std::string, ros::Time> new_pair;
+      25         892 :     new_pair.first  = frames_from_to;
+      26         892 :     new_pair.second = transform.header.stamp;
+      27         892 :     broadcaster_.sendTransform(transform);
+      28         893 :     last_messages_.insert(new_pair);
+      29             :   }
+      30     1865903 : }
+      31             : //}
+      32             : 
+      33             : /* sendTransform(const std::vector<geometry_msgs::TransformStamped> &transforms) //{ */
+      34           0 : void TransformBroadcaster::sendTransform(const std::vector<geometry_msgs::TransformStamped> &transforms) {
+      35           0 :   for (auto transform : transforms) {
+      36           0 :     std::string frames_from_to = transform.header.frame_id + transform.child_frame_id;
+      37           0 :     if (last_messages_.count(frames_from_to) > 0) {
+      38           0 :       if (transform.header.stamp > last_messages_[frames_from_to]) {
+      39           0 :         broadcaster_.sendTransform(transform);
+      40           0 :         last_messages_[frames_from_to] = transform.header.stamp;
+      41             :       } else {
+      42           0 :         ROS_WARN_ONCE("[%s]: TF_REPEATED_DATA ignoring data with redundant timestamp. Transform from frame '%s' to frame '%s'",
+      43             :                       ros::this_node::getName().c_str(), transform.header.frame_id.c_str(), transform.child_frame_id.c_str());
+      44             :       }
+      45             :     } else {
+      46           0 :       std::pair<std::string, ros::Time> new_pair;
+      47           0 :       new_pair.first  = frames_from_to;
+      48           0 :       new_pair.second = transform.header.stamp;
+      49           0 :       broadcaster_.sendTransform(transform);
+      50           0 :       last_messages_.insert(new_pair);
+      51             :     }
+      52             :   }
+      53           0 : }
+      54             : //}
+      55             : 
+      56             : }  // namespace mrs_lib
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/transform_broadcaster/transform_broadcaster.cpp.gcov.overview.html b/mrs_lib/src/transform_broadcaster/transform_broadcaster.cpp.gcov.overview.html new file mode 100644 index 0000000000..f1fb284078 --- /dev/null +++ b/mrs_lib/src/transform_broadcaster/transform_broadcaster.cpp.gcov.overview.html @@ -0,0 +1,34 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/transform_broadcaster/transform_broadcaster.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/src/transform_broadcaster/transform_broadcaster.cpp.gcov.png b/mrs_lib/src/transform_broadcaster/transform_broadcaster.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..ef243e6e5fb1d3bcaec6f7b6354ea8ce8ebffdea GIT binary patch literal 425 zcmV;a0apHrP)M01uJ*nY`JnFx*N2@5{2?`a1q6zmssfL3_>!}8X35VVlYkpKa402t<;> + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/transformer + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/transformerHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:18528066.1 %
Date:2024-04-18 23:11:36Functions:202676.9 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
transformer.cpp +
66.1%66.1%
+
66.1 %185 / 28076.9 %20 / 26
<unnamed>66.1 %185 / 28076.9 %20 / 26
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/transformer/index-detail-sort-l.html b/mrs_lib/src/transformer/index-detail-sort-l.html new file mode 100644 index 0000000000..36913ee571 --- /dev/null +++ b/mrs_lib/src/transformer/index-detail-sort-l.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/transformer + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/transformerHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:18528066.1 %
Date:2024-04-18 23:11:36Functions:202676.9 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
transformer.cpp +
66.1%66.1%
+
66.1 %185 / 28076.9 %20 / 26
<unnamed>66.1 %185 / 28076.9 %20 / 26
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/transformer/index-detail.html b/mrs_lib/src/transformer/index-detail.html new file mode 100644 index 0000000000..c8dfdc6d70 --- /dev/null +++ b/mrs_lib/src/transformer/index-detail.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/transformer + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/transformerHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:18528066.1 %
Date:2024-04-18 23:11:36Functions:202676.9 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
transformer.cpp +
66.1%66.1%
+
66.1 %185 / 28076.9 %20 / 26
<unnamed>66.1 %185 / 28076.9 %20 / 26
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/transformer/index-sort-f.html b/mrs_lib/src/transformer/index-sort-f.html new file mode 100644 index 0000000000..3b8e0b8916 --- /dev/null +++ b/mrs_lib/src/transformer/index-sort-f.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/transformer + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/transformerHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:18528066.1 %
Date:2024-04-18 23:11:36Functions:202676.9 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
transformer.cpp +
66.1%66.1%
+
66.1 %185 / 28076.9 %20 / 26
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/transformer/index-sort-l.html b/mrs_lib/src/transformer/index-sort-l.html new file mode 100644 index 0000000000..1fee145b81 --- /dev/null +++ b/mrs_lib/src/transformer/index-sort-l.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/transformer + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/transformerHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:18528066.1 %
Date:2024-04-18 23:11:36Functions:202676.9 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
transformer.cpp +
66.1%66.1%
+
66.1 %185 / 28076.9 %20 / 26
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/transformer/index.html b/mrs_lib/src/transformer/index.html new file mode 100644 index 0000000000..ce1e783f8a --- /dev/null +++ b/mrs_lib/src/transformer/index.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/transformer + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/transformerHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:18528066.1 %
Date:2024-04-18 23:11:36Functions:202676.9 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
transformer.cpp +
66.1%66.1%
+
66.1 %185 / 28076.9 %20 / 26
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/transformer/transformer.cpp.func-sort-c.html b/mrs_lib/src/transformer/transformer.cpp.func-sort-c.html new file mode 100644 index 0000000000..06a74388af --- /dev/null +++ b/mrs_lib/src/transformer/transformer.cpp.func-sort-c.html @@ -0,0 +1,184 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/transformer/transformer.cpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/transformer - transformer.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:18528066.1 %
Date:2024-04-18 23:11:36Functions:202676.9 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::Transformer::LLtoUTM(geometry_msgs::PoseStamped_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)0
mrs_lib::Transformer::LLtoUTM(geometry_msgs::PointStamped_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)0
mrs_lib::Transformer::LLtoUTM(geometry_msgs::Pose_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)0
mrs_lib::Transformer::UTMtoLL(geometry_msgs::PointStamped_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)0
mrs_lib::Transformer::Transformer()0
mrs_lib::Transformer::operator=(mrs_lib::Transformer&&)0
void tf2::doTransform<cv::Point3_<double> >(cv::Point3_<double> const&, cv::Point3_<double>&, geometry_msgs::TransformStamped_<std::allocator<void> > const&)1
mrs_lib::Transformer::getTransform(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1
mrs_lib::Transformer::getTransformImpl(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1
mrs_lib::Transformer::LLtoUTM(geometry_msgs::Point_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)2
mrs_lib::Transformer::transformImpl(geometry_msgs::TransformStamped_<std::allocator<void> > const&, Eigen::Matrix<double, 3, 1, 0, 3, 1> const&)6
mrs_lib::Transformer::transformAsPoint(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, geometry_msgs::TransformStamped_<std::allocator<void> > const&)6
mrs_lib::Transformer::transformAsPoint(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)6
mrs_lib::Transformer::transformAsVector(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, geometry_msgs::TransformStamped_<std::allocator<void> > const&)6
mrs_lib::Transformer::transformAsVector(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)6
mrs_lib::Transformer::Transformer(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Duration const&)12
mrs_lib::Transformer::Transformer(ros::NodeHandle const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Duration const&)632
mrs_lib::Transformer::UTMtoLL(geometry_msgs::PoseStamped_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1916
mrs_lib::Transformer::UTMtoLL(geometry_msgs::Pose_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1916
mrs_lib::Transformer::UTMtoLL(geometry_msgs::Point_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1918
mrs_lib::Transformer::getFramePrefix(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)3842
mrs_lib::Transformer::getTransform(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)23906
mrs_lib::Transformer::transformImpl(geometry_msgs::TransformStamped_<std::allocator<void> > const&, mrs_msgs::ReferenceStamped_<std::allocator<void> > const&)110062
mrs_lib::Transformer::setLatLon(double, double)183305
mrs_lib::Transformer::getTransformImpl(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1552088
mrs_lib::Transformer::resolveFrameImpl(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)6521263
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/transformer/transformer.cpp.func.html b/mrs_lib/src/transformer/transformer.cpp.func.html new file mode 100644 index 0000000000..03d69810db --- /dev/null +++ b/mrs_lib/src/transformer/transformer.cpp.func.html @@ -0,0 +1,184 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/transformer/transformer.cpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/transformer - transformer.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:18528066.1 %
Date:2024-04-18 23:11:36Functions:202676.9 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
void tf2::doTransform<cv::Point3_<double> >(cv::Point3_<double> const&, cv::Point3_<double>&, geometry_msgs::TransformStamped_<std::allocator<void> > const&)1
mrs_lib::Transformer::getTransform(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1
mrs_lib::Transformer::getTransform(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)23906
mrs_lib::Transformer::transformImpl(geometry_msgs::TransformStamped_<std::allocator<void> > const&, Eigen::Matrix<double, 3, 1, 0, 3, 1> const&)6
mrs_lib::Transformer::transformImpl(geometry_msgs::TransformStamped_<std::allocator<void> > const&, mrs_msgs::ReferenceStamped_<std::allocator<void> > const&)110062
mrs_lib::Transformer::getFramePrefix(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)3842
mrs_lib::Transformer::getTransformImpl(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1
mrs_lib::Transformer::getTransformImpl(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1552088
mrs_lib::Transformer::resolveFrameImpl(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)6521263
mrs_lib::Transformer::transformAsPoint(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, geometry_msgs::TransformStamped_<std::allocator<void> > const&)6
mrs_lib::Transformer::transformAsPoint(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)6
mrs_lib::Transformer::transformAsVector(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, geometry_msgs::TransformStamped_<std::allocator<void> > const&)6
mrs_lib::Transformer::transformAsVector(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&)6
mrs_lib::Transformer::LLtoUTM(geometry_msgs::PoseStamped_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)0
mrs_lib::Transformer::LLtoUTM(geometry_msgs::PointStamped_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)0
mrs_lib::Transformer::LLtoUTM(geometry_msgs::Pose_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)0
mrs_lib::Transformer::LLtoUTM(geometry_msgs::Point_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)2
mrs_lib::Transformer::UTMtoLL(geometry_msgs::PoseStamped_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1916
mrs_lib::Transformer::UTMtoLL(geometry_msgs::PointStamped_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)0
mrs_lib::Transformer::UTMtoLL(geometry_msgs::Pose_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1916
mrs_lib::Transformer::UTMtoLL(geometry_msgs::Point_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1918
mrs_lib::Transformer::setLatLon(double, double)183305
mrs_lib::Transformer::Transformer(ros::NodeHandle const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Duration const&)632
mrs_lib::Transformer::Transformer(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Duration const&)12
mrs_lib::Transformer::Transformer()0
mrs_lib::Transformer::operator=(mrs_lib::Transformer&&)0
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/transformer/transformer.cpp.gcov.frameset.html b/mrs_lib/src/transformer/transformer.cpp.gcov.frameset.html new file mode 100644 index 0000000000..c4e71e8234 --- /dev/null +++ b/mrs_lib/src/transformer/transformer.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/transformer/transformer.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/src/transformer/transformer.cpp.gcov.html b/mrs_lib/src/transformer/transformer.cpp.gcov.html new file mode 100644 index 0000000000..24bf6d3a1d --- /dev/null +++ b/mrs_lib/src/transformer/transformer.cpp.gcov.html @@ -0,0 +1,671 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/transformer/transformer.cpp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/transformer - transformer.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:18528066.1 %
Date:2024-04-18 23:11:36Functions:202676.9 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : // clang: MatousFormat
+       2             : 
+       3             : #include <mrs_lib/transformer.h>
+       4             : #include <mrs_lib/gps_conversions.h>
+       5             : #include <opencv2/core/types.hpp>
+       6             : #include <mrs_lib/geometry/conversions.h>
+       7             : #include <mutex>
+       8             : 
+       9             : using test_t = mrs_msgs::ReferenceStamped;
+      10             : /* using test_t = pcl::PointCloud<pcl::PointXYZ>; */
+      11             : template std::optional<test_t> mrs_lib::Transformer::transform<test_t>(const test_t& what, const geometry_msgs::TransformStamped& to_frame);
+      12             : template std::optional<test_t::Ptr> mrs_lib::Transformer::transform<test_t>(const test_t::Ptr& what, const geometry_msgs::TransformStamped& to_frame);
+      13             : template std::optional<test_t::Ptr> mrs_lib::Transformer::transform<test_t>(const test_t::ConstPtr& what, const geometry_msgs::TransformStamped& to_frame);
+      14             : template std::optional<test_t> mrs_lib::Transformer::transformSingle<test_t>(const test_t& what, const std::string& to_frame);
+      15             : template std::optional<test_t::Ptr> mrs_lib::Transformer::transformSingle<test_t>(const test_t::Ptr& what, const std::string& to_frame);
+      16             : template std::optional<test_t::Ptr> mrs_lib::Transformer::transformSingle<test_t>(const test_t::ConstPtr& what, const std::string& to_frame);
+      17             : 
+      18             : namespace tf2
+      19             : {
+      20             :   template <>
+      21           1 :   void doTransform(const cv::Point3d& point_in, cv::Point3d& point_out, const geometry_msgs::TransformStamped& transform)
+      22             :   {
+      23           1 :     const geometry_msgs::Point pt = mrs_lib::geometry::fromCV(point_in);
+      24           1 :     geometry_msgs::Point pt_tfd;
+      25           1 :     tf2::doTransform(pt, pt_tfd, transform);
+      26           1 :     point_out = mrs_lib::geometry::toCV(pt_tfd);
+      27           1 :   }
+      28             : }
+      29             : 
+      30             : namespace mrs_lib
+      31             : {
+      32             : 
+      33             :   // | ----------------------- Transformer ---------------------- |
+      34             : 
+      35             :   // | ------------------ user-callable methods ----------------- |
+      36             : 
+      37             :   /* Transformer() (constructors)//{ */
+      38             : 
+      39           0 :   Transformer::Transformer()
+      40             :   {
+      41           0 :   }
+      42             : 
+      43          12 :   Transformer::Transformer(const std::string& node_name, const ros::Duration& cache_time)
+      44          12 :     : initialized_(true), node_name_(node_name), tf_buffer_(std::make_unique<tf2_ros::Buffer>(cache_time)), tf_listener_ptr_(std::make_unique<tf2_ros::TransformListener>(*tf_buffer_))
+      45             :   {
+      46          12 :   }
+      47             : 
+      48         632 :   Transformer::Transformer(const ros::NodeHandle& nh, const std::string& node_name, const ros::Duration& cache_time)
+      49         632 :     : initialized_(true), node_name_(node_name), tf_buffer_(std::make_unique<tf2_ros::Buffer>(cache_time)), tf_listener_ptr_(std::make_unique<tf2_ros::TransformListener>(*tf_buffer_, nh))
+      50             :   {
+      51         632 :   }
+      52             : 
+      53           0 :   Transformer& Transformer::operator=(Transformer&& other)
+      54             :   {
+      55           0 :     std::scoped_lock lck(other.mutex_, mutex_);
+      56             : 
+      57           0 :     initialized_ = std::move(other.initialized_);
+      58           0 :     node_name_ = std::move(other.node_name_);
+      59           0 :     tf_buffer_ = std::move(other.tf_buffer_);
+      60           0 :     tf_listener_ptr_ = std::move(other.tf_listener_ptr_);
+      61             : 
+      62           0 :     default_frame_id_ = std::move(other.default_frame_id_);
+      63           0 :     prefix_ = std::move(other.prefix_);
+      64           0 :     quiet_ = std::move(other.quiet_);
+      65           0 :     lookup_timeout_ = std::move(other.lookup_timeout_);
+      66           0 :     retry_lookup_newest_ = std::move(other.retry_lookup_newest_);
+      67             : 
+      68           0 :     got_utm_zone_ = std::move(other.got_utm_zone_);
+      69           0 :     utm_zone_ = std::move(other.utm_zone_);
+      70             : 
+      71           0 :     return *this;
+      72             :   }
+      73             : 
+      74             :   //}
+      75             : 
+      76             :   /* getTransform() //{ */
+      77             : 
+      78       23906 :   std::optional<geometry_msgs::TransformStamped> Transformer::getTransform(const std::string& from_frame_raw, const std::string& to_frame_raw, const ros::Time& time_stamp)
+      79             :   {
+      80       47818 :     std::scoped_lock lck(mutex_);
+      81             : 
+      82       23912 :     if (!initialized_)
+      83             :     {
+      84           0 :       ROS_ERROR_THROTTLE(1.0, "[%s]: Transformer: cannot provide transform, not initialized!", node_name_.c_str());
+      85           0 :       return std::nullopt;
+      86             :     }
+      87             : 
+      88             :     // resolve the frames
+      89       47824 :     const std::string from_frame = resolveFrameImpl(from_frame_raw);
+      90       47824 :     const std::string to_frame = resolveFrameImpl(to_frame_raw);
+      91       47824 :     const std::string latlon_frame = resolveFrameImpl(LATLON_ORIGIN);
+      92             : 
+      93       23912 :     return getTransformImpl(from_frame, to_frame, time_stamp, latlon_frame);
+      94             :   }
+      95             : 
+      96           1 :   std::optional<geometry_msgs::TransformStamped> Transformer::getTransform(const std::string& from_frame_raw, const ros::Time& from_stamp, const std::string& to_frame_raw, const ros::Time& to_stamp, const std::string& fixed_frame_raw)
+      97             :   {
+      98           2 :     std::scoped_lock lck(mutex_);
+      99             : 
+     100           1 :     if (!initialized_)
+     101             :     {
+     102           0 :       ROS_ERROR_THROTTLE(1.0, "[%s]: Transformer: cannot provide transform, not initialized", node_name_.c_str());
+     103           0 :       return std::nullopt;
+     104             :     }
+     105             : 
+     106           2 :     const std::string from_frame = resolveFrameImpl(from_frame_raw);
+     107           2 :     const std::string to_frame = resolveFrameImpl(to_frame_raw);
+     108           2 :     const std::string fixed_frame = resolveFrameImpl(fixed_frame_raw);
+     109           2 :     const std::string latlon_frame = resolveFrameImpl(LATLON_ORIGIN);
+     110             : 
+     111           1 :     return getTransformImpl(from_frame, from_stamp, to_frame, to_stamp, fixed_frame, latlon_frame);
+     112             :   }
+     113             :   //}
+     114             : 
+     115             :   /* setLatLon() //{ */
+     116             : 
+     117      183305 :   void Transformer::setLatLon(const double lat, const double lon)
+     118             :   {
+     119      183305 :     std::scoped_lock lck(mutex_);
+     120             : 
+     121             :     double utm_x, utm_y;
+     122      182587 :     mrs_lib::LLtoUTM(lat, lon, utm_y, utm_x, utm_zone_.data());
+     123      182747 :     got_utm_zone_ = true;
+     124      182149 :   }
+     125             : 
+     126             :   //}
+     127             : 
+     128             :   /* transformAsVector() //{ */
+     129             : 
+     130           6 :   [[nodiscard]] std::optional<Eigen::Vector3d> Transformer::transformAsVector(const Eigen::Vector3d& what, const geometry_msgs::TransformStamped& tf)
+     131             :   {
+     132          12 :     std::scoped_lock lck(mutex_);
+     133             : 
+     134           6 :     if (!initialized_)
+     135             :     {
+     136           0 :       ROS_ERROR_THROTTLE(1.0, "[%s]: Transformer: cannot transform, not initialized", node_name_.c_str());
+     137           0 :       return std::nullopt;
+     138             :     }
+     139             : 
+     140          12 :     const std::string from_frame = resolveFrameImpl(frame_from(tf));
+     141          12 :     const std::string to_frame = resolveFrameImpl(frame_to(tf));
+     142          12 :     const geometry_msgs::TransformStamped tf_resolved = create_transform(from_frame, to_frame, tf.header.stamp, tf.transform);
+     143             : 
+     144           6 :     const geometry_msgs::Vector3 vec = mrs_lib::geometry::fromEigenVec(what);
+     145           6 :     const auto tfd_vec = transformImpl(tf_resolved, vec);
+     146           6 :     if (tfd_vec.has_value())
+     147          12 :       return mrs_lib::geometry::toEigen(tfd_vec.value());
+     148             :     else
+     149           0 :       return std::nullopt;
+     150             :   }
+     151             : 
+     152           6 :   [[nodiscard]] std::optional<Eigen::Vector3d> Transformer::transformAsVector(const std::string& from_frame_raw, const Eigen::Vector3d& what, const std::string& to_frame_raw, const ros::Time& time_stamp)
+     153             :   {
+     154          12 :     std::scoped_lock lck(mutex_);
+     155             : 
+     156           6 :     if (!initialized_)
+     157             :     {
+     158           0 :       ROS_ERROR_THROTTLE(1.0, "[%s]: Transformer: cannot transform, not initialized", node_name_.c_str());
+     159           0 :       return std::nullopt;
+     160             :     }
+     161             : 
+     162          12 :     const std::string from_frame = resolveFrameImpl(from_frame_raw);
+     163          12 :     const std::string to_frame = resolveFrameImpl(to_frame_raw);
+     164          12 :     const std::string latlon_frame = resolveFrameImpl(LATLON_ORIGIN);
+     165             : 
+     166             :     // get the transform
+     167          12 :     const auto tf_opt = getTransformImpl(from_frame, to_frame, time_stamp, latlon_frame);
+     168           6 :     if (!tf_opt.has_value())
+     169           0 :       return std::nullopt;
+     170           6 :     const geometry_msgs::TransformStamped& tf = tf_opt.value();
+     171             : 
+     172             :     // do the transformation
+     173          12 :     const geometry_msgs::TransformStamped tf_resolved = create_transform(from_frame, to_frame, tf.header.stamp, tf.transform);
+     174           6 :     const geometry_msgs::Vector3 vec = mrs_lib::geometry::fromEigenVec(what);
+     175           6 :     const auto tfd_vec = transformImpl(tf_resolved, vec);
+     176           6 :     if (tfd_vec.has_value())
+     177          12 :       return mrs_lib::geometry::toEigen(tfd_vec.value());
+     178             :     else
+     179           0 :       return std::nullopt;
+     180             :   }
+     181             : 
+     182             :   /* //} */
+     183             : 
+     184             :   /* transformAsPoint() //{ */
+     185             : 
+     186           6 :   [[nodiscard]] std::optional<Eigen::Vector3d> Transformer::transformAsPoint(const Eigen::Vector3d& what, const geometry_msgs::TransformStamped& tf)
+     187             :   {
+     188          12 :     std::scoped_lock lck(mutex_);
+     189             : 
+     190           6 :     if (!initialized_)
+     191             :     {
+     192           0 :       ROS_ERROR_THROTTLE(1.0, "[%s]: Transformer: cannot transform, not initialized", node_name_.c_str());
+     193           0 :       return std::nullopt;
+     194             :     }
+     195             : 
+     196          12 :     const std::string from_frame = resolveFrameImpl(frame_from(tf));
+     197          12 :     const std::string to_frame = resolveFrameImpl(frame_to(tf));
+     198          12 :     const geometry_msgs::TransformStamped tf_resolved = create_transform(from_frame, to_frame, tf.header.stamp, tf.transform);
+     199             : 
+     200           6 :     geometry_msgs::Point pt;
+     201           6 :     pt.x = what.x();
+     202           6 :     pt.y = what.y();
+     203           6 :     pt.z = what.z();
+     204           6 :     const auto tfd_pt = transformImpl(tf_resolved, pt);
+     205           6 :     if (tfd_pt.has_value())
+     206          12 :       return mrs_lib::geometry::toEigen(tfd_pt.value());
+     207             :     else
+     208           0 :       return std::nullopt;
+     209             :   }
+     210             : 
+     211           6 :   [[nodiscard]] std::optional<Eigen::Vector3d> Transformer::transformAsPoint(const std::string& from_frame_raw, const Eigen::Vector3d& what, const std::string& to_frame_raw, const ros::Time& time_stamp)
+     212             :   {
+     213          12 :     std::scoped_lock lck(mutex_);
+     214             : 
+     215           6 :     if (!initialized_)
+     216             :     {
+     217           0 :       ROS_ERROR_THROTTLE(1.0, "[%s]: Transformer: cannot transform, not initialized", node_name_.c_str());
+     218           0 :       return std::nullopt;
+     219             :     }
+     220             : 
+     221          12 :     const std::string from_frame = resolveFrameImpl(from_frame_raw);
+     222          12 :     const std::string to_frame = resolveFrameImpl(to_frame_raw);
+     223          12 :     const std::string latlon_frame = resolveFrameImpl(LATLON_ORIGIN);
+     224             : 
+     225             :     // get the transform
+     226          12 :     const auto tf_opt = getTransformImpl(from_frame, to_frame, time_stamp, latlon_frame);
+     227           6 :     if (!tf_opt.has_value())
+     228           0 :       return std::nullopt;
+     229           6 :     const geometry_msgs::TransformStamped& tf = tf_opt.value();
+     230             : 
+     231             :     // do the transformation
+     232          12 :     const geometry_msgs::TransformStamped tf_resolved = create_transform(from_frame, to_frame, tf.header.stamp, tf.transform);
+     233           6 :     geometry_msgs::Point pt;
+     234           6 :     pt.x = what.x();
+     235           6 :     pt.y = what.y();
+     236           6 :     pt.z = what.z();
+     237           6 :     const auto tfd_pt = transformImpl(tf_resolved, pt);
+     238           6 :     if (tfd_pt.has_value())
+     239          12 :       return mrs_lib::geometry::toEigen(tfd_pt.value());
+     240             :     else
+     241           0 :       return std::nullopt;
+     242             :   }
+     243             : 
+     244             :   /* //} */
+     245             : 
+     246             :   // | ------------- helper implementation methods -------------- |
+     247             : 
+     248             :   /* transformImpl() //{ */
+     249             : 
+     250             :   /* specialization for mrs_msgs::ReferenceStamped //{ */
+     251             :   
+     252      110062 :   std::optional<mrs_msgs::ReferenceStamped> Transformer::transformImpl(const geometry_msgs::TransformStamped& tf, const mrs_msgs::ReferenceStamped& what)
+     253             :   {
+     254             :     // create a pose message
+     255      220123 :     geometry_msgs::PoseStamped pose;
+     256      110061 :     pose.header = what.header;
+     257             :   
+     258      110061 :     pose.pose.position.x = what.reference.position.x;
+     259      110061 :     pose.pose.position.y = what.reference.position.y;
+     260      110061 :     pose.pose.position.z = what.reference.position.z;
+     261      110061 :     pose.pose.orientation = geometry::fromEigen(geometry::quaternionFromHeading(what.reference.heading));
+     262             :   
+     263             :     // try to transform the pose message
+     264      220123 :     const auto pose_opt = transformImpl(tf, pose);
+     265      110062 :     if (!pose_opt.has_value())
+     266           0 :       return std::nullopt;
+     267             :     // overwrite the pose with it's transformed value
+     268      110062 :     pose = pose_opt.value();
+     269             :   
+     270      220124 :     mrs_msgs::ReferenceStamped ret;
+     271      110062 :     ret.header = pose.header;
+     272             :   
+     273             :     // copy the new transformed data back
+     274      110062 :     ret.reference.position.x = pose.pose.position.x;
+     275      110062 :     ret.reference.position.y = pose.pose.position.y;
+     276      110062 :     ret.reference.position.z = pose.pose.position.z;
+     277      110062 :     ret.reference.heading = geometry::headingFromRot(geometry::toEigen(pose.pose.orientation));
+     278      110062 :     return ret;
+     279             :   }
+     280             :   
+     281             :   //}
+     282             : 
+     283             :   /* specialization for Eigen::Vector3d //{ */
+     284             :   
+     285           6 :   std::optional<Eigen::Vector3d> Transformer::transformImpl(const geometry_msgs::TransformStamped& tf, const Eigen::Vector3d& what)
+     286             :   {
+     287             :     // just transform it as you would a geometry_msgs::Vector3
+     288           6 :     const geometry_msgs::Vector3 as_vec = mrs_lib::geometry::fromEigenVec(what);
+     289           6 :     const auto opt = transformImpl(tf, as_vec);
+     290           6 :     if (opt.has_value())
+     291          12 :       return geometry::toEigen(opt.value());
+     292             :     else
+     293           0 :       return std::nullopt;
+     294             :   }
+     295             :   
+     296             :   //}
+     297             : 
+     298             :   //}
+     299             : 
+     300             :   /* getTransformImpl() //{ */
+     301             : 
+     302     1552088 :   std::optional<geometry_msgs::TransformStamped> Transformer::getTransformImpl(const std::string& from_frame, const std::string& to_frame, const ros::Time& time_stamp, const std::string& latlon_frame)
+     303             :   {
+     304     1552088 :     if (!initialized_)
+     305             :     {
+     306           0 :       ROS_ERROR_THROTTLE(1.0, "[%s]: Transformer: cannot provide transform, not initialized!", node_name_.c_str());
+     307           0 :       return std::nullopt;
+     308             :     }
+     309             : 
+     310             :     // if any of the frames is empty, then the query is invalid, return nullopt
+     311     1552088 :     if (from_frame.empty() || to_frame.empty())
+     312             :     {
+     313           3 :       ROS_ERROR_THROTTLE(1.0, "[%s]: Transformer: cannot transform to/from an empty frame!", node_name_.c_str());
+     314           3 :       return std::nullopt;
+     315             :     }
+     316             : 
+     317             :     // if the frames are the same, just return an identity transform
+     318     1552079 :     if (from_frame == to_frame)
+     319      349587 :       return create_transform(from_frame, to_frame, time_stamp, tf2::toMsg(tf2::Transform::getIdentity()));
+     320             : 
+     321             :     // check for a transform from/to latlon coordinates - that is a special case handled separately
+     322     1377289 :     if (from_frame == latlon_frame)
+     323             :     {
+     324             :       // find the transformation between the UTM frame and the non-latlon frame to fill the returned tf
+     325           6 :       const std::string utm_frame = getFramePrefix(from_frame) + "utm_origin";
+     326           6 :       auto tf_opt = getTransformImpl(utm_frame, to_frame, time_stamp, latlon_frame);
+     327           3 :       if (!tf_opt.has_value())
+     328           0 :         return std::nullopt;
+     329             :       // change the transformation frames to point from latlon
+     330           3 :       frame_from(*tf_opt) = from_frame;
+     331           3 :       return tf_opt;
+     332             :     }
+     333     1377286 :     else if (to_frame == latlon_frame)
+     334             :     {
+     335             :       // find the transformation between the UTM frame and the non-latlon frame to fill the returned tf
+     336        3838 :       const std::string utm_frame = getFramePrefix(to_frame) + "utm_origin";
+     337        3838 :       auto tf_opt = getTransformImpl(from_frame, utm_frame, time_stamp, latlon_frame);
+     338        1919 :       if (!tf_opt.has_value())
+     339           0 :         return std::nullopt;
+     340             :       // change the transformation frames to point to latlon
+     341        1919 :       frame_to(*tf_opt) = to_frame;
+     342        1919 :       return tf_opt;
+     343             :     }
+     344             : 
+     345     4126049 :     tf2::TransformException ex("");
+     346             :     // first try to get transform at the requested time
+     347             :     try
+     348             :     {
+     349             :       // try looking up and returning the transform
+     350     1897314 :       return tf_buffer_->lookupTransform(to_frame, from_frame, time_stamp, lookup_timeout_);
+     351             :     }
+     352     1706778 :     catch (tf2::TransformException& e)
+     353             :     {
+     354      853395 :       ex = e;
+     355             :     }
+     356             : 
+     357             :     // if that failed, try to get the newest one if requested
+     358      853380 :     if (retry_lookup_newest_)
+     359             :     {
+     360             :       try
+     361             :       {
+     362     1693517 :         return tf_buffer_->lookupTransform(to_frame, from_frame, ros::Time(0), lookup_timeout_);
+     363             :       }
+     364       26324 :       catch (tf2::TransformException& e)
+     365             :       {
+     366       13162 :         ex = e;
+     367             :       }
+     368             :     }
+     369             : 
+     370             :     // if the flow got here, we've failed to look the transform up
+     371       13193 :     if (quiet_)
+     372             :     {
+     373           0 :       ROS_DEBUG("[%s]: Transformer: Exception caught while looking up transform from \"%s\" to \"%s\": %s", node_name_.c_str(), from_frame.c_str(),
+     374             :                 to_frame.c_str(), ex.what());
+     375             :     } else
+     376             :     {
+     377       13193 :       ROS_WARN_THROTTLE(1.0, "[%s]: Transformer: Exception caught while looking up transform from \"%s\" to \"%s\": %s", node_name_.c_str(),
+     378             :                         from_frame.c_str(), to_frame.c_str(), ex.what());
+     379             :     }
+     380             : 
+     381       13193 :     return std::nullopt;
+     382             :   }
+     383             : 
+     384           1 :   std::optional<geometry_msgs::TransformStamped> Transformer::getTransformImpl(const std::string& from_frame, const ros::Time& from_stamp, const std::string& to_frame, const ros::Time& to_stamp, const std::string& fixed_frame, const std::string& latlon_frame)
+     385             :   {
+     386           1 :     if (!initialized_)
+     387             :     {
+     388           0 :       ROS_ERROR_THROTTLE(1.0, "[%s]: Transformer: cannot provide transform, not initialized", node_name_.c_str());
+     389           0 :       return std::nullopt;
+     390             :     }
+     391             : 
+     392             :     // if the frames are the same, just return an identity transform
+     393           1 :     if (from_frame == to_frame)
+     394           0 :       return create_transform(from_frame, to_frame, to_stamp, tf2::toMsg(tf2::Transform::getIdentity()));
+     395             : 
+     396             :     // check for a transform from/to latlon coordinates - that is a special case handled separately
+     397           1 :     if (from_frame == latlon_frame)
+     398             :     {
+     399             :       // find the transformation between the UTM frame and the non-latlon frame to fill the returned tf
+     400           0 :       const std::string utm_frame = getFramePrefix(from_frame) + "utm_origin";
+     401           0 :       auto tf_opt = getTransformImpl(utm_frame, from_stamp, to_frame, to_stamp, fixed_frame, latlon_frame);
+     402           0 :       if (!tf_opt.has_value())
+     403           0 :         return std::nullopt;
+     404             :       // change the transformation frames to point from latlon
+     405           0 :       frame_from(*tf_opt) = from_frame;
+     406           0 :       return tf_opt;
+     407             :     }
+     408           1 :     else if (to_frame == latlon_frame)
+     409             :     {
+     410             :       // find the transformation between the UTM frame and the non-latlon frame to fill the returned tf
+     411           0 :       const std::string utm_frame = getFramePrefix(to_frame) + "utm_origin";
+     412           0 :       auto tf_opt = getTransformImpl(from_frame, from_stamp, utm_frame, to_stamp, fixed_frame, latlon_frame);
+     413           0 :       if (!tf_opt.has_value())
+     414           0 :         return std::nullopt;
+     415             :       // change the transformation frames to point to latlon
+     416           0 :       frame_to(*tf_opt) = to_frame;
+     417           0 :       return tf_opt;
+     418             :     }
+     419             : 
+     420           3 :     tf2::TransformException ex("");
+     421             :     // first try to get transform at the requested time
+     422             :     try
+     423             :     {
+     424             :       // try looking up and returning the transform
+     425           2 :       return tf_buffer_->lookupTransform(to_frame, to_stamp, from_frame, from_stamp, fixed_frame, lookup_timeout_);
+     426             :     }
+     427           0 :     catch (tf2::TransformException& e)
+     428             :     {
+     429           0 :       ex = e;
+     430             :     }
+     431             : 
+     432             :     // if that failed, try to get the newest one if requested
+     433           0 :     if (retry_lookup_newest_)
+     434             :     {
+     435             :       try
+     436             :       {
+     437           0 :         return tf_buffer_->lookupTransform(to_frame, from_frame, ros::Time(0), lookup_timeout_);
+     438             :       }
+     439           0 :       catch (tf2::TransformException& e)
+     440             :       {
+     441           0 :         ex = e;
+     442             :       }
+     443             :     }
+     444             : 
+     445             :     // if the flow got here, we've failed to look the transform up
+     446           0 :     if (quiet_)
+     447             :     {
+     448           0 :       ROS_DEBUG("[%s]: Transformer: Exception caught while looking up transform from \"%s\" to \"%s\": %s", node_name_.c_str(), from_frame.c_str(),
+     449             :                 to_frame.c_str(), ex.what());
+     450             :     } else
+     451             :     {
+     452           0 :       ROS_WARN_THROTTLE(1.0, "[%s]: Transformer: Exception caught while looking up transform from \"%s\" to \"%s\": %s", node_name_.c_str(),
+     453             :                         from_frame.c_str(), to_frame.c_str(), ex.what());
+     454             :     }
+     455             : 
+     456           0 :     return std::nullopt;
+     457             :   }
+     458             : 
+     459             :   //}
+     460             : 
+     461             :   /* resolveFrameImpl() //{*/
+     462             : 
+     463     6521263 :   std::string Transformer::resolveFrameImpl(const std::string& frame_id)
+     464             :   {
+     465             :     // if the frame is empty, return the default frame id
+     466     6521263 :     if (frame_id.empty())
+     467        5628 :       return default_frame_id_;
+     468             : 
+     469             :     // if there is no prefix set, just return the raw frame id
+     470     6515619 :     if (prefix_.empty())
+     471     4058430 :       return frame_id;
+     472             : 
+     473             :     // if there is a default prefix set and the frame does not start with it, prefix it
+     474     2457069 :     if (frame_id.substr(0, prefix_.length()) != prefix_)
+     475     1549243 :       return prefix_ + frame_id;
+     476             : 
+     477      907962 :     return frame_id;
+     478             :   }
+     479             : 
+     480             :   //}
+     481             : 
+     482             :   /* LLtoUTM() method //{ */
+     483           2 :   geometry_msgs::Point Transformer::LLtoUTM(const geometry_msgs::Point& what, [[maybe_unused]] const std::string& prefix)
+     484             :   {
+     485             :     // convert LAT-LON to UTM
+     486           2 :     geometry_msgs::Point utm;
+     487           2 :     mrs_lib::UTM(what.x, what.y, &utm.x, &utm.y);
+     488             :     // copy the height from the input
+     489           2 :     utm.z = what.z;
+     490           2 :     return utm;
+     491             :   }
+     492             : 
+     493           0 :   geometry_msgs::PointStamped Transformer::LLtoUTM(const geometry_msgs::PointStamped& what, [[maybe_unused]] const std::string& prefix)
+     494             :   {
+     495           0 :     geometry_msgs::PointStamped ret;
+     496           0 :     ret.header.frame_id = prefix + "utm_origin";
+     497           0 :     ret.header.stamp = what.header.stamp;
+     498           0 :     ret.point = LLtoUTM(what.point, prefix);
+     499           0 :     return ret;
+     500             :   }
+     501             : 
+     502           0 :   geometry_msgs::Pose Transformer::LLtoUTM(const geometry_msgs::Pose& what, const std::string& prefix)
+     503             :   {
+     504           0 :     geometry_msgs::Pose ret;
+     505           0 :     ret.position = LLtoUTM(what.position, prefix);
+     506           0 :     ret.orientation = what.orientation;
+     507           0 :     return ret;
+     508             :   }
+     509             : 
+     510           0 :   geometry_msgs::PoseStamped Transformer::LLtoUTM(const geometry_msgs::PoseStamped& what, const std::string& prefix)
+     511             :   {
+     512           0 :     geometry_msgs::PoseStamped ret;
+     513           0 :     ret.header.frame_id = prefix + "utm_origin";
+     514           0 :     ret.header.stamp = what.header.stamp;
+     515           0 :     ret.pose = LLtoUTM(what.pose, prefix);
+     516           0 :     return ret;
+     517             :   }
+     518             :   //}
+     519             : 
+     520             :   /* UTMtoLL() method //{ */
+     521        1918 :   std::optional<geometry_msgs::Point> Transformer::UTMtoLL(const geometry_msgs::Point& what, [[maybe_unused]] const std::string& prefix)
+     522             :   {
+     523             :     // if no UTM zone was specified by the user, we don't know which one to use...
+     524        1918 :     if (!got_utm_zone_)
+     525             :     {
+     526           1 :       ROS_WARN_THROTTLE(1.0, "[%s]: cannot transform to latlong, missing UTM zone (did you call setLatLon()?)", node_name_.c_str());
+     527           1 :       return std::nullopt;
+     528             :     }
+     529             :   
+     530             :     // now apply the nonlinear transformation from UTM to LAT-LON
+     531        1917 :     geometry_msgs::Point latlon;
+     532        1917 :     mrs_lib::UTMtoLL(what.y, what.x, utm_zone_.data(), latlon.x, latlon.y);
+     533        1917 :     latlon.z = what.z;
+     534        1917 :     return latlon;
+     535             :   }
+     536             : 
+     537           0 :   std::optional<geometry_msgs::PointStamped> Transformer::UTMtoLL(const geometry_msgs::PointStamped& what, [[maybe_unused]] const std::string& prefix)
+     538             :   {
+     539           0 :     const auto opt = UTMtoLL(what.point, prefix);
+     540           0 :     if (!opt.has_value())
+     541           0 :       return std::nullopt;
+     542             : 
+     543           0 :     geometry_msgs::PointStamped ret;
+     544           0 :     ret.header.frame_id = prefix + "utm_origin";
+     545           0 :     ret.header.stamp = what.header.stamp;
+     546           0 :     ret.point = opt.value();
+     547           0 :     return ret;
+     548             :   }
+     549             : 
+     550        1916 :   std::optional<geometry_msgs::Pose> Transformer::UTMtoLL(const geometry_msgs::Pose& what, const std::string& prefix)
+     551             :   {
+     552        1916 :     const auto opt = UTMtoLL(what.position, prefix);
+     553        1916 :     if (!opt.has_value())
+     554           0 :       return std::nullopt;
+     555             : 
+     556        1916 :     geometry_msgs::Pose ret;
+     557        1916 :     ret.position = opt.value();
+     558        1916 :     ret.orientation = what.orientation;
+     559        1916 :     return ret;
+     560             :   }
+     561             : 
+     562        1916 :   std::optional<geometry_msgs::PoseStamped> Transformer::UTMtoLL(const geometry_msgs::PoseStamped& what, const std::string& prefix)
+     563             :   {
+     564        1916 :     const auto opt = UTMtoLL(what.pose, prefix);
+     565        1916 :     if (!opt.has_value())
+     566           0 :       return std::nullopt;
+     567             : 
+     568        3832 :     geometry_msgs::PoseStamped ret;
+     569        1916 :     ret.header.frame_id = prefix + "utm_origin";
+     570        1916 :     ret.header.stamp = what.header.stamp;
+     571        1916 :     ret.pose = opt.value();
+     572        1916 :     return ret;
+     573             :   }
+     574             :   //}
+     575             : 
+     576             :   /* getFramePrefix() method //{ */
+     577        3842 :   std::string Transformer::getFramePrefix(const std::string& frame_id)
+     578             :   {
+     579        3842 :     const auto firstof = frame_id.find_first_of('/');
+     580        3842 :     if (firstof == std::string::npos)
+     581           0 :       return "";
+     582             :     else
+     583        3842 :       return frame_id.substr(0, firstof+1);
+     584             :   }
+     585             :   //}
+     586             : 
+     587             : }  // namespace mrs_lib
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/transformer/transformer.cpp.gcov.overview.html b/mrs_lib/src/transformer/transformer.cpp.gcov.overview.html new file mode 100644 index 0000000000..18b7b2cf49 --- /dev/null +++ b/mrs_lib/src/transformer/transformer.cpp.gcov.overview.html @@ -0,0 +1,167 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/transformer/transformer.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/src/transformer/transformer.cpp.gcov.png b/mrs_lib/src/transformer/transformer.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..4ff2b0c9fa7b42598266c351feaaee51bdaf01d7 GIT binary patch literal 1995 zcmV;+2Q>JJP))dTBU|#LNWnRdg4=R%6}JAzmUEkiX&NUtZheNG zYM9ax12#c(z)?P90~i2xlySpzaX6;Ou4{Qd=6L4N88JCs@z*8Q`P6{TS-{59Pt4c` zR5095(o}^s1R$8>0`U2MH}^37n$Ly0%l+pdX!6VEv8^VsfH_@efJ;-abql#&~qdAW*wZ=Oy_8QPvLRrh|Uq9 z3`wg!Sic_Ntl-_|KkNZ8*Z{9)GWAgldvGNPE5ewOhKQQW?v5mb01G(Ga57^Fy68oi z>l8}FAv$V8+*iX{z<1E_>lL?BoYeuZ({QBci%!k13m?PNRR@f@MzeuT*hJHKrE$5U zH0+)6#LR>a14Iywz&Kj<;^?{{VZSh^=%yHRWFZ-ab$^z}wcghL_+LFP^#Qr>)j3jH zE|*wZ4FEt>;Fnn?mNhGGi{rhbr(wYiM}<;IWZk{`_*&s7T4Aqr#)XB!hXx5TrcAa> z(iGzyfY1uXlBxL~v>}hKGfrK1Q@$Se6Fn}m z)cbRJPm=ZlphrwFV}HP^vo};Vsgq(9iFH!N(mZwn@P$t5>i|B{0en-gzn5|)hA>Ni z9Vv^W++5!y+e@7nW8ChFjTld~a`eL$pYGvtdV%WMM`^#BP3ar7#2qx{&2zR!L+Jnz z?10s98IHsO&|2y@0c)LMFtkx&jB3$jJ1QX4%1g=7EGjSzmpg#fLv25Q_J@D*2>|sB z$Um|xpOp2zaGxch;qxeUydI;mI@wgsl;UWbA^Bp!1AXMUhiB}5KznhUM3)l3)$|p4 z8~Lbmq`|Cx0z~?Z(bB~ZQeBeC0VI8J&Y%<_asa%nt2sp#@EvlB{%UsNSzO;esbW0U z{qTXk3Q(r_cAStzx(_}!5772ZqN_=P_&j@N;_cIsbbM$0O4MAtNJh<`2})S++ahnG zLyPS3tZCv=^*xoAA#EmQu^UkCA7Zx^<`{ara~zvks`wak1zdOpMun1p^x8wW74qs3 zgzEvzP*8Bl0ZKLjTt}tEx||hmaaYHGWw$RI?HVSE8}O|13(5L`j|!WK8payLuZu8B zuqncLD+OMERfM$f8;fw^4E6#MibvrdnG(R=HZaRQszz|2OSZH)vMa7Ec_o3(F8EOp z)7Zu_^i^jHM8lS6O~K-5%rWp~aR!VJimzB8V?JUgvgMw_0rb@hJMFQs@5Ta(ki@=+ z6}DXnlp_DJtm z3i&t_2WirQMf&KxCds6TLq%_vYeXo_T;HZY{DUi`ekA}Q2HQ<~aYKF?=p9M`NA-?~ zrI(@LLY7bBT;i79mdg1A*&Yl|DSDRxD^lFO5#h)$eFDc=P(%b%B{WWSPb!_!E;%j;N4}X%*(M=sOnaZ> z{o(MCG<&d8ZZqMn=IKxIQohgPn5D_u?EWJ~68`01@!GS*3%1Rxr+&kiNrLIpuj%=q zPc6zST=f3Tb7x@6V?bBWY>k*xefUcaoARM0dp(9hh!Z3q-9ua@nrF=RIlw7~HB*TJR8s=$PS0w#sWPRsYPn2RwGOrQ?ld(kM zsBm}f002ovPDHLkV1hv?z6byS literal 0 HcmV?d00001 diff --git a/mrs_lib/src/utils/index-detail-sort-f.html b/mrs_lib/src/utils/index-detail-sort-f.html new file mode 100644 index 0000000000..39cbf87bc3 --- /dev/null +++ b/mrs_lib/src/utils/index-detail-sort-f.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/utils + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/utilsHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:77100.0 %
Date:2024-04-18 23:11:36Functions:22100.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
utils.cpp +
100.0%
+
100.0 %7 / 7100.0 %2 / 2
<unnamed>100.0 %7 / 7100.0 %2 / 2
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/utils/index-detail-sort-l.html b/mrs_lib/src/utils/index-detail-sort-l.html new file mode 100644 index 0000000000..abe147a4f0 --- /dev/null +++ b/mrs_lib/src/utils/index-detail-sort-l.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/utils + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/utilsHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:77100.0 %
Date:2024-04-18 23:11:36Functions:22100.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
utils.cpp +
100.0%
+
100.0 %7 / 7100.0 %2 / 2
<unnamed>100.0 %7 / 7100.0 %2 / 2
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/utils/index-detail.html b/mrs_lib/src/utils/index-detail.html new file mode 100644 index 0000000000..7cab1198ab --- /dev/null +++ b/mrs_lib/src/utils/index-detail.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/utils + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/utilsHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:77100.0 %
Date:2024-04-18 23:11:36Functions:22100.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
utils.cpp +
100.0%
+
100.0 %7 / 7100.0 %2 / 2
<unnamed>100.0 %7 / 7100.0 %2 / 2
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/utils/index-sort-f.html b/mrs_lib/src/utils/index-sort-f.html new file mode 100644 index 0000000000..6af2dbdd8e --- /dev/null +++ b/mrs_lib/src/utils/index-sort-f.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/utils + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/utilsHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:77100.0 %
Date:2024-04-18 23:11:36Functions:22100.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
utils.cpp +
100.0%
+
100.0 %7 / 7100.0 %2 / 2
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/utils/index-sort-l.html b/mrs_lib/src/utils/index-sort-l.html new file mode 100644 index 0000000000..25ef87a7e1 --- /dev/null +++ b/mrs_lib/src/utils/index-sort-l.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/utils + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/utilsHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:77100.0 %
Date:2024-04-18 23:11:36Functions:22100.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
utils.cpp +
100.0%
+
100.0 %7 / 7100.0 %2 / 2
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/utils/index.html b/mrs_lib/src/utils/index.html new file mode 100644 index 0000000000..9775e7e15c --- /dev/null +++ b/mrs_lib/src/utils/index.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/utils + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/utilsHitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:77100.0 %
Date:2024-04-18 23:11:36Functions:22100.0 %
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
utils.cpp +
100.0%
+
100.0 %7 / 7100.0 %2 / 2
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/utils/utils.cpp.func-sort-c.html b/mrs_lib/src/utils/utils.cpp.func-sort-c.html new file mode 100644 index 0000000000..6f2bf43f41 --- /dev/null +++ b/mrs_lib/src/utils/utils.cpp.func-sort-c.html @@ -0,0 +1,88 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/utils/utils.cpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/utils - utils.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:77100.0 %
Date:2024-04-18 23:11:36Functions:22100.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::AtomicScopeFlag::AtomicScopeFlag(std::atomic<bool>&)499905
mrs_lib::AtomicScopeFlag::~AtomicScopeFlag()499920
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/utils/utils.cpp.func.html b/mrs_lib/src/utils/utils.cpp.func.html new file mode 100644 index 0000000000..7364ca2784 --- /dev/null +++ b/mrs_lib/src/utils/utils.cpp.func.html @@ -0,0 +1,88 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/utils/utils.cpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/utils - utils.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:77100.0 %
Date:2024-04-18 23:11:36Functions:22100.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_lib::AtomicScopeFlag::AtomicScopeFlag(std::atomic<bool>&)499905
mrs_lib::AtomicScopeFlag::~AtomicScopeFlag()499920
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/utils/utils.cpp.gcov.frameset.html b/mrs_lib/src/utils/utils.cpp.gcov.frameset.html new file mode 100644 index 0000000000..7f64122dba --- /dev/null +++ b/mrs_lib/src/utils/utils.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/utils/utils.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_lib/src/utils/utils.cpp.gcov.html b/mrs_lib/src/utils/utils.cpp.gcov.html new file mode 100644 index 0000000000..f5ecd336ff --- /dev/null +++ b/mrs_lib/src/utils/utils.cpp.gcov.html @@ -0,0 +1,101 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/utils/utils.cpp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_lib/src/utils - utils.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:77100.0 %
Date:2024-04-18 23:11:36Functions:22100.0 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : #include <mrs_lib/utils.h>
+       2             : 
+       3             : namespace mrs_lib
+       4             : {
+       5             : 
+       6      499905 : AtomicScopeFlag::AtomicScopeFlag(std::atomic<bool>& in)
+       7      499905 :   : variable(in)
+       8             : {
+       9      499905 :   variable = true;
+      10      499919 : }
+      11             : 
+      12      999841 : AtomicScopeFlag::~AtomicScopeFlag()
+      13             : {
+      14      499920 :   variable = false;
+      15      499921 : }
+      16             : 
+      17             : }  // namespace mrs_lib
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_lib/src/utils/utils.cpp.gcov.overview.html b/mrs_lib/src/utils/utils.cpp.gcov.overview.html new file mode 100644 index 0000000000..f3b2e0a717 --- /dev/null +++ b/mrs_lib/src/utils/utils.cpp.gcov.overview.html @@ -0,0 +1,25 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_lib/src/utils/utils.cpp + + + + + + + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_lib/src/utils/utils.cpp.gcov.png b/mrs_lib/src/utils/utils.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..3b82aa0d55e194f12f9515f4d5ef4f00538985ef GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^0YEIs!VDyLSeu0dDTx4|5ZC|z|E~gqdj0}#k_Vn~lnZVFINzf&xlOe%CX$e!F(g};y)F!t{2}&Ee3~RkNUNtx`aKVxJ gJcj|7z|;l?m3NMIqUuuIK(iS + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_autostart/src/automatic_start.cpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_uav_autostart/src - automatic_start.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:28732588.3 %
Date:2024-04-18 23:11:36Functions:2121100.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
mrs_uav_autostart::automatic_start::AutomaticStart::disarm()2
mrs_uav_autostart::automatic_start::AutomaticStart::takeoff()19
mrs_uav_autostart::automatic_start::AutomaticStart::toggleControlOutput(bool const&)24
(anonymous namespace)::ProxyExec0::ProxyExec0()31
mrs_uav_autostart::automatic_start::AutomaticStart::onInit()31
mrs_uav_autostart::automatic_start::AutomaticStart::changeState(mrs_uav_autostart::automatic_start::LandingStates_t)47
mrs_uav_autostart::automatic_start::Topic::Topic(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)63
mrs_uav_autostart::automatic_start::Topic::getTopicName[abi:cxx11]()78
mrs_uav_autostart::automatic_start::AutomaticStart::callbackGazeboSpawnerDiagnostics(boost::shared_ptr<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > const>)3112
mrs_uav_autostart::automatic_start::AutomaticStart::topicCheck()9790
mrs_uav_autostart::automatic_start::AutomaticStart::validateReference()9790
mrs_uav_autostart::automatic_start::AutomaticStart::isGazeboSimulation()9790
mrs_uav_autostart::automatic_start::AutomaticStart::preflighCheckGyro()9944
mrs_uav_autostart::automatic_start::AutomaticStart::preflighCheckHeight()9944
mrs_uav_autostart::automatic_start::AutomaticStart::preflightCheckSpeed()9944
mrs_uav_autostart::automatic_start::AutomaticStart::timerMain(ros::TimerEvent const&)18488
mrs_uav_autostart::automatic_start::Topic::getTime()39238
mrs_uav_autostart::automatic_start::Topic::updateTime()48779
mrs_uav_autostart::automatic_start::AutomaticStart::genericCallback(boost::shared_ptr<topic_tools::ShapeShifter const> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)48785
mrs_uav_autostart::automatic_start::AutomaticStart::onInit()::{lambda(boost::shared_ptr<topic_tools::ShapeShifter const> const&)#1}::operator()(boost::shared_ptr<topic_tools::ShapeShifter const> const&) const48791
mrs_uav_autostart::automatic_start::AutomaticStart::callbackHwApiStatus(boost::shared_ptr<mrs_msgs::HwApiStatus_<std::allocator<void> > const>)119512
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_uav_autostart/src/automatic_start.cpp.func.html b/mrs_uav_autostart/src/automatic_start.cpp.func.html new file mode 100644 index 0000000000..5ab9e80a51 --- /dev/null +++ b/mrs_uav_autostart/src/automatic_start.cpp.func.html @@ -0,0 +1,164 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_autostart/src/automatic_start.cpp - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_uav_autostart/src - automatic_start.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:28732588.3 %
Date:2024-04-18 23:11:36Functions:2121100.0 %
Legend: Lines: + hit + not hit +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by hit count
(anonymous namespace)::ProxyExec0::ProxyExec0()31
mrs_uav_autostart::automatic_start::AutomaticStart::topicCheck()9790
mrs_uav_autostart::automatic_start::AutomaticStart::changeState(mrs_uav_autostart::automatic_start::LandingStates_t)47
mrs_uav_autostart::automatic_start::AutomaticStart::genericCallback(boost::shared_ptr<topic_tools::ShapeShifter const> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)48785
mrs_uav_autostart::automatic_start::AutomaticStart::preflighCheckGyro()9944
mrs_uav_autostart::automatic_start::AutomaticStart::validateReference()9790
mrs_uav_autostart::automatic_start::AutomaticStart::isGazeboSimulation()9790
mrs_uav_autostart::automatic_start::AutomaticStart::callbackHwApiStatus(boost::shared_ptr<mrs_msgs::HwApiStatus_<std::allocator<void> > const>)119512
mrs_uav_autostart::automatic_start::AutomaticStart::preflighCheckHeight()9944
mrs_uav_autostart::automatic_start::AutomaticStart::preflightCheckSpeed()9944
mrs_uav_autostart::automatic_start::AutomaticStart::toggleControlOutput(bool const&)24
mrs_uav_autostart::automatic_start::AutomaticStart::callbackGazeboSpawnerDiagnostics(boost::shared_ptr<mrs_msgs::GazeboSpawnerDiagnostics_<std::allocator<void> > const>)3112
mrs_uav_autostart::automatic_start::AutomaticStart::disarm()2
mrs_uav_autostart::automatic_start::AutomaticStart::onInit()31
mrs_uav_autostart::automatic_start::AutomaticStart::takeoff()19
mrs_uav_autostart::automatic_start::AutomaticStart::timerMain(ros::TimerEvent const&)18488
mrs_uav_autostart::automatic_start::Topic::updateTime()48779
mrs_uav_autostart::automatic_start::Topic::getTopicName[abi:cxx11]()78
mrs_uav_autostart::automatic_start::Topic::getTime()39238
mrs_uav_autostart::automatic_start::Topic::Topic(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)63
mrs_uav_autostart::automatic_start::AutomaticStart::onInit()::{lambda(boost::shared_ptr<topic_tools::ShapeShifter const> const&)#1}::operator()(boost::shared_ptr<topic_tools::ShapeShifter const> const&) const48791
+
+
+ + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_uav_autostart/src/automatic_start.cpp.gcov.frameset.html b/mrs_uav_autostart/src/automatic_start.cpp.gcov.frameset.html new file mode 100644 index 0000000000..dc21d0ec86 --- /dev/null +++ b/mrs_uav_autostart/src/automatic_start.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_autostart/src/automatic_start.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_autostart/src/automatic_start.cpp.gcov.html b/mrs_uav_autostart/src/automatic_start.cpp.gcov.html new file mode 100644 index 0000000000..63050f6a70 --- /dev/null +++ b/mrs_uav_autostart/src/automatic_start.cpp.gcov.html @@ -0,0 +1,1049 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_autostart/src/automatic_start.cpp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - mrs_uav_autostart/src - automatic_start.cpp (source / functions)HitTotalCoverage
Test:MRS UAV System - Test coverage reportLines:28732588.3 %
Date:2024-04-18 23:11:36Functions:2121100.0 %
Legend: Lines: + hit + not hit +
+
+ + + + + + + + +

+
          Line data    Source code
+
+       1             : /* includes //{ */
+       2             : 
+       3             : #include <ros/ros.h>
+       4             : #include <nodelet/nodelet.h>
+       5             : 
+       6             : #include <mrs_lib/param_loader.h>
+       7             : #include <mrs_lib/mutex.h>
+       8             : #include <mrs_lib/subscribe_handler.h>
+       9             : #include <mrs_lib/publisher_handler.h>
+      10             : 
+      11             : #include <std_msgs/Bool.h>
+      12             : 
+      13             : #include <std_srvs/Trigger.h>
+      14             : #include <std_srvs/SetBool.h>
+      15             : 
+      16             : #include <mrs_msgs/ControlManagerDiagnostics.h>
+      17             : #include <mrs_msgs/UavManagerDiagnostics.h>
+      18             : #include <mrs_msgs/ValidateReference.h>
+      19             : #include <mrs_msgs/GazeboSpawnerDiagnostics.h>
+      20             : #include <mrs_msgs/HwApiStatus.h>
+      21             : #include <mrs_msgs/HwApiCapabilities.h>
+      22             : #include <mrs_msgs/EstimationDiagnostics.h>
+      23             : 
+      24             : #include <sensor_msgs/Range.h>
+      25             : #include <sensor_msgs/Imu.h>
+      26             : 
+      27             : #include <topic_tools/shape_shifter.h>
+      28             : 
+      29             : //}
+      30             : 
+      31             : namespace mrs_uav_autostart
+      32             : {
+      33             : 
+      34             : namespace automatic_start
+      35             : {
+      36             : 
+      37             : /* class Topic //{ */
+      38             : 
+      39             : class Topic {
+      40             : private:
+      41             :   std::string topic_name_;
+      42             :   ros::Time   last_time_;
+      43             : 
+      44             : public:
+      45          63 :   Topic(std::string topic_name) : topic_name_(topic_name) {
+      46          63 :     last_time_ = ros::Time::UNINITIALIZED;
+      47          63 :   }
+      48             : 
+      49       48779 :   void updateTime(void) {
+      50       48779 :     last_time_ = ros::Time::now();
+      51       48790 :   }
+      52             : 
+      53       39238 :   ros::Time getTime(void) {
+      54       39238 :     return last_time_;
+      55             :   }
+      56             : 
+      57          78 :   std::string getTopicName(void) {
+      58          78 :     return topic_name_;
+      59             :   }
+      60             : };
+      61             : 
+      62             : //}
+      63             : 
+      64             : /* class AutomaticStart //{ */
+      65             : 
+      66             : // state machine
+      67             : typedef enum
+      68             : {
+      69             :   STATE_IDLE,
+      70             :   STATE_TAKEOFF,
+      71             :   STATE_FINISHED
+      72             : } LandingStates_t;
+      73             : 
+      74             : const char* state_names[3] = {"IDLING", "TAKEOFF", "FINISHED"};
+      75             : 
+      76             : class AutomaticStart : public nodelet::Nodelet {
+      77             : 
+      78             : public:
+      79             :   virtual void onInit();
+      80             : 
+      81             : private:
+      82             :   ros::NodeHandle   nh_;
+      83             :   std::atomic<bool> is_initialized_ = false;
+      84             : 
+      85             :   std::string _uav_name_;
+      86             :   bool        _simulation_;
+      87             : 
+      88             :   // | --------------------- service clients -------------------- |
+      89             : 
+      90             :   ros::ServiceClient service_client_toggle_control_output_;
+      91             :   ros::ServiceClient service_client_arm_;
+      92             :   ros::ServiceClient service_client_takeoff_;
+      93             :   ros::ServiceClient service_client_validate_reference_;
+      94             : 
+      95             :   // | ----------------------- subscribers ---------------------- |
+      96             : 
+      97             :   mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics>     sh_estimation_diag_;
+      98             :   mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus>               sh_hw_api_status_;
+      99             :   mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities>         sh_hw_api_capabilities_;
+     100             :   mrs_lib::SubscribeHandler<sensor_msgs::Range>                  sh_distance_sensor_;
+     101             :   mrs_lib::SubscribeHandler<sensor_msgs::Imu>                    sh_imu_;
+     102             :   mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics> sh_control_manager_diag_;
+     103             :   mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics>     sh_uav_manager_diag_;
+     104             :   mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics>  sh_gazebo_spawner_diag_;
+     105             : 
+     106             :   // | ----------------------- publishers ----------------------- |
+     107             : 
+     108             :   mrs_lib::PublisherHandler<std_msgs::Bool> ph_can_takeoff_;
+     109             : 
+     110             :   // | ----------------------- main timer ----------------------- |
+     111             : 
+     112             :   ros::Timer timer_main_;
+     113             :   void       timerMain(const ros::TimerEvent& event);
+     114             :   double     _main_timer_rate_;
+     115             : 
+     116             :   // | ------------------- hw api diagnostics ------------------- |
+     117             : 
+     118             :   void              callbackHwApiStatus(const mrs_msgs::HwApiStatus::ConstPtr msg);
+     119             :   std::atomic<bool> hw_api_connected_ = false;
+     120             :   std::mutex        mutex_hw_api_status_;
+     121             : 
+     122             :   // | --------------- Gazebo spawner diagnostics --------------- |
+     123             : 
+     124             :   void                               callbackGazeboSpawnerDiagnostics(const mrs_msgs::GazeboSpawnerDiagnostics::ConstPtr msg);
+     125             :   std::atomic<bool>                  got_gazebo_spawner_diagnostics = false;
+     126             :   mrs_msgs::GazeboSpawnerDiagnostics gazebo_spawner_diagnostics_;
+     127             :   std::mutex                         mutex_gazebo_spawner_diagnostics_;
+     128             : 
+     129             :   // | ----------------- arm and offboard check ----------------- |
+     130             : 
+     131             :   ros::Time armed_time_;
+     132             :   bool      armed_ = false;
+     133             : 
+     134             :   ros::Time offboard_time_;
+     135             :   bool      offboard_ = false;
+     136             : 
+     137             :   bool we_toggled_output_ = false;
+     138             : 
+     139             :   // | ------------------------ routines ------------------------ |
+     140             : 
+     141             :   bool takeoff();
+     142             : 
+     143             :   bool validateReference();
+     144             : 
+     145             :   bool toggleControlOutput(const bool& value);
+     146             :   bool disarm();
+     147             : 
+     148             :   bool isGazeboSimulation(void);
+     149             :   bool topicCheck(void);
+     150             :   bool preflightCheckSpeed(void);
+     151             :   bool preflighCheckHeight(void);
+     152             :   bool preflighCheckGyro(void);
+     153             : 
+     154             :   bool is_gazebo_simulation_ = false;
+     155             : 
+     156             :   // | ---------------------- other params ---------------------- |
+     157             : 
+     158             :   std::string _body_frame_name_;
+     159             :   double      _pre_takeoff_sleep_;
+     160             :   bool        _handle_takeoff_ = false;
+     161             :   double      _safety_timeout_;
+     162             :   double      _control_output_timeout_;
+     163             : 
+     164             :   // | ---------------------- state machine --------------------- |
+     165             : 
+     166             :   uint current_state = STATE_IDLE;
+     167             :   void changeState(LandingStates_t new_state);
+     168             : 
+     169             :   // | --------------------- preflight check -------------------- |
+     170             : 
+     171             :   double _preflight_check_time_window_;
+     172             : 
+     173             :   // | ------------------ preflight speed check ----------------- |
+     174             : 
+     175             :   bool      _speed_check_enabled_ = false;
+     176             :   double    _speed_check_max_speed_;
+     177             :   ros::Time speed_check_violated_time_;
+     178             : 
+     179             :   // | ----------------- preflight height check ----------------- |
+     180             : 
+     181             :   bool      _height_check_enabled_ = false;
+     182             :   double    _height_check_max_height_;
+     183             :   ros::Time height_check_violated_time_;
+     184             : 
+     185             :   // | ----------------- preflight gyro check ----------------- |
+     186             : 
+     187             :   bool      _gyro_check_enabled_ = false;
+     188             :   double    _gyro_check_max_rate_;
+     189             :   ros::Time gyro_check_violated_time_;
+     190             : 
+     191             :   // | ---------------- generic topic subscribers --------------- |
+     192             : 
+     193             :   bool                     _topic_check_enabled_ = false;
+     194             :   double                   _topic_check_timeout_;
+     195             :   std::vector<std::string> _topic_check_topic_names_;
+     196             : 
+     197             :   std::vector<Topic>           topic_check_topics_;
+     198             :   std::vector<ros::Subscriber> generic_subscriber_vec_;
+     199             : 
+     200             :   // generic callback, for any topic, to monitor its rate
+     201             :   void genericCallback(const topic_tools::ShapeShifter::ConstPtr& msg, const std::string& topic_name, const int id);
+     202             : };
+     203             : 
+     204             : //}
+     205             : 
+     206             : /* onInit() //{ */
+     207             : 
+     208          31 : void AutomaticStart::onInit() {
+     209             : 
+     210          31 :   nh_ = nodelet::Nodelet::getMTPrivateNodeHandle();
+     211             : 
+     212          31 :   ros::Time::waitForValid();
+     213             : 
+     214          31 :   armed_      = false;
+     215          31 :   armed_time_ = ros::Time(0);
+     216             : 
+     217          31 :   offboard_      = false;
+     218          31 :   offboard_time_ = ros::Time(0);
+     219             : 
+     220          62 :   mrs_lib::ParamLoader param_loader(nh_, "AutomaticStart");
+     221             : 
+     222          62 :   std::string custom_config_path;
+     223             : 
+     224          31 :   param_loader.loadParam("custom_config", custom_config_path);
+     225             : 
+     226          31 :   if (custom_config_path != "") {
+     227           5 :     param_loader.addYamlFile(custom_config_path);
+     228             :   }
+     229             : 
+     230          31 :   param_loader.addYamlFileFromParam("config_private");
+     231          31 :   param_loader.addYamlFileFromParam("config_public");
+     232             : 
+     233          31 :   param_loader.loadParam("uav_name", _uav_name_);
+     234          31 :   param_loader.loadParam("simulation", _simulation_);
+     235             : 
+     236          31 :   param_loader.loadParam("main_timer_rate", _main_timer_rate_);
+     237          31 :   param_loader.loadParam("body_frame_name", _body_frame_name_);
+     238          31 :   param_loader.loadParam("control_output_timeout", _control_output_timeout_);
+     239             : 
+     240          31 :   param_loader.loadParam("safety_timeout", _safety_timeout_);
+     241          31 :   param_loader.loadParam("pre_takeoff_sleep", _pre_takeoff_sleep_);
+     242             : 
+     243          31 :   param_loader.loadParam("handle_takeoff", _handle_takeoff_);
+     244             : 
+     245          31 :   param_loader.loadParam("preflight_check/time_window", _preflight_check_time_window_);
+     246             : 
+     247          31 :   param_loader.loadParam("preflight_check/speed_check/enabled", _speed_check_enabled_);
+     248          31 :   param_loader.loadParam("preflight_check/speed_check/max_speed", _speed_check_max_speed_);
+     249             : 
+     250          31 :   param_loader.loadParam("preflight_check/height_check/enabled", _height_check_enabled_);
+     251          31 :   param_loader.loadParam("preflight_check/height_check/max_height", _height_check_max_height_);
+     252             : 
+     253          31 :   param_loader.loadParam("preflight_check/gyro_check/enabled", _gyro_check_enabled_);
+     254          31 :   param_loader.loadParam("preflight_check/gyro_check/max_rate", _gyro_check_max_rate_);
+     255             : 
+     256          31 :   param_loader.loadParam("preflight_check/topic_check/enabled", _topic_check_enabled_);
+     257          31 :   param_loader.loadParam("preflight_check/topic_check/timeout", _topic_check_timeout_);
+     258          31 :   param_loader.loadParam("preflight_check/topic_check/topics", _topic_check_topic_names_);
+     259             : 
+     260          31 :   if (!param_loader.loadedSuccessfully()) {
+     261           0 :     ROS_ERROR("[AutomaticStart]: Could not load all parameters!");
+     262           0 :     ros::shutdown();
+     263             :   }
+     264             : 
+     265             :   // | ----------------------- subscribers ---------------------- |
+     266             : 
+     267          62 :   mrs_lib::SubscribeHandlerOptions shopts;
+     268          31 :   shopts.nh                 = nh_;
+     269          31 :   shopts.node_name          = "AutomaticStart";
+     270          31 :   shopts.no_message_timeout = mrs_lib::no_timeout;
+     271          31 :   shopts.threadsafe         = true;
+     272          31 :   shopts.autostart          = true;
+     273          31 :   shopts.queue_size         = 10;
+     274          31 :   shopts.transport_hints    = ros::TransportHints().tcpNoDelay();
+     275             : 
+     276          31 :   sh_estimation_diag_      = mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics>(shopts, "estimation_diag_in");
+     277          31 :   sh_hw_api_status_        = mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus>(shopts, "hw_api_status_in", &AutomaticStart::callbackHwApiStatus, this);
+     278          31 :   sh_hw_api_capabilities_  = mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities>(shopts, "hw_api_capabilities_in");
+     279          31 :   sh_distance_sensor_      = mrs_lib::SubscribeHandler<sensor_msgs::Range>(shopts, "distance_sensor_in");
+     280          31 :   sh_imu_                  = mrs_lib::SubscribeHandler<sensor_msgs::Imu>(shopts, "imu_in");
+     281          31 :   sh_control_manager_diag_ = mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics>(shopts, "control_manager_diagnostics_in");
+     282          31 :   sh_uav_manager_diag_     = mrs_lib::SubscribeHandler<mrs_msgs::UavManagerDiagnostics>(shopts, "uav_manager_diagnostics_in");
+     283          62 :   sh_gazebo_spawner_diag_  = mrs_lib::SubscribeHandler<mrs_msgs::GazeboSpawnerDiagnostics>(shopts, "gazebo_spawner_diagnostics_in",
+     284          31 :                                                                                           &AutomaticStart::callbackGazeboSpawnerDiagnostics, this);
+     285             : 
+     286             :   // | ----------------------- publishers ----------------------- |
+     287             : 
+     288          31 :   ph_can_takeoff_ = mrs_lib::PublisherHandler<std_msgs::Bool>(nh_, "can_takeoff_out");
+     289             : 
+     290             :   // | --------------------- service clients -------------------- |
+     291             : 
+     292          31 :   service_client_takeoff_               = nh_.serviceClient<std_srvs::Trigger>("takeoff_out");
+     293          31 :   service_client_toggle_control_output_ = nh_.serviceClient<std_srvs::SetBool>("toggle_control_output_out");
+     294          31 :   service_client_arm_                   = nh_.serviceClient<std_srvs::SetBool>("arm_out");
+     295             : 
+     296          31 :   service_client_validate_reference_ = nh_.serviceClient<mrs_msgs::ValidateReference>("validate_reference_out");
+     297             : 
+     298             :   // | ------------------ setup generic topics ------------------ |
+     299             : 
+     300          31 :   if (_topic_check_enabled_) {
+     301             : 
+     302          62 :     boost::function<void(const topic_tools::ShapeShifter::ConstPtr&)> callback;
+     303             : 
+     304          94 :     for (int i = 0; i < int(_topic_check_topic_names_.size()); i++) {
+     305             : 
+     306         126 :       std::string topic_name = _topic_check_topic_names_[i];
+     307             : 
+     308          63 :       if (topic_name.at(0) != '/') {
+     309          63 :         topic_name = "/" + _uav_name_ + "/" + topic_name;
+     310             :       }
+     311             : 
+     312         126 :       Topic tmp_topic(topic_name);
+     313          63 :       topic_check_topics_.push_back(tmp_topic);
+     314             : 
+     315          63 :       int id = i;  // id to identify which topic called the generic callback
+     316             : 
+     317       48854 :       callback                       = [this, topic_name, id](const topic_tools::ShapeShifter::ConstPtr& msg) -> void { genericCallback(msg, topic_name, id); };
+     318         189 :       ros::Subscriber tmp_subscriber = nh_.subscribe(topic_name, 1, callback);
+     319             : 
+     320          63 :       generic_subscriber_vec_.push_back(tmp_subscriber);
+     321             :     }
+     322             :   }
+     323             : 
+     324             :   // | ------------------------- timers ------------------------- |
+     325             : 
+     326          31 :   timer_main_ = nh_.createTimer(ros::Rate(_main_timer_rate_), &AutomaticStart::timerMain, this);
+     327             : 
+     328             :   // | --------------------- finish the init -------------------- |
+     329             : 
+     330          31 :   is_initialized_ = true;
+     331             : 
+     332          31 :   ROS_INFO_THROTTLE(1.0, "[AutomaticStart]: initialized");
+     333          31 : }
+     334             : 
+     335             : //}
+     336             : 
+     337             : // --------------------------------------------------------------
+     338             : // |                          callbacks                         |
+     339             : // --------------------------------------------------------------
+     340             : 
+     341             : /* genericCallback() //{ */
+     342             : 
+     343       48785 : void AutomaticStart::genericCallback([[maybe_unused]] const topic_tools::ShapeShifter::ConstPtr& msg, [[maybe_unused]] const std::string& topic_name,
+     344             :                                      const int id) {
+     345       48785 :   topic_check_topics_[id].updateTime();
+     346       48790 : }
+     347             : 
+     348             : //}
+     349             : 
+     350             : /* callbackHwApiDiag() //{ */
+     351             : 
+     352      119512 : void AutomaticStart::callbackHwApiStatus(const mrs_msgs::HwApiStatus::ConstPtr msg) {
+     353             : 
+     354      119512 :   if (!is_initialized_) {
+     355           0 :     return;
+     356             :   }
+     357             : 
+     358      119512 :   ROS_INFO_ONCE("[AutomaticStart]: getting HW API diagnostics");
+     359             : 
+     360      239024 :   std::scoped_lock lock(mutex_hw_api_status_);
+     361             : 
+     362             :   // check armed_ state
+     363      119512 :   if (armed_ == false) {
+     364             : 
+     365             :     // if armed_ state changed to true, please "start the clock"
+     366       67387 :     if (msg->armed) {
+     367             : 
+     368          30 :       armed_      = true;
+     369          30 :       armed_time_ = ros::Time::now();
+     370             :     }
+     371             : 
+     372             :     // if we were armed_ previously
+     373       52125 :   } else if (armed_ == true) {
+     374             : 
+     375             :     // and we are not really now
+     376       52125 :     if (!msg->armed) {
+     377             : 
+     378           4 :       armed_ = false;
+     379             :     }
+     380             :   }
+     381             : 
+     382             :   // check offboard_ state
+     383      119512 :   if (offboard_ == false) {
+     384             : 
+     385             :     // if offboard_ state changed to true, please "start the clock"
+     386       77684 :     if (msg->offboard) {
+     387             : 
+     388          22 :       offboard_      = true;
+     389          22 :       offboard_time_ = ros::Time::now();
+     390             :     }
+     391             : 
+     392             :     // if we were in offboard_ previously
+     393       41828 :   } else if (offboard_ == true) {
+     394             : 
+     395             :     // and we are not really now
+     396       41828 :     if (!msg->offboard) {
+     397             : 
+     398           0 :       offboard_ = false;
+     399             :     }
+     400             :   }
+     401             : 
+     402      119512 :   if (msg->connected) {
+     403      116235 :     hw_api_connected_ = true;
+     404             :   }
+     405             : }
+     406             : 
+     407             : //}
+     408             : 
+     409             : /* callbackGazeboSpawnerDiagnostics() //{ */
+     410             : 
+     411        3112 : void AutomaticStart::callbackGazeboSpawnerDiagnostics(const mrs_msgs::GazeboSpawnerDiagnostics::ConstPtr msg) {
+     412             : 
+     413        3112 :   if (!is_initialized_) {
+     414           0 :     return;
+     415             :   }
+     416             : 
+     417        3112 :   ROS_INFO_ONCE("[AutomaticStart]: getting spawner diagnostics");
+     418             : 
+     419             :   {
+     420        6224 :     std::scoped_lock lock(mutex_gazebo_spawner_diagnostics_);
+     421             : 
+     422        3112 :     gazebo_spawner_diagnostics_ = *msg;
+     423             : 
+     424        3112 :     got_gazebo_spawner_diagnostics = true;
+     425             :   }
+     426             : }
+     427             : 
+     428             : //}
+     429             : 
+     430             : // --------------------------------------------------------------
+     431             : // |                           timers                           |
+     432             : // --------------------------------------------------------------
+     433             : 
+     434             : /* timerMain() //{ */
+     435             : 
+     436       18488 : void AutomaticStart::timerMain([[maybe_unused]] const ros::TimerEvent& event) {
+     437             : 
+     438       18488 :   if (!is_initialized_) {
+     439        5855 :     return;
+     440             :   }
+     441             : 
+     442       18488 :   bool got_uav_manager_diag     = sh_uav_manager_diag_.hasMsg();
+     443       18488 :   bool got_control_manager_diag = sh_control_manager_diag_.hasMsg();
+     444       18488 :   bool got_estimation_diag      = sh_estimation_diag_.hasMsg();
+     445       18488 :   bool got_hw_api               = sh_hw_api_status_.hasMsg() && sh_hw_api_capabilities_.hasMsg() && hw_api_connected_;
+     446             : 
+     447       18488 :   if (!got_control_manager_diag || !got_hw_api || !got_uav_manager_diag || !got_estimation_diag) {
+     448        5701 :     ROS_WARN_THROTTLE(5.0, "[AutomaticStart]: waiting for data: ControlManager=%s, UavManager=%s, HW Api=%s, EstimationManager=%s",
+     449             :                       got_control_manager_diag ? "true" : "FALSE", got_uav_manager_diag ? "true" : "FALSE", got_hw_api ? "true" : "FALSE",
+     450             :                       got_estimation_diag ? "true" : "FALSE");
+     451        5701 :     return;
+     452             :   }
+     453             : 
+     454       12787 :   auto [armed, offboard, armed_time, offboard_time] = mrs_lib::get_mutexed(mutex_hw_api_status_, armed_, offboard_, armed_time_, offboard_time_);
+     455       12787 :   auto control_manager_diagnostics                  = sh_control_manager_diag_.getMsg();
+     456             : 
+     457       12787 :   switch (current_state) {
+     458             : 
+     459        9944 :     case STATE_IDLE: {
+     460             : 
+     461             :       // | --------------------- preflight check -------------------- |
+     462             : 
+     463        9944 :       bool speed_valid  = preflightCheckSpeed();
+     464        9944 :       bool height_valid = preflighCheckHeight();
+     465        9944 :       bool gyros_valid  = preflighCheckGyro();
+     466             : 
+     467        9944 :       bool possibly_in_the_air = !speed_valid || !height_valid || !gyros_valid;
+     468             : 
+     469        9944 :       if (possibly_in_the_air) {
+     470             : 
+     471         154 :         ROS_WARN_THROTTLE(1.0, "[AutomaticStart]: preflight check failed, the UAV is possibly in the air");
+     472             : 
+     473         154 :         if (armed) {
+     474             : 
+     475           6 :           ROS_WARN_THROTTLE(1.0, "[AutomaticStart]: -- the UAV is also armed!! finishing to prevent unwanted system activation");
+     476             : 
+     477           6 :           if (we_toggled_output_) {
+     478             : 
+     479           1 :             bool res = toggleControlOutput(false);
+     480             : 
+     481           1 :             if (!res) {
+     482           0 :               ROS_WARN_THROTTLE(1.0, "[AutomaticStart]: could not set control output OFF");
+     483             :             }
+     484             :           }
+     485             : 
+     486           6 :           changeState(STATE_FINISHED);
+     487             : 
+     488         154 :           return;
+     489             :         }
+     490             : 
+     491         148 :         return;
+     492             :       }
+     493             : 
+     494             :       // | -------------------- ready to takeoff -------------------- |
+     495             : 
+     496        9790 :       bool control_output_enabled = sh_control_manager_diag_.getMsg()->output_enabled;
+     497             : 
+     498        9790 :       std_msgs::Bool can_takeoff_msg;
+     499        9790 :       can_takeoff_msg.data = false;
+     500             : 
+     501             :       // | -------------------- preflight checks -------------------- |
+     502             : 
+     503        9790 :       bool position_valid = validateReference();
+     504        9790 :       bool got_topics     = topicCheck();
+     505             : 
+     506        9790 :       bool can_takeoff = got_topics && position_valid;
+     507             : 
+     508             :       // | ---------------------------------------------------------- |
+     509             : 
+     510        9790 :       can_takeoff_msg.data = can_takeoff;
+     511        9790 :       ph_can_takeoff_.publish(can_takeoff_msg);
+     512             : 
+     513        9790 :       if (armed && !control_output_enabled) {
+     514             : 
+     515         115 :         if (can_takeoff) {
+     516             : 
+     517          23 :           bool res = toggleControlOutput(true);
+     518             : 
+     519          23 :           if (!res) {
+     520           0 :             ROS_WARN_THROTTLE(1.0, "[AutomaticStart]: could not set control output ON");
+     521             :           } else {
+     522          23 :             we_toggled_output_ = true;
+     523             :           }
+     524             :         }
+     525             : 
+     526         115 :         double time_from_arming = (ros::Time::now() - armed_time).toSec();
+     527             : 
+     528         115 :         if (armed_time != ros::Time::UNINITIALIZED && time_from_arming > _control_output_timeout_) {
+     529             : 
+     530           2 :           ROS_WARN_THROTTLE(1.0, "[AutomaticStart]: could not set control output ON for %.2f secs, disarming", _control_output_timeout_);
+     531           2 :           disarm();
+     532           2 :           changeState(STATE_FINISHED);
+     533             :         }
+     534             :       }
+     535             : 
+     536        9790 :       if (_simulation_ && isGazeboSimulation()) {
+     537             : 
+     538        6041 :         std::scoped_lock lock(mutex_gazebo_spawner_diagnostics_);
+     539             : 
+     540        6041 :         if (got_gazebo_spawner_diagnostics) {
+     541             : 
+     542        6041 :           if (!gazebo_spawner_diagnostics_.spawn_called || gazebo_spawner_diagnostics_.processing) {
+     543           0 :             ROS_WARN_THROTTLE(1.0, "[AutomaticStart]: (simulation) waiting for spawner to finish spawning UAVs");
+     544           0 :             return;
+     545             :           }
+     546             : 
+     547             :         } else {
+     548             : 
+     549           0 :           ROS_WARN_THROTTLE(1.0, "[AutomaticStart]: (simulation) missing spawner diagnostics");
+     550           0 :           return;
+     551             :         }
+     552             :       }
+     553             : 
+     554             :       // when armed and in offboard, takeoff
+     555        9790 :       if (armed && offboard && control_output_enabled) {
+     556             : 
+     557        3264 :         ros::Duration armed_time_diff    = ros::Time::now() - armed_time;
+     558        3264 :         ros::Duration offboard_time_diff = ros::Time::now() - offboard_time;
+     559             : 
+     560        3264 :         if (armed_time_diff > ros::Duration(_safety_timeout_) && offboard_time_diff > ros::Duration(_safety_timeout_)) {
+     561             : 
+     562          20 :           if (_handle_takeoff_) {
+     563          19 :             changeState(STATE_TAKEOFF);
+     564             :           } else {
+     565           1 :             changeState(STATE_FINISHED);
+     566             :           }
+     567             : 
+     568             :         } else {
+     569             : 
+     570        3244 :           double min = (armed_time_diff < offboard_time_diff) ? armed_time_diff.toSec() : offboard_time_diff.toSec();
+     571             : 
+     572        3244 :           ROS_WARN_THROTTLE(1.0, "taking off in %.0f", (_safety_timeout_ - min));
+     573             :         }
+     574             :       }
+     575             : 
+     576        9790 :       break;
+     577             :     }
+     578             : 
+     579        2815 :     case STATE_TAKEOFF: {
+     580             : 
+     581             :       // if takeoff finished
+     582        2815 :       if (control_manager_diagnostics->flying_normally) {
+     583             : 
+     584          19 :         ROS_INFO_THROTTLE(1.0, "[AutomaticStart]: takeoff finished");
+     585             : 
+     586          19 :         changeState(STATE_FINISHED);
+     587             : 
+     588             :       } else {
+     589             : 
+     590        2796 :         ROS_WARN_THROTTLE(1.0, "[AutomaticStart]: waiting for the takeoff to finish");
+     591             :       }
+     592             : 
+     593        2815 :       break;
+     594             :     }
+     595             : 
+     596          28 :     case STATE_FINISHED: {
+     597             : 
+     598          28 :       ROS_INFO_THROTTLE(1.0, "[AutomaticStart]: finished");
+     599          28 :       ros::requestShutdown();
+     600          28 :       break;
+     601             :     }
+     602             :   }
+     603             : }
+     604             : 
+     605             : //}
+     606             : 
+     607             : // --------------------------------------------------------------
+     608             : // |                          routines                          |
+     609             : // --------------------------------------------------------------
+     610             : 
+     611             : /* changeState() //{ */
+     612             : 
+     613          47 : void AutomaticStart::changeState(LandingStates_t new_state) {
+     614             : 
+     615          47 :   ROS_WARN_THROTTLE(1.0, "[AutomaticStart]: switching states %s -> %s", state_names[current_state], state_names[new_state]);
+     616             : 
+     617          47 :   switch (new_state) {
+     618             : 
+     619           0 :     case STATE_IDLE: {
+     620             : 
+     621           0 :       break;
+     622             :     }
+     623             : 
+     624          19 :     case STATE_TAKEOFF: {
+     625             : 
+     626          19 :       if (_pre_takeoff_sleep_ > 1.0) {
+     627           0 :         ROS_INFO("[AutomaticStart]: sleeping for %.2f secs before takeoff", _pre_takeoff_sleep_);
+     628           0 :         ros::Duration(_pre_takeoff_sleep_).sleep();
+     629             :       }
+     630             : 
+     631          19 :       bool res = takeoff();
+     632             : 
+     633          19 :       if (!res) {
+     634             : 
+     635           0 :         current_state = STATE_FINISHED;
+     636             : 
+     637           0 :         return;
+     638             :       }
+     639             : 
+     640          19 :       break;
+     641             :     }
+     642             : 
+     643          28 :     case STATE_FINISHED: {
+     644             : 
+     645          28 :       break;
+     646             :     }
+     647             : 
+     648             :     break;
+     649             :   }
+     650             : 
+     651          47 :   current_state = new_state;
+     652             : }
+     653             : 
+     654             : //}
+     655             : 
+     656             : /* takeoff() //{ */
+     657             : 
+     658          19 : bool AutomaticStart::takeoff() {
+     659             : 
+     660          19 :   ROS_INFO_THROTTLE(1.0, "[AutomaticStart]: taking off");
+     661             : 
+     662          38 :   std_srvs::Trigger srv;
+     663             : 
+     664          19 :   bool res = service_client_takeoff_.call(srv);
+     665             : 
+     666          19 :   if (res) {
+     667             : 
+     668          19 :     if (srv.response.success) {
+     669             : 
+     670          19 :       return true;
+     671             : 
+     672             :     } else {
+     673             : 
+     674           0 :       ROS_ERROR_THROTTLE(1.0, "[AutomaticStart]: taking off failed: %s", srv.response.message.c_str());
+     675             :     }
+     676             : 
+     677             :   } else {
+     678             : 
+     679           0 :     ROS_ERROR_THROTTLE(1.0, "[AutomaticStart]: service call for taking off failed");
+     680             :   }
+     681             : 
+     682           0 :   return false;
+     683             : }
+     684             : 
+     685             : //}
+     686             : 
+     687             : /* validateReference() //{ */
+     688             : 
+     689        9790 : bool AutomaticStart::validateReference() {
+     690             : 
+     691       19580 :   mrs_msgs::ValidateReference srv_out;
+     692             : 
+     693        9790 :   srv_out.request.reference.header.frame_id = _body_frame_name_;
+     694             : 
+     695        9790 :   bool res = service_client_validate_reference_.call(srv_out);
+     696             : 
+     697        9790 :   if (res) {
+     698             : 
+     699        9788 :     if (srv_out.response.success) {
+     700             : 
+     701        9713 :       ROS_INFO_THROTTLE(1.0, "[AutomaticStart]: current position is valid");
+     702        9713 :       return true;
+     703             : 
+     704             :     } else {
+     705             : 
+     706          75 :       ROS_ERROR_THROTTLE(1.0, "[AutomaticStart]: current position is not valid (safety area, bumper)!");
+     707          75 :       return false;
+     708             :     }
+     709             : 
+     710             :   } else {
+     711             : 
+     712           2 :     ROS_ERROR_THROTTLE(1.0, "[AutomaticStart]: current position could not be validated");
+     713           2 :     return false;
+     714             :   }
+     715             : }
+     716             : 
+     717             : //}
+     718             : 
+     719             : /* toggleControlOutput() //{ */
+     720             : 
+     721          24 : bool AutomaticStart::toggleControlOutput(const bool& value) {
+     722             : 
+     723          24 :   ROS_INFO_THROTTLE(1.0, "[AutomaticStart]: setting control output %s", value ? "ON" : "OFF");
+     724             : 
+     725          48 :   std_srvs::SetBool srv;
+     726          24 :   srv.request.data = value;
+     727             : 
+     728          24 :   bool res = service_client_toggle_control_output_.call(srv);
+     729             : 
+     730          24 :   if (res) {
+     731             : 
+     732          24 :     if (srv.response.success) {
+     733             : 
+     734          24 :       return true;
+     735             : 
+     736             :     } else {
+     737             : 
+     738           0 :       ROS_ERROR_THROTTLE(1.0, "[AutomaticStart]: setting of control output failed: %s", srv.response.message.c_str());
+     739             :     }
+     740             : 
+     741             :   } else {
+     742             : 
+     743           0 :     ROS_ERROR_THROTTLE(1.0, "[AutomaticStart]: service call for toggling control output failed");
+     744             :   }
+     745             : 
+     746           0 :   return false;
+     747             : }
+     748             : 
+     749             : //}
+     750             : 
+     751             : /* disarm() //{ */
+     752             : 
+     753           2 : bool AutomaticStart::disarm() {
+     754             : 
+     755           2 :   if (!hw_api_connected_) {
+     756             : 
+     757           0 :     ROS_WARN_THROTTLE(1.0, "[AutomaticStart]: cannot disarm, missing HW API status!");
+     758             : 
+     759           0 :     return false;
+     760             :   }
+     761             : 
+     762           2 :   auto [armed, offboard, armed_time, offboard_time] = mrs_lib::get_mutexed(mutex_hw_api_status_, armed_, offboard_, armed_time_, offboard_time_);
+     763             : 
+     764           2 :   if (offboard) {
+     765             : 
+     766           0 :     ROS_WARN_THROTTLE(1.0, "[AutomaticStart]: cannot disarm, already in offboard mode!");
+     767             : 
+     768           0 :     return false;
+     769             :   }
+     770             : 
+     771           2 :   ROS_INFO_THROTTLE(1.0, "[AutomaticStart]: disarming");
+     772             : 
+     773           4 :   std_srvs::SetBool srv;
+     774           2 :   srv.request.data = false;
+     775             : 
+     776           2 :   bool res = service_client_arm_.call(srv);
+     777             : 
+     778           2 :   if (res) {
+     779             : 
+     780           2 :     if (srv.response.success) {
+     781             : 
+     782           2 :       return true;
+     783             : 
+     784             :     } else {
+     785             : 
+     786           0 :       ROS_ERROR_THROTTLE(1.0, "[AutomaticStart]: disarming failed");
+     787             :     }
+     788             : 
+     789             :   } else {
+     790             : 
+     791           0 :     ROS_ERROR_THROTTLE(1.0, "[AutomaticStart]: service call for disarming failed");
+     792             :   }
+     793             : 
+     794           0 :   return false;
+     795             : }
+     796             : 
+     797             : //}
+     798             : 
+     799             : /* isGazeboSimulation() //{ */
+     800             : 
+     801        9790 : bool AutomaticStart::isGazeboSimulation(void) {
+     802             : 
+     803        9790 :   if (is_gazebo_simulation_) {
+     804        6032 :     return true;
+     805             :   }
+     806             : 
+     807        7516 :   ros::V_string node_list;
+     808        3758 :   ros::master::getNodes(node_list);
+     809             : 
+     810       52483 :   for (auto& node : node_list) {
+     811       48734 :     if (node.find("mrs_drone_spawner") != std::string::npos) {
+     812           9 :       ROS_INFO("[AutomaticStart]: MRS Gazebo Simulation detected");
+     813           9 :       is_gazebo_simulation_ = true;
+     814           9 :       return true;
+     815             :     }
+     816             :   }
+     817             : 
+     818        3749 :   return false;
+     819             : }
+     820             : 
+     821             : //}
+     822             : 
+     823             : /* topicCheck() //{ */
+     824             : 
+     825        9790 : bool AutomaticStart::topicCheck(void) {
+     826             : 
+     827        9790 :   bool got_topics = true;
+     828             : 
+     829        9790 :   std::stringstream missing_topics;
+     830             : 
+     831        9790 :   if (_topic_check_enabled_) {
+     832             : 
+     833       29448 :     for (int i = 0; i < int(topic_check_topics_.size()); i++) {
+     834             : 
+     835       39238 :       if (topic_check_topics_[i].getTime() == ros::Time::UNINITIALIZED ||
+     836       39238 :           (ros::Time::now() - topic_check_topics_[i].getTime()) > ros::Duration(_topic_check_timeout_)) {
+     837             : 
+     838          78 :         missing_topics << std::endl << "\t" << topic_check_topics_[i].getTopicName();
+     839          78 :         got_topics = false;
+     840             :       }
+     841             :     }
+     842             :   }
+     843             : 
+     844        9790 :   if (!got_topics) {
+     845          78 :     ROS_WARN_STREAM_THROTTLE(1.0, "[AutomaticStart]: missing data on topics: " << missing_topics.str());
+     846             :   }
+     847             : 
+     848       19580 :   return got_topics;
+     849             : }
+     850             : 
+     851             : //}
+     852             : 
+     853             : // | -------- preflight cheks for detecting flyign UAV -------- |
+     854             : 
+     855             : /* preflightCheckSpeed() //{ */
+     856             : 
+     857        9944 : bool AutomaticStart::preflightCheckSpeed(void) {
+     858             : 
+     859        9944 :   if (!_speed_check_enabled_) {
+     860           0 :     return true;
+     861             :   }
+     862             : 
+     863       19888 :   auto estimation_diag = sh_estimation_diag_.getMsg();
+     864             : 
+     865        9944 :   double speed = std::hypot(estimation_diag->velocity.linear.x, estimation_diag->velocity.linear.y, estimation_diag->velocity.linear.z);
+     866             : 
+     867        9944 :   if (speed > _speed_check_max_speed_) {
+     868           0 :     speed_check_violated_time_ = ros::Time::now();
+     869           0 :     ROS_WARN_THROTTLE(1.0, "[AutomaticStart]: the estimated speed (%.2f ms^-2) is over the limit (%.2f ms^-2)", speed, _speed_check_max_speed_);
+     870             :   }
+     871             : 
+     872        9944 :   if (speed_check_violated_time_ != ros::Time::UNINITIALIZED &&
+     873        9944 :       (ros::Time::now() - speed_check_violated_time_) < ros::Duration(_preflight_check_time_window_)) {
+     874           0 :     return false;
+     875             :   } else {
+     876        9944 :     return true;
+     877             :   }
+     878             : }
+     879             : 
+     880             : //}
+     881             : 
+     882             : /* preflighCheckHeight() //{ */
+     883             : 
+     884        9944 : bool AutomaticStart::preflighCheckHeight(void) {
+     885             : 
+     886        9944 :   if (!_height_check_enabled_) {
+     887         245 :     return true;
+     888             :   }
+     889             : 
+     890             :   // | ----------------- is the check possible? ----------------- |
+     891             : 
+     892       19398 :   auto capabilities = sh_hw_api_capabilities_.getMsg();
+     893             : 
+     894        9699 :   if (!capabilities->produces_distance_sensor) {
+     895           0 :     return true;
+     896             :   }
+     897             : 
+     898             :   // | -------------------- do we have data? -------------------- |
+     899             : 
+     900        9699 :   if (!sh_distance_sensor_.hasMsg()) {
+     901         670 :     return true;
+     902             :   }
+     903             : 
+     904        9029 :   double height = sh_distance_sensor_.getMsg()->range;
+     905             : 
+     906        9029 :   if (height > _height_check_max_height_) {
+     907         153 :     height_check_violated_time_ = ros::Time::now();
+     908         153 :     ROS_WARN_THROTTLE(1.0, "[AutomaticStart]: the height (%.2f m) is over the limit (%.2f m)", height, _height_check_max_height_);
+     909             :   }
+     910             : 
+     911        9182 :   if (height_check_violated_time_ != ros::Time::UNINITIALIZED &&
+     912        9182 :       (ros::Time::now() - height_check_violated_time_) < ros::Duration(_preflight_check_time_window_)) {
+     913         153 :     return false;
+     914             :   } else {
+     915        8876 :     return true;
+     916             :   }
+     917             : }
+     918             : 
+     919             : //}
+     920             : 
+     921             : /* preflighCheckGyro() //{ */
+     922             : 
+     923        9944 : bool AutomaticStart::preflighCheckGyro(void) {
+     924             : 
+     925        9944 :   if (!_gyro_check_enabled_) {
+     926           0 :     return true;
+     927             :   }
+     928             : 
+     929             :   // | ----------------- is the check possible? ----------------- |
+     930             : 
+     931       19888 :   auto capabilities = sh_hw_api_capabilities_.getMsg();
+     932             : 
+     933        9944 :   if (!capabilities->produces_imu) {
+     934           0 :     return true;
+     935             :   }
+     936             : 
+     937             :   // | -------------------- do we have data? -------------------- |
+     938             : 
+     939        9944 :   if (!sh_imu_.hasMsg()) {
+     940           0 :     return true;
+     941             :   }
+     942             : 
+     943        9944 :   auto gyros = sh_imu_.getMsg()->angular_velocity;
+     944             : 
+     945        9944 :   if (abs(gyros.x) > _gyro_check_max_rate_ || abs(gyros.y) > _gyro_check_max_rate_ || abs(gyros.z) > _gyro_check_max_rate_) {
+     946           1 :     gyro_check_violated_time_ = ros::Time::now();
+     947           1 :     ROS_WARN_THROTTLE(1.0, "[AutomaticStart]: the angular velocity ([%.2f, %.2f, %.2f] rad/s) is over the limit (%.2f rad/s)", gyros.x, gyros.y, gyros.z,
+     948             :                       _gyro_check_max_rate_);
+     949             :   }
+     950             : 
+     951        9944 :   if (gyro_check_violated_time_ != ros::Time::UNINITIALIZED && (ros::Time::now() - gyro_check_violated_time_) < ros::Duration(_preflight_check_time_window_)) {
+     952           1 :     return false;
+     953             :   } else {
+     954        9943 :     return true;
+     955             :   }
+     956             : }
+     957             : 
+     958             : //}
+     959             : 
+     960             : }  // namespace automatic_start
+     961             : 
+     962             : }  // namespace mrs_uav_autostart
+     963             : 
+     964             : #include <pluginlib/class_list_macros.h>
+     965          31 : PLUGINLIB_EXPORT_CLASS(mrs_uav_autostart::automatic_start::AutomaticStart, nodelet::Nodelet)
+
+
+
+ + + + +
Generated by: LCOV version 1.14
+
+ + + diff --git a/mrs_uav_autostart/src/automatic_start.cpp.gcov.overview.html b/mrs_uav_autostart/src/automatic_start.cpp.gcov.overview.html new file mode 100644 index 0000000000..ab13fd002f --- /dev/null +++ b/mrs_uav_autostart/src/automatic_start.cpp.gcov.overview.html @@ -0,0 +1,262 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_autostart/src/automatic_start.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
+ Top

+ Overview +
+ + diff --git a/mrs_uav_autostart/src/automatic_start.cpp.gcov.png b/mrs_uav_autostart/src/automatic_start.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..29e5e3d5cef0d0e3331d49e3e13ead845abc7da0 GIT binary patch literal 3128 zcmV-849D|{P)8*t_0y2O*r?z8b0rp@lg0lhHgH7WY#>&_+%S8mmO`X_O1K{J6l7uEE#~1&1DE8_<{u21Y*9Y-7UqYh1wKj2M&i zhBeI&>$*m(x{jJmj4n{T&d|uE!&1M>NvP8ySy#gXjNW~lr52#8%gN5e2rBqfuONn7 z!C%i?KSqcx8CwIe95!bdOJ{(>)ZJ`2j8HrdE%;8Ap*`U;RaF4Ea9ACPifp_Xymv6L-87Bj@+a_h89XD2>`fWH*Wyv zxQ@i;OB3GbHoR!W!SG>xh282!`&!9>6qbyWr@Hd0%C-+ga!d+Qo}GJl~6^rah)*{2;!n&sRAz0oK^rA09augW2`6b7i`IA z1xd*fIM;Cl;18}f@nFZoDk$-pS>3nUgAc0;Fht`PWj^N%7Zl1AJ;N;x#>*Jf2uqM_ zzb>*|m(?rdy2N(Q^>pzg<9d?ml$j`V1sR$UmoMO`I^RQbRM`t$2JFHZm%GH!=vp5M{sRE= zF~%LPba{*W!eVRRURSguM_W7;l`{gTYl76&N_y&p+)R^zfKm@XNh6^&g{i^T)gs~{ zr=G%?5qcaV7!lSMV1N{xI!LMs=;s!jI;>HLc>cG**?@oet)6yIR89e z&-a%dcRK*!y*ifrvknjd`9r*NmI?fnR&lL^+;pYW#bfe-PUiL9qba|d0&0h`;PUdR zn}7~u*$p3%tUQ#|0gyQWMi+M#2Bwh(c*61k8B+(5aHl?)fKtq`1Y3vaV3M)nfsf+Kgvm>faQb)AtTB&pQs)@3O$+XTl(s=5oK zK4qsgxpK-o#xCWGlw_+i#x;I9H=M(SAWb7oC4nlnQT!WS}! z!KmN->bGc=cKgEq(S{^#>FHiV@R7*|fDLAe2F!TY@p@Zwj)C1njRcT)%DtxVJ1teB zWbLTME%}7_@q|~{LcgDY=V~-SGiih?tx{$oATyuQG4(~M&&t>$ApW^ql4AydOpF6G zN?lnXeUM*Au$_sOF&0Xtww#P9$R+%;O(7)lg22-c)zE3UezCzEavA5>3l6#DkyPo- zSPa-6EI9&@i_tgQZ!OK-J@vJiuy5++Z0ie!^)twO{P&O818fd+lfq0ilzl z!8;r~f1Dy&V>n-0pOXn?BPJyiu$x_BS}yJ661f8+})XG=9u?*-;^GY6b z>bp(kKA(+D?i-Nj<1Ww{CetukP!HMp^}-AE|3Adxv;7F=824z!xFvyqZO9b^rv5ZH zd;9E#;4BRrhVy1ceHg}QEi?)EyOoP~$jy4fu0P}oUdk^R0C>VRVaWvsU`KVA8sHT@ zACYaH=j#D8Nsm@0DGG4UFzO5=U3^eOWog`D;od5pe1`QJC8ac4a5yz0PI(FVLJr)T zVON{TCb`D&`L$M&Zg1tW=+m_ZCNBl#ugt-Uulr21YU1mQNTs{j_edm?97SX3c;W&= zj1yb~jDBYyQFVgubQPPB9u}9UuaXO-g0sjvDsCr6)!aOtG!}?72~h2nuNNb*&c&vN zE{tZmRYAW8F*eTY_RMt-+-76P^JRK%p5~E%&%1Jcp>XbF z2f76hjrlbM=0KrqEzdP(0Ll~&sVhMq{J5^J{{7?ih=7eaZea#{J)P2vc`Vq(^Q*)NY8nuf#)6F;)|o7L zjNA?DOsgP9>O28hZhNd^EY%BlzKdfIS>^J)C}M@-%Q?@bTq6eDO`rBNjZ2@N8R?QQ zIx5ts=8Y4nEwXPn+LS=93q>|WicDe%HUtl2EUr?Qcw|+k!L^Ug)N#Sle*Y00SMK0b z5+gFw31I#HwX}G+mghGY7Bjo@AG&AdDvPDg0+krPzG@1+ZH<>Zb>F-jsn1ANQ_e`( zM#}Xw`%?Yi1h9Ga(gAYYcDO^{Y3@mCza)4g9&|nRY0n(z1=Ul)&lgCMyr_`~;{;^M zr$;;>epNUKcc+-kr>v7@0G7O#Q7FzbNe;Gkf8Z zupmYd!MZVokurNJ!XISzgt~FyD#InRt%cx5_m8)am>G@O@)ZQ-+MkZh=hDoGM|
  • ukAZx;Q=9#wN`!JT9DSRiz;~AU2I7@hE?uu(J&@t~+bP8NF^~n(U z>w5%F`|BfnbP!wMKg(ZJIc_~)-B#=YX>?6;r_zr$ZY|NM0uBkbB2@!Ex^(Ak7< zw2(FBVku$Ak(519cVC^ER5C?om^AMGOsDJe$?`o1Y6(^lFio+ARx{K|f&nWJYv{3$ zAA67h~nYr3%P&wDBU>Z1XN)gzB2E zr+YEfTc}*Oj!IgqBSs6>4m7z9ejn>2V?Od~UlKc-%i@~<$vaJiA}*2IM(XQF~y%VA2RNVB} zCOkr7A(LYv{os!sPnV0hMBrF3gq;rpk6Qmy&851QuWO8&Y{KKdoMJ;e^+4lcC9~irox+L5w+jYC24}ZBpJa`F{Yy7CwC1=D@41c7j4}g`%y<+!# znfti(k=ywaTyPrxA!hGu+(+pbgZvOV%DazhpZ&+rGsNK|Tf*+OhDd$X4n9lVNBME% zRre8|;HQd@`XipJaOJ~(9dU|&_vb!@# + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_autostart/src + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_autostart/srcHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:28732588.3 %
    Date:2024-04-18 23:11:36Functions:2121100.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    automatic_start.cpp +
    88.3%88.3%
    +
    88.3 %287 / 325100.0 %21 / 21
    <unnamed>88.3 %287 / 325100.0 %21 / 21
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_autostart/src/index-detail-sort-l.html b/mrs_uav_autostart/src/index-detail-sort-l.html new file mode 100644 index 0000000000..36fb031b3c --- /dev/null +++ b/mrs_uav_autostart/src/index-detail-sort-l.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_autostart/src + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_autostart/srcHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:28732588.3 %
    Date:2024-04-18 23:11:36Functions:2121100.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    automatic_start.cpp +
    88.3%88.3%
    +
    88.3 %287 / 325100.0 %21 / 21
    <unnamed>88.3 %287 / 325100.0 %21 / 21
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_autostart/src/index-detail.html b/mrs_uav_autostart/src/index-detail.html new file mode 100644 index 0000000000..7b9d6e5433 --- /dev/null +++ b/mrs_uav_autostart/src/index-detail.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_autostart/src + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_autostart/srcHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:28732588.3 %
    Date:2024-04-18 23:11:36Functions:2121100.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    automatic_start.cpp +
    88.3%88.3%
    +
    88.3 %287 / 325100.0 %21 / 21
    <unnamed>88.3 %287 / 325100.0 %21 / 21
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_autostart/src/index-sort-f.html b/mrs_uav_autostart/src/index-sort-f.html new file mode 100644 index 0000000000..07c27db1f3 --- /dev/null +++ b/mrs_uav_autostart/src/index-sort-f.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_autostart/src + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_autostart/srcHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:28732588.3 %
    Date:2024-04-18 23:11:36Functions:2121100.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    automatic_start.cpp +
    88.3%88.3%
    +
    88.3 %287 / 325100.0 %21 / 21
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_autostart/src/index-sort-l.html b/mrs_uav_autostart/src/index-sort-l.html new file mode 100644 index 0000000000..4dc1ea8eb1 --- /dev/null +++ b/mrs_uav_autostart/src/index-sort-l.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_autostart/src + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_autostart/srcHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:28732588.3 %
    Date:2024-04-18 23:11:36Functions:2121100.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    automatic_start.cpp +
    88.3%88.3%
    +
    88.3 %287 / 325100.0 %21 / 21
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_autostart/src/index.html b/mrs_uav_autostart/src/index.html new file mode 100644 index 0000000000..bca5f9c00d --- /dev/null +++ b/mrs_uav_autostart/src/index.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_autostart/src + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_autostart/srcHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:28732588.3 %
    Date:2024-04-18 23:11:36Functions:2121100.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    automatic_start.cpp +
    88.3%88.3%
    +
    88.3 %287 / 325100.0 %21 / 21
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_controllers/include/common.h.func-sort-c.html b/mrs_uav_controllers/include/common.h.func-sort-c.html new file mode 100644 index 0000000000..0d9dfa82a8 --- /dev/null +++ b/mrs_uav_controllers/include/common.h.func-sort-c.html @@ -0,0 +1,116 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/include/common.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_controllers/include - common.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:242596.0 %
    Date:2024-04-18 23:11:36Functions:99100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_controllers::common::HwApiCmdExtractThrottleVisitor::operator()(mrs_msgs::HwApiPositionCmd_<std::allocator<void> > const&)2
    mrs_uav_controllers::common::HwApiCmdExtractThrottleVisitor::operator()(mrs_msgs::HwApiAccelerationHdgCmd_<std::allocator<void> > const&)2
    mrs_uav_controllers::common::HwApiCmdExtractThrottleVisitor::operator()(mrs_msgs::HwApiAccelerationHdgRateCmd_<std::allocator<void> > const&)2
    mrs_uav_controllers::common::HwApiCmdExtractThrottleVisitor::operator()(mrs_msgs::HwApiActuatorCmd_<std::allocator<void> > const&)3
    mrs_uav_controllers::common::HwApiCmdExtractThrottleVisitor::operator()(mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> > const&)3
    mrs_uav_controllers::common::HwApiCmdExtractThrottleVisitor::operator()(mrs_msgs::HwApiVelocityHdgCmd_<std::allocator<void> > const&)4
    mrs_uav_controllers::common::HwApiCmdExtractThrottleVisitor::operator()(mrs_msgs::HwApiVelocityHdgRateCmd_<std::allocator<void> > const&)10
    mrs_uav_controllers::common::HwApiCmdExtractThrottleVisitor::operator()(mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> > const&)35
    mrs_uav_controllers::common::HwApiCmdExtractThrottleVisitor::operator()(mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> > const&)38
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_controllers/include/common.h.func.html b/mrs_uav_controllers/include/common.h.func.html new file mode 100644 index 0000000000..d1571a665f --- /dev/null +++ b/mrs_uav_controllers/include/common.h.func.html @@ -0,0 +1,116 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/include/common.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_controllers/include - common.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:242596.0 %
    Date:2024-04-18 23:11:36Functions:99100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_controllers::common::HwApiCmdExtractThrottleVisitor::operator()(mrs_msgs::HwApiActuatorCmd_<std::allocator<void> > const&)3
    mrs_uav_controllers::common::HwApiCmdExtractThrottleVisitor::operator()(mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> > const&)35
    mrs_uav_controllers::common::HwApiCmdExtractThrottleVisitor::operator()(mrs_msgs::HwApiPositionCmd_<std::allocator<void> > const&)2
    mrs_uav_controllers::common::HwApiCmdExtractThrottleVisitor::operator()(mrs_msgs::HwApiVelocityHdgCmd_<std::allocator<void> > const&)4
    mrs_uav_controllers::common::HwApiCmdExtractThrottleVisitor::operator()(mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> > const&)38
    mrs_uav_controllers::common::HwApiCmdExtractThrottleVisitor::operator()(mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> > const&)3
    mrs_uav_controllers::common::HwApiCmdExtractThrottleVisitor::operator()(mrs_msgs::HwApiAccelerationHdgCmd_<std::allocator<void> > const&)2
    mrs_uav_controllers::common::HwApiCmdExtractThrottleVisitor::operator()(mrs_msgs::HwApiVelocityHdgRateCmd_<std::allocator<void> > const&)10
    mrs_uav_controllers::common::HwApiCmdExtractThrottleVisitor::operator()(mrs_msgs::HwApiAccelerationHdgRateCmd_<std::allocator<void> > const&)2
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_controllers/include/common.h.gcov.frameset.html b/mrs_uav_controllers/include/common.h.gcov.frameset.html new file mode 100644 index 0000000000..9f1a16783b --- /dev/null +++ b/mrs_uav_controllers/include/common.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/include/common.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_controllers/include/common.h.gcov.html b/mrs_uav_controllers/include/common.h.gcov.html new file mode 100644 index 0000000000..89797c73de --- /dev/null +++ b/mrs_uav_controllers/include/common.h.gcov.html @@ -0,0 +1,189 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/include/common.h + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_controllers/include - common.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:242596.0 %
    Date:2024-04-18 23:11:36Functions:99100.0 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #ifndef MRS_UAV_CONTROLLERS_COMMON_H
    +       2             : #define MRS_UAV_CONTROLLERS_COMMON_H
    +       3             : 
    +       4             : #include <eigen3/Eigen/Eigen>
    +       5             : #include <mrs_uav_managers/control_manager/common_handlers.h>
    +       6             : #include <mrs_uav_managers/controller.h>
    +       7             : #include <mrs_lib/attitude_converter.h>
    +       8             : 
    +       9             : namespace mrs_uav_controllers
    +      10             : {
    +      11             : 
    +      12             : namespace common
    +      13             : {
    +      14             : 
    +      15             : enum CONTROL_OUTPUT
    +      16             : {
    +      17             :   ACTUATORS_CMD,
    +      18             :   CONTROL_GROUP,
    +      19             :   ATTITUDE_RATE,
    +      20             :   ATTITUDE,
    +      21             :   ACCELERATION_HDG_RATE,
    +      22             :   ACCELERATION_HDG,
    +      23             :   VELOCITY_HDG_RATE,
    +      24             :   VELOCITY_HDG,
    +      25             :   POSITION
    +      26             : };
    +      27             : 
    +      28             : Eigen::Vector3d orientationError(const Eigen::Matrix3d& R, const Eigen::Matrix3d& Rd);
    +      29             : 
    +      30             : std::optional<Eigen::Vector3d> sanitizeDesiredForce(const Eigen::Vector3d& desired_force, const double& tilt_over_limit, const double& tilt_saturation,
    +      31             :                                                     const std::string& node_name);
    +      32             : 
    +      33             : Eigen::Matrix3d so3transform(const Eigen::Vector3d& body_z, const ::Eigen::Vector3d& heading, const bool& preserve_heading);
    +      34             : 
    +      35             : std::optional<CONTROL_OUTPUT> getLowestOuput(const mrs_uav_managers::control_manager::ControlOutputModalities_t& outputs);
    +      36             : 
    +      37             : std::optional<CONTROL_OUTPUT> getHighestOuput(const mrs_uav_managers::control_manager::ControlOutputModalities_t& outputs);
    +      38             : 
    +      39             : std::optional<mrs_msgs::HwApiAttitudeRateCmd> attitudeController(const mrs_msgs::UavState& uav_state, const mrs_msgs::HwApiAttitudeCmd& reference,
    +      40             :                                                                  const Eigen::Vector3d& ff_rate, const Eigen::Vector3d& rate_saturation,
    +      41             :                                                                  const Eigen::Vector3d& gains, const bool& parasitic_heading_rate_compensation);
    +      42             : 
    +      43             : std::optional<mrs_msgs::HwApiControlGroupCmd> attitudeRateController(const mrs_msgs::UavState& uav_state, const mrs_msgs::HwApiAttitudeRateCmd& reference,
    +      44             :                                                                      const Eigen::Vector3d& gains);
    +      45             : 
    +      46             : 
    +      47             : mrs_msgs::HwApiActuatorCmd actuatorMixer(const mrs_msgs::HwApiControlGroupCmd& ctrl_group_cmd, const Eigen::MatrixXd& mixer);
    +      48             : 
    +      49             : /* throttle extraction //{ */
    +      50             : 
    +      51             : std::optional<double> extractThrottle(const mrs_uav_managers::Controller::ControlOutput& control_output);
    +      52             : 
    +      53             : struct HwApiCmdExtractThrottleVisitor
    +      54             : {
    +      55           3 :   std::optional<double> operator()(const mrs_msgs::HwApiActuatorCmd& msg) {
    +      56             : 
    +      57           3 :     double throttle = 0;
    +      58             : 
    +      59           3 :     if (msg.motors.size() == 0) {
    +      60           0 :       return std::nullopt;
    +      61             :     }
    +      62             : 
    +      63           3 :     throttle = 0;
    +      64             : 
    +      65          15 :     for (size_t i = 0; i < msg.motors.size(); i++) {
    +      66          12 :       throttle += msg.motors[i];
    +      67             :     };
    +      68             : 
    +      69           3 :     throttle /= msg.motors.size();
    +      70             : 
    +      71           3 :     return throttle;
    +      72             :   }
    +      73           3 :   std::optional<double> operator()(const mrs_msgs::HwApiControlGroupCmd& msg) {
    +      74           3 :     return msg.throttle;
    +      75             :   }
    +      76          35 :   std::optional<double> operator()(const mrs_msgs::HwApiAttitudeCmd& msg) {
    +      77          35 :     return msg.throttle;
    +      78             :   }
    +      79          38 :   std::optional<double> operator()(const mrs_msgs::HwApiAttitudeRateCmd& msg) {
    +      80          38 :     return msg.throttle;
    +      81             :   }
    +      82           2 :   std::optional<double> operator()([[maybe_unused]] const mrs_msgs::HwApiAccelerationHdgRateCmd& msg) {
    +      83           2 :     return std::nullopt;
    +      84             :   }
    +      85           2 :   std::optional<double> operator()([[maybe_unused]] const mrs_msgs::HwApiAccelerationHdgCmd& msg) {
    +      86           2 :     return std::nullopt;
    +      87             :   }
    +      88          10 :   std::optional<double> operator()([[maybe_unused]] const mrs_msgs::HwApiVelocityHdgRateCmd& msg) {
    +      89          10 :     return std::nullopt;
    +      90             :   }
    +      91           4 :   std::optional<double> operator()([[maybe_unused]] const mrs_msgs::HwApiVelocityHdgCmd& msg) {
    +      92           4 :     return std::nullopt;
    +      93             :   }
    +      94           2 :   std::optional<double> operator()([[maybe_unused]] const mrs_msgs::HwApiPositionCmd& msg) {
    +      95           2 :     return std::nullopt;
    +      96             :   }
    +      97             : };
    +      98             : 
    +      99             : //}
    +     100             : 
    +     101             : }  // namespace common
    +     102             : 
    +     103             : }  // namespace mrs_uav_controllers
    +     104             : 
    +     105             : #endif  // MRS_UAV_CONTROLLERS_COMMON_H
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_controllers/include/common.h.gcov.overview.html b/mrs_uav_controllers/include/common.h.gcov.overview.html new file mode 100644 index 0000000000..42538a882f --- /dev/null +++ b/mrs_uav_controllers/include/common.h.gcov.overview.html @@ -0,0 +1,47 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/include/common.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_controllers/include/common.h.gcov.png b/mrs_uav_controllers/include/common.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..042ffaa6e8f2e8a56ad432456b5e16b86c9a1a42 GIT binary patch literal 436 zcmV;l0ZaagP)#^9ia;?Oh<);&1n;{`V)#)grKCzA%7BS577Yq& z5+&x4JP}o7{Ly42B6iV-v91#DuqLc}xHa5d_Yk2#;Y9#97rdz8W<^)%tNpgB`AL_}T^7{lT~x##yVi&>&{wCSk3s5OGCw1ZkFV z%0%z|G)=E*g+Iqkd^4{jB8)X_XUth_U0K_;igU^)%HNq^#npTNew-p^-I{gioHPB7 z?x}<-bgj~XSncp{k4M(L`AF-qxc+bb*R1zZJn>jR))%aAxLyzcjgutzGk?4ydjY_) e#FpJEikcq_FD>HrpF4K|0000 + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/include + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_controllers/includeHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:575898.3 %
    Date:2024-04-18 23:11:36Functions:1414100.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    pid.hpp +
    100.0%
    +
    100.0 %33 / 33100.0 %5 / 5
    <unnamed>100.0 %33 / 33100.0 %5 / 5
    common.h +
    96.0%96.0%
    +
    96.0 %24 / 25100.0 %9 / 9
    <unnamed>96.0 %24 / 25100.0 %9 / 9
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_controllers/include/index-detail-sort-l.html b/mrs_uav_controllers/include/index-detail-sort-l.html new file mode 100644 index 0000000000..4ec967e9b9 --- /dev/null +++ b/mrs_uav_controllers/include/index-detail-sort-l.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/include + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_controllers/includeHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:575898.3 %
    Date:2024-04-18 23:11:36Functions:1414100.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    common.h +
    96.0%96.0%
    +
    96.0 %24 / 25100.0 %9 / 9
    <unnamed>96.0 %24 / 25100.0 %9 / 9
    pid.hpp +
    100.0%
    +
    100.0 %33 / 33100.0 %5 / 5
    <unnamed>100.0 %33 / 33100.0 %5 / 5
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_controllers/include/index-detail.html b/mrs_uav_controllers/include/index-detail.html new file mode 100644 index 0000000000..3f91ad0c3d --- /dev/null +++ b/mrs_uav_controllers/include/index-detail.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/include + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_controllers/includeHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:575898.3 %
    Date:2024-04-18 23:11:36Functions:1414100.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    common.h +
    96.0%96.0%
    +
    96.0 %24 / 25100.0 %9 / 9
    <unnamed>96.0 %24 / 25100.0 %9 / 9
    pid.hpp +
    100.0%
    +
    100.0 %33 / 33100.0 %5 / 5
    <unnamed>100.0 %33 / 33100.0 %5 / 5
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_controllers/include/index-sort-f.html b/mrs_uav_controllers/include/index-sort-f.html new file mode 100644 index 0000000000..da142c78db --- /dev/null +++ b/mrs_uav_controllers/include/index-sort-f.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/include + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_controllers/includeHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:575898.3 %
    Date:2024-04-18 23:11:36Functions:1414100.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    pid.hpp +
    100.0%
    +
    100.0 %33 / 33100.0 %5 / 5
    common.h +
    96.0%96.0%
    +
    96.0 %24 / 25100.0 %9 / 9
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_controllers/include/index-sort-l.html b/mrs_uav_controllers/include/index-sort-l.html new file mode 100644 index 0000000000..eac6dfbb71 --- /dev/null +++ b/mrs_uav_controllers/include/index-sort-l.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/include + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_controllers/includeHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:575898.3 %
    Date:2024-04-18 23:11:36Functions:1414100.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    common.h +
    96.0%96.0%
    +
    96.0 %24 / 25100.0 %9 / 9
    pid.hpp +
    100.0%
    +
    100.0 %33 / 33100.0 %5 / 5
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_controllers/include/index.html b/mrs_uav_controllers/include/index.html new file mode 100644 index 0000000000..4caa1068af --- /dev/null +++ b/mrs_uav_controllers/include/index.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/include + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_controllers/includeHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:575898.3 %
    Date:2024-04-18 23:11:36Functions:1414100.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    common.h +
    96.0%96.0%
    +
    96.0 %24 / 25100.0 %9 / 9
    pid.hpp +
    100.0%
    +
    100.0 %33 / 33100.0 %5 / 5
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_controllers/include/pid.hpp.func-sort-c.html b/mrs_uav_controllers/include/pid.hpp.func-sort-c.html new file mode 100644 index 0000000000..0bc515ebc1 --- /dev/null +++ b/mrs_uav_controllers/include/pid.hpp.func-sort-c.html @@ -0,0 +1,100 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/include/pid.hpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_controllers/include - pid.hpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:3333100.0 %
    Date:2024-04-18 23:11:36Functions:55100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_controllers::PIDController::reset()1092
    mrs_uav_controllers::PIDController::setParams(double const&, double const&, double const&, double const&, double const&)1092
    mrs_uav_controllers::PIDController::PIDController()1092
    mrs_uav_controllers::PIDController::setSaturation(double)13201
    mrs_uav_controllers::PIDController::update(double const&, double const&)13201
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_controllers/include/pid.hpp.func.html b/mrs_uav_controllers/include/pid.hpp.func.html new file mode 100644 index 0000000000..e3f99c271d --- /dev/null +++ b/mrs_uav_controllers/include/pid.hpp.func.html @@ -0,0 +1,100 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/include/pid.hpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_controllers/include - pid.hpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:3333100.0 %
    Date:2024-04-18 23:11:36Functions:55100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_controllers::PIDController::setSaturation(double)13201
    mrs_uav_controllers::PIDController::reset()1092
    mrs_uav_controllers::PIDController::update(double const&, double const&)13201
    mrs_uav_controllers::PIDController::setParams(double const&, double const&, double const&, double const&, double const&)1092
    mrs_uav_controllers::PIDController::PIDController()1092
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_controllers/include/pid.hpp.gcov.frameset.html b/mrs_uav_controllers/include/pid.hpp.gcov.frameset.html new file mode 100644 index 0000000000..2641a21502 --- /dev/null +++ b/mrs_uav_controllers/include/pid.hpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/include/pid.hpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_controllers/include/pid.hpp.gcov.html b/mrs_uav_controllers/include/pid.hpp.gcov.html new file mode 100644 index 0000000000..3033d6d87c --- /dev/null +++ b/mrs_uav_controllers/include/pid.hpp.gcov.html @@ -0,0 +1,184 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/include/pid.hpp + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_controllers/include - pid.hpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:3333100.0 %
    Date:2024-04-18 23:11:36Functions:55100.0 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #ifndef PID_H
    +       2             : #define PID_H
    +       3             : 
    +       4             : #include <math.h>
    +       5             : 
    +       6             : namespace mrs_uav_controllers
    +       7             : {
    +       8             : 
    +       9             : class PIDController {
    +      10             : 
    +      11             : private:
    +      12             :   // | ----------------------- parameters ----------------------- |
    +      13             : 
    +      14             :   // gains
    +      15             :   double _kp_ = 0;  // proportional gain
    +      16             :   double _kd_ = 0;  // derivative gain
    +      17             :   double _ki_ = 0;  // integral gain
    +      18             : 
    +      19             :   // we remember the last control error, to calculate the difference
    +      20             :   double last_error_ = 0;
    +      21             :   double integral_   = 0;
    +      22             : 
    +      23             :   double saturation = -1;
    +      24             :   double antiwindup = -1;
    +      25             : 
    +      26             : public:
    +      27             :   PIDController();
    +      28             : 
    +      29             :   void setParams(const double &kp, const double &kd, const double &ki, const double &saturation, const double &antiwindup);
    +      30             : 
    +      31             :   void setSaturation(const double saturation = -1);
    +      32             : 
    +      33             :   void reset(void);
    +      34             : 
    +      35             :   double update(const double &error, const double &dt);
    +      36             : };
    +      37             : 
    +      38             : // --------------------------------------------------------------
    +      39             : // |                       implementation                       |
    +      40             : // --------------------------------------------------------------
    +      41             : 
    +      42        1092 : PIDController::PIDController() {
    +      43             : 
    +      44        1092 :   this->reset();
    +      45        1092 : }
    +      46             : 
    +      47        1092 : void PIDController::setParams(const double &kp, const double &kd, const double &ki, const double &saturation, const double &antiwindup) {
    +      48             : 
    +      49        1092 :   this->_kp_       = kp;
    +      50        1092 :   this->_kd_       = kd;
    +      51        1092 :   this->_ki_       = ki;
    +      52        1092 :   this->saturation = saturation;
    +      53        1092 :   this->antiwindup = antiwindup;
    +      54        1092 : }
    +      55             : 
    +      56       13201 : void PIDController::setSaturation(const double saturation) {
    +      57             : 
    +      58       13201 :   this->saturation = saturation;
    +      59       13201 : }
    +      60             : 
    +      61        1092 : void PIDController::reset(void) {
    +      62             : 
    +      63        1092 :   this->last_error_ = 0;
    +      64        1092 :   this->integral_   = 0;
    +      65        1092 : }
    +      66             : 
    +      67       13201 : double PIDController::update(const double &error, const double &dt) {
    +      68             : 
    +      69             :   // calculate the control error difference
    +      70       13201 :   double difference = (error - last_error_) / dt;
    +      71       13201 :   last_error_       = error;
    +      72             : 
    +      73       13201 :   double p_component = _kp_ * error;       // proportional feedback
    +      74       13201 :   double d_component = _kd_ * difference;  // derivative feedback
    +      75       13201 :   double i_component = _ki_ * integral_;   // derivative feedback
    +      76             : 
    +      77       13201 :   double sum = p_component + d_component + i_component;
    +      78             : 
    +      79       13201 :   if (saturation > 0) {
    +      80       13201 :     if (sum >= saturation) {
    +      81         129 :       sum = saturation;
    +      82       13072 :     } else if (sum <= -saturation) {
    +      83         174 :       sum = -saturation;
    +      84             :     }
    +      85             :   }
    +      86             : 
    +      87       13201 :   if (antiwindup > 0) {
    +      88       13201 :     if (std::abs(sum) < antiwindup) {
    +      89             :       // add to the integral
    +      90       12591 :       integral_ += error * dt;
    +      91             :     }
    +      92             :   }
    +      93             : 
    +      94             :   // return the summ of the components
    +      95       13201 :   return sum;
    +      96             : }
    +      97             : 
    +      98             : }  // namespace mrs_uav_controllers
    +      99             : 
    +     100             : #endif  // PID_H
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_controllers/include/pid.hpp.gcov.overview.html b/mrs_uav_controllers/include/pid.hpp.gcov.overview.html new file mode 100644 index 0000000000..1e2dbca381 --- /dev/null +++ b/mrs_uav_controllers/include/pid.hpp.gcov.overview.html @@ -0,0 +1,45 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/include/pid.hpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_controllers/include/pid.hpp.gcov.png b/mrs_uav_controllers/include/pid.hpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..210752eb0f7abbe4f604ca452c63cabd54fcbebc GIT binary patch literal 519 zcmV+i0{H!jP)i;6ZDy3l1+EM97q1wFfy?;^t%ULDl)5$x zudZxs9|wgN#&S+{%-+D_U+^5KcAHUcKec%`Ff)4a1ZJuwkkpJ?V2Hm?hhj?cyI$-j z6IR|&6Z#l1hU=$#>Vf|txG3H9(th`RKN%W%c##Z|uGZuhz)xh|)X=9I-kXLt8S|8a zV%YX4lM~-WcfrHDO)|?9Z_{+J>{Z4~pHXJ@bSWS)bb#Sm1{SzJ&~<@(G5U+N_@Nr8 zXB3uUa|&Kps($zM!m literal 0 HcmV?d00001 diff --git a/mrs_uav_controllers/src/common.cpp.func-sort-c.html b/mrs_uav_controllers/src/common.cpp.func-sort-c.html new file mode 100644 index 0000000000..1ec66c04b7 --- /dev/null +++ b/mrs_uav_controllers/src/common.cpp.func-sort-c.html @@ -0,0 +1,116 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/src/common.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_controllers/src - common.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:13415984.3 %
    Date:2024-04-18 23:11:36Functions:99100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_controllers::common::extractThrottle(mrs_uav_managers::Controller::ControlOutput const&)221
    mrs_uav_controllers::common::actuatorMixer(mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> > const&, Eigen::Matrix<double, -1, -1, 0, -1, -1> const&)3810
    mrs_uav_controllers::common::attitudeRateController(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> > const&, Eigen::Matrix<double, 3, 1, 0, 3, 1> const&)7636
    mrs_uav_controllers::common::getHighestOuput(mrs_uav_managers::control_manager::ControlOutputModalities_t const&)9990
    mrs_uav_controllers::common::so3transform(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, bool const&)77791
    mrs_uav_controllers::common::sanitizeDesiredForce(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, double const&, double const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)77791
    mrs_uav_controllers::common::orientationError(Eigen::Matrix<double, 3, 3, 0, 3, 3> const&, Eigen::Matrix<double, 3, 3, 0, 3, 3> const&)79757
    mrs_uav_controllers::common::attitudeController(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> > const&, Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, bool const&)79757
    mrs_uav_controllers::common::getLowestOuput(mrs_uav_managers::control_manager::ControlOutputModalities_t const&)83672
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_controllers/src/common.cpp.func.html b/mrs_uav_controllers/src/common.cpp.func.html new file mode 100644 index 0000000000..7e2c2c36b5 --- /dev/null +++ b/mrs_uav_controllers/src/common.cpp.func.html @@ -0,0 +1,116 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/src/common.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_controllers/src - common.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:13415984.3 %
    Date:2024-04-18 23:11:36Functions:99100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_controllers::common::so3transform(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, bool const&)77791
    mrs_uav_controllers::common::actuatorMixer(mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> > const&, Eigen::Matrix<double, -1, -1, 0, -1, -1> const&)3810
    mrs_uav_controllers::common::getLowestOuput(mrs_uav_managers::control_manager::ControlOutputModalities_t const&)83672
    mrs_uav_controllers::common::extractThrottle(mrs_uav_managers::Controller::ControlOutput const&)221
    mrs_uav_controllers::common::getHighestOuput(mrs_uav_managers::control_manager::ControlOutputModalities_t const&)9990
    mrs_uav_controllers::common::orientationError(Eigen::Matrix<double, 3, 3, 0, 3, 3> const&, Eigen::Matrix<double, 3, 3, 0, 3, 3> const&)79757
    mrs_uav_controllers::common::attitudeController(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> > const&, Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, bool const&)79757
    mrs_uav_controllers::common::sanitizeDesiredForce(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, double const&, double const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)77791
    mrs_uav_controllers::common::attitudeRateController(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> > const&, Eigen::Matrix<double, 3, 1, 0, 3, 1> const&)7636
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_controllers/src/common.cpp.gcov.frameset.html b/mrs_uav_controllers/src/common.cpp.gcov.frameset.html new file mode 100644 index 0000000000..f24fe27b38 --- /dev/null +++ b/mrs_uav_controllers/src/common.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/src/common.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_controllers/src/common.cpp.gcov.html b/mrs_uav_controllers/src/common.cpp.gcov.html new file mode 100644 index 0000000000..045ae0daf5 --- /dev/null +++ b/mrs_uav_controllers/src/common.cpp.gcov.html @@ -0,0 +1,471 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/src/common.cpp + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_controllers/src - common.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:13415984.3 %
    Date:2024-04-18 23:11:36Functions:99100.0 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #include <common.h>
    +       2             : 
    +       3             : namespace mrs_uav_controllers
    +       4             : {
    +       5             : 
    +       6             : namespace common
    +       7             : {
    +       8             : 
    +       9             : /* orientationError() //{ */
    +      10             : 
    +      11       79757 : Eigen::Vector3d orientationError(const Eigen::Matrix3d& R, const Eigen::Matrix3d& Rd) {
    +      12             : 
    +      13             :   // orientation error
    +      14       79757 :   Eigen::Matrix3d R_error = 0.5 * (Rd.transpose() * R - R.transpose() * Rd);
    +      15             : 
    +      16             :   // vectorize the orientation error
    +      17             :   // clang-format off
    +      18       79757 :     Eigen::Vector3d R_error_vec;
    +      19       79757 :     R_error_vec << (R_error(1, 2) - R_error(2, 1)) / 2.0,
    +      20       79757 :                    (R_error(2, 0) - R_error(0, 2)) / 2.0,
    +      21       79757 :                    (R_error(0, 1) - R_error(1, 0)) / 2.0;
    +      22             :   // clang-format on
    +      23             : 
    +      24      159514 :   return R_error_vec;
    +      25             : }
    +      26             : 
    +      27             : //}
    +      28             : 
    +      29             : /* sanitizeDesiredForce() //{ */
    +      30             : 
    +      31       77791 : std::optional<Eigen::Vector3d> sanitizeDesiredForce(const Eigen::Vector3d& input, const double& tilt_safety_limit, const double& tilt_saturation,
    +      32             :                                                     const std::string& node_name) {
    +      33             : 
    +      34             :   // calculate the force in spherical coordinates
    +      35       77791 :   double theta = acos(input[2]);
    +      36       77791 :   double phi   = atan2(input[1], input[0]);
    +      37             : 
    +      38             :   // check for the failsafe limit
    +      39       77791 :   if (!std::isfinite(theta)) {
    +      40           0 :     ROS_ERROR("[%s]: sanitizeDesiredForce(): NaN detected in variable 'theta', returning empty command", node_name.c_str());
    +      41           0 :     return {};
    +      42             :   }
    +      43             : 
    +      44       77791 :   if (tilt_safety_limit > 1e-3 && std::abs(theta) > tilt_safety_limit) {
    +      45             : 
    +      46           0 :     ROS_ERROR("[%s]: the produced tilt angle (%.2f deg) would be over the failsafe limit (%.2f deg), returning null", node_name.c_str(), (180.0 / M_PI) * theta,
    +      47             :               (180.0 / M_PI) * tilt_safety_limit);
    +      48           0 :     ROS_ERROR_STREAM("[" << node_name << "]: f = [" << input.transpose() << "]");
    +      49             : 
    +      50           0 :     return {};
    +      51             :   }
    +      52             : 
    +      53             :   // saturate the angle
    +      54             : 
    +      55       77791 :   if (tilt_saturation > 1e-3 && std::abs(theta) > tilt_saturation) {
    +      56           0 :     ROS_WARN_THROTTLE(1.0, "[%s]: tilt is being saturated, desired: %.2f deg, saturated %.2f deg", node_name.c_str(), (theta / M_PI) * 180.0,
    +      57             :                       (tilt_saturation / M_PI) * 180.0);
    +      58           0 :     theta = tilt_saturation;
    +      59             :   }
    +      60             : 
    +      61             :   // reconstruct the force vector back out of the spherical coordinates
    +      62       77791 :   Eigen::Vector3d output(sin(theta) * cos(phi), sin(theta) * sin(phi), cos(theta));
    +      63             : 
    +      64       77791 :   return {output};
    +      65             : }
    +      66             : 
    +      67             : //}
    +      68             : 
    +      69             : /* so3transform() //{ */
    +      70             : 
    +      71       77791 : Eigen::Matrix3d so3transform(const Eigen::Vector3d& body_z, const ::Eigen::Vector3d& heading, const bool& preserve_heading) {
    +      72             : 
    +      73       77791 :   Eigen::Vector3d body_z_normed = body_z.normalized();
    +      74             : 
    +      75       77791 :   Eigen::Matrix3d Rd;
    +      76             : 
    +      77       77791 :   if (preserve_heading) {
    +      78             : 
    +      79       23225 :     ROS_DEBUG_THROTTLE(1.0, "[SO3Transform]: using Baca's method");
    +      80             : 
    +      81             :     // | ------------------------- body z ------------------------- |
    +      82       23225 :     Rd.col(2) = body_z_normed;
    +      83             : 
    +      84             :     // | ------------------------- body x ------------------------- |
    +      85             : 
    +      86             :     // construct the oblique projection
    +      87       23225 :     Eigen::Matrix3d projector_body_z_compl = (Eigen::Matrix3d::Identity(3, 3) - body_z_normed * body_z_normed.transpose());
    +      88             : 
    +      89             :     // create a basis of the body-z complement subspace
    +      90       46450 :     Eigen::MatrixXd A = Eigen::MatrixXd(3, 2);
    +      91       23225 :     A.col(0)          = projector_body_z_compl.col(0);
    +      92       23225 :     A.col(1)          = projector_body_z_compl.col(1);
    +      93             : 
    +      94             :     // create the basis of the projection null-space complement
    +      95       46450 :     Eigen::MatrixXd B = Eigen::MatrixXd(3, 2);
    +      96       23225 :     B.col(0)          = Eigen::Vector3d(1, 0, 0);
    +      97       23225 :     B.col(1)          = Eigen::Vector3d(0, 1, 0);
    +      98             : 
    +      99             :     // oblique projector to <range_basis>
    +     100       46450 :     Eigen::MatrixXd Bt_A               = B.transpose() * A;
    +     101       46450 :     Eigen::MatrixXd Bt_A_pseudoinverse = ((Bt_A.transpose() * Bt_A).inverse()) * Bt_A.transpose();
    +     102       23225 :     Eigen::MatrixXd oblique_projector  = A * Bt_A_pseudoinverse * B.transpose();
    +     103             : 
    +     104       23225 :     Rd.col(0) = oblique_projector * heading;
    +     105       23225 :     Rd.col(0).normalize();
    +     106             : 
    +     107             :     // | ------------------------- body y ------------------------- |
    +     108             : 
    +     109       23225 :     Rd.col(1) = Rd.col(2).cross(Rd.col(0));
    +     110       23225 :     Rd.col(1).normalize();
    +     111             : 
    +     112             :   } else {
    +     113             : 
    +     114       54566 :     ROS_DEBUG_THROTTLE(1.0, "[SO3Transform]: using Lee's method");
    +     115             : 
    +     116       54566 :     Rd.col(2) = body_z_normed;
    +     117       54566 :     Rd.col(1) = Rd.col(2).cross(heading);
    +     118       54566 :     Rd.col(1).normalize();
    +     119       54566 :     Rd.col(0) = Rd.col(1).cross(Rd.col(2));
    +     120       54566 :     Rd.col(0).normalize();
    +     121             :   }
    +     122             : 
    +     123      155582 :   return Rd;
    +     124             : }
    +     125             : 
    +     126             : //}
    +     127             : 
    +     128             : /* getLowestOutput() //{ */
    +     129             : 
    +     130       83672 : std::optional<CONTROL_OUTPUT> getLowestOuput(const mrs_uav_managers::control_manager::ControlOutputModalities_t& outputs) {
    +     131             : 
    +     132       83672 :   if (outputs.actuators) {
    +     133        2417 :     return ACTUATORS_CMD;
    +     134             :   }
    +     135             : 
    +     136       81255 :   if (outputs.control_group) {
    +     137        2433 :     return CONTROL_GROUP;
    +     138             :   }
    +     139             : 
    +     140       78822 :   if (outputs.attitude_rate) {
    +     141       70728 :     return ATTITUDE_RATE;
    +     142             :   }
    +     143             : 
    +     144        8094 :   if (outputs.attitude) {
    +     145        2213 :     return ATTITUDE;
    +     146             :   }
    +     147             : 
    +     148        5881 :   if (outputs.acceleration_hdg_rate) {
    +     149        1022 :     return ACCELERATION_HDG_RATE;
    +     150             :   }
    +     151             : 
    +     152        4859 :   if (outputs.acceleration_hdg) {
    +     153        1041 :     return ACCELERATION_HDG;
    +     154             :   }
    +     155             : 
    +     156        3818 :   if (outputs.velocity_hdg_rate) {
    +     157        2231 :     return VELOCITY_HDG_RATE;
    +     158             :   }
    +     159             : 
    +     160        1587 :   if (outputs.velocity_hdg) {
    +     161        1085 :     return VELOCITY_HDG;
    +     162             :   }
    +     163             : 
    +     164         502 :   if (outputs.position) {
    +     165         502 :     return POSITION;
    +     166             :   }
    +     167             : 
    +     168           0 :   return {};
    +     169             : }
    +     170             : 
    +     171             : //}
    +     172             : 
    +     173             : /* getHighestOutput() //{ */
    +     174             : 
    +     175        9990 : std::optional<CONTROL_OUTPUT> getHighestOuput(const mrs_uav_managers::control_manager::ControlOutputModalities_t& outputs) {
    +     176             : 
    +     177        9990 :   if (outputs.position) {
    +     178           3 :     return POSITION;
    +     179             :   }
    +     180             : 
    +     181        9987 :   if (outputs.velocity_hdg) {
    +     182           5 :     return VELOCITY_HDG;
    +     183             :   }
    +     184             : 
    +     185        9982 :   if (outputs.velocity_hdg_rate) {
    +     186           9 :     return VELOCITY_HDG_RATE;
    +     187             :   }
    +     188             : 
    +     189        9973 :   if (outputs.acceleration_hdg) {
    +     190           5 :     return ACCELERATION_HDG;
    +     191             :   }
    +     192             : 
    +     193        9968 :   if (outputs.acceleration_hdg_rate) {
    +     194           4 :     return ACCELERATION_HDG_RATE;
    +     195             :   }
    +     196             : 
    +     197        9964 :   if (outputs.attitude) {
    +     198        5723 :     return ATTITUDE;
    +     199             :   }
    +     200             : 
    +     201        4241 :   if (outputs.attitude_rate) {
    +     202        1421 :     return ATTITUDE_RATE;
    +     203             :   }
    +     204             : 
    +     205        2820 :   if (outputs.control_group) {
    +     206        1411 :     return CONTROL_GROUP;
    +     207             :   }
    +     208             : 
    +     209        1409 :   if (outputs.actuators) {
    +     210        1409 :     return ACTUATORS_CMD;
    +     211             :   }
    +     212             : 
    +     213           0 :   return {};
    +     214             : }
    +     215             : 
    +     216             : //}
    +     217             : 
    +     218             : /* extractThrottle() //{ */
    +     219             : 
    +     220         221 : std::optional<double> extractThrottle(const mrs_uav_managers::Controller::ControlOutput& control_output) {
    +     221             : 
    +     222         221 :   if (!control_output.control_output) {
    +     223         122 :     return {};
    +     224             :   }
    +     225             : 
    +     226         198 :   return std::visit(HwApiCmdExtractThrottleVisitor(), control_output.control_output.value());
    +     227             : }
    +     228             : 
    +     229             : //}
    +     230             : 
    +     231             : /* attitudeController() //{ */
    +     232             : 
    +     233       79757 : std::optional<mrs_msgs::HwApiAttitudeRateCmd> attitudeController(const mrs_msgs::UavState& uav_state, const mrs_msgs::HwApiAttitudeCmd& reference,
    +     234             :                                                                  const Eigen::Vector3d& ff_rate, const Eigen::Vector3d& rate_saturation,
    +     235             :                                                                  const Eigen::Vector3d& gains, const bool& parasitic_heading_rate_compensation) {
    +     236             : 
    +     237       79757 :   Eigen::Matrix3d R  = mrs_lib::AttitudeConverter(uav_state.pose.orientation);
    +     238       79757 :   Eigen::Matrix3d Rd = mrs_lib::AttitudeConverter(reference.orientation);
    +     239             : 
    +     240             :   // calculate the orientation error
    +     241       79757 :   Eigen::Vector3d E = common::orientationError(R, Rd);
    +     242             : 
    +     243       79757 :   Eigen::Vector3d rate_feedback = gains.array() * E.array() + ff_rate.array();
    +     244             : 
    +     245             :   // | ----------- parasitic heading rate compensation ---------- |
    +     246             : 
    +     247       79757 :   if (parasitic_heading_rate_compensation) {
    +     248             : 
    +     249       22095 :     ROS_DEBUG_THROTTLE(1.0, "[AttitudeController]: parasitic heading rate compensation enabled");
    +     250             : 
    +     251             :     // compensate for the parasitic heading rate created by the desired pitch and roll rate
    +     252       22095 :     Eigen::Vector3d rp_heading_rate_compensation(0, 0, 0);
    +     253             : 
    +     254       22095 :     Eigen::Vector3d q_feedback_yawless = rate_feedback;
    +     255       22095 :     q_feedback_yawless(2)              = 0;  // nullyfy the effect of the original yaw feedback
    +     256             : 
    +     257       22095 :     double parasitic_heading_rate = 0;
    +     258             : 
    +     259             :     try {
    +     260       22095 :       parasitic_heading_rate = mrs_lib::AttitudeConverter(uav_state.pose.orientation).getHeadingRate(q_feedback_yawless);
    +     261             :     }
    +     262           0 :     catch (...) {
    +     263           0 :       ROS_ERROR("[AttitudeController]: exception caught while calculating the parasitic heading rate!");
    +     264             :     }
    +     265             : 
    +     266             :     try {
    +     267       22095 :       rp_heading_rate_compensation(2) = mrs_lib::AttitudeConverter(uav_state.pose.orientation).getYawRateIntrinsic(-parasitic_heading_rate);
    +     268             :     }
    +     269           0 :     catch (...) {
    +     270           0 :       ROS_ERROR("[AttitudeController]: exception caught while calculating the parasitic heading rate compensation!");
    +     271             :     }
    +     272             : 
    +     273       22095 :     rate_feedback += rp_heading_rate_compensation;
    +     274             :   }
    +     275             : 
    +     276             :   // | --------------- saturate the attitude rate --------------- |
    +     277             : 
    +     278       79757 :   if (rate_feedback[0] > rate_saturation[0]) {
    +     279           0 :     rate_feedback[0] = rate_saturation[0];
    +     280       79757 :   } else if (rate_feedback[0] < -rate_saturation[0]) {
    +     281           0 :     rate_feedback[0] = -rate_saturation[0];
    +     282             :   }
    +     283             : 
    +     284       79757 :   if (rate_feedback[1] > rate_saturation[1]) {
    +     285           0 :     rate_feedback[1] = rate_saturation[1];
    +     286       79757 :   } else if (rate_feedback[1] < -rate_saturation[1]) {
    +     287           0 :     rate_feedback[1] = -rate_saturation[1];
    +     288             :   }
    +     289             : 
    +     290       79757 :   if (rate_feedback[2] > rate_saturation[2]) {
    +     291           0 :     rate_feedback[2] = rate_saturation[2];
    +     292       79757 :   } else if (rate_feedback[2] < -rate_saturation[2]) {
    +     293           0 :     rate_feedback[2] = -rate_saturation[2];
    +     294             :   }
    +     295             : 
    +     296             :   // | ------------ fill in the attitude rate command ----------- |
    +     297             : 
    +     298       79757 :   mrs_msgs::HwApiAttitudeRateCmd cmd;
    +     299             : 
    +     300       79757 :   cmd.stamp = ros::Time::now();
    +     301             : 
    +     302       79757 :   cmd.body_rate.x = rate_feedback[0];
    +     303       79757 :   cmd.body_rate.y = rate_feedback[1];
    +     304       79757 :   cmd.body_rate.z = rate_feedback[2];
    +     305             : 
    +     306       79757 :   cmd.throttle = reference.throttle;
    +     307             : 
    +     308      159514 :   return cmd;
    +     309             : }
    +     310             : 
    +     311             : //}
    +     312             : 
    +     313             : /* attitudeRateController() //{ */
    +     314             : 
    +     315        7636 : std::optional<mrs_msgs::HwApiControlGroupCmd> attitudeRateController(const mrs_msgs::UavState& uav_state, const mrs_msgs::HwApiAttitudeRateCmd& reference,
    +     316             :                                                                      const Eigen::Vector3d& gains) {
    +     317             : 
    +     318        7636 :   Eigen::Vector3d des_rate(reference.body_rate.x, reference.body_rate.y, reference.body_rate.z);
    +     319        7636 :   Eigen::Vector3d cur_rate(uav_state.velocity.angular.x, uav_state.velocity.angular.y, uav_state.velocity.angular.z);
    +     320             : 
    +     321        7636 :   Eigen::Vector3d ctrl_group_action = (des_rate - cur_rate).array() * gains.array();
    +     322             : 
    +     323        7636 :   mrs_msgs::HwApiControlGroupCmd cmd;
    +     324             : 
    +     325        7636 :   cmd.stamp = ros::Time::now();
    +     326             : 
    +     327        7636 :   cmd.throttle = reference.throttle;
    +     328             : 
    +     329        7636 :   cmd.roll  = ctrl_group_action[0];
    +     330        7636 :   cmd.pitch = ctrl_group_action[1];
    +     331        7636 :   cmd.yaw   = ctrl_group_action[2];
    +     332             : 
    +     333       15272 :   return {cmd};
    +     334             : }
    +     335             : 
    +     336             : //}
    +     337             : 
    +     338             : /* actuatorMixer() //{ */
    +     339             : 
    +     340        3810 : mrs_msgs::HwApiActuatorCmd actuatorMixer(const mrs_msgs::HwApiControlGroupCmd& ctrl_group_cmd, const Eigen::MatrixXd& mixer) {
    +     341             : 
    +     342        3810 :   Eigen::Vector4d ctrl_group(ctrl_group_cmd.roll, ctrl_group_cmd.pitch, ctrl_group_cmd.yaw, ctrl_group_cmd.throttle);
    +     343             : 
    +     344        7620 :   Eigen::VectorXd motors = mixer * ctrl_group;
    +     345             : 
    +     346        3810 :   double min = motors.minCoeff();
    +     347             : 
    +     348        3810 :   if (min < 0.0) {
    +     349           0 :     motors.array() += abs(min);
    +     350             :   }
    +     351             : 
    +     352        3810 :   double max = motors.maxCoeff();
    +     353             : 
    +     354        3810 :   if (max > 1.0) {
    +     355             : 
    +     356           0 :     if (ctrl_group_cmd.throttle > 1e-2) {
    +     357             : 
    +     358             :       // scale down roll/pitch/yaw actions to maintain desired throttle
    +     359           0 :       for (int i = 0; i < 3; i++) {
    +     360           0 :         ctrl_group(i) = ctrl_group(i) / (motors.mean() / ctrl_group_cmd.throttle);
    +     361             :       }
    +     362             : 
    +     363           0 :       motors = mixer * ctrl_group;
    +     364             : 
    +     365             :     } else {
    +     366           0 :       motors /= max;
    +     367             :     }
    +     368             :   }
    +     369             : 
    +     370             :   // | --------------------- fill in the msg -------------------- |
    +     371             : 
    +     372        3810 :   mrs_msgs::HwApiActuatorCmd actuator_msg;
    +     373             : 
    +     374        3810 :   actuator_msg.stamp = ros::Time::now();
    +     375             : 
    +     376       19050 :   for (int i = 0; i < motors.size(); i++) {
    +     377       15240 :     actuator_msg.motors.push_back(motors[i]);
    +     378             :   }
    +     379             : 
    +     380        7620 :   return actuator_msg;
    +     381             : }
    +     382             : 
    +     383             : //}
    +     384             : 
    +     385             : }  // namespace common
    +     386             : 
    +     387             : }  // namespace mrs_uav_controllers
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_controllers/src/common.cpp.gcov.overview.html b/mrs_uav_controllers/src/common.cpp.gcov.overview.html new file mode 100644 index 0000000000..dd0d0db077 --- /dev/null +++ b/mrs_uav_controllers/src/common.cpp.gcov.overview.html @@ -0,0 +1,117 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/src/common.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_controllers/src/common.cpp.gcov.png b/mrs_uav_controllers/src/common.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..ae7a39fe11d1881d88a0dc8901f5aabbb7614895 GIT binary patch literal 1368 zcmV-e1*iInP)oiq$s z=NH2Am0;OgEB5CBD62zU z{0~B*^^;g{Gnu2ZEX$e<>)sE0Gw^o&IfD=AUo8*QLFz)L2chU0?~CiP#6q@!xE%yCid_+&Kx1$X`Ja*nN?~tAa88? zKxc45lH{g&hp4A`P%0=Wl0@2v;*`|P257*h)lzi5P09)vF~-ogLHF{kqn$e_BWA63 zT|ZzqrfK_Pm;^p)TdPy%vB_^ddlL%xod}6F9ZySpBI5RJbHNG^7bEJFc_eM9K18AS zlz}qTG>9r?&@oJ7mQ9@k|2en>0O4Qr9>_{2d{;rV02Nei0?e0~vk3mHFkQt?X%&Hgh@e!z5aZl>AF1HmZ-6fatSs6np!&6Xc} zl~Ps9t}XOBAwsy zCno%9ht(gGkktU1U^rzS?3-V2o}jedXND`JIX(+@LWrcETCVa3s@*(hGUJ zX|OEox?KlhI$&d+#G`*{E$i=nh&oZ;h0p!H6po_8Ji=3m$a-zvr$E-y`SleyI!TE% z;=y6EuKZ?Y&u=@QDHT#Az85o-%Zvb!mS>^5S1}ZeGfWz|cBi6E@eaeVNp}VNQ$$a# a + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/src/failsafe_controller.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_controllers/src - failsafe_controller.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:13119467.5 %
    Date:2024-04-18 23:11:36Functions:91181.8 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_controllers::failsafe_controller::FailsafeController::switchOdometrySource(mrs_msgs::UavState_<std::allocator<void> > const&)0
    mrs_uav_controllers::failsafe_controller::FailsafeController::resetDisturbanceEstimators()0
    mrs_uav_controllers::failsafe_controller::FailsafeController::getHeadingSafely(geometry_msgs::Quaternion_<std::allocator<void> > const&)7
    mrs_uav_controllers::failsafe_controller::FailsafeController::activate(mrs_uav_managers::Controller::ControlOutput const&)7
    mrs_uav_controllers::failsafe_controller::FailsafeController::deactivate()34
    (anonymous namespace)::ProxyExec0::ProxyExec0()91
    mrs_uav_controllers::failsafe_controller::FailsafeController::initialize(ros::NodeHandle const&, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t>, std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t>)91
    mrs_uav_controllers::failsafe_controller::FailsafeController::setConstraints(boost::shared_ptr<mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> > const> const&)360
    mrs_uav_controllers::failsafe_controller::FailsafeController::getStatus()969
    mrs_uav_controllers::failsafe_controller::FailsafeController::updateActive(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_msgs::TrackerCommand_<std::allocator<void> > const&)9713
    mrs_uav_controllers::failsafe_controller::FailsafeController::updateInactive(mrs_msgs::UavState_<std::allocator<void> > const&, std::optional<mrs_msgs::TrackerCommand_<std::allocator<void> > > const&)120312
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_controllers/src/failsafe_controller.cpp.func.html b/mrs_uav_controllers/src/failsafe_controller.cpp.func.html new file mode 100644 index 0000000000..23cd8b9f08 --- /dev/null +++ b/mrs_uav_controllers/src/failsafe_controller.cpp.func.html @@ -0,0 +1,124 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/src/failsafe_controller.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_controllers/src - failsafe_controller.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:13119467.5 %
    Date:2024-04-18 23:11:36Functions:91181.8 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    (anonymous namespace)::ProxyExec0::ProxyExec0()91
    mrs_uav_controllers::failsafe_controller::FailsafeController::deactivate()34
    mrs_uav_controllers::failsafe_controller::FailsafeController::initialize(ros::NodeHandle const&, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t>, std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t>)91
    mrs_uav_controllers::failsafe_controller::FailsafeController::updateActive(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_msgs::TrackerCommand_<std::allocator<void> > const&)9713
    mrs_uav_controllers::failsafe_controller::FailsafeController::setConstraints(boost::shared_ptr<mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> > const> const&)360
    mrs_uav_controllers::failsafe_controller::FailsafeController::updateInactive(mrs_msgs::UavState_<std::allocator<void> > const&, std::optional<mrs_msgs::TrackerCommand_<std::allocator<void> > > const&)120312
    mrs_uav_controllers::failsafe_controller::FailsafeController::getHeadingSafely(geometry_msgs::Quaternion_<std::allocator<void> > const&)7
    mrs_uav_controllers::failsafe_controller::FailsafeController::switchOdometrySource(mrs_msgs::UavState_<std::allocator<void> > const&)0
    mrs_uav_controllers::failsafe_controller::FailsafeController::resetDisturbanceEstimators()0
    mrs_uav_controllers::failsafe_controller::FailsafeController::activate(mrs_uav_managers::Controller::ControlOutput const&)7
    mrs_uav_controllers::failsafe_controller::FailsafeController::getStatus()969
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_controllers/src/failsafe_controller.cpp.gcov.frameset.html b/mrs_uav_controllers/src/failsafe_controller.cpp.gcov.frameset.html new file mode 100644 index 0000000000..482a0a3bc5 --- /dev/null +++ b/mrs_uav_controllers/src/failsafe_controller.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/src/failsafe_controller.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_controllers/src/failsafe_controller.cpp.gcov.html b/mrs_uav_controllers/src/failsafe_controller.cpp.gcov.html new file mode 100644 index 0000000000..f6d510cde5 --- /dev/null +++ b/mrs_uav_controllers/src/failsafe_controller.cpp.gcov.html @@ -0,0 +1,635 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/src/failsafe_controller.cpp + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_controllers/src - failsafe_controller.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:13119467.5 %
    Date:2024-04-18 23:11:36Functions:91181.8 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : /* includes //{ */
    +       2             : 
    +       3             : #include <ros/ros.h>
    +       4             : #include <ros/package.h>
    +       5             : 
    +       6             : #include <common.h>
    +       7             : 
    +       8             : #include <mrs_uav_managers/controller.h>
    +       9             : 
    +      10             : #include <mrs_lib/profiler.h>
    +      11             : #include <mrs_lib/attitude_converter.h>
    +      12             : #include <mrs_lib/mutex.h>
    +      13             : #include <mrs_lib/subscribe_handler.h>
    +      14             : 
    +      15             : //}
    +      16             : 
    +      17             : namespace mrs_uav_controllers
    +      18             : {
    +      19             : 
    +      20             : namespace failsafe_controller
    +      21             : {
    +      22             : 
    +      23             : /* class FailsafeController //{ */
    +      24             : 
    +      25             : class FailsafeController : public mrs_uav_managers::Controller {
    +      26             : 
    +      27             : public:
    +      28             :   bool initialize(const ros::NodeHandle &nh, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t> common_handlers,
    +      29             :                   std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t> private_handlers);
    +      30             : 
    +      31             :   bool activate(const ControlOutput &last_control_output);
    +      32             :   void deactivate(void);
    +      33             : 
    +      34             :   void updateInactive(const mrs_msgs::UavState &uav_state, const std::optional<mrs_msgs::TrackerCommand> &tracker_command);
    +      35             : 
    +      36             :   ControlOutput updateActive(const mrs_msgs::UavState &uav_state, const mrs_msgs::TrackerCommand &tracker_command);
    +      37             : 
    +      38             :   const mrs_msgs::ControllerStatus getStatus();
    +      39             : 
    +      40             :   void switchOdometrySource(const mrs_msgs::UavState &new_uav_state);
    +      41             : 
    +      42             :   void resetDisturbanceEstimators(void);
    +      43             : 
    +      44             :   const mrs_msgs::DynamicsConstraintsSrvResponse::ConstPtr setConstraints(const mrs_msgs::DynamicsConstraintsSrvRequest::ConstPtr &cmd);
    +      45             : 
    +      46             :   double getHeadingSafely(const geometry_msgs::Quaternion &quaternion);
    +      47             : 
    +      48             : private:
    +      49             :   ros::NodeHandle nh_;
    +      50             : 
    +      51             :   bool is_initialized_ = false;
    +      52             :   bool is_active_      = false;
    +      53             : 
    +      54             :   std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t>  common_handlers_;
    +      55             :   std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t> private_handlers_;
    +      56             : 
    +      57             :   // | ----------------------- parameters ----------------------- |
    +      58             : 
    +      59             :   double _descend_speed_;
    +      60             :   double _descend_acceleration_;
    +      61             : 
    +      62             :   double _kq_;
    +      63             :   double _kw_;
    +      64             : 
    +      65             :   // | ------------------- remember uav state ------------------- |
    +      66             : 
    +      67             :   mrs_msgs::UavState uav_state_;
    +      68             :   std::mutex         mutex_uav_state_;
    +      69             : 
    +      70             :   // | --------------------- throttle control --------------------- |
    +      71             : 
    +      72             :   double _uav_mass_;
    +      73             :   double uav_mass_difference_;
    +      74             : 
    +      75             :   double hover_throttle_;
    +      76             : 
    +      77             :   double _throttle_decrease_rate_;
    +      78             :   double _initial_throttle_percentage_;
    +      79             : 
    +      80             :   // | ----------------------- yaw control ---------------------- |
    +      81             : 
    +      82             :   double heading_setpoint_;
    +      83             : 
    +      84             :   mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped> sh_hw_api_orientation_;
    +      85             : 
    +      86             :   // | ------------------ activation and output ----------------- |
    +      87             : 
    +      88             :   ControlOutput last_control_output_;
    +      89             :   ControlOutput activation_control_output_;
    +      90             : 
    +      91             :   ros::Time         last_update_time_;
    +      92             :   std::atomic<bool> first_iteration_ = true;
    +      93             : 
    +      94             :   // | ------------------------ profiler ------------------------ |
    +      95             : 
    +      96             :   mrs_lib::Profiler profiler_;
    +      97             :   bool              _profiler_enabled_ = false;
    +      98             : 
    +      99             :   // | ----------------------- constraints ---------------------- |
    +     100             : 
    +     101             :   mrs_msgs::DynamicsConstraints constraints_;
    +     102             :   std::mutex                    mutex_constraints_;
    +     103             : };
    +     104             : 
    +     105             : //}
    +     106             : 
    +     107             : // --------------------------------------------------------------
    +     108             : // |                   controller's interface                   |
    +     109             : // --------------------------------------------------------------
    +     110             : 
    +     111             : /* initialize() //{ */
    +     112             : 
    +     113          91 : bool FailsafeController::initialize(const ros::NodeHandle &nh, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t> common_handlers,
    +     114             :                                     std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t> private_handlers) {
    +     115             : 
    +     116          91 :   nh_ = nh;
    +     117             : 
    +     118          91 :   common_handlers_  = common_handlers;
    +     119          91 :   private_handlers_ = private_handlers;
    +     120             : 
    +     121          91 :   _uav_mass_ = common_handlers->getMass();
    +     122             : 
    +     123          91 :   ros::Time::waitForValid();
    +     124             : 
    +     125             :   // | ---------- loading params using the parent's nh ---------- |
    +     126             : 
    +     127         182 :   mrs_lib::ParamLoader param_loader_parent(common_handlers->parent_nh, "ControlManager");
    +     128             : 
    +     129          91 :   param_loader_parent.loadParam("enable_profiler", _profiler_enabled_);
    +     130             : 
    +     131          91 :   if (!param_loader_parent.loadedSuccessfully()) {
    +     132           0 :     ROS_ERROR("[FailsafeController]: Could not load all parameters!");
    +     133           0 :     return false;
    +     134             :   }
    +     135             : 
    +     136             :   // | -------------------- loading my params ------------------- |
    +     137             : 
    +     138          91 :   private_handlers->param_loader->addYamlFile(ros::package::getPath("mrs_uav_controllers") + "/config/private/failsafe_controller.yaml");
    +     139          91 :   private_handlers->param_loader->addYamlFile(ros::package::getPath("mrs_uav_controllers") + "/config/public/failsafe_controller.yaml");
    +     140             : 
    +     141         182 :   const std::string yaml_namespace = "mrs_uav_controllers/failsafe_controller/";
    +     142             : 
    +     143          91 :   private_handlers->param_loader->loadParam(yaml_namespace + "throttle_output/throttle_decrease_rate", _throttle_decrease_rate_);
    +     144          91 :   private_handlers->param_loader->loadParam(yaml_namespace + "throttle_output/initial_throttle_percentage", _initial_throttle_percentage_);
    +     145             : 
    +     146          91 :   private_handlers->param_loader->loadParam(yaml_namespace + "attitude_controller/gains/kp", _kq_);
    +     147             : 
    +     148          91 :   private_handlers->param_loader->loadParam(yaml_namespace + "rate_controller/gains/kp", _kw_);
    +     149             : 
    +     150          91 :   private_handlers->param_loader->loadParam(yaml_namespace + "velocity_output/descend_speed", _descend_speed_);
    +     151          91 :   private_handlers->param_loader->loadParam(yaml_namespace + "acceleration_output/descend_acceleration", _descend_acceleration_);
    +     152             : 
    +     153          91 :   if (!private_handlers->param_loader->loadedSuccessfully()) {
    +     154           0 :     ROS_ERROR("[FailsafeController]: Could not load all parameters!");
    +     155           0 :     return false;
    +     156             :   }
    +     157             : 
    +     158          91 :   _descend_speed_        = std::abs(_descend_speed_);
    +     159          91 :   _descend_acceleration_ = std::abs(_descend_acceleration_);
    +     160             : 
    +     161          91 :   uav_mass_difference_ = 0;
    +     162             : 
    +     163             :   // | ----------------------- subscribers ---------------------- |
    +     164             : 
    +     165          91 :   mrs_lib::SubscribeHandlerOptions shopts;
    +     166          91 :   shopts.nh                 = nh_;
    +     167          91 :   shopts.node_name          = "FailsafeController";
    +     168          91 :   shopts.no_message_timeout = mrs_lib::no_timeout;
    +     169          91 :   shopts.threadsafe         = true;
    +     170          91 :   shopts.autostart          = true;
    +     171          91 :   shopts.queue_size         = 10;
    +     172          91 :   shopts.transport_hints    = ros::TransportHints().tcpNoDelay();
    +     173             : 
    +     174          91 :   sh_hw_api_orientation_ = mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped>(shopts, "/" + common_handlers->uav_name + "/" + "hw_api/orientation");
    +     175             : 
    +     176             :   // | ----------- calculate the default hover throttle ----------- |
    +     177             : 
    +     178          91 :   hover_throttle_ = mrs_lib::quadratic_throttle_model::forceToThrottle(common_handlers_->throttle_model, _uav_mass_ * common_handlers_->g);
    +     179             : 
    +     180             :   // | ------------------------ profiler ------------------------ |
    +     181             : 
    +     182          91 :   profiler_ = mrs_lib::Profiler(common_handlers->parent_nh, "FailsafeController", _profiler_enabled_);
    +     183             : 
    +     184             :   // | ----------------------- finish init ---------------------- |
    +     185             : 
    +     186          91 :   ROS_INFO("[FailsafeController]: initialized");
    +     187             : 
    +     188          91 :   is_initialized_ = true;
    +     189             : 
    +     190          91 :   return true;
    +     191             : }
    +     192             : 
    +     193             : //}
    +     194             : 
    +     195             : /* activate() //{ */
    +     196             : 
    +     197           7 : bool FailsafeController::activate(const ControlOutput &last_control_output) {
    +     198             : 
    +     199          14 :   auto uav_state = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +     200             : 
    +     201           7 :   if (!last_control_output.control_output) {
    +     202             : 
    +     203           0 :     ROS_WARN("[FailsafeController]: activated without getting the last controller's command");
    +     204             : 
    +     205           0 :     return false;
    +     206             : 
    +     207             :   } else {
    +     208             : 
    +     209             :     // | -------------- calculate the initial heading ------------- |
    +     210             : 
    +     211           7 :     if (sh_hw_api_orientation_.getMsg()) {
    +     212             : 
    +     213          14 :       auto hw_api_orientation = sh_hw_api_orientation_.getMsg();
    +     214             : 
    +     215           7 :       heading_setpoint_ = getHeadingSafely(hw_api_orientation->quaternion);
    +     216             : 
    +     217           7 :       ROS_INFO("[FailsafeController]: activated with heading = %.2f rad", heading_setpoint_);
    +     218             : 
    +     219             :     } else {
    +     220             : 
    +     221           0 :       ROS_ERROR("[FailsafeController]: missing orientation from HW API, activated with heading = 0 rad");
    +     222             : 
    +     223           0 :       heading_setpoint_ = 0;
    +     224             :     }
    +     225             : 
    +     226           7 :     activation_control_output_ = last_control_output;
    +     227             : 
    +     228           7 :     if (last_control_output.diagnostics.mass_estimator) {
    +     229           7 :       uav_mass_difference_ = last_control_output.diagnostics.mass_difference;
    +     230             :     } else {
    +     231           0 :       uav_mass_difference_ = 0;
    +     232             :     }
    +     233             : 
    +     234           7 :     activation_control_output_.diagnostics.controller_enforcing_constraints = false;
    +     235             : 
    +     236           7 :     hover_throttle_ = _initial_throttle_percentage_ * mrs_lib::quadratic_throttle_model::forceToThrottle(
    +     237           7 :                                                           common_handlers_->throttle_model, (_uav_mass_ + uav_mass_difference_) * common_handlers_->g);
    +     238             : 
    +     239           7 :     ROS_INFO("[FailsafeController]: activated with uav_mass_difference %.2f kg.", uav_mass_difference_);
    +     240             :   }
    +     241             : 
    +     242           7 :   first_iteration_ = true;
    +     243             : 
    +     244           7 :   is_active_ = true;
    +     245             : 
    +     246           7 :   return true;
    +     247             : }
    +     248             : 
    +     249             : //}
    +     250             : 
    +     251             : /* deactivate() //{ */
    +     252             : 
    +     253          34 : void FailsafeController::deactivate(void) {
    +     254             : 
    +     255          34 :   is_active_           = false;
    +     256          34 :   first_iteration_     = false;
    +     257          34 :   uav_mass_difference_ = 0;
    +     258             : 
    +     259          34 :   ROS_INFO("[FailsafeController]: deactivated");
    +     260          34 : }
    +     261             : 
    +     262             : //}
    +     263             : 
    +     264             : /* updateInactive() //{ */
    +     265             : 
    +     266      120312 : void FailsafeController::updateInactive(const mrs_msgs::UavState &uav_state, [[maybe_unused]] const std::optional<mrs_msgs::TrackerCommand> &tracker_command) {
    +     267             : 
    +     268      120312 :   mrs_lib::set_mutexed(mutex_uav_state_, uav_state, uav_state_);
    +     269             : 
    +     270      120312 :   last_update_time_ = ros::Time::now();
    +     271             : 
    +     272      120312 :   first_iteration_ = false;
    +     273      120312 : }
    +     274             : 
    +     275             : //}
    +     276             : 
    +     277             : /* //{ updateWhenAcctive() */
    +     278             : 
    +     279        9713 : FailsafeController::ControlOutput FailsafeController::updateActive(const mrs_msgs::UavState &                       uav_state,
    +     280             :                                                                    [[maybe_unused]] const mrs_msgs::TrackerCommand &tracker_command) {
    +     281             : 
    +     282       29139 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("update");
    +     283       29139 :   mrs_lib::ScopeTimer timer = mrs_lib::ScopeTimer("FailsafeController::update", common_handlers_->scope_timer.logger, common_handlers_->scope_timer.enabled);
    +     284             : 
    +     285             :   {
    +     286       19426 :     std::scoped_lock lock(mutex_uav_state_);
    +     287             : 
    +     288        9713 :     uav_state_ = uav_state;
    +     289             :   }
    +     290             : 
    +     291        9713 :   if (!is_active_) {
    +     292           0 :     return ControlOutput();
    +     293             :   }
    +     294             : 
    +     295        9713 :   auto constraints = mrs_lib::get_mutexed(mutex_constraints_, constraints_);
    +     296             : 
    +     297             :   // | -------------------- calculate the dt -------------------- |
    +     298             : 
    +     299             :   double dt;
    +     300             : 
    +     301        9713 :   if (first_iteration_) {
    +     302           7 :     dt               = 0.01;
    +     303           7 :     first_iteration_ = false;
    +     304             :   } else {
    +     305        9706 :     dt = (ros::Time::now() - last_update_time_).toSec();
    +     306             :   }
    +     307             : 
    +     308        9713 :   last_update_time_ = ros::Time::now();
    +     309             : 
    +     310        9713 :   hover_throttle_ -= _throttle_decrease_rate_ * dt;
    +     311             : 
    +     312        9713 :   if (!std::isfinite(hover_throttle_)) {
    +     313           0 :     hover_throttle_ = 0;
    +     314           0 :     ROS_ERROR("[FailsafeController]: NaN detected in variable 'hover_throttle', setting it to 0 and returning!!!");
    +     315        9713 :   } else if (hover_throttle_ > 1.0) {
    +     316           0 :     hover_throttle_ = 1.0;
    +     317        9713 :   } else if (hover_throttle_ < 0.0) {
    +     318           0 :     hover_throttle_ = 0.0;
    +     319             :   }
    +     320             : 
    +     321             :   // | --------------- prepare the control output --------------- |
    +     322             : 
    +     323       19426 :   FailsafeController::ControlOutput control_output;
    +     324             : 
    +     325        9713 :   control_output.diagnostics.controller = "FailsafeController";
    +     326             : 
    +     327        9713 :   auto highest_modality = common::getHighestOuput(common_handlers_->control_output_modalities);
    +     328             : 
    +     329        9713 :   if (!highest_modality) {
    +     330           0 :     ROS_ERROR_THROTTLE(1.0, "[FailsafeController]: output modalities are empty! This error should never appear.");
    +     331           0 :     return control_output;
    +     332             :   }
    +     333             : 
    +     334        9713 :   control_output.diagnostics.controller = "FailsafeController";
    +     335             : 
    +     336             :   // --------------------------------------------------------------
    +     337             :   // |                       position output                      |
    +     338             :   // --------------------------------------------------------------
    +     339             : 
    +     340        9713 :   if (highest_modality.value() == common::POSITION) {
    +     341           0 :     ROS_INFO_THROTTLE(1.0, "[FailsafeController]: returning empty command, because we are at the position modality");
    +     342           0 :     return control_output;
    +     343             :   }
    +     344             : 
    +     345             :   // --------------------------------------------------------------
    +     346             :   // |                       velocity output                      |
    +     347             :   // --------------------------------------------------------------
    +     348             : 
    +     349        9713 :   if (highest_modality.value() == common::VELOCITY_HDG) {
    +     350             : 
    +     351           0 :     mrs_msgs::HwApiVelocityHdgCmd vel_cmd;
    +     352             : 
    +     353           0 :     vel_cmd.header.stamp = ros::Time::now();
    +     354             : 
    +     355           0 :     vel_cmd.velocity.x = 0;
    +     356           0 :     vel_cmd.velocity.y = 0;
    +     357           0 :     vel_cmd.velocity.z = -_descend_speed_;
    +     358           0 :     vel_cmd.heading    = heading_setpoint_;
    +     359             : 
    +     360           0 :     ROS_DEBUG_THROTTLE(1.0, "[FailsafeController]: returning velocity+hdg output");
    +     361           0 :     control_output.control_output = vel_cmd;
    +     362           0 :     return control_output;
    +     363             :   }
    +     364             : 
    +     365        9713 :   if (highest_modality.value() == common::VELOCITY_HDG_RATE) {
    +     366             : 
    +     367           0 :     mrs_msgs::HwApiVelocityHdgRateCmd vel_cmd;
    +     368             : 
    +     369           0 :     vel_cmd.header.stamp = ros::Time::now();
    +     370             : 
    +     371           0 :     vel_cmd.velocity.x   = 0;
    +     372           0 :     vel_cmd.velocity.y   = 0;
    +     373           0 :     vel_cmd.velocity.z   = -_descend_speed_;
    +     374           0 :     vel_cmd.heading_rate = 0.0;
    +     375             : 
    +     376           0 :     ROS_DEBUG_THROTTLE(1.0, "[FailsafeController]: returning velocity+hdg rate output");
    +     377           0 :     control_output.control_output = vel_cmd;
    +     378           0 :     return control_output;
    +     379             :   }
    +     380             : 
    +     381             :   // --------------------------------------------------------------
    +     382             :   // |                     acceleration output                    |
    +     383             :   // --------------------------------------------------------------
    +     384             : 
    +     385        9713 :   if (highest_modality.value() == common::ACCELERATION_HDG) {
    +     386             : 
    +     387           0 :     mrs_msgs::HwApiAccelerationHdgCmd acc_cmd;
    +     388             : 
    +     389           0 :     acc_cmd.header.stamp = ros::Time::now();
    +     390             : 
    +     391           0 :     acc_cmd.acceleration.x = 0;
    +     392           0 :     acc_cmd.acceleration.y = 0;
    +     393           0 :     acc_cmd.acceleration.z = -_descend_acceleration_;
    +     394           0 :     acc_cmd.heading        = heading_setpoint_;
    +     395             : 
    +     396           0 :     ROS_DEBUG_THROTTLE(1.0, "[FailsafeController]: returning acceleration+hdg output");
    +     397           0 :     control_output.control_output = acc_cmd;
    +     398           0 :     return control_output;
    +     399             :   }
    +     400             : 
    +     401        9713 :   if (highest_modality.value() == common::ACCELERATION_HDG_RATE) {
    +     402             : 
    +     403           0 :     mrs_msgs::HwApiAccelerationHdgRateCmd acc_cmd;
    +     404             : 
    +     405           0 :     acc_cmd.header.stamp = ros::Time::now();
    +     406             : 
    +     407           0 :     acc_cmd.acceleration.x = 0;
    +     408           0 :     acc_cmd.acceleration.y = 0;
    +     409           0 :     acc_cmd.acceleration.z = -_descend_acceleration_;
    +     410           0 :     acc_cmd.heading_rate   = 0.0;
    +     411             : 
    +     412           0 :     ROS_DEBUG_THROTTLE(1.0, "[FailsafeController]: returning acceleration+hdg rate output");
    +     413           0 :     control_output.control_output = acc_cmd;
    +     414           0 :     return control_output;
    +     415             :   }
    +     416             : 
    +     417             :   // --------------------------------------------------------------
    +     418             :   // |                       attitude output                      |
    +     419             :   // --------------------------------------------------------------
    +     420             : 
    +     421        9713 :   mrs_msgs::HwApiAttitudeCmd attitude_cmd;
    +     422             : 
    +     423        9713 :   attitude_cmd.stamp       = ros::Time::now();
    +     424        9713 :   attitude_cmd.orientation = mrs_lib::AttitudeConverter(0, 0, heading_setpoint_);
    +     425        9713 :   attitude_cmd.throttle    = hover_throttle_;
    +     426             : 
    +     427        9713 :   if (highest_modality.value() == common::ATTITUDE) {
    +     428        5534 :     ROS_DEBUG_THROTTLE(1.0, "[FailsafeController]: returning attitude output");
    +     429        5534 :     control_output.control_output = attitude_cmd;
    +     430        5534 :     return control_output;
    +     431             :   }
    +     432             : 
    +     433             :   // --------------------------------------------------------------
    +     434             :   // |                      attitude control                      |
    +     435             :   // --------------------------------------------------------------
    +     436             : 
    +     437        4179 :   Eigen::Vector3d attitude_rate_saturation(constraints.roll_rate, constraints.pitch_rate, constraints.yaw_rate);
    +     438        4179 :   Eigen::Vector3d rate_ff(0, 0, 0);
    +     439        4179 :   Eigen::Vector3d Kq(_kq_, _kq_, _kq_);
    +     440             : 
    +     441        4179 :   auto attitude_rate_command = common::attitudeController(uav_state, attitude_cmd, rate_ff, attitude_rate_saturation, Kq, false);
    +     442             : 
    +     443        4179 :   if (highest_modality.value() == common::ATTITUDE_RATE) {
    +     444        1393 :     ROS_DEBUG_THROTTLE(1.0, "[FailsafeController]: returning attitude rate output");
    +     445        1393 :     control_output.control_output = attitude_rate_command;
    +     446        1393 :     return control_output;
    +     447             :   }
    +     448             : 
    +     449             :   // --------------------------------------------------------------
    +     450             :   // |                    attitude rate control                   |
    +     451             :   // --------------------------------------------------------------
    +     452             : 
    +     453        2786 :   Eigen::Vector3d Kw = common_handlers_->detailed_model_params->inertia.diagonal() * _kw_;
    +     454             : 
    +     455        2786 :   auto control_group_command = common::attitudeRateController(uav_state, attitude_rate_command.value(), Kw);
    +     456             : 
    +     457        2786 :   if (highest_modality.value() == common::CONTROL_GROUP) {
    +     458        1393 :     ROS_DEBUG_THROTTLE(1.0, "[FailsafeController]: returning control group output");
    +     459        1393 :     control_output.control_output = control_group_command;
    +     460        1393 :     return control_output;
    +     461             :   }
    +     462             : 
    +     463             :   // --------------------------------------------------------------
    +     464             :   // |                            mixer                           |
    +     465             :   // --------------------------------------------------------------
    +     466             : 
    +     467        2786 :   mrs_msgs::HwApiActuatorCmd actuator_cmd = common::actuatorMixer(control_group_command.value(), common_handlers_->detailed_model_params->control_group_mixer);
    +     468             : 
    +     469        1393 :   ROS_DEBUG_THROTTLE(1.0, "[FailsafeController]: returning actuators output");
    +     470        1393 :   control_output.control_output = actuator_cmd;
    +     471        1393 :   return control_output;
    +     472             : }
    +     473             : 
    +     474             : //}
    +     475             : 
    +     476             : /* getStatus() //{ */
    +     477             : 
    +     478         969 : const mrs_msgs::ControllerStatus FailsafeController::getStatus() {
    +     479             : 
    +     480         969 :   mrs_msgs::ControllerStatus controller_status;
    +     481             : 
    +     482         969 :   controller_status.active = is_active_;
    +     483             : 
    +     484         969 :   return controller_status;
    +     485             : }
    +     486             : 
    +     487             : //}
    +     488             : 
    +     489             : /* switchOdometrySource() //{ */
    +     490             : 
    +     491           0 : void FailsafeController::switchOdometrySource([[maybe_unused]] const mrs_msgs::UavState &new_uav_state) {
    +     492           0 : }
    +     493             : 
    +     494             : //}
    +     495             : 
    +     496             : /* resetDisturbanceEstimators() //{ */
    +     497             : 
    +     498           0 : void FailsafeController::resetDisturbanceEstimators(void) {
    +     499           0 : }
    +     500             : 
    +     501             : //}
    +     502             : 
    +     503             : /* setConstraints() //{ */
    +     504             : 
    +     505         360 : const mrs_msgs::DynamicsConstraintsSrvResponse::ConstPtr FailsafeController::setConstraints([
    +     506             :     [maybe_unused]] const mrs_msgs::DynamicsConstraintsSrvRequest::ConstPtr &constraints) {
    +     507             : 
    +     508         360 :   if (!is_initialized_) {
    +     509           0 :     return mrs_msgs::DynamicsConstraintsSrvResponse::ConstPtr(new mrs_msgs::DynamicsConstraintsSrvResponse());
    +     510             :   }
    +     511             : 
    +     512         360 :   mrs_lib::set_mutexed(mutex_constraints_, constraints->constraints, constraints_);
    +     513             : 
    +     514         360 :   ROS_INFO("[FailsafeController]: updating constraints");
    +     515             : 
    +     516         720 :   mrs_msgs::DynamicsConstraintsSrvResponse res;
    +     517         360 :   res.success = true;
    +     518         360 :   res.message = "constraints updated";
    +     519             : 
    +     520         360 :   return mrs_msgs::DynamicsConstraintsSrvResponse::ConstPtr(new mrs_msgs::DynamicsConstraintsSrvResponse(res));
    +     521             : }
    +     522             : 
    +     523             : //}
    +     524             : 
    +     525             : /* getHeadingSafely() //{ */
    +     526             : 
    +     527           7 : double FailsafeController::getHeadingSafely(const geometry_msgs::Quaternion &quaternion) {
    +     528             : 
    +     529             :   try {
    +     530           7 :     return mrs_lib::AttitudeConverter(quaternion).getHeading();
    +     531             :   }
    +     532           0 :   catch (...) {
    +     533             :   }
    +     534             : 
    +     535             :   try {
    +     536           0 :     return mrs_lib::AttitudeConverter(quaternion).getYaw();
    +     537             :   }
    +     538           0 :   catch (...) {
    +     539             :   }
    +     540             : 
    +     541           0 :   return 0;
    +     542             : }
    +     543             : 
    +     544             : //}
    +     545             : 
    +     546             : }  // namespace failsafe_controller
    +     547             : 
    +     548             : }  // namespace mrs_uav_controllers
    +     549             : 
    +     550             : #include <pluginlib/class_list_macros.h>
    +     551          91 : PLUGINLIB_EXPORT_CLASS(mrs_uav_controllers::failsafe_controller::FailsafeController, mrs_uav_managers::Controller)
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_controllers/src/failsafe_controller.cpp.gcov.overview.html b/mrs_uav_controllers/src/failsafe_controller.cpp.gcov.overview.html new file mode 100644 index 0000000000..ba53a24ec7 --- /dev/null +++ b/mrs_uav_controllers/src/failsafe_controller.cpp.gcov.overview.html @@ -0,0 +1,158 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/src/failsafe_controller.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_controllers/src/failsafe_controller.cpp.gcov.png b/mrs_uav_controllers/src/failsafe_controller.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..37f1ed5c8d31b8129d2f889eaed969e69d0777e4 GIT binary patch literal 1814 zcmV+x2kH2UP)Bulo_nv>+wE~{$ zG8^Ggl!8B*M>U9CZ-=pr;d?xbAor4ws!8hm8LY4Lgv)4^9f4B_W&Ow9LOCLZ zvXlU{kdKBjj7YE-C-{7nwUv`yDe_L-;_SR_GI(VBk_+(T7QE=Xyv zV6&M#!j&Zwld0C2h1oMsm^>{(YP@o(|Iqi=x_D+*uJ)-Anq^22@*52HqjOzLdR;Vl)C7V8Uz_RYCgGCzR0sA% z=mNq1T|WWwhOSEi;)D!>Pndq|k4SaJ^15e+69Q{B8S#L%-%!t5Kx-_BvfLtlhBJH0aX;=Fd1l*+wz}Vr zrSVI)Ql(TX`k6*#3ue3aUD}u6q;nZL4xE090~;_riJaf= znRJ*+hVLl&E(I#AFrrr$hWySDJgU6FBK|FM)L>Ic4d%lh`f=2T?Jtc1{<7CYmsx#z1(-mE!J??fEa5h)dIbnPeA?u-uu7y#BaSE8$vuUPuK3%*P$P-`tNUKX<%*e3umc z4PJFy$=p{um1g>B2`FJX2uf(JT)3d%^I+n!PW? zy^FrALL@4C)q-Uef#CiMf*IsG^Tg52QU7?HdZyr---f*+A5m0qI72Eh@_)j|7saz$ zK~hIF7^=)I9}LCE?Gb#ei{aspZ+P~T7>=U&pPe&T=QDMJaP$Si<2ez<`_7r;gGbC6 zI);ZR-onQ`BmZ?izD=|*LH?tBd`2FQW{CNgn+ohX6A)*3V=1UsbL|Cqdkg(&mvz$DKyPseLy z<#R_EUcl{H;#ain#t`$G1ll&|+-Sdl=L9keyYlopF_}lKJ8UZGm|tD5|6B-0)f4JrF}&9_ELlfKKS&O`nKve8+BM*eotrhk%;EFpT)d^q#T+#mQsAn<*71j< zKF7j9h($07*qoM6N<$ Ef(Ku2xBvhE literal 0 HcmV?d00001 diff --git a/mrs_uav_controllers/src/index-detail-sort-f.html b/mrs_uav_controllers/src/index-detail-sort-f.html new file mode 100644 index 0000000000..ee733cd85d --- /dev/null +++ b/mrs_uav_controllers/src/index-detail-sort-f.html @@ -0,0 +1,182 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/src + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_controllers/srcHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:1762217281.1 %
    Date:2024-04-18 23:11:36Functions:586687.9 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    failsafe_controller.cpp +
    67.5%67.5%
    +
    67.5 %131 / 19481.8 %9 / 11
    <unnamed>67.5 %131 / 19481.8 %9 / 11
    midair_activation_controller.cpp +
    88.7%88.7%
    +
    88.7 %134 / 15181.8 %9 / 11
    <unnamed>88.7 %134 / 15181.8 %9 / 11
    se3_controller.cpp +
    80.6%80.6%
    +
    80.6 %624 / 77488.2 %15 / 17
    <unnamed>80.6 %624 / 77488.2 %15 / 17
    mpc_controller.cpp +
    82.7%82.7%
    +
    82.7 %739 / 89488.9 %16 / 18
    <unnamed>82.7 %739 / 89488.9 %16 / 18
    common.cpp +
    84.3%84.3%
    +
    84.3 %134 / 159100.0 %9 / 9
    <unnamed>84.3 %134 / 159100.0 %9 / 9
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_controllers/src/index-detail-sort-l.html b/mrs_uav_controllers/src/index-detail-sort-l.html new file mode 100644 index 0000000000..8377469f5f --- /dev/null +++ b/mrs_uav_controllers/src/index-detail-sort-l.html @@ -0,0 +1,182 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/src + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_controllers/srcHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:1762217281.1 %
    Date:2024-04-18 23:11:36Functions:586687.9 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    failsafe_controller.cpp +
    67.5%67.5%
    +
    67.5 %131 / 19481.8 %9 / 11
    <unnamed>67.5 %131 / 19481.8 %9 / 11
    se3_controller.cpp +
    80.6%80.6%
    +
    80.6 %624 / 77488.2 %15 / 17
    <unnamed>80.6 %624 / 77488.2 %15 / 17
    mpc_controller.cpp +
    82.7%82.7%
    +
    82.7 %739 / 89488.9 %16 / 18
    <unnamed>82.7 %739 / 89488.9 %16 / 18
    common.cpp +
    84.3%84.3%
    +
    84.3 %134 / 159100.0 %9 / 9
    <unnamed>84.3 %134 / 159100.0 %9 / 9
    midair_activation_controller.cpp +
    88.7%88.7%
    +
    88.7 %134 / 15181.8 %9 / 11
    <unnamed>88.7 %134 / 15181.8 %9 / 11
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_controllers/src/index-detail.html b/mrs_uav_controllers/src/index-detail.html new file mode 100644 index 0000000000..3fd272b586 --- /dev/null +++ b/mrs_uav_controllers/src/index-detail.html @@ -0,0 +1,182 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/src + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_controllers/srcHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:1762217281.1 %
    Date:2024-04-18 23:11:36Functions:586687.9 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    common.cpp +
    84.3%84.3%
    +
    84.3 %134 / 159100.0 %9 / 9
    <unnamed>84.3 %134 / 159100.0 %9 / 9
    failsafe_controller.cpp +
    67.5%67.5%
    +
    67.5 %131 / 19481.8 %9 / 11
    <unnamed>67.5 %131 / 19481.8 %9 / 11
    midair_activation_controller.cpp +
    88.7%88.7%
    +
    88.7 %134 / 15181.8 %9 / 11
    <unnamed>88.7 %134 / 15181.8 %9 / 11
    mpc_controller.cpp +
    82.7%82.7%
    +
    82.7 %739 / 89488.9 %16 / 18
    <unnamed>82.7 %739 / 89488.9 %16 / 18
    se3_controller.cpp +
    80.6%80.6%
    +
    80.6 %624 / 77488.2 %15 / 17
    <unnamed>80.6 %624 / 77488.2 %15 / 17
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_controllers/src/index-sort-f.html b/mrs_uav_controllers/src/index-sort-f.html new file mode 100644 index 0000000000..6ff1817ac1 --- /dev/null +++ b/mrs_uav_controllers/src/index-sort-f.html @@ -0,0 +1,142 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/src + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_controllers/srcHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:1762217281.1 %
    Date:2024-04-18 23:11:36Functions:586687.9 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    failsafe_controller.cpp +
    67.5%67.5%
    +
    67.5 %131 / 19481.8 %9 / 11
    midair_activation_controller.cpp +
    88.7%88.7%
    +
    88.7 %134 / 15181.8 %9 / 11
    se3_controller.cpp +
    80.6%80.6%
    +
    80.6 %624 / 77488.2 %15 / 17
    mpc_controller.cpp +
    82.7%82.7%
    +
    82.7 %739 / 89488.9 %16 / 18
    common.cpp +
    84.3%84.3%
    +
    84.3 %134 / 159100.0 %9 / 9
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_controllers/src/index-sort-l.html b/mrs_uav_controllers/src/index-sort-l.html new file mode 100644 index 0000000000..ebb4215a53 --- /dev/null +++ b/mrs_uav_controllers/src/index-sort-l.html @@ -0,0 +1,142 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/src + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_controllers/srcHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:1762217281.1 %
    Date:2024-04-18 23:11:36Functions:586687.9 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    failsafe_controller.cpp +
    67.5%67.5%
    +
    67.5 %131 / 19481.8 %9 / 11
    se3_controller.cpp +
    80.6%80.6%
    +
    80.6 %624 / 77488.2 %15 / 17
    mpc_controller.cpp +
    82.7%82.7%
    +
    82.7 %739 / 89488.9 %16 / 18
    common.cpp +
    84.3%84.3%
    +
    84.3 %134 / 159100.0 %9 / 9
    midair_activation_controller.cpp +
    88.7%88.7%
    +
    88.7 %134 / 15181.8 %9 / 11
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_controllers/src/index.html b/mrs_uav_controllers/src/index.html new file mode 100644 index 0000000000..a02b7b0e8a --- /dev/null +++ b/mrs_uav_controllers/src/index.html @@ -0,0 +1,142 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/src + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_controllers/srcHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:1762217281.1 %
    Date:2024-04-18 23:11:36Functions:586687.9 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    common.cpp +
    84.3%84.3%
    +
    84.3 %134 / 159100.0 %9 / 9
    failsafe_controller.cpp +
    67.5%67.5%
    +
    67.5 %131 / 19481.8 %9 / 11
    midair_activation_controller.cpp +
    88.7%88.7%
    +
    88.7 %134 / 15181.8 %9 / 11
    mpc_controller.cpp +
    82.7%82.7%
    +
    82.7 %739 / 89488.9 %16 / 18
    se3_controller.cpp +
    80.6%80.6%
    +
    80.6 %624 / 77488.2 %15 / 17
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_controllers/src/midair_activation_controller.cpp.func-sort-c.html b/mrs_uav_controllers/src/midair_activation_controller.cpp.func-sort-c.html new file mode 100644 index 0000000000..19123cd5c9 --- /dev/null +++ b/mrs_uav_controllers/src/midair_activation_controller.cpp.func-sort-c.html @@ -0,0 +1,124 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/src/midair_activation_controller.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_controllers/src - midair_activation_controller.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:13415188.7 %
    Date:2024-04-18 23:11:36Functions:91181.8 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_controllers::midair_activation_controller::MidairActivationController::switchOdometrySource(mrs_msgs::UavState_<std::allocator<void> > const&)0
    mrs_uav_controllers::midair_activation_controller::MidairActivationController::resetDisturbanceEstimators()0
    mrs_uav_controllers::midair_activation_controller::MidairActivationController::getHeadingSafely(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_msgs::TrackerCommand_<std::allocator<void> > const&)13
    mrs_uav_controllers::midair_activation_controller::MidairActivationController::deactivate()86
    (anonymous namespace)::ProxyExec0::ProxyExec0()91
    mrs_uav_controllers::midair_activation_controller::MidairActivationController::initialize(ros::NodeHandle const&, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t>, std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t>)91
    mrs_uav_controllers::midair_activation_controller::MidairActivationController::getStatus()100
    mrs_uav_controllers::midair_activation_controller::MidairActivationController::activate(mrs_uav_managers::Controller::ControlOutput const&)129
    mrs_uav_controllers::midair_activation_controller::MidairActivationController::updateActive(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_msgs::TrackerCommand_<std::allocator<void> > const&)277
    mrs_uav_controllers::midair_activation_controller::MidairActivationController::setConstraints(boost::shared_ptr<mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> > const> const&)360
    mrs_uav_controllers::midair_activation_controller::MidairActivationController::updateInactive(mrs_msgs::UavState_<std::allocator<void> > const&, std::optional<mrs_msgs::TrackerCommand_<std::allocator<void> > > const&)129748
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_controllers/src/midair_activation_controller.cpp.func.html b/mrs_uav_controllers/src/midair_activation_controller.cpp.func.html new file mode 100644 index 0000000000..3c9a69e274 --- /dev/null +++ b/mrs_uav_controllers/src/midair_activation_controller.cpp.func.html @@ -0,0 +1,124 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/src/midair_activation_controller.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_controllers/src - midair_activation_controller.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:13415188.7 %
    Date:2024-04-18 23:11:36Functions:91181.8 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    (anonymous namespace)::ProxyExec0::ProxyExec0()91
    mrs_uav_controllers::midair_activation_controller::MidairActivationController::deactivate()86
    mrs_uav_controllers::midair_activation_controller::MidairActivationController::initialize(ros::NodeHandle const&, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t>, std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t>)91
    mrs_uav_controllers::midair_activation_controller::MidairActivationController::updateActive(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_msgs::TrackerCommand_<std::allocator<void> > const&)277
    mrs_uav_controllers::midair_activation_controller::MidairActivationController::setConstraints(boost::shared_ptr<mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> > const> const&)360
    mrs_uav_controllers::midair_activation_controller::MidairActivationController::updateInactive(mrs_msgs::UavState_<std::allocator<void> > const&, std::optional<mrs_msgs::TrackerCommand_<std::allocator<void> > > const&)129748
    mrs_uav_controllers::midair_activation_controller::MidairActivationController::getHeadingSafely(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_msgs::TrackerCommand_<std::allocator<void> > const&)13
    mrs_uav_controllers::midair_activation_controller::MidairActivationController::switchOdometrySource(mrs_msgs::UavState_<std::allocator<void> > const&)0
    mrs_uav_controllers::midair_activation_controller::MidairActivationController::resetDisturbanceEstimators()0
    mrs_uav_controllers::midair_activation_controller::MidairActivationController::activate(mrs_uav_managers::Controller::ControlOutput const&)129
    mrs_uav_controllers::midair_activation_controller::MidairActivationController::getStatus()100
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_controllers/src/midair_activation_controller.cpp.gcov.frameset.html b/mrs_uav_controllers/src/midair_activation_controller.cpp.gcov.frameset.html new file mode 100644 index 0000000000..0679c78cc0 --- /dev/null +++ b/mrs_uav_controllers/src/midair_activation_controller.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/src/midair_activation_controller.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_controllers/src/midair_activation_controller.cpp.gcov.html b/mrs_uav_controllers/src/midair_activation_controller.cpp.gcov.html new file mode 100644 index 0000000000..2ef618e72c --- /dev/null +++ b/mrs_uav_controllers/src/midair_activation_controller.cpp.gcov.html @@ -0,0 +1,518 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/src/midair_activation_controller.cpp + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_controllers/src - midair_activation_controller.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:13415188.7 %
    Date:2024-04-18 23:11:36Functions:91181.8 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : /* includes //{ */
    +       2             : 
    +       3             : #include <ros/ros.h>
    +       4             : #include <ros/package.h>
    +       5             : 
    +       6             : #include <common.h>
    +       7             : 
    +       8             : #include <mrs_uav_managers/controller.h>
    +       9             : 
    +      10             : #include <mrs_lib/profiler.h>
    +      11             : #include <mrs_lib/attitude_converter.h>
    +      12             : #include <mrs_lib/mutex.h>
    +      13             : #include <mrs_lib/param_loader.h>
    +      14             : 
    +      15             : //}
    +      16             : 
    +      17             : namespace mrs_uav_controllers
    +      18             : {
    +      19             : 
    +      20             : namespace midair_activation_controller
    +      21             : {
    +      22             : 
    +      23             : /* class MidairActivationController //{ */
    +      24             : 
    +      25             : class MidairActivationController : public mrs_uav_managers::Controller {
    +      26             : 
    +      27             : public:
    +      28             :   bool initialize(const ros::NodeHandle &nh, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t> common_handlers,
    +      29             :                   std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t> private_handlers);
    +      30             : 
    +      31             :   bool activate(const ControlOutput &last_control_output);
    +      32             : 
    +      33             :   void deactivate(void);
    +      34             : 
    +      35             :   void updateInactive(const mrs_msgs::UavState &uav_state, const std::optional<mrs_msgs::TrackerCommand> &tracker_command);
    +      36             : 
    +      37             :   ControlOutput updateActive(const mrs_msgs::UavState &uav_state, const mrs_msgs::TrackerCommand &tracker_command);
    +      38             : 
    +      39             :   const mrs_msgs::ControllerStatus getStatus();
    +      40             : 
    +      41             :   void switchOdometrySource(const mrs_msgs::UavState &new_uav_state);
    +      42             : 
    +      43             :   void resetDisturbanceEstimators(void);
    +      44             : 
    +      45             :   const mrs_msgs::DynamicsConstraintsSrvResponse::ConstPtr setConstraints(const mrs_msgs::DynamicsConstraintsSrvRequest::ConstPtr &cmd);
    +      46             : 
    +      47             : private:
    +      48             :   ros::NodeHandle nh_;
    +      49             : 
    +      50             :   bool is_initialized_ = false;
    +      51             :   bool is_active_      = false;
    +      52             : 
    +      53             :   std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t>  common_handlers_;
    +      54             :   std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t> private_handlers_;
    +      55             : 
    +      56             :   // | ------------------------ uav state ----------------------- |
    +      57             : 
    +      58             :   mrs_msgs::UavState uav_state_;
    +      59             :   std::mutex         mutex_uav_state_;
    +      60             : 
    +      61             :   // | --------------------- thrust control --------------------- |
    +      62             : 
    +      63             :   double _uav_mass_;
    +      64             :   double uav_mass_difference_;
    +      65             : 
    +      66             :   double hover_throttle_;
    +      67             : 
    +      68             :   // | ------------------------ profiler ------------------------ |
    +      69             : 
    +      70             :   mrs_lib::Profiler profiler_;
    +      71             :   bool              _profiler_enabled_ = false;
    +      72             : 
    +      73             :   // | ------------------------ routines ------------------------ |
    +      74             : 
    +      75             :   double getHeadingSafely(const mrs_msgs::UavState &uav_state, const mrs_msgs::TrackerCommand &tracker_command);
    +      76             : };
    +      77             : 
    +      78             : //}
    +      79             : 
    +      80             : // --------------------------------------------------------------
    +      81             : // |                   controller's interface                   |
    +      82             : // --------------------------------------------------------------
    +      83             : 
    +      84             : /* initialize() //{ */
    +      85             : 
    +      86          91 : bool MidairActivationController::initialize(const ros::NodeHandle &nh, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t> common_handlers,
    +      87             :                                             std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t> private_handlers) {
    +      88             : 
    +      89          91 :   nh_ = nh;
    +      90             : 
    +      91          91 :   common_handlers_  = common_handlers;
    +      92          91 :   private_handlers_ = private_handlers;
    +      93             : 
    +      94          91 :   _uav_mass_ = common_handlers->getMass();
    +      95             : 
    +      96          91 :   ros::Time::waitForValid();
    +      97             : 
    +      98             :   // | ---------- loading params using the parent's nh ---------- |
    +      99             : 
    +     100         182 :   mrs_lib::ParamLoader param_loader_parent(common_handlers->parent_nh, "ControlManager");
    +     101             : 
    +     102          91 :   param_loader_parent.loadParam("enable_profiler", _profiler_enabled_);
    +     103             : 
    +     104          91 :   if (!param_loader_parent.loadedSuccessfully()) {
    +     105           0 :     ROS_ERROR("[MidairActivationController]: Could not load all parameters!");
    +     106           0 :     return false;
    +     107             :   }
    +     108             : 
    +     109             :   // | -------------------- loading my params ------------------- |
    +     110             : 
    +     111          91 :   private_handlers->param_loader->addYamlFile(ros::package::getPath("mrs_uav_controllers") + "/config/private/midair_activation_controller.yaml");
    +     112          91 :   private_handlers->param_loader->addYamlFile(ros::package::getPath("mrs_uav_controllers") + "/config/public/midair_activation_controller.yaml");
    +     113             : 
    +     114          91 :   if (!private_handlers->param_loader->loadedSuccessfully()) {
    +     115           0 :     ROS_ERROR("[MidairActivationController]: Could not load all parameters!");
    +     116           0 :     return false;
    +     117             :   }
    +     118             : 
    +     119          91 :   uav_mass_difference_ = 0;
    +     120             : 
    +     121             :   // | ------------------------ profiler ------------------------ |
    +     122             : 
    +     123          91 :   profiler_ = mrs_lib::Profiler(common_handlers->parent_nh, "MidairActivationController", _profiler_enabled_);
    +     124             : 
    +     125             :   // | ----------------------- finish init ---------------------- |
    +     126             : 
    +     127          91 :   ROS_INFO("[MidairActivationController]: initialized");
    +     128             : 
    +     129          91 :   is_initialized_ = true;
    +     130             : 
    +     131          91 :   return true;
    +     132             : }
    +     133             : 
    +     134             : //}
    +     135             : 
    +     136             : /* activate() //{ */
    +     137             : 
    +     138         129 : bool MidairActivationController::activate([[maybe_unused]] const ControlOutput &last_control_output) {
    +     139             : 
    +     140         129 :   ROS_INFO("[MidairActivationController]: activating");
    +     141             : 
    +     142         129 :   auto uav_state = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +     143             : 
    +     144         129 :   hover_throttle_ = mrs_lib::quadratic_throttle_model::forceToThrottle(common_handlers_->throttle_model, _uav_mass_ * common_handlers_->g);
    +     145             : 
    +     146         129 :   is_active_ = true;
    +     147             : 
    +     148         129 :   ROS_INFO("[MidairActivationController]: activated, hover throttle %.2f", hover_throttle_);
    +     149             : 
    +     150         258 :   return true;
    +     151             : }
    +     152             : 
    +     153             : //}
    +     154             : 
    +     155             : /* deactivate() //{ */
    +     156             : 
    +     157          86 : void MidairActivationController::deactivate(void) {
    +     158             : 
    +     159          86 :   is_active_           = false;
    +     160          86 :   uav_mass_difference_ = 0;
    +     161             : 
    +     162          86 :   ROS_INFO("[MidairActivationController]: deactivated");
    +     163          86 : }
    +     164             : 
    +     165             : //}
    +     166             : 
    +     167             : /* updateInactive() //{ */
    +     168             : 
    +     169      129748 : void MidairActivationController::updateInactive(const mrs_msgs::UavState &                                      uav_state,
    +     170             :                                                 [[maybe_unused]] const std::optional<mrs_msgs::TrackerCommand> &tracker_command) {
    +     171             : 
    +     172      129748 :   mrs_lib::set_mutexed(mutex_uav_state_, uav_state, uav_state_);
    +     173      129748 : }
    +     174             : 
    +     175             : //}
    +     176             : 
    +     177             : /* //{ updateWhenAcctive() */
    +     178             : 
    +     179         277 : MidairActivationController::ControlOutput MidairActivationController::updateActive(const mrs_msgs::UavState &      uav_state,
    +     180             :                                                                                    const mrs_msgs::TrackerCommand &tracker_command) {
    +     181             : 
    +     182         831 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("update");
    +     183             :   mrs_lib::ScopeTimer timer =
    +     184         831 :       mrs_lib::ScopeTimer("MidairActivationController::update", common_handlers_->scope_timer.logger, common_handlers_->scope_timer.enabled);
    +     185             : 
    +     186         277 :   mrs_lib::set_mutexed(mutex_uav_state_, uav_state, uav_state_);
    +     187             : 
    +     188         277 :   if (!is_active_) {
    +     189           0 :     return Controller::ControlOutput();
    +     190             :   }
    +     191             : 
    +     192             :   // | --------------- prepare the control output --------------- |
    +     193             : 
    +     194         554 :   ControlOutput control_output;
    +     195             : 
    +     196         277 :   control_output.diagnostics.controller = "MidairActivationController";
    +     197             : 
    +     198         277 :   auto highest_modality = common::getHighestOuput(common_handlers_->control_output_modalities);
    +     199             : 
    +     200         277 :   if (!highest_modality) {
    +     201             : 
    +     202           0 :     ROS_ERROR_THROTTLE(1.0, "[MidairActivationController]: output modalities are empty! This error should never appear.");
    +     203             : 
    +     204           0 :     return control_output;
    +     205             :   }
    +     206             : 
    +     207         277 :   switch (highest_modality.value()) {
    +     208             : 
    +     209           3 :     case common::POSITION: {
    +     210             : 
    +     211           6 :       mrs_msgs::HwApiPositionCmd cmd;
    +     212             : 
    +     213           3 :       cmd.header.stamp    = ros::Time::now();
    +     214           3 :       cmd.header.frame_id = uav_state.header.frame_id;
    +     215             : 
    +     216           3 :       cmd.position.x = uav_state.pose.position.x;
    +     217           3 :       cmd.position.y = uav_state.pose.position.y;
    +     218           3 :       cmd.position.z = uav_state.pose.position.z;
    +     219             : 
    +     220           3 :       cmd.heading = getHeadingSafely(uav_state, tracker_command);
    +     221             : 
    +     222           3 :       control_output.control_output = cmd;
    +     223             : 
    +     224           3 :       break;
    +     225             :     }
    +     226             : 
    +     227           5 :     case common::VELOCITY_HDG: {
    +     228             : 
    +     229          10 :       mrs_msgs::HwApiVelocityHdgCmd cmd;
    +     230             : 
    +     231           5 :       cmd.header.stamp    = ros::Time::now();
    +     232           5 :       cmd.header.frame_id = uav_state.header.frame_id;
    +     233             : 
    +     234           5 :       cmd.velocity.x = uav_state.velocity.linear.x;
    +     235           5 :       cmd.velocity.y = uav_state.velocity.linear.y;
    +     236           5 :       cmd.velocity.z = uav_state.velocity.linear.z;
    +     237             : 
    +     238           5 :       cmd.heading = getHeadingSafely(uav_state, tracker_command);
    +     239             : 
    +     240           5 :       control_output.control_output = cmd;
    +     241             : 
    +     242           5 :       break;
    +     243             :     }
    +     244             : 
    +     245           9 :     case common::VELOCITY_HDG_RATE: {
    +     246             : 
    +     247          18 :       mrs_msgs::HwApiVelocityHdgRateCmd cmd;
    +     248             : 
    +     249           9 :       cmd.header.stamp    = ros::Time::now();
    +     250           9 :       cmd.header.frame_id = uav_state.header.frame_id;
    +     251             : 
    +     252           9 :       cmd.velocity.x = uav_state.velocity.linear.x;
    +     253           9 :       cmd.velocity.y = uav_state.velocity.linear.y;
    +     254           9 :       cmd.velocity.z = uav_state.velocity.linear.z;
    +     255             : 
    +     256           9 :       cmd.heading_rate = 0;
    +     257             : 
    +     258           9 :       control_output.control_output = cmd;
    +     259             : 
    +     260           9 :       break;
    +     261             :     }
    +     262             : 
    +     263           5 :     case common::ACCELERATION_HDG: {
    +     264             : 
    +     265          10 :       mrs_msgs::HwApiAccelerationHdgCmd cmd;
    +     266             : 
    +     267           5 :       cmd.header.stamp    = ros::Time::now();
    +     268           5 :       cmd.header.frame_id = uav_state.header.frame_id;
    +     269             : 
    +     270           5 :       cmd.acceleration.x = uav_state.acceleration.linear.x;
    +     271           5 :       cmd.acceleration.y = uav_state.acceleration.linear.y;
    +     272           5 :       cmd.acceleration.z = uav_state.acceleration.linear.z;
    +     273             : 
    +     274           5 :       cmd.heading = getHeadingSafely(uav_state, tracker_command);
    +     275             : 
    +     276           5 :       control_output.control_output = cmd;
    +     277             : 
    +     278           5 :       break;
    +     279             :     }
    +     280             : 
    +     281           4 :     case common::ACCELERATION_HDG_RATE: {
    +     282             : 
    +     283           8 :       mrs_msgs::HwApiAccelerationHdgRateCmd cmd;
    +     284             : 
    +     285           4 :       cmd.header.stamp    = ros::Time::now();
    +     286           4 :       cmd.header.frame_id = uav_state.header.frame_id;
    +     287             : 
    +     288           4 :       cmd.acceleration.x = uav_state.acceleration.linear.x;
    +     289           4 :       cmd.acceleration.y = uav_state.acceleration.linear.y;
    +     290           4 :       cmd.acceleration.z = uav_state.acceleration.linear.z;
    +     291             : 
    +     292           4 :       cmd.heading_rate = 0;
    +     293             : 
    +     294           4 :       control_output.control_output = cmd;
    +     295             : 
    +     296           4 :       break;
    +     297             :     }
    +     298             : 
    +     299         189 :     case common::ATTITUDE: {
    +     300             : 
    +     301         189 :       mrs_msgs::HwApiAttitudeCmd cmd;
    +     302             : 
    +     303         189 :       cmd.stamp = ros::Time::now();
    +     304             : 
    +     305         189 :       cmd.orientation = uav_state.pose.orientation;
    +     306         189 :       cmd.throttle    = hover_throttle_;
    +     307             : 
    +     308         189 :       control_output.control_output = cmd;
    +     309             : 
    +     310         189 :       break;
    +     311             :     }
    +     312             : 
    +     313          28 :     case common::ATTITUDE_RATE: {
    +     314             : 
    +     315          28 :       mrs_msgs::HwApiAttitudeRateCmd cmd;
    +     316             : 
    +     317          28 :       cmd.stamp = ros::Time::now();
    +     318             : 
    +     319          28 :       cmd.body_rate.x = 0;
    +     320          28 :       cmd.body_rate.y = 0;
    +     321          28 :       cmd.body_rate.z = 0;
    +     322             : 
    +     323          28 :       cmd.throttle = hover_throttle_;
    +     324             : 
    +     325          28 :       control_output.control_output = cmd;
    +     326             : 
    +     327          28 :       break;
    +     328             :     }
    +     329             : 
    +     330          18 :     case common::CONTROL_GROUP: {
    +     331             : 
    +     332          18 :       mrs_msgs::HwApiControlGroupCmd cmd;
    +     333             : 
    +     334          18 :       cmd.stamp = ros::Time::now();
    +     335             : 
    +     336          18 :       cmd.roll     = 0;
    +     337          18 :       cmd.pitch    = 0;
    +     338          18 :       cmd.yaw      = 0;
    +     339          18 :       cmd.throttle = hover_throttle_;
    +     340             : 
    +     341          18 :       control_output.control_output = cmd;
    +     342             : 
    +     343          18 :       break;
    +     344             :     }
    +     345             : 
    +     346          16 :     case common::ACTUATORS_CMD: {
    +     347             : 
    +     348          32 :       mrs_msgs::HwApiActuatorCmd cmd;
    +     349             : 
    +     350          16 :       cmd.stamp = ros::Time::now();
    +     351             : 
    +     352          80 :       for (int i = 0; i < common_handlers_->throttle_model.n_motors; i++) {
    +     353          64 :         cmd.motors.push_back(hover_throttle_);
    +     354             :       }
    +     355             : 
    +     356          16 :       control_output.control_output = cmd;
    +     357             : 
    +     358          16 :       break;
    +     359             :     }
    +     360             :   }
    +     361             : 
    +     362         277 :   return control_output;
    +     363             : }  // namespace midair_activation_controller
    +     364             : 
    +     365             : //}
    +     366             : 
    +     367             : /* getStatus() //{ */
    +     368             : 
    +     369         100 : const mrs_msgs::ControllerStatus MidairActivationController::getStatus() {
    +     370             : 
    +     371         100 :   mrs_msgs::ControllerStatus controller_status;
    +     372             : 
    +     373         100 :   controller_status.active = is_active_;
    +     374             : 
    +     375         100 :   return controller_status;
    +     376             : }
    +     377             : 
    +     378             : //}
    +     379             : 
    +     380             : /* switchOdometrySource() //{ */
    +     381             : 
    +     382           0 : void MidairActivationController::switchOdometrySource([[maybe_unused]] const mrs_msgs::UavState &new_uav_state) {
    +     383           0 : }
    +     384             : 
    +     385             : //}
    +     386             : 
    +     387             : /* resetDisturbanceEstimators() //{ */
    +     388             : 
    +     389           0 : void MidairActivationController::resetDisturbanceEstimators(void) {
    +     390           0 : }
    +     391             : 
    +     392             : //}
    +     393             : 
    +     394             : /* setConstraints() //{ */
    +     395             : 
    +     396         360 : const mrs_msgs::DynamicsConstraintsSrvResponse::ConstPtr MidairActivationController::setConstraints([
    +     397             :     [maybe_unused]] const mrs_msgs::DynamicsConstraintsSrvRequest::ConstPtr &constraints) {
    +     398             : 
    +     399         360 :   return mrs_msgs::DynamicsConstraintsSrvResponse::ConstPtr(new mrs_msgs::DynamicsConstraintsSrvResponse());
    +     400             : }
    +     401             : 
    +     402             : //}
    +     403             : 
    +     404             : /* getHeadingSafely() //{ */
    +     405             : 
    +     406          13 : double MidairActivationController::getHeadingSafely(const mrs_msgs::UavState &uav_state, const mrs_msgs::TrackerCommand &tracker_command) {
    +     407             : 
    +     408             :   try {
    +     409          13 :     return mrs_lib::AttitudeConverter(uav_state.pose.orientation).getHeading();
    +     410             :   }
    +     411           0 :   catch (...) {
    +     412             :   }
    +     413             : 
    +     414             :   try {
    +     415           0 :     return mrs_lib::AttitudeConverter(uav_state.pose.orientation).getYaw();
    +     416             :   }
    +     417           0 :   catch (...) {
    +     418             :   }
    +     419             : 
    +     420           0 :   if (tracker_command.use_heading) {
    +     421           0 :     return tracker_command.heading;
    +     422             :   }
    +     423             : 
    +     424           0 :   return 0;
    +     425             : }
    +     426             : 
    +     427             : //}
    +     428             : 
    +     429             : }  // namespace midair_activation_controller
    +     430             : 
    +     431             : }  // namespace mrs_uav_controllers
    +     432             : 
    +     433             : #include <pluginlib/class_list_macros.h>
    +     434          91 : PLUGINLIB_EXPORT_CLASS(mrs_uav_controllers::midair_activation_controller::MidairActivationController, mrs_uav_managers::Controller)
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_controllers/src/midair_activation_controller.cpp.gcov.overview.html b/mrs_uav_controllers/src/midair_activation_controller.cpp.gcov.overview.html new file mode 100644 index 0000000000..ca2d6e0fdf --- /dev/null +++ b/mrs_uav_controllers/src/midair_activation_controller.cpp.gcov.overview.html @@ -0,0 +1,129 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/src/midair_activation_controller.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_controllers/src/midair_activation_controller.cpp.gcov.png b/mrs_uav_controllers/src/midair_activation_controller.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..49f6832acd8e49470672760900f2d06888ca2a29 GIT binary patch literal 1228 zcmV;-1T*`IP);0000OP)t-s|NsB0 zs;a7|?_FK${{R500003000620&P%hU00009a7bBm000ie000ie0hKEb8vph4Hy$oLH;~?T|h?sE{F^y{nigeQwS&~b%McnB~@KD?`FrCR}1JerB z`tpc`p(qsvr?`mJYP(o^_aBZTKe^FMlq%#+_n`w!7&I8E78#6xR}J&Gq9x*3_Evvh zun+-#4j^u*0U{tcbe0W{aO#482VxHqa#70hs!`{o8eJivg0;&vg{FoIyt2JS^u7Yu1_<`hK&0f<5qD6I7WmN)ga?n_bI z7hQQSj-4jKD1hkk*v>Sa+|u7#mR}ae%ZEUEr)b}!T-?r|o{h-$QE)Rg&(n;FcK>&U zZbT)1Bi-~kYdvcm*O!E8Owl+oYI~Je)K(F7gll>VlPQ3hjf0738i48X`}jOI=c=v& zcs}AZ%Cn~!HNP zS4x-_hT_%A!1~;xGX7AQGF^>7T;=BL-AC8*Lh)`_`>5bPT!xRvwYoeS#4YgLbi+fO zay{875@xqUku0s&J(8c#rYD0VZ|AGiwOQdLg$@-Nh|@7vlgNBTOS7ERtSL&0Tp#0T z&$8&_@=p(iA6Z_5bZ|?!UvJDvrnSL@L~hOGT9ZvT-0q20JKgqNN0@R^TP3q)p{qJzPu~_kVzAwNe?obgTdz+? zqr|d=G|MVB*%t-_J~6f#3HNH4%Qy!yB-)hVZWZD#s56Rkqx14t;qB7>ESenC%X70hNB#R7%t54`RU+eO899}jWkU~WO&?XhAuq1H4}QIioLKK>RT zzjYekPM@yiNj#~T_EhYM$g3zKsWhC*+<<1{4`}^I8d=kN+6xD&hxtgAX6FEu%#-F# zV8Ga^fb2PdxYjscM1V@fv+LrD9K^I|p5l!T0tucEfls+p=UF@A1IUH`@U!_>B?K~5 zO3(XD%e~Sgc(f?}tln=go!cs8-lDlji!#SK-Eot9jccjW + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/src/mpc_controller.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_controllers/src - mpc_controller.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:73989482.7 %
    Date:2024-04-18 23:11:36Functions:161888.9 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_controllers::mpc_controller::MpcController::callbackSetIntegralTerms(std_srvs::SetBoolRequest_<std::allocator<void> >&, std_srvs::SetBoolResponse_<std::allocator<void> >&)0
    mrs_uav_controllers::mpc_controller::MpcController::resetDisturbanceEstimators()0
    mrs_uav_controllers::mpc_controller::MpcController::switchOdometrySource(mrs_msgs::UavState_<std::allocator<void> > const&)5
    (anonymous namespace)::ProxyExec0::ProxyExec0()91
    mrs_uav_controllers::mpc_controller::MpcController::deactivate()156
    mrs_uav_controllers::mpc_controller::MpcController::initialize(ros::NodeHandle const&, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t>, std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t>)182
    mrs_uav_controllers::mpc_controller::MpcController::callbackDrs(mrs_uav_controllers::mpc_controllerConfig&, unsigned int)182
    mrs_uav_controllers::mpc_controller::MpcController::activate(mrs_uav_managers::Controller::ControlOutput const&)194
    mrs_uav_controllers::mpc_controller::MpcController::positionPassthrough(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_msgs::TrackerCommand_<std::allocator<void> > const&)251
    mrs_uav_controllers::mpc_controller::MpcController::PIDVelocityOutput(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_msgs::TrackerCommand_<std::allocator<void> > const&, mrs_uav_controllers::common::CONTROL_OUTPUT const&, double const&)691
    mrs_uav_controllers::mpc_controller::MpcController::setConstraints(boost::shared_ptr<mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> > const> const&)720
    mrs_uav_controllers::mpc_controller::MpcController::getStatus()12525
    mrs_uav_controllers::mpc_controller::MpcController::timerGains(ros::TimerEvent const&)13726
    mrs_uav_controllers::mpc_controller::MpcController::MPC(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_msgs::TrackerCommand_<std::allocator<void> > const&, double const&, mrs_uav_controllers::common::CONTROL_OUTPUT const&)55526
    mrs_uav_controllers::mpc_controller::MpcController::getHeadingSafely(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_msgs::TrackerCommand_<std::allocator<void> > const&)56217
    mrs_uav_controllers::mpc_controller::MpcController::updateActive(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_msgs::TrackerCommand_<std::allocator<void> > const&)56468
    mrs_uav_controllers::mpc_controller::MpcController::calculateGainChange(double, double, double, bool, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool&)109808
    mrs_uav_controllers::mpc_controller::MpcController::updateInactive(mrs_msgs::UavState_<std::allocator<void> > const&, std::optional<mrs_msgs::TrackerCommand_<std::allocator<void> > > const&)203582
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_controllers/src/mpc_controller.cpp.func.html b/mrs_uav_controllers/src/mpc_controller.cpp.func.html new file mode 100644 index 0000000000..ae92ac82a0 --- /dev/null +++ b/mrs_uav_controllers/src/mpc_controller.cpp.func.html @@ -0,0 +1,152 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/src/mpc_controller.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_controllers/src - mpc_controller.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:73989482.7 %
    Date:2024-04-18 23:11:36Functions:161888.9 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    (anonymous namespace)::ProxyExec0::ProxyExec0()91
    mrs_uav_controllers::mpc_controller::MpcController::deactivate()156
    mrs_uav_controllers::mpc_controller::MpcController::initialize(ros::NodeHandle const&, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t>, std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t>)182
    mrs_uav_controllers::mpc_controller::MpcController::timerGains(ros::TimerEvent const&)13726
    mrs_uav_controllers::mpc_controller::MpcController::callbackDrs(mrs_uav_controllers::mpc_controllerConfig&, unsigned int)182
    mrs_uav_controllers::mpc_controller::MpcController::updateActive(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_msgs::TrackerCommand_<std::allocator<void> > const&)56468
    mrs_uav_controllers::mpc_controller::MpcController::setConstraints(boost::shared_ptr<mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> > const> const&)720
    mrs_uav_controllers::mpc_controller::MpcController::updateInactive(mrs_msgs::UavState_<std::allocator<void> > const&, std::optional<mrs_msgs::TrackerCommand_<std::allocator<void> > > const&)203582
    mrs_uav_controllers::mpc_controller::MpcController::getHeadingSafely(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_msgs::TrackerCommand_<std::allocator<void> > const&)56217
    mrs_uav_controllers::mpc_controller::MpcController::PIDVelocityOutput(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_msgs::TrackerCommand_<std::allocator<void> > const&, mrs_uav_controllers::common::CONTROL_OUTPUT const&, double const&)691
    mrs_uav_controllers::mpc_controller::MpcController::calculateGainChange(double, double, double, bool, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool&)109808
    mrs_uav_controllers::mpc_controller::MpcController::positionPassthrough(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_msgs::TrackerCommand_<std::allocator<void> > const&)251
    mrs_uav_controllers::mpc_controller::MpcController::switchOdometrySource(mrs_msgs::UavState_<std::allocator<void> > const&)5
    mrs_uav_controllers::mpc_controller::MpcController::callbackSetIntegralTerms(std_srvs::SetBoolRequest_<std::allocator<void> >&, std_srvs::SetBoolResponse_<std::allocator<void> >&)0
    mrs_uav_controllers::mpc_controller::MpcController::resetDisturbanceEstimators()0
    mrs_uav_controllers::mpc_controller::MpcController::MPC(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_msgs::TrackerCommand_<std::allocator<void> > const&, double const&, mrs_uav_controllers::common::CONTROL_OUTPUT const&)55526
    mrs_uav_controllers::mpc_controller::MpcController::activate(mrs_uav_managers::Controller::ControlOutput const&)194
    mrs_uav_controllers::mpc_controller::MpcController::getStatus()12525
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_controllers/src/mpc_controller.cpp.gcov.frameset.html b/mrs_uav_controllers/src/mpc_controller.cpp.gcov.frameset.html new file mode 100644 index 0000000000..8a9f67a4c4 --- /dev/null +++ b/mrs_uav_controllers/src/mpc_controller.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/src/mpc_controller.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_controllers/src/mpc_controller.cpp.gcov.html b/mrs_uav_controllers/src/mpc_controller.cpp.gcov.html new file mode 100644 index 0000000000..579fa3d3c4 --- /dev/null +++ b/mrs_uav_controllers/src/mpc_controller.cpp.gcov.html @@ -0,0 +1,2214 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/src/mpc_controller.cpp + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_controllers/src - mpc_controller.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:73989482.7 %
    Date:2024-04-18 23:11:36Functions:161888.9 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : /* includes //{ */
    +       2             : 
    +       3             : #include <ros/ros.h>
    +       4             : #include <ros/package.h>
    +       5             : 
    +       6             : #include <common.h>
    +       7             : #include <pid.hpp>
    +       8             : 
    +       9             : #include <mrs_uav_managers/controller.h>
    +      10             : 
    +      11             : #include <mpc_controller.h>
    +      12             : 
    +      13             : #include <dynamic_reconfigure/server.h>
    +      14             : #include <mrs_uav_controllers/mpc_controllerConfig.h>
    +      15             : 
    +      16             : #include <std_srvs/SetBool.h>
    +      17             : 
    +      18             : #include <mrs_lib/profiler.h>
    +      19             : #include <mrs_lib/utils.h>
    +      20             : #include <mrs_lib/mutex.h>
    +      21             : #include <mrs_lib/attitude_converter.h>
    +      22             : #include <mrs_lib/geometry/cyclic.h>
    +      23             : 
    +      24             : #include <geometry_msgs/Vector3Stamped.h>
    +      25             : 
    +      26             : //}
    +      27             : 
    +      28             : #define OUTPUT_ACTUATORS 0
    +      29             : #define OUTPUT_CONTROL_GROUP 1
    +      30             : #define OUTPUT_ATTITUDE_RATE 2
    +      31             : #define OUTPUT_ATTITUDE 3
    +      32             : 
    +      33             : namespace mrs_uav_controllers
    +      34             : {
    +      35             : 
    +      36             : namespace mpc_controller
    +      37             : {
    +      38             : 
    +      39             : /* structs //{ */
    +      40             : 
    +      41             : typedef struct
    +      42             : {
    +      43             :   double kiwxy;          // world xy integral gain
    +      44             :   double kibxy;          // body xy integral gain
    +      45             :   double kiwxy_lim;      // world xy integral limit
    +      46             :   double kibxy_lim;      // body xy integral limit
    +      47             :   double km;             // mass estimator gain
    +      48             :   double km_lim;         // mass estimator limit
    +      49             :   double kq_roll_pitch;  // pitch/roll attitude gain
    +      50             :   double kq_yaw;         // yaw attitude gain
    +      51             :   double kw_rp;          // attitude rate gain
    +      52             :   double kw_y;           // attitude rate gain
    +      53             : } Gains_t;
    +      54             : 
    +      55             : //}
    +      56             : 
    +      57             : /* //{ class MpcController */
    +      58             : 
    +      59             : class MpcController : public mrs_uav_managers::Controller {
    +      60             : 
    +      61             : public:
    +      62             :   bool initialize(const ros::NodeHandle &nh, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t> common_handlers,
    +      63             :                   std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t> private_handlers);
    +      64             : 
    +      65             :   bool activate(const ControlOutput &last_control_output);
    +      66             : 
    +      67             :   void deactivate(void);
    +      68             : 
    +      69             :   void updateInactive(const mrs_msgs::UavState &uav_state, const std::optional<mrs_msgs::TrackerCommand> &tracker_command);
    +      70             : 
    +      71             :   ControlOutput updateActive(const mrs_msgs::UavState &uav_state, const mrs_msgs::TrackerCommand &tracker_command);
    +      72             : 
    +      73             :   const mrs_msgs::ControllerStatus getStatus();
    +      74             : 
    +      75             :   void switchOdometrySource(const mrs_msgs::UavState &new_uav_state);
    +      76             : 
    +      77             :   void resetDisturbanceEstimators(void);
    +      78             : 
    +      79             :   const mrs_msgs::DynamicsConstraintsSrvResponse::ConstPtr setConstraints(const mrs_msgs::DynamicsConstraintsSrvRequest::ConstPtr &cmd);
    +      80             : 
    +      81             : private:
    +      82             :   ros::NodeHandle nh_;
    +      83             : 
    +      84             :   bool is_initialized_ = false;
    +      85             :   bool is_active_      = false;
    +      86             : 
    +      87             :   std::string name_;
    +      88             : 
    +      89             :   std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t>  common_handlers_;
    +      90             :   std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t> private_handlers_;
    +      91             : 
    +      92             :   // | ------------------------ uav state ----------------------- |
    +      93             : 
    +      94             :   mrs_msgs::UavState uav_state_;
    +      95             :   std::mutex         mutex_uav_state_;
    +      96             : 
    +      97             :   // | --------------- dynamic reconfigure server --------------- |
    +      98             : 
    +      99             :   boost::recursive_mutex                            mutex_drs_;
    +     100             :   typedef mrs_uav_controllers::mpc_controllerConfig DrsConfig_t;
    +     101             :   typedef dynamic_reconfigure::Server<DrsConfig_t>  Drs_t;
    +     102             :   boost::shared_ptr<Drs_t>                          drs_;
    +     103             :   void                                              callbackDrs(mrs_uav_controllers::mpc_controllerConfig &config, uint32_t level);
    +     104             :   DrsConfig_t                                       drs_params_;
    +     105             : 
    +     106             :   // | ----------------------- controllers ---------------------- |
    +     107             : 
    +     108             :   void positionPassthrough(const mrs_msgs::UavState &uav_state, const mrs_msgs::TrackerCommand &tracker_command);
    +     109             : 
    +     110             :   void PIDVelocityOutput(const mrs_msgs::UavState &uav_state, const mrs_msgs::TrackerCommand &tracker_command, const common::CONTROL_OUTPUT &control_output,
    +     111             :                          const double &dt);
    +     112             : 
    +     113             :   void MPC(const mrs_msgs::UavState &uav_state, const mrs_msgs::TrackerCommand &tracker_command, const double &dt,
    +     114             :            const common::CONTROL_OUTPUT &output_modality);
    +     115             : 
    +     116             :   // | ----------------------- constraints ---------------------- |
    +     117             : 
    +     118             :   mrs_msgs::DynamicsConstraints constraints_;
    +     119             :   std::mutex                    mutex_constraints_;
    +     120             : 
    +     121             :   // | -------- throttle generation and mass estimation --------- |
    +     122             : 
    +     123             :   double _uav_mass_;
    +     124             :   double uav_mass_difference_;
    +     125             : 
    +     126             :   Gains_t gains_;
    +     127             : 
    +     128             :   // | ------------------- configurable gains ------------------- |
    +     129             : 
    +     130             :   std::mutex mutex_gains_;       // locks the gains the are used and filtered
    +     131             :   std::mutex mutex_drs_params_;  // locks the gains that came from the drs
    +     132             : 
    +     133             :   ros::Timer timer_gains_;
    +     134             :   void       timerGains(const ros::TimerEvent &event);
    +     135             : 
    +     136             :   double _gain_filtering_rate_;
    +     137             : 
    +     138             :   // | --------------------- gain filtering --------------------- |
    +     139             : 
    +     140             :   double calculateGainChange(const double dt, const double current_value, const double desired_value, const bool bypass_rate, std::string name, bool &updated);
    +     141             : 
    +     142             :   double getHeadingSafely(const mrs_msgs::UavState &uav_state, const mrs_msgs::TrackerCommand &tracker_command);
    +     143             : 
    +     144             :   double _gains_filter_change_rate_;
    +     145             :   double _gains_filter_min_change_rate_;
    +     146             : 
    +     147             :   // | ----------------------- gain muting ---------------------- |
    +     148             : 
    +     149             :   std::atomic<bool> mute_gains_            = false;
    +     150             :   std::atomic<bool> mute_gains_by_tracker_ = false;
    +     151             :   double            _gain_mute_coefficient_;
    +     152             : 
    +     153             :   // | ------------ controller limits and saturations ----------- |
    +     154             : 
    +     155             :   bool   _tilt_angle_failsafe_enabled_;
    +     156             :   double _tilt_angle_failsafe_;
    +     157             : 
    +     158             :   double _throttle_saturation_;
    +     159             : 
    +     160             :   // | ------------------ activation and output ----------------- |
    +     161             : 
    +     162             :   ControlOutput last_control_output_;
    +     163             :   ControlOutput activation_control_output_;
    +     164             : 
    +     165             :   ros::Time         last_update_time_;
    +     166             :   std::atomic<bool> first_iteration_ = true;
    +     167             : 
    +     168             :   // | ----------------- integral terms enabler ----------------- |
    +     169             : 
    +     170             :   ros::ServiceServer service_set_integral_terms_;
    +     171             :   bool               callbackSetIntegralTerms(std_srvs::SetBool::Request &req, std_srvs::SetBool::Response &res);
    +     172             :   bool               integral_terms_enabled_ = true;
    +     173             : 
    +     174             :   // | --------------------- MPC controller --------------------- |
    +     175             : 
    +     176             :   // number of states
    +     177             :   int _n_states_;
    +     178             : 
    +     179             :   // time steps
    +     180             :   double _dt1_;  // the first time step
    +     181             :   double _dt2_;  // all the other steps
    +     182             : 
    +     183             :   // the last control input
    +     184             :   double mpc_solver_x_u_ = 0;
    +     185             :   double mpc_solver_y_u_ = 0;
    +     186             :   double mpc_solver_z_u_ = 0;
    +     187             : 
    +     188             :   int _horizon_length_;
    +     189             : 
    +     190             :   // constraints
    +     191             :   double _max_speed_horizontal_, _max_acceleration_horizontal_, _max_jerk_;
    +     192             :   double _max_speed_vertical_, _max_acceleration_vertical_, _max_u_vertical_;
    +     193             : 
    +     194             :   // Q and S matrix diagonals for horizontal
    +     195             :   std::vector<double> _mat_Q_, _mat_S_;
    +     196             : 
    +     197             :   // Q and S matrix diagonals for vertical
    +     198             :   std::vector<double> _mat_Q_z_, _mat_S_z_;
    +     199             : 
    +     200             :   // MPC solver handlers
    +     201             :   std::shared_ptr<mrs_mpc_solvers::mpc_controller::Solver> mpc_solver_x_;
    +     202             :   std::shared_ptr<mrs_mpc_solvers::mpc_controller::Solver> mpc_solver_y_;
    +     203             :   std::shared_ptr<mrs_mpc_solvers::mpc_controller::Solver> mpc_solver_z_;
    +     204             : 
    +     205             :   // MPC solver params
    +     206             :   bool _mpc_solver_verbose_ = false;
    +     207             :   int  _mpc_solver_max_iterations_;
    +     208             : 
    +     209             :   // | ------------------------ profiler ------------------------ |
    +     210             : 
    +     211             :   mrs_lib::Profiler profiler_;
    +     212             :   bool              _profiler_enabled_ = false;
    +     213             : 
    +     214             :   // | ------------------------ integrals ----------------------- |
    +     215             : 
    +     216             :   Eigen::Vector2d Ib_b_;  // body error integral in the body frame
    +     217             :   Eigen::Vector2d Iw_w_;  // world error integral in the world_frame
    +     218             :   std::mutex      mutex_integrals_;
    +     219             : 
    +     220             :   // | ------------------------- rampup ------------------------- |
    +     221             : 
    +     222             :   bool   _rampup_enabled_ = false;
    +     223             :   double _rampup_speed_;
    +     224             : 
    +     225             :   bool      rampup_active_ = false;
    +     226             :   double    rampup_throttle_;
    +     227             :   int       rampup_direction_;
    +     228             :   double    rampup_duration_;
    +     229             :   ros::Time rampup_start_time_;
    +     230             :   ros::Time rampup_last_time_;
    +     231             : 
    +     232             :   // | ---------------------- position pid ---------------------- |
    +     233             : 
    +     234             :   double _pos_pid_p_;
    +     235             :   double _pos_pid_i_;
    +     236             :   double _pos_pid_d_;
    +     237             : 
    +     238             :   double _hdg_pid_p_;
    +     239             :   double _hdg_pid_i_;
    +     240             :   double _hdg_pid_d_;
    +     241             : 
    +     242             :   PIDController position_pid_x_;
    +     243             :   PIDController position_pid_y_;
    +     244             :   PIDController position_pid_z_;
    +     245             :   PIDController position_pid_heading_;
    +     246             : };
    +     247             : 
    +     248             : //}
    +     249             : 
    +     250             : // --------------------------------------------------------------
    +     251             : // |                   controller's interface                   |
    +     252             : // --------------------------------------------------------------
    +     253             : 
    +     254             : /* //{ initialize() */
    +     255             : 
    +     256         182 : bool MpcController::initialize(const ros::NodeHandle &nh, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t> common_handlers,
    +     257             :                                std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t> private_handlers) {
    +     258             : 
    +     259         182 :   nh_ = nh;
    +     260             : 
    +     261         182 :   common_handlers_  = common_handlers;
    +     262         182 :   private_handlers_ = private_handlers;
    +     263             : 
    +     264         182 :   _uav_mass_ = common_handlers_->getMass();
    +     265         182 :   name_      = private_handlers_->runtime_name;
    +     266             : 
    +     267         182 :   ros::Time::waitForValid();
    +     268             : 
    +     269             :   // | ---------- loading params using the parent's nh ---------- |
    +     270             : 
    +     271         364 :   mrs_lib::ParamLoader param_loader_parent(common_handlers->parent_nh, "ControlManager");
    +     272             : 
    +     273         182 :   param_loader_parent.loadParam("enable_profiler", _profiler_enabled_);
    +     274             : 
    +     275         182 :   if (!param_loader_parent.loadedSuccessfully()) {
    +     276           0 :     ROS_ERROR("[%s]: Could not load all parameters!", name_.c_str());
    +     277           0 :     return false;
    +     278             :   }
    +     279             : 
    +     280             :   // | -------------------- loading my params ------------------- |
    +     281             : 
    +     282         182 :   private_handlers->param_loader->addYamlFile(ros::package::getPath("mrs_uav_controllers") + "/config/private/mpc_controller.yaml");
    +     283         182 :   private_handlers->param_loader->addYamlFile(ros::package::getPath("mrs_uav_controllers") + "/config/public/mpc_controller.yaml");
    +     284         182 :   private_handlers->param_loader->addYamlFile(ros::package::getPath("mrs_uav_controllers") + "/config/private/" + private_handlers->name_space + ".yaml");
    +     285         182 :   private_handlers->param_loader->addYamlFile(ros::package::getPath("mrs_uav_controllers") + "/config/public/" + private_handlers->name_space + ".yaml");
    +     286             : 
    +     287         364 :   const std::string yaml_namespace = "mrs_uav_controllers/" + private_handlers_->name_space + "/";
    +     288             : 
    +     289             :   // load the dynamicall model parameters
    +     290         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "mpc/mpc_model/number_of_states", _n_states_);
    +     291         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "mpc/mpc_model/dt1", _dt1_);
    +     292         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "mpc/mpc_model/dt2", _dt2_);
    +     293             : 
    +     294         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "mpc/mpc_parameters/horizon_length", _horizon_length_);
    +     295             : 
    +     296         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "mpc/mpc_parameters/horizontal/max_speed", _max_speed_horizontal_);
    +     297         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "mpc/mpc_parameters/horizontal/max_acceleration", _max_acceleration_horizontal_);
    +     298         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "mpc/mpc_parameters/horizontal/max_jerk", _max_jerk_);
    +     299             : 
    +     300         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "mpc/mpc_parameters/horizontal/Q", _mat_Q_);
    +     301         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "mpc/mpc_parameters/horizontal/S", _mat_S_);
    +     302             : 
    +     303         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "mpc/mpc_parameters/vertical/max_speed", _max_speed_vertical_);
    +     304         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "mpc/mpc_parameters/vertical/max_acceleration", _max_acceleration_vertical_);
    +     305         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "mpc/mpc_parameters/vertical/max_u", _max_u_vertical_);
    +     306             : 
    +     307         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "mpc/mpc_parameters/vertical/Q", _mat_Q_z_);
    +     308         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "mpc/mpc_parameters/vertical/S", _mat_S_z_);
    +     309             : 
    +     310         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "mpc/solver/verbose", _mpc_solver_verbose_);
    +     311         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "mpc/solver/max_iterations", _mpc_solver_max_iterations_);
    +     312             : 
    +     313             :   // | ------------------------- rampup ------------------------- |
    +     314             : 
    +     315         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "so3/rampup/enabled", _rampup_enabled_);
    +     316         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "so3/rampup/speed", _rampup_speed_);
    +     317             : 
    +     318             :   // | --------------------- integral gains --------------------- |
    +     319             : 
    +     320         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "so3/gains/integral_gains/kiw", gains_.kiwxy);
    +     321         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "so3/gains/integral_gains/kib", gains_.kibxy);
    +     322             : 
    +     323             :   // integrator limits
    +     324         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "so3/gains/integral_gains/kiw_lim", gains_.kiwxy_lim);
    +     325         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "so3/gains/integral_gains/kib_lim", gains_.kibxy_lim);
    +     326             : 
    +     327             :   // | ------------- height and attitude controller ------------- |
    +     328             : 
    +     329             :   // attitude gains
    +     330         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "so3/gains/attitude/roll_pitch", gains_.kq_roll_pitch);
    +     331         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "so3/gains/attitude/yaw", gains_.kq_yaw);
    +     332             : 
    +     333             :   // attitude rate gains
    +     334         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "so3/gains/attitude_rate/roll_pitch", gains_.kw_rp);
    +     335         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "so3/gains/attitude_rate/yaw", gains_.kw_y);
    +     336             : 
    +     337             :   // mass estimator
    +     338         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "so3/mass_estimator/km", gains_.km);
    +     339         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "so3/mass_estimator/km_lim", gains_.km_lim);
    +     340             : 
    +     341             :   // constraints
    +     342         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "so3/constraints/tilt_angle_failsafe/enabled", _tilt_angle_failsafe_enabled_);
    +     343         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "so3/constraints/tilt_angle_failsafe/limit", _tilt_angle_failsafe_);
    +     344             : 
    +     345         182 :   _tilt_angle_failsafe_ = M_PI * (_tilt_angle_failsafe_ / 180.0);
    +     346             : 
    +     347         182 :   if (_tilt_angle_failsafe_enabled_ && fabs(_tilt_angle_failsafe_) < 1e-3) {
    +     348           0 :     ROS_ERROR("[%s]: constraints/tilt_angle_failsafe/enabled = 'TRUE' but the limit is too low", name_.c_str());
    +     349           0 :     return false;
    +     350             :   }
    +     351             : 
    +     352         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "so3/constraints/throttle_saturation", _throttle_saturation_);
    +     353             : 
    +     354             :   // gain filtering
    +     355         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "so3/gain_filtering/perc_change_rate", _gains_filter_change_rate_);
    +     356         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "so3/gain_filtering/min_change_rate", _gains_filter_min_change_rate_);
    +     357         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "so3/gain_filtering/rate", _gain_filtering_rate_);
    +     358         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "so3/gain_filtering/gain_mute_coefficient", _gain_mute_coefficient_);
    +     359             : 
    +     360             :   // angular rate feed forward
    +     361         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "so3/angular_rate_feedforward/jerk", drs_params_.jerk_feedforward);
    +     362             : 
    +     363             :   // output mode
    +     364         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "so3/preferred_output", drs_params_.preferred_output_mode);
    +     365             : 
    +     366             :   // | ------------------- position pid params ------------------ |
    +     367             : 
    +     368         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "position_controller/translation_gains/p", _pos_pid_p_);
    +     369         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "position_controller/translation_gains/i", _pos_pid_i_);
    +     370         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "position_controller/translation_gains/d", _pos_pid_d_);
    +     371             : 
    +     372         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "position_controller/heading_gains/p", _hdg_pid_p_);
    +     373         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "position_controller/heading_gains/i", _hdg_pid_i_);
    +     374         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "position_controller/heading_gains/d", _hdg_pid_d_);
    +     375             : 
    +     376         182 :   if (!private_handlers->param_loader->loadedSuccessfully()) {
    +     377           0 :     ROS_ERROR("[%s]: Could not load all parameters!", this->name_.c_str());
    +     378           0 :     return false;
    +     379             :   }
    +     380             : 
    +     381             :   // | ---------------- prepare stuff from params --------------- |
    +     382             : 
    +     383         182 :   if (!(drs_params_.preferred_output_mode == OUTPUT_ACTUATORS || drs_params_.preferred_output_mode == OUTPUT_CONTROL_GROUP ||
    +     384         182 :         drs_params_.preferred_output_mode == OUTPUT_ATTITUDE_RATE || drs_params_.preferred_output_mode == OUTPUT_ATTITUDE)) {
    +     385           0 :     ROS_ERROR("[%s]: preferred output mode has to be {0, 1, 2, 3}!", this->name_.c_str());
    +     386           0 :     return false;
    +     387             :   }
    +     388             : 
    +     389         182 :   uav_mass_difference_ = 0;
    +     390         182 :   Iw_w_                = Eigen::Vector2d::Zero(2);
    +     391         182 :   Ib_b_                = Eigen::Vector2d::Zero(2);
    +     392             : 
    +     393             :   // | ----------------- prepare the MPC solver ----------------- |
    +     394             : 
    +     395         182 :   mpc_solver_x_ = std::make_shared<mrs_mpc_solvers::mpc_controller::Solver>(name_, _mpc_solver_verbose_, _mpc_solver_max_iterations_, _mat_Q_, _mat_S_, _dt1_,
    +     396         182 :                                                                             _dt2_, 0, 1.0);
    +     397         182 :   mpc_solver_y_ = std::make_shared<mrs_mpc_solvers::mpc_controller::Solver>(name_, _mpc_solver_verbose_, _mpc_solver_max_iterations_, _mat_Q_, _mat_S_, _dt1_,
    +     398         182 :                                                                             _dt2_, 0, 1.0);
    +     399         182 :   mpc_solver_z_ = std::make_shared<mrs_mpc_solvers::mpc_controller::Solver>(name_, _mpc_solver_verbose_, _mpc_solver_max_iterations_, _mat_Q_z_, _mat_S_z_,
    +     400         182 :                                                                             _dt1_, _dt2_, 0.5, 0.5);
    +     401             : 
    +     402             :   // | --------------- dynamic reconfigure server --------------- |
    +     403             : 
    +     404         182 :   drs_params_.kiwxy         = gains_.kiwxy;
    +     405         182 :   drs_params_.kibxy         = gains_.kibxy;
    +     406         182 :   drs_params_.kq_roll_pitch = gains_.kq_roll_pitch;
    +     407         182 :   drs_params_.kq_yaw        = gains_.kq_yaw;
    +     408         182 :   drs_params_.km            = gains_.km;
    +     409         182 :   drs_params_.km_lim        = gains_.km_lim;
    +     410         182 :   drs_params_.kiwxy_lim     = gains_.kiwxy_lim;
    +     411         182 :   drs_params_.kibxy_lim     = gains_.kibxy_lim;
    +     412             : 
    +     413         182 :   drs_.reset(new Drs_t(mutex_drs_, nh_));
    +     414         182 :   drs_->updateConfig(drs_params_);
    +     415         182 :   Drs_t::CallbackType f = boost::bind(&MpcController::callbackDrs, this, _1, _2);
    +     416         182 :   drs_->setCallback(f);
    +     417             : 
    +     418             :   // | --------------------- service servers -------------------- |
    +     419             : 
    +     420         182 :   service_set_integral_terms_ = nh_.advertiseService("set_integral_terms_in", &MpcController::callbackSetIntegralTerms, this);
    +     421             : 
    +     422             :   // | ------------------------- timers ------------------------- |
    +     423             : 
    +     424         182 :   timer_gains_ = nh_.createTimer(ros::Rate(_gain_filtering_rate_), &MpcController::timerGains, this, false, false);
    +     425             : 
    +     426             :   // | ---------------------- position pid ---------------------- |
    +     427             : 
    +     428         182 :   position_pid_x_.setParams(_pos_pid_p_, _pos_pid_d_, _pos_pid_i_, -1, 1.0);
    +     429         182 :   position_pid_y_.setParams(_pos_pid_p_, _pos_pid_d_, _pos_pid_i_, -1, 1.0);
    +     430         182 :   position_pid_z_.setParams(_pos_pid_p_, _pos_pid_d_, _pos_pid_i_, -1, 1.0);
    +     431         182 :   position_pid_heading_.setParams(_hdg_pid_p_, _hdg_pid_d_, _hdg_pid_i_, -1, 0.1);
    +     432             : 
    +     433             :   // | ------------------------ profiler ------------------------ |
    +     434             : 
    +     435         182 :   profiler_ = mrs_lib::Profiler(common_handlers->parent_nh, "MpcController", _profiler_enabled_);
    +     436             : 
    +     437             :   // | ----------------------- finish init ---------------------- |
    +     438             : 
    +     439         182 :   ROS_INFO("[%s]: initialized", this->name_.c_str());
    +     440             : 
    +     441         182 :   is_initialized_ = true;
    +     442             : 
    +     443         182 :   return true;
    +     444             : }
    +     445             : 
    +     446             : //}
    +     447             : 
    +     448             : /* //{ activate() */
    +     449             : 
    +     450         194 : bool MpcController::activate(const ControlOutput &last_control_output) {
    +     451             : 
    +     452         194 :   activation_control_output_ = last_control_output;
    +     453             : 
    +     454         194 :   double activation_mass = _uav_mass_;
    +     455             : 
    +     456         194 :   if (activation_control_output_.diagnostics.mass_estimator) {
    +     457           7 :     uav_mass_difference_ = activation_control_output_.diagnostics.mass_difference;
    +     458           7 :     activation_mass += uav_mass_difference_;
    +     459           7 :     ROS_INFO("[%s]: setting mass difference from the last control output: %.2f kg", this->name_.c_str(), uav_mass_difference_);
    +     460             :   }
    +     461             : 
    +     462         194 :   last_control_output_.diagnostics.controller_enforcing_constraints = false;
    +     463             : 
    +     464         194 :   if (activation_control_output_.diagnostics.disturbance_estimator) {
    +     465           7 :     Ib_b_[0] = -activation_control_output_.diagnostics.disturbance_bx_b;
    +     466           7 :     Ib_b_[1] = -activation_control_output_.diagnostics.disturbance_by_b;
    +     467             : 
    +     468           7 :     Iw_w_[0] = -activation_control_output_.diagnostics.disturbance_wx_w;
    +     469           7 :     Iw_w_[1] = -activation_control_output_.diagnostics.disturbance_wy_w;
    +     470             : 
    +     471           7 :     ROS_INFO(
    +     472             :         "[%s]: setting disturbances from the last control output: Ib_b_: %.2f, %.2f N, Iw_w_: "
    +     473             :         "%.2f, %.2f N",
    +     474             :         this->name_.c_str(), Ib_b_[0], Ib_b_[1], Iw_w_[0], Iw_w_[1]);
    +     475             :   }
    +     476             : 
    +     477             :   // did the last controller use manual throttle control?
    +     478         194 :   auto throttle_last_controller = common::extractThrottle(activation_control_output_);
    +     479             : 
    +     480             :   // rampup check
    +     481         194 :   if (_rampup_enabled_ && throttle_last_controller) {
    +     482             : 
    +     483          65 :     double hover_throttle = mrs_lib::quadratic_throttle_model::forceToThrottle(common_handlers_->throttle_model, activation_mass * common_handlers_->g);
    +     484             : 
    +     485          65 :     double throttle_difference = hover_throttle - throttle_last_controller.value();
    +     486             : 
    +     487          65 :     if (throttle_difference > 0) {
    +     488          33 :       rampup_direction_ = 1;
    +     489          32 :     } else if (throttle_difference < 0) {
    +     490           3 :       rampup_direction_ = -1;
    +     491             :     } else {
    +     492          29 :       rampup_direction_ = 0;
    +     493             :     }
    +     494             : 
    +     495          65 :     ROS_INFO("[%s]: activating rampup with initial throttle: %.4f, target: %.4f", name_.c_str(), throttle_last_controller.value(), hover_throttle);
    +     496             : 
    +     497          65 :     rampup_active_     = true;
    +     498          65 :     rampup_start_time_ = ros::Time::now();
    +     499          65 :     rampup_last_time_  = ros::Time::now();
    +     500          65 :     rampup_throttle_   = throttle_last_controller.value();
    +     501             : 
    +     502          65 :     rampup_duration_ = fabs(throttle_difference) / _rampup_speed_;
    +     503             :   }
    +     504             : 
    +     505         194 :   first_iteration_ = true;
    +     506         194 :   mute_gains_      = true;
    +     507             : 
    +     508         194 :   timer_gains_.start();
    +     509             : 
    +     510         194 :   ROS_INFO("[%s]: activated", this->name_.c_str());
    +     511             : 
    +     512         194 :   is_active_ = true;
    +     513             : 
    +     514         194 :   return true;
    +     515             : }
    +     516             : 
    +     517             : //}
    +     518             : 
    +     519             : /* //{ deactivate() */
    +     520             : 
    +     521         156 : void MpcController::deactivate(void) {
    +     522             : 
    +     523         156 :   is_active_           = false;
    +     524         156 :   first_iteration_     = false;
    +     525         156 :   uav_mass_difference_ = 0;
    +     526             : 
    +     527         156 :   timer_gains_.stop();
    +     528             : 
    +     529         156 :   ROS_INFO("[%s]: deactivated", this->name_.c_str());
    +     530         156 : }
    +     531             : 
    +     532             : //}
    +     533             : 
    +     534             : /* updateInactive() //{ */
    +     535             : 
    +     536      203582 : void MpcController::updateInactive(const mrs_msgs::UavState &uav_state, [[maybe_unused]] const std::optional<mrs_msgs::TrackerCommand> &tracker_command) {
    +     537             : 
    +     538      203582 :   mrs_lib::set_mutexed(mutex_uav_state_, uav_state, uav_state_);
    +     539             : 
    +     540      203582 :   last_update_time_ = uav_state.header.stamp;
    +     541             : 
    +     542      203582 :   first_iteration_ = false;
    +     543      203582 : }
    +     544             : 
    +     545             : //}
    +     546             : 
    +     547             : /* //{ updateWhenAcctive() */
    +     548             : 
    +     549       56468 : MpcController::ControlOutput MpcController::updateActive(const mrs_msgs::UavState &uav_state, const mrs_msgs::TrackerCommand &tracker_command) {
    +     550             : 
    +     551      169404 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("updateActive");
    +     552      169404 :   mrs_lib::ScopeTimer timer = mrs_lib::ScopeTimer("MpcController::updateActive", common_handlers_->scope_timer.logger, common_handlers_->scope_timer.enabled);
    +     553             : 
    +     554      112936 :   auto drs_params = mrs_lib::get_mutexed(mutex_drs_params_, drs_params_);
    +     555             : 
    +     556       56468 :   mrs_lib::set_mutexed(mutex_uav_state_, uav_state, uav_state_);
    +     557             : 
    +     558       56468 :   last_control_output_.desired_heading_rate          = {};
    +     559       56468 :   last_control_output_.desired_orientation           = {};
    +     560       56468 :   last_control_output_.desired_unbiased_acceleration = {};
    +     561       56468 :   last_control_output_.control_output                = {};
    +     562             : 
    +     563       56468 :   if (!is_active_) {
    +     564           0 :     return last_control_output_;
    +     565             :   }
    +     566             : 
    +     567             :   // | -------------------- calculate the dt -------------------- |
    +     568             : 
    +     569             :   double dt;
    +     570             : 
    +     571       56468 :   if (first_iteration_) {
    +     572          67 :     dt               = 0.01;
    +     573          67 :     first_iteration_ = false;
    +     574             :   } else {
    +     575       56401 :     dt = (uav_state.header.stamp - last_update_time_).toSec();
    +     576             :   }
    +     577             : 
    +     578       56468 :   last_update_time_ = uav_state.header.stamp;
    +     579             : 
    +     580       56468 :   if (fabs(dt) < 0.001) {
    +     581             : 
    +     582           0 :     ROS_DEBUG("[%s]: the last odometry message came too close (%.2f s)!", name_.c_str(), dt);
    +     583             : 
    +     584           0 :     dt = 0.01;
    +     585             :   }
    +     586             : 
    +     587             :   // | ----------- obtain the lowest possible modality ---------- |
    +     588             : 
    +     589       56468 :   auto lowest_modality = common::getLowestOuput(common_handlers_->control_output_modalities);
    +     590             : 
    +     591       56468 :   if (!lowest_modality) {
    +     592             : 
    +     593           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: output modalities are empty! This error should never appear.", name_.c_str());
    +     594             : 
    +     595           0 :     return last_control_output_;
    +     596             :   }
    +     597             : 
    +     598             :   // | ----- we might prefer some output mode over the other ---- |
    +     599             : 
    +     600       56468 :   if (drs_params.preferred_output_mode == OUTPUT_ATTITUDE_RATE && common_handlers_->control_output_modalities.attitude_rate) {
    +     601       51083 :     ROS_DEBUG_THROTTLE(1.0, "[%s]: prioritizing attitude rate output", name_.c_str());
    +     602       51083 :     lowest_modality = common::ATTITUDE_RATE;
    +     603        5385 :   } else if (drs_params.preferred_output_mode == OUTPUT_ATTITUDE && common_handlers_->control_output_modalities.attitude) {
    +     604           0 :     ROS_DEBUG_THROTTLE(1.0, "[%s]: prioritizing attitude output", name_.c_str());
    +     605           0 :     lowest_modality = common::ATTITUDE;
    +     606        5385 :   } else if (drs_params.preferred_output_mode == OUTPUT_CONTROL_GROUP && common_handlers_->control_output_modalities.control_group) {
    +     607           0 :     ROS_DEBUG_THROTTLE(1.0, "[%s]: prioritizing control group output", name_.c_str());
    +     608           0 :     lowest_modality = common::CONTROL_GROUP;
    +     609        5385 :   } else if (drs_params.preferred_output_mode == OUTPUT_ACTUATORS && common_handlers_->control_output_modalities.actuators) {
    +     610           0 :     ROS_DEBUG_THROTTLE(1.0, "[%s]: prioritizing actuators output", name_.c_str());
    +     611           0 :     lowest_modality = common::ACTUATORS_CMD;
    +     612             :   }
    +     613             : 
    +     614       56468 :   switch (lowest_modality.value()) {
    +     615             : 
    +     616         251 :     case common::POSITION: {
    +     617         251 :       positionPassthrough(uav_state, tracker_command);
    +     618         251 :       break;
    +     619             :     }
    +     620             : 
    +     621         225 :     case common::VELOCITY_HDG: {
    +     622         225 :       PIDVelocityOutput(uav_state, tracker_command, common::VELOCITY_HDG, dt);
    +     623         225 :       break;
    +     624             :     }
    +     625             : 
    +     626         466 :     case common::VELOCITY_HDG_RATE: {
    +     627         466 :       PIDVelocityOutput(uav_state, tracker_command, common::VELOCITY_HDG_RATE, dt);
    +     628         466 :       break;
    +     629             :     }
    +     630             : 
    +     631         487 :     case common::ACCELERATION_HDG: {
    +     632         487 :       MPC(uav_state, tracker_command, dt, common::ACCELERATION_HDG);
    +     633         487 :       break;
    +     634             :     }
    +     635             : 
    +     636         473 :     case common::ACCELERATION_HDG_RATE: {
    +     637         473 :       MPC(uav_state, tracker_command, dt, common::ACCELERATION_HDG_RATE);
    +     638         473 :       break;
    +     639             :     }
    +     640             : 
    +     641        1083 :     case common::ATTITUDE: {
    +     642        1083 :       MPC(uav_state, tracker_command, dt, common::ATTITUDE);
    +     643        1083 :       break;
    +     644             :     }
    +     645             : 
    +     646       51083 :     case common::ATTITUDE_RATE: {
    +     647       51083 :       MPC(uav_state, tracker_command, dt, common::ATTITUDE_RATE);
    +     648       51083 :       break;
    +     649             :     }
    +     650             : 
    +     651        1205 :     case common::CONTROL_GROUP: {
    +     652        1205 :       MPC(uav_state, tracker_command, dt, common::CONTROL_GROUP);
    +     653        1205 :       break;
    +     654             :     }
    +     655             : 
    +     656        1195 :     case common::ACTUATORS_CMD: {
    +     657        1195 :       MPC(uav_state, tracker_command, dt, common::ACTUATORS_CMD);
    +     658        1195 :       break;
    +     659             :     }
    +     660             : 
    +     661           0 :     default: {
    +     662           0 :       break;
    +     663             :     }
    +     664             :   }
    +     665             : 
    +     666       56468 :   return last_control_output_;
    +     667             : }
    +     668             : 
    +     669             : //}
    +     670             : 
    +     671             : /* //{ getStatus() */
    +     672             : 
    +     673       12525 : const mrs_msgs::ControllerStatus MpcController::getStatus() {
    +     674             : 
    +     675       12525 :   mrs_msgs::ControllerStatus controller_status;
    +     676             : 
    +     677       12525 :   controller_status.active = is_active_;
    +     678             : 
    +     679       12525 :   return controller_status;
    +     680             : }
    +     681             : 
    +     682             : //}
    +     683             : 
    +     684             : /* switchOdometrySource() //{ */
    +     685             : 
    +     686           5 : void MpcController::switchOdometrySource(const mrs_msgs::UavState &new_uav_state) {
    +     687             : 
    +     688           5 :   ROS_INFO("[%s]: switching the odometry source", this->name_.c_str());
    +     689             : 
    +     690          10 :   auto uav_state = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +     691             : 
    +     692             :   // | ----- transform world disturabances to the new frame ----- |
    +     693             : 
    +     694          10 :   geometry_msgs::Vector3Stamped world_integrals;
    +     695             : 
    +     696           5 :   world_integrals.header.stamp    = ros::Time::now();
    +     697           5 :   world_integrals.header.frame_id = uav_state.header.frame_id;
    +     698             : 
    +     699           5 :   world_integrals.vector.x = Iw_w_[0];
    +     700           5 :   world_integrals.vector.y = Iw_w_[1];
    +     701           5 :   world_integrals.vector.z = 0;
    +     702             : 
    +     703          10 :   auto res = common_handlers_->transformer->transformSingle(world_integrals, new_uav_state.header.frame_id);
    +     704             : 
    +     705           5 :   if (res) {
    +     706             : 
    +     707           5 :     std::scoped_lock lock(mutex_integrals_);
    +     708             : 
    +     709           5 :     Iw_w_[0] = res.value().vector.x;
    +     710           5 :     Iw_w_[1] = res.value().vector.y;
    +     711             : 
    +     712             :   } else {
    +     713             : 
    +     714           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: could not transform world integral to the new frame", this->name_.c_str());
    +     715             : 
    +     716           0 :     std::scoped_lock lock(mutex_integrals_);
    +     717             : 
    +     718           0 :     Iw_w_[0] = 0;
    +     719           0 :     Iw_w_[1] = 0;
    +     720             :   }
    +     721           5 : }
    +     722             : 
    +     723             : //}
    +     724             : 
    +     725             : /* resetDisturbanceEstimators() //{ */
    +     726             : 
    +     727           0 : void MpcController::resetDisturbanceEstimators(void) {
    +     728             : 
    +     729           0 :   std::scoped_lock lock(mutex_integrals_);
    +     730             : 
    +     731           0 :   Iw_w_ = Eigen::Vector2d::Zero(2);
    +     732           0 :   Ib_b_ = Eigen::Vector2d::Zero(2);
    +     733           0 : }
    +     734             : 
    +     735             : //}
    +     736             : 
    +     737             : /* setConstraints() //{ */
    +     738             : 
    +     739         720 : const mrs_msgs::DynamicsConstraintsSrvResponse::ConstPtr MpcController::setConstraints([
    +     740             :     [maybe_unused]] const mrs_msgs::DynamicsConstraintsSrvRequest::ConstPtr &constraints) {
    +     741             : 
    +     742         720 :   if (!is_initialized_) {
    +     743           0 :     return mrs_msgs::DynamicsConstraintsSrvResponse::ConstPtr(new mrs_msgs::DynamicsConstraintsSrvResponse());
    +     744             :   }
    +     745             : 
    +     746         720 :   mrs_lib::set_mutexed(mutex_constraints_, constraints->constraints, constraints_);
    +     747             : 
    +     748         720 :   ROS_INFO("[%s]: updating constraints", this->name_.c_str());
    +     749             : 
    +     750        1440 :   mrs_msgs::DynamicsConstraintsSrvResponse res;
    +     751         720 :   res.success = true;
    +     752         720 :   res.message = "constraints updated";
    +     753             : 
    +     754         720 :   return mrs_msgs::DynamicsConstraintsSrvResponse::ConstPtr(new mrs_msgs::DynamicsConstraintsSrvResponse(res));
    +     755             : }
    +     756             : 
    +     757             : //}
    +     758             : 
    +     759             : // --------------------------------------------------------------
    +     760             : // |                         controllers                        |
    +     761             : // --------------------------------------------------------------
    +     762             : 
    +     763             : /* Mpc() //{ */
    +     764             : 
    +     765       55526 : void MpcController::MPC(const mrs_msgs::UavState &uav_state, const mrs_msgs::TrackerCommand &tracker_command, const double &dt,
    +     766             :                         const common::CONTROL_OUTPUT &output_modality) {
    +     767             : 
    +     768      111052 :   auto drs_params  = mrs_lib::get_mutexed(mutex_drs_params_, drs_params_);
    +     769       55526 :   auto constraints = mrs_lib::get_mutexed(mutex_constraints_, constraints_);
    +     770       55526 :   auto gains       = mrs_lib::get_mutexed(mutex_gains_, gains_);
    +     771             : 
    +     772             :   // | ----------------- get the current heading ---------------- |
    +     773             : 
    +     774       55526 :   double uav_heading = getHeadingSafely(uav_state, tracker_command);
    +     775             : 
    +     776             :   // | ------------------- prepare constraints ------------------ |
    +     777             : 
    +     778       55526 :   double max_speed_horizontal        = _max_speed_horizontal_;
    +     779       55526 :   double max_speed_vertical          = _max_speed_vertical_;
    +     780       55526 :   double max_acceleration_horizontal = _max_acceleration_horizontal_;
    +     781       55526 :   double max_acceleration_vertical   = _max_acceleration_vertical_;
    +     782       55526 :   double max_jerk                    = _max_jerk_;
    +     783       55526 :   double max_u_vertical              = _max_u_vertical_;
    +     784             : 
    +     785       55526 :   if (tracker_command.use_full_state_prediction) {
    +     786             : 
    +     787       36685 :     max_speed_horizontal = 1.5 * (constraints.horizontal_speed);
    +     788       36685 :     max_speed_vertical   = 1.5 * (constraints.vertical_ascending_speed < constraints.vertical_descending_speed ? constraints.vertical_ascending_speed
    +     789             :                                                                                                              : constraints.vertical_descending_speed);
    +     790             : 
    +     791       36685 :     max_acceleration_horizontal = 1.5 * (constraints.horizontal_acceleration);
    +     792       36685 :     max_acceleration_vertical =
    +     793       36685 :         1.5 * (constraints.vertical_ascending_acceleration < constraints.vertical_descending_acceleration ? constraints.vertical_ascending_acceleration
    +     794             :                                                                                                           : constraints.vertical_descending_acceleration);
    +     795             : 
    +     796       36685 :     max_jerk       = 1.5 * constraints.horizontal_jerk;
    +     797       36685 :     max_u_vertical = 1.5 * (constraints.vertical_ascending_jerk < constraints.vertical_descending_jerk ? constraints.vertical_ascending_jerk
    +     798             :                                                                                                        : constraints.vertical_descending_jerk);
    +     799             :   }
    +     800             : 
    +     801             :   // --------------------------------------------------------------
    +     802             :   // |          load the control reference and estimates          |
    +     803             :   // --------------------------------------------------------------
    +     804             : 
    +     805             :   // Rp - position reference in global frame
    +     806             :   // Rv - velocity reference in global frame
    +     807             :   // Ra - velocity reference in global frame
    +     808             : 
    +     809       55526 :   Eigen::Vector3d Rp = Eigen::Vector3d::Zero(3);
    +     810       55526 :   Eigen::Vector3d Rv = Eigen::Vector3d::Zero(3);
    +     811       55526 :   Eigen::Vector3d Ra = Eigen::Vector3d::Zero(3);
    +     812             : 
    +     813       55526 :   Rp << tracker_command.position.x, tracker_command.position.y, tracker_command.position.z;  // fill the desired position
    +     814       55526 :   Rv << tracker_command.velocity.x, tracker_command.velocity.y, tracker_command.velocity.z;
    +     815             : 
    +     816             :   // | ------ store the estimated values from the uav state ----- |
    +     817             : 
    +     818             :   // Op - position in global frame
    +     819             :   // Ov - velocity in global frame
    +     820       55526 :   Eigen::Vector3d Op(uav_state.pose.position.x, uav_state.pose.position.y, uav_state.pose.position.z);
    +     821       55526 :   Eigen::Vector3d Ov(uav_state.velocity.linear.x, uav_state.velocity.linear.y, uav_state.velocity.linear.z);
    +     822             : 
    +     823             :   // R - current uav attitude
    +     824       55526 :   Eigen::Matrix3d R = mrs_lib::AttitudeConverter(uav_state.pose.orientation);
    +     825             : 
    +     826             :   // Ow - UAV angular rate
    +     827       55526 :   Eigen::Vector3d Ow(uav_state.velocity.angular.x, uav_state.velocity.angular.y, uav_state.velocity.angular.z);
    +     828             : 
    +     829             :   // --------------------------------------------------------------
    +     830             :   // |                     MPC lateral control                    |
    +     831             :   // --------------------------------------------------------------
    +     832             : 
    +     833             :   // | --------------- calculate the control erros -------------- |
    +     834             : 
    +     835       55526 :   Eigen::Vector3d Ep = Rp - Op;
    +     836       55526 :   Eigen::Vector3d Ev = Rv - Ov;
    +     837             : 
    +     838             :   // | ------------------- initial conditions ------------------- |
    +     839             : 
    +     840      111052 :   Eigen::MatrixXd initial_x = Eigen::MatrixXd::Zero(3, 1);
    +     841      111052 :   Eigen::MatrixXd initial_y = Eigen::MatrixXd::Zero(3, 1);
    +     842      111052 :   Eigen::MatrixXd initial_z = Eigen::MatrixXd::Zero(3, 1);
    +     843             : 
    +     844             :   /* initial x //{ */
    +     845             : 
    +     846             :   {
    +     847             :     double acceleration;
    +     848             :     double velocity;
    +     849       55526 :     double coef = 1.5;
    +     850             : 
    +     851       55526 :     if (fabs(uav_state.acceleration.linear.x) < coef * max_acceleration_horizontal) {
    +     852       55526 :       acceleration = uav_state.acceleration.linear.x;
    +     853             :     } else {
    +     854           0 :       acceleration = tracker_command.acceleration.x;
    +     855             : 
    +     856           0 :       ROS_ERROR_THROTTLE(1.0, "[%s]: odometry x acceleration exceeds constraints (%.2f > %.1f * %.2f m), using reference for initial condition", name_.c_str(),
    +     857             :                          fabs(uav_state.acceleration.linear.x), coef, max_acceleration_horizontal);
    +     858             :     }
    +     859             : 
    +     860       55526 :     if (fabs(uav_state.velocity.linear.x) < coef * max_speed_horizontal) {
    +     861       55526 :       velocity = uav_state.velocity.linear.x;
    +     862             :     } else {
    +     863           0 :       velocity = tracker_command.velocity.x;
    +     864             : 
    +     865           0 :       ROS_ERROR_THROTTLE(1.0, "[%s]: odometry x velocity exceeds constraints (%.2f > %0.1f * %.2f m), using reference for initial condition", name_.c_str(),
    +     866             :                          fabs(uav_state.velocity.linear.x), coef, max_speed_horizontal);
    +     867             :     }
    +     868             : 
    +     869       55526 :     initial_x << uav_state.pose.position.x, velocity, acceleration;
    +     870             :   }
    +     871             : 
    +     872             :   //}
    +     873             : 
    +     874             :   /* initial y //{ */
    +     875             : 
    +     876             :   {
    +     877             :     double acceleration;
    +     878             :     double velocity;
    +     879       55526 :     double coef = 1.5;
    +     880             : 
    +     881       55526 :     if (fabs(uav_state.acceleration.linear.y) < coef * max_acceleration_horizontal) {
    +     882       55526 :       acceleration = uav_state.acceleration.linear.y;
    +     883             :     } else {
    +     884           0 :       acceleration = tracker_command.acceleration.y;
    +     885             : 
    +     886           0 :       ROS_ERROR_THROTTLE(1.0, "[%s]: odometry y acceleration exceeds constraints (%.2f > %.1f * %.2f m), using reference for initial condition", name_.c_str(),
    +     887             :                          fabs(uav_state.acceleration.linear.y), coef, max_acceleration_horizontal);
    +     888             :     }
    +     889             : 
    +     890       55526 :     if (fabs(uav_state.velocity.linear.y) < coef * max_speed_horizontal) {
    +     891       55526 :       velocity = uav_state.velocity.linear.y;
    +     892             :     } else {
    +     893           0 :       velocity = tracker_command.velocity.y;
    +     894             : 
    +     895           0 :       ROS_ERROR_THROTTLE(1.0, "[%s]: odometry y velocity exceeds constraints (%.2f > %0.1f * %.2f m), using reference for initial condition", name_.c_str(),
    +     896             :                          fabs(uav_state.velocity.linear.y), coef, max_speed_horizontal);
    +     897             :     }
    +     898             : 
    +     899       55526 :     initial_y << uav_state.pose.position.y, velocity, acceleration;
    +     900             :   }
    +     901             : 
    +     902             :   //}
    +     903             : 
    +     904             :   /* initial z //{ */
    +     905             : 
    +     906             :   {
    +     907             :     double acceleration;
    +     908             :     double velocity;
    +     909       55526 :     double coef = 1.5;
    +     910             : 
    +     911       55526 :     if (fabs(uav_state.acceleration.linear.z) < coef * max_acceleration_horizontal) {
    +     912       55526 :       acceleration = uav_state.acceleration.linear.z;
    +     913             :     } else {
    +     914           0 :       acceleration = tracker_command.acceleration.z;
    +     915             : 
    +     916           0 :       ROS_ERROR_THROTTLE(1.0, "[%s]: odometry z acceleration exceeds constraints (%.2f > %.1f * %.2f m), using reference for initial condition", name_.c_str(),
    +     917             :                          fabs(uav_state.acceleration.linear.z), coef, max_acceleration_horizontal);
    +     918             :     }
    +     919             : 
    +     920       55526 :     if (fabs(uav_state.velocity.linear.z) < coef * max_speed_vertical) {
    +     921       55526 :       velocity = uav_state.velocity.linear.z;
    +     922             :     } else {
    +     923           0 :       velocity = tracker_command.velocity.z;
    +     924             : 
    +     925           0 :       ROS_ERROR_THROTTLE(1.0, "[%s]: odometry z velocity exceeds constraints (%.2f > %0.1f * %.2f m), using reference for initial condition", name_.c_str(),
    +     926             :                          fabs(uav_state.velocity.linear.z), coef, max_speed_vertical);
    +     927             :     }
    +     928             : 
    +     929       55526 :     initial_z << uav_state.pose.position.z, velocity, acceleration;
    +     930             :   }
    +     931             : 
    +     932             :   //}
    +     933             : 
    +     934             :   // | ---------------------- set reference --------------------- |
    +     935             : 
    +     936      111052 :   Eigen::MatrixXd mpc_reference_x = Eigen::MatrixXd::Zero(_horizon_length_ * _n_states_, 1);
    +     937      111052 :   Eigen::MatrixXd mpc_reference_y = Eigen::MatrixXd::Zero(_horizon_length_ * _n_states_, 1);
    +     938      111052 :   Eigen::MatrixXd mpc_reference_z = Eigen::MatrixXd::Zero(_horizon_length_ * _n_states_, 1);
    +     939             : 
    +     940             :   // prepare the full reference vector
    +     941       55526 :   if (tracker_command.use_full_state_prediction) {
    +     942             : 
    +     943       36685 :     mpc_reference_x(0, 0) = tracker_command.position.x;
    +     944       36685 :     mpc_reference_y(0, 0) = tracker_command.position.y;
    +     945       36685 :     mpc_reference_z(0, 0) = tracker_command.position.z;
    +     946             : 
    +     947             :     // TODO !! this is a very crude way of sampling from the desired full-state prediction, which only works
    +     948             :     // with the MpcTracker. Rework this please.
    +     949             : 
    +     950      953810 :     for (int i = 1; i < _horizon_length_; i++) {
    +     951      917125 :       mpc_reference_x((i * _n_states_) + 0, 0) = tracker_command.full_state_prediction.position[i].x;
    +     952      917125 :       mpc_reference_y((i * _n_states_) + 0, 0) = tracker_command.full_state_prediction.position[i].y;
    +     953      917125 :       mpc_reference_z((i * _n_states_) + 0, 0) = tracker_command.full_state_prediction.position[i].z;
    +     954             :     }
    +     955             : 
    +     956      953810 :     for (int i = 1; i < _horizon_length_; i++) {
    +     957      917125 :       mpc_reference_x((i * _n_states_) + 1, 0) = tracker_command.full_state_prediction.velocity[i].x;
    +     958      917125 :       mpc_reference_y((i * _n_states_) + 1, 0) = tracker_command.full_state_prediction.velocity[i].y;
    +     959      917125 :       mpc_reference_z((i * _n_states_) + 1, 0) = tracker_command.full_state_prediction.velocity[i].z;
    +     960             :     }
    +     961             : 
    +     962      953810 :     for (int i = 1; i < _horizon_length_; i++) {
    +     963      917125 :       mpc_reference_x((i * _n_states_) + 2, 0) = tracker_command.full_state_prediction.acceleration[i].x;
    +     964      917125 :       mpc_reference_y((i * _n_states_) + 2, 0) = tracker_command.full_state_prediction.acceleration[i].y;
    +     965      917125 :       mpc_reference_z((i * _n_states_) + 2, 0) = tracker_command.full_state_prediction.acceleration[i].z;
    +     966             :     }
    +     967             : 
    +     968             :   } else {
    +     969             : 
    +     970      508707 :     for (int i = 0; i < _horizon_length_; i++) {
    +     971      489866 :       mpc_reference_x((i * _n_states_) + 0, 0) = tracker_command.position.x;
    +     972      489866 :       mpc_reference_y((i * _n_states_) + 0, 0) = tracker_command.position.y;
    +     973      489866 :       mpc_reference_z((i * _n_states_) + 0, 0) = tracker_command.position.z;
    +     974             :     }
    +     975             :   }
    +     976             : 
    +     977             :   // | ------------------ set the penalizations ----------------- |
    +     978             : 
    +     979      111052 :   std::vector<double> temp_Q_horizontal = _mat_Q_;
    +     980      111052 :   std::vector<double> temp_Q_vertical   = _mat_Q_z_;
    +     981             : 
    +     982      111052 :   std::vector<double> temp_S_horizontal = _mat_S_;
    +     983      111052 :   std::vector<double> temp_S_vertical   = _mat_S_z_;
    +     984             : 
    +     985       55526 :   if (!tracker_command.use_position_horizontal) {
    +     986           0 :     temp_Q_horizontal[0] = 0;
    +     987           0 :     temp_S_horizontal[0] = 0;
    +     988             :   }
    +     989             : 
    +     990       55526 :   if (!tracker_command.use_velocity_horizontal) {
    +     991           0 :     temp_Q_horizontal[1] = 0;
    +     992           0 :     temp_S_horizontal[1] = 0;
    +     993             :   }
    +     994             : 
    +     995       55526 :   if (!tracker_command.use_position_vertical) {
    +     996           0 :     temp_Q_vertical[0] = 0;
    +     997           0 :     temp_S_vertical[0] = 0;
    +     998             :   }
    +     999             : 
    +    1000       55526 :   if (!tracker_command.use_velocity_vertical) {
    +    1001           0 :     temp_Q_vertical[1] = 0;
    +    1002           0 :     temp_S_vertical[1] = 0;
    +    1003             :   }
    +    1004             : 
    +    1005             :   // | ------------------------ optimize ------------------------ |
    +    1006             : 
    +    1007       55526 :   mpc_solver_x_->setQ(temp_Q_horizontal);
    +    1008       55526 :   mpc_solver_x_->setS(temp_S_horizontal);
    +    1009       55526 :   mpc_solver_x_->setParams();
    +    1010       55526 :   mpc_solver_x_->setLastInput(mpc_solver_x_u_);
    +    1011       55526 :   mpc_solver_x_->loadReference(mpc_reference_x);
    +    1012       55526 :   mpc_solver_x_->setLimits(max_speed_horizontal, 999, max_acceleration_horizontal, max_jerk, _dt1_, _dt2_);
    +    1013       55526 :   mpc_solver_x_->setInitialState(initial_x);
    +    1014       55526 :   [[maybe_unused]] int iters_x = mpc_solver_x_->solveMPC();
    +    1015       55526 :   mpc_solver_x_u_              = mpc_solver_x_->getFirstControlInput();
    +    1016             : 
    +    1017       55526 :   mpc_solver_y_->setQ(temp_Q_horizontal);
    +    1018       55526 :   mpc_solver_y_->setS(temp_S_horizontal);
    +    1019       55526 :   mpc_solver_y_->setParams();
    +    1020       55526 :   mpc_solver_y_->setLastInput(mpc_solver_y_u_);
    +    1021       55526 :   mpc_solver_y_->loadReference(mpc_reference_y);
    +    1022       55526 :   mpc_solver_y_->setLimits(max_speed_horizontal, 999, max_acceleration_horizontal, max_jerk, _dt1_, _dt2_);
    +    1023       55526 :   mpc_solver_y_->setInitialState(initial_y);
    +    1024       55526 :   [[maybe_unused]] int iters_y = mpc_solver_y_->solveMPC();
    +    1025       55526 :   mpc_solver_y_u_              = mpc_solver_y_->getFirstControlInput();
    +    1026             : 
    +    1027       55526 :   mpc_solver_z_->setQ(temp_Q_vertical);
    +    1028       55526 :   mpc_solver_z_->setS(temp_S_vertical);
    +    1029       55526 :   mpc_solver_z_->setParams();
    +    1030       55526 :   mpc_solver_z_->setLastInput(mpc_solver_z_u_);
    +    1031       55526 :   mpc_solver_z_->loadReference(mpc_reference_z);
    +    1032       55526 :   mpc_solver_z_->setLimits(max_speed_vertical, max_acceleration_vertical, max_u_vertical, 999.0, _dt1_, _dt2_);
    +    1033       55526 :   mpc_solver_z_->setInitialState(initial_z);
    +    1034       55526 :   [[maybe_unused]] int iters_z = mpc_solver_z_->solveMPC();
    +    1035       55526 :   mpc_solver_z_u_              = mpc_solver_z_->getFirstControlInput();
    +    1036             : 
    +    1037             :   // | ----------- disable lateral feedback if needed ----------- |
    +    1038             : 
    +    1039       55526 :   if (tracker_command.disable_position_gains) {
    +    1040           0 :     mpc_solver_x_u_ = 0;
    +    1041           0 :     mpc_solver_y_u_ = 0;
    +    1042             :   }
    +    1043             : 
    +    1044             :   // | --------------------- load the gains --------------------- |
    +    1045             : 
    +    1046       55526 :   mute_gains_by_tracker_ = tracker_command.disable_position_gains;
    +    1047             : 
    +    1048       55526 :   Eigen::Array3d Kw(0, 0, 0);
    +    1049       55526 :   Eigen::Array3d Kq;
    +    1050             : 
    +    1051             :   {
    +    1052       55526 :     std::scoped_lock lock(mutex_gains_);
    +    1053             : 
    +    1054       55526 :     Kq << gains.kq_roll_pitch, gains.kq_roll_pitch, gains.kq_yaw;
    +    1055             : 
    +    1056       55526 :     Kw[0] = gains.kw_rp;
    +    1057       55526 :     Kw[1] = gains.kw_rp;
    +    1058       55526 :     Kw[2] = gains.kw_y;
    +    1059             :   }
    +    1060             : 
    +    1061             :   // | ---------- desired orientation matrix and force ---------- |
    +    1062             : 
    +    1063             :   // get body integral in the world frame
    +    1064             : 
    +    1065       55526 :   Eigen::Vector2d Ib_w = Eigen::Vector2d(0, 0);
    +    1066             : 
    +    1067             :   {
    +    1068             : 
    +    1069      111052 :     geometry_msgs::Vector3Stamped Ib_b_stamped;
    +    1070             : 
    +    1071       55526 :     Ib_b_stamped.header.stamp    = ros::Time::now();
    +    1072       55526 :     Ib_b_stamped.header.frame_id = "fcu_untilted";
    +    1073       55526 :     Ib_b_stamped.vector.x        = Ib_b_(0);
    +    1074       55526 :     Ib_b_stamped.vector.y        = Ib_b_(1);
    +    1075       55526 :     Ib_b_stamped.vector.z        = 0;
    +    1076             : 
    +    1077      111052 :     auto res = common_handlers_->transformer->transformSingle(Ib_b_stamped, uav_state_.header.frame_id);
    +    1078             : 
    +    1079       55526 :     if (res) {
    +    1080       55526 :       Ib_w[0] = res.value().vector.x;
    +    1081       55526 :       Ib_w[1] = res.value().vector.y;
    +    1082             :     } else {
    +    1083           0 :       ROS_ERROR_THROTTLE(1.0, "[%s]: could not transform the Ib_b_ to the world frame", name_.c_str());
    +    1084             :     }
    +    1085             :   }
    +    1086             : 
    +    1087             :   // construct the desired force vector
    +    1088             : 
    +    1089       55526 :   if (tracker_command.use_acceleration && !tracker_command.use_full_state_prediction) {
    +    1090        1605 :     Ra << tracker_command.acceleration.x + mpc_solver_x_u_, tracker_command.acceleration.y + mpc_solver_y_u_, tracker_command.acceleration.z + mpc_solver_z_u_;
    +    1091             :   } else {
    +    1092       53921 :     Ra << mpc_solver_x_u_, mpc_solver_y_u_, mpc_solver_z_u_;
    +    1093             :   }
    +    1094             : 
    +    1095       55526 :   double total_mass = _uav_mass_ + uav_mass_difference_;
    +    1096             : 
    +    1097       55526 :   Eigen::Vector3d feed_forward = total_mass * (Eigen::Vector3d(0, 0, common_handlers_->g) + Ra);
    +    1098             : 
    +    1099       55526 :   Eigen::Vector3d integral_feedback;
    +    1100             :   {
    +    1101       55526 :     std::scoped_lock lock(mutex_integrals_);
    +    1102             : 
    +    1103       55526 :     integral_feedback << Ib_w[0] + Iw_w_[0], Ib_w[1] + Iw_w_[1], 0;
    +    1104             :   }
    +    1105             : 
    +    1106             :   // --------------------------------------------------------------
    +    1107             :   // |                 integrators and estimators                 |
    +    1108             :   // --------------------------------------------------------------
    +    1109             : 
    +    1110             :   /* world error integrator //{ */
    +    1111             : 
    +    1112             :   // --------------------------------------------------------------
    +    1113             :   // |                  integrate the world error                 |
    +    1114             :   // --------------------------------------------------------------
    +    1115             : 
    +    1116             :   {
    +    1117      111052 :     std::scoped_lock lock(mutex_gains_, mutex_integrals_);
    +    1118             : 
    +    1119       55526 :     Eigen::Vector3d integration_switch(1, 1, 0);
    +    1120             : 
    +    1121             :     // integrate the world error
    +    1122             : 
    +    1123             :     // antiwindup
    +    1124       55526 :     double temp_gain = gains.kiwxy;
    +    1125       55526 :     if (!tracker_command.disable_antiwindups) {
    +    1126       46893 :       if (rampup_active_ || sqrt(pow(uav_state.velocity.linear.x, 2) + pow(uav_state.velocity.linear.y, 2)) > 0.3) {
    +    1127       18668 :         temp_gain = 0;
    +    1128       18668 :         ROS_DEBUG_THROTTLE(1.0, "[%s]: anti-windup for world integral kicks in", this->name_.c_str());
    +    1129             :       }
    +    1130             :     }
    +    1131             : 
    +    1132       55526 :     if (integral_terms_enabled_) {
    +    1133       55526 :       if (tracker_command.use_position_horizontal) {
    +    1134       55526 :         Iw_w_ += temp_gain * Ep.head(2) * dt;
    +    1135           0 :       } else if (tracker_command.use_velocity_horizontal) {
    +    1136           0 :         Iw_w_ += temp_gain * Ev.head(2) * dt;
    +    1137             :       }
    +    1138             :     }
    +    1139             : 
    +    1140             :     // saturate the world X
    +    1141       55526 :     bool world_integral_saturated = false;
    +    1142       55526 :     if (!std::isfinite(Iw_w_[0])) {
    +    1143           0 :       Iw_w_[0] = 0;
    +    1144           0 :       ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable 'Iw_w_[0]', setting it to 0!!!", this->name_.c_str());
    +    1145       55526 :     } else if (Iw_w_[0] > gains.kiwxy_lim) {
    +    1146           0 :       Iw_w_[0]                 = gains.kiwxy_lim;
    +    1147           0 :       world_integral_saturated = true;
    +    1148       55526 :     } else if (Iw_w_[0] < -gains.kiwxy_lim) {
    +    1149           0 :       Iw_w_[0]                 = -gains.kiwxy_lim;
    +    1150           0 :       world_integral_saturated = true;
    +    1151             :     }
    +    1152             : 
    +    1153       55526 :     if (gains.kiwxy_lim >= 0 && world_integral_saturated) {
    +    1154           0 :       ROS_WARN_THROTTLE(1.0, "[%s]: MPC's world X integral is being saturated!", this->name_.c_str());
    +    1155             :     }
    +    1156             : 
    +    1157             :     // saturate the world Y
    +    1158       55526 :     world_integral_saturated = false;
    +    1159       55526 :     if (!std::isfinite(Iw_w_[1])) {
    +    1160           0 :       Iw_w_[1] = 0;
    +    1161           0 :       ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable 'Iw_w_[1]', setting it to 0!!!", this->name_.c_str());
    +    1162       55526 :     } else if (Iw_w_[1] > gains.kiwxy_lim) {
    +    1163           0 :       Iw_w_[1]                 = gains.kiwxy_lim;
    +    1164           0 :       world_integral_saturated = true;
    +    1165       55526 :     } else if (Iw_w_[1] < -gains.kiwxy_lim) {
    +    1166           0 :       Iw_w_[1]                 = -gains.kiwxy_lim;
    +    1167           0 :       world_integral_saturated = true;
    +    1168             :     }
    +    1169             : 
    +    1170       55526 :     if (gains.kiwxy_lim >= 0 && world_integral_saturated) {
    +    1171           0 :       ROS_WARN_THROTTLE(1.0, "[%s]: MPC's world Y integral is being saturated!", this->name_.c_str());
    +    1172             :     }
    +    1173             :   }
    +    1174             : 
    +    1175             :   //}
    +    1176             : 
    +    1177             :   /* body error integrator //{ */
    +    1178             : 
    +    1179             :   {
    +    1180      111052 :     std::scoped_lock lock(mutex_gains_);
    +    1181             : 
    +    1182       55526 :     Eigen::Vector2d Ep_fcu_untilted = Eigen::Vector2d(0, 0);  // position error in the untilted frame of the UAV
    +    1183       55526 :     Eigen::Vector2d Ev_fcu_untilted = Eigen::Vector2d(0, 0);  // velocity error in the untilted frame of the UAV
    +    1184             : 
    +    1185             :     // get the position control error in the fcu_untilted frame
    +    1186             :     {
    +    1187             : 
    +    1188      111052 :       geometry_msgs::Vector3Stamped Ep_stamped;
    +    1189             : 
    +    1190       55526 :       Ep_stamped.header.stamp    = ros::Time::now();
    +    1191       55526 :       Ep_stamped.header.frame_id = uav_state_.header.frame_id;
    +    1192       55526 :       Ep_stamped.vector.x        = Ep(0);
    +    1193       55526 :       Ep_stamped.vector.y        = Ep(1);
    +    1194       55526 :       Ep_stamped.vector.z        = Ep(2);
    +    1195             : 
    +    1196      166578 :       auto res = common_handlers_->transformer->transformSingle(Ep_stamped, "fcu_untilted");
    +    1197             : 
    +    1198       55526 :       if (res) {
    +    1199       55526 :         Ep_fcu_untilted[0] = res.value().vector.x;
    +    1200       55526 :         Ep_fcu_untilted[1] = res.value().vector.y;
    +    1201             :       } else {
    +    1202           0 :         ROS_ERROR_THROTTLE(1.0, "[%s]: could not transform the position error to fcu_untilted", name_.c_str());
    +    1203             :       }
    +    1204             :     }
    +    1205             : 
    +    1206             :     // get the velocity control error in the fcu_untilted frame
    +    1207             :     {
    +    1208      111052 :       geometry_msgs::Vector3Stamped Ev_stamped;
    +    1209             : 
    +    1210       55526 :       Ev_stamped.header.stamp    = ros::Time::now();
    +    1211       55526 :       Ev_stamped.header.frame_id = uav_state_.header.frame_id;
    +    1212       55526 :       Ev_stamped.vector.x        = Ev(0);
    +    1213       55526 :       Ev_stamped.vector.y        = Ev(1);
    +    1214       55526 :       Ev_stamped.vector.z        = Ev(2);
    +    1215             : 
    +    1216      166578 :       auto res = common_handlers_->transformer->transformSingle(Ev_stamped, "fcu_untilted");
    +    1217             : 
    +    1218       55526 :       if (res) {
    +    1219       55526 :         Ev_fcu_untilted[0] = res.value().vector.x;
    +    1220       55526 :         Ev_fcu_untilted[1] = res.value().vector.x;
    +    1221             :       } else {
    +    1222           0 :         ROS_ERROR_THROTTLE(1.0, "[%s]: could not transform the velocity error to fcu_untilted", name_.c_str());
    +    1223             :       }
    +    1224             :     }
    +    1225             : 
    +    1226             :     // integrate the body error
    +    1227             : 
    +    1228             :     // antiwindup
    +    1229       55526 :     double temp_gain = gains.kibxy;
    +    1230       55526 :     if (!tracker_command.disable_antiwindups) {
    +    1231       46893 :       if (rampup_active_ || sqrt(pow(uav_state.velocity.linear.x, 2) + pow(uav_state.velocity.linear.y, 2)) > 0.3) {
    +    1232       18668 :         temp_gain = 0;
    +    1233       18668 :         ROS_DEBUG_THROTTLE(1.0, "[%s]: anti-windup for body integral kicks in", this->name_.c_str());
    +    1234             :       }
    +    1235             :     }
    +    1236             : 
    +    1237       55526 :     if (integral_terms_enabled_) {
    +    1238       55526 :       if (tracker_command.use_position_horizontal) {
    +    1239       55526 :         Ib_b_ += temp_gain * Ep_fcu_untilted * dt;
    +    1240           0 :       } else if (tracker_command.use_velocity_horizontal) {
    +    1241           0 :         Ib_b_ += temp_gain * Ev_fcu_untilted * dt;
    +    1242             :       }
    +    1243             :     }
    +    1244             : 
    +    1245             :     // saturate the body X
    +    1246       55526 :     bool body_integral_saturated = false;
    +    1247       55526 :     if (!std::isfinite(Ib_b_[0])) {
    +    1248           0 :       Ib_b_[0] = 0;
    +    1249           0 :       ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable 'Ib_b_[0]', setting it to 0!!!", this->name_.c_str());
    +    1250       55526 :     } else if (Ib_b_[0] > gains.kibxy_lim) {
    +    1251           0 :       Ib_b_[0]                = gains.kibxy_lim;
    +    1252           0 :       body_integral_saturated = true;
    +    1253       55526 :     } else if (Ib_b_[0] < -gains.kibxy_lim) {
    +    1254           0 :       Ib_b_[0]                = -gains.kibxy_lim;
    +    1255           0 :       body_integral_saturated = true;
    +    1256             :     }
    +    1257             : 
    +    1258       55526 :     if (gains.kibxy_lim > 0 && body_integral_saturated) {
    +    1259           0 :       ROS_WARN_THROTTLE(1.0, "[%s]: MPC's body pitch integral is being saturated!", this->name_.c_str());
    +    1260             :     }
    +    1261             : 
    +    1262             :     // saturate the body
    +    1263       55526 :     body_integral_saturated = false;
    +    1264       55526 :     if (!std::isfinite(Ib_b_[1])) {
    +    1265           0 :       Ib_b_[1] = 0;
    +    1266           0 :       ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable 'Ib_b_[1]', setting it to 0!!!", this->name_.c_str());
    +    1267       55526 :     } else if (Ib_b_[1] > gains.kibxy_lim) {
    +    1268           0 :       Ib_b_[1]                = gains.kibxy_lim;
    +    1269           0 :       body_integral_saturated = true;
    +    1270       55526 :     } else if (Ib_b_[1] < -gains.kibxy_lim) {
    +    1271           0 :       Ib_b_[1]                = -gains.kibxy_lim;
    +    1272           0 :       body_integral_saturated = true;
    +    1273             :     }
    +    1274             : 
    +    1275       55526 :     if (gains.kibxy_lim > 0 && body_integral_saturated) {
    +    1276           0 :       ROS_WARN_THROTTLE(1.0, "[%s]: MPC's body roll integral is being saturated!", this->name_.c_str());
    +    1277             :     }
    +    1278             :   }
    +    1279             : 
    +    1280             :   //}
    +    1281             : 
    +    1282       55526 :   Eigen::Vector3d des_acc = integral_feedback / total_mass + Ra;
    +    1283             : 
    +    1284       55526 :   if (output_modality == common::ACCELERATION_HDG || output_modality == common::ACCELERATION_HDG_RATE) {
    +    1285             : 
    +    1286         960 :     if (output_modality == common::ACCELERATION_HDG) {
    +    1287             : 
    +    1288         974 :       mrs_msgs::HwApiAccelerationHdgCmd cmd;
    +    1289             : 
    +    1290         487 :       cmd.acceleration.x = des_acc[0];
    +    1291         487 :       cmd.acceleration.y = des_acc[1];
    +    1292         487 :       cmd.acceleration.z = des_acc[2];
    +    1293             : 
    +    1294         487 :       cmd.heading = tracker_command.heading;
    +    1295             : 
    +    1296         487 :       last_control_output_.control_output = cmd;
    +    1297             : 
    +    1298             :     } else {
    +    1299             : 
    +    1300         473 :       double des_hdg_ff = 0;
    +    1301             : 
    +    1302         473 :       if (tracker_command.use_heading_rate) {
    +    1303         473 :         des_hdg_ff = tracker_command.heading_rate;
    +    1304             :       }
    +    1305             : 
    +    1306         946 :       mrs_msgs::HwApiAccelerationHdgRateCmd cmd;
    +    1307             : 
    +    1308         473 :       cmd.acceleration.x = des_acc[0];
    +    1309         473 :       cmd.acceleration.y = des_acc[1];
    +    1310         473 :       cmd.acceleration.z = des_acc[2];
    +    1311             : 
    +    1312         473 :       position_pid_heading_.setSaturation(constraints.heading_speed);
    +    1313             : 
    +    1314         473 :       double hdg_err = mrs_lib::geometry::sradians::diff(tracker_command.heading, uav_heading);
    +    1315             : 
    +    1316         473 :       double des_hdg_rate = position_pid_heading_.update(hdg_err, dt) + des_hdg_ff;
    +    1317             : 
    +    1318         473 :       cmd.heading_rate = des_hdg_rate;
    +    1319             : 
    +    1320         473 :       last_control_output_.desired_heading_rate = des_hdg_rate;
    +    1321             : 
    +    1322         473 :       last_control_output_.control_output = cmd;
    +    1323             :     }
    +    1324             : 
    +    1325             :     // | -------------- unbiased desired acceleration ------------- |
    +    1326             : 
    +    1327         960 :     Eigen::Vector3d unbiased_des_acc(0, 0, 0);
    +    1328             : 
    +    1329             :     {
    +    1330             : 
    +    1331        1920 :       geometry_msgs::Vector3Stamped world_accel;
    +    1332             : 
    +    1333         960 :       world_accel.header.stamp    = ros::Time::now();
    +    1334         960 :       world_accel.header.frame_id = uav_state.header.frame_id;
    +    1335         960 :       world_accel.vector.x        = Ra[0];
    +    1336         960 :       world_accel.vector.y        = Ra[1];
    +    1337         960 :       world_accel.vector.z        = Ra[2];
    +    1338             : 
    +    1339        2880 :       auto res = common_handlers_->transformer->transformSingle(world_accel, "fcu");
    +    1340             : 
    +    1341         960 :       if (res) {
    +    1342         960 :         unbiased_des_acc << res.value().vector.x, res.value().vector.y, res.value().vector.z;
    +    1343             :       }
    +    1344             :     }
    +    1345             : 
    +    1346             :     // fill the unbiased desired accelerations
    +    1347         960 :     last_control_output_.desired_unbiased_acceleration = unbiased_des_acc;
    +    1348             : 
    +    1349             :     // | ----------------- fill in the diagnostics ---------------- |
    +    1350             : 
    +    1351         960 :     last_control_output_.diagnostics.ramping_up = false;
    +    1352             : 
    +    1353         960 :     last_control_output_.diagnostics.mass_estimator  = false;
    +    1354         960 :     last_control_output_.diagnostics.mass_difference = 0;
    +    1355         960 :     last_control_output_.diagnostics.total_mass      = total_mass;
    +    1356             : 
    +    1357         960 :     last_control_output_.diagnostics.disturbance_estimator = true;
    +    1358             : 
    +    1359         960 :     last_control_output_.diagnostics.disturbance_bx_b = -Ib_b_[0];
    +    1360         960 :     last_control_output_.diagnostics.disturbance_by_b = -Ib_b_[1];
    +    1361             : 
    +    1362         960 :     last_control_output_.diagnostics.disturbance_bx_w = -Ib_w[0];
    +    1363         960 :     last_control_output_.diagnostics.disturbance_by_w = -Ib_w[1];
    +    1364             : 
    +    1365         960 :     last_control_output_.diagnostics.disturbance_wx_w = -Iw_w_[0];
    +    1366         960 :     last_control_output_.diagnostics.disturbance_wy_w = -Iw_w_[1];
    +    1367             : 
    +    1368         960 :     last_control_output_.diagnostics.controller_enforcing_constraints = !tracker_command.use_full_state_prediction;
    +    1369             : 
    +    1370         960 :     last_control_output_.diagnostics.horizontal_speed_constraint = 0.5 * max_speed_horizontal;
    +    1371         960 :     last_control_output_.diagnostics.horizontal_acc_constraint   = 0.5 * max_acceleration_horizontal;
    +    1372             : 
    +    1373         960 :     last_control_output_.diagnostics.vertical_asc_speed_constraint = 0.5 * max_speed_vertical;
    +    1374         960 :     last_control_output_.diagnostics.vertical_asc_acc_constraint   = 0.5 * max_acceleration_vertical;
    +    1375             : 
    +    1376         960 :     last_control_output_.diagnostics.vertical_desc_speed_constraint = 0.5 * max_speed_vertical;
    +    1377         960 :     last_control_output_.diagnostics.vertical_desc_acc_constraint   = 0.5 * max_acceleration_vertical;
    +    1378             : 
    +    1379         960 :     last_control_output_.diagnostics.controller = name_;
    +    1380             : 
    +    1381         960 :     return;
    +    1382             :   }
    +    1383             : 
    +    1384             :   /* mass estimatior //{ */
    +    1385             : 
    +    1386             :   // --------------------------------------------------------------
    +    1387             :   // |                integrate the mass difference               |
    +    1388             :   // --------------------------------------------------------------
    +    1389             : 
    +    1390             :   {
    +    1391      109132 :     std::scoped_lock lock(mutex_gains_);
    +    1392             : 
    +    1393             :     // antiwindup
    +    1394       54566 :     double temp_gain = gains.km;
    +    1395      108109 :     if (rampup_active_ ||
    +    1396       53543 :         (fabs(uav_state.velocity.linear.z) > 0.3 && ((Ep[2] > 0 && uav_state.velocity.linear.z > 0) || (Ep[2] < 0 && uav_state.velocity.linear.z < 0)))) {
    +    1397       14260 :       temp_gain = 0;
    +    1398       14260 :       ROS_DEBUG_THROTTLE(1.0, "[%s]: anti-windup for the mass kicks in", this->name_.c_str());
    +    1399             :     }
    +    1400             : 
    +    1401       54566 :     if (tracker_command.use_position_vertical) {
    +    1402       54566 :       uav_mass_difference_ += temp_gain * Ep[2] * dt;
    +    1403             :     }
    +    1404             : 
    +    1405             :     // saturate the mass estimator
    +    1406       54566 :     bool uav_mass_saturated = false;
    +    1407       54566 :     if (!std::isfinite(uav_mass_difference_)) {
    +    1408           0 :       uav_mass_difference_ = 0;
    +    1409           0 :       ROS_WARN_THROTTLE(1.0, "[%s]: NaN detected in variable 'uav_mass_difference_', setting it to 0 and returning!!!", this->name_.c_str());
    +    1410       54566 :     } else if (uav_mass_difference_ > gains.km_lim) {
    +    1411           0 :       uav_mass_difference_ = gains.km_lim;
    +    1412           0 :       uav_mass_saturated   = true;
    +    1413       54566 :     } else if (uav_mass_difference_ < -gains.km_lim) {
    +    1414           0 :       uav_mass_difference_ = -gains.km_lim;
    +    1415           0 :       uav_mass_saturated   = true;
    +    1416             :     }
    +    1417             : 
    +    1418       54566 :     if (uav_mass_saturated) {
    +    1419           0 :       ROS_WARN_THROTTLE(1.0, "[%s]: The UAV mass difference is being saturated to %.2f!", this->name_.c_str(), uav_mass_difference_);
    +    1420             :     }
    +    1421             :   }
    +    1422             : 
    +    1423             :   //}
    +    1424             : 
    +    1425       54566 :   Eigen::Vector3d f = integral_feedback + feed_forward;
    +    1426             : 
    +    1427             :   // | ----------- limiting the downwards acceleration ---------- |
    +    1428             :   // the downwards force produced by the position and the acceleration feedback should not be larger than the gravity
    +    1429             : 
    +    1430             :   // if the downwards part of the force is close to counter-act the gravity acceleration
    +    1431       54566 :   if (f[2] < 0) {
    +    1432             : 
    +    1433           0 :     ROS_WARN_THROTTLE(1.0, "[%s]: the calculated downwards desired force is negative (%.2f) -> mitigating flip", this->name_.c_str(), f[2]);
    +    1434             : 
    +    1435           0 :     f << 0, 0, 1;
    +    1436             :   }
    +    1437             : 
    +    1438             :   // | ------------------- sanitize tilt angle ------------------ |
    +    1439             : 
    +    1440       54566 :   double tilt_safety_limit = _tilt_angle_failsafe_enabled_ ? _tilt_angle_failsafe_ : std::numeric_limits<double>::max();
    +    1441             : 
    +    1442       54566 :   auto f_normed_sanitized = common::sanitizeDesiredForce(f.normalized(), tilt_safety_limit, constraints.tilt, "MpcController");
    +    1443             : 
    +    1444       54566 :   if (!f_normed_sanitized) {
    +    1445             : 
    +    1446           0 :     ROS_INFO("[%s]: f = [%.2f, %.2f, %.2f]", this->name_.c_str(), f[0], f[1], f[2]);
    +    1447           0 :     ROS_INFO("[%s]: integral feedback: [%.2f, %.2f, %.2f]", this->name_.c_str(), integral_feedback[0], integral_feedback[1], integral_feedback[2]);
    +    1448           0 :     ROS_INFO("[%s]: feed forward: [%.2f, %.2f, %.2f]", this->name_.c_str(), feed_forward[0], feed_forward[1], feed_forward[2]);
    +    1449           0 :     ROS_INFO("[%s]: tracker_cmd: x: %.2f, y: %.2f, z: %.2f, heading: %.2f", this->name_.c_str(), tracker_command.position.x, tracker_command.position.y,
    +    1450             :              tracker_command.position.z, tracker_command.heading);
    +    1451           0 :     ROS_INFO("[%s]: odometry: x: %.2f, y: %.2f, z: %.2f, heading: %.2f", this->name_.c_str(), uav_state.pose.position.x, uav_state.pose.position.y,
    +    1452             :              uav_state.pose.position.z, uav_heading);
    +    1453             : 
    +    1454           0 :     return;
    +    1455             :   }
    +    1456             : 
    +    1457       54566 :   Eigen::Vector3d f_normed = f_normed_sanitized.value();
    +    1458             : 
    +    1459             :   // --------------------------------------------------------------
    +    1460             :   // |               desired orientation + throttle               |
    +    1461             :   // --------------------------------------------------------------
    +    1462             : 
    +    1463             :   // | ------------------- desired orientation ------------------ |
    +    1464             : 
    +    1465       54566 :   Eigen::Matrix3d Rd;
    +    1466             : 
    +    1467       54566 :   if (tracker_command.use_orientation) {
    +    1468             : 
    +    1469             :     // fill in the desired orientation based on the desired orientation from the control command
    +    1470           0 :     Rd = mrs_lib::AttitudeConverter(tracker_command.orientation);
    +    1471             : 
    +    1472           0 :     if (tracker_command.use_heading) {
    +    1473             :       try {
    +    1474           0 :         Rd = mrs_lib::AttitudeConverter(Rd).setHeading(tracker_command.heading);
    +    1475             :       }
    +    1476           0 :       catch (...) {
    +    1477           0 :         ROS_WARN_THROTTLE(1.0, "[%s]: failed to add heading to the desired orientation matrix", this->name_.c_str());
    +    1478             :       }
    +    1479             :     }
    +    1480             : 
    +    1481             :   } else {
    +    1482             : 
    +    1483       54566 :     Eigen::Vector3d bxd;  // desired heading vector
    +    1484             : 
    +    1485       54566 :     if (tracker_command.use_heading) {
    +    1486       54566 :       bxd << cos(tracker_command.heading), sin(tracker_command.heading), 0;
    +    1487             :     } else {
    +    1488           0 :       ROS_ERROR_THROTTLE(1.0, "[%s]: desired heading was not specified, using current heading instead!", this->name_.c_str());
    +    1489           0 :       bxd << cos(uav_heading), sin(uav_heading), 0;
    +    1490             :     }
    +    1491             : 
    +    1492       54566 :     Rd = common::so3transform(f_normed, bxd, false);
    +    1493             :   }
    +    1494             : 
    +    1495             :   // | -------------------- desired throttle -------------------- |
    +    1496             : 
    +    1497       54566 :   double desired_thrust_force = f.dot(R.col(2));
    +    1498       54566 :   double throttle             = 0;
    +    1499             : 
    +    1500       54566 :   if (rampup_active_) {
    +    1501             : 
    +    1502             :     // deactivate the rampup when the times up
    +    1503        1023 :     if (fabs((ros::Time::now() - rampup_start_time_).toSec()) >= rampup_duration_) {
    +    1504             : 
    +    1505          60 :       rampup_active_ = false;
    +    1506             : 
    +    1507          60 :       ROS_INFO("[%s]: rampup finished", name_.c_str());
    +    1508             : 
    +    1509             :     } else {
    +    1510             : 
    +    1511         963 :       double rampup_dt = (ros::Time::now() - rampup_last_time_).toSec();
    +    1512             : 
    +    1513         963 :       rampup_throttle_ += double(rampup_direction_) * _rampup_speed_ * rampup_dt;
    +    1514             : 
    +    1515         963 :       rampup_last_time_ = ros::Time::now();
    +    1516             : 
    +    1517         963 :       throttle = rampup_throttle_;
    +    1518             : 
    +    1519         963 :       ROS_INFO_THROTTLE(0.1, "[%s]: ramping up throttle, %.4f", name_.c_str(), throttle);
    +    1520             :     }
    +    1521             : 
    +    1522             :   } else {
    +    1523             : 
    +    1524       53543 :     if (desired_thrust_force >= 0) {
    +    1525       53543 :       throttle = mrs_lib::quadratic_throttle_model::forceToThrottle(common_handlers_->throttle_model, desired_thrust_force);
    +    1526             :     } else {
    +    1527           0 :       ROS_WARN_THROTTLE(1.0, "[%s]: just so you know, the desired throttle force is negative (%.2f)", name_.c_str(), desired_thrust_force);
    +    1528             :     }
    +    1529             :   }
    +    1530             : 
    +    1531             :   // | ------------------- throttle saturation ------------------ |
    +    1532             : 
    +    1533       54566 :   bool throttle_saturated = false;
    +    1534             : 
    +    1535       54566 :   if (!std::isfinite(throttle)) {
    +    1536             : 
    +    1537           0 :     ROS_ERROR("[%s]: NaN detected in variable 'throttle'!!!", name_.c_str());
    +    1538           0 :     return;
    +    1539             : 
    +    1540       54566 :   } else if (throttle > _throttle_saturation_) {
    +    1541          29 :     throttle = _throttle_saturation_;
    +    1542          29 :     ROS_WARN_THROTTLE(0.1, "[%s]: saturating throttle to %.2f", name_.c_str(), _throttle_saturation_);
    +    1543       54537 :   } else if (throttle < 0.0) {
    +    1544           0 :     throttle = 0.0;
    +    1545           0 :     ROS_WARN_THROTTLE(0.1, "[%s]: saturating throttle to 0.0", name_.c_str());
    +    1546             :   }
    +    1547             : 
    +    1548       54566 :   if (throttle_saturated) {
    +    1549           0 :     ROS_WARN_THROTTLE(0.1, "[%s]: ---------------------------", name_.c_str());
    +    1550           0 :     ROS_WARN_THROTTLE(0.1, "[%s]: desired state: pos [x: %.2f, y: %.2f, z: %.2f, hdg: %.2f]", name_.c_str(), tracker_command.position.x,
    +    1551             :                       tracker_command.position.y, tracker_command.position.z, tracker_command.heading);
    +    1552           0 :     ROS_WARN_THROTTLE(0.1, "[%s]: desired state: vel [x: %.2f, y: %.2f, z: %.2f, hdg: %.2f]", name_.c_str(), tracker_command.velocity.x,
    +    1553             :                       tracker_command.velocity.y, tracker_command.velocity.z, tracker_command.heading_rate);
    +    1554           0 :     ROS_WARN_THROTTLE(0.1, "[%s]: desired state: acc [x: %.2f, y: %.2f, z: %.2f, hdg: %.2f]", name_.c_str(), tracker_command.acceleration.x,
    +    1555             :                       tracker_command.acceleration.y, tracker_command.acceleration.z, tracker_command.heading_acceleration);
    +    1556           0 :     ROS_WARN_THROTTLE(0.1, "[%s]: desired state: jerk [x: %.2f, y: %.2f, z: %.2f, hdg: %.2f]", name_.c_str(), tracker_command.jerk.x, tracker_command.jerk.y,
    +    1557             :                       tracker_command.jerk.z, tracker_command.heading_jerk);
    +    1558           0 :     ROS_WARN_THROTTLE(0.1, "[%s]: ---------------------------", name_.c_str());
    +    1559           0 :     ROS_WARN_THROTTLE(0.1, "[%s]: current state: pos [x: %.2f, y: %.2f, z: %.2f, hdg: %.2f]", name_.c_str(), uav_state.pose.position.x,
    +    1560             :                       uav_state.pose.position.y, uav_state.pose.position.z, uav_heading);
    +    1561           0 :     ROS_WARN_THROTTLE(0.1, "[%s]: current state: vel [x: %.2f, y: %.2f, z: %.2f, yaw rate: %.2f]", name_.c_str(), uav_state.velocity.linear.x,
    +    1562             :                       uav_state.velocity.linear.y, uav_state.velocity.linear.z, uav_state.velocity.angular.z);
    +    1563           0 :     ROS_WARN_THROTTLE(0.1, "[%s]: ---------------------------", name_.c_str());
    +    1564             :   }
    +    1565             : 
    +    1566             :   // | -------------- unbiased desired acceleration ------------- |
    +    1567             : 
    +    1568       54566 :   double desired_x_accel = 0;
    +    1569       54566 :   double desired_y_accel = 0;
    +    1570       54566 :   double desired_z_accel = 0;
    +    1571             : 
    +    1572             :   {
    +    1573       54566 :     Eigen::Vector3d thrust_vector = desired_thrust_force * Rd.col(2);
    +    1574             : 
    +    1575       54566 :     double world_accel_x = (thrust_vector[0] / total_mass) - (Iw_w_[0] / total_mass) - (Ib_w[0] / total_mass);
    +    1576       54566 :     double world_accel_y = (thrust_vector[1] / total_mass) - (Iw_w_[1] / total_mass) - (Ib_w[1] / total_mass);
    +    1577             : 
    +    1578             :     // TODO change to z from IMU?
    +    1579       54566 :     double world_accel_z = tracker_command.acceleration.z;
    +    1580             : 
    +    1581      109132 :     geometry_msgs::Vector3Stamped world_accel;
    +    1582             : 
    +    1583       54566 :     world_accel.header.stamp    = ros::Time::now();
    +    1584       54566 :     world_accel.header.frame_id = uav_state.header.frame_id;
    +    1585       54566 :     world_accel.vector.x        = world_accel_x;
    +    1586       54566 :     world_accel.vector.y        = world_accel_y;
    +    1587       54566 :     world_accel.vector.z        = world_accel_z;
    +    1588             : 
    +    1589      163698 :     auto res = common_handlers_->transformer->transformSingle(world_accel, "fcu");
    +    1590             : 
    +    1591       54566 :     if (res) {
    +    1592             : 
    +    1593       54566 :       desired_x_accel = res.value().vector.x;
    +    1594       54566 :       desired_y_accel = res.value().vector.y;
    +    1595       54566 :       desired_z_accel = res.value().vector.z;
    +    1596             :     }
    +    1597             :   }
    +    1598             : 
    +    1599             :   // | --------------- fill the resulting command --------------- |
    +    1600             : 
    +    1601             :   // fill the desired orientation for the tilt error check
    +    1602       54566 :   last_control_output_.desired_orientation = mrs_lib::AttitudeConverter(Rd);
    +    1603             : 
    +    1604             :   // fill the unbiased desired accelerations
    +    1605       54566 :   last_control_output_.desired_unbiased_acceleration = Eigen::Vector3d(desired_x_accel, desired_y_accel, desired_z_accel);
    +    1606             : 
    +    1607             :   // | ----------------- fill in the diagnostics ---------------- |
    +    1608             : 
    +    1609       54566 :   last_control_output_.diagnostics.ramping_up = rampup_active_;
    +    1610             : 
    +    1611       54566 :   last_control_output_.diagnostics.mass_estimator  = true;
    +    1612       54566 :   last_control_output_.diagnostics.mass_difference = uav_mass_difference_;
    +    1613       54566 :   last_control_output_.diagnostics.total_mass      = total_mass;
    +    1614             : 
    +    1615       54566 :   last_control_output_.diagnostics.disturbance_estimator = true;
    +    1616             : 
    +    1617       54566 :   last_control_output_.diagnostics.disturbance_bx_b = -Ib_b_[0];
    +    1618       54566 :   last_control_output_.diagnostics.disturbance_by_b = -Ib_b_[1];
    +    1619             : 
    +    1620       54566 :   last_control_output_.diagnostics.disturbance_bx_w = -Ib_w[0];
    +    1621       54566 :   last_control_output_.diagnostics.disturbance_by_w = -Ib_w[1];
    +    1622             : 
    +    1623       54566 :   last_control_output_.diagnostics.disturbance_wx_w = -Iw_w_[0];
    +    1624       54566 :   last_control_output_.diagnostics.disturbance_wy_w = -Iw_w_[1];
    +    1625             : 
    +    1626       54566 :   last_control_output_.diagnostics.controller_enforcing_constraints = !tracker_command.use_full_state_prediction;
    +    1627             : 
    +    1628       54566 :   last_control_output_.diagnostics.horizontal_speed_constraint = 0.5 * _max_speed_horizontal_;
    +    1629       54566 :   last_control_output_.diagnostics.horizontal_acc_constraint   = 0.5 * _max_acceleration_horizontal_;
    +    1630             : 
    +    1631       54566 :   last_control_output_.diagnostics.vertical_asc_speed_constraint = 0.5 * _max_speed_vertical_;
    +    1632       54566 :   last_control_output_.diagnostics.vertical_asc_acc_constraint   = 0.5 * _max_acceleration_vertical_;
    +    1633             : 
    +    1634       54566 :   last_control_output_.diagnostics.vertical_desc_speed_constraint = 0.5 * _max_speed_vertical_;
    +    1635       54566 :   last_control_output_.diagnostics.vertical_desc_acc_constraint   = 0.5 * _max_acceleration_vertical_;
    +    1636             : 
    +    1637       54566 :   last_control_output_.diagnostics.controller = name_;
    +    1638             : 
    +    1639             :   // | ------------ construct the attitude reference ------------ |
    +    1640             : 
    +    1641       54566 :   mrs_msgs::HwApiAttitudeCmd attitude_cmd;
    +    1642             : 
    +    1643       54566 :   attitude_cmd.stamp       = ros::Time::now();
    +    1644       54566 :   attitude_cmd.orientation = mrs_lib::AttitudeConverter(Rd);
    +    1645       54566 :   attitude_cmd.throttle    = throttle;
    +    1646             : 
    +    1647       54566 :   if (output_modality == common::ATTITUDE) {
    +    1648             : 
    +    1649        1083 :     last_control_output_.control_output = attitude_cmd;
    +    1650             : 
    +    1651        1083 :     return;
    +    1652             :   }
    +    1653             : 
    +    1654             :   // --------------------------------------------------------------
    +    1655             :   // |                      attitude control                      |
    +    1656             :   // --------------------------------------------------------------
    +    1657             : 
    +    1658       53483 :   Eigen::Vector3d rate_feedforward = Eigen::Vector3d::Zero(3);
    +    1659             : 
    +    1660       53483 :   if (tracker_command.use_attitude_rate) {
    +    1661             : 
    +    1662           0 :     rate_feedforward << tracker_command.attitude_rate.x, tracker_command.attitude_rate.y, tracker_command.attitude_rate.z;
    +    1663             : 
    +    1664       53483 :   } else if (tracker_command.use_heading_rate) {
    +    1665             : 
    +    1666             :     // to fill in the feed forward yaw rate
    +    1667       53480 :     double desired_yaw_rate = 0;
    +    1668             : 
    +    1669             :     try {
    +    1670       53480 :       desired_yaw_rate = mrs_lib::AttitudeConverter(Rd).getYawRateIntrinsic(tracker_command.heading_rate);
    +    1671             :     }
    +    1672           0 :     catch (...) {
    +    1673           0 :       ROS_ERROR("[%s]: exception caught while calculating the desired_yaw_rate feedforward", name_.c_str());
    +    1674             :     }
    +    1675             : 
    +    1676       53480 :     rate_feedforward << 0, 0, desired_yaw_rate;
    +    1677             :   }
    +    1678             : 
    +    1679             :   // | ------------ jerk feedforward -> angular rate ------------ |
    +    1680             : 
    +    1681       53483 :   Eigen::Vector3d jerk_feedforward = Eigen::Vector3d(0, 0, 0);
    +    1682             : 
    +    1683       53483 :   if (tracker_command.use_jerk && drs_params.jerk_feedforward) {
    +    1684             : 
    +    1685       34644 :     ROS_DEBUG_THROTTLE(1.0, "[%s]: using jerk feedforward", name_.c_str());
    +    1686             : 
    +    1687       34644 :     Eigen::Matrix3d I;
    +    1688       34644 :     I << 0, 1, 0, -1, 0, 0, 0, 0, 0;
    +    1689       34644 :     Eigen::Vector3d desired_jerk = Eigen::Vector3d(tracker_command.jerk.x, tracker_command.jerk.y, tracker_command.jerk.z);
    +    1690       34644 :     jerk_feedforward             = (I.transpose() * Rd.transpose() * desired_jerk) / (desired_thrust_force / total_mass);
    +    1691             :   }
    +    1692             : 
    +    1693             :   // | --------------- run the attitude controller -------------- |
    +    1694             : 
    +    1695       53483 :   Eigen::Vector3d attitude_rate_saturation(constraints.roll_rate, constraints.pitch_rate, constraints.yaw_rate);
    +    1696             : 
    +    1697       53483 :   auto attitude_rate_command = common::attitudeController(uav_state, attitude_cmd, jerk_feedforward + rate_feedforward, attitude_rate_saturation, Kq, false);
    +    1698             : 
    +    1699       53483 :   if (!attitude_rate_command) {
    +    1700           0 :     return;
    +    1701             :   }
    +    1702             : 
    +    1703             :   // | --------- fill in the already known attitude rate -------- |
    +    1704             : 
    +    1705             :   {
    +    1706             :     try {
    +    1707       53483 :       last_control_output_.desired_heading_rate = mrs_lib::AttitudeConverter(R).getHeadingRate(attitude_rate_command->body_rate);
    +    1708             :     }
    +    1709           0 :     catch (...) {
    +    1710             :     }
    +    1711             :   }
    +    1712             : 
    +    1713             :   // | ---------- construct the attitude rate reference --------- |
    +    1714             : 
    +    1715       53483 :   if (output_modality == common::ATTITUDE_RATE) {
    +    1716             : 
    +    1717       51083 :     last_control_output_.control_output = attitude_rate_command;
    +    1718             : 
    +    1719       51083 :     return;
    +    1720             :   }
    +    1721             : 
    +    1722             :   // --------------------------------------------------------------
    +    1723             :   // |                    Attitude rate control                   |
    +    1724             :   // --------------------------------------------------------------
    +    1725             : 
    +    1726        2400 :   Kw = common_handlers_->detailed_model_params->inertia.diagonal().array() * Kw;
    +    1727             : 
    +    1728        2400 :   auto control_group_command = common::attitudeRateController(uav_state, attitude_rate_command.value(), Kw);
    +    1729             : 
    +    1730        2400 :   if (!control_group_command) {
    +    1731           0 :     return;
    +    1732             :   }
    +    1733             : 
    +    1734        2400 :   if (output_modality == common::CONTROL_GROUP) {
    +    1735             : 
    +    1736        1205 :     last_control_output_.control_output = control_group_command;
    +    1737             : 
    +    1738        1205 :     return;
    +    1739             :   }
    +    1740             : 
    +    1741             :   // --------------------------------------------------------------
    +    1742             :   // |                        output mixer                        |
    +    1743             :   // --------------------------------------------------------------
    +    1744             : 
    +    1745        2390 :   mrs_msgs::HwApiActuatorCmd actuator_cmd = common::actuatorMixer(control_group_command.value(), common_handlers_->detailed_model_params->control_group_mixer);
    +    1746             : 
    +    1747        1195 :   last_control_output_.control_output = actuator_cmd;
    +    1748             : 
    +    1749        1195 :   return;
    +    1750             : }
    +    1751             : 
    +    1752             : //}
    +    1753             : 
    +    1754             : /* positionPassthrough() //{ */
    +    1755             : 
    +    1756         251 : void MpcController::positionPassthrough(const mrs_msgs::UavState &uav_state, const mrs_msgs::TrackerCommand &tracker_command) {
    +    1757             : 
    +    1758         251 :   if (!tracker_command.use_position_vertical || !tracker_command.use_position_horizontal || !tracker_command.use_heading) {
    +    1759           0 :     ROS_ERROR("[%s]: the tracker did not provide position+hdg reference", name_.c_str());
    +    1760           0 :     return;
    +    1761             :   }
    +    1762             : 
    +    1763         502 :   mrs_msgs::HwApiPositionCmd cmd;
    +    1764             : 
    +    1765         251 :   cmd.header.frame_id = uav_state.header.frame_id;
    +    1766         251 :   cmd.header.stamp    = ros::Time::now();
    +    1767             : 
    +    1768         251 :   cmd.position = tracker_command.position;
    +    1769         251 :   cmd.heading  = tracker_command.heading;
    +    1770             : 
    +    1771         251 :   last_control_output_.control_output = cmd;
    +    1772             : 
    +    1773             :   // fill the unbiased desired accelerations
    +    1774         251 :   last_control_output_.desired_unbiased_acceleration = {};
    +    1775         251 :   last_control_output_.desired_orientation           = {};
    +    1776         251 :   last_control_output_.desired_heading_rate          = {};
    +    1777             : 
    +    1778             :   // | ----------------- fill in the diagnostics ---------------- |
    +    1779             : 
    +    1780         251 :   last_control_output_.diagnostics.ramping_up = false;
    +    1781             : 
    +    1782         251 :   last_control_output_.diagnostics.mass_estimator  = false;
    +    1783         251 :   last_control_output_.diagnostics.mass_difference = 0;
    +    1784             : 
    +    1785         251 :   last_control_output_.diagnostics.disturbance_estimator = false;
    +    1786             : 
    +    1787         251 :   last_control_output_.diagnostics.disturbance_bx_b = 0;
    +    1788         251 :   last_control_output_.diagnostics.disturbance_by_b = 0;
    +    1789             : 
    +    1790         251 :   last_control_output_.diagnostics.disturbance_bx_w = 0;
    +    1791         251 :   last_control_output_.diagnostics.disturbance_by_w = 0;
    +    1792             : 
    +    1793         251 :   last_control_output_.diagnostics.disturbance_wx_w = 0;
    +    1794         251 :   last_control_output_.diagnostics.disturbance_wy_w = 0;
    +    1795             : 
    +    1796         251 :   last_control_output_.diagnostics.controller_enforcing_constraints = !tracker_command.use_full_state_prediction;
    +    1797             : 
    +    1798         251 :   last_control_output_.diagnostics.horizontal_speed_constraint = 0.5 * _max_speed_horizontal_;
    +    1799         251 :   last_control_output_.diagnostics.horizontal_acc_constraint   = 0.5 * _max_acceleration_horizontal_;
    +    1800             : 
    +    1801         251 :   last_control_output_.diagnostics.vertical_asc_speed_constraint = 0.5 * _max_speed_vertical_;
    +    1802         251 :   last_control_output_.diagnostics.vertical_asc_acc_constraint   = 0.5 * _max_acceleration_vertical_;
    +    1803             : 
    +    1804         251 :   last_control_output_.diagnostics.vertical_desc_speed_constraint = 0.5 * _max_speed_vertical_;
    +    1805         251 :   last_control_output_.diagnostics.vertical_desc_acc_constraint   = 0.5 * _max_acceleration_vertical_;
    +    1806             : 
    +    1807         251 :   last_control_output_.diagnostics.controller = name_;
    +    1808             : }
    +    1809             : 
    +    1810             : //}
    +    1811             : 
    +    1812             : /* PIDVelocityOutput() //{ */
    +    1813             : 
    +    1814         691 : void MpcController::PIDVelocityOutput(const mrs_msgs::UavState &uav_state, const mrs_msgs::TrackerCommand &tracker_command,
    +    1815             :                                       const common::CONTROL_OUTPUT &control_output, const double &dt) {
    +    1816             : 
    +    1817         691 :   if (!tracker_command.use_position_vertical || !tracker_command.use_position_horizontal || !tracker_command.use_heading) {
    +    1818           0 :     ROS_ERROR("[%s]: the tracker did not provide position+hdg reference", name_.c_str());
    +    1819           0 :     return;
    +    1820             :   }
    +    1821             : 
    +    1822         691 :   auto constraints = mrs_lib::get_mutexed(mutex_constraints_, constraints_);
    +    1823             : 
    +    1824         691 :   Eigen::Vector3d pos_ref = Eigen::Vector3d(tracker_command.position.x, tracker_command.position.y, tracker_command.position.z);
    +    1825         691 :   Eigen::Vector3d pos     = Eigen::Vector3d(uav_state.pose.position.x, uav_state.pose.position.y, uav_state.pose.position.z);
    +    1826             : 
    +    1827         691 :   double hdg_ref = tracker_command.heading;
    +    1828         691 :   double hdg     = getHeadingSafely(uav_state, tracker_command);
    +    1829             : 
    +    1830             :   // | ------------------ velocity feedforward ------------------ |
    +    1831             : 
    +    1832         691 :   Eigen::Vector3d vel_ff(0, 0, 0);
    +    1833             : 
    +    1834         691 :   if (tracker_command.use_velocity_horizontal && tracker_command.use_velocity_vertical) {
    +    1835         691 :     vel_ff = Eigen::Vector3d(tracker_command.velocity.x, tracker_command.velocity.y, tracker_command.velocity.z);
    +    1836             :   }
    +    1837             : 
    +    1838             :   // | --------------------- control errors --------------------- |
    +    1839             : 
    +    1840         691 :   Eigen::Vector3d Ep = pos_ref - pos;
    +    1841             : 
    +    1842             :   // | --------------------------- pid -------------------------- |
    +    1843             : 
    +    1844         691 :   position_pid_x_.setSaturation(constraints.horizontal_speed);
    +    1845         691 :   position_pid_y_.setSaturation(constraints.horizontal_speed);
    +    1846         691 :   position_pid_z_.setSaturation(std::min(constraints.vertical_ascending_speed, constraints.vertical_descending_speed));
    +    1847             : 
    +    1848         691 :   double des_vel_x = position_pid_x_.update(Ep[0], dt);
    +    1849         691 :   double des_vel_y = position_pid_y_.update(Ep[1], dt);
    +    1850         691 :   double des_vel_z = position_pid_z_.update(Ep[2], dt);
    +    1851             : 
    +    1852             :   // | -------------------- position feedback ------------------- |
    +    1853             : 
    +    1854         691 :   Eigen::Vector3d des_vel = Eigen::Vector3d(des_vel_x, des_vel_y, des_vel_z) + vel_ff;
    +    1855             : 
    +    1856         691 :   if (control_output == common::VELOCITY_HDG) {
    +    1857             : 
    +    1858             :     // | --------------------- fill the output -------------------- |
    +    1859             : 
    +    1860         450 :     mrs_msgs::HwApiVelocityHdgCmd cmd;
    +    1861             : 
    +    1862         225 :     cmd.header.frame_id = uav_state.header.frame_id;
    +    1863         225 :     cmd.header.stamp    = ros::Time::now();
    +    1864             : 
    +    1865         225 :     cmd.velocity.x = des_vel[0];
    +    1866         225 :     cmd.velocity.y = des_vel[1];
    +    1867         225 :     cmd.velocity.z = des_vel[2];
    +    1868             : 
    +    1869         225 :     cmd.heading = tracker_command.heading;
    +    1870             : 
    +    1871         225 :     last_control_output_.control_output = cmd;
    +    1872             : 
    +    1873         466 :   } else if (control_output == common::VELOCITY_HDG_RATE) {
    +    1874             : 
    +    1875         466 :     position_pid_heading_.setSaturation(constraints.heading_speed);
    +    1876             : 
    +    1877         466 :     double hdg_err = mrs_lib::geometry::sradians::diff(hdg_ref, hdg);
    +    1878             : 
    +    1879         466 :     double des_hdg_rate = position_pid_heading_.update(hdg_err, dt);
    +    1880             : 
    +    1881             :     // | --------------------------- ff --------------------------- |
    +    1882             : 
    +    1883         466 :     double des_hdg_ff = 0;
    +    1884             : 
    +    1885         466 :     if (tracker_command.use_heading_rate) {
    +    1886         466 :       des_hdg_ff = tracker_command.heading_rate;
    +    1887             :     }
    +    1888             : 
    +    1889             :     // | --------------------- fill the output -------------------- |
    +    1890             : 
    +    1891         932 :     mrs_msgs::HwApiVelocityHdgRateCmd cmd;
    +    1892             : 
    +    1893         466 :     cmd.header.frame_id = uav_state.header.frame_id;
    +    1894         466 :     cmd.header.stamp    = ros::Time::now();
    +    1895             : 
    +    1896         466 :     cmd.velocity.x = des_vel[0];
    +    1897         466 :     cmd.velocity.y = des_vel[1];
    +    1898         466 :     cmd.velocity.z = des_vel[2];
    +    1899             : 
    +    1900         466 :     cmd.heading_rate = des_hdg_rate + des_hdg_ff;
    +    1901             : 
    +    1902         466 :     last_control_output_.control_output = cmd;
    +    1903             :   } else {
    +    1904             : 
    +    1905           0 :     ROS_ERROR("[%s]: the required output of the position PID is not supported", name_.c_str());
    +    1906           0 :     return;
    +    1907             :   }
    +    1908             : 
    +    1909             :   // fill the unbiased desired accelerations
    +    1910         691 :   last_control_output_.desired_unbiased_acceleration = {};
    +    1911         691 :   last_control_output_.desired_orientation           = {};
    +    1912         691 :   last_control_output_.desired_heading_rate          = {};
    +    1913             : 
    +    1914             :   // | ----------------- fill in the diagnostics ---------------- |
    +    1915             : 
    +    1916         691 :   last_control_output_.diagnostics.ramping_up = false;
    +    1917             : 
    +    1918         691 :   last_control_output_.diagnostics.mass_estimator  = false;
    +    1919         691 :   last_control_output_.diagnostics.mass_difference = 0;
    +    1920             : 
    +    1921         691 :   last_control_output_.diagnostics.disturbance_estimator = false;
    +    1922             : 
    +    1923         691 :   last_control_output_.diagnostics.disturbance_bx_b = 0;
    +    1924         691 :   last_control_output_.diagnostics.disturbance_by_b = 0;
    +    1925             : 
    +    1926         691 :   last_control_output_.diagnostics.disturbance_bx_w = 0;
    +    1927         691 :   last_control_output_.diagnostics.disturbance_by_w = 0;
    +    1928             : 
    +    1929         691 :   last_control_output_.diagnostics.disturbance_wx_w = 0;
    +    1930         691 :   last_control_output_.diagnostics.disturbance_wy_w = 0;
    +    1931             : 
    +    1932         691 :   last_control_output_.diagnostics.controller_enforcing_constraints = !tracker_command.use_full_state_prediction;
    +    1933             : 
    +    1934         691 :   last_control_output_.diagnostics.horizontal_speed_constraint = 0.5 * _max_speed_horizontal_;
    +    1935         691 :   last_control_output_.diagnostics.horizontal_acc_constraint   = 0.5 * _max_acceleration_horizontal_;
    +    1936             : 
    +    1937         691 :   last_control_output_.diagnostics.vertical_asc_speed_constraint = 0.5 * _max_speed_vertical_;
    +    1938         691 :   last_control_output_.diagnostics.vertical_asc_acc_constraint   = 0.5 * _max_acceleration_vertical_;
    +    1939             : 
    +    1940         691 :   last_control_output_.diagnostics.vertical_desc_speed_constraint = 0.5 * _max_speed_vertical_;
    +    1941         691 :   last_control_output_.diagnostics.vertical_desc_acc_constraint   = 0.5 * _max_acceleration_vertical_;
    +    1942             : 
    +    1943         691 :   last_control_output_.diagnostics.controller = name_;
    +    1944             : }
    +    1945             : 
    +    1946             : //}
    +    1947             : 
    +    1948             : // --------------------------------------------------------------
    +    1949             : // |                          callbacks                         |
    +    1950             : // --------------------------------------------------------------
    +    1951             : 
    +    1952             : /* //{ callbackDrs() */
    +    1953             : 
    +    1954         182 : void MpcController::callbackDrs(mrs_uav_controllers::mpc_controllerConfig &config, [[maybe_unused]] uint32_t level) {
    +    1955             : 
    +    1956         182 :   mrs_lib::set_mutexed(mutex_drs_params_, config, drs_params_);
    +    1957             : 
    +    1958         182 :   ROS_INFO("[%s]: DRS updated gains", this->name_.c_str());
    +    1959         182 : }
    +    1960             : 
    +    1961             : //}
    +    1962             : 
    +    1963             : /* //{ callbackSetIntegralTerms() */
    +    1964             : 
    +    1965           0 : bool MpcController::callbackSetIntegralTerms(std_srvs::SetBool::Request &req, std_srvs::SetBool::Response &res) {
    +    1966             : 
    +    1967           0 :   if (!is_initialized_)
    +    1968           0 :     return false;
    +    1969             : 
    +    1970           0 :   integral_terms_enabled_ = req.data;
    +    1971             : 
    +    1972           0 :   std::stringstream ss;
    +    1973             : 
    +    1974           0 :   ss << "integral terms %s" << (integral_terms_enabled_ ? "enabled" : "disabled");
    +    1975             : 
    +    1976           0 :   ROS_INFO_STREAM_THROTTLE(1.0, "[" << name_.c_str() << "]: " << ss.str());
    +    1977             : 
    +    1978           0 :   res.message = ss.str();
    +    1979           0 :   res.success = true;
    +    1980             : 
    +    1981           0 :   return true;
    +    1982             : }
    +    1983             : 
    +    1984             : //}
    +    1985             : 
    +    1986             : // --------------------------------------------------------------
    +    1987             : // |                           timers                           |
    +    1988             : // --------------------------------------------------------------
    +    1989             : 
    +    1990             : /* timerGains() //{ */
    +    1991             : 
    +    1992       13726 : void MpcController::timerGains(const ros::TimerEvent &event) {
    +    1993             : 
    +    1994       41178 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("timerGains", _gain_filtering_rate_, 1.0, event);
    +    1995             :   mrs_lib::ScopeTimer timer =
    +    1996       41178 :       mrs_lib::ScopeTimer("MpcController::timerGains", common_handlers_->scope_timer.logger, common_handlers_->scope_timer.enabled);
    +    1997             : 
    +    1998       27452 :   auto drs_params = mrs_lib::get_mutexed(mutex_drs_params_, drs_params_);
    +    1999       13726 :   auto gains      = mrs_lib::get_mutexed(mutex_gains_, gains_);
    +    2000             : 
    +    2001             :   // When muting the gains, we want to bypass the filter,
    +    2002             :   // so it happens immediately.
    +    2003       13726 :   bool   bypass_filter = (mute_gains_ || mute_gains_by_tracker_);
    +    2004       13726 :   double gain_coeff    = (mute_gains_ || mute_gains_by_tracker_) ? _gain_mute_coefficient_ : 1.0;
    +    2005             : 
    +    2006       13726 :   mute_gains_ = false;
    +    2007             : 
    +    2008       13726 :   const double dt = (event.current_real - event.last_real).toSec();
    +    2009             : 
    +    2010       13726 :   bool updated = false;
    +    2011             : 
    +    2012       13726 :   gains.kq_roll_pitch = calculateGainChange(dt, gains.kq_roll_pitch, drs_params.kq_roll_pitch * gain_coeff, bypass_filter, "kq_roll_pitch", updated);
    +    2013       13726 :   gains.kq_yaw        = calculateGainChange(dt, gains.kq_yaw, drs_params.kq_yaw * gain_coeff, bypass_filter, "kq_yaw", updated);
    +    2014       13726 :   gains.km            = calculateGainChange(dt, gains.km, drs_params.km * gain_coeff, bypass_filter, "km", updated);
    +    2015       13726 :   gains.kiwxy         = calculateGainChange(dt, gains.kiwxy, drs_params.kiwxy * gain_coeff, bypass_filter, "kiwxy", updated);
    +    2016       13726 :   gains.kibxy         = calculateGainChange(dt, gains.kibxy, drs_params.kibxy * gain_coeff, bypass_filter, "kibxy", updated);
    +    2017             : 
    +    2018             :   // do not apply muting on these gains
    +    2019       13726 :   gains.kiwxy_lim = calculateGainChange(dt, gains.kiwxy_lim, drs_params.kiwxy_lim, false, "kiwxy_lim", updated);
    +    2020       13726 :   gains.kibxy_lim = calculateGainChange(dt, gains.kibxy_lim, drs_params.kibxy_lim, false, "kibxy_lim", updated);
    +    2021       13726 :   gains.km_lim    = calculateGainChange(dt, gains.km_lim, drs_params.km_lim, false, "km_lim", updated);
    +    2022             : 
    +    2023       13726 :   mrs_lib::set_mutexed(mutex_gains_, gains, gains_);
    +    2024             : 
    +    2025             :   // set the gains back to dynamic reconfigure
    +    2026             :   // and only do it when some filtering occurs
    +    2027       13726 :   if (updated) {
    +    2028             : 
    +    2029        1371 :     drs_params.kiwxy         = gains.kiwxy;
    +    2030        1371 :     drs_params.kibxy         = gains.kibxy;
    +    2031        1371 :     drs_params.kq_roll_pitch = gains.kq_roll_pitch;
    +    2032        1371 :     drs_params.kq_yaw        = gains.kq_yaw;
    +    2033        1371 :     drs_params.km            = gains.km;
    +    2034        1371 :     drs_params.km_lim        = gains.km_lim;
    +    2035        1371 :     drs_params.kiwxy_lim     = gains.kiwxy_lim;
    +    2036        1371 :     drs_params.kibxy_lim     = gains.kibxy_lim;
    +    2037             : 
    +    2038        1371 :     drs_->updateConfig(drs_params);
    +    2039             : 
    +    2040        1371 :     ROS_INFO_THROTTLE(10.0, "[%s]: gains have been updated", name_.c_str());
    +    2041             :   }
    +    2042       13726 : }
    +    2043             : 
    +    2044             : //}
    +    2045             : 
    +    2046             : // --------------------------------------------------------------
    +    2047             : // |                       other routines                       |
    +    2048             : // --------------------------------------------------------------
    +    2049             : 
    +    2050             : /* calculateGainChange() //{ */
    +    2051             : 
    +    2052      109808 : double MpcController::calculateGainChange(const double dt, const double current_value, const double desired_value, const bool bypass_rate, std::string name,
    +    2053             :                                           bool &updated) {
    +    2054             : 
    +    2055      109808 :   double change = desired_value - current_value;
    +    2056             : 
    +    2057      109808 :   double gains_filter_max_change = _gains_filter_change_rate_ * dt;
    +    2058      109808 :   double gains_filter_min_change = _gains_filter_min_change_rate_ * dt;
    +    2059             : 
    +    2060      109808 :   if (!bypass_rate) {
    +    2061             : 
    +    2062             :     // if current value is near 0...
    +    2063             :     double change_in_perc;
    +    2064             :     double saturated_change;
    +    2065             : 
    +    2066      109043 :     if (fabs(current_value) < 1e-6) {
    +    2067           0 :       change *= gains_filter_max_change;
    +    2068             :     } else {
    +    2069             : 
    +    2070      109043 :       saturated_change = change;
    +    2071             : 
    +    2072      109043 :       change_in_perc = (current_value + saturated_change) / current_value - 1.0;
    +    2073             : 
    +    2074      109043 :       if (change_in_perc > gains_filter_max_change) {
    +    2075        5330 :         saturated_change = current_value * gains_filter_max_change;
    +    2076      103713 :       } else if (change_in_perc < -gains_filter_max_change) {
    +    2077           0 :         saturated_change = current_value * -gains_filter_max_change;
    +    2078             :       }
    +    2079             : 
    +    2080      109043 :       if (fabs(saturated_change) < fabs(change) * gains_filter_min_change) {
    +    2081           0 :         change *= gains_filter_min_change;
    +    2082             :       } else {
    +    2083      109043 :         change = saturated_change;
    +    2084             :       }
    +    2085             :     }
    +    2086             :   }
    +    2087             : 
    +    2088      109808 :   if (fabs(change) > 1e-3) {
    +    2089        6855 :     ROS_DEBUG("[%s]: changing gain '%s' from %.2f to %.2f", name_.c_str(), name.c_str(), current_value, desired_value);
    +    2090        6855 :     updated = true;
    +    2091             :   }
    +    2092             : 
    +    2093      109808 :   return current_value + change;
    +    2094             : }
    +    2095             : 
    +    2096             : //}
    +    2097             : 
    +    2098             : /* getHeadingSafely() //{ */
    +    2099             : 
    +    2100       56217 : double MpcController::getHeadingSafely(const mrs_msgs::UavState &uav_state, const mrs_msgs::TrackerCommand &tracker_command) {
    +    2101             : 
    +    2102             :   try {
    +    2103       56217 :     return mrs_lib::AttitudeConverter(uav_state.pose.orientation).getHeading();
    +    2104             :   }
    +    2105           0 :   catch (...) {
    +    2106             :   }
    +    2107             : 
    +    2108             :   try {
    +    2109           0 :     return mrs_lib::AttitudeConverter(uav_state.pose.orientation).getYaw();
    +    2110             :   }
    +    2111           0 :   catch (...) {
    +    2112             :   }
    +    2113             : 
    +    2114           0 :   if (tracker_command.use_heading) {
    +    2115           0 :     return tracker_command.heading;
    +    2116             :   }
    +    2117             : 
    +    2118           0 :   return 0;
    +    2119             : }
    +    2120             : 
    +    2121             : //}
    +    2122             : 
    +    2123             : //}
    +    2124             : 
    +    2125             : }  // namespace mpc_controller
    +    2126             : 
    +    2127             : }  // namespace mrs_uav_controllers
    +    2128             : 
    +    2129             : #include <pluginlib/class_list_macros.h>
    +    2130          91 : PLUGINLIB_EXPORT_CLASS(mrs_uav_controllers::mpc_controller::MpcController, mrs_uav_managers::Controller)
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_controllers/src/mpc_controller.cpp.gcov.overview.html b/mrs_uav_controllers/src/mpc_controller.cpp.gcov.overview.html new file mode 100644 index 0000000000..ec11992da7 --- /dev/null +++ b/mrs_uav_controllers/src/mpc_controller.cpp.gcov.overview.html @@ -0,0 +1,553 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/src/mpc_controller.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_controllers/src/mpc_controller.cpp.gcov.png b/mrs_uav_controllers/src/mpc_controller.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..c2f69297d8b9b4aa1d84d90b99c6edb9f49e449c GIT binary patch literal 6656 zcmV+b8vo^qP)e90{{R30vG`D0000OP)t-s|NsB0 zs;a7|?_FK${{R500003000620&P%hU00009a7bBm000ie000ie0hKEb8vp$_&^9wRXK~0mt-v!NgpL5QQ+d2ZK) zxnR!$#?BNNQWbC=q3LkX0 zm@-@XhR$J(Ltd8Zpuy9l4ru85s(rv(FjiaObsNyU6qW^jd&N@Hp-hQPH30V)!&Fcv zX1M~LbHYr8Q&9e4Meo_wwbCz3fEU^Y`Xm0sO5V2ze@)UOSS5Yj$I`QapZyF+YERJh zT@TGFLX2^Va&vOOmuySE&oCs|CkE}Dmdl)(fh}4f5+L)veqMTFqTwIZ)RKnLM~upE z2DSkGb5USiPjREf2z6=@keLy1T*t4OnX52z2v~*vLb0}oS&GDYn<8Ln ziB2Jp3+v;ube;Jaopsj{e7sUMz0o4sGj}hoDAzq-7XR@rQKF@=~e_R+a z>+ttAvqT*mA4b9$K|hPNA7$4(ASQ7!6UlU)o+}N&N{dF^B)|@0T7b}bScCsj5@=lK z7X)=)U9t3@w)U!kc3C&o zc~@8!Umz`KD8OAO-c-fm3Z1#t2U6N(H|0@_5y@2}m*cD#ieQ9u9aih<&6zHCGam4- zjSM#~sum)&&YcE7tjZZ7@az^9iRZuDCj zP~C3#ZM$!`W}{tK0OKHTY3L2WEdjCvv3Bh+TNs=>;Lpd7@~;5xpjsx_h%qYr=pk5= z*Em?(X2}I(lqAP-Vy2~<;>kRKlAsuW{OMrTe#17xc2YVlm+Tlfe?1uO8-z)9#za_Zi0WDOgw4~aKnAEi< z`+4&7+Ur!56!R9(>)}-YjxmZJusd`aD4Ye}U+^Z*f*86#nS0H#C#&)N>R`AGm|s(6 ze<=5zpU?OsJOtiE**jP9Yz8Ob(Xc15A5bf}G!bYyolq61-k`gfYsxX^<@(+jl?^g{ zNxJ*w;tK5$jSajeUE2XElQt0$U}SvG3DCdY1h5{AepIsG-TWIX{IP85Lc5LaJ*V^vtpVYRCBMuG{k%_l52b9zsMQ4jaiU0q+@VD;I3{ z&>!*pQ_94|ym)wkrAV2+VdW!kSM1KKCQU$a9qM-LesTdVRoi&=VFZF%AU9zI>Ub-1 zJpdrg8LDF3FbAF6_`L$cC@+bCQALb?jBRu`lOn~2k4uW&g}33gRa4w|1>vA=JnKs z(*X<*{C0w41_CCPq5y3AacyIiG|m}}&7G!N%+y^^%)K5~V3o@=O`ibuaV{$5GPZjL zG-E^tOgUd27_0LAdxQc6KS!V!#G&}0C*xdr!Y7P*eyi57scTmV59lPy(pyM48r%M- zA1*ZkZ(2Y<(iR{Hq#-~(G0_v$0E`jH*j^LK1*d4wIQL;?&M^&ax!9c%n3*_Hb^DB% z*R`#bZYSmUg>W5{MGY}3(A~NW_JL0Ymv}SAg$#r751+{JIQ|{U4e9?q7_XG@AB=m# zmI83znpt3e4M^4Oi2@MsEZ@4^io>Tcq@p}xM#>{4SM2|rrtr0DZ%L(;($7%5c1QvX za_Yp_$R8fPlHpZ6Lgz3bTG!kZ5(iR5okS}9jh(`nSM&f0Mj7y#a*o(3Xm%Z6*Sda! z5wKmeqS5S{NdzjX&K+C2o|6cK9X)54>kYbwD~~Yf1dPzEtOY<-*E76@G@Pa*CQAbl zk^4IlBPwVWG4~_R^+v>01h=39(}4irgBW3M6vX7M)LRgvQve(>1>oz6shBj)nb|Pl zhnNpBpm_`6(SERh9gqqO;7e&MOb8+qn?h#KuZk-SyE&zJjKViSjJwlzs9>MPSjpSz zO9UF@@YPS@)Cw$P0s&kU0C6n*?hLzZd4EUaFLpmJ=P7`WS8G~h%xj6~PeF~xvze)4 zb(L<_}>bp)^B&@ON(#pv(O%^bp+YEp=rpBR%vP(EVvb+>$7W?)yEHxxn z(s`5&o%20E#)EZ~p}FhQ2f!P~jHaMdvc)MLaa zn+oye0B;;%WUN7Y)Iw35wPn-4ZUj&^0{lT6DIu+|Xo-!O+l^r&8gC|s=k{iI z0bh8u*SD9aur+&Hz#B_!>7SPX>3e5mPpoQET_8Cbr&bbVvsnP^8tdoO_$^UQA85uy zeiq$xw5)#eXH#_#EQ6AjU-XT#@ZWEUD?MKkZACE%>w}qR9}y~ zF~;qE^oXuWQj~xVuyB@iXH1=HHG6KXNlJ?%`gI-Vfx;I@ZIvfKzoKjSL47&B4z@2g z%`Uq89^atcR&IgvyV1Y^!?Fha@QYiCa^nI(fVk!F%17x+Kl7^ zqV4th!hF2P+qu#wH2_fAQjPN^(<>1(G4|mIA%ZJ@AfT2#zViL?Z;39@bkRii!bHGu zN%A!w2s|OAdx&J8Ob6VBoHjydd|Zq$QpfWhK4%63PB;tjq56M9_4xe9!F-$qsO95~ zc;NycaPdN*^N%#EoO#gW-s77%uL~p_!Tn)D*~l|-~#0__aW6EAJ1p?JhB0B^5bJkxkqCj zA8dYcnrrP8g2U;qUR^l>wlHeDR__(K19a!QzTt#3kUor;jm_iw`i8&!cPI4beI z_R%{Ovyl33V-4=QC8gk*k-!Grig_h468y?sS6ax1NLR-gNxHI-9bNze9@Q}BjZWnY@^WJK_LuPfB&{9a#YrsXk$7vcldWkEjq|X+s;Md)I7@nVG>f zB7ar(IG~<{H6&({a8wuNI?-1`PyY0kS70rM3x!5qJRiCxQ$eKyF7tCfs+Z}oMvp52 zZ%L&mRnH`c{8$0c!*F2Q6Ic;PhK8@a@f}k{em2mhopE4PZks1rA8YeG4=r#QZY$#$ zt}0Opa%UQ}vqoI3X%h2XjtbD=KBWAVW+WqGj6J0E9Xb-ywOlru@0uZ9?3&`$cda*F zwGB++agIfrPBO+vD#z`!m2wi&gfW@~7p!_$*;IT4_anI7f;&Mo&q&-&?$a^pyD#-W z#+e3Bq}azT*(nx4W!LGF#pK>w!R1wG+Q!>GtUv6OI}90nHFp^9TE3?O07frYqZaZ& zKm*k+f0)r7rt^nk^SV-3&IG9P&jgEKWpY)*UUBL za}PoPe{pDR{>A?4&pR~y3ySgUghRu>pc4N2rEu&Et4YSxp;6I~ziwZcrn1%bQ!1p{ zy)P7R{n2+lcVD<|#E-=gL-&QCh;F)TXr@D>MGPGNy;iySBe?%}!6hDzzva+?J9{|U z^hwu~;!n6uOcHCF1cQ>Shu+;sWB?Cn$5^>5ViKTjjQD`x2#ko43@0s)q0vX1ZrQ%B znz`mZ7bTm=2Fmss-*zODGWir-I)zQ`8OP8bBcJx!KSqMFatRFSx^@W+{#cHP zPXIJf-Awy5-R;ujvV(3M`tp@d7kGLfRQcxQQDz?W{n}zkpwf8uad%f57sgoZ5IaI_ z1y1ZNsjvqpE{kKN#k>cMG0x3Ej2k*WYylk9_0|FSo2kZ_$6<`My<31c062=6fU*gA z%YdW04kg^1fcrW5&3YC<=c5SY6 z3c10}9luckA|GkR+08jqlN%LYVFi87V4P*|v}@kSO}qXQQ|GXo8+T3Jifq>m?fR~# zy1C^rML|rQnP-@j9G-dnQ8#zt7vYVAkcJ8=5znXz`H6fe8l$xtniA1)3-oTmqFL{ zJcSBpn$f(5y1wFs=n#tMGv)R`CI8I%J^7O?Ga<4Dk|z*gjEiz;3C0+vdw_V|BLeOX zSNTNmvOGeJ0M`Qzg~b>K@$8hxqicnfPrTl7V+6NPC^`&wa1k5Si2vl4lY!U3c|O*4 zZs&5XEL!7UAwGo?#Y=i@L`AsEV^IYeiF;l%N_pHdVjK?%@CzkQRWP6<>G>dR+n zHM^&2jgO!kop4hfabu46*w>8?wUMTdS|v)ec2b_~#u^5LBxs&6;3s!GA0ilqqwH?iKfag5A) zPVQ{89wUFc$d9=n>(gBqY%0tPofjvdumtrmoXJ7tOye#mU{RR^x&eB8 zd-Y-3_Jt{nD_tncF&ys1D><~Lu5}9QR-P|pn|=$R46&n(N|G*=bI-nQ*@|ijhmj#C zZE@$uUDuSLvBG!fFVsc1Rk#7mm97ex0o53ptnYMH6xcCzU~HE++QKZy-))TYdcbE> z{5K;Yi7VdcM(tr4xU`KMAU&kT&->CEc`iCLMuQYYZ2>#nW==DmF) zXXm=i>b?4gts`uK*Rgv0lQ`M6KBio5 zRQIL?R8vhCO*{)gb^X+cIM;+Mi3|GM-lo=*i#P{Wy%wVOWI|61#dc5r))U9HwuFa2 zDXJGUb=OnG3_H~7R|zT_tvSH7RAfwNa)By(RV&R~dylrkXXzS@`YDf~1LLzvj2h$P znYj8y+z&%eH~Cq|m_{10?xuBk^R!c4<6r?;pF~^Na&2k=sN4YW;NCFO|y4~X`RQ@Z`skrKf=P}CIH^J$ez1*J>pXJ z4j&ToJHA*UfK2uZE4heMc-xIh#AtF|CY+g2?Suu4(`23NTInt;dqP;-ftkURWOt@! zSL&c@je<7}7L^Hn^zZgBF@V`Y<^etS0ua`$i3}Go=0kl3KrPjmR3P5Fdd0i#lM%-< zCkvbzu+Bwe!YOSoprU{V_V_g&R&-dl41fH=On+E29}MC6=);O_V$@WlqhwJBi~&4` zn&(We-?L?md@?6QARiL9WAuMcW8^}WYCv5p{kYPt-+dV2(MA`9IE-GO)bLBTQXRHg zJQ4>!ns1vOZB(AUm}u|(yysgR%XTl-hra7zDs1rK!!56l#Ea0dO_*;xY5-=?j$DPt z^(D68XE;agO*q*czh+N)uS(~9scA>T-?d2-;tBJdcXSzdide8k?Uew + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/src/se3_controller.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_controllers/src - se3_controller.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:62477480.6 %
    Date:2024-04-18 23:11:36Functions:151788.2 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_controllers::se3_controller::Se3Controller::switchOdometrySource(mrs_msgs::UavState_<std::allocator<void> > const&)0
    mrs_uav_controllers::se3_controller::Se3Controller::resetDisturbanceEstimators()0
    mrs_uav_controllers::se3_controller::Se3Controller::deactivate()23
    mrs_uav_controllers::se3_controller::Se3Controller::activate(mrs_uav_managers::Controller::ControlOutput const&)27
    (anonymous namespace)::ProxyExec0::ProxyExec0()91
    mrs_uav_controllers::se3_controller::Se3Controller::initialize(ros::NodeHandle const&, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t>, std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t>)91
    mrs_uav_controllers::se3_controller::Se3Controller::callbackDrs(mrs_uav_controllers::se3_controllerConfig&, unsigned int)183
    mrs_uav_controllers::se3_controller::Se3Controller::positionPassthrough(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_msgs::TrackerCommand_<std::allocator<void> > const&)251
    mrs_uav_controllers::se3_controller::Se3Controller::setConstraints(boost::shared_ptr<mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> > const> const&)360
    mrs_uav_controllers::se3_controller::Se3Controller::PIDVelocityOutput(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_msgs::TrackerCommand_<std::allocator<void> > const&, mrs_uav_controllers::common::CONTROL_OUTPUT const&, double const&)2625
    mrs_uav_controllers::se3_controller::Se3Controller::getStatus()2761
    mrs_uav_controllers::se3_controller::Se3Controller::timerGains(ros::TimerEvent const&)4326
    mrs_uav_controllers::se3_controller::Se3Controller::SE3Controller(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_msgs::TrackerCommand_<std::allocator<void> > const&, double const&, mrs_uav_controllers::common::CONTROL_OUTPUT const&)24328
    mrs_uav_controllers::se3_controller::Se3Controller::getHeadingSafely(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_msgs::TrackerCommand_<std::allocator<void> > const&)26953
    mrs_uav_controllers::se3_controller::Se3Controller::updateActive(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_msgs::TrackerCommand_<std::allocator<void> > const&)27204
    mrs_uav_controllers::se3_controller::Se3Controller::calculateGainChange(double, double, double, bool, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool&)60564
    mrs_uav_controllers::se3_controller::Se3Controller::updateInactive(mrs_msgs::UavState_<std::allocator<void> > const&, std::optional<mrs_msgs::TrackerCommand_<std::allocator<void> > > const&)102821
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_controllers/src/se3_controller.cpp.func.html b/mrs_uav_controllers/src/se3_controller.cpp.func.html new file mode 100644 index 0000000000..58f33e40e4 --- /dev/null +++ b/mrs_uav_controllers/src/se3_controller.cpp.func.html @@ -0,0 +1,148 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/src/se3_controller.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_controllers/src - se3_controller.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:62477480.6 %
    Date:2024-04-18 23:11:36Functions:151788.2 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    (anonymous namespace)::ProxyExec0::ProxyExec0()91
    mrs_uav_controllers::se3_controller::Se3Controller::deactivate()23
    mrs_uav_controllers::se3_controller::Se3Controller::initialize(ros::NodeHandle const&, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t>, std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t>)91
    mrs_uav_controllers::se3_controller::Se3Controller::timerGains(ros::TimerEvent const&)4326
    mrs_uav_controllers::se3_controller::Se3Controller::callbackDrs(mrs_uav_controllers::se3_controllerConfig&, unsigned int)183
    mrs_uav_controllers::se3_controller::Se3Controller::updateActive(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_msgs::TrackerCommand_<std::allocator<void> > const&)27204
    mrs_uav_controllers::se3_controller::Se3Controller::SE3Controller(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_msgs::TrackerCommand_<std::allocator<void> > const&, double const&, mrs_uav_controllers::common::CONTROL_OUTPUT const&)24328
    mrs_uav_controllers::se3_controller::Se3Controller::setConstraints(boost::shared_ptr<mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> > const> const&)360
    mrs_uav_controllers::se3_controller::Se3Controller::updateInactive(mrs_msgs::UavState_<std::allocator<void> > const&, std::optional<mrs_msgs::TrackerCommand_<std::allocator<void> > > const&)102821
    mrs_uav_controllers::se3_controller::Se3Controller::getHeadingSafely(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_msgs::TrackerCommand_<std::allocator<void> > const&)26953
    mrs_uav_controllers::se3_controller::Se3Controller::PIDVelocityOutput(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_msgs::TrackerCommand_<std::allocator<void> > const&, mrs_uav_controllers::common::CONTROL_OUTPUT const&, double const&)2625
    mrs_uav_controllers::se3_controller::Se3Controller::calculateGainChange(double, double, double, bool, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool&)60564
    mrs_uav_controllers::se3_controller::Se3Controller::positionPassthrough(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_msgs::TrackerCommand_<std::allocator<void> > const&)251
    mrs_uav_controllers::se3_controller::Se3Controller::switchOdometrySource(mrs_msgs::UavState_<std::allocator<void> > const&)0
    mrs_uav_controllers::se3_controller::Se3Controller::resetDisturbanceEstimators()0
    mrs_uav_controllers::se3_controller::Se3Controller::activate(mrs_uav_managers::Controller::ControlOutput const&)27
    mrs_uav_controllers::se3_controller::Se3Controller::getStatus()2761
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_controllers/src/se3_controller.cpp.gcov.frameset.html b/mrs_uav_controllers/src/se3_controller.cpp.gcov.frameset.html new file mode 100644 index 0000000000..96cbbf6f55 --- /dev/null +++ b/mrs_uav_controllers/src/se3_controller.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/src/se3_controller.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_controllers/src/se3_controller.cpp.gcov.html b/mrs_uav_controllers/src/se3_controller.cpp.gcov.html new file mode 100644 index 0000000000..79c99858da --- /dev/null +++ b/mrs_uav_controllers/src/se3_controller.cpp.gcov.html @@ -0,0 +1,1927 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/src/se3_controller.cpp + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_controllers/src - se3_controller.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:62477480.6 %
    Date:2024-04-18 23:11:36Functions:151788.2 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : /* includes //{ */
    +       2             : 
    +       3             : #include <ros/ros.h>
    +       4             : #include <ros/package.h>
    +       5             : 
    +       6             : #include <common.h>
    +       7             : #include <pid.hpp>
    +       8             : 
    +       9             : #include <mrs_uav_managers/controller.h>
    +      10             : 
    +      11             : #include <dynamic_reconfigure/server.h>
    +      12             : #include <mrs_uav_controllers/se3_controllerConfig.h>
    +      13             : 
    +      14             : #include <mrs_lib/profiler.h>
    +      15             : #include <mrs_lib/utils.h>
    +      16             : #include <mrs_lib/mutex.h>
    +      17             : #include <mrs_lib/attitude_converter.h>
    +      18             : #include <mrs_lib/geometry/cyclic.h>
    +      19             : 
    +      20             : #include <geometry_msgs/Vector3Stamped.h>
    +      21             : 
    +      22             : //}
    +      23             : 
    +      24             : #define OUTPUT_ACTUATORS 0
    +      25             : #define OUTPUT_CONTROL_GROUP 1
    +      26             : #define OUTPUT_ATTITUDE_RATE 2
    +      27             : #define OUTPUT_ATTITUDE 3
    +      28             : 
    +      29             : namespace mrs_uav_controllers
    +      30             : {
    +      31             : 
    +      32             : namespace se3_controller
    +      33             : {
    +      34             : 
    +      35             : /* structs //{ */
    +      36             : 
    +      37             : typedef struct
    +      38             : {
    +      39             :   double kpxy;           // position xy gain
    +      40             :   double kvxy;           // velocity xy gain
    +      41             :   double kaxy;           // acceleration xy gain (feed forward, =1)
    +      42             :   double kiwxy;          // world xy integral gain
    +      43             :   double kibxy;          // body xy integral gain
    +      44             :   double kiwxy_lim;      // world xy integral limit
    +      45             :   double kibxy_lim;      // body xy integral limit
    +      46             :   double kpz;            // position z gain
    +      47             :   double kvz;            // velocity z gain
    +      48             :   double kaz;            // acceleration z gain (feed forward, =1)
    +      49             :   double km;             // mass estimator gain
    +      50             :   double km_lim;         // mass estimator limit
    +      51             :   double kq_roll_pitch;  // pitch/roll attitude gain
    +      52             :   double kq_yaw;         // yaw attitude gain
    +      53             :   double kw_roll_pitch;  // attitude rate gain
    +      54             :   double kw_yaw;         // attitude rate gain
    +      55             : } Gains_t;
    +      56             : 
    +      57             : //}
    +      58             : 
    +      59             : /* //{ class Se3Controller */
    +      60             : 
    +      61             : class Se3Controller : public mrs_uav_managers::Controller {
    +      62             : 
    +      63             : public:
    +      64             :   bool initialize(const ros::NodeHandle& nh, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t> common_handlers,
    +      65             :                   std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t> private_handlers);
    +      66             : 
    +      67             :   bool activate(const ControlOutput& last_control_output);
    +      68             : 
    +      69             :   void deactivate(void);
    +      70             : 
    +      71             :   void updateInactive(const mrs_msgs::UavState& uav_state, const std::optional<mrs_msgs::TrackerCommand>& tracker_command);
    +      72             : 
    +      73             :   ControlOutput updateActive(const mrs_msgs::UavState& uav_state, const mrs_msgs::TrackerCommand& tracker_command);
    +      74             : 
    +      75             :   const mrs_msgs::ControllerStatus getStatus();
    +      76             : 
    +      77             :   void switchOdometrySource(const mrs_msgs::UavState& new_uav_state);
    +      78             : 
    +      79             :   void resetDisturbanceEstimators(void);
    +      80             : 
    +      81             :   const mrs_msgs::DynamicsConstraintsSrvResponse::ConstPtr setConstraints(const mrs_msgs::DynamicsConstraintsSrvRequest::ConstPtr& cmd);
    +      82             : 
    +      83             : private:
    +      84             :   ros::NodeHandle nh_;
    +      85             : 
    +      86             :   bool is_initialized_ = false;
    +      87             :   bool is_active_      = false;
    +      88             : 
    +      89             :   std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t>  common_handlers_;
    +      90             :   std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t> private_handlers_;
    +      91             : 
    +      92             :   // | ------------------------ uav state ----------------------- |
    +      93             : 
    +      94             :   mrs_msgs::UavState uav_state_;
    +      95             :   std::mutex         mutex_uav_state_;
    +      96             : 
    +      97             :   // | --------------- dynamic reconfigure server --------------- |
    +      98             : 
    +      99             :   boost::recursive_mutex                            mutex_drs_;
    +     100             :   typedef mrs_uav_controllers::se3_controllerConfig DrsConfig_t;
    +     101             :   typedef dynamic_reconfigure::Server<DrsConfig_t>  Drs_t;
    +     102             :   boost::shared_ptr<Drs_t>                          drs_;
    +     103             :   void                                              callbackDrs(mrs_uav_controllers::se3_controllerConfig& config, uint32_t level);
    +     104             :   DrsConfig_t                                       drs_params_;
    +     105             : 
    +     106             :   // | ----------------------- controllers ---------------------- |
    +     107             : 
    +     108             :   void positionPassthrough(const mrs_msgs::UavState& uav_state, const mrs_msgs::TrackerCommand& tracker_command);
    +     109             : 
    +     110             :   void PIDVelocityOutput(const mrs_msgs::UavState& uav_state, const mrs_msgs::TrackerCommand& tracker_command, const common::CONTROL_OUTPUT& control_output,
    +     111             :                          const double& dt);
    +     112             : 
    +     113             :   void SE3Controller(const mrs_msgs::UavState& uav_state, const mrs_msgs::TrackerCommand& tracker_command, const double& dt,
    +     114             :                      const common::CONTROL_OUTPUT& output_modality);
    +     115             : 
    +     116             :   // | ----------------------- constraints ---------------------- |
    +     117             : 
    +     118             :   mrs_msgs::DynamicsConstraints constraints_;
    +     119             :   std::mutex                    mutex_constraints_;
    +     120             : 
    +     121             :   // | --------- throttle generation and mass estimation -------- |
    +     122             : 
    +     123             :   double _uav_mass_;
    +     124             :   double uav_mass_difference_;
    +     125             : 
    +     126             :   Gains_t gains_;
    +     127             : 
    +     128             :   std::mutex mutex_gains_;       // locks the gains the are used and filtered
    +     129             :   std::mutex mutex_drs_params_;  // locks the gains that came from the drs
    +     130             : 
    +     131             :   ros::Timer timer_gains_;
    +     132             :   void       timerGains(const ros::TimerEvent& event);
    +     133             : 
    +     134             :   double _gain_filtering_rate_;
    +     135             : 
    +     136             :   // | ----------------------- gain muting ---------------------- |
    +     137             : 
    +     138             :   std::atomic<bool> mute_gains_            = false;
    +     139             :   std::atomic<bool> mute_gains_by_tracker_ = false;
    +     140             :   double            _gain_mute_coefficient_;
    +     141             : 
    +     142             :   // | --------------------- gain filtering --------------------- |
    +     143             : 
    +     144             :   double calculateGainChange(const double dt, const double current_value, const double desired_value, const bool bypass_rate, std::string name, bool& updated);
    +     145             : 
    +     146             :   double getHeadingSafely(const mrs_msgs::UavState& uav_state, const mrs_msgs::TrackerCommand& tracker_command);
    +     147             : 
    +     148             :   double _gains_filter_change_rate_;
    +     149             :   double _gains_filter_min_change_rate_;
    +     150             : 
    +     151             :   // | ------------ controller limits and saturations ----------- |
    +     152             : 
    +     153             :   bool   _tilt_angle_failsafe_enabled_;
    +     154             :   double _tilt_angle_failsafe_;
    +     155             : 
    +     156             :   double _throttle_saturation_;
    +     157             : 
    +     158             :   // | ------------------ activation and output ----------------- |
    +     159             : 
    +     160             :   ControlOutput last_control_output_;
    +     161             :   ControlOutput activation_control_output_;
    +     162             : 
    +     163             :   ros::Time         last_update_time_;
    +     164             :   std::atomic<bool> first_iteration_ = true;
    +     165             : 
    +     166             :   // | ------------------------ profiler_ ------------------------ |
    +     167             : 
    +     168             :   mrs_lib::Profiler profiler_;
    +     169             :   bool              _profiler_enabled_ = false;
    +     170             : 
    +     171             :   // | ------------------------ integrals ----------------------- |
    +     172             : 
    +     173             :   Eigen::Vector2d Ib_b_;  // body error integral in the body frame
    +     174             :   Eigen::Vector2d Iw_w_;  // world error integral in the world_frame
    +     175             :   std::mutex      mutex_integrals_;
    +     176             : 
    +     177             :   // | ------------------------- rampup ------------------------- |
    +     178             : 
    +     179             :   bool   _rampup_enabled_ = false;
    +     180             :   double _rampup_speed_;
    +     181             : 
    +     182             :   bool      rampup_active_ = false;
    +     183             :   double    rampup_throttle_;
    +     184             :   int       rampup_direction_;
    +     185             :   double    rampup_duration_;
    +     186             :   ros::Time rampup_start_time_;
    +     187             :   ros::Time rampup_last_time_;
    +     188             : 
    +     189             :   // | ---------------------- position pid ---------------------- |
    +     190             : 
    +     191             :   double _pos_pid_p_;
    +     192             :   double _pos_pid_i_;
    +     193             :   double _pos_pid_d_;
    +     194             : 
    +     195             :   double _hdg_pid_p_;
    +     196             :   double _hdg_pid_i_;
    +     197             :   double _hdg_pid_d_;
    +     198             : 
    +     199             :   PIDController position_pid_x_;
    +     200             :   PIDController position_pid_y_;
    +     201             :   PIDController position_pid_z_;
    +     202             :   PIDController position_pid_heading_;
    +     203             : };
    +     204             : 
    +     205             : //}
    +     206             : 
    +     207             : // --------------------------------------------------------------
    +     208             : // |                   controller's interface                   |
    +     209             : // --------------------------------------------------------------
    +     210             : 
    +     211             : /* //{ initialize() */
    +     212             : 
    +     213          91 : bool Se3Controller::initialize(const ros::NodeHandle& nh, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t> common_handlers,
    +     214             :                                std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t> private_handlers) {
    +     215             : 
    +     216          91 :   nh_ = nh;
    +     217             : 
    +     218          91 :   common_handlers_  = common_handlers;
    +     219          91 :   private_handlers_ = private_handlers;
    +     220             : 
    +     221          91 :   _uav_mass_ = common_handlers->getMass();
    +     222             : 
    +     223          91 :   ros::Time::waitForValid();
    +     224             : 
    +     225             :   // | ---------- loading params using the parent's nh ---------- |
    +     226             : 
    +     227         182 :   mrs_lib::ParamLoader param_loader_parent(common_handlers->parent_nh, "ControlManager");
    +     228             : 
    +     229          91 :   param_loader_parent.loadParam("enable_profiler", _profiler_enabled_);
    +     230             : 
    +     231          91 :   if (!param_loader_parent.loadedSuccessfully()) {
    +     232           0 :     ROS_ERROR("[MidairActivationController]: Could not load all parameters!");
    +     233           0 :     return false;
    +     234             :   }
    +     235             : 
    +     236             :   // | -------------------- loading my params ------------------- |
    +     237             : 
    +     238          91 :   private_handlers->param_loader->addYamlFile(ros::package::getPath("mrs_uav_controllers") + "/config/private/se3_controller.yaml");
    +     239          91 :   private_handlers->param_loader->addYamlFile(ros::package::getPath("mrs_uav_controllers") + "/config/public/se3_controller.yaml");
    +     240             : 
    +     241         182 :   const std::string yaml_namespace = "mrs_uav_controllers/se3_controller/";
    +     242             : 
    +     243             :   // lateral gains
    +     244          91 :   private_handlers->param_loader->loadParam(yaml_namespace + "se3/default_gains/horizontal/kp", gains_.kpxy);
    +     245          91 :   private_handlers->param_loader->loadParam(yaml_namespace + "se3/default_gains/horizontal/kv", gains_.kvxy);
    +     246          91 :   private_handlers->param_loader->loadParam(yaml_namespace + "se3/default_gains/horizontal/ka", gains_.kaxy);
    +     247             : 
    +     248          91 :   private_handlers->param_loader->loadParam(yaml_namespace + "se3/default_gains/horizontal/kiw", gains_.kiwxy);
    +     249          91 :   private_handlers->param_loader->loadParam(yaml_namespace + "se3/default_gains/horizontal/kib", gains_.kibxy);
    +     250             : 
    +     251             :   // | ------------------------- rampup ------------------------- |
    +     252             : 
    +     253          91 :   private_handlers->param_loader->loadParam(yaml_namespace + "se3/rampup/enabled", _rampup_enabled_);
    +     254          91 :   private_handlers->param_loader->loadParam(yaml_namespace + "se3/rampup/speed", _rampup_speed_);
    +     255             : 
    +     256             :   // height gains
    +     257          91 :   private_handlers->param_loader->loadParam(yaml_namespace + "se3/default_gains/vertical/kp", gains_.kpz);
    +     258          91 :   private_handlers->param_loader->loadParam(yaml_namespace + "se3/default_gains/vertical/kv", gains_.kvz);
    +     259          91 :   private_handlers->param_loader->loadParam(yaml_namespace + "se3/default_gains/vertical/ka", gains_.kaz);
    +     260             : 
    +     261             :   // attitude gains
    +     262          91 :   private_handlers->param_loader->loadParam(yaml_namespace + "se3/default_gains/attitude/kq_roll_pitch", gains_.kq_roll_pitch);
    +     263          91 :   private_handlers->param_loader->loadParam(yaml_namespace + "se3/default_gains/attitude/kq_yaw", gains_.kq_yaw);
    +     264             : 
    +     265             :   // attitude rate gains
    +     266          91 :   private_handlers->param_loader->loadParam(yaml_namespace + "se3/attitude_rate_gains/kw_roll_pitch", gains_.kw_roll_pitch);
    +     267          91 :   private_handlers->param_loader->loadParam(yaml_namespace + "se3/attitude_rate_gains/kw_yaw", gains_.kw_yaw);
    +     268             : 
    +     269             :   // mass estimator
    +     270          91 :   private_handlers->param_loader->loadParam(yaml_namespace + "se3/default_gains/mass_estimator/km", gains_.km);
    +     271          91 :   private_handlers->param_loader->loadParam(yaml_namespace + "se3/default_gains/mass_estimator/km_lim", gains_.km_lim);
    +     272             : 
    +     273             :   // integrator limits
    +     274          91 :   private_handlers->param_loader->loadParam(yaml_namespace + "se3/default_gains/horizontal/kiw_lim", gains_.kiwxy_lim);
    +     275          91 :   private_handlers->param_loader->loadParam(yaml_namespace + "se3/default_gains/horizontal/kib_lim", gains_.kibxy_lim);
    +     276             : 
    +     277             :   // constraints
    +     278          91 :   private_handlers->param_loader->loadParam(yaml_namespace + "se3/constraints/tilt_angle_failsafe/enabled", _tilt_angle_failsafe_enabled_);
    +     279          91 :   private_handlers->param_loader->loadParam(yaml_namespace + "se3/constraints/tilt_angle_failsafe/limit", _tilt_angle_failsafe_);
    +     280             : 
    +     281          91 :   _tilt_angle_failsafe_ = M_PI * (_tilt_angle_failsafe_ / 180.0);
    +     282             : 
    +     283          91 :   if (_tilt_angle_failsafe_enabled_ && fabs(_tilt_angle_failsafe_) < 1e-3) {
    +     284           0 :     ROS_ERROR("[Se3Controller]: constraints/tilt_angle_failsafe/enabled = 'TRUE' but the limit is too low");
    +     285           0 :     return false;
    +     286             :   }
    +     287             : 
    +     288          91 :   private_handlers->param_loader->loadParam(yaml_namespace + "se3/constraints/throttle_saturation", _throttle_saturation_);
    +     289             : 
    +     290             :   // gain filtering
    +     291          91 :   private_handlers->param_loader->loadParam(yaml_namespace + "se3/gain_filtering/perc_change_rate", _gains_filter_change_rate_);
    +     292          91 :   private_handlers->param_loader->loadParam(yaml_namespace + "se3/gain_filtering/min_change_rate", _gains_filter_min_change_rate_);
    +     293          91 :   private_handlers->param_loader->loadParam(yaml_namespace + "se3/gain_filtering/rate", _gain_filtering_rate_);
    +     294          91 :   private_handlers->param_loader->loadParam(yaml_namespace + "se3/gain_filtering/gain_mute_coefficient", _gain_mute_coefficient_);
    +     295             : 
    +     296             :   // output mode
    +     297          91 :   private_handlers->param_loader->loadParam(yaml_namespace + "se3/preferred_output", drs_params_.preferred_output_mode);
    +     298             : 
    +     299          91 :   private_handlers->param_loader->loadParam(yaml_namespace + "se3/rotation_matrix", drs_params_.rotation_type);
    +     300             : 
    +     301             :   // angular rate feed forward
    +     302         182 :   private_handlers->param_loader->loadParam(yaml_namespace + "se3/angular_rate_feedforward/parasitic_pitch_roll",
    +     303          91 :                                             drs_params_.pitch_roll_heading_rate_compensation);
    +     304          91 :   private_handlers->param_loader->loadParam(yaml_namespace + "se3/angular_rate_feedforward/jerk", drs_params_.jerk_feedforward);
    +     305             : 
    +     306             :   // | ------------------- position pid params ------------------ |
    +     307             : 
    +     308          91 :   private_handlers->param_loader->loadParam(yaml_namespace + "position_controller/translation_gains/p", _pos_pid_p_);
    +     309          91 :   private_handlers->param_loader->loadParam(yaml_namespace + "position_controller/translation_gains/i", _pos_pid_i_);
    +     310          91 :   private_handlers->param_loader->loadParam(yaml_namespace + "position_controller/translation_gains/d", _pos_pid_d_);
    +     311             : 
    +     312          91 :   private_handlers->param_loader->loadParam(yaml_namespace + "position_controller/heading_gains/p", _hdg_pid_p_);
    +     313          91 :   private_handlers->param_loader->loadParam(yaml_namespace + "position_controller/heading_gains/i", _hdg_pid_i_);
    +     314          91 :   private_handlers->param_loader->loadParam(yaml_namespace + "position_controller/heading_gains/d", _hdg_pid_d_);
    +     315             : 
    +     316             :   // | ------------------ finish loading params ----------------- |
    +     317             : 
    +     318          91 :   if (!private_handlers->param_loader->loadedSuccessfully()) {
    +     319           0 :     ROS_ERROR("[Se3Controller]: could not load all parameters!");
    +     320           0 :     return false;
    +     321             :   }
    +     322             : 
    +     323             :   // | ---------------- prepare stuff from params --------------- |
    +     324             : 
    +     325          91 :   if (!(drs_params_.preferred_output_mode == OUTPUT_ACTUATORS || drs_params_.preferred_output_mode == OUTPUT_CONTROL_GROUP ||
    +     326          91 :         drs_params_.preferred_output_mode == OUTPUT_ATTITUDE_RATE || drs_params_.preferred_output_mode == OUTPUT_ATTITUDE)) {
    +     327           0 :     ROS_ERROR("[Se3Controller]: preferred output mode has to be {0, 1, 2, 3}!");
    +     328           0 :     return false;
    +     329             :   }
    +     330             : 
    +     331             :   // initialize the integrals
    +     332          91 :   uav_mass_difference_ = 0;
    +     333          91 :   Iw_w_                = Eigen::Vector2d::Zero(2);
    +     334          91 :   Ib_b_                = Eigen::Vector2d::Zero(2);
    +     335             : 
    +     336             :   // | --------------- dynamic reconfigure server --------------- |
    +     337             : 
    +     338          91 :   drs_params_.kpxy             = gains_.kpxy;
    +     339          91 :   drs_params_.kvxy             = gains_.kvxy;
    +     340          91 :   drs_params_.kaxy             = gains_.kaxy;
    +     341          91 :   drs_params_.kiwxy            = gains_.kiwxy;
    +     342          91 :   drs_params_.kibxy            = gains_.kibxy;
    +     343          91 :   drs_params_.kpz              = gains_.kpz;
    +     344          91 :   drs_params_.kvz              = gains_.kvz;
    +     345          91 :   drs_params_.kaz              = gains_.kaz;
    +     346          91 :   drs_params_.kq_roll_pitch    = gains_.kq_roll_pitch;
    +     347          91 :   drs_params_.kq_yaw           = gains_.kq_yaw;
    +     348          91 :   drs_params_.kiwxy_lim        = gains_.kiwxy_lim;
    +     349          91 :   drs_params_.kibxy_lim        = gains_.kibxy_lim;
    +     350          91 :   drs_params_.km               = gains_.km;
    +     351          91 :   drs_params_.km_lim           = gains_.km_lim;
    +     352          91 :   drs_params_.jerk_feedforward = true;
    +     353             : 
    +     354          91 :   drs_.reset(new Drs_t(mutex_drs_, nh_));
    +     355          91 :   drs_->updateConfig(drs_params_);
    +     356          91 :   Drs_t::CallbackType f = boost::bind(&Se3Controller::callbackDrs, this, _1, _2);
    +     357          91 :   drs_->setCallback(f);
    +     358             : 
    +     359             :   // | ------------------------- timers ------------------------- |
    +     360             : 
    +     361          91 :   timer_gains_ = nh_.createTimer(ros::Rate(_gain_filtering_rate_), &Se3Controller::timerGains, this, false, false);
    +     362             : 
    +     363             :   // | ---------------------- position pid ---------------------- |
    +     364             : 
    +     365          91 :   position_pid_x_.setParams(_pos_pid_p_, _pos_pid_d_, _pos_pid_i_, -1, 1.0);
    +     366          91 :   position_pid_y_.setParams(_pos_pid_p_, _pos_pid_d_, _pos_pid_i_, -1, 1.0);
    +     367          91 :   position_pid_z_.setParams(_pos_pid_p_, _pos_pid_d_, _pos_pid_i_, -1, 1.0);
    +     368          91 :   position_pid_heading_.setParams(_hdg_pid_p_, _hdg_pid_d_, _hdg_pid_i_, -1, 0.1);
    +     369             : 
    +     370             :   // | ------------------------ profiler ------------------------ |
    +     371             : 
    +     372          91 :   profiler_ = mrs_lib::Profiler(common_handlers_->parent_nh, "Se3Controller", _profiler_enabled_);
    +     373             : 
    +     374             :   // | ----------------------- finish init ---------------------- |
    +     375             : 
    +     376          91 :   ROS_INFO("[Se3Controller]: initialized");
    +     377             : 
    +     378          91 :   is_initialized_ = true;
    +     379             : 
    +     380          91 :   return true;
    +     381             : }
    +     382             : 
    +     383             : //}
    +     384             : 
    +     385             : /* //{ activate() */
    +     386             : 
    +     387          27 : bool Se3Controller::activate(const ControlOutput& last_control_output) {
    +     388             : 
    +     389          27 :   activation_control_output_ = last_control_output;
    +     390             : 
    +     391          27 :   double activation_mass = _uav_mass_;
    +     392             : 
    +     393          27 :   if (activation_control_output_.diagnostics.mass_estimator) {
    +     394           1 :     uav_mass_difference_ = activation_control_output_.diagnostics.mass_difference;
    +     395           1 :     activation_mass += uav_mass_difference_;
    +     396           1 :     ROS_INFO("[Se3Controller]: setting mass difference from the last control output: %.2f kg", uav_mass_difference_);
    +     397             :   }
    +     398             : 
    +     399          27 :   last_control_output_.diagnostics.controller_enforcing_constraints = false;
    +     400             : 
    +     401          27 :   if (activation_control_output_.diagnostics.disturbance_estimator) {
    +     402           1 :     Ib_b_[0] = -activation_control_output_.diagnostics.disturbance_bx_b;
    +     403           1 :     Ib_b_[1] = -activation_control_output_.diagnostics.disturbance_by_b;
    +     404             : 
    +     405           1 :     Iw_w_[0] = -activation_control_output_.diagnostics.disturbance_wx_w;
    +     406           1 :     Iw_w_[1] = -activation_control_output_.diagnostics.disturbance_wy_w;
    +     407             : 
    +     408           1 :     ROS_INFO(
    +     409             :         "[Se3Controller]: setting disturbances from the last control output: Ib_b_: %.2f, %.2f N, Iw_w_: "
    +     410             :         "%.2f, %.2f N",
    +     411             :         Ib_b_[0], Ib_b_[1], Iw_w_[0], Iw_w_[1]);
    +     412             :   }
    +     413             : 
    +     414             :   // did the last controller use manual throttle control?
    +     415          27 :   auto throttle_last_controller = common::extractThrottle(activation_control_output_);
    +     416             : 
    +     417             :   // rampup check
    +     418          27 :   if (_rampup_enabled_ && throttle_last_controller) {
    +     419             : 
    +     420          14 :     double hover_throttle = mrs_lib::quadratic_throttle_model::forceToThrottle(common_handlers_->throttle_model, activation_mass * common_handlers_->g);
    +     421             : 
    +     422          14 :     double throttle_difference = hover_throttle - throttle_last_controller.value();
    +     423             : 
    +     424          14 :     if (throttle_difference > 0) {
    +     425           3 :       rampup_direction_ = 1;
    +     426          11 :     } else if (throttle_difference < 0) {
    +     427           0 :       rampup_direction_ = -1;
    +     428             :     } else {
    +     429          11 :       rampup_direction_ = 0;
    +     430             :     }
    +     431             : 
    +     432          14 :     ROS_INFO("[Se3Controller]: activating rampup with initial throttle: %.4f, target: %.4f", throttle_last_controller.value(), hover_throttle);
    +     433             : 
    +     434          14 :     rampup_active_     = true;
    +     435          14 :     rampup_start_time_ = ros::Time::now();
    +     436          14 :     rampup_last_time_  = ros::Time::now();
    +     437          14 :     rampup_throttle_   = throttle_last_controller.value();
    +     438             : 
    +     439          14 :     rampup_duration_ = fabs(throttle_difference) / _rampup_speed_;
    +     440             :   }
    +     441             : 
    +     442          27 :   first_iteration_ = true;
    +     443          27 :   mute_gains_      = true;
    +     444             : 
    +     445          27 :   timer_gains_.start();
    +     446             : 
    +     447             :   // | ------------------ finish the activation ----------------- |
    +     448             : 
    +     449          27 :   ROS_INFO("[Se3Controller]: activated");
    +     450             : 
    +     451          27 :   is_active_ = true;
    +     452             : 
    +     453          27 :   return true;
    +     454             : }
    +     455             : 
    +     456             : //}
    +     457             : 
    +     458             : /* //{ deactivate() */
    +     459             : 
    +     460          23 : void Se3Controller::deactivate(void) {
    +     461             : 
    +     462          23 :   is_active_           = false;
    +     463          23 :   first_iteration_     = false;
    +     464          23 :   uav_mass_difference_ = 0;
    +     465             : 
    +     466          23 :   timer_gains_.stop();
    +     467             : 
    +     468          23 :   ROS_INFO("[Se3Controller]: deactivated");
    +     469          23 : }
    +     470             : 
    +     471             : //}
    +     472             : 
    +     473             : /* updateInactive() //{ */
    +     474             : 
    +     475      102821 : void Se3Controller::updateInactive(const mrs_msgs::UavState& uav_state, [[maybe_unused]] const std::optional<mrs_msgs::TrackerCommand>& tracker_command) {
    +     476             : 
    +     477      102821 :   mrs_lib::set_mutexed(mutex_uav_state_, uav_state, uav_state_);
    +     478             : 
    +     479      102821 :   last_update_time_ = uav_state.header.stamp;
    +     480             : 
    +     481      102821 :   first_iteration_ = false;
    +     482      102821 : }
    +     483             : 
    +     484             : //}
    +     485             : 
    +     486             : /* //{ updateWhenActive() */
    +     487             : 
    +     488       27204 : Se3Controller::ControlOutput Se3Controller::updateActive(const mrs_msgs::UavState& uav_state, const mrs_msgs::TrackerCommand& tracker_command) {
    +     489             : 
    +     490       81612 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("updateActive");
    +     491       81612 :   mrs_lib::ScopeTimer timer = mrs_lib::ScopeTimer("Se3Controller::updateActive", common_handlers_->scope_timer.logger, common_handlers_->scope_timer.enabled);
    +     492             : 
    +     493       54408 :   auto drs_params = mrs_lib::get_mutexed(mutex_drs_params_, drs_params_);
    +     494             : 
    +     495       27204 :   mrs_lib::set_mutexed(mutex_uav_state_, uav_state, uav_state_);
    +     496             : 
    +     497       27204 :   last_control_output_.desired_heading_rate          = {};
    +     498       27204 :   last_control_output_.desired_orientation           = {};
    +     499       27204 :   last_control_output_.desired_unbiased_acceleration = {};
    +     500       27204 :   last_control_output_.control_output                = {};
    +     501             : 
    +     502             :   // | -------------------- calculate the dt -------------------- |
    +     503             : 
    +     504             :   double dt;
    +     505             : 
    +     506       27204 :   if (first_iteration_) {
    +     507          27 :     dt               = 0.01;
    +     508          27 :     first_iteration_ = false;
    +     509             :   } else {
    +     510       27177 :     dt = (uav_state.header.stamp - last_update_time_).toSec();
    +     511             :   }
    +     512             : 
    +     513       27204 :   last_update_time_ = uav_state.header.stamp;
    +     514             : 
    +     515       27204 :   if (fabs(dt) < 0.001) {
    +     516             : 
    +     517           0 :     ROS_DEBUG("[Se3Controller]: the last odometry message came too close (%.2f s)!", dt);
    +     518             : 
    +     519           0 :     dt = 0.01;
    +     520             :   }
    +     521             : 
    +     522             :   // | ----------- obtain the lowest possible modality ---------- |
    +     523             : 
    +     524       27204 :   auto lowest_modality = common::getLowestOuput(common_handlers_->control_output_modalities);
    +     525             : 
    +     526       27204 :   if (!lowest_modality) {
    +     527             : 
    +     528           0 :     ROS_ERROR_THROTTLE(1.0, "[Se3Controller]: output modalities are empty! This error should never appear.");
    +     529             : 
    +     530           0 :     return last_control_output_;
    +     531             :   }
    +     532             : 
    +     533             :   // | ----- we might prefer some output mode over the other ---- |
    +     534             : 
    +     535       27204 :   if (drs_params.preferred_output_mode == OUTPUT_ATTITUDE_RATE && common_handlers_->control_output_modalities.attitude_rate) {
    +     536       19645 :     ROS_DEBUG_THROTTLE(1.0, "[Se3Controller]: prioritizing attitude rate output");
    +     537       19645 :     lowest_modality = common::ATTITUDE_RATE;
    +     538        7559 :   } else if (drs_params.preferred_output_mode == OUTPUT_ATTITUDE && common_handlers_->control_output_modalities.attitude) {
    +     539           0 :     ROS_DEBUG_THROTTLE(1.0, "[Se3Controller]: prioritizing attitude output");
    +     540           0 :     lowest_modality = common::ATTITUDE;
    +     541        7559 :   } else if (drs_params.preferred_output_mode == OUTPUT_CONTROL_GROUP && common_handlers_->control_output_modalities.control_group) {
    +     542           0 :     ROS_DEBUG_THROTTLE(1.0, "[Se3Controller]: prioritizing control group output");
    +     543           0 :     lowest_modality = common::CONTROL_GROUP;
    +     544        7559 :   } else if (drs_params.preferred_output_mode == OUTPUT_ACTUATORS && common_handlers_->control_output_modalities.actuators) {
    +     545           0 :     ROS_DEBUG_THROTTLE(1.0, "[Se3Controller]: prioritizing actuators output");
    +     546           0 :     lowest_modality = common::ACTUATORS_CMD;
    +     547             :   }
    +     548             : 
    +     549       27204 :   switch (lowest_modality.value()) {
    +     550             : 
    +     551         251 :     case common::POSITION: {
    +     552         251 :       positionPassthrough(uav_state, tracker_command);
    +     553         251 :       break;
    +     554             :     }
    +     555             : 
    +     556         860 :     case common::VELOCITY_HDG: {
    +     557         860 :       PIDVelocityOutput(uav_state, tracker_command, common::VELOCITY_HDG, dt);
    +     558         860 :       break;
    +     559             :     }
    +     560             : 
    +     561        1765 :     case common::VELOCITY_HDG_RATE: {
    +     562        1765 :       PIDVelocityOutput(uav_state, tracker_command, common::VELOCITY_HDG_RATE, dt);
    +     563        1765 :       break;
    +     564             :     }
    +     565             : 
    +     566         554 :     case common::ACCELERATION_HDG: {
    +     567         554 :       SE3Controller(uav_state, tracker_command, dt, common::ACCELERATION_HDG);
    +     568         554 :       break;
    +     569             :     }
    +     570             : 
    +     571         549 :     case common::ACCELERATION_HDG_RATE: {
    +     572         549 :       SE3Controller(uav_state, tracker_command, dt, common::ACCELERATION_HDG_RATE);
    +     573         549 :       break;
    +     574             :     }
    +     575             : 
    +     576        1130 :     case common::ATTITUDE: {
    +     577        1130 :       SE3Controller(uav_state, tracker_command, dt, common::ATTITUDE);
    +     578        1130 :       break;
    +     579             :     }
    +     580             : 
    +     581       19645 :     case common::ATTITUDE_RATE: {
    +     582       19645 :       SE3Controller(uav_state, tracker_command, dt, common::ATTITUDE_RATE);
    +     583       19645 :       break;
    +     584             :     }
    +     585             : 
    +     586        1228 :     case common::CONTROL_GROUP: {
    +     587        1228 :       SE3Controller(uav_state, tracker_command, dt, common::CONTROL_GROUP);
    +     588        1228 :       break;
    +     589             :     }
    +     590             : 
    +     591        1222 :     case common::ACTUATORS_CMD: {
    +     592        1222 :       SE3Controller(uav_state, tracker_command, dt, common::ACTUATORS_CMD);
    +     593        1222 :       break;
    +     594             :     }
    +     595             : 
    +     596       27204 :     default: {
    +     597             :     }
    +     598             :   }
    +     599             : 
    +     600       27204 :   return last_control_output_;
    +     601             : }
    +     602             : 
    +     603             : //}
    +     604             : 
    +     605             : /* //{ getStatus() */
    +     606             : 
    +     607        2761 : const mrs_msgs::ControllerStatus Se3Controller::getStatus() {
    +     608             : 
    +     609        2761 :   mrs_msgs::ControllerStatus controller_status;
    +     610             : 
    +     611        2761 :   controller_status.active = is_active_;
    +     612             : 
    +     613        2761 :   return controller_status;
    +     614             : }
    +     615             : 
    +     616             : //}
    +     617             : 
    +     618             : /* switchOdometrySource() //{ */
    +     619             : 
    +     620           0 : void Se3Controller::switchOdometrySource(const mrs_msgs::UavState& new_uav_state) {
    +     621             : 
    +     622           0 :   ROS_INFO("[Se3Controller]: switching the odometry source");
    +     623             : 
    +     624           0 :   auto uav_state = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +     625             : 
    +     626             :   // | ----- transform world disturabances to the new frame ----- |
    +     627             : 
    +     628           0 :   geometry_msgs::Vector3Stamped world_integrals;
    +     629             : 
    +     630           0 :   world_integrals.header.stamp    = ros::Time::now();
    +     631           0 :   world_integrals.header.frame_id = uav_state.header.frame_id;
    +     632             : 
    +     633           0 :   world_integrals.vector.x = Iw_w_[0];
    +     634           0 :   world_integrals.vector.y = Iw_w_[1];
    +     635           0 :   world_integrals.vector.z = 0;
    +     636             : 
    +     637           0 :   auto res = common_handlers_->transformer->transformSingle(world_integrals, new_uav_state.header.frame_id);
    +     638             : 
    +     639           0 :   if (res) {
    +     640             : 
    +     641           0 :     std::scoped_lock lock(mutex_integrals_);
    +     642             : 
    +     643           0 :     Iw_w_[0] = res.value().vector.x;
    +     644           0 :     Iw_w_[1] = res.value().vector.y;
    +     645             : 
    +     646             :   } else {
    +     647             : 
    +     648           0 :     ROS_ERROR_THROTTLE(1.0, "[Se3Controller]: could not transform world integral to the new frame");
    +     649             : 
    +     650           0 :     std::scoped_lock lock(mutex_integrals_);
    +     651             : 
    +     652           0 :     Iw_w_[0] = 0;
    +     653           0 :     Iw_w_[1] = 0;
    +     654             :   }
    +     655           0 : }
    +     656             : 
    +     657             : //}
    +     658             : 
    +     659             : /* resetDisturbanceEstimators() //{ */
    +     660             : 
    +     661           0 : void Se3Controller::resetDisturbanceEstimators(void) {
    +     662             : 
    +     663           0 :   std::scoped_lock lock(mutex_integrals_);
    +     664             : 
    +     665           0 :   Iw_w_ = Eigen::Vector2d::Zero(2);
    +     666           0 :   Ib_b_ = Eigen::Vector2d::Zero(2);
    +     667           0 : }
    +     668             : 
    +     669             : //}
    +     670             : 
    +     671             : /* setConstraints() //{ */
    +     672             : 
    +     673         360 : const mrs_msgs::DynamicsConstraintsSrvResponse::ConstPtr Se3Controller::setConstraints([
    +     674             :     [maybe_unused]] const mrs_msgs::DynamicsConstraintsSrvRequest::ConstPtr& constraints) {
    +     675             : 
    +     676         360 :   if (!is_initialized_) {
    +     677           0 :     return mrs_msgs::DynamicsConstraintsSrvResponse::ConstPtr(new mrs_msgs::DynamicsConstraintsSrvResponse());
    +     678             :   }
    +     679             : 
    +     680         360 :   mrs_lib::set_mutexed(mutex_constraints_, constraints->constraints, constraints_);
    +     681             : 
    +     682         360 :   ROS_INFO("[Se3Controller]: updating constraints");
    +     683             : 
    +     684         720 :   mrs_msgs::DynamicsConstraintsSrvResponse res;
    +     685         360 :   res.success = true;
    +     686         360 :   res.message = "constraints updated";
    +     687             : 
    +     688         360 :   return mrs_msgs::DynamicsConstraintsSrvResponse::ConstPtr(new mrs_msgs::DynamicsConstraintsSrvResponse(res));
    +     689             : }
    +     690             : 
    +     691             : //}
    +     692             : 
    +     693             : // --------------------------------------------------------------
    +     694             : // |                         controllers                        |
    +     695             : // --------------------------------------------------------------
    +     696             : 
    +     697             : /* SE3Controller() //{ */
    +     698             : 
    +     699       24328 : void Se3Controller::SE3Controller(const mrs_msgs::UavState& uav_state, const mrs_msgs::TrackerCommand& tracker_command, const double& dt,
    +     700             :                                   const common::CONTROL_OUTPUT& output_modality) {
    +     701             : 
    +     702       48656 :   auto drs_params  = mrs_lib::get_mutexed(mutex_drs_params_, drs_params_);
    +     703       24328 :   auto constraints = mrs_lib::get_mutexed(mutex_constraints_, constraints_);
    +     704       24328 :   auto gains       = mrs_lib::get_mutexed(mutex_gains_, gains_);
    +     705             : 
    +     706             :   // | ----------------- get the current heading ---------------- |
    +     707             : 
    +     708       24328 :   double uav_heading = getHeadingSafely(uav_state, tracker_command);
    +     709             : 
    +     710             :   // --------------------------------------------------------------
    +     711             :   // |          load the control reference and estimates          |
    +     712             :   // --------------------------------------------------------------
    +     713             : 
    +     714             :   // Rp - position reference in global frame
    +     715             :   // Rv - velocity reference in global frame
    +     716             :   // Ra - velocity reference in global frame
    +     717             : 
    +     718       24328 :   Eigen::Vector3d Rp = Eigen::Vector3d::Zero(3);
    +     719       24328 :   Eigen::Vector3d Rv = Eigen::Vector3d::Zero(3);
    +     720       24328 :   Eigen::Vector3d Ra = Eigen::Vector3d::Zero(3);
    +     721             : 
    +     722       24328 :   if (tracker_command.use_position_vertical || tracker_command.use_position_horizontal) {
    +     723             : 
    +     724       24328 :     if (tracker_command.use_position_horizontal) {
    +     725       24328 :       Rp[0] = tracker_command.position.x;
    +     726       24328 :       Rp[1] = tracker_command.position.y;
    +     727             :     } else {
    +     728           0 :       Rv[0] = 0;
    +     729           0 :       Rv[1] = 0;
    +     730             :     }
    +     731             : 
    +     732       24328 :     if (tracker_command.use_position_vertical) {
    +     733       24328 :       Rp[2] = tracker_command.position.z;
    +     734             :     } else {
    +     735           0 :       Rv[2] = 0;
    +     736             :     }
    +     737             :   }
    +     738             : 
    +     739       24328 :   if (tracker_command.use_velocity_horizontal) {
    +     740       24328 :     Rv[0] = tracker_command.velocity.x;
    +     741       24328 :     Rv[1] = tracker_command.velocity.y;
    +     742             :   } else {
    +     743           0 :     Rv[0] = 0;
    +     744           0 :     Rv[1] = 0;
    +     745             :   }
    +     746             : 
    +     747       24328 :   if (tracker_command.use_velocity_vertical) {
    +     748       24328 :     Rv[2] = tracker_command.velocity.z;
    +     749             :   } else {
    +     750           0 :     Rv[2] = 0;
    +     751             :   }
    +     752             : 
    +     753       24328 :   if (tracker_command.use_acceleration) {
    +     754       24327 :     Ra << tracker_command.acceleration.x, tracker_command.acceleration.y, tracker_command.acceleration.z;
    +     755             :   } else {
    +     756           1 :     Ra << 0, 0, 0;
    +     757             :   }
    +     758             : 
    +     759             :   // | ------ store the estimated values from the uav state ----- |
    +     760             : 
    +     761             :   // Op - position in global frame
    +     762             :   // Ov - velocity in global frame
    +     763       24328 :   Eigen::Vector3d Op(uav_state.pose.position.x, uav_state.pose.position.y, uav_state.pose.position.z);
    +     764       24328 :   Eigen::Vector3d Ov(uav_state.velocity.linear.x, uav_state.velocity.linear.y, uav_state.velocity.linear.z);
    +     765             : 
    +     766             :   // R - current uav attitude
    +     767       24328 :   Eigen::Matrix3d R = mrs_lib::AttitudeConverter(uav_state.pose.orientation);
    +     768             : 
    +     769             :   // Ow - UAV angular rate
    +     770       24328 :   Eigen::Vector3d Ow(uav_state.velocity.angular.x, uav_state.velocity.angular.y, uav_state.velocity.angular.z);
    +     771             : 
    +     772             :   // | -------------- calculate the control errors -------------- |
    +     773             : 
    +     774             :   // position control error
    +     775       24328 :   Eigen::Vector3d Ep(0, 0, 0);
    +     776             : 
    +     777       24328 :   if (tracker_command.use_position_horizontal || tracker_command.use_position_vertical) {
    +     778       24328 :     Ep = Rp - Op;
    +     779             :   }
    +     780             : 
    +     781             :   // velocity control error
    +     782       24328 :   Eigen::Vector3d Ev(0, 0, 0);
    +     783             : 
    +     784       24328 :   if (tracker_command.use_velocity_horizontal || tracker_command.use_velocity_vertical ||
    +     785           0 :       tracker_command.use_position_vertical) {  // use_position_vertical = true, not a mistake, this provides dampening
    +     786       24328 :     Ev = Rv - Ov;
    +     787             :   }
    +     788             : 
    +     789             :   // | --------------------- load the gains --------------------- |
    +     790             : 
    +     791       24328 :   mute_gains_by_tracker_ = tracker_command.disable_position_gains;
    +     792             : 
    +     793       24328 :   Eigen::Vector3d Ka(0, 0, 0);
    +     794       24328 :   Eigen::Array3d  Kp(0, 0, 0);
    +     795       24328 :   Eigen::Array3d  Kv(0, 0, 0);
    +     796       24328 :   Eigen::Array3d  Kq(0, 0, 0);
    +     797       24328 :   Eigen::Array3d  Kw(0, 0, 0);
    +     798             : 
    +     799             :   {
    +     800       24328 :     std::scoped_lock lock(mutex_gains_);
    +     801             : 
    +     802       24328 :     if (tracker_command.use_position_horizontal) {
    +     803       24328 :       Kp[0] = gains.kpxy;
    +     804       24328 :       Kp[1] = gains.kpxy;
    +     805             :     } else {
    +     806           0 :       Kp[0] = 0;
    +     807           0 :       Kp[1] = 0;
    +     808             :     }
    +     809             : 
    +     810       24328 :     if (tracker_command.use_position_vertical) {
    +     811       24328 :       Kp[2] = gains.kpz;
    +     812             :     } else {
    +     813           0 :       Kp[2] = 0;
    +     814             :     }
    +     815             : 
    +     816       24328 :     if (tracker_command.use_velocity_horizontal) {
    +     817       24328 :       Kv[0] = gains.kvxy;
    +     818       24328 :       Kv[1] = gains.kvxy;
    +     819             :     } else {
    +     820           0 :       Kv[0] = 0;
    +     821           0 :       Kv[1] = 0;
    +     822             :     }
    +     823             : 
    +     824             :     // special case: if want to control z-pos but not the velocity => at least provide z dampening, therefore kvz_
    +     825       24328 :     if (tracker_command.use_velocity_vertical || tracker_command.use_position_vertical) {
    +     826       24328 :       Kv[2] = gains.kvz;
    +     827             :     } else {
    +     828           0 :       Kv[2] = 0;
    +     829             :     }
    +     830             : 
    +     831       24328 :     if (tracker_command.use_acceleration) {
    +     832       24327 :       Ka << gains.kaxy, gains.kaxy, gains.kaz;
    +     833             :     } else {
    +     834           1 :       Ka << 0, 0, 0;
    +     835             :     }
    +     836             : 
    +     837       24328 :     if (!tracker_command.use_attitude_rate) {
    +     838       24328 :       Kq << gains.kq_roll_pitch, gains.kq_roll_pitch, gains.kq_yaw;
    +     839             :     }
    +     840             : 
    +     841       24328 :     Kw[0] = gains.kw_roll_pitch;
    +     842       24328 :     Kw[1] = gains.kw_roll_pitch;
    +     843       24328 :     Kw[2] = gains.kw_yaw;
    +     844             :   }
    +     845             : 
    +     846       24328 :   Kp = Kp * (_uav_mass_ + uav_mass_difference_);
    +     847       24328 :   Kv = Kv * (_uav_mass_ + uav_mass_difference_);
    +     848             : 
    +     849             :   // | --------------- desired orientation matrix --------------- |
    +     850             : 
    +     851             :   // get body integral in the world frame
    +     852             : 
    +     853       24328 :   Eigen::Vector2d Ib_w = Eigen::Vector2d(0, 0);
    +     854             : 
    +     855             :   {
    +     856       48656 :     geometry_msgs::Vector3Stamped Ib_b_stamped;
    +     857             : 
    +     858       24328 :     Ib_b_stamped.header.stamp    = ros::Time::now();
    +     859       24328 :     Ib_b_stamped.header.frame_id = "fcu_untilted";
    +     860       24328 :     Ib_b_stamped.vector.x        = Ib_b_(0);
    +     861       24328 :     Ib_b_stamped.vector.y        = Ib_b_(1);
    +     862       24328 :     Ib_b_stamped.vector.z        = 0;
    +     863             : 
    +     864       48656 :     auto res = common_handlers_->transformer->transformSingle(Ib_b_stamped, uav_state_.header.frame_id);
    +     865             : 
    +     866       24328 :     if (res) {
    +     867       24328 :       Ib_w[0] = res.value().vector.x;
    +     868       24328 :       Ib_w[1] = res.value().vector.y;
    +     869             :     } else {
    +     870           0 :       ROS_ERROR_THROTTLE(1.0, "[Se3Controller]: could not transform the Ib_b_ to the world frame");
    +     871             :     }
    +     872             :   }
    +     873             : 
    +     874             :   // construct the desired force vector
    +     875             : 
    +     876       24328 :   double total_mass = _uav_mass_ + uav_mass_difference_;
    +     877             : 
    +     878       24328 :   Eigen::Vector3d feed_forward      = total_mass * (Eigen::Vector3d(0, 0, common_handlers_->g) + Ra);
    +     879       24328 :   Eigen::Vector3d position_feedback = Kp * Ep.array();
    +     880       24328 :   Eigen::Vector3d velocity_feedback = Kv * Ev.array();
    +     881       24328 :   Eigen::Vector3d integral_feedback;
    +     882             :   {
    +     883       24328 :     std::scoped_lock lock(mutex_integrals_);
    +     884             : 
    +     885       24328 :     integral_feedback << Ib_w[0] + Iw_w_[0], Ib_w[1] + Iw_w_[1], 0;
    +     886             :   }
    +     887             : 
    +     888             :   // --------------------------------------------------------------
    +     889             :   // |                 integrators and estimators                 |
    +     890             :   // --------------------------------------------------------------
    +     891             : 
    +     892             :   /* world error integrator //{ */
    +     893             : 
    +     894             :   // --------------------------------------------------------------
    +     895             :   // |                  integrate the world error                 |
    +     896             :   // --------------------------------------------------------------
    +     897             : 
    +     898             :   {
    +     899       48656 :     std::scoped_lock lock(mutex_gains_, mutex_integrals_);
    +     900             : 
    +     901       24328 :     Eigen::Vector3d integration_switch(1, 1, 0);
    +     902             : 
    +     903             :     // integrate the world error
    +     904       24328 :     if (tracker_command.use_position_horizontal) {
    +     905       24328 :       Iw_w_ += gains.kiwxy * Ep.head(2) * dt;
    +     906           0 :     } else if (tracker_command.use_velocity_horizontal) {
    +     907           0 :       Iw_w_ += gains.kiwxy * Ev.head(2) * dt;
    +     908             :     }
    +     909             : 
    +     910             :     // saturate the world X
    +     911       24328 :     bool world_integral_saturated = false;
    +     912       24328 :     if (!std::isfinite(Iw_w_[0])) {
    +     913           0 :       Iw_w_[0] = 0;
    +     914           0 :       ROS_ERROR_THROTTLE(1.0, "[Se3Controller]: NaN detected in variable 'Iw_w_[0]', setting it to 0!!!");
    +     915       24328 :     } else if (Iw_w_[0] > gains.kiwxy_lim) {
    +     916           0 :       Iw_w_[0]                 = gains.kiwxy_lim;
    +     917           0 :       world_integral_saturated = true;
    +     918       24328 :     } else if (Iw_w_[0] < -gains.kiwxy_lim) {
    +     919           0 :       Iw_w_[0]                 = -gains.kiwxy_lim;
    +     920           0 :       world_integral_saturated = true;
    +     921             :     }
    +     922             : 
    +     923       24328 :     if (gains.kiwxy_lim >= 0 && world_integral_saturated) {
    +     924           0 :       ROS_WARN_THROTTLE(1.0, "[Se3Controller]: SE3's world X integral is being saturated!");
    +     925             :     }
    +     926             : 
    +     927             :     // saturate the world Y
    +     928       24328 :     world_integral_saturated = false;
    +     929       24328 :     if (!std::isfinite(Iw_w_[1])) {
    +     930           0 :       Iw_w_[1] = 0;
    +     931           0 :       ROS_ERROR_THROTTLE(1.0, "[Se3Controller]: NaN detected in variable 'Iw_w_[1]', setting it to 0!!!");
    +     932       24328 :     } else if (Iw_w_[1] > gains.kiwxy_lim) {
    +     933           0 :       Iw_w_[1]                 = gains.kiwxy_lim;
    +     934           0 :       world_integral_saturated = true;
    +     935       24328 :     } else if (Iw_w_[1] < -gains.kiwxy_lim) {
    +     936           0 :       Iw_w_[1]                 = -gains.kiwxy_lim;
    +     937           0 :       world_integral_saturated = true;
    +     938             :     }
    +     939             : 
    +     940       24328 :     if (gains.kiwxy_lim >= 0 && world_integral_saturated) {
    +     941           0 :       ROS_WARN_THROTTLE(1.0, "[Se3Controller]: SE3's world Y integral is being saturated!");
    +     942             :     }
    +     943             :   }
    +     944             : 
    +     945             :   //}
    +     946             : 
    +     947             :   /* body error integrator //{ */
    +     948             : 
    +     949             :   // --------------------------------------------------------------
    +     950             :   // |                  integrate the body error                  |
    +     951             :   // --------------------------------------------------------------
    +     952             : 
    +     953             :   {
    +     954       48656 :     std::scoped_lock lock(mutex_gains_);
    +     955             : 
    +     956       24328 :     Eigen::Vector2d Ep_fcu_untilted = Eigen::Vector2d(0, 0);  // position error in the untilted frame of the UAV
    +     957       24328 :     Eigen::Vector2d Ev_fcu_untilted = Eigen::Vector2d(0, 0);  // velocity error in the untilted frame of the UAV
    +     958             : 
    +     959             :     // get the position control error in the fcu_untilted frame
    +     960             :     {
    +     961             : 
    +     962       48656 :       geometry_msgs::Vector3Stamped Ep_stamped;
    +     963             : 
    +     964       24328 :       Ep_stamped.header.stamp    = ros::Time::now();
    +     965       24328 :       Ep_stamped.header.frame_id = uav_state_.header.frame_id;
    +     966       24328 :       Ep_stamped.vector.x        = Ep(0);
    +     967       24328 :       Ep_stamped.vector.y        = Ep(1);
    +     968       24328 :       Ep_stamped.vector.z        = Ep(2);
    +     969             : 
    +     970       72984 :       auto res = common_handlers_->transformer->transformSingle(Ep_stamped, "fcu_untilted");
    +     971             : 
    +     972       24328 :       if (res) {
    +     973       24328 :         Ep_fcu_untilted[0] = res.value().vector.x;
    +     974       24328 :         Ep_fcu_untilted[1] = res.value().vector.y;
    +     975             :       } else {
    +     976           0 :         ROS_ERROR_THROTTLE(1.0, "[Se3Controller]: could not transform the position error to fcu_untilted");
    +     977             :       }
    +     978             :     }
    +     979             : 
    +     980             :     // get the velocity control error in the fcu_untilted frame
    +     981             :     {
    +     982       48656 :       geometry_msgs::Vector3Stamped Ev_stamped;
    +     983             : 
    +     984       24328 :       Ev_stamped.header.stamp    = ros::Time::now();
    +     985       24328 :       Ev_stamped.header.frame_id = uav_state_.header.frame_id;
    +     986       24328 :       Ev_stamped.vector.x        = Ev(0);
    +     987       24328 :       Ev_stamped.vector.y        = Ev(1);
    +     988       24328 :       Ev_stamped.vector.z        = Ev(2);
    +     989             : 
    +     990       72984 :       auto res = common_handlers_->transformer->transformSingle(Ev_stamped, "fcu_untilted");
    +     991             : 
    +     992       24328 :       if (res) {
    +     993       24328 :         Ev_fcu_untilted[0] = res.value().vector.x;
    +     994       24328 :         Ev_fcu_untilted[1] = res.value().vector.x;
    +     995             :       } else {
    +     996           0 :         ROS_ERROR_THROTTLE(1.0, "[Se3Controller]: could not transform the velocity error to fcu_untilted");
    +     997             :       }
    +     998             :     }
    +     999             : 
    +    1000             :     // integrate the body error
    +    1001       24328 :     if (tracker_command.use_position_horizontal) {
    +    1002       24328 :       Ib_b_ += gains.kibxy * Ep_fcu_untilted * dt;
    +    1003           0 :     } else if (tracker_command.use_velocity_horizontal) {
    +    1004           0 :       Ib_b_ += gains.kibxy * Ev_fcu_untilted * dt;
    +    1005             :     }
    +    1006             : 
    +    1007             :     // saturate the body
    +    1008       24328 :     bool body_integral_saturated = false;
    +    1009       24328 :     if (!std::isfinite(Ib_b_[0])) {
    +    1010           0 :       Ib_b_[0] = 0;
    +    1011           0 :       ROS_ERROR_THROTTLE(1.0, "[Se3Controller]: NaN detected in variable 'Ib_b_[0]', setting it to 0!!!");
    +    1012       24328 :     } else if (Ib_b_[0] > gains.kibxy_lim) {
    +    1013           0 :       Ib_b_[0]                = gains.kibxy_lim;
    +    1014           0 :       body_integral_saturated = true;
    +    1015       24328 :     } else if (Ib_b_[0] < -gains.kibxy_lim) {
    +    1016           0 :       Ib_b_[0]                = -gains.kibxy_lim;
    +    1017           0 :       body_integral_saturated = true;
    +    1018             :     }
    +    1019             : 
    +    1020       24328 :     if (gains.kibxy_lim > 0 && body_integral_saturated) {
    +    1021           0 :       ROS_WARN_THROTTLE(1.0, "[Se3Controller]: SE3's body pitch integral is being saturated!");
    +    1022             :     }
    +    1023             : 
    +    1024             :     // saturate the body
    +    1025       24328 :     body_integral_saturated = false;
    +    1026       24328 :     if (!std::isfinite(Ib_b_[1])) {
    +    1027           0 :       Ib_b_[1] = 0;
    +    1028           0 :       ROS_ERROR_THROTTLE(1.0, "[Se3Controller]: NaN detected in variable 'Ib_b_[1]', setting it to 0!!!");
    +    1029       24328 :     } else if (Ib_b_[1] > gains.kibxy_lim) {
    +    1030           0 :       Ib_b_[1]                = gains.kibxy_lim;
    +    1031           0 :       body_integral_saturated = true;
    +    1032       24328 :     } else if (Ib_b_[1] < -gains.kibxy_lim) {
    +    1033           0 :       Ib_b_[1]                = -gains.kibxy_lim;
    +    1034           0 :       body_integral_saturated = true;
    +    1035             :     }
    +    1036             : 
    +    1037       24328 :     if (gains.kibxy_lim > 0 && body_integral_saturated) {
    +    1038           0 :       ROS_WARN_THROTTLE(1.0, "[Se3Controller]: SE3's body roll integral is being saturated!");
    +    1039             :     }
    +    1040             :   }
    +    1041             : 
    +    1042             :   //}
    +    1043             : 
    +    1044       24328 :   if (output_modality == common::ACCELERATION_HDG || output_modality == common::ACCELERATION_HDG_RATE) {
    +    1045             : 
    +    1046        1103 :     Eigen::Vector3d des_acc = (position_feedback + velocity_feedback + integral_feedback) / total_mass + Ra;
    +    1047             : 
    +    1048        1103 :     if (output_modality == common::ACCELERATION_HDG) {
    +    1049             : 
    +    1050        1108 :       mrs_msgs::HwApiAccelerationHdgCmd cmd;
    +    1051             : 
    +    1052         554 :       cmd.acceleration.x = des_acc[0];
    +    1053         554 :       cmd.acceleration.y = des_acc[1];
    +    1054         554 :       cmd.acceleration.z = des_acc[2];
    +    1055             : 
    +    1056         554 :       cmd.heading = tracker_command.heading;
    +    1057             : 
    +    1058         554 :       last_control_output_.control_output = cmd;
    +    1059             : 
    +    1060             :     } else {
    +    1061             : 
    +    1062         549 :       double des_hdg_ff = 0;
    +    1063             : 
    +    1064         549 :       if (tracker_command.use_heading_rate) {
    +    1065         549 :         des_hdg_ff = tracker_command.heading_rate;
    +    1066             :       }
    +    1067             : 
    +    1068        1098 :       mrs_msgs::HwApiAccelerationHdgRateCmd cmd;
    +    1069             : 
    +    1070         549 :       cmd.acceleration.x = des_acc[0];
    +    1071         549 :       cmd.acceleration.y = des_acc[1];
    +    1072         549 :       cmd.acceleration.z = des_acc[2];
    +    1073             : 
    +    1074         549 :       position_pid_heading_.setSaturation(constraints.heading_speed);
    +    1075             : 
    +    1076         549 :       double hdg_err = mrs_lib::geometry::sradians::diff(tracker_command.heading, uav_heading);
    +    1077             : 
    +    1078         549 :       double des_hdg_rate = position_pid_heading_.update(hdg_err, dt) + des_hdg_ff;
    +    1079             : 
    +    1080         549 :       cmd.heading_rate = des_hdg_rate;
    +    1081             : 
    +    1082         549 :       last_control_output_.desired_heading_rate = des_hdg_rate;
    +    1083             : 
    +    1084         549 :       last_control_output_.control_output = cmd;
    +    1085             :     }
    +    1086             : 
    +    1087             :     // | -------------- unbiased desired acceleration ------------- |
    +    1088             : 
    +    1089        1103 :     Eigen::Vector3d unbiased_des_acc(0, 0, 0);
    +    1090             : 
    +    1091             :     {
    +    1092             : 
    +    1093        1103 :       Eigen::Vector3d unbiased_des_acc_world = (position_feedback + velocity_feedback) / total_mass + Ra;
    +    1094             : 
    +    1095        2206 :       geometry_msgs::Vector3Stamped world_accel;
    +    1096             : 
    +    1097        1103 :       world_accel.header.stamp    = ros::Time::now();
    +    1098        1103 :       world_accel.header.frame_id = uav_state.header.frame_id;
    +    1099        1103 :       world_accel.vector.x        = unbiased_des_acc_world[0];
    +    1100        1103 :       world_accel.vector.y        = unbiased_des_acc_world[1];
    +    1101        1103 :       world_accel.vector.z        = unbiased_des_acc_world[2];
    +    1102             : 
    +    1103        3309 :       auto res = common_handlers_->transformer->transformSingle(world_accel, "fcu");
    +    1104             : 
    +    1105        1103 :       if (res) {
    +    1106        1103 :         unbiased_des_acc << res.value().vector.x, res.value().vector.y, res.value().vector.z;
    +    1107             :       }
    +    1108             :     }
    +    1109             : 
    +    1110             :     // fill the unbiased desired accelerations
    +    1111        1103 :     last_control_output_.desired_unbiased_acceleration = unbiased_des_acc;
    +    1112             : 
    +    1113             :     // | ----------------- fill in the diagnostics ---------------- |
    +    1114             : 
    +    1115        1103 :     last_control_output_.diagnostics.ramping_up = false;
    +    1116             : 
    +    1117        1103 :     last_control_output_.diagnostics.mass_estimator  = false;
    +    1118        1103 :     last_control_output_.diagnostics.mass_difference = 0;
    +    1119        1103 :     last_control_output_.diagnostics.total_mass      = total_mass;
    +    1120             : 
    +    1121        1103 :     last_control_output_.diagnostics.disturbance_estimator = true;
    +    1122             : 
    +    1123        1103 :     last_control_output_.diagnostics.disturbance_bx_b = -Ib_b_[0];
    +    1124        1103 :     last_control_output_.diagnostics.disturbance_by_b = -Ib_b_[1];
    +    1125             : 
    +    1126        1103 :     last_control_output_.diagnostics.disturbance_bx_w = -Ib_w[0];
    +    1127        1103 :     last_control_output_.diagnostics.disturbance_by_w = -Ib_w[1];
    +    1128             : 
    +    1129        1103 :     last_control_output_.diagnostics.disturbance_wx_w = -Iw_w_[0];
    +    1130        1103 :     last_control_output_.diagnostics.disturbance_wy_w = -Iw_w_[1];
    +    1131             : 
    +    1132        1103 :     last_control_output_.diagnostics.controller_enforcing_constraints = false;
    +    1133             : 
    +    1134        1103 :     last_control_output_.diagnostics.controller = "Se3Controller";
    +    1135             : 
    +    1136        1103 :     return;
    +    1137             :   }
    +    1138             : 
    +    1139             :   /* mass estimatior //{ */
    +    1140             : 
    +    1141             :   // --------------------------------------------------------------
    +    1142             :   // |                integrate the mass difference               |
    +    1143             :   // --------------------------------------------------------------
    +    1144             : 
    +    1145             :   {
    +    1146       46450 :     std::scoped_lock lock(mutex_gains_);
    +    1147             : 
    +    1148       23225 :     if (tracker_command.use_position_vertical && !rampup_active_) {
    +    1149       23209 :       uav_mass_difference_ += gains.km * Ep[2] * dt;
    +    1150             :     }
    +    1151             : 
    +    1152             :     // saturate the mass estimator
    +    1153       23225 :     bool uav_mass_saturated = false;
    +    1154       23225 :     if (!std::isfinite(uav_mass_difference_)) {
    +    1155           0 :       uav_mass_difference_ = 0;
    +    1156           0 :       ROS_WARN_THROTTLE(1.0, "[Se3Controller]: NaN detected in variable 'uav_mass_difference_', setting it to 0 and returning!!!");
    +    1157       23225 :     } else if (uav_mass_difference_ > gains.km_lim) {
    +    1158           0 :       uav_mass_difference_ = gains.km_lim;
    +    1159           0 :       uav_mass_saturated   = true;
    +    1160       23225 :     } else if (uav_mass_difference_ < -gains.km_lim) {
    +    1161           0 :       uav_mass_difference_ = -gains.km_lim;
    +    1162           0 :       uav_mass_saturated   = true;
    +    1163             :     }
    +    1164             : 
    +    1165       23225 :     if (uav_mass_saturated) {
    +    1166           0 :       ROS_WARN_THROTTLE(1.0, "[Se3Controller]: The UAV mass difference is being saturated to %.2f!", uav_mass_difference_);
    +    1167             :     }
    +    1168             :   }
    +    1169             : 
    +    1170             :   //}
    +    1171             : 
    +    1172       23225 :   Eigen::Vector3d f = position_feedback + velocity_feedback + integral_feedback + feed_forward;
    +    1173             : 
    +    1174             :   // | ----------- limiting the downwards acceleration ---------- |
    +    1175             :   // the downwards force produced by the position and the acceleration feedback should not be larger than the gravity
    +    1176             : 
    +    1177             :   // if the downwards part of the force is close to counter-act the gravity acceleration
    +    1178       23225 :   if (f[2] < 0) {
    +    1179             : 
    +    1180           0 :     ROS_WARN_THROTTLE(1.0, "[Se3Controller]: the calculated downwards desired force is negative (%.2f) -> mitigating flip", f[2]);
    +    1181             : 
    +    1182           0 :     f << 0, 0, 1;
    +    1183             :   }
    +    1184             : 
    +    1185             :   // | ------------------- sanitize tilt angle ------------------ |
    +    1186             : 
    +    1187       23225 :   double tilt_safety_limit = _tilt_angle_failsafe_enabled_ ? _tilt_angle_failsafe_ : std::numeric_limits<double>::max();
    +    1188             : 
    +    1189       23225 :   auto f_normed_sanitized = common::sanitizeDesiredForce(f.normalized(), tilt_safety_limit, constraints.tilt, "Se3Controller");
    +    1190             : 
    +    1191       23225 :   if (!f_normed_sanitized) {
    +    1192             : 
    +    1193           0 :     ROS_INFO("[Se3Controller]: position feedback: [%.2f, %.2f, %.2f]", position_feedback[0], position_feedback[1], position_feedback[2]);
    +    1194           0 :     ROS_INFO("[Se3Controller]: velocity feedback: [%.2f, %.2f, %.2f]", velocity_feedback[0], velocity_feedback[1], velocity_feedback[2]);
    +    1195           0 :     ROS_INFO("[Se3Controller]: integral feedback: [%.2f, %.2f, %.2f]", integral_feedback[0], integral_feedback[1], integral_feedback[2]);
    +    1196           0 :     ROS_INFO("[Se3Controller]: tracker_cmd: x: %.2f, y: %.2f, z: %.2f, heading: %.2f", tracker_command.position.x, tracker_command.position.y,
    +    1197             :              tracker_command.position.z, tracker_command.heading);
    +    1198           0 :     ROS_INFO("[Se3Controller]: odometry: x: %.2f, y: %.2f, z: %.2f, heading: %.2f", uav_state.pose.position.x, uav_state.pose.position.y,
    +    1199             :              uav_state.pose.position.z, uav_heading);
    +    1200             : 
    +    1201           0 :     return;
    +    1202             :   }
    +    1203             : 
    +    1204       23225 :   Eigen::Vector3d f_normed = f_normed_sanitized.value();
    +    1205             : 
    +    1206             :   // --------------------------------------------------------------
    +    1207             :   // |               desired orientation + throttle               |
    +    1208             :   // --------------------------------------------------------------
    +    1209             : 
    +    1210             :   // | ------------------- desired orientation ------------------ |
    +    1211             : 
    +    1212       23225 :   Eigen::Matrix3d Rd;
    +    1213             : 
    +    1214       23225 :   if (tracker_command.use_orientation) {
    +    1215             : 
    +    1216             :     // fill in the desired orientation based on the desired orientation from the control command
    +    1217           0 :     Rd = mrs_lib::AttitudeConverter(tracker_command.orientation);
    +    1218             : 
    +    1219           0 :     if (tracker_command.use_heading) {
    +    1220             :       try {
    +    1221           0 :         Rd = mrs_lib::AttitudeConverter(Rd).setHeading(tracker_command.heading);
    +    1222             :       }
    +    1223           0 :       catch (...) {
    +    1224           0 :         ROS_ERROR_THROTTLE(1.0, "[Se3Controller]: could not set the desired heading");
    +    1225             :       }
    +    1226             :     }
    +    1227             : 
    +    1228             :   } else {
    +    1229             : 
    +    1230       23225 :     Eigen::Vector3d bxd;  // desired heading vector
    +    1231             : 
    +    1232       23225 :     if (tracker_command.use_heading) {
    +    1233       23225 :       bxd << cos(tracker_command.heading), sin(tracker_command.heading), 0;
    +    1234             :     } else {
    +    1235           0 :       ROS_WARN_THROTTLE(10.0, "[Se3Controller]: desired heading was not specified, using current heading instead!");
    +    1236           0 :       bxd << cos(uav_heading), sin(uav_heading), 0;
    +    1237             :     }
    +    1238             : 
    +    1239       23225 :     Rd = common::so3transform(f_normed, bxd, drs_params.rotation_type == 1);
    +    1240             :   }
    +    1241             : 
    +    1242             :   // | -------------------- desired throttle -------------------- |
    +    1243             : 
    +    1244       23225 :   double desired_thrust_force = f.dot(R.col(2));
    +    1245       23225 :   double throttle             = 0;
    +    1246             : 
    +    1247       23225 :   if (tracker_command.use_throttle) {
    +    1248             : 
    +    1249             :     // the throttle is overriden from the tracker command
    +    1250           0 :     throttle = tracker_command.throttle;
    +    1251             : 
    +    1252       23225 :   } else if (rampup_active_) {
    +    1253             : 
    +    1254             :     // deactivate the rampup when the times up
    +    1255          16 :     if (fabs((ros::Time::now() - rampup_start_time_).toSec()) >= rampup_duration_) {
    +    1256             : 
    +    1257          14 :       rampup_active_ = false;
    +    1258             : 
    +    1259          14 :       ROS_INFO("[Se3Controller]: rampup finished");
    +    1260             : 
    +    1261             :     } else {
    +    1262             : 
    +    1263           2 :       double rampup_dt = (ros::Time::now() - rampup_last_time_).toSec();
    +    1264             : 
    +    1265           2 :       rampup_throttle_ += double(rampup_direction_) * _rampup_speed_ * rampup_dt;
    +    1266             : 
    +    1267           2 :       rampup_last_time_ = ros::Time::now();
    +    1268             : 
    +    1269           2 :       throttle = rampup_throttle_;
    +    1270             : 
    +    1271           2 :       ROS_INFO_THROTTLE(0.1, "[Se3Controller]: ramping up throttle, %.4f", throttle);
    +    1272             :     }
    +    1273             : 
    +    1274             :   } else {
    +    1275             : 
    +    1276       23209 :     if (desired_thrust_force >= 0) {
    +    1277       23209 :       throttle = mrs_lib::quadratic_throttle_model::forceToThrottle(common_handlers_->throttle_model, desired_thrust_force);
    +    1278             :     } else {
    +    1279           0 :       ROS_WARN_THROTTLE(1.0, "[Se3Controller]: just so you know, the desired throttle force is negative (%.2f)", desired_thrust_force);
    +    1280             :     }
    +    1281             :   }
    +    1282             : 
    +    1283             :   // | ------------------- throttle saturation ------------------ |
    +    1284             : 
    +    1285       23225 :   bool throttle_saturated = false;
    +    1286             : 
    +    1287       23225 :   if (!std::isfinite(throttle)) {
    +    1288             : 
    +    1289           0 :     ROS_ERROR("[Se3Controller]: NaN detected in variable 'throttle'!!!");
    +    1290           0 :     return;
    +    1291             : 
    +    1292       23225 :   } else if (throttle > _throttle_saturation_) {
    +    1293           0 :     throttle = _throttle_saturation_;
    +    1294           0 :     ROS_WARN_THROTTLE(0.1, "[Se3Controller]: saturating throttle to %.2f", _throttle_saturation_);
    +    1295       23225 :   } else if (throttle < 0.0) {
    +    1296           0 :     throttle = 0.0;
    +    1297           0 :     ROS_WARN_THROTTLE(0.1, "[Se3Controller]: saturating throttle to 0.0");
    +    1298             :   }
    +    1299             : 
    +    1300       23225 :   if (throttle_saturated) {
    +    1301           0 :     ROS_WARN_THROTTLE(0.1, "[Se3Controller]: ---------------------------");
    +    1302           0 :     ROS_WARN_THROTTLE(0.1, "[Se3Controller]: desired state: pos [x: %.2f, y: %.2f, z: %.2f, hdg: %.2f]", tracker_command.position.x, tracker_command.position.y,
    +    1303             :                       tracker_command.position.z, tracker_command.heading);
    +    1304           0 :     ROS_WARN_THROTTLE(0.1, "[Se3Controller]: desired state: vel [x: %.2f, y: %.2f, z: %.2f, hdg: %.2f]", tracker_command.velocity.x, tracker_command.velocity.y,
    +    1305             :                       tracker_command.velocity.z, tracker_command.heading_rate);
    +    1306           0 :     ROS_WARN_THROTTLE(0.1, "[Se3Controller]: desired state: acc [x: %.2f, y: %.2f, z: %.2f, hdg: %.2f]", tracker_command.acceleration.x,
    +    1307             :                       tracker_command.acceleration.y, tracker_command.acceleration.z, tracker_command.heading_acceleration);
    +    1308           0 :     ROS_WARN_THROTTLE(0.1, "[Se3Controller]: desired state: jerk [x: %.2f, y: %.2f, z: %.2f, hdg: %.2f]", tracker_command.jerk.x, tracker_command.jerk.y,
    +    1309             :                       tracker_command.jerk.z, tracker_command.heading_jerk);
    +    1310           0 :     ROS_WARN_THROTTLE(0.1, "[Se3Controller]: ---------------------------");
    +    1311           0 :     ROS_WARN_THROTTLE(0.1, "[Se3Controller]: current state: pos [x: %.2f, y: %.2f, z: %.2f, hdg: %.2f]", uav_state.pose.position.x, uav_state.pose.position.y,
    +    1312             :                       uav_state.pose.position.z, uav_heading);
    +    1313           0 :     ROS_WARN_THROTTLE(0.1, "[Se3Controller]: current state: vel [x: %.2f, y: %.2f, z: %.2f, yaw rate: %.2f]", uav_state.velocity.linear.x,
    +    1314             :                       uav_state.velocity.linear.y, uav_state.velocity.linear.z, uav_state.velocity.angular.z);
    +    1315           0 :     ROS_WARN_THROTTLE(0.1, "[Se3Controller]: ---------------------------");
    +    1316             :   }
    +    1317             : 
    +    1318             :   // | -------------- unbiased desired acceleration ------------- |
    +    1319             : 
    +    1320       23225 :   Eigen::Vector3d unbiased_des_acc(0, 0, 0);
    +    1321             : 
    +    1322             :   {
    +    1323       23225 :     Eigen::Vector3d unbiased_des_acc_world = (position_feedback + velocity_feedback) / total_mass + Ra;
    +    1324             : 
    +    1325       46450 :     geometry_msgs::Vector3Stamped world_accel;
    +    1326             : 
    +    1327       23225 :     world_accel.header.stamp    = ros::Time::now();
    +    1328       23225 :     world_accel.header.frame_id = uav_state.header.frame_id;
    +    1329       23225 :     world_accel.vector.x        = unbiased_des_acc_world[0];
    +    1330       23225 :     world_accel.vector.y        = unbiased_des_acc_world[1];
    +    1331       23225 :     world_accel.vector.z        = unbiased_des_acc_world[2];
    +    1332             : 
    +    1333       69675 :     auto res = common_handlers_->transformer->transformSingle(world_accel, "fcu");
    +    1334             : 
    +    1335       23225 :     if (res) {
    +    1336       23225 :       unbiased_des_acc << res.value().vector.x, res.value().vector.y, res.value().vector.z;
    +    1337             :     }
    +    1338             :   }
    +    1339             : 
    +    1340             :   // | --------------- fill the resulting command --------------- |
    +    1341             : 
    +    1342             :   // fill the desired orientation for the tilt error check
    +    1343       23225 :   last_control_output_.desired_orientation = mrs_lib::AttitudeConverter(Rd);
    +    1344             : 
    +    1345             :   // fill the unbiased desired accelerations
    +    1346       23225 :   last_control_output_.desired_unbiased_acceleration = unbiased_des_acc;
    +    1347             : 
    +    1348             :   // | ----------------- fill in the diagnostics ---------------- |
    +    1349             : 
    +    1350       23225 :   last_control_output_.diagnostics.ramping_up = rampup_active_;
    +    1351             : 
    +    1352       23225 :   last_control_output_.diagnostics.mass_estimator  = true;
    +    1353       23225 :   last_control_output_.diagnostics.mass_difference = uav_mass_difference_;
    +    1354       23225 :   last_control_output_.diagnostics.total_mass      = total_mass;
    +    1355             : 
    +    1356       23225 :   last_control_output_.diagnostics.disturbance_estimator = true;
    +    1357             : 
    +    1358       23225 :   last_control_output_.diagnostics.disturbance_bx_b = -Ib_b_[0];
    +    1359       23225 :   last_control_output_.diagnostics.disturbance_by_b = -Ib_b_[1];
    +    1360             : 
    +    1361       23225 :   last_control_output_.diagnostics.disturbance_bx_w = -Ib_w[0];
    +    1362       23225 :   last_control_output_.diagnostics.disturbance_by_w = -Ib_w[1];
    +    1363             : 
    +    1364       23225 :   last_control_output_.diagnostics.disturbance_wx_w = -Iw_w_[0];
    +    1365       23225 :   last_control_output_.diagnostics.disturbance_wy_w = -Iw_w_[1];
    +    1366             : 
    +    1367       23225 :   last_control_output_.diagnostics.controller_enforcing_constraints = false;
    +    1368             : 
    +    1369       23225 :   last_control_output_.diagnostics.controller = "Se3Controller";
    +    1370             : 
    +    1371             :   // | ------------ construct the attitude reference ------------ |
    +    1372             : 
    +    1373       23225 :   mrs_msgs::HwApiAttitudeCmd attitude_cmd;
    +    1374             : 
    +    1375       23225 :   attitude_cmd.stamp       = ros::Time::now();
    +    1376       23225 :   attitude_cmd.orientation = mrs_lib::AttitudeConverter(Rd);
    +    1377       23225 :   attitude_cmd.throttle    = throttle;
    +    1378             : 
    +    1379       23225 :   if (output_modality == common::ATTITUDE) {
    +    1380             : 
    +    1381        1130 :     last_control_output_.control_output = attitude_cmd;
    +    1382             : 
    +    1383        1130 :     return;
    +    1384             :   }
    +    1385             : 
    +    1386             :   // --------------------------------------------------------------
    +    1387             :   // |                      attitude control                      |
    +    1388             :   // --------------------------------------------------------------
    +    1389             : 
    +    1390       22095 :   Eigen::Vector3d rate_feedforward = Eigen::Vector3d::Zero(3);
    +    1391             : 
    +    1392       22095 :   if (tracker_command.use_attitude_rate) {
    +    1393             : 
    +    1394           0 :     rate_feedforward << tracker_command.attitude_rate.x, tracker_command.attitude_rate.y, tracker_command.attitude_rate.z;
    +    1395             : 
    +    1396       22095 :   } else if (tracker_command.use_heading_rate) {
    +    1397             : 
    +    1398             :     // to fill in the feed forward yaw rate
    +    1399       22094 :     double desired_yaw_rate = 0;
    +    1400             : 
    +    1401             :     try {
    +    1402       22094 :       desired_yaw_rate = mrs_lib::AttitudeConverter(Rd).getYawRateIntrinsic(tracker_command.heading_rate);
    +    1403             :     }
    +    1404           0 :     catch (...) {
    +    1405           0 :       ROS_ERROR("[Se3Controller]: exception caught while calculating the desired_yaw_rate feedforward");
    +    1406             :     }
    +    1407             : 
    +    1408       22094 :     rate_feedforward << 0, 0, desired_yaw_rate;
    +    1409             :   }
    +    1410             : 
    +    1411             :   // | ------------ jerk feedforward -> angular rate ------------ |
    +    1412             : 
    +    1413       22095 :   Eigen::Vector3d jerk_feedforward = Eigen::Vector3d(0, 0, 0);
    +    1414             : 
    +    1415       22095 :   if (tracker_command.use_jerk && drs_params.jerk_feedforward) {
    +    1416             : 
    +    1417       22084 :     ROS_DEBUG_THROTTLE(1.0, "[Se3Controller]: using jerk feedforward");
    +    1418             : 
    +    1419       22084 :     Eigen::Matrix3d I;
    +    1420       22084 :     I << 0, 1, 0, -1, 0, 0, 0, 0, 0;
    +    1421       22084 :     Eigen::Vector3d desired_jerk = Eigen::Vector3d(tracker_command.jerk.x, tracker_command.jerk.y, tracker_command.jerk.z);
    +    1422       22084 :     jerk_feedforward             = (I.transpose() * Rd.transpose() * desired_jerk) / (desired_thrust_force / total_mass);
    +    1423             :   }
    +    1424             : 
    +    1425             :   // | --------------- run the attitude controller -------------- |
    +    1426             : 
    +    1427       22095 :   Eigen::Vector3d attitude_rate_saturation(constraints.roll_rate, constraints.pitch_rate, constraints.yaw_rate);
    +    1428             : 
    +    1429       22095 :   auto attitude_rate_command = common::attitudeController(uav_state, attitude_cmd, jerk_feedforward + rate_feedforward, attitude_rate_saturation, Kq,
    +    1430       44190 :                                                           drs_params.pitch_roll_heading_rate_compensation);
    +    1431             : 
    +    1432       22095 :   if (!attitude_rate_command) {
    +    1433           0 :     return;
    +    1434             :   }
    +    1435             : 
    +    1436             :   // | --------- fill in the already known attitude rate -------- |
    +    1437             : 
    +    1438             :   {
    +    1439             :     try {
    +    1440       22095 :       last_control_output_.desired_heading_rate = mrs_lib::AttitudeConverter(R).getHeadingRate(attitude_rate_command->body_rate);
    +    1441             :     }
    +    1442           0 :     catch (...) {
    +    1443             :     }
    +    1444             :   }
    +    1445             : 
    +    1446             :   // | ---------- construct the attitude rate reference --------- |
    +    1447             : 
    +    1448       22095 :   if (output_modality == common::ATTITUDE_RATE) {
    +    1449             : 
    +    1450       19645 :     last_control_output_.control_output = attitude_rate_command;
    +    1451             : 
    +    1452       19645 :     return;
    +    1453             :   }
    +    1454             : 
    +    1455             :   // --------------------------------------------------------------
    +    1456             :   // |                    Attitude rate control                   |
    +    1457             :   // --------------------------------------------------------------
    +    1458             : 
    +    1459        2450 :   Kw = common_handlers_->detailed_model_params->inertia.diagonal().array() * Kw;
    +    1460             : 
    +    1461        2450 :   auto control_group_command = common::attitudeRateController(uav_state, attitude_rate_command.value(), Kw);
    +    1462             : 
    +    1463        2450 :   if (!control_group_command) {
    +    1464           0 :     return;
    +    1465             :   }
    +    1466             : 
    +    1467        2450 :   if (output_modality == common::CONTROL_GROUP) {
    +    1468             : 
    +    1469        1228 :     last_control_output_.control_output = control_group_command;
    +    1470             : 
    +    1471        1228 :     return;
    +    1472             :   }
    +    1473             : 
    +    1474             :   // --------------------------------------------------------------
    +    1475             :   // |                        output mixer                        |
    +    1476             :   // --------------------------------------------------------------
    +    1477             : 
    +    1478        2444 :   mrs_msgs::HwApiActuatorCmd actuator_cmd = common::actuatorMixer(control_group_command.value(), common_handlers_->detailed_model_params->control_group_mixer);
    +    1479             : 
    +    1480        1222 :   last_control_output_.control_output = actuator_cmd;
    +    1481             : 
    +    1482        1222 :   return;
    +    1483             : }
    +    1484             : 
    +    1485             : //}
    +    1486             : 
    +    1487             : /* positionPassthrough() //{ */
    +    1488             : 
    +    1489         251 : void Se3Controller::positionPassthrough(const mrs_msgs::UavState& uav_state, const mrs_msgs::TrackerCommand& tracker_command) {
    +    1490             : 
    +    1491         251 :   if (!tracker_command.use_position_vertical || !tracker_command.use_position_horizontal || !tracker_command.use_heading) {
    +    1492           0 :     ROS_ERROR("[Se3Controller]: the tracker did not provide position+hdg reference");
    +    1493           0 :     return;
    +    1494             :   }
    +    1495             : 
    +    1496         502 :   mrs_msgs::HwApiPositionCmd cmd;
    +    1497             : 
    +    1498         251 :   cmd.header.frame_id = uav_state.header.frame_id;
    +    1499         251 :   cmd.header.stamp    = ros::Time::now();
    +    1500             : 
    +    1501         251 :   cmd.position = tracker_command.position;
    +    1502         251 :   cmd.heading  = tracker_command.heading;
    +    1503             : 
    +    1504         251 :   last_control_output_.control_output = cmd;
    +    1505             : 
    +    1506             :   // fill the unbiased desired accelerations
    +    1507         251 :   last_control_output_.desired_unbiased_acceleration = {};
    +    1508         251 :   last_control_output_.desired_orientation           = {};
    +    1509         251 :   last_control_output_.desired_heading_rate          = {};
    +    1510             : 
    +    1511             :   // | ----------------- fill in the diagnostics ---------------- |
    +    1512             : 
    +    1513         251 :   last_control_output_.diagnostics.ramping_up = false;
    +    1514             : 
    +    1515         251 :   last_control_output_.diagnostics.mass_estimator  = false;
    +    1516         251 :   last_control_output_.diagnostics.mass_difference = 0;
    +    1517             : 
    +    1518         251 :   last_control_output_.diagnostics.disturbance_estimator = false;
    +    1519             : 
    +    1520         251 :   last_control_output_.diagnostics.disturbance_bx_b = 0;
    +    1521         251 :   last_control_output_.diagnostics.disturbance_by_b = 0;
    +    1522             : 
    +    1523         251 :   last_control_output_.diagnostics.disturbance_bx_w = 0;
    +    1524         251 :   last_control_output_.diagnostics.disturbance_by_w = 0;
    +    1525             : 
    +    1526         251 :   last_control_output_.diagnostics.disturbance_wx_w = 0;
    +    1527         251 :   last_control_output_.diagnostics.disturbance_wy_w = 0;
    +    1528             : 
    +    1529         251 :   last_control_output_.diagnostics.controller_enforcing_constraints = false;
    +    1530             : 
    +    1531         251 :   last_control_output_.diagnostics.controller = "Se3Controller";
    +    1532             : }
    +    1533             : 
    +    1534             : //}
    +    1535             : 
    +    1536             : /* PIDVelocityOutput() //{ */
    +    1537             : 
    +    1538        2625 : void Se3Controller::PIDVelocityOutput(const mrs_msgs::UavState& uav_state, const mrs_msgs::TrackerCommand& tracker_command,
    +    1539             :                                       const common::CONTROL_OUTPUT& control_output, const double& dt) {
    +    1540             : 
    +    1541        2625 :   if (!tracker_command.use_position_vertical || !tracker_command.use_position_horizontal || !tracker_command.use_heading) {
    +    1542           0 :     ROS_ERROR("[Se3Controller]: the tracker did not provide position+hdg reference");
    +    1543           0 :     return;
    +    1544             :   }
    +    1545             : 
    +    1546        2625 :   auto constraints = mrs_lib::get_mutexed(mutex_constraints_, constraints_);
    +    1547        2625 :   auto gains       = mrs_lib::get_mutexed(mutex_gains_, gains_);
    +    1548             : 
    +    1549        2625 :   Eigen::Vector3d pos_ref = Eigen::Vector3d(tracker_command.position.x, tracker_command.position.y, tracker_command.position.z);
    +    1550        2625 :   Eigen::Vector3d pos     = Eigen::Vector3d(uav_state.pose.position.x, uav_state.pose.position.y, uav_state.pose.position.z);
    +    1551             : 
    +    1552        2625 :   double hdg_ref = tracker_command.heading;
    +    1553        2625 :   double hdg     = getHeadingSafely(uav_state, tracker_command);
    +    1554             : 
    +    1555             :   // | ------------------ velocity feedforward ------------------ |
    +    1556             : 
    +    1557        2625 :   Eigen::Vector3d vel_ff(0, 0, 0);
    +    1558             : 
    +    1559        2625 :   if (tracker_command.use_velocity_horizontal && tracker_command.use_velocity_vertical) {
    +    1560        2625 :     vel_ff = Eigen::Vector3d(tracker_command.velocity.x, tracker_command.velocity.y, tracker_command.velocity.z);
    +    1561             :   }
    +    1562             : 
    +    1563             :   // | -------------------------- gains ------------------------- |
    +    1564             : 
    +    1565        2625 :   Eigen::Vector3d Kp;
    +    1566             : 
    +    1567             :   {
    +    1568        2625 :     std::scoped_lock lock(mutex_gains_);
    +    1569             : 
    +    1570        2625 :     Kp << gains.kpxy, gains.kpxy, gains.kpz;
    +    1571             :   }
    +    1572             : 
    +    1573             :   // | --------------------- control errors --------------------- |
    +    1574             : 
    +    1575        2625 :   Eigen::Vector3d Ep = pos_ref - pos;
    +    1576             : 
    +    1577             :   // | --------------------------- pid -------------------------- |
    +    1578             : 
    +    1579        2625 :   position_pid_x_.setSaturation(constraints.horizontal_speed);
    +    1580        2625 :   position_pid_y_.setSaturation(constraints.horizontal_speed);
    +    1581        2625 :   position_pid_z_.setSaturation(std::min(constraints.vertical_ascending_speed, constraints.vertical_descending_speed));
    +    1582             : 
    +    1583        2625 :   double des_vel_x = position_pid_x_.update(Ep[0], dt);
    +    1584        2625 :   double des_vel_y = position_pid_y_.update(Ep[1], dt);
    +    1585        2625 :   double des_vel_z = position_pid_z_.update(Ep[2], dt);
    +    1586             : 
    +    1587             :   // | -------------------- position feedback ------------------- |
    +    1588             : 
    +    1589        2625 :   Eigen::Vector3d des_vel = Eigen::Vector3d(des_vel_x, des_vel_y, des_vel_z) + vel_ff;
    +    1590             : 
    +    1591        2625 :   if (control_output == common::VELOCITY_HDG) {
    +    1592             : 
    +    1593             :     // | --------------------- fill the output -------------------- |
    +    1594             : 
    +    1595        1720 :     mrs_msgs::HwApiVelocityHdgCmd cmd;
    +    1596             : 
    +    1597         860 :     cmd.header.frame_id = uav_state.header.frame_id;
    +    1598         860 :     cmd.header.stamp    = ros::Time::now();
    +    1599             : 
    +    1600         860 :     cmd.velocity.x = des_vel[0];
    +    1601         860 :     cmd.velocity.y = des_vel[1];
    +    1602         860 :     cmd.velocity.z = des_vel[2];
    +    1603             : 
    +    1604         860 :     cmd.heading = tracker_command.heading;
    +    1605             : 
    +    1606         860 :     last_control_output_.control_output = cmd;
    +    1607             : 
    +    1608        1765 :   } else if (control_output == common::VELOCITY_HDG_RATE) {
    +    1609             : 
    +    1610        1765 :     position_pid_heading_.setSaturation(constraints.heading_speed);
    +    1611             : 
    +    1612        1765 :     double hdg_err = mrs_lib::geometry::sradians::diff(hdg_ref, hdg);
    +    1613             : 
    +    1614        1765 :     double des_hdg_rate = position_pid_heading_.update(hdg_err, dt);
    +    1615             : 
    +    1616             :     // | --------------------------- ff --------------------------- |
    +    1617             : 
    +    1618        1765 :     double des_hdg_ff = 0;
    +    1619             : 
    +    1620        1765 :     if (tracker_command.use_heading_rate) {
    +    1621        1765 :       des_hdg_ff = tracker_command.heading_rate;
    +    1622             :     }
    +    1623             : 
    +    1624             :     // | --------------------- fill the output -------------------- |
    +    1625             : 
    +    1626        3530 :     mrs_msgs::HwApiVelocityHdgRateCmd cmd;
    +    1627             : 
    +    1628        1765 :     cmd.header.frame_id = uav_state.header.frame_id;
    +    1629        1765 :     cmd.header.stamp    = ros::Time::now();
    +    1630             : 
    +    1631        1765 :     cmd.velocity.x = des_vel[0];
    +    1632        1765 :     cmd.velocity.y = des_vel[1];
    +    1633        1765 :     cmd.velocity.z = des_vel[2];
    +    1634             : 
    +    1635        1765 :     cmd.heading_rate = des_hdg_rate + des_hdg_ff;
    +    1636             : 
    +    1637        1765 :     last_control_output_.control_output = cmd;
    +    1638             :   } else {
    +    1639             : 
    +    1640           0 :     ROS_ERROR("[Se3Controller]: the required output of the position PID is not supported");
    +    1641           0 :     return;
    +    1642             :   }
    +    1643             : 
    +    1644             :   // fill the unbiased desired accelerations
    +    1645        2625 :   last_control_output_.desired_unbiased_acceleration = {};
    +    1646        2625 :   last_control_output_.desired_orientation           = {};
    +    1647        2625 :   last_control_output_.desired_heading_rate          = {};
    +    1648             : 
    +    1649             :   // | ----------------- fill in the diagnostics ---------------- |
    +    1650             : 
    +    1651        2625 :   last_control_output_.diagnostics.ramping_up = false;
    +    1652             : 
    +    1653        2625 :   last_control_output_.diagnostics.mass_estimator  = false;
    +    1654        2625 :   last_control_output_.diagnostics.mass_difference = 0;
    +    1655             : 
    +    1656        2625 :   last_control_output_.diagnostics.disturbance_estimator = false;
    +    1657             : 
    +    1658        2625 :   last_control_output_.diagnostics.disturbance_bx_b = 0;
    +    1659        2625 :   last_control_output_.diagnostics.disturbance_by_b = 0;
    +    1660             : 
    +    1661        2625 :   last_control_output_.diagnostics.disturbance_bx_w = 0;
    +    1662        2625 :   last_control_output_.diagnostics.disturbance_by_w = 0;
    +    1663             : 
    +    1664        2625 :   last_control_output_.diagnostics.disturbance_wx_w = 0;
    +    1665        2625 :   last_control_output_.diagnostics.disturbance_wy_w = 0;
    +    1666             : 
    +    1667        2625 :   last_control_output_.diagnostics.controller_enforcing_constraints = false;
    +    1668             : 
    +    1669        2625 :   last_control_output_.diagnostics.controller = "Se3Controller";
    +    1670             : }
    +    1671             : 
    +    1672             : //}
    +    1673             : 
    +    1674             : // --------------------------------------------------------------
    +    1675             : // |                          callbacks                         |
    +    1676             : 
    +    1677             : 
    +    1678             : /* //{ callbackDrs() */
    +    1679             : 
    +    1680         183 : void Se3Controller::callbackDrs(mrs_uav_controllers::se3_controllerConfig& config, [[maybe_unused]] uint32_t level) {
    +    1681             : 
    +    1682         183 :   mrs_lib::set_mutexed(mutex_drs_params_, config, drs_params_);
    +    1683             : 
    +    1684         183 :   ROS_INFO("[Se3Controller]: DRS updated gains");
    +    1685         183 : }
    +    1686             : 
    +    1687             : //}
    +    1688             : 
    +    1689             : // --------------------------------------------------------------
    +    1690             : // |                           timers                           |
    +    1691             : // --------------------------------------------------------------
    +    1692             : 
    +    1693             : /* timerGains() //{ */
    +    1694             : 
    +    1695        4326 : void Se3Controller::timerGains(const ros::TimerEvent& event) {
    +    1696             : 
    +    1697       12978 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("timerGains", _gain_filtering_rate_, 1.0, event);
    +    1698             :   mrs_lib::ScopeTimer timer =
    +    1699       12978 :       mrs_lib::ScopeTimer("Se3Controller::timerGains", common_handlers_->scope_timer.logger, common_handlers_->scope_timer.enabled);
    +    1700             : 
    +    1701        8652 :   auto drs_params = mrs_lib::get_mutexed(mutex_drs_params_, drs_params_);
    +    1702        4326 :   auto gains      = mrs_lib::get_mutexed(mutex_gains_, gains_);
    +    1703             : 
    +    1704             :   // When muting the gains, we want to bypass the filter,
    +    1705             :   // so it happens immediately.
    +    1706        4326 :   bool   bypass_filter = (mute_gains_ || mute_gains_by_tracker_);
    +    1707        4326 :   double gain_coeff    = (mute_gains_ || mute_gains_by_tracker_) ? _gain_mute_coefficient_ : 1.0;
    +    1708             : 
    +    1709        4326 :   mute_gains_ = false;
    +    1710             : 
    +    1711        4326 :   const double dt = (event.current_real - event.last_real).toSec();
    +    1712             : 
    +    1713        4326 :   bool updated = false;
    +    1714             : 
    +    1715        4326 :   gains.kpxy          = calculateGainChange(dt, gains.kpxy, drs_params.kpxy * gain_coeff, bypass_filter, "kpxy", updated);
    +    1716        4326 :   gains.kvxy          = calculateGainChange(dt, gains.kvxy, drs_params.kvxy * gain_coeff, bypass_filter, "kvxy", updated);
    +    1717        4326 :   gains.kaxy          = calculateGainChange(dt, gains.kaxy, drs_params.kaxy * gain_coeff, bypass_filter, "kaxy", updated);
    +    1718        4326 :   gains.kiwxy         = calculateGainChange(dt, gains.kiwxy, drs_params.kiwxy * gain_coeff, bypass_filter, "kiwxy", updated);
    +    1719        4326 :   gains.kibxy         = calculateGainChange(dt, gains.kibxy, drs_params.kibxy * gain_coeff, bypass_filter, "kibxy", updated);
    +    1720        4326 :   gains.kpz           = calculateGainChange(dt, gains.kpz, drs_params.kpz * gain_coeff, bypass_filter, "kpz", updated);
    +    1721        4326 :   gains.kvz           = calculateGainChange(dt, gains.kvz, drs_params.kvz * gain_coeff, bypass_filter, "kvz", updated);
    +    1722        4326 :   gains.kaz           = calculateGainChange(dt, gains.kaz, drs_params.kaz * gain_coeff, bypass_filter, "kaz", updated);
    +    1723        4326 :   gains.kq_roll_pitch = calculateGainChange(dt, gains.kq_roll_pitch, drs_params.kq_roll_pitch * gain_coeff, bypass_filter, "kq_roll_pitch", updated);
    +    1724        4326 :   gains.kq_yaw        = calculateGainChange(dt, gains.kq_yaw, drs_params.kq_yaw * gain_coeff, bypass_filter, "kq_yaw", updated);
    +    1725        4326 :   gains.km            = calculateGainChange(dt, gains.km, drs_params.km * gain_coeff, bypass_filter, "km", updated);
    +    1726             : 
    +    1727             :   // do not apply muting on these gains
    +    1728        4326 :   gains.kiwxy_lim = calculateGainChange(dt, gains.kiwxy_lim, drs_params.kiwxy_lim, false, "kiwxy_lim", updated);
    +    1729        4326 :   gains.kibxy_lim = calculateGainChange(dt, gains.kibxy_lim, drs_params.kibxy_lim, false, "kibxy_lim", updated);
    +    1730        4326 :   gains.km_lim    = calculateGainChange(dt, gains.km_lim, drs_params.km_lim, false, "km_lim", updated);
    +    1731             : 
    +    1732        4326 :   mrs_lib::set_mutexed(mutex_gains_, gains, gains_);
    +    1733             : 
    +    1734             :   // set the gains back to dynamic reconfigure
    +    1735             :   // and only do it when some filtering occurs
    +    1736        4326 :   if (updated) {
    +    1737             : 
    +    1738         243 :     drs_params.kpxy          = gains.kpxy;
    +    1739         243 :     drs_params.kvxy          = gains.kvxy;
    +    1740         243 :     drs_params.kaxy          = gains.kaxy;
    +    1741         243 :     drs_params.kiwxy         = gains.kiwxy;
    +    1742         243 :     drs_params.kibxy         = gains.kibxy;
    +    1743         243 :     drs_params.kpz           = gains.kpz;
    +    1744         243 :     drs_params.kvz           = gains.kvz;
    +    1745         243 :     drs_params.kaz           = gains.kaz;
    +    1746         243 :     drs_params.kq_roll_pitch = gains.kq_roll_pitch;
    +    1747         243 :     drs_params.kq_yaw        = gains.kq_yaw;
    +    1748         243 :     drs_params.kiwxy_lim     = gains.kiwxy_lim;
    +    1749         243 :     drs_params.kibxy_lim     = gains.kibxy_lim;
    +    1750         243 :     drs_params.km            = gains.km;
    +    1751         243 :     drs_params.km_lim        = gains.km_lim;
    +    1752             : 
    +    1753         243 :     drs_->updateConfig(drs_params);
    +    1754             : 
    +    1755         243 :     ROS_INFO_THROTTLE(10.0, "[Se3Controller]: gains have been updated");
    +    1756             :   }
    +    1757        4326 : }
    +    1758             : 
    +    1759             : //}
    +    1760             : 
    +    1761             : // --------------------------------------------------------------
    +    1762             : // |                       other routines                       |
    +    1763             : // --------------------------------------------------------------
    +    1764             : 
    +    1765             : /* calculateGainChange() //{ */
    +    1766             : 
    +    1767       60564 : double Se3Controller::calculateGainChange(const double dt, const double current_value, const double desired_value, const bool bypass_rate, std::string name,
    +    1768             :                                           bool& updated) {
    +    1769             : 
    +    1770       60564 :   double change = desired_value - current_value;
    +    1771             : 
    +    1772       60564 :   double gains_filter_max_change = _gains_filter_change_rate_ * dt;
    +    1773       60564 :   double gains_filter_min_change = _gains_filter_min_change_rate_ * dt;
    +    1774             : 
    +    1775       60564 :   if (!bypass_rate) {
    +    1776             : 
    +    1777             :     // if current value is near 0...
    +    1778             :     double change_in_perc;
    +    1779             :     double saturated_change;
    +    1780             : 
    +    1781       60267 :     if (fabs(current_value) < 1e-6) {
    +    1782           0 :       change *= gains_filter_max_change;
    +    1783             :     } else {
    +    1784             : 
    +    1785       60267 :       saturated_change = change;
    +    1786             : 
    +    1787       60267 :       change_in_perc = (current_value + saturated_change) / current_value - 1.0;
    +    1788             : 
    +    1789       60267 :       if (change_in_perc > gains_filter_max_change) {
    +    1790        2079 :         saturated_change = current_value * gains_filter_max_change;
    +    1791       58188 :       } else if (change_in_perc < -gains_filter_max_change) {
    +    1792          26 :         saturated_change = current_value * -gains_filter_max_change;
    +    1793             :       }
    +    1794             : 
    +    1795       60267 :       if (fabs(saturated_change) < fabs(change) * gains_filter_min_change) {
    +    1796          21 :         change *= gains_filter_min_change;
    +    1797             :       } else {
    +    1798       60246 :         change = saturated_change;
    +    1799             :       }
    +    1800             :     }
    +    1801             :   }
    +    1802             : 
    +    1803       60564 :   if (fabs(change) > 1e-3) {
    +    1804        2693 :     ROS_DEBUG("[Se3Controller]: changing gain '%s' from %.2f to %.2f", name.c_str(), current_value, desired_value);
    +    1805        2693 :     updated = true;
    +    1806             :   }
    +    1807             : 
    +    1808       60564 :   return current_value + change;
    +    1809             : }
    +    1810             : 
    +    1811             : //}
    +    1812             : 
    +    1813             : /* getHeadingSafely() //{ */
    +    1814             : 
    +    1815       26953 : double Se3Controller::getHeadingSafely(const mrs_msgs::UavState& uav_state, const mrs_msgs::TrackerCommand& tracker_command) {
    +    1816             : 
    +    1817             :   try {
    +    1818       26953 :     return mrs_lib::AttitudeConverter(uav_state.pose.orientation).getHeading();
    +    1819             :   }
    +    1820           0 :   catch (...) {
    +    1821             :   }
    +    1822             : 
    +    1823             :   try {
    +    1824           0 :     return mrs_lib::AttitudeConverter(uav_state.pose.orientation).getYaw();
    +    1825             :   }
    +    1826           0 :   catch (...) {
    +    1827             :   }
    +    1828             : 
    +    1829           0 :   if (tracker_command.use_heading) {
    +    1830           0 :     return tracker_command.heading;
    +    1831             :   }
    +    1832             : 
    +    1833           0 :   return 0;
    +    1834             : }
    +    1835             : 
    +    1836             : //}
    +    1837             : 
    +    1838             : }  // namespace se3_controller
    +    1839             : 
    +    1840             : }  // namespace mrs_uav_controllers
    +    1841             : 
    +    1842             : #include <pluginlib/class_list_macros.h>
    +    1843          91 : PLUGINLIB_EXPORT_CLASS(mrs_uav_controllers::se3_controller::Se3Controller, mrs_uav_managers::Controller)
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_controllers/src/se3_controller.cpp.gcov.overview.html b/mrs_uav_controllers/src/se3_controller.cpp.gcov.overview.html new file mode 100644 index 0000000000..363703df5f --- /dev/null +++ b/mrs_uav_controllers/src/se3_controller.cpp.gcov.overview.html @@ -0,0 +1,481 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_controllers/src/se3_controller.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_controllers/src/se3_controller.cpp.gcov.png b/mrs_uav_controllers/src/se3_controller.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..2ace4bff43fb43de19c56956a3e32b50baa5da09 GIT binary patch literal 5838 zcmV;<7BT6GP)A#hW%_j)~63-?x7j|#YaTI}s0DZvax?Hc<_4Vg6 zs=V->NUt@N5wHrXt$LLLj;Z&8iMb9TiowW}#Z_H`*H&G?f&j%B8C>LTETs+UvFmT{OJEp7IeA#6$k^a9&mNvr$`B)tDcdgYg`o&#src8dW@N>S4cHiZx^5ibyB)qG2kTt zE;*t-F$9q5n>g*QuIdcOF~%&r8H@|tfk_*)fNOP}YRiPFdGW%0iuMSMeu`Sx$kDDT zxIE2bNMB!EZx}5Dp)M6wBfap1id)dI#EcRmq#u!|CaDK(*j53;Okn z`?O)|BN9*nJRXKk7?GGI)W3A8(y$BCFIM!K9SbY{aSrf8t3Y4kFIMuo-uP>fo{SFB z#(gY33;4I4;b@Y|%*;(oToED0xOfTbv`J}oT*avBCDU4c)f0LK7OySk0GZ#l^U@Ks zgnAdNy!v-d#EAT6K)r721|H+u#SIQ)XywJ*UGAUN>yj%0boPRu@fQ!-RdosQ5+{0~ z=C<>c2y`nNh>?sLVhMDNnH98=RT{{!vJJ=p;$L)&C8F95E6|Ld!4-QsC>GJ&(BLH< zL7o=rU@o*V``ZMtUu$*@4~<{Fe6%zCLfV+YaUDNqW{$!**~dO_9))YYnF(MwNdZGm zcreLVJNo;oCYn8^tmx7fw6O?Ceo-^2>Q$GCX`h-;XYLhv|J;&!%>hO)>Oy86|6z>e zq*S9}&`fn)go}RcYm;N8Qgz@>Q5>$&(k+n~b(*R?N--k2ss!U!N!8+l`r7$tyOj@_ z8)`h@Uuz@m?Kc8uVaNLGPmD8s_Qeu|QgLMhic)OPs>Y~kqpz}=PF!xc{f3MGY+iq2 zxoo)5UqwK1*>2`l$5t)0>H?r|#1@)f0W<-SZHTt&9kXQs#v&a`jD8MZuff(?g066F znZrRFa{{q*(j%ps;)y+_!N@mlr-1kS4^tk;-^b7M^~aXG1$@1K-pl23uR(Y~d4bFD z>bnl81U+3?EDAtHU)$m52jR~2lu=6fH51uZPz{dbJee?uE-G-V;m zW=qdxT@yEG^f6QOY2zKno_!H!+>bE#oYB5^W(;xcF~H~JpDx_sgsYr?W|z3<$+3f< z5BJY|m$;xw)mA0w(AW#Usnd3K&)8~h2W%KKgVM-0+$Pt~l>C{12C--Wpg~nLe4Gd9 zpkaUK01+_>e~{|BK?&*x+#oTGq&KzkCsFkn+B+#%IpyW*i?+jF9RQ2Q9NS zfYLU;yXtyBB2&uTz#0Su;uMN=60lyE`s5N;B9LvCLQUDT4Aa{eupXkyHaz)c7rQBe zoTxdXY7Oo!WncTrGe?Pv7>E%FW`bOW5lqJ>32*~InEz13XfOv~HZiM*-=h=Y`79Xt zFTlgaA~5YWZIrP`T$nlh9I|^Hyhf*+1&r2=5&*)PstjnPfLl8EVL&Z0WHJq(0^qzQ zuE@oprI-r48}*(EcHtTgt}fSSBDWc{Sx0q+iE500PGO&#jyHhez=e}#D|Fcj0joYz zT^ntue~(ar z zEBf&{eRtsOV~Xg{&gpS4av|zE*Sre{S<~g?Dla-fM{HET}a$L9%B$G z_g$e2f8ucbdEO)7GeWTpuT|}z>s8wc;D@W46^&}ue5MOmwf%>sny-3JGADM+^bXez zI&uq37;x?$=6L&2#1sUVCj}GpSv`~K z8!0ijk0C}e0dT}X!1ohVP-$d6W4^?EiOCToG58c!5BDGuRUu#XuX4o?J4-uR9pMKc zot;i;Hlwl$V5bew+pN?^YUSh4nP}jU7Xh)223pWqwdML)z^s+16beovPyI!ij+vbM;TbmFod5p>hS&G_hykT85+R&| znCWK>4Oo*h3(^lAnhmpAStfKC@g$q+Dmmb<>g$0~`+Q^+YNs$=x%d-#)#4}sb;Z-- zyZ2x1W8c#cJqo+$CIxK67!c<+Rn<01AizLj22j(+LhL9A)UPuExWb+4cJT+h!8dbH zb#p59DC?E!KtrDP8@mMxPZ+VU#U&(Ou<^&ZYcqx_S-?2Z9NNkAkANI&m7-E0XOjNqu2%z+O6Tb;_auKu8%62Eg)Q+aODNJHvuJP@f# zBMpZz)^7LgDk1sO}XV>dLE@qthaZWX=z_GWJ9X$=mUZQ2hybE zIjGbZ*wX-5o&Y9nsybCO%jR3YtqMS4nQ&0#B_92<1bbDD1hXdyRaEvEO?Il@!^w3^ z)fl76p2C<^P0!9?0pq!jm8zA1`Aq|Is`tvtN(Xbb`lBd&b|b^3xC252s9Cv^ur^A^ zIiKI@p1r_ekj>odtRuv^94m82oHiL}4oQM}x4u0Lcs7AcdF=qqEFkh#fitBtqfm{} z>SLA=@D!HeNiGseyfDVj{Tj2N?4<}OHVcN68-XM=?A6)9N zP^{N*mMS@~m3ASD$Ft5ccN!UYDaXqu!PduNrZ~Tw%@SqLIh$w2t<}%~-E-!Sdt|#% zvTHCban&Tv{91TES_Yqca>0ReaV=(6TaVG#5E64~OQ?@DyOW=5o)+X#}gLuVeE$zeWQntU8>e3+{G_=LsS%jux|xcYSnuKG0z#CC>**s?Hv71OUB5 zqq>ED7@&gcn(IU9`H;CjPK+!QdjLhQk8@82ziJ}a$GHzlG&fI>@bQCd`;M6kpn~e} znEBK(;|%elU%$r?w+|_M+6{60K-n|bo+*M+L%c9%ew{s2+^CIuEw_2E*`CQBASSPR zu03N6@xL&{L^CElJi^A^qkrBlxS;vzeD@XHuiz5F4VL)dGQ^Ra0`i8Oh1h6mLgR7A zPfb~NBv)srfMSfv{#4T&zDg9Se+Z~+BhDiqfe|s1;iSe{F#0$N+eRN8DH9{7T9Q!} z)oW@5Fo2?{rk3iujQ>pu&zEqKmkMJHL+45hMmiFGCmHpO8{LI*-!TuU#)z6mGl!bF%Hwx+`8koX`aptK1^gQ5vGRl*r@>TVZ20bnz{OP?uW1n1&Wt=Mvj{Z z{Y`$^;-ye`Hz3BrA9#LhDNoT*xYt@~i#!qNZc}2a)z@;6p8gKSx8@)XKQ$ftd#!A` z|A@f%*j)KLy3=tp}|P4}i#_un%f0Uy$&exT+6#aHB{9Kz2nSE` z@(2eU=4u?DE%BM!rN4TNVUl3ei$5e`faa`((o8ko353u$VFX4p52(VJ%gt`b7<)QC zxa2bXX@)0m#_9^KGgG^@u@c?0RJW{!V5xihTcEAk_2vT@5{tcCVVAf_+t-=my?Zi@ z+#TI8iSvAU_qMB4YgVo^$oY_-n3gVa+0;v3%Dn#da5g@vy0FBBs_P27pz8bdqj^j2 zxKbMtYYTvnptwHC1yn?grege|-kBDR6lV>io2i~TjI@Pip#Z-d!5$j37{DIf%%_5w ziO$qP*-y-IGWmz1Ab@uxoIQaS{l}=3OKmrF9`oGPL-rN&UVH#Z`~Z(8{zi491pR z*9^@Dq&^h^=~m2K8)=5tfHwNt2Vx}Ws44&lRc#soe>2qxb3ew^8Q3sf!D;^?=ssY$ z=F{Ce$%mm5-n(P6U$~H1Ppt#+Da*TXFzHM_m#`mS;6$^j+otH!KYFHdIR8`9+tS#M@g8QxzwCm`mDHlWj)lSAeO#MTfwU*V?#MlL+Hc^@!b>8RKvpco_C#||E1 z9MUvmten_>darFSo8k%YiN&6~EfWx9f9U~9jN~>qoC*)q>9~}Lb5p?5;HN;LWsZxx z03!fz72Ld+^qqN9z6((TO-vnZv9IO7(60(e7O0R+Sry(M8p0MpOv`NP+nwD%nf<Bv>_J5rPC0rulrg*al4M6WBJq=MHe=P~L@f9e1d!wEE%#5zVfPZ=pLhYz zYRpBh2w*-8*H(4;M)U}15a5uiA->L2i^c?U%5C)QkpLPFP(jSU3k@|gT)26^7#eDI z&t|(2r+1EteKZ1ot8S_qV4f85`DF|Hpk4Xw!k(_{?81(nKmN2GartW+fTf1D%REiN zirZiu4nal1)k-)yjWEHCcZl(T+9d58b8;A)qe5?v~5vQ5CVMtR zjF@VnZI9xGqqabKe(y|$lL2*YtR3Oo@9^!x2y;HjdXDbC>S-fsaTCTwIg9u_$_9+Q zo*7u$JY28gAep}5y1OQpiIG#CYU;VmaueTo+N%L-+vrjH3*-l2 zM2u$uW!p3r@|f8+_~SQpo^KxKm4ENdr}%n?^X2OqZo~NhbkBZ0!`sJrhS`!y1Gu2? zjxs(w3bt|aTHY9pd{~+k-IhE~ByPcj+r58g59byo3%gj%#8rQem@PDIWa`Ok_J`~d zGEF5FvzU_vRi_4_D5ufyFb|-Vp%twUegMRx&o^UZ3Sd0MkOs30;?^`~{NdA!b$MEi z#_t6soxQ>h-`OsFwQ<`KqseVhuxBjU8w=>WN!!<@6F#);agnzj^bGDKy|W;?3X0Q^ zmg@64jS`yJ>S=(62L$_Nlz=8vHOS(h1sFckHb!U>lkoh+c)VqCm}5d_e=Ac+#t0Ad(gRBe=% z)F+j@ZnOKwAjfS-wd#7_^twi`WSQjvaEKvC?y1O9?=~3Y z{o%Y*`n>CWXc`%@2m5*IE+H7rL*zyl`C-ZytAlCHDsWhyThu!+e!cCljn@d z>Jky-@DwdDHJ69$?{XoJa-H4S^?Juos<}tH5gFzxl!}oHg>WPCoKU5ZYP)dJb4^H5 z9m4oVs)ZLe+*7JEO_|ch^dNo~qp)U0)#E3Cb%9q&jhF!l#uh7rlq=K + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/control_manager + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/control_managerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:44100.0 %
    Date:2024-04-18 23:11:36Functions:1010100.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    output_publisher.h +
    100.0%
    +
    100.0 %4 / 4100.0 %10 / 10
    <unnamed>100.0 %4 / 4100.0 %10 / 10
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/control_manager/index-detail-sort-l.html b/mrs_uav_managers/include/control_manager/index-detail-sort-l.html new file mode 100644 index 0000000000..f0c5262210 --- /dev/null +++ b/mrs_uav_managers/include/control_manager/index-detail-sort-l.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/control_manager + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/control_managerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:44100.0 %
    Date:2024-04-18 23:11:36Functions:1010100.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    output_publisher.h +
    100.0%
    +
    100.0 %4 / 4100.0 %10 / 10
    <unnamed>100.0 %4 / 4100.0 %10 / 10
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/control_manager/index-detail.html b/mrs_uav_managers/include/control_manager/index-detail.html new file mode 100644 index 0000000000..b2d3b3f151 --- /dev/null +++ b/mrs_uav_managers/include/control_manager/index-detail.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/control_manager + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/control_managerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:44100.0 %
    Date:2024-04-18 23:11:36Functions:1010100.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    output_publisher.h +
    100.0%
    +
    100.0 %4 / 4100.0 %10 / 10
    <unnamed>100.0 %4 / 4100.0 %10 / 10
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/control_manager/index-sort-f.html b/mrs_uav_managers/include/control_manager/index-sort-f.html new file mode 100644 index 0000000000..346e3a7eed --- /dev/null +++ b/mrs_uav_managers/include/control_manager/index-sort-f.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/control_manager + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/control_managerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:44100.0 %
    Date:2024-04-18 23:11:36Functions:1010100.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    output_publisher.h +
    100.0%
    +
    100.0 %4 / 4100.0 %10 / 10
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/control_manager/index-sort-l.html b/mrs_uav_managers/include/control_manager/index-sort-l.html new file mode 100644 index 0000000000..27f9b6c402 --- /dev/null +++ b/mrs_uav_managers/include/control_manager/index-sort-l.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/control_manager + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/control_managerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:44100.0 %
    Date:2024-04-18 23:11:36Functions:1010100.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    output_publisher.h +
    100.0%
    +
    100.0 %4 / 4100.0 %10 / 10
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/control_manager/index.html b/mrs_uav_managers/include/control_manager/index.html new file mode 100644 index 0000000000..af63b88ed9 --- /dev/null +++ b/mrs_uav_managers/include/control_manager/index.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/control_manager + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/control_managerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:44100.0 %
    Date:2024-04-18 23:11:36Functions:1010100.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    output_publisher.h +
    100.0%
    +
    100.0 %4 / 4100.0 %10 / 10
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/control_manager/output_publisher.h.func-sort-c.html b/mrs_uav_managers/include/control_manager/output_publisher.h.func-sort-c.html new file mode 100644 index 0000000000..295fd2b9b4 --- /dev/null +++ b/mrs_uav_managers/include/control_manager/output_publisher.h.func-sort-c.html @@ -0,0 +1,120 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/control_manager/output_publisher.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/control_manager - output_publisher.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:44100.0 %
    Date:2024-04-18 23:11:36Functions:1010100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    void mrs_uav_managers::control_manager::OutputPublisher::PublisherVisitor::operator()<mrs_msgs::HwApiPositionCmd_<std::allocator<void> > >(mrs_msgs::HwApiPositionCmd_<std::allocator<void> > const&)505
    void mrs_uav_managers::control_manager::OutputPublisher::PublisherVisitor::operator()<mrs_msgs::HwApiAccelerationHdgRateCmd_<std::allocator<void> > >(mrs_msgs::HwApiAccelerationHdgRateCmd_<std::allocator<void> > const&)1026
    void mrs_uav_managers::control_manager::OutputPublisher::PublisherVisitor::operator()<mrs_msgs::HwApiAccelerationHdgCmd_<std::allocator<void> > >(mrs_msgs::HwApiAccelerationHdgCmd_<std::allocator<void> > const&)1046
    void mrs_uav_managers::control_manager::OutputPublisher::PublisherVisitor::operator()<mrs_msgs::HwApiVelocityHdgCmd_<std::allocator<void> > >(mrs_msgs::HwApiVelocityHdgCmd_<std::allocator<void> > const&)1090
    void mrs_uav_managers::control_manager::OutputPublisher::PublisherVisitor::operator()<mrs_msgs::HwApiVelocityHdgRateCmd_<std::allocator<void> > >(mrs_msgs::HwApiVelocityHdgRateCmd_<std::allocator<void> > const&)2241
    void mrs_uav_managers::control_manager::OutputPublisher::PublisherVisitor::operator()<mrs_msgs::HwApiActuatorCmd_<std::allocator<void> > >(mrs_msgs::HwApiActuatorCmd_<std::allocator<void> > const&)3826
    void mrs_uav_managers::control_manager::OutputPublisher::PublisherVisitor::operator()<mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> > >(mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> > const&)3844
    void mrs_uav_managers::control_manager::OutputPublisher::PublisherVisitor::operator()<mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> > >(mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> > const&)7936
    void mrs_uav_managers::control_manager::OutputPublisher::PublisherVisitor::operator()<mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> > >(mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> > const&)86477
    mrs_uav_managers::control_manager::OutputPublisher::PublisherVisitor::PublisherVisitor(mrs_uav_managers::control_manager::OutputPublisher*)107991
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/control_manager/output_publisher.h.func.html b/mrs_uav_managers/include/control_manager/output_publisher.h.func.html new file mode 100644 index 0000000000..0542c2fa97 --- /dev/null +++ b/mrs_uav_managers/include/control_manager/output_publisher.h.func.html @@ -0,0 +1,120 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/control_manager/output_publisher.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/control_manager - output_publisher.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:44100.0 %
    Date:2024-04-18 23:11:36Functions:1010100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_managers::control_manager::OutputPublisher::PublisherVisitor::PublisherVisitor(mrs_uav_managers::control_manager::OutputPublisher*)107991
    void mrs_uav_managers::control_manager::OutputPublisher::PublisherVisitor::operator()<mrs_msgs::HwApiActuatorCmd_<std::allocator<void> > >(mrs_msgs::HwApiActuatorCmd_<std::allocator<void> > const&)3826
    void mrs_uav_managers::control_manager::OutputPublisher::PublisherVisitor::operator()<mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> > >(mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> > const&)7936
    void mrs_uav_managers::control_manager::OutputPublisher::PublisherVisitor::operator()<mrs_msgs::HwApiPositionCmd_<std::allocator<void> > >(mrs_msgs::HwApiPositionCmd_<std::allocator<void> > const&)505
    void mrs_uav_managers::control_manager::OutputPublisher::PublisherVisitor::operator()<mrs_msgs::HwApiVelocityHdgCmd_<std::allocator<void> > >(mrs_msgs::HwApiVelocityHdgCmd_<std::allocator<void> > const&)1090
    void mrs_uav_managers::control_manager::OutputPublisher::PublisherVisitor::operator()<mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> > >(mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> > const&)86477
    void mrs_uav_managers::control_manager::OutputPublisher::PublisherVisitor::operator()<mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> > >(mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> > const&)3844
    void mrs_uav_managers::control_manager::OutputPublisher::PublisherVisitor::operator()<mrs_msgs::HwApiAccelerationHdgCmd_<std::allocator<void> > >(mrs_msgs::HwApiAccelerationHdgCmd_<std::allocator<void> > const&)1046
    void mrs_uav_managers::control_manager::OutputPublisher::PublisherVisitor::operator()<mrs_msgs::HwApiVelocityHdgRateCmd_<std::allocator<void> > >(mrs_msgs::HwApiVelocityHdgRateCmd_<std::allocator<void> > const&)2241
    void mrs_uav_managers::control_manager::OutputPublisher::PublisherVisitor::operator()<mrs_msgs::HwApiAccelerationHdgRateCmd_<std::allocator<void> > >(mrs_msgs::HwApiAccelerationHdgRateCmd_<std::allocator<void> > const&)1026
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/control_manager/output_publisher.h.gcov.frameset.html b/mrs_uav_managers/include/control_manager/output_publisher.h.gcov.frameset.html new file mode 100644 index 0000000000..137c10c3db --- /dev/null +++ b/mrs_uav_managers/include/control_manager/output_publisher.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/control_manager/output_publisher.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_managers/include/control_manager/output_publisher.h.gcov.html b/mrs_uav_managers/include/control_manager/output_publisher.h.gcov.html new file mode 100644 index 0000000000..ad9e1bef50 --- /dev/null +++ b/mrs_uav_managers/include/control_manager/output_publisher.h.gcov.html @@ -0,0 +1,146 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/control_manager/output_publisher.h + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/control_manager - output_publisher.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:44100.0 %
    Date:2024-04-18 23:11:36Functions:1010100.0 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #ifndef CONTROL_MANAGER_OUTPUT_PUBLISHER
    +       2             : #define CONTROL_MANAGER_OUTPUT_PUBLISHER
    +       3             : 
    +       4             : #include <mrs_lib/publisher_handler.h>
    +       5             : 
    +       6             : #include <mrs_uav_managers/controller.h>
    +       7             : 
    +       8             : namespace mrs_uav_managers
    +       9             : {
    +      10             : 
    +      11             : namespace control_manager
    +      12             : {
    +      13             : 
    +      14             : class OutputPublisher {
    +      15             : 
    +      16             : public:
    +      17             :   OutputPublisher();
    +      18             : 
    +      19             :   OutputPublisher(ros::NodeHandle& nh);
    +      20             : 
    +      21             :   void publish(const Controller::HwApiOutputVariant& control_output);
    +      22             : 
    +      23             : private:
    +      24             :   mrs_lib::PublisherHandler<mrs_msgs::HwApiActuatorCmd>            ph_hw_api_actuator_cmd_;
    +      25             :   mrs_lib::PublisherHandler<mrs_msgs::HwApiControlGroupCmd>        ph_hw_api_control_group_cmd_;
    +      26             :   mrs_lib::PublisherHandler<mrs_msgs::HwApiAttitudeRateCmd>        ph_hw_api_attitude_rate_cmd_;
    +      27             :   mrs_lib::PublisherHandler<mrs_msgs::HwApiAttitudeCmd>            ph_hw_api_attitude_cmd_;
    +      28             :   mrs_lib::PublisherHandler<mrs_msgs::HwApiAccelerationHdgRateCmd> ph_hw_api_acceleration_hdg_rate_cmd_;
    +      29             :   mrs_lib::PublisherHandler<mrs_msgs::HwApiAccelerationHdgCmd>     ph_hw_api_acceleration_hdg_cmd_;
    +      30             :   mrs_lib::PublisherHandler<mrs_msgs::HwApiVelocityHdgRateCmd>     ph_hw_api_velocity_hdg_rate_cmd_;
    +      31             :   mrs_lib::PublisherHandler<mrs_msgs::HwApiVelocityHdgCmd>         ph_hw_api_velocity_hdg_cmd_;
    +      32             :   mrs_lib::PublisherHandler<mrs_msgs::HwApiPositionCmd>            ph_hw_api_position_cmd_;
    +      33             : 
    +      34             :   void publish(const mrs_msgs::HwApiActuatorCmd& msg);
    +      35             :   void publish(const mrs_msgs::HwApiControlGroupCmd& msg);
    +      36             :   void publish(const mrs_msgs::HwApiAttitudeRateCmd& msg);
    +      37             :   void publish(const mrs_msgs::HwApiAttitudeCmd& msg);
    +      38             :   void publish(const mrs_msgs::HwApiAccelerationHdgRateCmd& msg);
    +      39             :   void publish(const mrs_msgs::HwApiAccelerationHdgCmd& msg);
    +      40             :   void publish(const mrs_msgs::HwApiVelocityHdgRateCmd& msg);
    +      41             :   void publish(const mrs_msgs::HwApiVelocityHdgCmd& msg);
    +      42             :   void publish(const mrs_msgs::HwApiPositionCmd& msg);
    +      43             : 
    +      44             :   class PublisherVisitor {
    +      45             : 
    +      46             :   public:
    +      47      107991 :     PublisherVisitor(OutputPublisher* obj) : obj_(obj){};
    +      48             : 
    +      49             :     OutputPublisher* obj_;
    +      50             : 
    +      51             :     template <class T>
    +      52      107991 :     void operator()(const T& msg) {
    +      53      107991 :       obj_->publish(msg);
    +      54      107991 :     }
    +      55             :   };
    +      56             : };
    +      57             : 
    +      58             : }  // namespace control_manager
    +      59             : 
    +      60             : }  // namespace mrs_uav_managers
    +      61             : 
    +      62             : #endif  //  CONTROL_MANAGER_OUTPUT_PUBLISHER
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/control_manager/output_publisher.h.gcov.overview.html b/mrs_uav_managers/include/control_manager/output_publisher.h.gcov.overview.html new file mode 100644 index 0000000000..09b263e5e1 --- /dev/null +++ b/mrs_uav_managers/include/control_manager/output_publisher.h.gcov.overview.html @@ -0,0 +1,36 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/control_manager/output_publisher.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_managers/include/control_manager/output_publisher.h.gcov.png b/mrs_uav_managers/include/control_manager/output_publisher.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..fdd688bb370f7663153724647927eaa459667bca GIT binary patch literal 332 zcmeAS@N?(olHy`uVBq!ia0vp^0YGfW!VDz+4mNH9QW60^A+G=b|6c_J%iqVwzWUF= zunH&+rp|e9UJ7J$7I;J!GcfQS0b$0e+I-SL!CRg#jv*eMTc_R@JgmUO63D)Y^##MP z_qxsoW@77=HNHQc`DTrZj!g2}RPCgyMn{X24zmu;3tZ^#7E%+I9$1z2-~Hw84U=k2 z4|j*$Z0-BVwQ#LZPe@1*@1FIJ-4-|f*Lgnua4f;i^kDBLO$82VM}aqiJexoA?e=!; zP1$C<>VaG4@4cUR8vfjSmptKVZex36aP6U&;q4|#;dgdw2qk^7v)`$HtkLlNGdUR# zYu`;D4^40T_+7%T&EUnw&}9A@Oy}y>9psSfzqj9wQ#d|**7eZ4D=rjGy76rCwIcb5 X-I2 + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/agl_estimator.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/mrs_uav_managers - agl_estimator.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:55100.0 %
    Date:2024-04-18 23:11:36Functions:2366.7 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_managers::AglEstimator::~AglEstimator()0
    mrs_uav_managers::AglEstimator::AglEstimator(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)70
    mrs_uav_managers::AglEstimator::~AglEstimator().270
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/agl_estimator.h.func.html b/mrs_uav_managers/include/mrs_uav_managers/agl_estimator.h.func.html new file mode 100644 index 0000000000..2a2e1d5b25 --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/agl_estimator.h.func.html @@ -0,0 +1,92 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/agl_estimator.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/mrs_uav_managers - agl_estimator.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:55100.0 %
    Date:2024-04-18 23:11:36Functions:2366.7 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_managers::AglEstimator::AglEstimator(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)70
    mrs_uav_managers::AglEstimator::~AglEstimator()0
    mrs_uav_managers::AglEstimator::~AglEstimator().270
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/agl_estimator.h.gcov.frameset.html b/mrs_uav_managers/include/mrs_uav_managers/agl_estimator.h.gcov.frameset.html new file mode 100644 index 0000000000..ca31d3043e --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/agl_estimator.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/agl_estimator.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/agl_estimator.h.gcov.html b/mrs_uav_managers/include/mrs_uav_managers/agl_estimator.h.gcov.html new file mode 100644 index 0000000000..0a930b99cb --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/agl_estimator.h.gcov.html @@ -0,0 +1,157 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/agl_estimator.h + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/mrs_uav_managers - agl_estimator.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:55100.0 %
    Date:2024-04-18 23:11:36Functions:2366.7 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #ifndef MRS_UAV_MANAGERS_AGL_ESTIMATOR_H
    +       2             : #define MRS_UAV_MANAGERS_AGL_ESTIMATOR_H
    +       3             : 
    +       4             : /* includes //{ */
    +       5             : 
    +       6             : #include <ros/ros.h>
    +       7             : 
    +       8             : #include <Eigen/Dense>
    +       9             : 
    +      10             : #include <nav_msgs/Odometry.h>
    +      11             : 
    +      12             : #include <mrs_msgs/UavState.h>
    +      13             : #include <mrs_msgs/Float64Stamped.h>
    +      14             : #include <mrs_msgs/Float64ArrayStamped.h>
    +      15             : #include <mrs_msgs/HwApiCapabilities.h>
    +      16             : 
    +      17             : #include <mrs_uav_managers/estimation_manager/estimator.h>
    +      18             : #include <mrs_uav_managers/estimation_manager/support.h>
    +      19             : 
    +      20             : //}
    +      21             : 
    +      22             : namespace mrs_uav_managers
    +      23             : {
    +      24             : 
    +      25             : namespace agl
    +      26             : {
    +      27             : const char type[] = "AGL";
    +      28             : }
    +      29             : 
    +      30             : using namespace estimation_manager;
    +      31             : 
    +      32             : class AglEstimator : public Estimator {
    +      33             : 
    +      34             : protected:
    +      35             :   const std::string package_name_ = "mrs_uav_state_estimators";
    +      36             : 
    +      37             :   ros::NodeHandle nh_;
    +      38             : 
    +      39             :   mrs_msgs::Float64Stamped agl_height_;
    +      40             :   mrs_msgs::Float64Stamped agl_height_init_;
    +      41             :   mutable std::mutex       mtx_agl_height_;
    +      42             : 
    +      43             :   mrs_msgs::Float64ArrayStamped agl_height_cov_;
    +      44             :   mrs_msgs::Float64ArrayStamped agl_height_cov_init_;
    +      45             :   mutable std::mutex            mtx_agl_height_cov_;
    +      46             : 
    +      47             :   bool is_override_frame_id_ = false;
    +      48             : 
    +      49             : protected:
    +      50             :   mutable mrs_lib::PublisherHandler<mrs_msgs::Float64Stamped>      ph_agl_height_;
    +      51             :   mutable mrs_lib::PublisherHandler<mrs_msgs::Float64ArrayStamped> ph_agl_height_cov_;
    +      52             : 
    +      53             : public:
    +      54          70 :   AglEstimator(const std::string &name, const std::string &frame_id, const std::string &package_name)
    +      55          70 :       : Estimator(agl::type, name, frame_id), package_name_(package_name) {
    +      56          70 :   }
    +      57             : 
    +      58          70 :   virtual ~AglEstimator(void) {
    +      59          70 :   }
    +      60             : 
    +      61             :   // virtual methods
    +      62             :   virtual mrs_msgs::Float64Stamped getUavAglHeight() const     = 0;
    +      63             :   virtual std::vector<double>      getHeightCovariance() const = 0;
    +      64             : 
    +      65             :   // implemented methods
    +      66             :   void publishAglHeight() const;
    +      67             :   void publishCovariance() const;
    +      68             :   bool isCompatibleWithHwApi(const mrs_msgs::HwApiCapabilitiesConstPtr &hw_api_capabilities) const;
    +      69             : };
    +      70             : 
    +      71             : }  // namespace mrs_uav_managers
    +      72             : 
    +      73             : #endif  // MRS_UAV_MANAGERS_AGL_ESTIMATOR_H
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/agl_estimator.h.gcov.overview.html b/mrs_uav_managers/include/mrs_uav_managers/agl_estimator.h.gcov.overview.html new file mode 100644 index 0000000000..21f3af39aa --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/agl_estimator.h.gcov.overview.html @@ -0,0 +1,39 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/agl_estimator.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/agl_estimator.h.gcov.png b/mrs_uav_managers/include/mrs_uav_managers/agl_estimator.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..d88c3428e27de2da87a77f1e9b45246bce5c1009 GIT binary patch literal 397 zcmeAS@N?(olHy`uVBq!ia0vp^0YL1@!VDxMp6xjcq$C1-LR|m<|Gx?dmcNgUef6J# zVHHpuOr7)IycEdhEbxddW?X?_wfUqO7#O8JT^vI^I**2N^Bq>;m@551^bPNq zf9122k3Q-bES1dkxxB~jU(@G%i}R249^oF@8-^V(Ynvcr7WJ?T*XcTjST)6V%To!AaM zVduIYRMU7w<@9e;50Qhsq7K!Y7H0fOOAcJ-FL2X1>-ZLKhy8pP p#LM#zrZ}!(zhtL;GxNsIIKPIdz%zeOxB$bB!PC{xWt~$(697r3r%?a^ literal 0 HcmV?d00001 diff --git a/mrs_uav_managers/include/mrs_uav_managers/control_manager/common.h.func-sort-c.html b/mrs_uav_managers/include/mrs_uav_managers/control_manager/common.h.func-sort-c.html new file mode 100644 index 0000000000..aaa36aad47 --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/control_manager/common.h.func-sort-c.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/control_manager/common.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/mrs_uav_managers/control_manager - common.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:569658.3 %
    Date:2024-04-18 23:11:36Functions:202774.1 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_managers::control_manager::HwApiInitializeVisitor::operator()(mrs_msgs::HwApiActuatorCmd_<std::allocator<void> >&, mrs_msgs::UavState_<std::allocator<void> > const&, double const&, double const&)0
    mrs_uav_managers::control_manager::HwApiInitializeVisitor::operator()(mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> >&, mrs_msgs::UavState_<std::allocator<void> > const&, double const&, double const&)0
    mrs_uav_managers::control_manager::HwApiInitializeVisitor::operator()(mrs_msgs::HwApiPositionCmd_<std::allocator<void> >&, mrs_msgs::UavState_<std::allocator<void> > const&, double const&, double const&)0
    mrs_uav_managers::control_manager::HwApiInitializeVisitor::operator()(mrs_msgs::HwApiVelocityHdgCmd_<std::allocator<void> >&, mrs_msgs::UavState_<std::allocator<void> > const&, double const&, double const&)0
    mrs_uav_managers::control_manager::HwApiInitializeVisitor::operator()(mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> >&, mrs_msgs::UavState_<std::allocator<void> > const&, double const&, double const&)0
    mrs_uav_managers::control_manager::HwApiInitializeVisitor::operator()(mrs_msgs::HwApiAccelerationHdgCmd_<std::allocator<void> >&, mrs_msgs::UavState_<std::allocator<void> > const&, double const&, double const&)0
    mrs_uav_managers::control_manager::HwApiInitializeVisitor::operator()(mrs_msgs::HwApiAccelerationHdgRateCmd_<std::allocator<void> >&, mrs_msgs::UavState_<std::allocator<void> > const&, double const&, double const&)0
    mrs_uav_managers::control_manager::HwApiInitializeVisitor::operator()(mrs_msgs::HwApiVelocityHdgRateCmd_<std::allocator<void> >&, mrs_msgs::UavState_<std::allocator<void> > const&, double const&, double const&)1
    mrs_uav_managers::control_manager::HwApiValidateVisitor::operator()(mrs_msgs::HwApiPositionCmd_<std::allocator<void> > const&, mrs_uav_managers::control_manager::ControlOutputModalities_t const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)505
    mrs_uav_managers::control_manager::HwApiCmdExtractThrottleVisitor::operator()(mrs_msgs::HwApiPositionCmd_<std::allocator<void> > const&)505
    mrs_uav_managers::control_manager::HwApiValidateVisitor::operator()(mrs_msgs::HwApiAccelerationHdgRateCmd_<std::allocator<void> > const&, mrs_uav_managers::control_manager::ControlOutputModalities_t const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1026
    mrs_uav_managers::control_manager::HwApiCmdExtractThrottleVisitor::operator()(mrs_msgs::HwApiAccelerationHdgRateCmd_<std::allocator<void> > const&)1026
    mrs_uav_managers::control_manager::HwApiValidateVisitor::operator()(mrs_msgs::HwApiAccelerationHdgCmd_<std::allocator<void> > const&, mrs_uav_managers::control_manager::ControlOutputModalities_t const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1046
    mrs_uav_managers::control_manager::HwApiCmdExtractThrottleVisitor::operator()(mrs_msgs::HwApiAccelerationHdgCmd_<std::allocator<void> > const&)1046
    mrs_uav_managers::control_manager::HwApiValidateVisitor::operator()(mrs_msgs::HwApiVelocityHdgCmd_<std::allocator<void> > const&, mrs_uav_managers::control_manager::ControlOutputModalities_t const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1090
    mrs_uav_managers::control_manager::HwApiCmdExtractThrottleVisitor::operator()(mrs_msgs::HwApiVelocityHdgCmd_<std::allocator<void> > const&)1090
    mrs_uav_managers::control_manager::HwApiValidateVisitor::operator()(mrs_msgs::HwApiVelocityHdgRateCmd_<std::allocator<void> > const&, mrs_uav_managers::control_manager::ControlOutputModalities_t const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)2240
    mrs_uav_managers::control_manager::HwApiCmdExtractThrottleVisitor::operator()(mrs_msgs::HwApiVelocityHdgRateCmd_<std::allocator<void> > const&)2366
    mrs_uav_managers::control_manager::HwApiValidateVisitor::operator()(mrs_msgs::HwApiActuatorCmd_<std::allocator<void> > const&, mrs_uav_managers::control_manager::ControlOutputModalities_t const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)3826
    mrs_uav_managers::control_manager::HwApiValidateVisitor::operator()(mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> > const&, mrs_uav_managers::control_manager::ControlOutputModalities_t const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)3844
    mrs_uav_managers::control_manager::HwApiCmdExtractThrottleVisitor::operator()(mrs_msgs::HwApiActuatorCmd_<std::allocator<void> > const&)5218
    mrs_uav_managers::control_manager::HwApiCmdExtractThrottleVisitor::operator()(mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> > const&)5237
    mrs_uav_managers::control_manager::HwApiValidateVisitor::operator()(mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> > const&, mrs_uav_managers::control_manager::ControlOutputModalities_t const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)7936
    mrs_uav_managers::control_manager::HwApiCmdExtractThrottleVisitor::operator()(mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> > const&)13469
    mrs_uav_managers::control_manager::HwApiInitializeVisitor::operator()(mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> >&, mrs_msgs::UavState_<std::allocator<void> > const&, double const&, double const&)14331
    mrs_uav_managers::control_manager::HwApiValidateVisitor::operator()(mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> > const&, mrs_uav_managers::control_manager::ControlOutputModalities_t const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)72149
    mrs_uav_managers::control_manager::HwApiCmdExtractThrottleVisitor::operator()(mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> > const&)89169
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/control_manager/common.h.func.html b/mrs_uav_managers/include/mrs_uav_managers/control_manager/common.h.func.html new file mode 100644 index 0000000000..7c892f1e96 --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/control_manager/common.h.func.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/control_manager/common.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/mrs_uav_managers/control_manager - common.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:569658.3 %
    Date:2024-04-18 23:11:36Functions:202774.1 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_managers::control_manager::HwApiValidateVisitor::operator()(mrs_msgs::HwApiActuatorCmd_<std::allocator<void> > const&, mrs_uav_managers::control_manager::ControlOutputModalities_t const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)3826
    mrs_uav_managers::control_manager::HwApiValidateVisitor::operator()(mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> > const&, mrs_uav_managers::control_manager::ControlOutputModalities_t const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)7936
    mrs_uav_managers::control_manager::HwApiValidateVisitor::operator()(mrs_msgs::HwApiPositionCmd_<std::allocator<void> > const&, mrs_uav_managers::control_manager::ControlOutputModalities_t const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)505
    mrs_uav_managers::control_manager::HwApiValidateVisitor::operator()(mrs_msgs::HwApiVelocityHdgCmd_<std::allocator<void> > const&, mrs_uav_managers::control_manager::ControlOutputModalities_t const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1090
    mrs_uav_managers::control_manager::HwApiValidateVisitor::operator()(mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> > const&, mrs_uav_managers::control_manager::ControlOutputModalities_t const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)72149
    mrs_uav_managers::control_manager::HwApiValidateVisitor::operator()(mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> > const&, mrs_uav_managers::control_manager::ControlOutputModalities_t const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)3844
    mrs_uav_managers::control_manager::HwApiValidateVisitor::operator()(mrs_msgs::HwApiAccelerationHdgCmd_<std::allocator<void> > const&, mrs_uav_managers::control_manager::ControlOutputModalities_t const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1046
    mrs_uav_managers::control_manager::HwApiValidateVisitor::operator()(mrs_msgs::HwApiVelocityHdgRateCmd_<std::allocator<void> > const&, mrs_uav_managers::control_manager::ControlOutputModalities_t const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)2240
    mrs_uav_managers::control_manager::HwApiValidateVisitor::operator()(mrs_msgs::HwApiAccelerationHdgRateCmd_<std::allocator<void> > const&, mrs_uav_managers::control_manager::ControlOutputModalities_t const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1026
    mrs_uav_managers::control_manager::HwApiInitializeVisitor::operator()(mrs_msgs::HwApiActuatorCmd_<std::allocator<void> >&, mrs_msgs::UavState_<std::allocator<void> > const&, double const&, double const&)0
    mrs_uav_managers::control_manager::HwApiInitializeVisitor::operator()(mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> >&, mrs_msgs::UavState_<std::allocator<void> > const&, double const&, double const&)0
    mrs_uav_managers::control_manager::HwApiInitializeVisitor::operator()(mrs_msgs::HwApiPositionCmd_<std::allocator<void> >&, mrs_msgs::UavState_<std::allocator<void> > const&, double const&, double const&)0
    mrs_uav_managers::control_manager::HwApiInitializeVisitor::operator()(mrs_msgs::HwApiVelocityHdgCmd_<std::allocator<void> >&, mrs_msgs::UavState_<std::allocator<void> > const&, double const&, double const&)0
    mrs_uav_managers::control_manager::HwApiInitializeVisitor::operator()(mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> >&, mrs_msgs::UavState_<std::allocator<void> > const&, double const&, double const&)14331
    mrs_uav_managers::control_manager::HwApiInitializeVisitor::operator()(mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> >&, mrs_msgs::UavState_<std::allocator<void> > const&, double const&, double const&)0
    mrs_uav_managers::control_manager::HwApiInitializeVisitor::operator()(mrs_msgs::HwApiAccelerationHdgCmd_<std::allocator<void> >&, mrs_msgs::UavState_<std::allocator<void> > const&, double const&, double const&)0
    mrs_uav_managers::control_manager::HwApiInitializeVisitor::operator()(mrs_msgs::HwApiVelocityHdgRateCmd_<std::allocator<void> >&, mrs_msgs::UavState_<std::allocator<void> > const&, double const&, double const&)1
    mrs_uav_managers::control_manager::HwApiInitializeVisitor::operator()(mrs_msgs::HwApiAccelerationHdgRateCmd_<std::allocator<void> >&, mrs_msgs::UavState_<std::allocator<void> > const&, double const&, double const&)0
    mrs_uav_managers::control_manager::HwApiCmdExtractThrottleVisitor::operator()(mrs_msgs::HwApiActuatorCmd_<std::allocator<void> > const&)5218
    mrs_uav_managers::control_manager::HwApiCmdExtractThrottleVisitor::operator()(mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> > const&)13469
    mrs_uav_managers::control_manager::HwApiCmdExtractThrottleVisitor::operator()(mrs_msgs::HwApiPositionCmd_<std::allocator<void> > const&)505
    mrs_uav_managers::control_manager::HwApiCmdExtractThrottleVisitor::operator()(mrs_msgs::HwApiVelocityHdgCmd_<std::allocator<void> > const&)1090
    mrs_uav_managers::control_manager::HwApiCmdExtractThrottleVisitor::operator()(mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> > const&)89169
    mrs_uav_managers::control_manager::HwApiCmdExtractThrottleVisitor::operator()(mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> > const&)5237
    mrs_uav_managers::control_manager::HwApiCmdExtractThrottleVisitor::operator()(mrs_msgs::HwApiAccelerationHdgCmd_<std::allocator<void> > const&)1046
    mrs_uav_managers::control_manager::HwApiCmdExtractThrottleVisitor::operator()(mrs_msgs::HwApiVelocityHdgRateCmd_<std::allocator<void> > const&)2366
    mrs_uav_managers::control_manager::HwApiCmdExtractThrottleVisitor::operator()(mrs_msgs::HwApiAccelerationHdgRateCmd_<std::allocator<void> > const&)1026
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/control_manager/common.h.gcov.frameset.html b/mrs_uav_managers/include/mrs_uav_managers/control_manager/common.h.gcov.frameset.html new file mode 100644 index 0000000000..20a444da4e --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/control_manager/common.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/control_manager/common.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/control_manager/common.h.gcov.html b/mrs_uav_managers/include/mrs_uav_managers/control_manager/common.h.gcov.html new file mode 100644 index 0000000000..e067895531 --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/control_manager/common.h.gcov.html @@ -0,0 +1,380 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/control_manager/common.h + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/mrs_uav_managers/control_manager - common.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:569658.3 %
    Date:2024-04-18 23:11:36Functions:202774.1 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #ifndef CONTROL_MANAGER_COMMON_H
    +       2             : #define CONTROL_MANAGER_COMMON_H
    +       3             : 
    +       4             : #include <ros/ros.h>
    +       5             : 
    +       6             : #include <vector>
    +       7             : #include <string>
    +       8             : #include <optional>
    +       9             : #include <variant>
    +      10             : 
    +      11             : #include <mrs_lib/attitude_converter.h>
    +      12             : #include <mrs_lib/param_loader.h>
    +      13             : 
    +      14             : #include <mrs_uav_managers/control_manager/common_handlers.h>
    +      15             : #include <mrs_uav_managers/controller.h>
    +      16             : 
    +      17             : #include <mrs_msgs/TrackerCommand.h>
    +      18             : #include <mrs_msgs/UavState.h>
    +      19             : #include <mrs_msgs/VelocityReference.h>
    +      20             : 
    +      21             : #include <mrs_msgs/HwApiActuatorCmd.h>
    +      22             : #include <mrs_msgs/HwApiControlGroupCmd.h>
    +      23             : #include <mrs_msgs/HwApiAttitudeRateCmd.h>
    +      24             : #include <mrs_msgs/HwApiAttitudeCmd.h>
    +      25             : #include <mrs_msgs/HwApiAccelerationHdgRateCmd.h>
    +      26             : #include <mrs_msgs/HwApiAccelerationHdgCmd.h>
    +      27             : #include <mrs_msgs/HwApiVelocityHdgRateCmd.h>
    +      28             : #include <mrs_msgs/HwApiVelocityHdgCmd.h>
    +      29             : #include <mrs_msgs/HwApiPositionCmd.h>
    +      30             : 
    +      31             : #include <mrs_msgs/HwApiCapabilities.h>
    +      32             : 
    +      33             : #include <nav_msgs/Odometry.h>
    +      34             : 
    +      35             : namespace mrs_uav_managers
    +      36             : {
    +      37             : 
    +      38             : namespace control_manager
    +      39             : {
    +      40             : 
    +      41             : enum CONTROL_OUTPUT
    +      42             : {
    +      43             :   ACTUATORS_CMD,
    +      44             :   CONTROL_GROUP,
    +      45             :   ATTITUDE_RATE,
    +      46             :   ATTITUDE,
    +      47             :   ACCELERATION_HDG_RATE,
    +      48             :   ACCELERATION_HDG,
    +      49             :   VELOCITY_HDG_RATE,
    +      50             :   VELOCITY_HDG,
    +      51             :   POSITION
    +      52             : };
    +      53             : 
    +      54             : CONTROL_OUTPUT getLowestOuput(const ControlOutputModalities_t& outputs);
    +      55             : 
    +      56             : CONTROL_OUTPUT getHighestOuput(const ControlOutputModalities_t& outputs);
    +      57             : 
    +      58             : std::optional<unsigned int> idxInVector(const std::string& str, const std::vector<std::string>& vec);
    +      59             : 
    +      60             : // checks for invalid values in the result from trackers
    +      61             : bool validateTrackerCommand(const std::optional<mrs_msgs::TrackerCommand>& msg, const std::string& node_name, const std::string& var_name);
    +      62             : 
    +      63             : // checks for invalid messages in/out
    +      64             : bool validateOdometry(const nav_msgs::Odometry& msg, const std::string& node_name, const std::string& var_name);
    +      65             : bool validateUavState(const mrs_msgs::UavState& msg, const std::string& node_name, const std::string& var_nam);
    +      66             : bool validateVelocityReference(const mrs_msgs::VelocityReference& msg, const std::string& node_name, const std::string& var_name);
    +      67             : bool validateReference(const mrs_msgs::Reference& msg, const std::string& node_name, const std::string& var_name);
    +      68             : 
    +      69             : std::optional<DetailedModelParams_t> loadDetailedUavModelParams(ros::NodeHandle& nh, const std::string& node_name, const std::string& platform_config,
    +      70             :                                                                 const std::string& custom_config);
    +      71             : 
    +      72             : // translates the channel values to desired range
    +      73             : double RCChannelToRange(double rc_value, double range, double deadband);
    +      74             : 
    +      75             : /* throttle extraction //{ */
    +      76             : 
    +      77             : std::optional<double> extractThrottle(const Controller::ControlOutput& control_output);
    +      78             : 
    +      79             : struct HwApiCmdExtractThrottleVisitor
    +      80             : {
    +      81        5218 :   std::optional<double> operator()(const mrs_msgs::HwApiActuatorCmd& msg) {
    +      82             : 
    +      83        5218 :     if (msg.motors.size() == 0) {
    +      84           0 :       return std::nullopt;
    +      85             :     }
    +      86             : 
    +      87        5218 :     double throttle = 0;
    +      88             : 
    +      89       26090 :     for (size_t i = 0; i < msg.motors.size(); i++) {
    +      90       20872 :       throttle += msg.motors[i];
    +      91             :     };
    +      92             : 
    +      93        5218 :     throttle /= msg.motors.size();
    +      94             : 
    +      95        5218 :     return throttle;
    +      96             :   }
    +      97        5237 :   std::optional<double> operator()(const mrs_msgs::HwApiControlGroupCmd& msg) {
    +      98        5237 :     return msg.throttle;
    +      99             :   }
    +     100       13469 :   std::optional<double> operator()(const mrs_msgs::HwApiAttitudeCmd& msg) {
    +     101       13469 :     return msg.throttle;
    +     102             :   }
    +     103       89169 :   std::optional<double> operator()(const mrs_msgs::HwApiAttitudeRateCmd& msg) {
    +     104       89169 :     return msg.throttle;
    +     105             :   }
    +     106        1026 :   std::optional<double> operator()([[maybe_unused]] const mrs_msgs::HwApiAccelerationHdgRateCmd& msg) {
    +     107        1026 :     return std::nullopt;
    +     108             :   }
    +     109        1046 :   std::optional<double> operator()([[maybe_unused]] const mrs_msgs::HwApiAccelerationHdgCmd& msg) {
    +     110        1046 :     return std::nullopt;
    +     111             :   }
    +     112        2366 :   std::optional<double> operator()([[maybe_unused]] const mrs_msgs::HwApiVelocityHdgRateCmd& msg) {
    +     113        2366 :     return std::nullopt;
    +     114             :   }
    +     115        1090 :   std::optional<double> operator()([[maybe_unused]] const mrs_msgs::HwApiVelocityHdgCmd& msg) {
    +     116        1090 :     return std::nullopt;
    +     117             :   }
    +     118         505 :   std::optional<double> operator()([[maybe_unused]] const mrs_msgs::HwApiPositionCmd& msg) {
    +     119         505 :     return std::nullopt;
    +     120             :   }
    +     121             : };
    +     122             : 
    +     123             : //}
    +     124             : 
    +     125             : /* control output validation //{ */
    +     126             : 
    +     127             : bool validateControlOutput(const Controller::ControlOutput& control_output, const ControlOutputModalities_t& output_modalities, const std::string& node_name,
    +     128             :                            const std::string& var_name);
    +     129             : 
    +     130             : // validation of hw api messages
    +     131             : bool validateHwApiActuatorCmd(const mrs_msgs::HwApiActuatorCmd& msg, const std::string& node_name, const std::string& var_name);
    +     132             : bool validateHwApiControlGroupCmd(const mrs_msgs::HwApiControlGroupCmd& msg, const std::string& node_name, const std::string& var_name);
    +     133             : bool validateHwApiAttitudeCmd(const mrs_msgs::HwApiAttitudeCmd& msg, const std::string& node_name, const std::string& var_name);
    +     134             : bool validateHwApiAttitudeRateCmd(const mrs_msgs::HwApiAttitudeRateCmd& msg, const std::string& node_name, const std::string& var_name);
    +     135             : bool validateHwApiAccelerationHdgRateCmd(const mrs_msgs::HwApiAccelerationHdgRateCmd& msg, const std::string& node_name, const std::string& var_name);
    +     136             : bool validateHwApiAccelerationHdgCmd(const mrs_msgs::HwApiAccelerationHdgCmd& msg, const std::string& node_name, const std::string& var_name);
    +     137             : bool validateHwApiVelocityHdgRateCmd(const mrs_msgs::HwApiVelocityHdgRateCmd& msg, const std::string& node_name, const std::string& var_name);
    +     138             : bool validateHwApiVelocityHdgCmd(const mrs_msgs::HwApiVelocityHdgCmd& msg, const std::string& node_name, const std::string& var_name);
    +     139             : bool validateHwApiPositionCmd(const mrs_msgs::HwApiPositionCmd& msg, const std::string& node_name, const std::string& var_name);
    +     140             : 
    +     141             : struct HwApiValidateVisitor
    +     142             : {
    +     143        3826 :   bool operator()(const mrs_msgs::HwApiActuatorCmd& msg, const ControlOutputModalities_t& output_modalities, const std::string& node_name,
    +     144             :                   const std::string& var_name) {
    +     145             : 
    +     146        3826 :     if (!output_modalities.actuators) {
    +     147           0 :       ROS_ERROR("[%s]: The controller returned an output modality (actuator cmd) that is not supported by the hardware API", node_name.c_str());
    +     148           0 :       return false;
    +     149             :     }
    +     150             : 
    +     151        3826 :     return validateHwApiActuatorCmd(msg, node_name, var_name);
    +     152             :   }
    +     153        3844 :   bool operator()(const mrs_msgs::HwApiControlGroupCmd& msg, const ControlOutputModalities_t& output_modalities, const std::string& node_name,
    +     154             :                   const std::string& var_name) {
    +     155             : 
    +     156        3844 :     if (!output_modalities.control_group) {
    +     157           0 :       ROS_ERROR("[%s]: The controller returned an output modality (control group cmd) that is not supported by the hardware API", node_name.c_str());
    +     158           0 :       return false;
    +     159             :     }
    +     160             : 
    +     161        3844 :     return validateHwApiControlGroupCmd(msg, node_name, var_name);
    +     162             :   }
    +     163        7936 :   bool operator()(const mrs_msgs::HwApiAttitudeCmd& msg, const ControlOutputModalities_t& output_modalities, const std::string& node_name,
    +     164             :                   const std::string& var_name) {
    +     165             : 
    +     166        7936 :     if (!output_modalities.attitude) {
    +     167           0 :       ROS_ERROR("[%s]: The controller returned an output modality (attitude cmd) that is not supported by the hardware API", node_name.c_str());
    +     168           0 :       return false;
    +     169             :     }
    +     170             : 
    +     171        7936 :     return validateHwApiAttitudeCmd(msg, node_name, var_name);
    +     172             :   }
    +     173       72149 :   bool operator()(const mrs_msgs::HwApiAttitudeRateCmd& msg, const ControlOutputModalities_t& output_modalities, const std::string& node_name,
    +     174             :                   const std::string& var_name) {
    +     175             : 
    +     176       72149 :     if (!output_modalities.attitude_rate) {
    +     177           0 :       ROS_ERROR("[%s]: The controller returned an output modality (attitude rate cmd) that is not supported by the hardware API", node_name.c_str());
    +     178           0 :       return false;
    +     179             :     }
    +     180             : 
    +     181       72149 :     return validateHwApiAttitudeRateCmd(msg, node_name, var_name);
    +     182             :   }
    +     183        1026 :   bool operator()(const mrs_msgs::HwApiAccelerationHdgRateCmd& msg, const ControlOutputModalities_t& output_modalities, const std::string& node_name,
    +     184             :                   const std::string& var_name) {
    +     185             : 
    +     186        1026 :     if (!output_modalities.acceleration_hdg_rate) {
    +     187           0 :       ROS_ERROR("[%s]: The controller returned an output modality (acceleration+hdg rate cmd) that is not supported by the hardware API", node_name.c_str());
    +     188           0 :       return false;
    +     189             :     }
    +     190             : 
    +     191        1026 :     return validateHwApiAccelerationHdgRateCmd(msg, node_name, var_name);
    +     192             :   }
    +     193        1046 :   bool operator()(const mrs_msgs::HwApiAccelerationHdgCmd& msg, const ControlOutputModalities_t& output_modalities, const std::string& node_name,
    +     194             :                   const std::string& var_name) {
    +     195             : 
    +     196        1046 :     if (!output_modalities.acceleration_hdg) {
    +     197           0 :       ROS_ERROR("[%s]: The controller returned an output modality (acceleration+hdg cmd) that is not supported by the hardware API", node_name.c_str());
    +     198           0 :       return false;
    +     199             :     }
    +     200             : 
    +     201        1046 :     return validateHwApiAccelerationHdgCmd(msg, node_name, var_name);
    +     202             :   }
    +     203        2240 :   bool operator()(const mrs_msgs::HwApiVelocityHdgRateCmd& msg, const ControlOutputModalities_t& output_modalities, const std::string& node_name,
    +     204             :                   const std::string& var_name) {
    +     205             : 
    +     206        2240 :     if (!output_modalities.velocity_hdg_rate) {
    +     207           0 :       ROS_ERROR("[%s]: The controller returned an output modality (velocity+hdg rate cmd) that is not supported by the hardware API", node_name.c_str());
    +     208           0 :       return false;
    +     209             :     }
    +     210             : 
    +     211        2240 :     return validateHwApiVelocityHdgRateCmd(msg, node_name, var_name);
    +     212             :   }
    +     213        1090 :   bool operator()(const mrs_msgs::HwApiVelocityHdgCmd& msg, const ControlOutputModalities_t& output_modalities, const std::string& node_name,
    +     214             :                   const std::string& var_name) {
    +     215             : 
    +     216        1090 :     if (!output_modalities.velocity_hdg) {
    +     217           0 :       ROS_ERROR("[%s]: The controller returned an output modality (velocity+hdg cmd) that is not supported by the hardware API", node_name.c_str());
    +     218           0 :       return false;
    +     219             :     }
    +     220             : 
    +     221        1090 :     return validateHwApiVelocityHdgCmd(msg, node_name, var_name);
    +     222             :   }
    +     223         505 :   bool operator()(const mrs_msgs::HwApiPositionCmd& msg, const ControlOutputModalities_t& output_modalities, const std::string& node_name,
    +     224             :                   const std::string& var_name) {
    +     225             : 
    +     226         505 :     if (!output_modalities.position) {
    +     227           0 :       ROS_ERROR("[%s]: The controller returned an output modality (position cmd) that is not supported by the hardware API", node_name.c_str());
    +     228           0 :       return false;
    +     229             :     }
    +     230             : 
    +     231         505 :     return validateHwApiPositionCmd(msg, node_name, var_name);
    +     232             :   }
    +     233             : };
    +     234             : 
    +     235             : //}
    +     236             : 
    +     237             : /* control output initialization //{ */
    +     238             : 
    +     239             : Controller::HwApiOutputVariant initializeDefaultOutput(const ControlOutputModalities_t& possible_outputs, const mrs_msgs::UavState& uav_state,
    +     240             :                                                        const double& min_throttle, const double& n_motors);
    +     241             : 
    +     242             : void initializeHwApiCmd(mrs_msgs::HwApiActuatorCmd& msg, const double& min_throttle, const double& n_motors);
    +     243             : void initializeHwApiCmd(mrs_msgs::HwApiControlGroupCmd& msg, const double& min_throttle);
    +     244             : void initializeHwApiCmd(mrs_msgs::HwApiAttitudeRateCmd& msg, const double& min_throttle);
    +     245             : void initializeHwApiCmd(mrs_msgs::HwApiAttitudeCmd& msg, const mrs_msgs::UavState& uav_state, const double& min_throttle);
    +     246             : void initializeHwApiCmd(mrs_msgs::HwApiAccelerationHdgRateCmd& msg, const mrs_msgs::UavState& uav_state);
    +     247             : void initializeHwApiCmd(mrs_msgs::HwApiAccelerationHdgCmd& msg, const mrs_msgs::UavState& uav_state);
    +     248             : void initializeHwApiCmd(mrs_msgs::HwApiVelocityHdgRateCmd& msg, const mrs_msgs::UavState& uav_state);
    +     249             : void initializeHwApiCmd(mrs_msgs::HwApiVelocityHdgCmd& msg, const mrs_msgs::UavState& uav_state);
    +     250             : void initializeHwApiCmd(mrs_msgs::HwApiPositionCmd& msg, const mrs_msgs::UavState& uav_state);
    +     251             : 
    +     252             : struct HwApiInitializeVisitor
    +     253             : {
    +     254           0 :   void operator()(mrs_msgs::HwApiActuatorCmd& msg, [[maybe_unused]] const mrs_msgs::UavState& uav_state, const double& min_throttle, const double& n_motors) {
    +     255           0 :     initializeHwApiCmd(msg, min_throttle, n_motors);
    +     256           0 :   }
    +     257           0 :   void operator()(mrs_msgs::HwApiControlGroupCmd& msg, [[maybe_unused]] const mrs_msgs::UavState& uav_state, const double& min_throttle,
    +     258             :                   [[maybe_unused]] const double& n_motors) {
    +     259           0 :     initializeHwApiCmd(msg, min_throttle);
    +     260           0 :   }
    +     261           0 :   void operator()(mrs_msgs::HwApiAttitudeCmd& msg, const mrs_msgs::UavState& uav_state, const double& min_throttle, [[maybe_unused]] const double& n_motors) {
    +     262           0 :     initializeHwApiCmd(msg, uav_state, min_throttle);
    +     263           0 :   }
    +     264       14331 :   void operator()(mrs_msgs::HwApiAttitudeRateCmd& msg, [[maybe_unused]] const mrs_msgs::UavState& uav_state, const double& min_throttle,
    +     265             :                   [[maybe_unused]] const double& n_motors) {
    +     266       14331 :     initializeHwApiCmd(msg, min_throttle);
    +     267       14331 :   }
    +     268           0 :   void operator()(mrs_msgs::HwApiAccelerationHdgRateCmd& msg, const mrs_msgs::UavState& uav_state, [[maybe_unused]] const double& min_throttle,
    +     269             :                   [[maybe_unused]] const double& n_motors) {
    +     270           0 :     initializeHwApiCmd(msg, uav_state);
    +     271           0 :   }
    +     272           0 :   void operator()(mrs_msgs::HwApiAccelerationHdgCmd& msg, const mrs_msgs::UavState& uav_state, [[maybe_unused]] const double& min_throttle,
    +     273             :                   [[maybe_unused]] const double& n_motors) {
    +     274           0 :     initializeHwApiCmd(msg, uav_state);
    +     275           0 :   }
    +     276           1 :   void operator()(mrs_msgs::HwApiVelocityHdgRateCmd& msg, const mrs_msgs::UavState& uav_state, [[maybe_unused]] const double& min_throttle,
    +     277             :                   [[maybe_unused]] const double& n_motors) {
    +     278           1 :     initializeHwApiCmd(msg, uav_state);
    +     279           1 :   }
    +     280           0 :   void operator()(mrs_msgs::HwApiVelocityHdgCmd& msg, const mrs_msgs::UavState& uav_state, [[maybe_unused]] const double& min_throttle,
    +     281             :                   [[maybe_unused]] const double& n_motors) {
    +     282           0 :     initializeHwApiCmd(msg, uav_state);
    +     283           0 :   }
    +     284           0 :   void operator()(mrs_msgs::HwApiPositionCmd& msg, const mrs_msgs::UavState& uav_state, [[maybe_unused]] const double& min_throttle,
    +     285             :                   [[maybe_unused]] const double& n_motors) {
    +     286           0 :     initializeHwApiCmd(msg, uav_state);
    +     287           0 :   }
    +     288             : };
    +     289             : 
    +     290             : //}
    +     291             : 
    +     292             : }  // namespace control_manager
    +     293             : 
    +     294             : }  // namespace mrs_uav_managers
    +     295             : 
    +     296             : #endif  // CONTROL_MANAGER_COMMON_H
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/control_manager/common.h.gcov.overview.html b/mrs_uav_managers/include/mrs_uav_managers/control_manager/common.h.gcov.overview.html new file mode 100644 index 0000000000..29005b23a1 --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/control_manager/common.h.gcov.overview.html @@ -0,0 +1,94 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/control_manager/common.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/control_manager/common.h.gcov.png b/mrs_uav_managers/include/mrs_uav_managers/control_manager/common.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..465c39edcf906f6021b109b9ad428f986bfb6680 GIT binary patch literal 945 zcmV;i15W&jP)vSFju4{;OOI2mt~H!H@o~`Qy&oXI{dCkgCHtj(h|*Zy90NT4oD7`OzjO1A_ndzb%YxCj{$pA(|}dUG>#DBkqpG4Ex-zDEOi`+ zj8GF09dU9pWJ5gm)w(gh%_FDyYhTAD>Z12Es2NQUIyG66bAY5k$y1v=UCC3CJpHNj zy5H6YnS=EebQnkW)5K#~4tRY<2;$*^BYTDuCyn#SKG$&Tg_%R^JE9J2SvWdAsH4>S zQ!ZJ8>k9j10dOi zuxU=yyps$)>q+~2rz}DKvrIkeQQbznS`P zds4fla6R>^6|JQ_=H0ii&IqzRa2hbEKDx?=XgcD?|t>Gou<07$Uq_zu7U z^>;E^*JOijq2)wthiwbBy-atg^s%zdqOzxa|G3i~p4mSFlYUeW)W@tckv5kogKI-m z=Jh;fFl{<0bH|!VoK-0ETQg5xGY?eeq&2g-whiY+%3$iylv$ssj2l%WQ9os*{~>Uh zGHFHoW@RE>zFL{Io>7%i|3(?0%Vo-7J;3)Wlj!p6&7Pr5TW|J#_j`KW@hRUZ@E=P) z?A@Q*H@&iNAo=Hj=3!IeRiyyh0SF&K?of{-csg7L!iUH`fB;sLOwFW#&wTSh^5k3G zV>4*VpH-%;48HV$EkOT`OA4)`EE(#Qd~lce;-?WB^$Mz48YA{Nur)^ILfGQLsO|SE z@<^o?c)M=*qwR1CHY8VWC9*9ILWFL@f((Jw(wvjfq_3O^O%kF5);`U`2=9$Cr*+g7 zwrP#uBW>0?97WR>-ZhRD%k{PxOYbKHK>DuGy`ABV+kI+pqdDlY&pYe`<>l)?YLZHM T)c@1*00000NkvXXu0mjfC`P_F literal 0 HcmV?d00001 diff --git a/mrs_uav_managers/include/mrs_uav_managers/control_manager/index-detail-sort-f.html b/mrs_uav_managers/include/mrs_uav_managers/control_manager/index-detail-sort-f.html new file mode 100644 index 0000000000..a7046b1305 --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/control_manager/index-detail-sort-f.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/control_manager + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/mrs_uav_managers/control_managerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:569658.3 %
    Date:2024-04-18 23:11:36Functions:202774.1 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    common.h +
    58.3%58.3%
    +
    58.3 %56 / 9674.1 %20 / 27
    <unnamed>58.3 %56 / 9674.1 %20 / 27
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/control_manager/index-detail-sort-l.html b/mrs_uav_managers/include/mrs_uav_managers/control_manager/index-detail-sort-l.html new file mode 100644 index 0000000000..4c7d2b66ec --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/control_manager/index-detail-sort-l.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/control_manager + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/mrs_uav_managers/control_managerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:569658.3 %
    Date:2024-04-18 23:11:36Functions:202774.1 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    common.h +
    58.3%58.3%
    +
    58.3 %56 / 9674.1 %20 / 27
    <unnamed>58.3 %56 / 9674.1 %20 / 27
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/control_manager/index-detail.html b/mrs_uav_managers/include/mrs_uav_managers/control_manager/index-detail.html new file mode 100644 index 0000000000..e8ca62adc9 --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/control_manager/index-detail.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/control_manager + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/mrs_uav_managers/control_managerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:569658.3 %
    Date:2024-04-18 23:11:36Functions:202774.1 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    common.h +
    58.3%58.3%
    +
    58.3 %56 / 9674.1 %20 / 27
    <unnamed>58.3 %56 / 9674.1 %20 / 27
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/control_manager/index-sort-f.html b/mrs_uav_managers/include/mrs_uav_managers/control_manager/index-sort-f.html new file mode 100644 index 0000000000..1da5cd1f75 --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/control_manager/index-sort-f.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/control_manager + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/mrs_uav_managers/control_managerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:569658.3 %
    Date:2024-04-18 23:11:36Functions:202774.1 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    common.h +
    58.3%58.3%
    +
    58.3 %56 / 9674.1 %20 / 27
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/control_manager/index-sort-l.html b/mrs_uav_managers/include/mrs_uav_managers/control_manager/index-sort-l.html new file mode 100644 index 0000000000..19b2e2883c --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/control_manager/index-sort-l.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/control_manager + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/mrs_uav_managers/control_managerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:569658.3 %
    Date:2024-04-18 23:11:36Functions:202774.1 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    common.h +
    58.3%58.3%
    +
    58.3 %56 / 9674.1 %20 / 27
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/control_manager/index.html b/mrs_uav_managers/include/mrs_uav_managers/control_manager/index.html new file mode 100644 index 0000000000..a42a412602 --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/control_manager/index.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/control_manager + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/mrs_uav_managers/control_managerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:569658.3 %
    Date:2024-04-18 23:11:36Functions:202774.1 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    common.h +
    58.3%58.3%
    +
    58.3 %56 / 9674.1 %20 / 27
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/controller.h.func-sort-c.html b/mrs_uav_managers/include/mrs_uav_managers/controller.h.func-sort-c.html new file mode 100644 index 0000000000..cda10d01cf --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/controller.h.func-sort-c.html @@ -0,0 +1,88 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/controller.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/mrs_uav_managers - controller.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:11100.0 %
    Date:2024-04-18 23:11:36Functions:1250.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_managers::Controller::~Controller()0
    mrs_uav_managers::Controller::~Controller().2455
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/controller.h.func.html b/mrs_uav_managers/include/mrs_uav_managers/controller.h.func.html new file mode 100644 index 0000000000..97bf5defaf --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/controller.h.func.html @@ -0,0 +1,88 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/controller.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/mrs_uav_managers - controller.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:11100.0 %
    Date:2024-04-18 23:11:36Functions:1250.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_managers::Controller::~Controller()0
    mrs_uav_managers::Controller::~Controller().2455
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/controller.h.gcov.frameset.html b/mrs_uav_managers/include/mrs_uav_managers/controller.h.gcov.frameset.html new file mode 100644 index 0000000000..34044d941d --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/controller.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/controller.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/controller.h.gcov.html b/mrs_uav_managers/include/mrs_uav_managers/controller.h.gcov.html new file mode 100644 index 0000000000..1fdfb32590 --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/controller.h.gcov.html @@ -0,0 +1,232 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/controller.h + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/mrs_uav_managers - controller.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:11100.0 %
    Date:2024-04-18 23:11:36Functions:1250.0 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #ifndef MRS_UAV_CONTROLLER_H
    +       2             : #define MRS_UAV_CONTROLLER_H
    +       3             : 
    +       4             : /* includes //{ */
    +       5             : 
    +       6             : #include <ros/ros.h>
    +       7             : 
    +       8             : #include <mrs_uav_managers/control_manager/common_handlers.h>
    +       9             : #include <mrs_uav_managers/control_manager/private_handlers.h>
    +      10             : 
    +      11             : #include <mrs_msgs/HwApiActuatorCmd.h>
    +      12             : #include <mrs_msgs/HwApiControlGroupCmd.h>
    +      13             : #include <mrs_msgs/HwApiAttitudeRateCmd.h>
    +      14             : #include <mrs_msgs/HwApiAttitudeCmd.h>
    +      15             : #include <mrs_msgs/HwApiAccelerationHdgRateCmd.h>
    +      16             : #include <mrs_msgs/HwApiAccelerationHdgCmd.h>
    +      17             : #include <mrs_msgs/HwApiVelocityHdgRateCmd.h>
    +      18             : #include <mrs_msgs/HwApiVelocityHdgCmd.h>
    +      19             : #include <mrs_msgs/HwApiPositionCmd.h>
    +      20             : 
    +      21             : #include <mrs_msgs/ControllerDiagnostics.h>
    +      22             : #include <mrs_msgs/ControllerStatus.h>
    +      23             : #include <mrs_msgs/TrackerCommand.h>
    +      24             : #include <mrs_msgs/UavState.h>
    +      25             : 
    +      26             : #include <mrs_msgs/DynamicsConstraintsSrv.h>
    +      27             : #include <mrs_msgs/DynamicsConstraintsSrvRequest.h>
    +      28             : #include <mrs_msgs/DynamicsConstraintsSrvResponse.h>
    +      29             : 
    +      30             : //}
    +      31             : 
    +      32             : namespace mrs_uav_managers
    +      33             : {
    +      34             : 
    +      35             : class Controller {
    +      36             : public:
    +      37             :   typedef std::variant<mrs_msgs::HwApiActuatorCmd, mrs_msgs::HwApiControlGroupCmd, mrs_msgs::HwApiAttitudeRateCmd, mrs_msgs::HwApiAttitudeCmd,
    +      38             :                        mrs_msgs::HwApiAccelerationHdgRateCmd, mrs_msgs::HwApiAccelerationHdgCmd, mrs_msgs::HwApiVelocityHdgRateCmd,
    +      39             :                        mrs_msgs::HwApiVelocityHdgCmd, mrs_msgs::HwApiPositionCmd>
    +      40             :       HwApiOutputVariant;
    +      41             : 
    +      42             :   typedef struct
    +      43             :   {
    +      44             :     std::optional<HwApiOutputVariant> control_output;
    +      45             :     mrs_msgs::ControllerDiagnostics   diagnostics;
    +      46             : 
    +      47             :     /**
    +      48             :      * @brief Desired orientation is used for checking the orientation control error.
    +      49             :      *        This variable is optional, fill it in if you know it.
    +      50             :      */
    +      51             :     std::optional<Eigen::Quaterniond> desired_orientation;
    +      52             : 
    +      53             :     /**
    +      54             :      * @brief Desired unbiased acceleration is used by the MRS odometry as control input.
    +      55             :      *        This variable is optional, fill it in if you know it.
    +      56             :      */
    +      57             :     std::optional<Eigen::Vector3d> desired_unbiased_acceleration;
    +      58             : 
    +      59             :     /**
    +      60             :      * @brief Desired heading rate caused by the controllers control action.
    +      61             :      *        This variable is optional, fill it in if you know it.
    +      62             :      */
    +      63             :     std::optional<double> desired_heading_rate;
    +      64             :   } ControlOutput;
    +      65             : 
    +      66             :   /**
    +      67             :    * @brief Initializes the controller. It is called once for every controller. The runtime is not limited.
    +      68             :    *
    +      69             :    * @param nh the node handle of the ControlManager
    +      70             :    * @param name of the controller for distinguishing multiple running instances of the same code
    +      71             :    * @param name_space the parameter namespace of the controller, can be used during initialization of the private node handle
    +      72             :    * @param common_handlers handlers shared between trackers and controllers
    +      73             :    * @param private_handlers handlers provided individually to each controller
    +      74             :    *
    +      75             :    * @return true if success
    +      76             :    */
    +      77             :   virtual bool initialize(const ros::NodeHandle &nh, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t> common_handlers,
    +      78             :                           std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t> private_handlers) = 0;
    +      79             : 
    +      80             :   /**
    +      81             :    * @brief It is called before the controller output will be required and used. Should not take much time (within miliseconds).
    +      82             :    *
    +      83             :    * @param last_attitude_cmd the last command produced by the last active controller. Should be used as an initial condition, e.g., for re-initializing
    +      84             :    * integrators and estimators.
    +      85             :    *
    +      86             :    * @return true if success
    +      87             :    */
    +      88             :   virtual bool activate(const ControlOutput &last_control_output) = 0;
    +      89             : 
    +      90             :   /**
    +      91             :    * @brief is called when this controller's output is no longer needed. However, it can be activated later.
    +      92             :    */
    +      93             :   virtual void deactivate(void) = 0;
    +      94             : 
    +      95             :   /**
    +      96             :    * @brief It may be called to reset the controllers disturbance estimators.
    +      97             :    */
    +      98             :   virtual void resetDisturbanceEstimators(void) = 0;
    +      99             : 
    +     100             :   /**
    +     101             :    * @brief This method is called in the main feedback control loop when your controller is NOT active. You can use this to validate your results without endangering the drone.
    +     102             :    *        The method is called even before the flight with just the uav_state being supplied.
    +     103             :    *
    +     104             :    * @param uav_state current estimated state of the UAV dynamics
    +     105             :    * @param tracker_command current required control reference (is optional)
    +     106             :    */
    +     107             :   virtual void updateInactive(const mrs_msgs::UavState &uav_state, const std::optional<mrs_msgs::TrackerCommand> &tracker_command) = 0;
    +     108             : 
    +     109             :   /**
    +     110             :    * @brief This method is called in the main feedback control loop when your controller IS active and when it is supposed to produce a control output.
    +     111             :    *
    +     112             :    * @param uav_state current estimated state of the UAV dynamics
    +     113             :    * @param tracker_command current required control reference
    +     114             :    *
    +     115             :    * @return produced control output
    +     116             :    */
    +     117             :   virtual ControlOutput updateActive(const mrs_msgs::UavState &uav_state, const mrs_msgs::TrackerCommand &tracker_command) = 0;
    +     118             : 
    +     119             :   /**
    +     120             :    * @brief A request for the controller's status.
    +     121             :    *
    +     122             :    * @return the controller's status
    +     123             :    */
    +     124             :   virtual const mrs_msgs::ControllerStatus getStatus() = 0;
    +     125             : 
    +     126             :   /**
    +     127             :    * @brief It is called during every switch of reference frames of the UAV state estimate.
    +     128             :    * The controller should recalculate its internal states from old the frame to the new one.
    +     129             :    *
    +     130             :    * @param new_uav_state the new UavState which will come in the next update()
    +     131             :    */
    +     132             :   virtual void switchOdometrySource(const mrs_msgs::UavState &new_uav_state) = 0;
    +     133             : 
    +     134             :   /**
    +     135             :    * @brief Request for setting new constraints.
    +     136             :    *
    +     137             :    * @param constraints to be set
    +     138             :    *
    +     139             :    * @return a service response
    +     140             :    */
    +     141             :   virtual const mrs_msgs::DynamicsConstraintsSrvResponse::ConstPtr setConstraints(const mrs_msgs::DynamicsConstraintsSrvRequest::ConstPtr &constraints) = 0;
    +     142             : 
    +     143         455 :   virtual ~Controller() = default;
    +     144             : };
    +     145             : 
    +     146             : }  // namespace mrs_uav_managers
    +     147             : 
    +     148             : #endif
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/controller.h.gcov.overview.html b/mrs_uav_managers/include/mrs_uav_managers/controller.h.gcov.overview.html new file mode 100644 index 0000000000..7ccc3a2839 --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/controller.h.gcov.overview.html @@ -0,0 +1,57 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/controller.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/controller.h.gcov.png b/mrs_uav_managers/include/mrs_uav_managers/controller.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..3aa437cffc6a4bac8d6472ee5f8996438a7ffd35 GIT binary patch literal 681 zcmV;a0#^NrP)gyv~hF-^&dW?vH8lQFyr0yFtbG*21IvQ>PFm5wzv~q9s(U*D?$PkPb*mg9K z4;`1wwTa!aQn#n9$1^8R4EK&++_~G$Y7^}l1fj>V&qK*=9V{9pxp(yE8zD8n&L7kKa*6i+*$L2+n!s;Qt zWF?Y#<*tX-BVbX5&}fQ9abk54F_QX+6k<>0_iOxZEXoWOfTDC|i(szm@qstVFc_eX z((J0{GcAMJAVebuH?H!-vd*kO-exr{K^E;Rr%15l!zD`*xd6!R$#h<%{YC~}%o`2Y zF_4q^ZtTtxf79?l#N9r&5hJPP#F|~*gUnc*v;!8oqQ#i0K;)WWsvz1Pkm84qvG(+D zVkB92j8nwb(^YqYUagSMLXiJv9Z|i>lu*k8DdmHzvH*go2mfisL)0D + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/estimation_manager/estimator.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/mrs_uav_managers/estimation_manager - estimator.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:44100.0 %
    Date:2024-04-18 23:11:36Functions:2366.7 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_managers::Estimator::~Estimator()0
    mrs_uav_managers::Estimator::Estimator(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)529
    mrs_uav_managers::Estimator::~Estimator().2529
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/estimator.h.func.html b/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/estimator.h.func.html new file mode 100644 index 0000000000..4e5427b7dd --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/estimator.h.func.html @@ -0,0 +1,92 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/estimation_manager/estimator.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/mrs_uav_managers/estimation_manager - estimator.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:44100.0 %
    Date:2024-04-18 23:11:36Functions:2366.7 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_managers::Estimator::Estimator(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)529
    mrs_uav_managers::Estimator::~Estimator()0
    mrs_uav_managers::Estimator::~Estimator().2529
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/estimator.h.gcov.frameset.html b/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/estimator.h.gcov.frameset.html new file mode 100644 index 0000000000..37d4a69ab9 --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/estimator.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/estimation_manager/estimator.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/estimator.h.gcov.html b/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/estimator.h.gcov.html new file mode 100644 index 0000000000..de3923b901 --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/estimator.h.gcov.html @@ -0,0 +1,195 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/estimation_manager/estimator.h + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/mrs_uav_managers/estimation_manager - estimator.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:44100.0 %
    Date:2024-04-18 23:11:36Functions:2366.7 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #ifndef MRS_UAV_MANAGERS_ESTIMATION_MANAGER_ESTIMATOR_H
    +       2             : #define MRS_UAV_MANAGERS_ESTIMATION_MANAGER_ESTIMATOR_H
    +       3             : 
    +       4             : /* includes //{ */
    +       5             : 
    +       6             : #include <ros/ros.h>
    +       7             : 
    +       8             : #include <Eigen/Dense>
    +       9             : 
    +      10             : #include <nav_msgs/Odometry.h>
    +      11             : 
    +      12             : #include <sensor_msgs/Imu.h>
    +      13             : 
    +      14             : #include <mrs_msgs/UavState.h>
    +      15             : #include <mrs_msgs/EstimatorInput.h>
    +      16             : #include <mrs_msgs/EstimatorDiagnostics.h>
    +      17             : 
    +      18             : #include <mrs_lib/publisher_handler.h>
    +      19             : #include <mrs_lib/attitude_converter.h>
    +      20             : #include <mrs_lib/param_loader.h>
    +      21             : #include <mrs_lib/mutex.h>
    +      22             : 
    +      23             : 
    +      24             : #include <mrs_uav_managers/estimation_manager/types.h>
    +      25             : #include <mrs_uav_managers/estimation_manager/support.h>
    +      26             : #include <mrs_uav_managers/estimation_manager/common_handlers.h>
    +      27             : #include <mrs_uav_managers/estimation_manager/private_handlers.h>
    +      28             : 
    +      29             : //}
    +      30             : 
    +      31             : namespace mrs_uav_managers
    +      32             : {
    +      33             : 
    +      34             : /* using namespace estimation_manager; */
    +      35             : 
    +      36             : using namespace mrs_uav_managers::estimation_manager;
    +      37             : 
    +      38             : class Estimator {
    +      39             : 
    +      40             : protected:
    +      41             :   mutable mrs_lib::PublisherHandler<mrs_msgs::EstimatorDiagnostics> ph_diagnostics_;
    +      42             : 
    +      43             :   const std::string type_;
    +      44             :   const std::string name_;
    +      45             :   const std::string package_name_;
    +      46             : 
    +      47             :   std::string frame_id_;  // cannot be constant - must remain overridable by loaded parameter
    +      48             :   std::string ns_frame_id_;
    +      49             : 
    +      50             :   std::shared_ptr<CommonHandlers_t>  ch_;
    +      51             :   std::shared_ptr<PrivateHandlers_t> ph_;
    +      52             : 
    +      53             :   double max_flight_z_ = -1.0;
    +      54             : 
    +      55             :   std::atomic_bool is_mitigating_jump_ = false;
    +      56             : 
    +      57             : private:
    +      58             :   SMStates_t         previous_sm_state_ = SMStates_t::UNINITIALIZED_STATE;
    +      59             :   SMStates_t         current_sm_state_  = SMStates_t::UNINITIALIZED_STATE;
    +      60             :   mutable std::mutex mutex_current_state_;
    +      61             : 
    +      62             : protected:
    +      63         529 :   Estimator(const std::string &type, const std::string &name, const std::string &frame_id) : type_(type), name_(name), frame_id_(frame_id) {
    +      64         529 :   }
    +      65             : 
    +      66         529 :   virtual ~Estimator(void) {
    +      67         529 :   }
    +      68             : 
    +      69             : public:
    +      70             :   // virtual methods
    +      71             :   virtual void initialize(ros::NodeHandle &nh, const std::shared_ptr<CommonHandlers_t> &ch, const std::shared_ptr<PrivateHandlers_t> &ph) = 0;
    +      72             :   virtual bool start(void)                                                                                                                = 0;
    +      73             :   virtual bool pause(void)                                                                                                                = 0;
    +      74             :   virtual bool reset(void)                                                                                                                = 0;
    +      75             : 
    +      76             :   // implemented methods
    +      77             :   // access methods
    +      78             :   std::string getName(void) const;
    +      79             :   std::string getPrintName(void) const;
    +      80             :   std::string getType(void) const;
    +      81             :   std::string getFrameId(void) const;
    +      82             :   double      getMaxFlightZ(void) const;
    +      83             :   std::string getSmStateString(const SMStates_t &state) const;
    +      84             :   std::string getCurrentSmStateString(void) const;
    +      85             :   SMStates_t  getCurrentSmState() const;
    +      86             : 
    +      87             :   void setCurrentSmState(const SMStates_t &new_state);
    +      88             : 
    +      89             :   bool isMitigatingJump();
    +      90             : 
    +      91             :   // state machine methods
    +      92             :   bool changeState(SMStates_t new_state);
    +      93             :   bool isInState(const SMStates_t &state_in) const;
    +      94             :   bool isInitialized() const;
    +      95             :   bool isReady() const;
    +      96             :   bool isStarted() const;
    +      97             :   bool isRunning() const;
    +      98             :   bool isStopped() const;
    +      99             :   bool isError() const;
    +     100             : 
    +     101             :   void publishDiagnostics() const;
    +     102             : 
    +     103             :   tf2::Vector3          getAccGlobal(const sensor_msgs::Imu::ConstPtr &input_msg, const double hdg);
    +     104             :   tf2::Vector3          getAccGlobal(const mrs_msgs::EstimatorInput::ConstPtr &input_msg, const double hdg);
    +     105             :   tf2::Vector3          getAccGlobal(const geometry_msgs::Vector3Stamped &acc_stamped, const double hdg);
    +     106             :   std::optional<double> getHeadingRate(const nav_msgs::OdometryConstPtr &odom_msg);
    +     107             : };
    +     108             : 
    +     109             : }  // namespace mrs_uav_managers
    +     110             : 
    +     111             : #endif  // MRS_UAV_MANAGERS_ESTIMATION_MANAGER_ESTIMATOR_H
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/estimator.h.gcov.overview.html b/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/estimator.h.gcov.overview.html new file mode 100644 index 0000000000..1a1e94470f --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/estimator.h.gcov.overview.html @@ -0,0 +1,48 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/estimation_manager/estimator.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/estimator.h.gcov.png b/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/estimator.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..77fe2beffc5729db0f0ec855eec111008d96cc88 GIT binary patch literal 506 zcmVa008j`=Fmn2hkQk9Ahg7z^spw9N-=}-rXW^kOaEvTlo0FNfIZNoT@1~LKB3<`J! z?pJ}gg=3mSIbx#c_7C;h?A!KjK= zE@eohrWcWJ=vP1iI&F(Cz%Z$M!ZdKlb>0O4ejN!>Y%Vwolzn+?CRE?COJoHMDj1vD zocBVL!u27$>-$f7(ZyYV2-kg?EZDFwSlxb|%|Lh8_AQlG1PsBXB^2$D?%UH42hEB; zpxLt6dfugIEu&ciQa(%|4MEXSTB*K?(a)1=Q3(6PGGaabO(%KnZn@uKO9pHhm z_kW7#gtW{vF`3*X7a*JQXvqaQ%iiY + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/estimation_manager + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/mrs_uav_managers/estimation_managerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:10610997.2 %
    Date:2024-04-18 23:11:36Functions:171894.4 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    estimator.h +
    100.0%
    +
    100.0 %4 / 466.7 %2 / 3
    <unnamed>100.0 %4 / 466.7 %2 / 3
    support.h +
    97.1%97.1%
    +
    97.1 %102 / 105100.0 %15 / 15
    <unnamed>97.1 %102 / 105100.0 %15 / 15
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/index-detail-sort-l.html b/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/index-detail-sort-l.html new file mode 100644 index 0000000000..275a037f0f --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/index-detail-sort-l.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/estimation_manager + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/mrs_uav_managers/estimation_managerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:10610997.2 %
    Date:2024-04-18 23:11:36Functions:171894.4 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    support.h +
    97.1%97.1%
    +
    97.1 %102 / 105100.0 %15 / 15
    <unnamed>97.1 %102 / 105100.0 %15 / 15
    estimator.h +
    100.0%
    +
    100.0 %4 / 466.7 %2 / 3
    <unnamed>100.0 %4 / 466.7 %2 / 3
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/index-detail.html b/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/index-detail.html new file mode 100644 index 0000000000..1689d920a5 --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/index-detail.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/estimation_manager + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/mrs_uav_managers/estimation_managerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:10610997.2 %
    Date:2024-04-18 23:11:36Functions:171894.4 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    estimator.h +
    100.0%
    +
    100.0 %4 / 466.7 %2 / 3
    <unnamed>100.0 %4 / 466.7 %2 / 3
    support.h +
    97.1%97.1%
    +
    97.1 %102 / 105100.0 %15 / 15
    <unnamed>97.1 %102 / 105100.0 %15 / 15
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/index-sort-f.html b/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/index-sort-f.html new file mode 100644 index 0000000000..66722ef46b --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/index-sort-f.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/estimation_manager + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/mrs_uav_managers/estimation_managerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:10610997.2 %
    Date:2024-04-18 23:11:36Functions:171894.4 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    estimator.h +
    100.0%
    +
    100.0 %4 / 466.7 %2 / 3
    support.h +
    97.1%97.1%
    +
    97.1 %102 / 105100.0 %15 / 15
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/index-sort-l.html b/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/index-sort-l.html new file mode 100644 index 0000000000..d960ea1f33 --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/index-sort-l.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/estimation_manager + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/mrs_uav_managers/estimation_managerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:10610997.2 %
    Date:2024-04-18 23:11:36Functions:171894.4 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    support.h +
    97.1%97.1%
    +
    97.1 %102 / 105100.0 %15 / 15
    estimator.h +
    100.0%
    +
    100.0 %4 / 466.7 %2 / 3
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/index.html b/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/index.html new file mode 100644 index 0000000000..395e5e9fe7 --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/index.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/estimation_manager + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/mrs_uav_managers/estimation_managerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:10610997.2 %
    Date:2024-04-18 23:11:36Functions:171894.4 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    estimator.h +
    100.0%
    +
    100.0 %4 / 466.7 %2 / 3
    support.h +
    97.1%97.1%
    +
    97.1 %102 / 105100.0 %15 / 15
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/support.h.func-sort-c.html b/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/support.h.func-sort-c.html new file mode 100644 index 0000000000..09290b2e48 --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/support.h.func-sort-c.html @@ -0,0 +1,140 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/estimation_manager/support.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/mrs_uav_managers/estimation_manager - support.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:10210597.1 %
    Date:2024-04-18 23:11:36Functions:1515100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_managers::estimation_manager::Support::getPoseDiff(geometry_msgs::Pose_<std::allocator<void> > const&, geometry_msgs::Pose_<std::allocator<void> > const&)5
    mrs_uav_managers::estimation_manager::Support::frameIdToEstimatorName(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)10
    mrs_uav_managers::estimation_manager::Support::isStringInVector(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&)283
    mrs_uav_managers::estimation_manager::Support::toLowercase(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)364
    mrs_uav_managers::estimation_manager::Support::toSnakeCase(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)2088
    mrs_uav_managers::estimation_manager::Support::applyPoseDiff(geometry_msgs::Pose_<std::allocator<void> > const&, geometry_msgs::Pose_<std::allocator<void> > const&)155204
    mrs_uav_managers::estimation_manager::Support::rotateVecByHdg(geometry_msgs::Vector3_<std::allocator<void> > const&, double)278647
    mrs_uav_managers::estimation_manager::Support::msgFromTf2(tf2::Transform const&)325334
    mrs_uav_managers::estimation_manager::Support::uavStateToOdom(mrs_msgs::UavState_<std::allocator<void> > const&)339183
    mrs_uav_managers::estimation_manager::Support::rotateVector(geometry_msgs::Vector3_<std::allocator<void> > const&, geometry_msgs::Quaternion_<std::allocator<void> > const&)340182
    mrs_uav_managers::estimation_manager::Support::noNans(geometry_msgs::Quaternion_<std::allocator<void> > const&)361507
    mrs_uav_managers::estimation_manager::Support::pointToVector3(geometry_msgs::Point_<std::allocator<void> > const&)684253
    mrs_uav_managers::estimation_manager::Support::poseFromTf2(tf2::Transform const&)699737
    mrs_uav_managers::estimation_manager::Support::tf2FromPose(geometry_msgs::Pose_<std::allocator<void> > const&)1025649
    mrs_uav_managers::estimation_manager::Support::noNans(geometry_msgs::TransformStamped_<std::allocator<void> > const&)1178852
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/support.h.func.html b/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/support.h.func.html new file mode 100644 index 0000000000..928f04edc0 --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/support.h.func.html @@ -0,0 +1,140 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/estimation_manager/support.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/mrs_uav_managers/estimation_manager - support.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:10210597.1 %
    Date:2024-04-18 23:11:36Functions:1515100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_managers::estimation_manager::Support::msgFromTf2(tf2::Transform const&)325334
    mrs_uav_managers::estimation_manager::Support::getPoseDiff(geometry_msgs::Pose_<std::allocator<void> > const&, geometry_msgs::Pose_<std::allocator<void> > const&)5
    mrs_uav_managers::estimation_manager::Support::poseFromTf2(tf2::Transform const&)699737
    mrs_uav_managers::estimation_manager::Support::tf2FromPose(geometry_msgs::Pose_<std::allocator<void> > const&)1025649
    mrs_uav_managers::estimation_manager::Support::toLowercase(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)364
    mrs_uav_managers::estimation_manager::Support::toSnakeCase(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)2088
    mrs_uav_managers::estimation_manager::Support::rotateVector(geometry_msgs::Vector3_<std::allocator<void> > const&, geometry_msgs::Quaternion_<std::allocator<void> > const&)340182
    mrs_uav_managers::estimation_manager::Support::applyPoseDiff(geometry_msgs::Pose_<std::allocator<void> > const&, geometry_msgs::Pose_<std::allocator<void> > const&)155204
    mrs_uav_managers::estimation_manager::Support::pointToVector3(geometry_msgs::Point_<std::allocator<void> > const&)684253
    mrs_uav_managers::estimation_manager::Support::rotateVecByHdg(geometry_msgs::Vector3_<std::allocator<void> > const&, double)278647
    mrs_uav_managers::estimation_manager::Support::uavStateToOdom(mrs_msgs::UavState_<std::allocator<void> > const&)339183
    mrs_uav_managers::estimation_manager::Support::isStringInVector(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&)283
    mrs_uav_managers::estimation_manager::Support::frameIdToEstimatorName(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)10
    mrs_uav_managers::estimation_manager::Support::noNans(geometry_msgs::Quaternion_<std::allocator<void> > const&)361507
    mrs_uav_managers::estimation_manager::Support::noNans(geometry_msgs::TransformStamped_<std::allocator<void> > const&)1178852
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/support.h.gcov.frameset.html b/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/support.h.gcov.frameset.html new file mode 100644 index 0000000000..e8f1cf866e --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/support.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/estimation_manager/support.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/support.h.gcov.html b/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/support.h.gcov.html new file mode 100644 index 0000000000..35d91c7ab9 --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/support.h.gcov.html @@ -0,0 +1,405 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/estimation_manager/support.h + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/mrs_uav_managers/estimation_manager - support.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:10210597.1 %
    Date:2024-04-18 23:11:36Functions:1515100.0 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #pragma once
    +       2             : #ifndef ESTIMATION_MANAGER_SUPPORT_H
    +       3             : #define ESTIMATION_MANAGER_SUPPORT_H
    +       4             : 
    +       5             : /* includes //{ */
    +       6             : 
    +       7             : #include <string.h>
    +       8             : 
    +       9             : #include <tf2_geometry_msgs/tf2_geometry_msgs.h>
    +      10             : 
    +      11             : #include <geometry_msgs/TransformStamped.h>
    +      12             : #include <geometry_msgs/Pose.h>
    +      13             : #include <geometry_msgs/PointStamped.h>
    +      14             : 
    +      15             : #include <nav_msgs/Odometry.h>
    +      16             : 
    +      17             : #include <mrs_msgs/UavState.h>
    +      18             : 
    +      19             : #include <mrs_lib/attitude_converter.h>
    +      20             : #include <mrs_lib/transformer.h>
    +      21             : 
    +      22             : //}
    +      23             : 
    +      24             : namespace mrs_uav_managers
    +      25             : {
    +      26             : 
    +      27             : namespace estimation_manager
    +      28             : {
    +      29             : 
    +      30             : /*//{ class Support */
    +      31             : class Support {
    +      32             : 
    +      33             : public:
    +      34             : 
    +      35             :   const static inline std::string waiting_for_string = "\033[0;36mWAITING FOR:\033[0m";
    +      36             : 
    +      37             :   /*//{ toSnakeCase() */
    +      38        2088 :   static std::string toSnakeCase(const std::string& str_in) {
    +      39             : 
    +      40        2088 :     std::string str(1, tolower(str_in[0]));
    +      41             : 
    +      42       32801 :     for (auto it = str_in.begin() + 1; it != str_in.end(); ++it) {
    +      43       30713 :       if (isupper(*it) && *(it - 1) != '_' && islower(*(it - 1))) {
    +      44        1725 :         str += "_";
    +      45             :       }
    +      46       30713 :       str += *it;
    +      47             :     }
    +      48             : 
    +      49        2088 :     std::transform(str.begin(), str.end(), str.begin(), ::tolower);
    +      50             : 
    +      51        2088 :     return str;
    +      52             :   }
    +      53             :   /*//}*/
    +      54             : 
    +      55             : /* toLowercase() //{ */
    +      56             : 
    +      57         364 : static std::string toLowercase(const std::string str_in) {
    +      58         364 :   std::string str_out = str_in;
    +      59         364 :   std::transform(str_out.begin(), str_out.end(), str_out.begin(), ::tolower);
    +      60         364 :   return str_out;
    +      61             : }
    +      62             : 
    +      63             : //}
    +      64             : 
    +      65             : /* toUppercase() //{ */
    +      66             : 
    +      67             : static std::string toUppercase(const std::string str_in) {
    +      68             :   std::string str_out = str_in;
    +      69             :   std::transform(str_out.begin(), str_out.end(), str_out.begin(), ::toupper);
    +      70             :   return str_out;
    +      71             : }
    +      72             : 
    +      73             : //}
    +      74             : 
    +      75             :   /*//{ stateCovToString() */
    +      76             :   template <typename StateCov>
    +      77             :   static std::string stateCovToString(const StateCov& sc) {
    +      78             :     std::stringstream ss;
    +      79             :     ss << "State:\n";
    +      80             :     for (int i = 0; i < sc.x.rows(); i++) {
    +      81             :       for (int j = 0; j < sc.x.cols(); j++) {
    +      82             :         ss << sc.x(i, j) << " ";
    +      83             :       }
    +      84             :       ss << "\n";
    +      85             :     }
    +      86             :     ss << "Cov:\n";
    +      87             :     for (int i = 0; i < sc.P.rows(); i++) {
    +      88             :       for (int j = 0; j < sc.P.cols(); j++) {
    +      89             :         ss << sc.P(i, j) << " ";
    +      90             :       }
    +      91             :       ss << "\n";
    +      92             :     }
    +      93             :     return ss.str();
    +      94             :   }
    +      95             :   /*//}*/
    +      96             : 
    +      97             :   /* //{ rotateVecByHdg() */
    +      98      278647 :   static tf2::Vector3 rotateVecByHdg(const geometry_msgs::Vector3& vec_in, const double hdg_in) {
    +      99             : 
    +     100      278647 :     const tf2::Quaternion q_hdg = mrs_lib::AttitudeConverter(0, 0, 0).setHeading(hdg_in);
    +     101             : 
    +     102      275994 :     const tf2::Vector3 vec_tf2(vec_in.x, vec_in.y, vec_in.z);
    +     103             : 
    +     104      276136 :     const tf2::Vector3 vec_rotated = tf2::quatRotate(q_hdg, vec_tf2);
    +     105             : 
    +     106      548230 :     return vec_rotated;
    +     107             :   }
    +     108             :   //}
    +     109             : 
    +     110             :   /* noNans() //{ */
    +     111     1178852 :   static bool noNans(const geometry_msgs::TransformStamped& tf) {
    +     112             : 
    +     113     3534044 :     return (std::isfinite(tf.transform.rotation.x) && std::isfinite(tf.transform.rotation.y) && std::isfinite(tf.transform.rotation.z) &&
    +     114     4710705 :             std::isfinite(tf.transform.rotation.w) && std::isfinite(tf.transform.translation.x) && std::isfinite(tf.transform.translation.y) &&
    +     115     2356015 :             std::isfinite(tf.transform.translation.z));
    +     116             :   }
    +     117             :   //}
    +     118             : 
    +     119             :   /* noNans() //{ */
    +     120      361507 :   static bool noNans(const geometry_msgs::Quaternion& q) {
    +     121             : 
    +     122      361507 :     return (std::isfinite(q.x) && std::isfinite(q.y) && std::isfinite(q.z) && std::isfinite(q.w));
    +     123             :   }
    +     124             :   //}
    +     125             : 
    +     126             :   /* isZeroQuaternion() //{ */
    +     127             :   static bool isZeroQuaternion(const geometry_msgs::Quaternion& q) {
    +     128             : 
    +     129             :     return (q.x == 0 && q.y == 0 && q.z == 0 && q.w == 0);
    +     130             :   }
    +     131             :   //}
    +     132             : 
    +     133             :   /* tf2FromPose() //{ */
    +     134             : 
    +     135     1025649 :   static tf2::Transform tf2FromPose(const geometry_msgs::Pose& pose_in) {
    +     136             : 
    +     137     1025649 :     tf2::Vector3 position(pose_in.position.x, pose_in.position.y, pose_in.position.z);
    +     138             : 
    +     139     1025257 :     tf2::Quaternion q;
    +     140     1025121 :     tf2::fromMsg(pose_in.orientation, q);
    +     141             : 
    +     142     1025110 :     tf2::Transform tf_out(q, position);
    +     143             : 
    +     144     2046632 :     return tf_out;
    +     145             :   }
    +     146             : 
    +     147             :   //}
    +     148             : 
    +     149             :   /* poseFromTf2() //{ */
    +     150             : 
    +     151      699737 :   static geometry_msgs::Pose poseFromTf2(const tf2::Transform& tf_in) {
    +     152             : 
    +     153      699737 :     geometry_msgs::Pose pose_out;
    +     154      698111 :     pose_out.position.x = tf_in.getOrigin().getX();
    +     155      698747 :     pose_out.position.y = tf_in.getOrigin().getY();
    +     156      698874 :     pose_out.position.z = tf_in.getOrigin().getZ();
    +     157             : 
    +     158      699671 :     pose_out.orientation = tf2::toMsg(tf_in.getRotation());
    +     159             : 
    +     160      699716 :     return pose_out;
    +     161             :   }
    +     162             : 
    +     163             :   //}
    +     164             : 
    +     165             :   /* msgFromTf2() //{ */
    +     166      325334 :   static geometry_msgs::Transform msgFromTf2(const tf2::Transform& tf_in) {
    +     167             : 
    +     168      325334 :     geometry_msgs::Transform tf_out;
    +     169      325334 :     tf_out.translation.x = tf_in.getOrigin().getX();
    +     170      325334 :     tf_out.translation.y = tf_in.getOrigin().getY();
    +     171      325334 :     tf_out.translation.z = tf_in.getOrigin().getZ();
    +     172      325334 :     tf_out.rotation = tf2::toMsg(tf_in.getRotation());
    +     173             : 
    +     174      325334 :     return tf_out;
    +     175             :   }
    +     176             : 
    +     177             :   //}
    +     178             :   
    +     179             :   /* tf2FromMsg() //{ */
    +     180             :   static tf2::Transform tf2FromMsg(const geometry_msgs::Transform& tf_in) {
    +     181             : 
    +     182             :     tf2::Transform tf_out;
    +     183             :     tf_out.setOrigin(tf2::Vector3(tf_in.translation.x, tf_in.translation.y, tf_in.translation.z));
    +     184             :     tf_out.setRotation(tf2::Quaternion(tf_in.rotation.x, tf_in.rotation.y, tf_in.rotation.z, tf_in.rotation.w));
    +     185             : 
    +     186             :     return tf_out;
    +     187             :   }
    +     188             : 
    +     189             :   //}
    +     190             :  
    +     191             :   /* pointToVector3() //{ */
    +     192             : 
    +     193      684253 :   static geometry_msgs::Vector3 pointToVector3(const geometry_msgs::Point& point_in) {
    +     194             : 
    +     195      684253 :     geometry_msgs::Vector3 vec_out;
    +     196      684048 :     vec_out.x = point_in.x;
    +     197      684048 :     vec_out.y = point_in.y;
    +     198      684048 :     vec_out.z = point_in.z;
    +     199             : 
    +     200      684048 :     return vec_out;
    +     201             :   }
    +     202             : 
    +     203             :   //}
    +     204             : 
    +     205             :   /*//{ rotateVector() */
    +     206      340182 :   static geometry_msgs::Vector3 rotateVector(const geometry_msgs::Vector3& vec_in, const geometry_msgs::Quaternion& q_in) {
    +     207             : 
    +     208             :     try {
    +     209      340182 :       Eigen::Matrix3d        R = mrs_lib::AttitudeConverter(q_in);
    +     210      340160 :       Eigen::Vector3d        vec_in_eigen(vec_in.x, vec_in.y, vec_in.z);
    +     211      339706 :       Eigen::Vector3d        vec_eigen_rotated = R * vec_in_eigen;
    +     212      339925 :       geometry_msgs::Vector3 vec_out;
    +     213      339101 :       vec_out.x = vec_eigen_rotated[0];
    +     214      339134 :       vec_out.y = vec_eigen_rotated[1];
    +     215      339436 :       vec_out.z = vec_eigen_rotated[2];
    +     216      339635 :       return vec_out;
    +     217             :     }
    +     218           0 :     catch (...) {
    +     219           0 :       ROS_ERROR_THROTTLE(1.0, "[Support::rotateVector()]: failed");
    +     220           0 :       return vec_in;
    +     221             :     }
    +     222             :   }
    +     223             :   /*//}*/
    +     224             : 
    +     225             :   /*//{ uavStateToOdom() */
    +     226      339183 :   static nav_msgs::Odometry uavStateToOdom(const mrs_msgs::UavState& uav_state) {
    +     227      339183 :     nav_msgs::Odometry odom;
    +     228      339129 :     odom.header              = uav_state.header;
    +     229      339055 :     odom.child_frame_id      = uav_state.child_frame_id;
    +     230      339044 :     odom.pose.pose           = uav_state.pose;
    +     231      339044 :     odom.twist.twist.angular = uav_state.velocity.angular;
    +     232             : 
    +     233      339044 :     tf2::Quaternion q;
    +     234      339037 :     tf2::fromMsg(odom.pose.pose.orientation, q);
    +     235      339036 :     odom.twist.twist.linear = Support::rotateVector(uav_state.velocity.linear, mrs_lib::AttitudeConverter(q.inverse()));
    +     236             : 
    +     237      677304 :     return odom;
    +     238             :   }
    +     239             :   /*//}*/
    +     240             : 
    +     241             :   /*//{ getPoseDiff() */
    +     242           5 :   static geometry_msgs::Pose getPoseDiff(const geometry_msgs::Pose& p1, const geometry_msgs::Pose& p2) {
    +     243             : 
    +     244           5 :     tf2::Vector3 v1, v2;
    +     245           5 :     tf2::fromMsg(p1.position, v1);
    +     246           5 :     tf2::fromMsg(p2.position, v2);
    +     247           5 :     const tf2::Vector3 v3 = v1 - v2;
    +     248             : 
    +     249           5 :     tf2::Quaternion q1, q2;
    +     250           5 :     tf2::fromMsg(p1.orientation, q1);
    +     251           5 :     tf2::fromMsg(p2.orientation, q2);
    +     252           5 :     tf2::Quaternion q3 = q2 * q1.inverse();
    +     253           5 :     q3.normalize();
    +     254             : 
    +     255           5 :     geometry_msgs::Pose pose_diff;
    +     256           5 :     tf2::toMsg(v3, pose_diff.position);
    +     257           5 :     pose_diff.orientation = tf2::toMsg(q3);
    +     258             : 
    +     259          10 :     return pose_diff;
    +     260             :   }
    +     261             :   /*//}*/
    +     262             : 
    +     263             :   /*//{ applyPoseDiff() */
    +     264      155204 :   static geometry_msgs::Pose applyPoseDiff(const geometry_msgs::Pose& pose_in, const geometry_msgs::Pose& pose_diff) {
    +     265             : 
    +     266      155204 :     tf2::Vector3    pos_in;
    +     267      155204 :     tf2::Quaternion q_in;
    +     268      155204 :     tf2::fromMsg(pose_in.position, pos_in);
    +     269      155204 :     tf2::fromMsg(pose_in.orientation, q_in);
    +     270             : 
    +     271      155204 :     tf2::Vector3    pos_diff;
    +     272      155204 :     tf2::Quaternion q_diff;
    +     273      155204 :     tf2::fromMsg(pose_diff.position, pos_diff);
    +     274      155204 :     tf2::fromMsg(pose_diff.orientation, q_diff);
    +     275             : 
    +     276      155204 :     const tf2::Vector3    pos_out = tf2::quatRotate(q_diff.inverse(), (pos_in - pos_diff));
    +     277      155204 :     const tf2::Quaternion q_out   = q_diff.inverse() * q_in;
    +     278             : 
    +     279      155204 :     geometry_msgs::Pose pose_out;
    +     280      155204 :     tf2::toMsg(pos_out, pose_out.position);
    +     281      155204 :     pose_out.orientation = tf2::toMsg(q_out);
    +     282             : 
    +     283      310408 :     return pose_out;
    +     284             :   }
    +     285             : 
    +     286             :   //}
    +     287             : 
    +     288             :   /*//{ loadParamFile() */
    +     289             :   static void loadParamFile(const std::string& file_path, const std::string& ns = "") {
    +     290             :     std::string command = "rosparam load " + file_path + " " + ns;
    +     291             :     int         result  = std::system(command.c_str());
    +     292             :     if (result != 0) {
    +     293             :       ROS_ERROR_STREAM("Could not set config file " << file_path << " to the parameter server.");
    +     294             :     }
    +     295             :   }
    +     296             :   /*//}*/
    +     297             : 
    +     298             :   /*//{ isStringInVector() */
    +     299         283 :   static bool isStringInVector(const std::string& value, const std::vector<std::string>& str_vec) {
    +     300         283 :     return std::find(str_vec.begin(), str_vec.end(), value) != str_vec.end();
    +     301             :   }
    +     302             :   /*//}*/
    +     303             : 
    +     304             :   /*//{ frameIdToEstimatorName() */
    +     305          10 :   static std::string frameIdToEstimatorName(const std::string& str_in) {
    +     306          20 :     const std::string str_tmp = str_in.substr(str_in.find("/")+1, str_in.size());
    +     307          20 :     return str_tmp.substr(0, str_tmp.find("_origin") );
    +     308             :   }
    +     309             :   /*//}*/
    +     310             : 
    +     311             : private:
    +     312             :   Support() {
    +     313             :   }
    +     314             : };
    +     315             : /*//}*/
    +     316             : 
    +     317             : }  // namespace estimation_manager
    +     318             : 
    +     319             : }  // namespace mrs_uav_managers
    +     320             : 
    +     321             : #endif  // ESTIMATION_MANAGER_SUPPORT_H
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/support.h.gcov.overview.html b/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/support.h.gcov.overview.html new file mode 100644 index 0000000000..4e128092e1 --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/support.h.gcov.overview.html @@ -0,0 +1,101 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/estimation_manager/support.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/support.h.gcov.png b/mrs_uav_managers/include/mrs_uav_managers/estimation_manager/support.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..600621ddc5631c697485f23bb4f61bac03ab2008 GIT binary patch literal 1232 zcmV;>1TXuEP)!aTS z5Vxy9aa$M9sV);`M%x_es-`opvt%zamd49~b&(2;7v*P+*T~+(SeKduCv-i{ynqp} zt`=~5&$R1S-*r3#i7w3&6ffc2>{^8=EOel}ywZVbG_g?7Js zOYN}r?4-J1fl5?sUnT#0=>^cV@jd;UHk^K}S4Vyd4Jhsu~gD~z$WSv=u z(-}ITB2b>r+!Hkg6^)ph9gQKV2U7M^>Y;6?<`EgM0NDh5xxzI|3r{K>X^&q1zIsx? z?q&eEyhkc4iX~{Wz5}I=Nc@!!MDD{sKgmTl0Y<>wzF*tJ58`ZT>%-MJqrFuKM4gpv z`9#;H;BubP5p{v$RVcTfud+wOV|(};Ld}UOBw@S*B#}kG0XQxUNl-ZJnW)eMevv(P z<15cSV0M_Hotv4~0&h&=`+z(HXUIS9&HC9{PB$O}A?e35UiwEgBH*#*5rlozDv;E( z2FKVR-{U)qQs`ND&UP+yDdlJ9;m2k|QdvV0s7cxVZ9rMeo}#<=@fDsTmu{QfRij|_ z6uBOqG$L`f?CtI4e#jP*%jQ5fS`FA5a0l)qW7~2Q5Qn2`dVLG9Z;W>uLWz zf7;CgEfU)E_2TcI1o+SXb{Tt}M&Pg3A5pMuQIj=Obfe)p4Ex8um4U$CaCnR;Jlyt5IPT=mbfITR!t)s$VjotR1Qf{h4W=N?}sNBD{Kl zrB$;+z)x6(on=^Ag=86;aVOAP9CUjDm#wdv}L(8>hN~JiX zO+lPfdvRfM4lya5f;ns~Zn=&_qR-9M!hF>RqWFJA{@Ie9&;jrrA2>9y!lBHRS;F@! zo(XZs4E(pQpZigPK$nIFln5+?CK;ao#J*5WVx2&8)ajD)?Jv6HRJ>?zV& zOtAUFmM=P*2B!e@rv#+7;DsZsSR^>Uhny6g-7DR|)k7)-r}wX?pMR9p{{ShfR7eLX uuF}o73AH3g65Djf>tl2z?7tTjweTN4ektG-6b(NB0000 + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/mrs_uav_managersHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:1212100.0 %
    Date:2024-04-18 23:11:36Functions:61060.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    tracker.h +
    100.0%
    +
    100.0 %1 / 150.0 %1 / 2
    <unnamed>100.0 %1 / 150.0 %1 / 2
    controller.h +
    100.0%
    +
    100.0 %1 / 150.0 %1 / 2
    <unnamed>100.0 %1 / 150.0 %1 / 2
    agl_estimator.h +
    100.0%
    +
    100.0 %5 / 566.7 %2 / 3
    <unnamed>100.0 %5 / 566.7 %2 / 3
    state_estimator.h +
    100.0%
    +
    100.0 %5 / 566.7 %2 / 3
    <unnamed>100.0 %5 / 566.7 %2 / 3
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/index-detail-sort-l.html b/mrs_uav_managers/include/mrs_uav_managers/index-detail-sort-l.html new file mode 100644 index 0000000000..ef9ba13060 --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/index-detail-sort-l.html @@ -0,0 +1,164 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/mrs_uav_managersHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:1212100.0 %
    Date:2024-04-18 23:11:36Functions:61060.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    tracker.h +
    100.0%
    +
    100.0 %1 / 150.0 %1 / 2
    <unnamed>100.0 %1 / 150.0 %1 / 2
    controller.h +
    100.0%
    +
    100.0 %1 / 150.0 %1 / 2
    <unnamed>100.0 %1 / 150.0 %1 / 2
    agl_estimator.h +
    100.0%
    +
    100.0 %5 / 566.7 %2 / 3
    <unnamed>100.0 %5 / 566.7 %2 / 3
    state_estimator.h +
    100.0%
    +
    100.0 %5 / 566.7 %2 / 3
    <unnamed>100.0 %5 / 566.7 %2 / 3
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/index-detail.html b/mrs_uav_managers/include/mrs_uav_managers/index-detail.html new file mode 100644 index 0000000000..b1791bf833 --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/index-detail.html @@ -0,0 +1,164 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/mrs_uav_managersHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:1212100.0 %
    Date:2024-04-18 23:11:36Functions:61060.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    agl_estimator.h +
    100.0%
    +
    100.0 %5 / 566.7 %2 / 3
    <unnamed>100.0 %5 / 566.7 %2 / 3
    controller.h +
    100.0%
    +
    100.0 %1 / 150.0 %1 / 2
    <unnamed>100.0 %1 / 150.0 %1 / 2
    state_estimator.h +
    100.0%
    +
    100.0 %5 / 566.7 %2 / 3
    <unnamed>100.0 %5 / 566.7 %2 / 3
    tracker.h +
    100.0%
    +
    100.0 %1 / 150.0 %1 / 2
    <unnamed>100.0 %1 / 150.0 %1 / 2
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/index-sort-f.html b/mrs_uav_managers/include/mrs_uav_managers/index-sort-f.html new file mode 100644 index 0000000000..7c8fd92ed8 --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/index-sort-f.html @@ -0,0 +1,132 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/mrs_uav_managersHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:1212100.0 %
    Date:2024-04-18 23:11:36Functions:61060.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    tracker.h +
    100.0%
    +
    100.0 %1 / 150.0 %1 / 2
    controller.h +
    100.0%
    +
    100.0 %1 / 150.0 %1 / 2
    agl_estimator.h +
    100.0%
    +
    100.0 %5 / 566.7 %2 / 3
    state_estimator.h +
    100.0%
    +
    100.0 %5 / 566.7 %2 / 3
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/index-sort-l.html b/mrs_uav_managers/include/mrs_uav_managers/index-sort-l.html new file mode 100644 index 0000000000..b79ea0fddb --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/index-sort-l.html @@ -0,0 +1,132 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/mrs_uav_managersHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:1212100.0 %
    Date:2024-04-18 23:11:36Functions:61060.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    tracker.h +
    100.0%
    +
    100.0 %1 / 150.0 %1 / 2
    controller.h +
    100.0%
    +
    100.0 %1 / 150.0 %1 / 2
    agl_estimator.h +
    100.0%
    +
    100.0 %5 / 566.7 %2 / 3
    state_estimator.h +
    100.0%
    +
    100.0 %5 / 566.7 %2 / 3
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/index.html b/mrs_uav_managers/include/mrs_uav_managers/index.html new file mode 100644 index 0000000000..0cdc838091 --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/index.html @@ -0,0 +1,132 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/mrs_uav_managersHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:1212100.0 %
    Date:2024-04-18 23:11:36Functions:61060.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    agl_estimator.h +
    100.0%
    +
    100.0 %5 / 566.7 %2 / 3
    controller.h +
    100.0%
    +
    100.0 %1 / 150.0 %1 / 2
    state_estimator.h +
    100.0%
    +
    100.0 %5 / 566.7 %2 / 3
    tracker.h +
    100.0%
    +
    100.0 %1 / 150.0 %1 / 2
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/state_estimator.h.func-sort-c.html b/mrs_uav_managers/include/mrs_uav_managers/state_estimator.h.func-sort-c.html new file mode 100644 index 0000000000..2e53b6eb44 --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/state_estimator.h.func-sort-c.html @@ -0,0 +1,92 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/state_estimator.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/mrs_uav_managers - state_estimator.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:55100.0 %
    Date:2024-04-18 23:11:36Functions:2366.7 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_managers::StateEstimator::~StateEstimator()0
    mrs_uav_managers::StateEstimator::StateEstimator(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)98
    mrs_uav_managers::StateEstimator::~StateEstimator().298
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/state_estimator.h.func.html b/mrs_uav_managers/include/mrs_uav_managers/state_estimator.h.func.html new file mode 100644 index 0000000000..67f71eecf7 --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/state_estimator.h.func.html @@ -0,0 +1,92 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/state_estimator.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/mrs_uav_managers - state_estimator.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:55100.0 %
    Date:2024-04-18 23:11:36Functions:2366.7 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_managers::StateEstimator::StateEstimator(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)98
    mrs_uav_managers::StateEstimator::~StateEstimator()0
    mrs_uav_managers::StateEstimator::~StateEstimator().298
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/state_estimator.h.gcov.frameset.html b/mrs_uav_managers/include/mrs_uav_managers/state_estimator.h.gcov.frameset.html new file mode 100644 index 0000000000..62896e21d2 --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/state_estimator.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/state_estimator.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/state_estimator.h.gcov.html b/mrs_uav_managers/include/mrs_uav_managers/state_estimator.h.gcov.html new file mode 100644 index 0000000000..8e224b64ac --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/state_estimator.h.gcov.html @@ -0,0 +1,169 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/state_estimator.h + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/mrs_uav_managers - state_estimator.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:55100.0 %
    Date:2024-04-18 23:11:36Functions:2366.7 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #ifndef MRS_UAV_MANAGERS_STATE_ESTIMATOR_H
    +       2             : #define MRS_UAV_MANAGERS_STATE_ESTIMATOR_H
    +       3             : 
    +       4             : /* includes //{ */
    +       5             : 
    +       6             : #include <ros/ros.h>
    +       7             : 
    +       8             : #include <Eigen/Dense>
    +       9             : 
    +      10             : #include <nav_msgs/Odometry.h>
    +      11             : 
    +      12             : #include <mrs_msgs/UavState.h>
    +      13             : #include <mrs_msgs/Float64ArrayStamped.h>
    +      14             : #include <mrs_msgs/HwApiCapabilities.h>
    +      15             : 
    +      16             : #include <mrs_uav_managers/estimation_manager/estimator.h>
    +      17             : 
    +      18             : //}
    +      19             : 
    +      20             : namespace mrs_uav_managers
    +      21             : {
    +      22             : 
    +      23             : namespace state
    +      24             : {
    +      25             : const char type[] = "STATE";
    +      26             : }
    +      27             : 
    +      28             : using namespace estimation_manager;
    +      29             : 
    +      30             : class StateEstimator : public Estimator {
    +      31             : 
    +      32             : protected:
    +      33             :   const std::string package_name_ = "mrs_uav_state_estimators";
    +      34             : 
    +      35             :   ros::NodeHandle nh_;
    +      36             : 
    +      37             :   mrs_msgs::UavState uav_state_;
    +      38             :   mrs_msgs::UavState uav_state_init_;
    +      39             :   mutable std::mutex mtx_uav_state_;
    +      40             : 
    +      41             :   nav_msgs::Odometry odom_;
    +      42             :   mutable std::mutex mtx_odom_;
    +      43             : 
    +      44             :   nav_msgs::Odometry innovation_;
    +      45             :   nav_msgs::Odometry innovation_init_;
    +      46             :   mutable std::mutex mtx_innovation_;
    +      47             : 
    +      48             :   mrs_msgs::Float64ArrayStamped pose_covariance_, twist_covariance_;
    +      49             :   mutable std::mutex            mtx_covariance_;
    +      50             : 
    +      51             :   bool is_override_frame_id_ = false;
    +      52             : 
    +      53             : protected:
    +      54             :   mutable mrs_lib::PublisherHandler<mrs_msgs::UavState>               ph_uav_state_;
    +      55             :   mutable mrs_lib::PublisherHandler<nav_msgs::Odometry>               ph_odom_;
    +      56             :   mutable mrs_lib::PublisherHandler<mrs_msgs::Float64ArrayStamped>    ph_pose_covariance_, ph_twist_covariance_;
    +      57             :   mutable mrs_lib::PublisherHandler<nav_msgs::Odometry>               ph_innovation_;
    +      58             :   mutable mrs_lib::PublisherHandler<geometry_msgs::QuaternionStamped> ph_attitude_;
    +      59             : 
    +      60             : public:
    +      61          98 :   StateEstimator(const std::string &name, const std::string &frame_id, const std::string &package_name)
    +      62          98 :       : Estimator(state::type, name, frame_id), package_name_(package_name) {
    +      63          98 :   }
    +      64             : 
    +      65          98 :   virtual ~StateEstimator(void) {
    +      66          98 :   }
    +      67             : 
    +      68             :   virtual bool setUavState(const mrs_msgs::UavState &uav_state) = 0;
    +      69             : 
    +      70             :   // implemented methods
    +      71             :   std::optional<mrs_msgs::UavState>        getUavState();
    +      72             :   nav_msgs::Odometry                       getInnovation() const;
    +      73             :   std::vector<double>                      getPoseCovariance() const;
    +      74             :   std::vector<double>                      getTwistCovariance() const;
    +      75             :   void                                     publishUavState() const;
    +      76             :   void                                     publishOdom() const;
    +      77             :   void                                     publishCovariance() const;
    +      78             :   void                                     publishInnovation() const;
    +      79             :   std::optional<geometry_msgs::Quaternion> rotateQuaternionByHeading(const geometry_msgs::Quaternion &q, const double hdg) const;
    +      80             :   bool                                     isCompatibleWithHwApi(const mrs_msgs::HwApiCapabilitiesConstPtr &hw_api_capabilities) const;
    +      81             : };
    +      82             : 
    +      83             : }  // namespace mrs_uav_managers
    +      84             : 
    +      85             : #endif  // MRS_UAV_MANAGERS_STATE_ESTIMATOR_H
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/state_estimator.h.gcov.overview.html b/mrs_uav_managers/include/mrs_uav_managers/state_estimator.h.gcov.overview.html new file mode 100644 index 0000000000..59d782b49c --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/state_estimator.h.gcov.overview.html @@ -0,0 +1,42 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/state_estimator.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/state_estimator.h.gcov.png b/mrs_uav_managers/include/mrs_uav_managers/state_estimator.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..023df962b5285e84744bd9112e5b40c2d313589b GIT binary patch literal 435 zcmV;k0ZjghP) zqcGxZtePLT0I_(mFe*!3?98xQ9%(I7vOQF=hDI$Jh%=D-^hj|E5+A__?U8lZohc5w z`*59fKkmyo=lsdwBO?^vJL9|)g^^)5$n*G7f)7&1l}W=3d_nNV!7^&Vay@%91AKfc zuy{sB*{9ZwUjZ_74q{H#s{uNKGm!5FQ$_Ak47O396XE|A&J@#YM(@uA1p+_L>?;PJ d&1tyZ6MnOrXlS<^3&{Wg002ovPDHLkV1nR+yMF)x literal 0 HcmV?d00001 diff --git a/mrs_uav_managers/include/mrs_uav_managers/tracker.h.func-sort-c.html b/mrs_uav_managers/include/mrs_uav_managers/tracker.h.func-sort-c.html new file mode 100644 index 0000000000..4a5d7a5757 --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/tracker.h.func-sort-c.html @@ -0,0 +1,88 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/tracker.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/mrs_uav_managers - tracker.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:11100.0 %
    Date:2024-04-18 23:11:36Functions:1250.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_managers::Tracker::~Tracker()0
    mrs_uav_managers::Tracker::~Tracker().2547
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/tracker.h.func.html b/mrs_uav_managers/include/mrs_uav_managers/tracker.h.func.html new file mode 100644 index 0000000000..f2ebb9fefa --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/tracker.h.func.html @@ -0,0 +1,88 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/tracker.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/mrs_uav_managers - tracker.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:11100.0 %
    Date:2024-04-18 23:11:36Functions:1250.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_managers::Tracker::~Tracker()0
    mrs_uav_managers::Tracker::~Tracker().2547
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/tracker.h.gcov.frameset.html b/mrs_uav_managers/include/mrs_uav_managers/tracker.h.gcov.frameset.html new file mode 100644 index 0000000000..e231e20f7c --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/tracker.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/tracker.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/tracker.h.gcov.html b/mrs_uav_managers/include/mrs_uav_managers/tracker.h.gcov.html new file mode 100644 index 0000000000..74c81c2168 --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/tracker.h.gcov.html @@ -0,0 +1,296 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/tracker.h + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/mrs_uav_managers - tracker.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:11100.0 %
    Date:2024-04-18 23:11:36Functions:1250.0 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #ifndef MRS_UAV_TRACKER_H
    +       2             : #define MRS_UAV_TRACKER_H
    +       3             : 
    +       4             : /* includes //{ */
    +       5             : 
    +       6             : #include <ros/ros.h>
    +       7             : 
    +       8             : #include <mrs_uav_managers/control_manager/common_handlers.h>
    +       9             : #include <mrs_uav_managers/control_manager/private_handlers.h>
    +      10             : 
    +      11             : #include <mrs_msgs/TrackerCommand.h>
    +      12             : #include <mrs_msgs/TrackerStatus.h>
    +      13             : #include <mrs_msgs/UavState.h>
    +      14             : 
    +      15             : #include <mrs_msgs/Float64Srv.h>
    +      16             : #include <mrs_msgs/Float64SrvRequest.h>
    +      17             : #include <mrs_msgs/Float64SrvResponse.h>
    +      18             : 
    +      19             : #include <mrs_msgs/Float64.h>
    +      20             : 
    +      21             : #include <mrs_msgs/ReferenceSrv.h>
    +      22             : #include <mrs_msgs/ReferenceSrvRequest.h>
    +      23             : #include <mrs_msgs/ReferenceSrvResponse.h>
    +      24             : 
    +      25             : #include <mrs_msgs/VelocityReferenceSrv.h>
    +      26             : #include <mrs_msgs/VelocityReferenceSrvRequest.h>
    +      27             : #include <mrs_msgs/VelocityReferenceSrvResponse.h>
    +      28             : 
    +      29             : #include <mrs_msgs/TrajectoryReferenceSrv.h>
    +      30             : #include <mrs_msgs/TrajectoryReferenceSrvRequest.h>
    +      31             : #include <mrs_msgs/TrajectoryReferenceSrvResponse.h>
    +      32             : 
    +      33             : #include <std_srvs/Trigger.h>
    +      34             : #include <std_srvs/TriggerRequest.h>
    +      35             : #include <std_srvs/TriggerResponse.h>
    +      36             : 
    +      37             : #include <std_srvs/SetBool.h>
    +      38             : #include <std_srvs/SetBoolRequest.h>
    +      39             : #include <std_srvs/SetBoolResponse.h>
    +      40             : 
    +      41             : #include <mrs_msgs/DynamicsConstraintsSrv.h>
    +      42             : #include <mrs_msgs/DynamicsConstraintsSrvRequest.h>
    +      43             : #include <mrs_msgs/DynamicsConstraintsSrvResponse.h>
    +      44             : 
    +      45             : #include <mrs_uav_managers/controller.h>
    +      46             : 
    +      47             : //}
    +      48             : 
    +      49             : namespace mrs_uav_managers
    +      50             : {
    +      51             : 
    +      52             : class Tracker {
    +      53             : 
    +      54             : public:
    +      55             :   /**
    +      56             :    * @brief It is called once for every tracker. The runtime is not limited.
    +      57             :    *
    +      58             :    * @param nh the node handle of the ControlManager
    +      59             :    * @param uav_name the UAV name (e.g., "uav1")
    +      60             :    * @param common_handlers handlers shared between trackers and controllers
    +      61             :    * @param private_handlers handlers provided individually to each tracker
    +      62             :    *
    +      63             :    * @return true if success
    +      64             :    */
    +      65             :   virtual bool initialize(const ros::NodeHandle &nh, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t> common_handlers,
    +      66             :                           std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t> private_handlers) = 0;
    +      67             : 
    +      68             :   /**
    +      69             :    * @brief It is called before the trackers output will be required and used. Should not take much time (within miliseconds).
    +      70             :    *
    +      71             :    * @param last_tracker_cmd the last command produced by the last active tracker. Should be used as an initial condition to maintain a smooth reference.
    +      72             :    *
    +      73             :    * @return true if success and message
    +      74             :    */
    +      75             :   virtual std::tuple<bool, std::string> activate(const std::optional<mrs_msgs::TrackerCommand> &last_tracker_cmd) = 0;
    +      76             : 
    +      77             :   /**
    +      78             :    * @brief is called when this trackers output is no longer needed. However, it can be activated later.
    +      79             :    */
    +      80             :   virtual void deactivate(void) = 0;
    +      81             : 
    +      82             :   /**
    +      83             :    * @brief It is called during every switch of reference frames of the UAV state estimate.
    +      84             :    * The tracker should recalculate its internal states from old the frame to the new one.
    +      85             :    *
    +      86             :    * @param new_uav_state the new UavState which will come in the next update()
    +      87             :    *
    +      88             :    * @return a service response
    +      89             :    */
    +      90             :   virtual const std_srvs::TriggerResponse::ConstPtr switchOdometrySource(const mrs_msgs::UavState &new_uav_state) = 0;
    +      91             : 
    +      92             :   /**
    +      93             :    * @brief Request for reseting the tracker's states given the UAV is static.
    +      94             :    *
    +      95             :    * @return true if success
    +      96             :    */
    +      97             :   virtual bool resetStatic(void) = 0;
    +      98             : 
    +      99             :   /**
    +     100             :    * @brief The most important routine. It is called with every state estimator update and it should produce a new reference for the controllers.
    +     101             :    *        The run time should be as short as possible (<= 1 ms).
    +     102             :    *
    +     103             :    * @param uav_state the latest UAV state estimate
    +     104             :    * @param last_attitude_cmd the last controller's output command (may be useful)
    +     105             :    *
    +     106             :    * @return the new reference for the controllers
    +     107             :    */
    +     108             :   virtual std::optional<mrs_msgs::TrackerCommand> update(const mrs_msgs::UavState &uav_state, const Controller::ControlOutput &last_control_output) = 0;
    +     109             : 
    +     110             :   /**
    +     111             :    * @brief A request for the tracker's status.
    +     112             :    *
    +     113             :    * @return the tracker's status
    +     114             :    */
    +     115             :   virtual const mrs_msgs::TrackerStatus getStatus() = 0;
    +     116             : 
    +     117             :   /**
    +     118             :    * @brief Request for a flight to a given coordinates.
    +     119             :    *
    +     120             :    * @param cmd the reference
    +     121             :    *
    +     122             :    * @return a service response
    +     123             :    */
    +     124             :   virtual const mrs_msgs::ReferenceSrvResponse::ConstPtr setReference(const mrs_msgs::ReferenceSrvRequest::ConstPtr &cmd) = 0;
    +     125             : 
    +     126             :   /**
    +     127             :    * @brief Request for desired velocity reference
    +     128             :    *
    +     129             :    * @param cmd the reference
    +     130             :    *
    +     131             :    * @return a service response
    +     132             :    */
    +     133             :   virtual const mrs_msgs::VelocityReferenceSrvResponse::ConstPtr setVelocityReference(const mrs_msgs::VelocityReferenceSrvRequest::ConstPtr &cmd) = 0;
    +     134             : 
    +     135             :   /**
    +     136             :    * @brief Request for a flight along a given trajectory
    +     137             :    *
    +     138             :    * @param cmd the reference trajectory
    +     139             :    *
    +     140             :    * @return a service response
    +     141             :    */
    +     142             :   virtual const mrs_msgs::TrajectoryReferenceSrvResponse::ConstPtr setTrajectoryReference(const mrs_msgs::TrajectoryReferenceSrvRequest::ConstPtr &cmd) = 0;
    +     143             : 
    +     144             :   /**
    +     145             :    * @brief Request for stopping the motion of the UAV.
    +     146             :    *
    +     147             :    * @param trigger service request
    +     148             :    *
    +     149             :    * @return a service response
    +     150             :    */
    +     151             :   virtual const std_srvs::TriggerResponse::ConstPtr hover(const std_srvs::TriggerRequest::ConstPtr &cmd) = 0;
    +     152             : 
    +     153             :   /**
    +     154             :    * @brief Request to goto to the first trajectory coordinate.
    +     155             :    *
    +     156             :    * @param trigger service request
    +     157             :    *
    +     158             :    * @return a service response
    +     159             :    */
    +     160             :   virtual const std_srvs::TriggerResponse::ConstPtr gotoTrajectoryStart(const std_srvs::TriggerRequest::ConstPtr &cmd) = 0;
    +     161             : 
    +     162             :   /**
    +     163             :    * @brief Request to start tracking of the pre-loaded trajectory
    +     164             :    *
    +     165             :    * @param trigger service request
    +     166             :    *
    +     167             :    * @return a service response
    +     168             :    */
    +     169             :   virtual const std_srvs::TriggerResponse::ConstPtr startTrajectoryTracking(const std_srvs::TriggerRequest::ConstPtr &cmd) = 0;
    +     170             : 
    +     171             :   /**
    +     172             :    * @brief Request to stop tracking of the pre-loaded trajectory. The hover() routine will be engaged, thus it should be implemented by the tracker.
    +     173             :    *
    +     174             :    * @param trigger service request
    +     175             :    *
    +     176             :    * @return a service response
    +     177             :    */
    +     178             :   virtual const std_srvs::TriggerResponse::ConstPtr stopTrajectoryTracking(const std_srvs::TriggerRequest::ConstPtr &cmd) = 0;
    +     179             : 
    +     180             :   /**
    +     181             :    * @brief Request to resume the previously stopped trajectory tracking.
    +     182             :    *
    +     183             :    * @param trigger service request
    +     184             :    *
    +     185             :    * @return a service response
    +     186             :    */
    +     187             :   virtual const std_srvs::TriggerResponse::ConstPtr resumeTrajectoryTracking(const std_srvs::TriggerRequest::ConstPtr &cmd) = 0;
    +     188             : 
    +     189             :   /**
    +     190             :    * @brief Request for enabling/disabling callbacks.
    +     191             :    *
    +     192             :    * @param cmd service request
    +     193             :    *
    +     194             :    * @return a service response
    +     195             :    */
    +     196             :   virtual const std_srvs::SetBoolResponse::ConstPtr enableCallbacks(const std_srvs::SetBoolRequest::ConstPtr &cmd) = 0;
    +     197             : 
    +     198             :   /**
    +     199             :    * @brief Request for setting new constraints.
    +     200             :    *
    +     201             :    * @param constraints to be set
    +     202             :    *
    +     203             :    * @return a service response
    +     204             :    */
    +     205             :   virtual const mrs_msgs::DynamicsConstraintsSrvResponse::ConstPtr setConstraints(const mrs_msgs::DynamicsConstraintsSrvRequest::ConstPtr &constraints) = 0;
    +     206             : 
    +     207         547 :   virtual ~Tracker() = default;
    +     208             : };
    +     209             : 
    +     210             : }  // namespace mrs_uav_managers
    +     211             : 
    +     212             : #endif
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/tracker.h.gcov.overview.html b/mrs_uav_managers/include/mrs_uav_managers/tracker.h.gcov.overview.html new file mode 100644 index 0000000000..a0990b0d68 --- /dev/null +++ b/mrs_uav_managers/include/mrs_uav_managers/tracker.h.gcov.overview.html @@ -0,0 +1,73 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/mrs_uav_managers/tracker.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_managers/include/mrs_uav_managers/tracker.h.gcov.png b/mrs_uav_managers/include/mrs_uav_managers/tracker.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..b561f831d1fbd36bed3927191837491b26db1cec GIT binary patch literal 751 zcmVp{wn9h{fhN)Q+1>Kh+UYP(hJc0`BSsn+CPNKWj|hnq z<0)*3@i`zVJfE>QPz&_v*)wW^qw+LBho)CktARt6Js;21ct&)08r8s&fFAJJZL1l( zz@E+#(66)4XwbM5IRv^zZW$-(*-xzo9?j(YX?%xTALAm%b9Ty_F;@HV40!s?Ay14a z66>?^B)TEnv{sBdR`sb^Mq*_s!eFBB1L(?LuJb11knP}L9V<}uxjuQD*H zkFhcm9{H*|y!052hEop2?ot8@vp;4hJT$n|Q~E&UPpRYy2(p^npi#)s8VZa|R_K6| zOOBv9W?X^^&{i2v8jtN2wZLGmOl35P-`Ou(Mz`sYPwNlwpGJGi?0L!Y&d5b8>50;~ z0BQNI*RV3e9$ch-5C(zUG*S`EyC>DcUP2B-y`gS_o<_P4IG0u{Fjz}iBF-(R^KZL7 zv{J@Ee*>WQ=Wf!T29R5^2x)-Ysmq!vOJfYQFkaJf>oDSPZtP`Q%W-rM)K2~8hS#QR z1%?9&&vyoUvz&%cgx}Zj;<#2|IC!R@$G--somv=&-P^%<!l7lf8xCYN#XB}3 z|3`-N7p=hHG`yS&Ys&?wo%+uhenrA#^%4mp_ZZjfhmYZXjdj9nuO;P~>SOqv(Ya|# zwp#-8DdmOTcQ+g_F`RAh0JT%ggLr!WpF9^@7;k + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/transform_manager + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/transform_managerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:19239848.2 %
    Date:2024-04-18 23:11:36Functions:131968.4 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    tf_mapping_origin.h +
    0.0%
    +
    0.0 %0 / 1580.0 %0 / 5
    tf_source.h +
    80.0%80.0%
    +
    80.0 %192 / 24092.9 %13 / 14
    <unnamed>80.0 %192 / 24092.9 %13 / 14
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/transform_manager/index-detail-sort-l.html b/mrs_uav_managers/include/transform_manager/index-detail-sort-l.html new file mode 100644 index 0000000000..0d8f9f6505 --- /dev/null +++ b/mrs_uav_managers/include/transform_manager/index-detail-sort-l.html @@ -0,0 +1,120 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/transform_manager + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/transform_managerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:19239848.2 %
    Date:2024-04-18 23:11:36Functions:131968.4 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    tf_mapping_origin.h +
    0.0%
    +
    0.0 %0 / 1580.0 %0 / 5
    tf_source.h +
    80.0%80.0%
    +
    80.0 %192 / 24092.9 %13 / 14
    <unnamed>80.0 %192 / 24092.9 %13 / 14
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/transform_manager/index-detail.html b/mrs_uav_managers/include/transform_manager/index-detail.html new file mode 100644 index 0000000000..a5d1e57f65 --- /dev/null +++ b/mrs_uav_managers/include/transform_manager/index-detail.html @@ -0,0 +1,120 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/transform_manager + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/transform_managerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:19239848.2 %
    Date:2024-04-18 23:11:36Functions:131968.4 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    tf_mapping_origin.h +
    0.0%
    +
    0.0 %0 / 1580.0 %0 / 5
    tf_source.h +
    80.0%80.0%
    +
    80.0 %192 / 24092.9 %13 / 14
    <unnamed>80.0 %192 / 24092.9 %13 / 14
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/transform_manager/index-sort-f.html b/mrs_uav_managers/include/transform_manager/index-sort-f.html new file mode 100644 index 0000000000..3a27cf81bd --- /dev/null +++ b/mrs_uav_managers/include/transform_manager/index-sort-f.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/transform_manager + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/transform_managerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:19239848.2 %
    Date:2024-04-18 23:11:36Functions:131968.4 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    tf_mapping_origin.h +
    0.0%
    +
    0.0 %0 / 1580.0 %0 / 5
    tf_source.h +
    80.0%80.0%
    +
    80.0 %192 / 24092.9 %13 / 14
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/transform_manager/index-sort-l.html b/mrs_uav_managers/include/transform_manager/index-sort-l.html new file mode 100644 index 0000000000..97d2e7f0b4 --- /dev/null +++ b/mrs_uav_managers/include/transform_manager/index-sort-l.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/transform_manager + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/transform_managerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:19239848.2 %
    Date:2024-04-18 23:11:36Functions:131968.4 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    tf_mapping_origin.h +
    0.0%
    +
    0.0 %0 / 1580.0 %0 / 5
    tf_source.h +
    80.0%80.0%
    +
    80.0 %192 / 24092.9 %13 / 14
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/transform_manager/index.html b/mrs_uav_managers/include/transform_manager/index.html new file mode 100644 index 0000000000..5d85af1423 --- /dev/null +++ b/mrs_uav_managers/include/transform_manager/index.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/transform_manager + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/transform_managerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:19239848.2 %
    Date:2024-04-18 23:11:36Functions:131968.4 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    tf_mapping_origin.h +
    0.0%
    +
    0.0 %0 / 1580.0 %0 / 5
    tf_source.h +
    80.0%80.0%
    +
    80.0 %192 / 24092.9 %13 / 14
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/transform_manager/tf_mapping_origin.h.func-sort-c.html b/mrs_uav_managers/include/transform_manager/tf_mapping_origin.h.func-sort-c.html new file mode 100644 index 0000000000..808bef66a5 --- /dev/null +++ b/mrs_uav_managers/include/transform_manager/tf_mapping_origin.h.func-sort-c.html @@ -0,0 +1,100 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/transform_manager/tf_mapping_origin.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/transform_manager - tf_mapping_origin.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:01580.0 %
    Date:2024-04-18 23:11:36Functions:050.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_managers::TfMappingOrigin::getPrintName[abi:cxx11]()0
    mrs_uav_managers::TfMappingOrigin::callbackMappingOdomAlt(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>)0
    mrs_uav_managers::TfMappingOrigin::callbackMappingOdomLat(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>)0
    mrs_uav_managers::TfMappingOrigin::callbackMappingOdomRot(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>)0
    mrs_uav_managers::TfMappingOrigin::TfMappingOrigin(ros::NodeHandle, std::shared_ptr<mrs_lib::ParamLoader>, std::shared_ptr<mrs_lib::TransformBroadcaster> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t>)0
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/transform_manager/tf_mapping_origin.h.func.html b/mrs_uav_managers/include/transform_manager/tf_mapping_origin.h.func.html new file mode 100644 index 0000000000..d7cc35c419 --- /dev/null +++ b/mrs_uav_managers/include/transform_manager/tf_mapping_origin.h.func.html @@ -0,0 +1,100 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/transform_manager/tf_mapping_origin.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/transform_manager - tf_mapping_origin.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:01580.0 %
    Date:2024-04-18 23:11:36Functions:050.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_managers::TfMappingOrigin::getPrintName[abi:cxx11]()0
    mrs_uav_managers::TfMappingOrigin::callbackMappingOdomAlt(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>)0
    mrs_uav_managers::TfMappingOrigin::callbackMappingOdomLat(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>)0
    mrs_uav_managers::TfMappingOrigin::callbackMappingOdomRot(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>)0
    mrs_uav_managers::TfMappingOrigin::TfMappingOrigin(ros::NodeHandle, std::shared_ptr<mrs_lib::ParamLoader>, std::shared_ptr<mrs_lib::TransformBroadcaster> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t>)0
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/transform_manager/tf_mapping_origin.h.gcov.frameset.html b/mrs_uav_managers/include/transform_manager/tf_mapping_origin.h.gcov.frameset.html new file mode 100644 index 0000000000..ddfde9a414 --- /dev/null +++ b/mrs_uav_managers/include/transform_manager/tf_mapping_origin.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/transform_manager/tf_mapping_origin.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_managers/include/transform_manager/tf_mapping_origin.h.gcov.html b/mrs_uav_managers/include/transform_manager/tf_mapping_origin.h.gcov.html new file mode 100644 index 0000000000..43eae109e1 --- /dev/null +++ b/mrs_uav_managers/include/transform_manager/tf_mapping_origin.h.gcov.html @@ -0,0 +1,474 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/transform_manager/tf_mapping_origin.h + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/transform_manager - tf_mapping_origin.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:01580.0 %
    Date:2024-04-18 23:11:36Functions:050.0 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #pragma once
    +       2             : #ifndef TF_MAPPING_ORIGIN_H
    +       3             : #define TF_MAPPING_ORIGIN_H
    +       4             : 
    +       5             : #include <ros/ros.h>
    +       6             : 
    +       7             : #include <mrs_lib/param_loader.h>
    +       8             : #include <mrs_lib/subscribe_handler.h>
    +       9             : #include <mrs_lib/transform_broadcaster.h>
    +      10             : #include <mrs_lib/attitude_converter.h>
    +      11             : #include <mrs_lib/publisher_handler.h>
    +      12             : 
    +      13             : #include <nav_msgs/Odometry.h>
    +      14             : #include <geometry_msgs/QuaternionStamped.h>
    +      15             : #include <geometry_msgs/TransformStamped.h>
    +      16             : 
    +      17             : #include <mrs_uav_managers/estimation_manager/support.h>
    +      18             : #include <mrs_uav_managers/estimation_manager/common_handlers.h>
    +      19             : 
    +      20             : namespace mrs_uav_managers
    +      21             : {
    +      22             : 
    +      23             : /*//{ class TfMappingOrigin */
    +      24             : class TfMappingOrigin {
    +      25             : 
    +      26             :   using Support = estimation_manager::Support;
    +      27             : 
    +      28             : public:
    +      29             :   /*//{ constructor */
    +      30           0 :   TfMappingOrigin(ros::NodeHandle nh, std::shared_ptr<mrs_lib::ParamLoader> param_loader, const std::shared_ptr<mrs_lib::TransformBroadcaster>& broadcaster,
    +      31             :                   const std::shared_ptr<estimation_manager::CommonHandlers_t> ch)
    +      32           0 :       : nh_(nh), broadcaster_(broadcaster), ch_(ch) {
    +      33             : 
    +      34           0 :     ROS_INFO("[%s]: initializing", getPrintName().c_str());
    +      35             : 
    +      36           0 :     const std::string yaml_prefix = "mrs_uav_managers/transform_manager/mapping_origin_tf/";
    +      37             : 
    +      38             :     /*//{ load mapping origin parameters */
    +      39           0 :     param_loader->loadParam(yaml_prefix + "debug_prints", debug_prints_);
    +      40           0 :     param_loader->loadParam(yaml_prefix + "lateral_topic", lateral_topic_);
    +      41           0 :     param_loader->loadParam(yaml_prefix + "altitude_topic", altitude_topic_);
    +      42           0 :     param_loader->loadParam(yaml_prefix + "orientation_topic", orientation_topic_);
    +      43           0 :     param_loader->loadParam(yaml_prefix + "inverted", tf_inverted_);
    +      44           0 :     param_loader->loadParam(yaml_prefix + "custom_frame_id/enabled", custom_frame_id_enabled_);
    +      45             : 
    +      46           0 :     if (custom_frame_id_enabled_) {
    +      47           0 :       param_loader->loadParam(yaml_prefix + "custom_frame_id/frame_id", custom_frame_id_);
    +      48             :     }
    +      49             : 
    +      50           0 :     if (!param_loader->loadedSuccessfully()) {
    +      51           0 :       ROS_ERROR("[%s]: Could not load all non-optional parameters. Shutting down.", getPrintName().c_str());
    +      52           0 :       ros::shutdown();
    +      53             :     }
    +      54             : 
    +      55             :     /*//}*/
    +      56             : 
    +      57             :     /*//{ initialize subscribers */
    +      58           0 :     mrs_lib::SubscribeHandlerOptions shopts;
    +      59           0 :     shopts.nh                 = nh_;
    +      60           0 :     shopts.node_name          = getPrintName();
    +      61           0 :     shopts.no_message_timeout = mrs_lib::no_timeout;
    +      62           0 :     shopts.threadsafe         = true;
    +      63           0 :     shopts.autostart          = true;
    +      64           0 :     shopts.queue_size         = 10;
    +      65           0 :     shopts.transport_hints    = ros::TransportHints().tcpNoDelay();
    +      66             : 
    +      67             :     sh_mapping_odom_lat_ =
    +      68           0 :         mrs_lib::SubscribeHandler<nav_msgs::Odometry>(shopts, "/" + ch_->uav_name + "/" + lateral_topic_, &TfMappingOrigin::callbackMappingOdomLat, this);
    +      69             : 
    +      70           0 :     if (orientation_topic_ != lateral_topic_) {
    +      71           0 :       sh_mapping_odom_rot_ = mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped>(shopts, "/" + ch_->uav_name + "/" + orientation_topic_.c_str(),
    +      72           0 :                                                                                          &TfMappingOrigin::callbackMappingOdomRot, this);
    +      73             :     }
    +      74             : 
    +      75           0 :     if (altitude_topic_ != lateral_topic_) {
    +      76           0 :       sh_mapping_odom_alt_ = mrs_lib::SubscribeHandler<nav_msgs::Odometry>(shopts, "/" + ch_->uav_name + "/" + altitude_topic_.c_str(),
    +      77           0 :                                                                            &TfMappingOrigin::callbackMappingOdomAlt, this);
    +      78             :     }
    +      79             :     /*//}*/
    +      80             : 
    +      81           0 :     ph_map_delay_ = mrs_lib::PublisherHandler<mrs_msgs::Float64Stamped>(nh_, "map_delay_out", 10);
    +      82             : 
    +      83           0 :     is_initialized_ = true;
    +      84           0 :     ROS_INFO("[%s]: initialized", getPrintName().c_str());
    +      85           0 :   }
    +      86             :   /*//}*/
    +      87             : 
    +      88             :   /*//{ getName() */
    +      89             :   std::string getName() {
    +      90             :     return name_;
    +      91             :   }
    +      92             :   /*//}*/
    +      93             : 
    +      94             :   /*//{ getPrintName() */
    +      95           0 :   std::string getPrintName() {
    +      96           0 :     return ch_->nodelet_name + "/" + name_;
    +      97             :   }
    +      98             :   /*//}*/
    +      99             : 
    +     100             : private:
    +     101             :   const std::string name_ = "TfMappingOrigin";
    +     102             : 
    +     103             :   ros::NodeHandle nh_;
    +     104             : 
    +     105             :   std::shared_ptr<mrs_lib::TransformBroadcaster> broadcaster_;
    +     106             : 
    +     107             :   std::shared_ptr<estimation_manager::CommonHandlers_t> ch_;
    +     108             : 
    +     109             :   std::atomic_bool is_initialized_ = false;
    +     110             : 
    +     111             :   mrs_lib::PublisherHandler<mrs_msgs::Float64Stamped> ph_map_delay_;
    +     112             : 
    +     113             :   bool        debug_prints_;
    +     114             :   bool        tf_inverted_;
    +     115             :   bool        custom_frame_id_enabled_;
    +     116             :   std::string custom_frame_id_;
    +     117             :   double      cache_duration_;
    +     118             : 
    +     119             :   std::string                                   lateral_topic_;
    +     120             :   mrs_lib::SubscribeHandler<nav_msgs::Odometry> sh_mapping_odom_lat_;
    +     121             :   std::vector<nav_msgs::Odometry>               vec_mapping_odom_lat_;
    +     122             :   std::atomic_bool                              got_mapping_odom_lat_ = false;
    +     123             :   std::atomic<double>                           timestamp_lat_;
    +     124             : 
    +     125             :   /*//{ callbackMappingOdomLat() */
    +     126             : 
    +     127           0 :   void callbackMappingOdomLat(const nav_msgs::Odometry::ConstPtr msg) {
    +     128             : 
    +     129           0 :     if (!is_initialized_) {
    +     130           0 :       return;
    +     131             :     }
    +     132             : 
    +     133           0 :     timestamp_lat_ = msg->header.stamp.toSec();
    +     134             : 
    +     135           0 :     if (!got_mapping_odom_lat_) {
    +     136           0 :       got_mapping_odom_lat_ = true;
    +     137             :     }
    +     138             : 
    +     139           0 :     if (!got_mapping_odom_rot_ && orientation_topic_ == lateral_topic_) {
    +     140           0 :       got_mapping_odom_rot_ = true;
    +     141             :     }
    +     142             : 
    +     143           0 :     if (!got_mapping_odom_alt_ && altitude_topic_ == lateral_topic_) {
    +     144           0 :       got_mapping_odom_alt_ = true;
    +     145             :     }
    +     146             : 
    +     147           0 :     mrs_lib::ScopeTimer scope_timer = mrs_lib::ScopeTimer("TfMappingOrigin::callbackMappingOdomLat", ch_->scope_timer.logger, ch_->scope_timer.enabled);
    +     148             : 
    +     149           0 :     const double hdg_mapping_old = mrs_lib::AttitudeConverter(msg->pose.pose.orientation).getHeading();
    +     150             : 
    +     151             :     /* publish mapping origin tf //{ */
    +     152             : 
    +     153           0 :     bool clear_needed = false;
    +     154             : 
    +     155           0 :     if (got_mapping_odom_rot_ && got_mapping_odom_alt_) {
    +     156           0 :       std::scoped_lock lock(mtx_mapping_odom_rot_);
    +     157             : 
    +     158             :       // Copy mapping odometry
    +     159           0 :       nav_msgs::Odometry mapping_odom;
    +     160           0 :       mapping_odom = *msg;
    +     161             : 
    +     162             :       // Find corresponding orientation
    +     163           0 :       geometry_msgs::QuaternionStamped rot_tmp           = *sh_mapping_odom_rot_.getMsg();  // start with newest msg
    +     164           0 :       ros::Time                        dbg_timestamp_rot = rot_tmp.header.stamp;
    +     165           0 :       tf2::Quaternion                  tf2_rot;
    +     166             : 
    +     167           0 :       for (size_t i = 0; i < vec_mapping_odom_rot_.size(); i++) {
    +     168           0 :         if (mapping_odom.header.stamp < vec_mapping_odom_rot_.at(i).header.stamp) {
    +     169             : 
    +     170             :           // Choose an orientation with closest timestamp
    +     171           0 :           double time_diff      = std::fabs(vec_mapping_odom_rot_.at(i).header.stamp.toSec() - mapping_odom.header.stamp.toSec());
    +     172           0 :           double time_diff_prev = std::numeric_limits<double>::max();
    +     173           0 :           if (i > 0) {
    +     174           0 :             time_diff_prev = std::fabs(vec_mapping_odom_rot_.at(i - 1).header.stamp.toSec() - mapping_odom.header.stamp.toSec());
    +     175             :           }
    +     176           0 :           if (time_diff_prev < time_diff && i > 0) {
    +     177           0 :             i = i - 1;
    +     178             :           }
    +     179             : 
    +     180             :           // Cache is too small if it is full and its oldest element is used
    +     181           0 :           if (clear_needed && i == 0) {
    +     182           0 :             ROS_WARN_THROTTLE(1.0, "[%s] Mapping orientation cache is too small.", getPrintName().c_str());
    +     183             :           }
    +     184           0 :           rot_tmp           = vec_mapping_odom_rot_.at(i);
    +     185           0 :           dbg_timestamp_rot = vec_mapping_odom_rot_.at(i).header.stamp;
    +     186           0 :           break;
    +     187             :         }
    +     188             :       }
    +     189             : 
    +     190           0 :       tf2_rot = mrs_lib::AttitudeConverter(rot_tmp.quaternion);
    +     191             : 
    +     192             :       // Obtain heading from orientation
    +     193           0 :       double hdg = 0;
    +     194             :       try {
    +     195           0 :         hdg = mrs_lib::AttitudeConverter(rot_tmp.quaternion).getHeading();
    +     196             :       }
    +     197           0 :       catch (...) {
    +     198           0 :         ROS_WARN("[%s]: failed to getHeading() from rot_tmp", getPrintName().c_str());
    +     199             :       }
    +     200             : 
    +     201             :       // Build rotation matrix from difference between new heading and old heading
    +     202           0 :       tf2::Matrix3x3 rot_mat = mrs_lib::AttitudeConverter(Eigen::AngleAxisd(hdg_mapping_old - hdg, Eigen::Vector3d::UnitZ()));
    +     203             : 
    +     204             :       // Transform the mavros orientation by the rotation matrix
    +     205           0 :       geometry_msgs::Quaternion new_orientation = mrs_lib::AttitudeConverter(tf2::Transform(rot_mat) * tf2_rot);
    +     206             : 
    +     207             :       // Set new orientation
    +     208           0 :       mapping_odom.pose.pose.orientation = new_orientation;
    +     209             : 
    +     210             : 
    +     211             :       // Find corresponding local odom
    +     212           0 :       double    odom_alt          = msg->pose.pose.position.z;  // start with newest msg
    +     213           0 :       ros::Time dbg_timestamp_alt = msg->header.stamp;
    +     214           0 :       for (size_t i = 0; i < vec_mapping_odom_alt_.size(); i++) {
    +     215           0 :         if (mapping_odom.header.stamp < vec_mapping_odom_alt_.at(i).header.stamp) {
    +     216             : 
    +     217             :           // Choose orientation with closest timestamp
    +     218           0 :           double time_diff      = std::fabs(vec_mapping_odom_alt_.at(i).header.stamp.toSec() - mapping_odom.header.stamp.toSec());
    +     219           0 :           double time_diff_prev = std::numeric_limits<double>::max();
    +     220           0 :           if (i > 0) {
    +     221           0 :             time_diff_prev = std::fabs(vec_mapping_odom_alt_.at(i - 1).header.stamp.toSec() - mapping_odom.header.stamp.toSec());
    +     222             :           }
    +     223           0 :           if (time_diff_prev < time_diff && i > 0) {
    +     224           0 :             i = i - 1;
    +     225             :           }
    +     226             :           // Cache is too small if it is full and its oldest element is used
    +     227           0 :           if (clear_needed && i == 0) {
    +     228           0 :             ROS_WARN_THROTTLE(1.0, "[%s] mapping orientation cache (for mapping tf) is too small.", getPrintName().c_str());
    +     229             :           }
    +     230           0 :           odom_alt          = vec_mapping_odom_alt_.at(i).pose.pose.position.z;
    +     231           0 :           dbg_timestamp_alt = vec_mapping_odom_alt_.at(i).header.stamp;
    +     232           0 :           break;
    +     233             :         }
    +     234             :       }
    +     235             : 
    +     236             :       // Set altitude
    +     237           0 :       mapping_odom.pose.pose.position.z = odom_alt;
    +     238             : 
    +     239             :       // Get inverse transform
    +     240           0 :       tf2::Transform      tf_mapping_inv   = Support::tf2FromPose(mapping_odom.pose.pose).inverse();
    +     241           0 :       geometry_msgs::Pose pose_mapping_inv = Support::poseFromTf2(tf_mapping_inv);
    +     242             : 
    +     243           0 :       geometry_msgs::TransformStamped tf_mapping;
    +     244           0 :       tf_mapping.header.stamp    = mapping_odom.header.stamp;
    +     245           0 :       tf_mapping.header.frame_id = ch_->frames.ns_fcu;
    +     246           0 :       if (custom_frame_id_enabled_) {
    +     247           0 :         tf_mapping.child_frame_id = ch_->uav_name + "/" + custom_frame_id_;
    +     248             :       } else {
    +     249           0 :         tf_mapping.child_frame_id = mapping_odom.header.frame_id;
    +     250             :       }
    +     251           0 :       tf_mapping.transform.translation = Support::pointToVector3(pose_mapping_inv.position);
    +     252           0 :       tf_mapping.transform.rotation    = pose_mapping_inv.orientation;
    +     253             : 
    +     254           0 :       if (Support::noNans(tf_mapping)) {
    +     255             :         try {
    +     256           0 :           broadcaster_->sendTransform(tf_mapping);
    +     257             :         }
    +     258           0 :         catch (...) {
    +     259           0 :           ROS_ERROR("[%s]: Exception caught during publishing TF: %s - %s.", getPrintName().c_str(), tf_mapping.child_frame_id.c_str(),
    +     260             :                     tf_mapping.header.frame_id.c_str());
    +     261             :         }
    +     262             :       } else {
    +     263           0 :         ROS_WARN_THROTTLE(1.0, "[%s]: NaN detected in transform from %s to %s. Not publishing tf.", getPrintName().c_str(), tf_mapping.header.frame_id.c_str(),
    +     264             :                           tf_mapping.child_frame_id.c_str());
    +     265             :       }
    +     266             : 
    +     267             :       // debug timestamps: rot and alt timestamps should be as close as possible to lat_timestamp, the delay is the difference between current time and the time
    +     268             :       // of acquisition of scan that was used to calculate the pose estimate
    +     269           0 :       if (debug_prints_) {
    +     270           0 :         ROS_INFO("[%s] lat timestamp: %.6f, rot stamp: %.6f (diff: %.6f),  alt stamp: %.6f (diff: %.6f), delay: %.6f", getPrintName().c_str(),
    +     271             :                  mapping_odom.header.stamp.toSec(), dbg_timestamp_rot.toSec(), dbg_timestamp_rot.toSec() - mapping_odom.header.stamp.toSec(),
    +     272             :                  dbg_timestamp_alt.toSec(), dbg_timestamp_alt.toSec() - mapping_odom.header.stamp.toSec(),
    +     273             :                  ros::Time::now().toSec() - mapping_odom.header.stamp.toSec());
    +     274             :       }
    +     275             : 
    +     276           0 :       mrs_msgs::Float64Stamped map_delay_msg;
    +     277           0 :       map_delay_msg.header.stamp = ros::Time::now();
    +     278           0 :       map_delay_msg.value        = ros::Time::now().toSec() - mapping_odom.header.stamp.toSec();
    +     279           0 :       ph_map_delay_.publish(map_delay_msg);
    +     280             :     }
    +     281             : 
    +     282             :     //}
    +     283             :   }
    +     284             :   /*//}*/
    +     285             : 
    +     286             :   std::string                                                 orientation_topic_;
    +     287             :   mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped> sh_mapping_odom_rot_;
    +     288             :   std::vector<geometry_msgs::QuaternionStamped>               vec_mapping_odom_rot_;
    +     289             :   std::mutex                                                  mtx_mapping_odom_rot_;
    +     290             :   std::atomic_bool                                            got_mapping_odom_rot_ = false;
    +     291             : 
    +     292             :   /*//{ callbackMappingOdomRot() */
    +     293           0 :   void callbackMappingOdomRot(const geometry_msgs::QuaternionStamped::ConstPtr msg) {
    +     294             : 
    +     295           0 :     if (!is_initialized_) {
    +     296           0 :       return;
    +     297             :     }
    +     298             : 
    +     299           0 :     if (!got_mapping_odom_lat_) {
    +     300           0 :       return;
    +     301             :     }
    +     302             : 
    +     303           0 :     std::scoped_lock lock(mtx_mapping_odom_rot_);
    +     304             : 
    +     305             :     // Add new data
    +     306           0 :     vec_mapping_odom_rot_.push_back(*msg);
    +     307             : 
    +     308             :     // Delete old data
    +     309           0 :     size_t index_delete = 0;
    +     310           0 :     bool   clear_needed = false;
    +     311           0 :     for (size_t i = 0; i < vec_mapping_odom_rot_.size(); i++) {
    +     312           0 :       if (timestamp_lat_ - vec_mapping_odom_rot_.at(i).header.stamp.toSec() > cache_duration_) {
    +     313           0 :         index_delete = i;
    +     314           0 :         clear_needed = true;
    +     315             :       } else {
    +     316           0 :         break;
    +     317             :       }
    +     318             :     }
    +     319           0 :     if (clear_needed) {
    +     320           0 :       for (int i = (int)index_delete; i >= 0; i--) {
    +     321           0 :         vec_mapping_odom_rot_.erase(vec_mapping_odom_rot_.begin() + i);
    +     322             :       }
    +     323           0 :       clear_needed = false;
    +     324             :     }
    +     325             : 
    +     326           0 :     if (!got_mapping_odom_rot_) {
    +     327           0 :       got_mapping_odom_rot_ = true;
    +     328             :     }
    +     329             : 
    +     330           0 :     if (debug_prints_) {
    +     331           0 :       ROS_INFO_THROTTLE(1.0, "[%s]: mapping odom rot cache size: %lu", getPrintName().c_str(), vec_mapping_odom_rot_.size());
    +     332             :     }
    +     333             :   }
    +     334             :   /*//}*/
    +     335             : 
    +     336             :   std::string                                   altitude_topic_;
    +     337             :   mrs_lib::SubscribeHandler<nav_msgs::Odometry> sh_mapping_odom_alt_;
    +     338             :   std::vector<nav_msgs::Odometry>               vec_mapping_odom_alt_;
    +     339             :   std::mutex                                    mtx_mapping_odom_alt_;
    +     340             :   std::atomic_bool                              got_mapping_odom_alt_ = false;
    +     341             : 
    +     342             :   /*//{ callbackMappingOdomAlt() */
    +     343           0 :   void callbackMappingOdomAlt(const nav_msgs::Odometry::ConstPtr msg) {
    +     344             : 
    +     345           0 :     if (!is_initialized_) {
    +     346           0 :       return;
    +     347             :     }
    +     348             : 
    +     349           0 :     if (!got_mapping_odom_lat_) {
    +     350           0 :       return;
    +     351             :     }
    +     352             : 
    +     353           0 :     std::scoped_lock lock(mtx_mapping_odom_alt_);
    +     354             : 
    +     355             :     // Add new data
    +     356           0 :     vec_mapping_odom_alt_.push_back(*msg);
    +     357             : 
    +     358             :     // Delete old data
    +     359           0 :     size_t index_delete = 0;
    +     360           0 :     bool   clear_needed = false;
    +     361           0 :     for (size_t i = 0; i < vec_mapping_odom_alt_.size(); i++) {
    +     362           0 :       if (timestamp_lat_ - vec_mapping_odom_alt_.at(i).header.stamp.toSec() > cache_duration_) {
    +     363           0 :         index_delete = i;
    +     364           0 :         clear_needed = true;
    +     365             :       } else {
    +     366           0 :         break;
    +     367             :       }
    +     368             :     }
    +     369           0 :     if (clear_needed) {
    +     370           0 :       for (int i = (int)index_delete; i >= 0; i--) {
    +     371           0 :         vec_mapping_odom_alt_.erase(vec_mapping_odom_alt_.begin() + i);
    +     372             :       }
    +     373           0 :       clear_needed = false;
    +     374             :     }
    +     375             : 
    +     376           0 :     if (!got_mapping_odom_alt_) {
    +     377           0 :       got_mapping_odom_alt_ = true;
    +     378             :     }
    +     379             : 
    +     380           0 :     if (debug_prints_) {
    +     381           0 :       ROS_INFO_THROTTLE(1.0, "[%s]: mapping odom alt cache size: %lu", getPrintName().c_str(), vec_mapping_odom_alt_.size());
    +     382             :     }
    +     383             :   }
    +     384             :   /*//}*/
    +     385             : };
    +     386             : /*//}*/
    +     387             : 
    +     388             : }  // namespace mrs_uav_managers
    +     389             : 
    +     390             : #endif
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/transform_manager/tf_mapping_origin.h.gcov.overview.html b/mrs_uav_managers/include/transform_manager/tf_mapping_origin.h.gcov.overview.html new file mode 100644 index 0000000000..8218f6ae36 --- /dev/null +++ b/mrs_uav_managers/include/transform_manager/tf_mapping_origin.h.gcov.overview.html @@ -0,0 +1,118 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/transform_manager/tf_mapping_origin.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_managers/include/transform_manager/tf_mapping_origin.h.gcov.png b/mrs_uav_managers/include/transform_manager/tf_mapping_origin.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..e3d425e3e4319475911ce94a36b8a1ec26ea482f GIT binary patch literal 1536 zcmV+b2LJhqP)fFt&%}Y=;1N(Rt_>#|c)`|cl;5Az%*)9Km%cd5r zUFGeDo-=U20yZ*9J;hlZ%g6PN%&PDs(; zZQc_ql5}Li1&Wc7j2)Hi6v5(q4xMcKUGtTf7AM^CH`7`Hq6Oj%SYJ$l#Hs^eflJTm z6p`qXXZXg6UEq{=1lAoAtqYAy$_SbcWen$csNogxCj?gk&dhVSGAl{NP7wm29|q@Y zJs4C201!2gJu7X(j5MBlK)G+azz7s|2PmwkK%m&);SVZSo1!8DZ7cg4);@CJiEei| z@#X0H03yC>iXcB^isGE>I+Nt-zrYjN%B+1Rv4N zlHIWnIcxoG_QBZN1S=8k+u|La^#LJA-*Fo7%06O(&vKt-d2wQvr|baD(zTYWcZ@0& zP1W!{os`xbscoT+wK$x073aO#paFUR0W!q)WsE;mM%nOwSVkT#oz`@HFoZgGdiJF= z7Yv2+U}%3iS9nYnN!^h$cCCq?k^K=lkPbA+iVa1xc~1MdQV2#`S7!t7uGZCeW388E z#CoN>(6^^%oM_OURDjfKwBv1n6dPJ|uld@;H1_FdxxGX6cb)-=S)A0a$Y{1>js{mI zL)Gz4*s-1hyf*rvtm}qQ1dPNy&mvYQQ@^#7Xl5^5uId|p8ohg&dsTWvo$Go-Dzv0|7P7xJ!4NNnyJ3y7(SM_ z^0KpDSt+z2)$L?BzT?m5Z<6d&q;$uH%f1FiWfHNYEW+1yTb19^SF5b|`O^iyEt*yL zOSgNAo~ebsJDl*4Ct!cd^y71Oi?y($AuEu}=zl~RK57!!TQ?>6<6DMD6wPJ$KUdeh zxz?+zw!Nv{|5kO~AW2PUK)y{&|FoPEg2)(oe_G9(Z$1*qEu(GOW{kc?k!N763n#bLRnqN0) zx1>EhgkziLaw*D{3X&4MJaWlONLPEx0`s)C&V3E00k?sLLUCoJ=4s+YJYR$wu_qSU zaNhCJ(%yW;mV1N2g@;R@q?(7Thw2Z2Cmoh1B0tYGn@hh=eaE9kMmv7={(3|ccg5&V zlkK;X z!aARa46O0;V?gl)dc!TrW;}=UPO3YbiFpQqHxMJQGvMf)wA{LyfYvFOG2d3}jJvop z`5?wl2i-=$rVm$ajVH~;KD_ft5dnTUrBoF^bLBhSYoe!s9y~%vhu=$2EB?F=pslL2 z(tq&*mX1U%u*DJ{PNg)``koHp&pwy(?EoyS$ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/transform_manager/tf_source.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/transform_manager - tf_source.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:19224080.0 %
    Date:2024-04-18 23:11:36Functions:131492.9 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_managers::TfSource::publishLocalTf(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)0
    mrs_uav_managers::TfSource::setIsUtmSource(bool)10
    mrs_uav_managers::TfSource::getIsUtmSource()18
    mrs_uav_managers::TfSource::getIsUtmBased()20
    mrs_uav_managers::TfSource::setUtmOrigin(geometry_msgs::Point_<std::allocator<void> > const&)98
    mrs_uav_managers::TfSource::setWorldOrigin(geometry_msgs::Point_<std::allocator<void> > const&)98
    mrs_uav_managers::TfSource::TfSource(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::NodeHandle, std::shared_ptr<mrs_lib::ParamLoader>, std::shared_ptr<mrs_lib::TransformBroadcaster> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t>, bool)98
    mrs_uav_managers::TfSource::getName[abi:cxx11]()803
    mrs_uav_managers::TfSource::republishInFrame(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, mrs_lib::PublisherHandler<nav_msgs::Odometry_<std::allocator<void> > >&)143874
    mrs_uav_managers::TfSource::publishTfFromOdom(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const> const&)183801
    mrs_uav_managers::TfSource::callbackTfSourceOdom(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>)183867
    mrs_uav_managers::TfSource::publishTfFromAtt(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const> const&)189877
    mrs_uav_managers::TfSource::callbackTfSourceAtt(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>)189903
    mrs_uav_managers::TfSource::getPrintName[abi:cxx11]()887890
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/transform_manager/tf_source.h.func.html b/mrs_uav_managers/include/transform_manager/tf_source.h.func.html new file mode 100644 index 0000000000..7a9caa44d9 --- /dev/null +++ b/mrs_uav_managers/include/transform_manager/tf_source.h.func.html @@ -0,0 +1,136 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/transform_manager/tf_source.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/transform_manager - tf_source.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:19224080.0 %
    Date:2024-04-18 23:11:36Functions:131492.9 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_managers::TfSource::getPrintName[abi:cxx11]()887890
    mrs_uav_managers::TfSource::setUtmOrigin(geometry_msgs::Point_<std::allocator<void> > const&)98
    mrs_uav_managers::TfSource::getIsUtmBased()20
    mrs_uav_managers::TfSource::getIsUtmSource()18
    mrs_uav_managers::TfSource::publishLocalTf(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)0
    mrs_uav_managers::TfSource::setIsUtmSource(bool)10
    mrs_uav_managers::TfSource::setWorldOrigin(geometry_msgs::Point_<std::allocator<void> > const&)98
    mrs_uav_managers::TfSource::publishTfFromAtt(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const> const&)189877
    mrs_uav_managers::TfSource::republishInFrame(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, mrs_lib::PublisherHandler<nav_msgs::Odometry_<std::allocator<void> > >&)143874
    mrs_uav_managers::TfSource::publishTfFromOdom(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const> const&)183801
    mrs_uav_managers::TfSource::callbackTfSourceAtt(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>)189903
    mrs_uav_managers::TfSource::callbackTfSourceOdom(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>)183867
    mrs_uav_managers::TfSource::getName[abi:cxx11]()803
    mrs_uav_managers::TfSource::TfSource(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::NodeHandle, std::shared_ptr<mrs_lib::ParamLoader>, std::shared_ptr<mrs_lib::TransformBroadcaster> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t>, bool)98
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/transform_manager/tf_source.h.gcov.frameset.html b/mrs_uav_managers/include/transform_manager/tf_source.h.gcov.frameset.html new file mode 100644 index 0000000000..4f63eb0600 --- /dev/null +++ b/mrs_uav_managers/include/transform_manager/tf_source.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/transform_manager/tf_source.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_managers/include/transform_manager/tf_source.h.gcov.html b/mrs_uav_managers/include/transform_manager/tf_source.h.gcov.html new file mode 100644 index 0000000000..f8a5c72804 --- /dev/null +++ b/mrs_uav_managers/include/transform_manager/tf_source.h.gcov.html @@ -0,0 +1,704 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/transform_manager/tf_source.h + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/include/transform_manager - tf_source.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:19224080.0 %
    Date:2024-04-18 23:11:36Functions:131492.9 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #pragma once
    +       2             : #ifndef TF_SOURCE_H
    +       3             : #define TF_SOURCE_H
    +       4             : 
    +       5             : #include <ros/ros.h>
    +       6             : 
    +       7             : #include <mrs_lib/param_loader.h>
    +       8             : #include <mrs_lib/subscribe_handler.h>
    +       9             : #include <mrs_lib/publisher_handler.h>
    +      10             : #include <mrs_lib/attitude_converter.h>
    +      11             : #include <mrs_lib/transformer.h>
    +      12             : #include <mrs_lib/transform_broadcaster.h>
    +      13             : #include <mrs_lib/gps_conversions.h>
    +      14             : 
    +      15             : #include <tf2_ros/transform_broadcaster.h>
    +      16             : #include <tf2_ros/static_transform_broadcaster.h>
    +      17             : 
    +      18             : #include <geometry_msgs/TransformStamped.h>
    +      19             : 
    +      20             : #include <nav_msgs/Odometry.h>
    +      21             : 
    +      22             : #include <memory>
    +      23             : #include <string>
    +      24             : 
    +      25             : #include <mrs_uav_managers/estimation_manager/support.h>
    +      26             : #include <mrs_uav_managers/estimation_manager/common_handlers.h>
    +      27             : 
    +      28             : namespace mrs_uav_managers
    +      29             : {
    +      30             : 
    +      31             : /*//{ class TfSource */
    +      32             : class TfSource {
    +      33             : 
    +      34             :   using Support = estimation_manager::Support;
    +      35             : 
    +      36             : public:
    +      37             :   /*//{ constructor */
    +      38          98 :   TfSource(const std::string& name, ros::NodeHandle nh, std::shared_ptr<mrs_lib::ParamLoader> param_loader,
    +      39             :            const std::shared_ptr<mrs_lib::TransformBroadcaster>& broadcaster, const std::shared_ptr<estimation_manager::CommonHandlers_t> ch,
    +      40             :            const bool is_utm_source)
    +      41          98 :       : name_(name), nh_(nh), broadcaster_(broadcaster), ch_(ch), is_utm_source_(is_utm_source) {
    +      42             : 
    +      43          98 :     ROS_INFO("[%s]: initializing", getPrintName().c_str());
    +      44             : 
    +      45          98 :     if (name != "dummy") {
    +      46             : 
    +      47             :       /*//{ load parameters */
    +      48             : 
    +      49         196 :       const std::string yaml_prefix = "mrs_uav_managers/transform_manager/";
    +      50             : 
    +      51         196 :       std::string odom_topic, attitude_topic, ns;
    +      52             : 
    +      53          98 :       param_loader->loadParam(yaml_prefix + getName() + "/odom_topic", odom_topic);
    +      54          98 :       param_loader->loadParam(yaml_prefix + getName() + "/custom_frame_id/enabled", custom_frame_id_enabled_, false);
    +      55          98 :       if (custom_frame_id_enabled_) {
    +      56           0 :         param_loader->loadParam(yaml_prefix + getName() + "/custom_frame_id/frame_id", custom_frame_id_);
    +      57             :       }
    +      58          98 :       param_loader->loadParam(yaml_prefix + getName() + "/tf_from_attitude/enabled", tf_from_attitude_enabled_);
    +      59          98 :       if (tf_from_attitude_enabled_) {
    +      60          97 :         param_loader->loadParam(yaml_prefix + getName() + "/tf_from_attitude/attitude_topic", attitude_topic);
    +      61             :       }
    +      62          98 :       param_loader->loadParam(yaml_prefix + getName() + "/namespace", ns);
    +      63          98 :       full_topic_odom_     = "/" + ch_->uav_name + "/" + ns + "/" + odom_topic;
    +      64          98 :       full_topic_attitude_ = "/" + ch_->uav_name + "/" + ns + "/" + attitude_topic;
    +      65          98 :       param_loader->loadParam(yaml_prefix + getName() + "/inverted", is_inverted_);
    +      66          98 :       param_loader->loadParam(yaml_prefix + getName() + "/republish_in_frames", republish_in_frames_);
    +      67             : 
    +      68             :       /* coordinate frames origins //{ */
    +      69          98 :       param_loader->loadParam(yaml_prefix + getName() + "/utm_based", is_utm_based_);
    +      70             :       /* param_loader->loadParam(yaml_prefix + getName() + "/publish_local_tf", publish_local_tf_); */
    +      71             : 
    +      72             :       /*//{ utm source */
    +      73          98 :       if (is_utm_based_) {
    +      74         194 :         std::string utm_origin_parent_frame_id;
    +      75          97 :         param_loader->loadParam(yaml_prefix + "utm_origin_tf/parent", utm_origin_parent_frame_id);
    +      76          97 :         ns_utm_origin_parent_frame_id_ = ch_->uav_name + "/" + utm_origin_parent_frame_id;
    +      77             : 
    +      78          97 :         std::string utm_origin_child_frame_id;
    +      79          97 :         param_loader->loadParam(yaml_prefix + "utm_origin_tf/child", utm_origin_child_frame_id);
    +      80          97 :         ns_utm_origin_child_frame_id_ = ch_->uav_name + "/" + utm_origin_child_frame_id;
    +      81             :       }
    +      82             :       /*//}*/
    +      83             : 
    +      84             :       /*//{ world source */
    +      85          98 :       if (is_utm_based_) {
    +      86         194 :         std::string world_origin_parent_frame_id;
    +      87          97 :         param_loader->loadParam(yaml_prefix + "world_origin_tf/parent", world_origin_parent_frame_id);
    +      88          97 :         ns_world_origin_parent_frame_id_ = ch_->uav_name + "/" + world_origin_parent_frame_id;
    +      89             : 
    +      90          97 :         std::string world_origin_child_frame_id;
    +      91          97 :         param_loader->loadParam(yaml_prefix + "world_origin_tf/child", world_origin_child_frame_id);
    +      92          97 :         ns_world_origin_child_frame_id_ = ch_->uav_name + "/" + world_origin_child_frame_id;
    +      93             :       }
    +      94             :       /*//}*/
    +      95             : 
    +      96             :       //}
    +      97             : 
    +      98          98 :       if (!param_loader->loadedSuccessfully()) {
    +      99           0 :         ROS_ERROR("[%s]: Could not load all non-optional parameters. Shutting down.", getPrintName().c_str());
    +     100           0 :         ros::shutdown();
    +     101             :       }
    +     102             : 
    +     103             :       /*//}*/
    +     104             : 
    +     105             :       /*//{ initialize subscribers */
    +     106         196 :       mrs_lib::SubscribeHandlerOptions shopts;
    +     107          98 :       shopts.nh                 = nh_;
    +     108          98 :       shopts.node_name          = getPrintName();
    +     109          98 :       shopts.no_message_timeout = mrs_lib::no_timeout;
    +     110          98 :       shopts.threadsafe         = true;
    +     111          98 :       shopts.autostart          = true;
    +     112          98 :       shopts.queue_size         = 10;
    +     113          98 :       shopts.transport_hints    = ros::TransportHints().tcpNoDelay();
    +     114             : 
    +     115          98 :       sh_tf_source_odom_ = mrs_lib::SubscribeHandler<nav_msgs::Odometry>(shopts, full_topic_odom_, &TfSource::callbackTfSourceOdom, this);
    +     116          98 :       if (tf_from_attitude_enabled_) {
    +     117          97 :         sh_tf_source_att_ = mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped>(shopts, full_topic_attitude_, &TfSource::callbackTfSourceAtt, this);
    +     118             :       }
    +     119             : 
    +     120          98 :       if (is_utm_source_) {
    +     121          90 :         sh_altitude_amsl_ = mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude>(shopts, "altitude_amsl_in");
    +     122             :       }
    +     123             : 
    +     124             :     }
    +     125             :     /*//}*/
    +     126             : 
    +     127         173 :     for (auto frame_id : republish_in_frames_) {
    +     128          75 :       republishers_.push_back(
    +     129         150 :           std::make_pair(frame_id, mrs_lib::PublisherHandler<nav_msgs::Odometry>(nh_, full_topic_odom_ + "/" + frame_id.substr(0, frame_id.find("_origin")))));
    +     130             :     }
    +     131          98 :     is_initialized_ = true;
    +     132          98 :     ROS_INFO("[%s]: initialized", getPrintName().c_str());
    +     133          98 :   }
    +     134             :   /*//}*/
    +     135             : 
    +     136             :   /*//{ getName() */
    +     137         803 :   std::string getName() {
    +     138         803 :     return name_;
    +     139             :   }
    +     140             :   /*//}*/
    +     141             : 
    +     142             :   /*//{ getPrintName() */
    +     143      887890 :   std::string getPrintName() {
    +     144     1778887 :     return ch_->nodelet_name + "/" + name_;
    +     145             :   }
    +     146             :   /*//}*/
    +     147             : 
    +     148             :   /*//{ getIsUtmBased() */
    +     149          20 :   bool getIsUtmBased() {
    +     150          20 :     return is_utm_based_;
    +     151             :   }
    +     152             :   /*//}*/
    +     153             : 
    +     154             :   /*//{ getIsUtmSource() */
    +     155          18 :   bool getIsUtmSource() {
    +     156          18 :     return is_utm_source_;
    +     157             :   }
    +     158             :   /*//}*/
    +     159             : 
    +     160             :   /*//{ setIsUtmSource() */
    +     161          10 :   void setIsUtmSource(const bool is_utm_source) {
    +     162          10 :     if (is_utm_source) {
    +     163           5 :       mrs_lib::SubscribeHandlerOptions shopts;
    +     164           5 :       shopts.nh                 = nh_;
    +     165           5 :       shopts.node_name          = getPrintName();
    +     166           5 :       shopts.no_message_timeout = mrs_lib::no_timeout;
    +     167           5 :       shopts.threadsafe         = true;
    +     168           5 :       shopts.autostart          = true;
    +     169           5 :       shopts.queue_size         = 10;
    +     170           5 :       shopts.transport_hints    = ros::TransportHints().tcpNoDelay();
    +     171           5 :       sh_altitude_amsl_ = mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude>(shopts, "altitude_amsl_in");
    +     172             :     }
    +     173          10 :     is_utm_source_ = is_utm_source;
    +     174          10 :   }
    +     175             :   /*//}*/
    +     176             : 
    +     177             :   /*//{ setUtmOrigin() */
    +     178          98 :   void setUtmOrigin(const geometry_msgs::Point& pt) {
    +     179             : 
    +     180          98 :     if (is_utm_based_ && !is_utm_origin_set_) {
    +     181          97 :       utm_origin_        = pt;
    +     182          97 :       is_utm_origin_set_ = true;
    +     183             :     }
    +     184          98 :   }
    +     185             :   /*//}*/
    +     186             : 
    +     187             :   /*//{ setWorldOrigin() */
    +     188          98 :   void setWorldOrigin(const geometry_msgs::Point& pt) {
    +     189             : 
    +     190          98 :     if (is_utm_based_ && !is_world_origin_set_) {
    +     191          97 :       world_origin_        = pt;
    +     192          97 :       is_world_origin_set_ = true;
    +     193             :     }
    +     194          98 :   }
    +     195             :   /*//}*/
    +     196             : 
    +     197             : private:
    +     198             :   const std::string name_;
    +     199             :   const std::string ns_fcu_frame_id_;
    +     200             : 
    +     201             :   ros::NodeHandle nh_;
    +     202             : 
    +     203             :   std::shared_ptr<mrs_lib::TransformBroadcaster> broadcaster_;
    +     204             :   tf2_ros::StaticTransformBroadcaster            static_broadcaster_;
    +     205             : 
    +     206             :   std::shared_ptr<estimation_manager::CommonHandlers_t> ch_;
    +     207             : 
    +     208             :   bool is_inverted_;
    +     209             : 
    +     210             :   bool             is_utm_based_;
    +     211             :   bool             publish_local_tf_ = false;
    +     212             :   bool             publish_utm_tf_   = false;
    +     213             :   bool             publish_world_tf_ = false;
    +     214             :   std::atomic_bool is_utm_source_    = false;
    +     215             :   std::string      ns_utm_origin_parent_frame_id_;
    +     216             :   std::string      ns_utm_origin_child_frame_id_;
    +     217             : 
    +     218             :   bool                 is_utm_origin_set_ = false;
    +     219             :   geometry_msgs::Point utm_origin_;
    +     220             : 
    +     221             :   std::string ns_world_origin_parent_frame_id_;
    +     222             :   std::string ns_world_origin_child_frame_id_;
    +     223             : 
    +     224             :   bool                 is_world_origin_set_ = false;
    +     225             :   geometry_msgs::Point world_origin_;
    +     226             : 
    +     227             :   std::string full_topic_odom_;
    +     228             :   std::string full_topic_attitude_;
    +     229             :   bool        tf_from_attitude_enabled_ = false;
    +     230             : 
    +     231             :   bool        custom_frame_id_enabled_;
    +     232             :   std::string custom_frame_id_;
    +     233             : 
    +     234             :   std::atomic_bool is_initialized_               = false;
    +     235             :   std::atomic_bool is_local_static_tf_published_ = false;
    +     236             :   std::atomic_bool is_utm_static_tf_published_   = false;
    +     237             :   std::atomic_bool is_world_static_tf_published_ = false;
    +     238             : 
    +     239             :   std::vector<std::string> republish_in_frames_;
    +     240             : 
    +     241             :   std::vector<std::pair<std::string, mrs_lib::PublisherHandler<nav_msgs::Odometry>>> republishers_;
    +     242             : 
    +     243             :   mrs_lib::SubscribeHandler<nav_msgs::Odometry>               sh_tf_source_odom_;
    +     244             :   mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped> sh_tf_source_att_;
    +     245             :   mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude>          sh_altitude_amsl_;
    +     246             :   nav_msgs::OdometryConstPtr                                  first_msg_;
    +     247             :   bool                                                        got_first_msg_ = false;
    +     248             : 
    +     249             : 
    +     250             :   /*//{ callbackTfSourceOdom()*/
    +     251      183867 :   void callbackTfSourceOdom(const nav_msgs::Odometry::ConstPtr msg) {
    +     252             : 
    +     253      183867 :     if (!is_initialized_) {
    +     254           0 :       return;
    +     255             :     }
    +     256             : 
    +     257      551553 :     mrs_lib::ScopeTimer scope_timer = mrs_lib::ScopeTimer(getPrintName() + "::callbackTfSourceOdom", ch_->scope_timer.logger, ch_->scope_timer.enabled);
    +     258             : 
    +     259      183799 :     scope_timer.checkpoint("get msg");
    +     260             : 
    +     261      183869 :     if (!got_first_msg_) {
    +     262          98 :       first_msg_     = msg;
    +     263          98 :       got_first_msg_ = true;
    +     264             :     }
    +     265             : 
    +     266      183869 :     publishTfFromOdom(msg);
    +     267      183887 :     scope_timer.checkpoint("pub tf");
    +     268             : 
    +     269      183881 :     if (publish_local_tf_ && !is_local_static_tf_published_) {
    +     270           0 :       publishLocalTf(msg->header.frame_id);
    +     271           0 :       scope_timer.checkpoint("pub local tf");
    +     272             :     }
    +     273             : 
    +     274             :     /* if (publish_utm_tf_ && is_utm_based_ && is_utm_origin_set_ && !is_utm_static_tf_published_) { */
    +     275             :     /*   publishUtmTf(msg->header.frame_id); */
    +     276             :     /*   scope_timer.checkpoint("pub utm tf"); */
    +     277             :     /* } */
    +     278             : 
    +     279             :     /* if (publish_world_tf_ && is_utm_based_ && is_world_origin_set_ && !is_world_static_tf_published_) { */
    +     280             :     /*   publishWorldTf(msg->header.frame_id); */
    +     281             :     /*   scope_timer.checkpoint("pub world tf"); */
    +     282             :     /* } */
    +     283             : 
    +     284      327755 :     for (auto republisher : republishers_) {
    +     285      143874 :       republishInFrame(msg, ch_->uav_name + "/" + republisher.first, republisher.second);
    +     286             :     }
    +     287             :   }
    +     288             :   /*//}*/
    +     289             : 
    +     290             :   /*//{ callbackTfSourceAtt()*/
    +     291      189903 :   void callbackTfSourceAtt(const geometry_msgs::QuaternionStamped::ConstPtr msg) {
    +     292             : 
    +     293      189903 :     if (!is_initialized_) {
    +     294           0 :       return;
    +     295             :     }
    +     296             : 
    +     297      569649 :     mrs_lib::ScopeTimer scope_timer = mrs_lib::ScopeTimer(getPrintName() + "::callbackTfSourceAtt", ch_->scope_timer.logger, ch_->scope_timer.enabled);
    +     298             : 
    +     299      189859 :     scope_timer.checkpoint("get msg");
    +     300      189896 :     publishTfFromAtt(msg);
    +     301             :   }
    +     302             :   /*//}*/
    +     303             : 
    +     304             :   /* publishTfFromOdom() //{*/
    +     305      183801 :   void publishTfFromOdom(const nav_msgs::OdometryConstPtr& odom) {
    +     306             : 
    +     307      367677 :     mrs_lib::ScopeTimer scope_timer = mrs_lib::ScopeTimer(getPrintName() + "::publishTfFromOdom", ch_->scope_timer.logger, ch_->scope_timer.enabled);
    +     308             : 
    +     309      183863 :     const tf2::Transform      tf       = Support::tf2FromPose(odom->pose.pose);
    +     310      183838 :     const tf2::Transform      tf_inv   = tf.inverse();
    +     311      183862 :     const geometry_msgs::Pose pose_inv = Support::poseFromTf2(tf_inv);
    +     312             : 
    +     313             :     /*//{ tf source origin */
    +     314      183831 :     geometry_msgs::TransformStamped tf_msg;
    +     315      183765 :     tf_msg.header.stamp         = odom->header.stamp;
    +     316      183798 :     std::string origin_frame_id = custom_frame_id_enabled_ ? ch_->uav_name + "/" + custom_frame_id_ : odom->header.frame_id;
    +     317      183781 :     if (is_inverted_) {
    +     318             : 
    +     319      183781 :       tf_msg.header.frame_id       = ch_->frames.ns_fcu;
    +     320      183810 :       tf_msg.child_frame_id        = origin_frame_id;
    +     321      183761 :       tf_msg.transform.translation = Support::pointToVector3(pose_inv.position);
    +     322      183856 :       tf_msg.transform.rotation    = pose_inv.orientation;
    +     323             : 
    +     324             :     } else {
    +     325           0 :       tf_msg.header.frame_id       = origin_frame_id;
    +     326           0 :       tf_msg.child_frame_id        = ch_->frames.ns_fcu;
    +     327           0 :       tf_msg.transform.translation = Support::pointToVector3(odom->pose.pose.position);
    +     328           0 :       tf_msg.transform.rotation    = odom->pose.pose.orientation;
    +     329             :     }
    +     330             : 
    +     331      183856 :     if (Support::noNans(tf_msg)) {
    +     332             :       try {
    +     333      183815 :         broadcaster_->sendTransform(tf_msg);
    +     334             :       }
    +     335           0 :       catch (...) {
    +     336           0 :         ROS_ERROR("exception caught ");
    +     337             :       }
    +     338             : 
    +     339      183886 :       if (tf_from_attitude_enabled_) {
    +     340      182838 :         if (is_inverted_) {
    +     341      182838 :           tf_msg.child_frame_id += "_att_only";
    +     342             :         } else {
    +     343           0 :           tf_msg.header.frame_id += "_att_only";
    +     344             :         }
    +     345             :         try {
    +     346      182841 :           broadcaster_->sendTransform(tf_msg);
    +     347             :         }
    +     348           0 :         catch (...) {
    +     349           0 :           ROS_ERROR("exception caught ");
    +     350             :         }
    +     351             :       }
    +     352             :       /*//}*/
    +     353             : 
    +     354             :       /*//{ tf utm origin */
    +     355             : 
    +     356      183889 :       geometry_msgs::TransformStamped tf_utm_msg;
    +     357      183888 :       if (is_utm_source_) {
    +     358             :         
    +     359      162667 :         if (!is_utm_origin_set_) {
    +     360           0 :           ROS_INFO_THROTTLE(5.0, "[%s]: %s utm_origin initialization", getPrintName().c_str(), Support::waiting_for_string.c_str());
    +     361           0 :           return;
    +     362             :         }
    +     363             : 
    +     364      162667 :         geometry_msgs::Pose pose_utm = odom->pose.pose;
    +     365      162667 :         pose_utm.position.x += utm_origin_.x - first_msg_->pose.pose.position.x;
    +     366      162667 :         pose_utm.position.y += utm_origin_.y - first_msg_->pose.pose.position.y;
    +     367             : 
    +     368      162667 :         if (sh_altitude_amsl_.hasMsg()) {
    +     369      162667 :           pose_utm.position.z = sh_altitude_amsl_.getMsg()->amsl;
    +     370             :         } else {
    +     371           0 :           ROS_WARN_THROTTLE(5.0, "[%s]: AMSL altitude not available.", getPrintName().c_str());
    +     372             :         }
    +     373             : 
    +     374      162667 :         tf_utm_msg.header.stamp    = odom->header.stamp;
    +     375      162667 :         tf_utm_msg.header.frame_id = ns_utm_origin_parent_frame_id_;
    +     376      162667 :         tf_utm_msg.child_frame_id  = ns_utm_origin_child_frame_id_;
    +     377             : 
    +     378      162667 :         tf2::Transform tf_utm;
    +     379      162667 :         if (is_inverted_) {
    +     380      162667 :           tf_utm = Support::tf2FromPose(pose_utm).inverse();
    +     381             :         } else {
    +     382           0 :           tf_utm = Support::tf2FromPose(pose_utm);
    +     383             :         }
    +     384      162667 :         tf_utm_msg.transform = Support::msgFromTf2(tf_utm);
    +     385             : 
    +     386             :         try {
    +     387      162667 :           broadcaster_->sendTransform(tf_utm_msg);
    +     388      162667 :           ROS_INFO_ONCE("[%s]: publishing utm_origin tf", getPrintName().c_str());
    +     389             :         }
    +     390           0 :         catch (...) {
    +     391           0 :           ROS_ERROR("exception caught ");
    +     392             :         }
    +     393             :       }
    +     394             :       /*//}*/
    +     395             : 
    +     396             :       /*//{ tf world origin */
    +     397      183887 :       if (is_utm_source_) {
    +     398      325334 :         geometry_msgs::TransformStamped tf_world_msg;
    +     399      162667 :         tf_world_msg.header.stamp    = odom->header.stamp;
    +     400      162667 :         tf_world_msg.header.frame_id = ns_world_origin_parent_frame_id_;
    +     401      162667 :         tf_world_msg.child_frame_id  = ns_world_origin_child_frame_id_;
    +     402             : 
    +     403      162667 :         tf2::Transform tf_world;
    +     404      162667 :         tf_world.setOrigin(tf2::Vector3(world_origin_.x, world_origin_.y, world_origin_.z));
    +     405      162667 :         tf_world.setRotation(tf2::Quaternion(0, 0, 0, 1));
    +     406             : 
    +     407      162667 :         geometry_msgs::Pose pose_utm = odom->pose.pose;
    +     408      162667 :         pose_utm.position.x += utm_origin_.x - first_msg_->pose.pose.position.x;
    +     409      162667 :         pose_utm.position.y += utm_origin_.y - first_msg_->pose.pose.position.y;
    +     410             : 
    +     411      162667 :         tf2::Transform tf_utm;
    +     412      162667 :         if (is_inverted_) {
    +     413      162667 :           tf_utm = Support::tf2FromPose(pose_utm).inverse();
    +     414             :         } else {
    +     415           0 :           tf_utm = Support::tf2FromPose(pose_utm);
    +     416             :         }
    +     417             : 
    +     418      162667 :         tf_world_msg.transform          = Support::msgFromTf2(tf_utm * tf_world);
    +     419      162667 :         tf_world_msg.transform.rotation = pose_inv.orientation;
    +     420             : 
    +     421             :         try {
    +     422      162667 :           broadcaster_->sendTransform(tf_world_msg);
    +     423      162667 :           ROS_INFO_ONCE("[%s]: publishing world_origin tf", getPrintName().c_str());
    +     424             :         }
    +     425           0 :         catch (...) {
    +     426           0 :           ROS_ERROR("exception caught ");
    +     427             :         }
    +     428             :       }
    +     429             : 
    +     430             :       /*//}*/
    +     431             : 
    +     432             :     } else {
    +     433           0 :       ROS_WARN_THROTTLE(1.0, "[%s]: NaN detected in transform from %s to %s. Not publishing tf.", getPrintName().c_str(), tf_msg.header.frame_id.c_str(),
    +     434             :                         tf_msg.child_frame_id.c_str());
    +     435             :     }
    +     436      183889 :     ROS_INFO_ONCE("[%s]: Broadcasting transform from parent frame: %s to child frame: %s based on topic: %s", getPrintName().c_str(),
    +     437             :                   tf_msg.header.frame_id.c_str(), tf_msg.child_frame_id.c_str(), full_topic_odom_.c_str());
    +     438             :   }
    +     439             :   /*//}*/
    +     440             : 
    +     441             :   /* publishTfFromAtt() //{*/
    +     442      189877 :   void publishTfFromAtt(const geometry_msgs::QuaternionStampedConstPtr& msg) {
    +     443             : 
    +     444      569691 :     mrs_lib::ScopeTimer scope_timer = mrs_lib::ScopeTimer(getPrintName() + "::publishTfFromAtt", ch_->scope_timer.logger, ch_->scope_timer.enabled);
    +     445             : 
    +     446      379799 :     geometry_msgs::TransformStamped tf_msg;
    +     447      189867 :     tf_msg.header.stamp = msg->header.stamp;
    +     448             : 
    +     449      189859 :     geometry_msgs::Pose pose;
    +     450      189861 :     pose.position.x = 0.0;
    +     451      189861 :     pose.position.y = 0.0;
    +     452      189861 :     pose.position.z = 0.0;
    +     453      189861 :     pose.orientation = msg->quaternion;
    +     454      189868 :     if (is_inverted_) {
    +     455             : 
    +     456      189868 :       const tf2::Transform      tf       = Support::tf2FromPose(pose);
    +     457      189869 :       const tf2::Transform      tf_inv   = tf.inverse();
    +     458      189862 :       const geometry_msgs::Pose pose_inv = Support::poseFromTf2(tf_inv);
    +     459             : 
    +     460      189877 :       tf_msg.header.frame_id       = ch_->frames.ns_fcu;
    +     461      189869 :       tf_msg.child_frame_id        = msg->header.frame_id;
    +     462      189858 :       tf_msg.transform.translation = Support::pointToVector3(pose_inv.position);
    +     463      189882 :       tf_msg.transform.rotation    = pose_inv.orientation;
    +     464             : 
    +     465             :     } else {
    +     466           0 :       tf_msg.header.frame_id       = msg->header.frame_id;
    +     467           0 :       tf_msg.child_frame_id        = ch_->frames.ns_fcu;
    +     468           0 :       tf_msg.transform.translation = Support::pointToVector3(pose.position);
    +     469           0 :       tf_msg.transform.rotation    = pose.orientation;
    +     470             :     }
    +     471             : 
    +     472      189882 :     if (Support::noNans(tf_msg)) {
    +     473             :       try {
    +     474      189852 :         scope_timer.checkpoint("before pub");
    +     475      189863 :         broadcaster_->sendTransform(tf_msg);
    +     476      189911 :         scope_timer.checkpoint("after pub");
    +     477             :       }
    +     478           0 :       catch (...) {
    +     479           0 :         ROS_ERROR("exception caught ");
    +     480             :       }
    +     481             :     } else {
    +     482           1 :       ROS_WARN_THROTTLE(1.0, "[%s]: NaN detected in transform from %s to %s. Not publishing tf.", getPrintName().c_str(), tf_msg.header.frame_id.c_str(),
    +     483             :                         tf_msg.child_frame_id.c_str());
    +     484             :     }
    +     485      189909 :     ROS_INFO_ONCE("[%s]: Broadcasting transform from parent frame: %s to child frame: %s based on topic: %s", getPrintName().c_str(),
    +     486             :                   tf_msg.header.frame_id.c_str(), tf_msg.child_frame_id.c_str(), full_topic_attitude_.c_str());
    +     487      189911 :   }
    +     488             :   /*//}*/
    +     489             : 
    +     490             :   /* publishLocalTf() //{*/
    +     491           0 :   void publishLocalTf(const std::string& frame_id) {
    +     492             : 
    +     493           0 :     mrs_lib::ScopeTimer scope_timer = mrs_lib::ScopeTimer(getPrintName() + "::publishLocalTf", ch_->scope_timer.logger, ch_->scope_timer.enabled);
    +     494             : 
    +     495           0 :     geometry_msgs::TransformStamped tf_msg;
    +     496           0 :     tf_msg.header.stamp = ros::Time::now();
    +     497             : 
    +     498           0 :     tf_msg.header.frame_id       = frame_id;
    +     499           0 :     tf_msg.child_frame_id        = frame_id.substr(0, frame_id.find("_origin")) + "_local_origin";
    +     500           0 :     tf_msg.transform.translation = Support::pointToVector3(first_msg_->pose.pose.position);
    +     501           0 :     tf_msg.transform.rotation    = first_msg_->pose.pose.orientation;
    +     502             : 
    +     503           0 :     if (Support::noNans(tf_msg)) {
    +     504             :       try {
    +     505           0 :         static_broadcaster_.sendTransform(tf_msg);
    +     506             :       }
    +     507           0 :       catch (...) {
    +     508           0 :         ROS_ERROR("exception caught ");
    +     509             :       }
    +     510             :     } else {
    +     511           0 :       ROS_WARN_THROTTLE(1.0, "[%s]: NaN detected in transform from %s to %s. Not publishing tf.", getPrintName().c_str(), tf_msg.header.frame_id.c_str(),
    +     512             :                         tf_msg.child_frame_id.c_str());
    +     513             :     }
    +     514           0 :     ROS_INFO_ONCE("[%s]: Broadcasting transform from parent frame: %s to child frame: %s based on first message of: %s", getPrintName().c_str(),
    +     515             :                   tf_msg.header.frame_id.c_str(), tf_msg.child_frame_id.c_str(), full_topic_odom_.c_str());
    +     516           0 :     is_local_static_tf_published_ = true;
    +     517           0 :   }
    +     518             :   /*//}*/
    +     519             : 
    +     520             :   /* publishUtmTf() //{*/
    +     521             :   void publishUtmTf(const std::string& frame_id) {
    +     522             : 
    +     523             :     mrs_lib::ScopeTimer scope_timer = mrs_lib::ScopeTimer(getPrintName() + "::publishUtmTf", ch_->scope_timer.logger, ch_->scope_timer.enabled);
    +     524             : 
    +     525             :     geometry_msgs::TransformStamped tf_msg;
    +     526             :     tf_msg.header.stamp = ros::Time::now();
    +     527             : 
    +     528             :     tf_msg.header.frame_id         = frame_id;
    +     529             :     tf_msg.child_frame_id          = frame_id.substr(0, frame_id.find("_origin")) + "_utm_origin";
    +     530             :     tf_msg.transform.translation.x = -utm_origin_.x;  // minus because inverse tf tree
    +     531             :     tf_msg.transform.translation.y = -utm_origin_.y;  // minus because inverse tf tree
    +     532             :     tf_msg.transform.translation.z = -utm_origin_.z;  // minus because inverse tf tree
    +     533             :     tf_msg.transform.rotation.x    = 0;
    +     534             :     tf_msg.transform.rotation.y    = 0;
    +     535             :     tf_msg.transform.rotation.z    = 0;
    +     536             :     tf_msg.transform.rotation.w    = 1;
    +     537             : 
    +     538             :     if (Support::noNans(tf_msg)) {
    +     539             :       try {
    +     540             :         static_broadcaster_.sendTransform(tf_msg);
    +     541             :       }
    +     542             :       catch (...) {
    +     543             :         ROS_ERROR("exception caught ");
    +     544             :       }
    +     545             :     } else {
    +     546             :       ROS_WARN_THROTTLE(1.0, "[%s]: NaN detected in transform from %s to %s. Not publishing tf.", getPrintName().c_str(), tf_msg.header.frame_id.c_str(),
    +     547             :                         tf_msg.child_frame_id.c_str());
    +     548             :     }
    +     549             :     ROS_INFO_ONCE("[%s]: Broadcasting transform from parent frame: %s to child frame: %s based on first message of: %s", getPrintName().c_str(),
    +     550             :                   tf_msg.header.frame_id.c_str(), tf_msg.child_frame_id.c_str(), full_topic_odom_.c_str());
    +     551             :     is_utm_static_tf_published_ = true;
    +     552             :   }
    +     553             :   /*//}*/
    +     554             : 
    +     555             :   /* publishWorldTf() //{*/
    +     556             :   void publishWorldTf(const std::string& frame_id) {
    +     557             : 
    +     558             :     mrs_lib::ScopeTimer scope_timer = mrs_lib::ScopeTimer(getPrintName() + "::publishWorldTf", ch_->scope_timer.logger, ch_->scope_timer.enabled);
    +     559             : 
    +     560             :     geometry_msgs::TransformStamped tf_msg;
    +     561             :     tf_msg.header.stamp = ros::Time::now();
    +     562             : 
    +     563             :     tf_msg.header.frame_id         = frame_id;
    +     564             :     tf_msg.child_frame_id          = frame_id.substr(0, frame_id.find("_origin")) + "_world_origin";
    +     565             :     tf_msg.transform.translation.x = -(utm_origin_.x - world_origin_.x);  // minus because inverse tf tree
    +     566             :     tf_msg.transform.translation.y = -(utm_origin_.y - world_origin_.y);  // minus because inverse tf tree
    +     567             :     /* tf_msg.transform.translation.z = -(utm_origin_.z);                    // minus because inverse tf tree */
    +     568             :     tf_msg.transform.translation.z = 0;
    +     569             :     tf_msg.transform.rotation.x    = 0;
    +     570             :     tf_msg.transform.rotation.y    = 0;
    +     571             :     tf_msg.transform.rotation.z    = 0;
    +     572             :     tf_msg.transform.rotation.w    = 1;
    +     573             : 
    +     574             :     if (Support::noNans(tf_msg)) {
    +     575             :       try {
    +     576             :         static_broadcaster_.sendTransform(tf_msg);
    +     577             :       }
    +     578             :       catch (...) {
    +     579             :         ROS_ERROR("exception caught ");
    +     580             :       }
    +     581             :     } else {
    +     582             :       ROS_WARN_THROTTLE(1.0, "[%s]: NaN detected in transform from %s to %s. Not publishing tf.", getPrintName().c_str(), tf_msg.header.frame_id.c_str(),
    +     583             :                         tf_msg.child_frame_id.c_str());
    +     584             :     }
    +     585             :     ROS_INFO_ONCE("[%s]: Broadcasting transform from parent frame: %s to child frame: %s based on first message of: %s", getPrintName().c_str(),
    +     586             :                   tf_msg.header.frame_id.c_str(), tf_msg.child_frame_id.c_str(), full_topic_odom_.c_str());
    +     587             :     is_world_static_tf_published_ = true;
    +     588             :   }
    +     589             :   /*//}*/
    +     590             : 
    +     591             :   /* republishInFrame() //{*/
    +     592      143874 :   void republishInFrame(const nav_msgs::OdometryConstPtr& msg, const std::string& frame_id, mrs_lib::PublisherHandler<nav_msgs::Odometry>& ph) {
    +     593             : 
    +     594      287748 :     mrs_lib::ScopeTimer scope_timer = mrs_lib::ScopeTimer(getPrintName() + "::republishInFrame", ch_->scope_timer.logger, ch_->scope_timer.enabled);
    +     595             : 
    +     596      143874 :     nav_msgs::Odometry msg_out = *msg;
    +     597      143874 :     msg_out.header.frame_id    = frame_id;
    +     598             : 
    +     599      143874 :     geometry_msgs::PoseStamped pose;
    +     600      143874 :     pose.header = msg->header;
    +     601      143874 :     pose.pose   = msg->pose.pose;
    +     602             : 
    +     603      143874 :     auto res = ch_->transformer->transformSingle(pose, frame_id);
    +     604      143874 :     if (res) {
    +     605      135275 :       msg_out.pose.pose = res->pose;
    +     606      135275 :       ph.publish(msg_out);
    +     607             :     } else {
    +     608        8599 :       ROS_ERROR_THROTTLE(1.0, "[%s]: Could not transform pose to %s. Not republishing odom in this frame.", getPrintName().c_str(), frame_id.c_str());
    +     609        8599 :       return;
    +     610             :     }
    +     611             :   }
    +     612             : 
    +     613             :   /*//}*/
    +     614             : };
    +     615             : 
    +     616             : /*//}*/
    +     617             : 
    +     618             : }  // namespace mrs_uav_managers
    +     619             : 
    +     620             : #endif
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/include/transform_manager/tf_source.h.gcov.overview.html b/mrs_uav_managers/include/transform_manager/tf_source.h.gcov.overview.html new file mode 100644 index 0000000000..bceb06a24c --- /dev/null +++ b/mrs_uav_managers/include/transform_manager/tf_source.h.gcov.overview.html @@ -0,0 +1,175 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/include/transform_manager/tf_source.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_managers/include/transform_manager/tf_source.h.gcov.png b/mrs_uav_managers/include/transform_manager/tf_source.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..9939849d2f2f21abb3d1f75f4326921f4d8074b5 GIT binary patch literal 2234 zcmV;r2u1gaP)4->0000OP)t-s|NsB0 zs;a7|?_FK${{R500003000620&P%hU00009a7bBm000ie000ie0hKEb8vp%5NEyS&Sh39P~_nXknf!W)xwDA94OLMwhLWX6yMkNC6^-PrmQ5Ogy0O?t7l5tLg&;wf+zzZl$|rcWt$woBi>Z;mWpQ zF>MXNyafV|>}Wh_Dhqtl+tR&TMlJlsb**S8FftFB@_$1>Jw+q4rMH%WN{YcYqsBU_ zwivNDAoqrK=~|oA3nZ63qFd@Eng$qTL(Hzh)-_;s3hav;<<58gINOW1<4B*r8Q}3y zv){)wC<8SnT(!W|wa(4V;2OhZGumH1 z>Z{bVvnKR1$4}2=OEdgU)fowPU5!0}=g3own}sh?Y6?W=4u5P403446pvYtLo`pvN zXWU!H%+NByw%EFE?B$}Z`OsX}qa(orIb&b8b!Kc0k8xI@K-Soww)MUA7B=?e{(+{r zr}=rlj@J>t`_JQrfW;|JJr_2q=RJcf?pCA`#yL3Sj&UxG9<(ta2#ii0mq-O5^=%Qj zd5Wwfb6r<~o}#co!aOEn0NW9$YKY=0Z5a061rocw1r*f*K-VCT!W#4AJT`2c?;eDw z%wg9EO`Qj+1rLR?9uZXVph2ldxG$7OO9n*$WE>C5o)^2n)?gbn?t@-+?+E7LlHYo% z*E*kisoxmttE*;YIC(7;5ldZmim#BmvTEK{k(t=~Ka$!y z`YLE(Q0^(%WWnD8N#e1*K;i_+TF1<_mdETjOh}s0932;^XQQs$nx1t;z?fh&A5nd$ zDoYgc(zO88n(!+u(-u-B(_FO-8>E)x*#*;N`9}%)D=ecw2TBJyl{+BNUFg}7nVhx7 z04)@08?$qw4B~_t$@lABUyzUE`&tX6#+r--cycoGa0(o>zyd{Nv#CJQi9k=1wZIGR zn>vX!CwBa#-o~qaLW<A7(%s=SVoa!w!H`T{wOe@$O8jj11wVH8Jqm2LW1$mauh&( zDsmaxLUM0pPqT*QT+gzwl1z0674kw8SwlJK$#+Q{u*y+DW3B&wN|Z^*W&EL$r;e2`NM|4X25t#fJ=ZMX~c|$GN(p0vi7_hYFBP_-F z64tG9o*DFr9PN4JP8;>8(T|mUo)nWD5k~Y1CrnL}AdJQRRT6mAN)#-0GmvhtzxWNnd&Lf^0@g+`W({V%vGT{`TSC8>RNh=ivvD$9S$f(0ES{ddU#+K z0UQtA0iam(!TN2y)2l%OZuZelO0kv4@1Ek4HY&jXC6KBcP*3EZJZ4;dya?I*Cqpx_ zW+61=*!QGjOBgv6B;Y31alaoZ%&HLhj)ZSH z7cT&XTs#IAa`8W!l-{#-4`%3BC8hCl;qIh#4unZ*I>r6Uq%`|zQ&aYu0Qs}UUy|ll z`Xd(F&Zur|$4S=At}C7uh%)hB;e!+VM;}8NRrC7r2#>4#g_F1V`N24a%GSVl96j{P zmlPAaC?>jmAy9(EPKAo0j;Q#U^JR<3jOc>$J?ln}-?4o2%!XO$?8ThD1iP$yE zJp}GD@@HeL8`@O_>9R-v6;~O3(W=Z0f98#F}R_i z2hs-y8R2ax%qV_gXjTK&?JtHG+g}VX1@Ui);TKK;T%H8HC{maCc;_j=x)+|TqK`nW z(y@5=0fhKWSFFAEveqbW;=5e>cwG5R^a^|MInwH3Gxr9TI + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/constraint_manager.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src - constraint_manager.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:19523284.1 %
    Date:2024-04-18 23:11:36Functions:88100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_managers::constraint_manager::ConstraintManager::callbackConstraintsOverride(mrs_msgs::ConstraintsOverrideRequest_<std::allocator<void> >&, mrs_msgs::ConstraintsOverrideResponse_<std::allocator<void> >&)1
    mrs_uav_managers::constraint_manager::ConstraintManager::callbackSetConstraints(mrs_msgs::StringRequest_<std::allocator<void> >&, mrs_msgs::StringResponse_<std::allocator<void> >&)3
    (anonymous namespace)::ProxyExec0::ProxyExec0()91
    mrs_uav_managers::constraint_manager::ConstraintManager::onInit()91
    mrs_uav_managers::constraint_manager::ConstraintManager::setConstraints(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)94
    mrs_uav_managers::constraint_manager::ConstraintManager::timerDiagnostics(ros::TimerEvent const&)2057
    mrs_uav_managers::constraint_manager::ConstraintManager::stringInVector(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&)2455
    mrs_uav_managers::constraint_manager::ConstraintManager::timerConstraintManagement(ros::TimerEvent const&)20984
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/constraint_manager.cpp.func.html b/mrs_uav_managers/src/constraint_manager.cpp.func.html new file mode 100644 index 0000000000..1ccf54bf27 --- /dev/null +++ b/mrs_uav_managers/src/constraint_manager.cpp.func.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/constraint_manager.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src - constraint_manager.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:19523284.1 %
    Date:2024-04-18 23:11:36Functions:88100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    (anonymous namespace)::ProxyExec0::ProxyExec0()91
    mrs_uav_managers::constraint_manager::ConstraintManager::setConstraints(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)94
    mrs_uav_managers::constraint_manager::ConstraintManager::stringInVector(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&)2455
    mrs_uav_managers::constraint_manager::ConstraintManager::timerDiagnostics(ros::TimerEvent const&)2057
    mrs_uav_managers::constraint_manager::ConstraintManager::callbackSetConstraints(mrs_msgs::StringRequest_<std::allocator<void> >&, mrs_msgs::StringResponse_<std::allocator<void> >&)3
    mrs_uav_managers::constraint_manager::ConstraintManager::timerConstraintManagement(ros::TimerEvent const&)20984
    mrs_uav_managers::constraint_manager::ConstraintManager::callbackConstraintsOverride(mrs_msgs::ConstraintsOverrideRequest_<std::allocator<void> >&, mrs_msgs::ConstraintsOverrideResponse_<std::allocator<void> >&)1
    mrs_uav_managers::constraint_manager::ConstraintManager::onInit()91
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/constraint_manager.cpp.gcov.frameset.html b/mrs_uav_managers/src/constraint_manager.cpp.gcov.frameset.html new file mode 100644 index 0000000000..0360404b95 --- /dev/null +++ b/mrs_uav_managers/src/constraint_manager.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/constraint_manager.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_managers/src/constraint_manager.cpp.gcov.html b/mrs_uav_managers/src/constraint_manager.cpp.gcov.html new file mode 100644 index 0000000000..187dd3ef61 --- /dev/null +++ b/mrs_uav_managers/src/constraint_manager.cpp.gcov.html @@ -0,0 +1,716 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/constraint_manager.cpp + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src - constraint_manager.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:19523284.1 %
    Date:2024-04-18 23:11:36Functions:88100.0 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : /* includes //{ */
    +       2             : 
    +       3             : #include <ros/ros.h>
    +       4             : #include <nodelet/nodelet.h>
    +       5             : 
    +       6             : #include <std_msgs/String.h>
    +       7             : 
    +       8             : #include <mrs_msgs/ConstraintManagerDiagnostics.h>
    +       9             : #include <mrs_msgs/EstimationDiagnostics.h>
    +      10             : #include <mrs_msgs/DynamicsConstraintsSrv.h>
    +      11             : #include <mrs_msgs/DynamicsConstraintsSrvRequest.h>
    +      12             : #include <mrs_msgs/String.h>
    +      13             : #include <mrs_msgs/ConstraintsOverride.h>
    +      14             : 
    +      15             : #include <mrs_lib/profiler.h>
    +      16             : #include <mrs_lib/scope_timer.h>
    +      17             : #include <mrs_lib/param_loader.h>
    +      18             : #include <mrs_lib/mutex.h>
    +      19             : #include <mrs_lib/publisher_handler.h>
    +      20             : #include <mrs_lib/service_client_handler.h>
    +      21             : #include <mrs_lib/subscribe_handler.h>
    +      22             : 
    +      23             : #include <dynamic_reconfigure/ReconfigureRequest.h>
    +      24             : #include <dynamic_reconfigure/Reconfigure.h>
    +      25             : #include <dynamic_reconfigure/Config.h>
    +      26             : 
    +      27             : //}
    +      28             : 
    +      29             : namespace mrs_uav_managers
    +      30             : {
    +      31             : 
    +      32             : namespace constraint_manager
    +      33             : {
    +      34             : 
    +      35             : /* //{ class ConstraintManager */
    +      36             : 
    +      37             : class ConstraintManager : public nodelet::Nodelet {
    +      38             : 
    +      39             : public:
    +      40             :   virtual void onInit();
    +      41             : 
    +      42             : private:
    +      43             :   ros::NodeHandle nh_;
    +      44             : 
    +      45             :   std::atomic<bool> is_initialized_ = false;
    +      46             : 
    +      47             :   // | ----------------------- parameters ----------------------- |
    +      48             : 
    +      49             :   std::vector<std::string> _estimator_type_names_;
    +      50             : 
    +      51             :   std::vector<std::string>                                       _constraint_names_;
    +      52             :   std::map<std::string, mrs_msgs::DynamicsConstraintsSrvRequest> _constraints_;
    +      53             : 
    +      54             :   std::map<std::string, std::vector<std::string>> _map_type_allowed_constraints_;
    +      55             :   std::map<std::string, std::string>              _map_type_default_constraints_;
    +      56             : 
    +      57             :   // | --------------------- service clients -------------------- |
    +      58             : 
    +      59             :   mrs_lib::ServiceClientHandler<mrs_msgs::DynamicsConstraintsSrv> sc_set_constraints_;
    +      60             : 
    +      61             :   // | ----------------------- subscribers ---------------------- |
    +      62             : 
    +      63             :   mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics> sh_estimation_diag_;
    +      64             : 
    +      65             :   // | ------------- constraint management ------------- |
    +      66             : 
    +      67             :   bool setConstraints(std::string constraints_names);
    +      68             : 
    +      69             :   ros::ServiceServer service_server_set_constraints_;
    +      70             :   bool               callbackSetConstraints(mrs_msgs::String::Request& req, mrs_msgs::String::Response& res);
    +      71             : 
    +      72             :   std::string last_estimator_name_;
    +      73             :   std::mutex  mutex_last_estimator_name_;
    +      74             : 
    +      75             :   void       timerConstraintManagement(const ros::TimerEvent& event);
    +      76             :   ros::Timer timer_constraint_management_;
    +      77             :   double     _constraint_management_rate_;
    +      78             : 
    +      79             :   std::string current_constraints_;
    +      80             :   std::mutex  mutex_current_constraints_;
    +      81             : 
    +      82             :   // | ------------------ constraints override ------------------ |
    +      83             : 
    +      84             :   ros::ServiceServer service_server_constraints_override_;
    +      85             :   bool               callbackConstraintsOverride(mrs_msgs::ConstraintsOverride::Request& req, mrs_msgs::ConstraintsOverride::Response& res);
    +      86             : 
    +      87             :   std::atomic<bool>                    override_constraints_         = false;
    +      88             :   std::atomic<bool>                    constraints_override_updated_ = false;
    +      89             :   std::mutex                           mutex_constraints_override_;
    +      90             :   mrs_msgs::ConstraintsOverrideRequest constraints_override_;
    +      91             : 
    +      92             :   // | ------------------ diagnostics publisher ----------------- |
    +      93             : 
    +      94             :   mrs_lib::PublisherHandler<mrs_msgs::ConstraintManagerDiagnostics> ph_diagnostics_;
    +      95             : 
    +      96             :   void       timerDiagnostics(const ros::TimerEvent& event);
    +      97             :   ros::Timer timer_diagnostics_;
    +      98             :   double     _diagnostics_rate_;
    +      99             : 
    +     100             :   // | ------------------------ profiler ------------------------ |
    +     101             : 
    +     102             :   mrs_lib::Profiler profiler_;
    +     103             :   bool              _profiler_enabled_ = false;
    +     104             : 
    +     105             :   // | ------------------- scope timer logger ------------------- |
    +     106             : 
    +     107             :   bool                                       scope_timer_enabled_ = false;
    +     108             :   std::shared_ptr<mrs_lib::ScopeTimerLogger> scope_timer_logger_;
    +     109             : 
    +     110             :   // | ------------------------- helpers ------------------------ |
    +     111             : 
    +     112             :   bool stringInVector(const std::string& value, const std::vector<std::string>& vector);
    +     113             : };
    +     114             : 
    +     115             : //}
    +     116             : 
    +     117             : /* //{ onInit() */
    +     118             : 
    +     119          91 : void ConstraintManager::onInit() {
    +     120             : 
    +     121          91 :   nh_ = nodelet::Nodelet::getMTPrivateNodeHandle();
    +     122             : 
    +     123          91 :   ros::Time::waitForValid();
    +     124             : 
    +     125          91 :   ROS_INFO("[ConstraintManager]: initializing");
    +     126             : 
    +     127             :   // | ------------------------- params ------------------------- |
    +     128             : 
    +     129         182 :   mrs_lib::ParamLoader param_loader(nh_, "ConstraintManager");
    +     130             : 
    +     131         182 :   std::string custom_config_path;
    +     132         182 :   std::string platform_config_path;
    +     133             : 
    +     134          91 :   param_loader.loadParam("custom_config", custom_config_path);
    +     135          91 :   param_loader.loadParam("platform_config", platform_config_path);
    +     136             : 
    +     137          91 :   if (custom_config_path != "") {
    +     138          91 :     param_loader.addYamlFile(custom_config_path);
    +     139             :   }
    +     140             : 
    +     141          91 :   if (platform_config_path != "") {
    +     142          91 :     param_loader.addYamlFile(platform_config_path);
    +     143             :   }
    +     144             : 
    +     145          91 :   param_loader.addYamlFileFromParam("private_config");
    +     146          91 :   param_loader.addYamlFileFromParam("public_config");
    +     147          91 :   param_loader.addYamlFileFromParam("public_constraints");
    +     148             : 
    +     149         182 :   const std::string yaml_prefix = "mrs_uav_managers/constraint_manager/";
    +     150             : 
    +     151             :   // params passed from the launch file are not prefixed
    +     152          91 :   param_loader.loadParam("enable_profiler", _profiler_enabled_);
    +     153             : 
    +     154          91 :   param_loader.loadParam(yaml_prefix + "constraints", _constraint_names_);
    +     155             : 
    +     156          91 :   param_loader.loadParam(yaml_prefix + "estimator_types", _estimator_type_names_);
    +     157             : 
    +     158          91 :   param_loader.loadParam(yaml_prefix + "rate", _constraint_management_rate_);
    +     159          91 :   param_loader.loadParam(yaml_prefix + "diagnostics_rate", _diagnostics_rate_);
    +     160             : 
    +     161          91 :   std::vector<std::string>::iterator it;
    +     162             : 
    +     163             :   // loading constraint names
    +     164         364 :   for (it = _constraint_names_.begin(); it != _constraint_names_.end(); ++it) {
    +     165             : 
    +     166         273 :     ROS_INFO_STREAM("[ConstraintManager]: loading constraints '" << *it << "'");
    +     167             : 
    +     168         273 :     mrs_msgs::DynamicsConstraintsSrvRequest new_constraints;
    +     169             : 
    +     170         273 :     param_loader.loadParam(yaml_prefix + *it + "/horizontal/speed", new_constraints.constraints.horizontal_speed);
    +     171         273 :     param_loader.loadParam(yaml_prefix + *it + "/horizontal/acceleration", new_constraints.constraints.horizontal_acceleration);
    +     172         273 :     param_loader.loadParam(yaml_prefix + *it + "/horizontal/jerk", new_constraints.constraints.horizontal_jerk);
    +     173         273 :     param_loader.loadParam(yaml_prefix + *it + "/horizontal/snap", new_constraints.constraints.horizontal_snap);
    +     174             : 
    +     175         273 :     param_loader.loadParam(yaml_prefix + *it + "/vertical/ascending/speed", new_constraints.constraints.vertical_ascending_speed);
    +     176         273 :     param_loader.loadParam(yaml_prefix + *it + "/vertical/ascending/acceleration", new_constraints.constraints.vertical_ascending_acceleration);
    +     177         273 :     param_loader.loadParam(yaml_prefix + *it + "/vertical/ascending/jerk", new_constraints.constraints.vertical_ascending_jerk);
    +     178         273 :     param_loader.loadParam(yaml_prefix + *it + "/vertical/ascending/snap", new_constraints.constraints.vertical_ascending_snap);
    +     179             : 
    +     180         273 :     param_loader.loadParam(yaml_prefix + *it + "/vertical/descending/speed", new_constraints.constraints.vertical_descending_speed);
    +     181         273 :     param_loader.loadParam(yaml_prefix + *it + "/vertical/descending/acceleration", new_constraints.constraints.vertical_descending_acceleration);
    +     182         273 :     param_loader.loadParam(yaml_prefix + *it + "/vertical/descending/jerk", new_constraints.constraints.vertical_descending_jerk);
    +     183         273 :     param_loader.loadParam(yaml_prefix + *it + "/vertical/descending/snap", new_constraints.constraints.vertical_descending_snap);
    +     184             : 
    +     185         273 :     param_loader.loadParam(yaml_prefix + *it + "/heading/speed", new_constraints.constraints.heading_speed);
    +     186         273 :     param_loader.loadParam(yaml_prefix + *it + "/heading/acceleration", new_constraints.constraints.heading_acceleration);
    +     187         273 :     param_loader.loadParam(yaml_prefix + *it + "/heading/jerk", new_constraints.constraints.heading_jerk);
    +     188         273 :     param_loader.loadParam(yaml_prefix + *it + "/heading/snap", new_constraints.constraints.heading_snap);
    +     189             : 
    +     190         273 :     param_loader.loadParam(yaml_prefix + *it + "/angular_speed/roll", new_constraints.constraints.roll_rate);
    +     191         273 :     param_loader.loadParam(yaml_prefix + *it + "/angular_speed/pitch", new_constraints.constraints.pitch_rate);
    +     192         273 :     param_loader.loadParam(yaml_prefix + *it + "/angular_speed/yaw", new_constraints.constraints.yaw_rate);
    +     193             : 
    +     194             :     double tilt_deg;
    +     195             : 
    +     196         273 :     param_loader.loadParam(yaml_prefix + *it + "/tilt", tilt_deg);
    +     197             : 
    +     198         273 :     new_constraints.constraints.tilt = M_PI * (tilt_deg / 180.0);
    +     199             : 
    +     200         273 :     _constraints_.insert(std::pair<std::string, mrs_msgs::DynamicsConstraintsSrvRequest>(*it, new_constraints));
    +     201             :   }
    +     202             : 
    +     203             :   // loading the allowed constraints lists
    +     204         728 :   for (it = _estimator_type_names_.begin(); it != _estimator_type_names_.end(); ++it) {
    +     205             : 
    +     206         637 :     std::vector<std::string> temp_vector;
    +     207         637 :     param_loader.loadParam(yaml_prefix + "allowed_constraints/" + *it, temp_vector);
    +     208             : 
    +     209         637 :     std::vector<std::string>::iterator it2;
    +     210        2354 :     for (it2 = temp_vector.begin(); it2 != temp_vector.end(); ++it2) {
    +     211        1717 :       if (!stringInVector(*it2, _constraint_names_)) {
    +     212           0 :         ROS_ERROR("[ConstraintManager]: the element '%s' of %s/allowed_constraints is not a valid constraint!", it2->c_str(), it->c_str());
    +     213           0 :         ros::shutdown();
    +     214             :       }
    +     215             :     }
    +     216             : 
    +     217         637 :     _map_type_allowed_constraints_.insert(std::pair<std::string, std::vector<std::string>>(*it, temp_vector));
    +     218             :   }
    +     219             : 
    +     220             :   // loading the default constraints
    +     221         728 :   for (it = _estimator_type_names_.begin(); it != _estimator_type_names_.end(); ++it) {
    +     222             : 
    +     223         637 :     std::string temp_str;
    +     224         637 :     param_loader.loadParam(yaml_prefix + "default_constraints/" + *it, temp_str);
    +     225             : 
    +     226         637 :     if (!stringInVector(temp_str, _map_type_allowed_constraints_.at(*it))) {
    +     227           0 :       ROS_ERROR("[ConstraintManager]: the element '%s' of %s/allowed_constraints is not a valid constraint!", temp_str.c_str(), it->c_str());
    +     228           0 :       ros::shutdown();
    +     229             :     }
    +     230             : 
    +     231         637 :     _map_type_default_constraints_.insert(std::pair<std::string, std::string>(*it, temp_str));
    +     232             :   }
    +     233             : 
    +     234          91 :   ROS_INFO("[ConstraintManager]: done loading dynamic params");
    +     235             : 
    +     236          91 :   current_constraints_ = "";
    +     237          91 :   last_estimator_name_ = "";
    +     238             : 
    +     239             :   // | ------------------------ services ------------------------ |
    +     240             : 
    +     241          91 :   service_server_set_constraints_ = nh_.advertiseService("set_constraints_in", &ConstraintManager::callbackSetConstraints, this);
    +     242             : 
    +     243          91 :   service_server_constraints_override_ = nh_.advertiseService("constraints_override_in", &ConstraintManager::callbackConstraintsOverride, this);
    +     244             : 
    +     245          91 :   sc_set_constraints_ = mrs_lib::ServiceClientHandler<mrs_msgs::DynamicsConstraintsSrv>(nh_, "set_constraints_out");
    +     246             : 
    +     247             :   // | ----------------------- subscribers ---------------------- |
    +     248             : 
    +     249         182 :   mrs_lib::SubscribeHandlerOptions shopts;
    +     250          91 :   shopts.nh                 = nh_;
    +     251          91 :   shopts.node_name          = "ConstraintManager";
    +     252          91 :   shopts.no_message_timeout = mrs_lib::no_timeout;
    +     253          91 :   shopts.threadsafe         = true;
    +     254          91 :   shopts.autostart          = true;
    +     255          91 :   shopts.queue_size         = 10;
    +     256          91 :   shopts.transport_hints    = ros::TransportHints().tcpNoDelay();
    +     257             : 
    +     258          91 :   sh_estimation_diag_ = mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics>(shopts, "estimation_diagnostics_in");
    +     259             : 
    +     260             :   // | ----------------------- publishers ----------------------- |
    +     261             : 
    +     262          91 :   ph_diagnostics_ = mrs_lib::PublisherHandler<mrs_msgs::ConstraintManagerDiagnostics>(nh_, "diagnostics_out", 10);
    +     263             : 
    +     264             :   // | ------------------------- timers ------------------------- |
    +     265             : 
    +     266          91 :   timer_constraint_management_ = nh_.createTimer(ros::Rate(_constraint_management_rate_), &ConstraintManager::timerConstraintManagement, this);
    +     267          91 :   timer_diagnostics_           = nh_.createTimer(ros::Rate(_diagnostics_rate_), &ConstraintManager::timerDiagnostics, this);
    +     268             : 
    +     269             :   // | ------------------------ profiler ------------------------ |
    +     270             : 
    +     271          91 :   profiler_ = mrs_lib::Profiler(nh_, "ConstraintManager", _profiler_enabled_);
    +     272             : 
    +     273             :   // | ------------------- scope timer logger ------------------- |
    +     274             : 
    +     275          91 :   param_loader.loadParam(yaml_prefix + "scope_timer/enabled", scope_timer_enabled_);
    +     276         273 :   const std::string scope_timer_log_filename = param_loader.loadParam2("scope_timer/log_filename", std::string(""));
    +     277          91 :   scope_timer_logger_                        = std::make_shared<mrs_lib::ScopeTimerLogger>(scope_timer_log_filename, scope_timer_enabled_);
    +     278             : 
    +     279             :   // | ----------------------- finish init ---------------------- |
    +     280             : 
    +     281          91 :   if (!param_loader.loadedSuccessfully()) {
    +     282           0 :     ROS_ERROR("[ConstraintManager]: Could not load all parameters!");
    +     283           0 :     ros::shutdown();
    +     284             :   }
    +     285             : 
    +     286          91 :   is_initialized_ = true;
    +     287             : 
    +     288          91 :   ROS_INFO("[ConstraintManager]: initialized");
    +     289             : 
    +     290          91 :   ROS_DEBUG("[ConstraintManager]: debug output is enabled");
    +     291          91 : }
    +     292             : 
    +     293             : //}
    +     294             : 
    +     295             : // --------------------------------------------------------------
    +     296             : // |                           methods                          |
    +     297             : // --------------------------------------------------------------
    +     298             : 
    +     299             : /* setConstraints() //{ */
    +     300             : 
    +     301          94 : bool ConstraintManager::setConstraints(std::string constraints_name) {
    +     302             : 
    +     303          94 :   std::map<std::string, mrs_msgs::DynamicsConstraintsSrvRequest>::iterator it;
    +     304          94 :   it = _constraints_.find(constraints_name);
    +     305             : 
    +     306          94 :   if (it == _constraints_.end()) {
    +     307           0 :     ROS_ERROR("[ConstraintManager]: could not setConstraints(), the constraint name '%s' is not on the list", constraints_name.c_str());
    +     308           0 :     return false;
    +     309             :   }
    +     310             : 
    +     311         188 :   mrs_msgs::DynamicsConstraintsSrv srv_call;
    +     312             : 
    +     313          94 :   srv_call.request = it->second;
    +     314             : 
    +     315          94 :   if (override_constraints_) {
    +     316             : 
    +     317           1 :     auto constraints_override = mrs_lib::get_mutexed(mutex_constraints_override_, constraints_override_);
    +     318             : 
    +     319           1 :     if (constraints_override.acceleration_horizontal > 0 &&
    +     320           1 :         constraints_override.acceleration_horizontal <= srv_call.request.constraints.horizontal_acceleration) {
    +     321           1 :       srv_call.request.constraints.horizontal_acceleration = constraints_override.acceleration_horizontal;
    +     322             :     } else {
    +     323           0 :       ROS_ERROR_THROTTLE(1.0, "[ConstraintManager]: required horizontal acceleration override is out of bounds");
    +     324             :     }
    +     325             : 
    +     326           1 :     if (constraints_override.acceleration_vertical > 0 &&
    +     327           1 :         constraints_override.acceleration_vertical <= srv_call.request.constraints.vertical_ascending_acceleration &&
    +     328           1 :         constraints_override.acceleration_vertical <= srv_call.request.constraints.vertical_descending_acceleration) {
    +     329           1 :       srv_call.request.constraints.vertical_ascending_acceleration  = constraints_override.acceleration_vertical;
    +     330           1 :       srv_call.request.constraints.vertical_descending_acceleration = constraints_override.acceleration_vertical;
    +     331             :     } else {
    +     332           0 :       ROS_ERROR_THROTTLE(1.0, "[ConstraintManager]: required vertical acceleration override is out of bounds");
    +     333             :     }
    +     334             :   }
    +     335             : 
    +     336          94 :   bool res = sc_set_constraints_.call(srv_call);
    +     337             : 
    +     338          94 :   if (!res) {
    +     339             : 
    +     340           0 :     ROS_WARN_THROTTLE(1.0, "[ConstraintManager]: the service for setting constraints has failed!");
    +     341           0 :     return false;
    +     342             : 
    +     343             :   } else {
    +     344             : 
    +     345          94 :     if (srv_call.response.success) {
    +     346             : 
    +     347          94 :       mrs_lib::set_mutexed(mutex_current_constraints_, constraints_name, current_constraints_);
    +     348          94 :       return true;
    +     349             : 
    +     350             :     } else {
    +     351             : 
    +     352           0 :       ROS_WARN_THROTTLE(1.0, "[ConstraintManager]: set service for setting constraints returned: '%s'", srv_call.response.message.c_str());
    +     353           0 :       return false;
    +     354             :     }
    +     355             :   }
    +     356             : }
    +     357             : 
    +     358             : //}
    +     359             : 
    +     360             : // --------------------------------------------------------------
    +     361             : // |                          callbacks                         |
    +     362             : // --------------------------------------------------------------
    +     363             : 
    +     364             : // | -------------------- service callbacks ------------------- |
    +     365             : 
    +     366             : /* //{ callbackSetConstraints() */
    +     367             : 
    +     368           3 : bool ConstraintManager::callbackSetConstraints(mrs_msgs::String::Request& req, mrs_msgs::String::Response& res) {
    +     369             : 
    +     370           3 :   if (!is_initialized_) {
    +     371           0 :     return false;
    +     372             :   }
    +     373             : 
    +     374           6 :   std::stringstream ss;
    +     375             : 
    +     376           3 :   if (!sh_estimation_diag_.hasMsg()) {
    +     377             : 
    +     378           0 :     ss << "missing odometry diagnostics";
    +     379             : 
    +     380           0 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[ConstraintManager]: " << ss.str());
    +     381             : 
    +     382           0 :     res.message = ss.str();
    +     383           0 :     res.success = false;
    +     384           0 :     return true;
    +     385             :   }
    +     386             : 
    +     387           6 :   auto estimation_diagnostics = sh_estimation_diag_.getMsg();
    +     388             : 
    +     389           3 :   if (!stringInVector(req.value, _constraint_names_)) {
    +     390             : 
    +     391           1 :     ss << "the constraints '" << req.value.c_str() << "' do not exist (in the ConstraintManager's config)";
    +     392             : 
    +     393           1 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[ConstraintManager]: " << ss.str());
    +     394             : 
    +     395           1 :     res.message = ss.str();
    +     396           1 :     res.success = false;
    +     397           1 :     return true;
    +     398             :   }
    +     399             : 
    +     400           2 :   if (!stringInVector(req.value, _map_type_allowed_constraints_.at(estimation_diagnostics->current_state_estimator))) {
    +     401             : 
    +     402           0 :     ss << "the constraints '" << req.value.c_str() << "' are not allowed given the current odometry type";
    +     403             : 
    +     404           0 :     ROS_WARN_STREAM_THROTTLE(1.0, "[ConstraintManager]: " << ss.str());
    +     405             : 
    +     406           0 :     res.message = ss.str();
    +     407           0 :     res.success = false;
    +     408           0 :     return true;
    +     409             :   }
    +     410             : 
    +     411           2 :   override_constraints_ = false;
    +     412             : 
    +     413             :   // try to set the constraints
    +     414           2 :   if (!setConstraints(req.value)) {
    +     415             : 
    +     416           0 :     ss << "the ControlManager could not set the constraints";
    +     417             : 
    +     418           0 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[ConstraintManager]: " << ss.str());
    +     419             : 
    +     420           0 :     res.message = ss.str();
    +     421           0 :     res.success = false;
    +     422           0 :     return true;
    +     423             : 
    +     424             :   } else {
    +     425             : 
    +     426           2 :     ss << "the constraints '" << req.value.c_str() << "' were set";
    +     427             : 
    +     428           2 :     ROS_INFO_STREAM_THROTTLE(1.0, "[ConstraintManager]: " << ss.str());
    +     429             : 
    +     430           2 :     res.message = ss.str();
    +     431           2 :     res.success = true;
    +     432           2 :     return true;
    +     433             :   }
    +     434             : }
    +     435             : 
    +     436             : //}
    +     437             : 
    +     438             : /* callackConstraintsOverride() //{ */
    +     439             : 
    +     440           1 : bool ConstraintManager::callbackConstraintsOverride(mrs_msgs::ConstraintsOverride::Request& req, mrs_msgs::ConstraintsOverride::Response& res) {
    +     441             : 
    +     442           1 :   if (!is_initialized_) {
    +     443           0 :     return false;
    +     444             :   }
    +     445             : 
    +     446             :   {
    +     447           1 :     std::scoped_lock lock(mutex_constraints_override_);
    +     448             : 
    +     449           1 :     constraints_override_ = req;
    +     450             :   }
    +     451             : 
    +     452           1 :   override_constraints_         = true;
    +     453           1 :   constraints_override_updated_ = true;
    +     454             : 
    +     455           1 :   ROS_INFO_THROTTLE(0.1, "[ConstraintManager]: setting constraints override");
    +     456             : 
    +     457           1 :   res.message = "override set";
    +     458           1 :   res.success = true;
    +     459             : 
    +     460           1 :   return true;
    +     461             : }
    +     462             : 
    +     463             : //}
    +     464             : 
    +     465             : // --------------------------------------------------------------
    +     466             : // |                           timers                           |
    +     467             : // --------------------------------------------------------------
    +     468             : 
    +     469             : /* timerConstraintManagement() //{ */
    +     470             : 
    +     471       20984 : void ConstraintManager::timerConstraintManagement(const ros::TimerEvent& event) {
    +     472             : 
    +     473       20984 :   if (!is_initialized_) {
    +     474        4721 :     return;
    +     475             :   }
    +     476             : 
    +     477       41968 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("timerConstraintManagement", _constraint_management_rate_, 0.01, event);
    +     478       41968 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("ContraintManager::timerConstraintManagement", scope_timer_logger_, scope_timer_enabled_);
    +     479             : 
    +     480       20984 :   auto current_constraints = mrs_lib::get_mutexed(mutex_current_constraints_, current_constraints_);
    +     481       20984 :   auto last_estimator_name = mrs_lib::get_mutexed(mutex_last_estimator_name_, last_estimator_name_);
    +     482             : 
    +     483       20984 :   if (!sh_estimation_diag_.hasMsg()) {
    +     484        4721 :     return;
    +     485             :   }
    +     486             : 
    +     487       16263 :   auto estimation_diagnostics = sh_estimation_diag_.getMsg();
    +     488             : 
    +     489             :   // | --- automatically set constraints when the state estimator changes -- |
    +     490       16263 :   if (estimation_diagnostics->current_state_estimator != last_estimator_name_) {
    +     491             : 
    +     492          96 :     ROS_INFO_THROTTLE(1.0, "[ConstraintManager]: the state estimator has changed! %s -> %s", last_estimator_name_.c_str(),
    +     493             :                       estimation_diagnostics->current_state_estimator.c_str());
    +     494             : 
    +     495          96 :     std::map<std::string, std::string>::iterator it;
    +     496          96 :     it = _map_type_default_constraints_.find(estimation_diagnostics->current_state_estimator);
    +     497             : 
    +     498          96 :     if (it == _map_type_default_constraints_.end()) {
    +     499             : 
    +     500           0 :       ROS_WARN_THROTTLE(1.0, "[ConstraintManager]: the state estimator type '%s' was not specified in the constraint_manager's config!",
    +     501             :                         estimation_diagnostics->current_state_estimator.c_str());
    +     502             : 
    +     503             :     } else {
    +     504             : 
    +     505             :       // if the current constraints are within the allowed state estimator types, do nothing
    +     506          96 :       if (stringInVector(current_constraints, _map_type_allowed_constraints_.at(estimation_diagnostics->current_state_estimator))) {
    +     507             : 
    +     508           5 :         last_estimator_name = estimation_diagnostics->current_state_estimator;
    +     509             : 
    +     510             :         // else, try to set the initial constraints
    +     511             :       } else {
    +     512             : 
    +     513          91 :         ROS_WARN_THROTTLE(1.0, "[ConstraintManager]: the current constraints '%s' are not within the allowed constraints for '%s'", current_constraints.c_str(),
    +     514             :                           estimation_diagnostics->current_state_estimator.c_str());
    +     515             : 
    +     516          91 :         if (setConstraints(it->second)) {
    +     517             : 
    +     518          91 :           last_estimator_name = estimation_diagnostics->current_state_estimator;
    +     519             : 
    +     520          91 :           ROS_INFO_THROTTLE(1.0, "[ConstraintManager]: constraints set to initial: '%s'", it->second.c_str());
    +     521             : 
    +     522             :         } else {
    +     523             : 
    +     524           0 :           ROS_WARN_THROTTLE(1.0, "[ConstraintManager]: could not set constraints!");
    +     525             :         }
    +     526             :       }
    +     527             :     }
    +     528             :   }
    +     529             : 
    +     530       16263 :   if (constraints_override_updated_) {
    +     531             : 
    +     532           1 :     std::map<std::string, std::string>::iterator it;
    +     533           1 :     it = _map_type_default_constraints_.find(last_estimator_name_);
    +     534             : 
    +     535           1 :     ROS_INFO_THROTTLE(0.1, "[ConstraintManager]: re-setting constraints with user value override");
    +     536             : 
    +     537           1 :     if (setConstraints(it->second)) {
    +     538           1 :       constraints_override_updated_ = false;
    +     539             :     } else {
    +     540           0 :       ROS_WARN_THROTTLE(1.0, "[ConstraintManager]: could not re-set the constraints!");
    +     541             :     }
    +     542             :   }
    +     543             : 
    +     544       16263 :   mrs_lib::set_mutexed(mutex_last_estimator_name_, last_estimator_name, last_estimator_name_);
    +     545             : }
    +     546             : 
    +     547             : //}
    +     548             : 
    +     549             : /* timerDiagnostics() //{ */
    +     550             : 
    +     551        2057 : void ConstraintManager::timerDiagnostics(const ros::TimerEvent& event) {
    +     552             : 
    +     553        2057 :   if (!is_initialized_) {
    +     554         458 :     return;
    +     555             :   }
    +     556             : 
    +     557        4114 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("timerDiagnostics", _diagnostics_rate_, 0.01, event);
    +     558        4114 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("ContraintManager::timerDiagnostics", scope_timer_logger_, scope_timer_enabled_);
    +     559             : 
    +     560        2057 :   if (!sh_estimation_diag_.hasMsg()) {
    +     561         456 :     ROS_WARN_THROTTLE(10.0, "[ConstraintManager]: can not do constraint management, missing estimation diagnostics!");
    +     562         456 :     return;
    +     563             :   }
    +     564             : 
    +     565        1601 :   auto estimation_diagnostics = sh_estimation_diag_.getMsg();
    +     566             : 
    +     567        1601 :   auto current_constraints = mrs_lib::get_mutexed(mutex_current_constraints_, current_constraints_);
    +     568             : 
    +     569        1601 :   if (current_constraints == "") {  // this could happend just before timerConstraintManagement() finishes
    +     570           2 :     return;
    +     571             :   }
    +     572             : 
    +     573        1599 :   mrs_msgs::ConstraintManagerDiagnostics diagnostics;
    +     574             : 
    +     575        1599 :   diagnostics.stamp        = ros::Time::now();
    +     576        1599 :   diagnostics.current_name = current_constraints;
    +     577        1599 :   diagnostics.loaded       = _constraint_names_;
    +     578             : 
    +     579             :   // get the available constraints
    +     580             :   {
    +     581        1599 :     std::map<std::string, std::vector<std::string>>::iterator it;
    +     582        1599 :     it = _map_type_allowed_constraints_.find(estimation_diagnostics->current_state_estimator);
    +     583             : 
    +     584        1599 :     if (it == _map_type_allowed_constraints_.end()) {
    +     585           0 :       ROS_WARN_THROTTLE(1.0, "[ConstraintManager]: the state estimator '%s' was not specified in the constraint_manager's config!",
    +     586             :                         estimation_diagnostics->current_state_estimator.c_str());
    +     587             :     } else {
    +     588        1599 :       diagnostics.available = it->second;
    +     589             :     }
    +     590             :   }
    +     591             : 
    +     592             :   // get the current constraint values
    +     593             :   {
    +     594        1599 :     std::map<std::string, mrs_msgs::DynamicsConstraintsSrvRequest>::iterator it;
    +     595        1599 :     it = _constraints_.find(current_constraints);
    +     596             : 
    +     597        1599 :     if (it == _constraints_.end()) {
    +     598           0 :       ROS_ERROR("[ConstraintManager]: current constraints '%s' not found in the constraint list!", current_constraints.c_str());
    +     599           0 :       return;
    +     600             :     }
    +     601             : 
    +     602        1599 :     diagnostics.current_values = it->second.constraints;
    +     603             :   }
    +     604             : 
    +     605        1599 :   ph_diagnostics_.publish(diagnostics);
    +     606             : }
    +     607             : 
    +     608             : //}
    +     609             : 
    +     610             : // --------------------------------------------------------------
    +     611             : // |                          routines                          |
    +     612             : // --------------------------------------------------------------
    +     613             : 
    +     614             : /* stringInVector() //{ */
    +     615             : 
    +     616        2455 : bool ConstraintManager::stringInVector(const std::string& value, const std::vector<std::string>& vector) {
    +     617             : 
    +     618        2455 :   if (std::find(vector.begin(), vector.end(), value) == vector.end()) {
    +     619          92 :     return false;
    +     620             :   } else {
    +     621        2363 :     return true;
    +     622             :   }
    +     623             : }
    +     624             : 
    +     625             : //}
    +     626             : 
    +     627             : }  // namespace constraint_manager
    +     628             : 
    +     629             : }  // namespace mrs_uav_managers
    +     630             : 
    +     631             : #include <pluginlib/class_list_macros.h>
    +     632          91 : PLUGINLIB_EXPORT_CLASS(mrs_uav_managers::constraint_manager::ConstraintManager, nodelet::Nodelet)
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/constraint_manager.cpp.gcov.overview.html b/mrs_uav_managers/src/constraint_manager.cpp.gcov.overview.html new file mode 100644 index 0000000000..38d8adfdaf --- /dev/null +++ b/mrs_uav_managers/src/constraint_manager.cpp.gcov.overview.html @@ -0,0 +1,178 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/constraint_manager.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_managers/src/constraint_manager.cpp.gcov.png b/mrs_uav_managers/src/constraint_manager.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..8665e49273d3bd913d1e1e1695b4808b41ea8464 GIT binary patch literal 2190 zcmV;92yyp`P)>5)BTY8BblC`-Z9K!!Xe{bN>uLlw|>SUz(xi-s1E) z4_E^UP>2+y95r)9jOskK*@rm8ML1)(YqHRq;|bP}9Fh3vIsOyidnJY^)QH3&=I{g| z!Mjcg$TBndz$c@5Y)YLXkHERZCu;UQk7(mc&d?LiatUd~C^@+q zI|N<4$wa8B z>SV?^hp@{P;mJEBL~~%m2vG7p6I7Z(TL$Dfdc=!?Hx(J;gftSln=_nDBUK(DqFP1* z5p5sXz5DdIT(MYg(7~@-2NY%w|1EvO5Ff$}Ac#o1jHv9D2(#v?N24%+p@_QViPbc& z&l6`JUl-24D>V#p+sp=sdC+5GJ|_q_Yd31xc0@R8gl&jP2knT2<6{3(`@*AS58A3( z>SP=%CFCgE6`tYO2_fYc3FT8Ktr@#JCre1qT?#)vIEb83VQXO73X?34<>I=5M|NaW zvvgKUh%r@e=6uD!Qh~^-5T~$`=kqKe{Jj*r{FUQ236l+DDA*B*c#U-<;yq2fWXrzdVaFj4!AQ_>EN6)8*aHKFhain*32!7*TM1!Y6dJ-|ma$@CjF8YM zc|6Owf#(!cjYlVLQctrUcQhA*&sUoW+bxsK0mcoPRM=-yaXZtxC-#|gr_pViNNVRP zlzfZ{)08&(W7E`req!!}(4yJ=-j@ty0wKzqfmU!8J3aUDg~xmUIbOeB@AM%ed{)Lm z_^uH|!tv*%Yzcsj`c00@@pzZxx)m=VL>lRKT(q5$-3{a1OyXrnz(@ zOo)LH{Z6VU(-2E&JtEuh$)~;~^oSR|y#QKTu_2TC7N_XD9P$ux*umr2hVL=RrRsPD z2HXcnsMuX^ie^aLMW5glppnNR=Uf+=0#dlmJ|hhTmjYm&tgqWFGp9>s?NXQiLiL*` zBAamu&1?U0AA~GLl+EmfvTR0^&O`w&(?X%bnWLcsydBZ{A_kSh2ca__o1SG?#T91g@cojl1;sfoctOvChxqx3|EF$DeNL<}dEFI9TC$u%K zq^Y0CA>Y~CSA2I**-WbkYp0@~toNZJO zd%|mD->|rDcy#B-B$`Facx$4GuNLClxJ{Q8XIyvpr>|`43O5F2TQMERRBNuEkQVZt zFlD4D6978ysdj}|wvm#mk_Y=DVTa+zA3-!BzTX^k6yY`E>#9|7ms4aXL1+;Sa0-}{ zw>ibJyM`mG<6YVS{UxCDG}QK-yTYpipb4Qri@Q3ELxk6e*ZcbIS1&g{TB_HzTYLMv zxCqbpF#&kBuWOizd;GU2)FJ+vb&VEv#m%JNbL_+Mo@XU9$i1g>aks^LLdWG@?hpU! zt{~;{p2CL>&0A_fw})nU) z^gB+@+?e~ngQXJo;%;Y@&wU8P-WdP{o^fXYc;u%^c)$w-f!F>kTHvt=PWg6I5Xz?( zw@5x|nZZ4PvkMr%=_6cVTjCSOt}!^%7cYX6VW@7*A5pY7{&y1_=V34`I6f45WDcjRl=$B&KOaERxMF ztWlk<$J#Jor)XuzUYuXolG^8FQ8@X>4&%n3RE!JueJzsQ$Ks{Td=*|Gih6eCu{6_M zY`srWdSmGGefT~FJ+k||zpUmObrq1QXW%2ECU}obJ^$A;bzxLR1#;2wHa@9V1%T{3Sp-3@>^my00Ib0L@AH%c1XzI z*UIzS`mQUL_*?ie(8sDcVR81>6lcOT^O5(E2|IgXWG;T&w=*YHm9b$#;j9go@~Rbi>WBR2bE2>AydIWcin zh7MnICS}uKVa3^S+U)SJoMRH!J^$(<@-k-^LWd*v^O%x}wazBH5oBTJKSg~oJ5v4u QtpET307*qoM6N<$g5-=RhyVZp literal 0 HcmV?d00001 diff --git a/mrs_uav_managers/src/control_manager/common/common.cpp.func-sort-c.html b/mrs_uav_managers/src/control_manager/common/common.cpp.func-sort-c.html new file mode 100644 index 0000000000..1307b23a3f --- /dev/null +++ b/mrs_uav_managers/src/control_manager/common/common.cpp.func-sort-c.html @@ -0,0 +1,204 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/control_manager/common/common.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/control_manager/common - common.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:24556743.2 %
    Date:2024-04-18 23:11:36Functions:223171.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_managers::control_manager::getHighestOuput(mrs_uav_managers::control_manager::ControlOutputModalities_t const&)0
    mrs_uav_managers::control_manager::validateOdometry(nav_msgs::Odometry_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)0
    mrs_uav_managers::control_manager::initializeHwApiCmd(mrs_msgs::HwApiActuatorCmd_<std::allocator<void> >&, double const&, double const&)0
    mrs_uav_managers::control_manager::initializeHwApiCmd(mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> >&, mrs_msgs::UavState_<std::allocator<void> > const&, double const&)0
    mrs_uav_managers::control_manager::initializeHwApiCmd(mrs_msgs::HwApiPositionCmd_<std::allocator<void> >&, mrs_msgs::UavState_<std::allocator<void> > const&)0
    mrs_uav_managers::control_manager::initializeHwApiCmd(mrs_msgs::HwApiVelocityHdgCmd_<std::allocator<void> >&, mrs_msgs::UavState_<std::allocator<void> > const&)0
    mrs_uav_managers::control_manager::initializeHwApiCmd(mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> >&, double const&)0
    mrs_uav_managers::control_manager::initializeHwApiCmd(mrs_msgs::HwApiAccelerationHdgCmd_<std::allocator<void> >&, mrs_msgs::UavState_<std::allocator<void> > const&)0
    mrs_uav_managers::control_manager::initializeHwApiCmd(mrs_msgs::HwApiAccelerationHdgRateCmd_<std::allocator<void> >&, mrs_msgs::UavState_<std::allocator<void> > const&)0
    mrs_uav_managers::control_manager::initializeHwApiCmd(mrs_msgs::HwApiVelocityHdgRateCmd_<std::allocator<void> >&, mrs_msgs::UavState_<std::allocator<void> > const&)1
    mrs_uav_managers::control_manager::loadDetailedUavModelParams(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)91
    mrs_uav_managers::control_manager::validateVelocityReference(mrs_msgs::VelocityReference_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)468
    mrs_uav_managers::control_manager::validateHwApiPositionCmd(mrs_msgs::HwApiPositionCmd_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)505
    mrs_uav_managers::control_manager::validateHwApiAccelerationHdgRateCmd(mrs_msgs::HwApiAccelerationHdgRateCmd_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1026
    mrs_uav_managers::control_manager::validateHwApiAccelerationHdgCmd(mrs_msgs::HwApiAccelerationHdgCmd_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1046
    mrs_uav_managers::control_manager::validateHwApiVelocityHdgCmd(mrs_msgs::HwApiVelocityHdgCmd_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1090
    mrs_uav_managers::control_manager::idxInVector(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&)1424
    mrs_uav_managers::control_manager::RCChannelToRange(double, double, double)2184
    mrs_uav_managers::control_manager::validateHwApiVelocityHdgRateCmd(mrs_msgs::HwApiVelocityHdgRateCmd_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)2240
    mrs_uav_managers::control_manager::validateHwApiActuatorCmd(mrs_msgs::HwApiActuatorCmd_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)3826
    mrs_uav_managers::control_manager::validateHwApiControlGroupCmd(mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)3844
    mrs_uav_managers::control_manager::validateReference(mrs_msgs::Reference_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)10417
    mrs_uav_managers::control_manager::initializeHwApiCmd(mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> >&, double const&)14331
    mrs_uav_managers::control_manager::initializeDefaultOutput(mrs_uav_managers::control_manager::ControlOutputModalities_t const&, mrs_msgs::UavState_<std::allocator<void> > const&, double const&, double const&)14332
    mrs_uav_managers::control_manager::getLowestOuput(mrs_uav_managers::control_manager::ControlOutputModalities_t const&)14794
    mrs_uav_managers::control_manager::validateHwApiAttitudeRateCmd(mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)72149
    mrs_uav_managers::control_manager::validateTrackerCommand(std::optional<mrs_msgs::TrackerCommand_<std::allocator<void> > > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)83951
    mrs_uav_managers::control_manager::validateControlOutput(mrs_uav_managers::Controller::ControlOutput const&, mrs_uav_managers::control_manager::ControlOutputModalities_t const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)93662
    mrs_uav_managers::control_manager::validateHwApiAttitudeCmd(mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)101595
    mrs_uav_managers::control_manager::validateUavState(mrs_msgs::UavState_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)130266
    mrs_uav_managers::control_manager::extractThrottle(mrs_uav_managers::Controller::ControlOutput const&)140230
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/control_manager/common/common.cpp.func.html b/mrs_uav_managers/src/control_manager/common/common.cpp.func.html new file mode 100644 index 0000000000..c04ca48f6c --- /dev/null +++ b/mrs_uav_managers/src/control_manager/common/common.cpp.func.html @@ -0,0 +1,204 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/control_manager/common/common.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/control_manager/common - common.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:24556743.2 %
    Date:2024-04-18 23:11:36Functions:223171.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_managers::control_manager::idxInVector(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&)1424
    mrs_uav_managers::control_manager::getLowestOuput(mrs_uav_managers::control_manager::ControlOutputModalities_t const&)14794
    mrs_uav_managers::control_manager::extractThrottle(mrs_uav_managers::Controller::ControlOutput const&)140230
    mrs_uav_managers::control_manager::getHighestOuput(mrs_uav_managers::control_manager::ControlOutputModalities_t const&)0
    mrs_uav_managers::control_manager::RCChannelToRange(double, double, double)2184
    mrs_uav_managers::control_manager::validateOdometry(nav_msgs::Odometry_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)0
    mrs_uav_managers::control_manager::validateUavState(mrs_msgs::UavState_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)130266
    mrs_uav_managers::control_manager::validateReference(mrs_msgs::Reference_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)10417
    mrs_uav_managers::control_manager::initializeHwApiCmd(mrs_msgs::HwApiActuatorCmd_<std::allocator<void> >&, double const&, double const&)0
    mrs_uav_managers::control_manager::initializeHwApiCmd(mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> >&, mrs_msgs::UavState_<std::allocator<void> > const&, double const&)0
    mrs_uav_managers::control_manager::initializeHwApiCmd(mrs_msgs::HwApiPositionCmd_<std::allocator<void> >&, mrs_msgs::UavState_<std::allocator<void> > const&)0
    mrs_uav_managers::control_manager::initializeHwApiCmd(mrs_msgs::HwApiVelocityHdgCmd_<std::allocator<void> >&, mrs_msgs::UavState_<std::allocator<void> > const&)0
    mrs_uav_managers::control_manager::initializeHwApiCmd(mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> >&, double const&)14331
    mrs_uav_managers::control_manager::initializeHwApiCmd(mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> >&, double const&)0
    mrs_uav_managers::control_manager::initializeHwApiCmd(mrs_msgs::HwApiAccelerationHdgCmd_<std::allocator<void> >&, mrs_msgs::UavState_<std::allocator<void> > const&)0
    mrs_uav_managers::control_manager::initializeHwApiCmd(mrs_msgs::HwApiVelocityHdgRateCmd_<std::allocator<void> >&, mrs_msgs::UavState_<std::allocator<void> > const&)1
    mrs_uav_managers::control_manager::initializeHwApiCmd(mrs_msgs::HwApiAccelerationHdgRateCmd_<std::allocator<void> >&, mrs_msgs::UavState_<std::allocator<void> > const&)0
    mrs_uav_managers::control_manager::validateControlOutput(mrs_uav_managers::Controller::ControlOutput const&, mrs_uav_managers::control_manager::ControlOutputModalities_t const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)93662
    mrs_uav_managers::control_manager::validateTrackerCommand(std::optional<mrs_msgs::TrackerCommand_<std::allocator<void> > > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)83951
    mrs_uav_managers::control_manager::initializeDefaultOutput(mrs_uav_managers::control_manager::ControlOutputModalities_t const&, mrs_msgs::UavState_<std::allocator<void> > const&, double const&, double const&)14332
    mrs_uav_managers::control_manager::validateHwApiActuatorCmd(mrs_msgs::HwApiActuatorCmd_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)3826
    mrs_uav_managers::control_manager::validateHwApiAttitudeCmd(mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)101595
    mrs_uav_managers::control_manager::validateHwApiPositionCmd(mrs_msgs::HwApiPositionCmd_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)505
    mrs_uav_managers::control_manager::validateVelocityReference(mrs_msgs::VelocityReference_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)468
    mrs_uav_managers::control_manager::loadDetailedUavModelParams(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)91
    mrs_uav_managers::control_manager::validateHwApiVelocityHdgCmd(mrs_msgs::HwApiVelocityHdgCmd_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1090
    mrs_uav_managers::control_manager::validateHwApiAttitudeRateCmd(mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)72149
    mrs_uav_managers::control_manager::validateHwApiControlGroupCmd(mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)3844
    mrs_uav_managers::control_manager::validateHwApiAccelerationHdgCmd(mrs_msgs::HwApiAccelerationHdgCmd_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1046
    mrs_uav_managers::control_manager::validateHwApiVelocityHdgRateCmd(mrs_msgs::HwApiVelocityHdgRateCmd_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)2240
    mrs_uav_managers::control_manager::validateHwApiAccelerationHdgRateCmd(mrs_msgs::HwApiAccelerationHdgRateCmd_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)1026
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/control_manager/common/common.cpp.gcov.frameset.html b/mrs_uav_managers/src/control_manager/common/common.cpp.gcov.frameset.html new file mode 100644 index 0000000000..41b7eb37bb --- /dev/null +++ b/mrs_uav_managers/src/control_manager/common/common.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/control_manager/common/common.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_managers/src/control_manager/common/common.cpp.gcov.html b/mrs_uav_managers/src/control_manager/common/common.cpp.gcov.html new file mode 100644 index 0000000000..fe787c2001 --- /dev/null +++ b/mrs_uav_managers/src/control_manager/common/common.cpp.gcov.html @@ -0,0 +1,1312 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/control_manager/common/common.cpp + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/control_manager/common - common.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:24556743.2 %
    Date:2024-04-18 23:11:36Functions:223171.0 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #include <mrs_uav_managers/control_manager/common.h>
    +       2             : 
    +       3             : namespace mrs_uav_managers
    +       4             : {
    +       5             : 
    +       6             : namespace control_manager
    +       7             : {
    +       8             : 
    +       9             : /* idxInVector() //{ */
    +      10             : 
    +      11        1424 : std::optional<unsigned int> idxInVector(const std::string& str, const std::vector<std::string>& vec) {
    +      12             : 
    +      13        4014 :   for (unsigned int i = 0; i < vec.size(); i++) {
    +      14        4010 :     if (str == vec[i]) {
    +      15        1420 :       return {i};
    +      16             :     }
    +      17             :   }
    +      18             : 
    +      19           4 :   return {};
    +      20             : }
    +      21             : 
    +      22             : //}
    +      23             : 
    +      24             : /* validateTrackerCommand() //{ */
    +      25             : 
    +      26       83951 : bool validateTrackerCommand(const std::optional<mrs_msgs::TrackerCommand>& msg, const std::string& node_name, const std::string& var_name) {
    +      27             : 
    +      28       83951 :   if (!msg) {
    +      29           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: the optional variable '%s' is not set!!!", node_name.c_str(), var_name.c_str());
    +      30           0 :     return false;
    +      31             :   }
    +      32             : 
    +      33             :   // check positions
    +      34             : 
    +      35       83951 :   if (!std::isfinite(msg->position.x)) {
    +      36           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s->position.x'!!!", node_name.c_str(), var_name.c_str());
    +      37           0 :     return false;
    +      38             :   }
    +      39             : 
    +      40       83951 :   if (!std::isfinite(msg->position.y)) {
    +      41           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s->position.y'!!!", node_name.c_str(), var_name.c_str());
    +      42           0 :     return false;
    +      43             :   }
    +      44             : 
    +      45       83951 :   if (!std::isfinite(msg->position.z)) {
    +      46           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s->position.z'!!!", node_name.c_str(), var_name.c_str());
    +      47           0 :     return false;
    +      48             :   }
    +      49             : 
    +      50             :   // check velocities
    +      51             : 
    +      52       83951 :   if (!std::isfinite(msg->velocity.x)) {
    +      53           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s->velocity.x'!!!", node_name.c_str(), var_name.c_str());
    +      54           0 :     return false;
    +      55             :   }
    +      56             : 
    +      57       83951 :   if (!std::isfinite(msg->velocity.y)) {
    +      58           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s->velocity.y'!!!", node_name.c_str(), var_name.c_str());
    +      59           0 :     return false;
    +      60             :   }
    +      61             : 
    +      62       83951 :   if (!std::isfinite(msg->velocity.z)) {
    +      63           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s->velocity.z'!!!", node_name.c_str(), var_name.c_str());
    +      64           0 :     return false;
    +      65             :   }
    +      66             : 
    +      67             :   // check accelerations
    +      68             : 
    +      69       83951 :   if (!std::isfinite(msg->acceleration.x)) {
    +      70           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s->acceleration.x'!!!", node_name.c_str(), var_name.c_str());
    +      71           0 :     return false;
    +      72             :   }
    +      73             : 
    +      74       83951 :   if (!std::isfinite(msg->acceleration.y)) {
    +      75           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s->acceleration.y'!!!", node_name.c_str(), var_name.c_str());
    +      76           0 :     return false;
    +      77             :   }
    +      78             : 
    +      79       83951 :   if (!std::isfinite(msg->acceleration.z)) {
    +      80           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s->acceleration.z'!!!", node_name.c_str(), var_name.c_str());
    +      81           0 :     return false;
    +      82             :   }
    +      83             : 
    +      84             :   // check jerk
    +      85             : 
    +      86       83951 :   if (!std::isfinite(msg->jerk.x)) {
    +      87           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s->jerk.x'!!!", node_name.c_str(), var_name.c_str());
    +      88           0 :     return false;
    +      89             :   }
    +      90             : 
    +      91       83951 :   if (!std::isfinite(msg->jerk.y)) {
    +      92           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s->jerk.y'!!!", node_name.c_str(), var_name.c_str());
    +      93           0 :     return false;
    +      94             :   }
    +      95             : 
    +      96       83951 :   if (!std::isfinite(msg->jerk.z)) {
    +      97           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s->jerk.z'!!!", node_name.c_str(), var_name.c_str());
    +      98           0 :     return false;
    +      99             :   }
    +     100             : 
    +     101             :   // check snap
    +     102             : 
    +     103       83951 :   if (!std::isfinite(msg->snap.x)) {
    +     104           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s->snap.x'!!!", node_name.c_str(), var_name.c_str());
    +     105           0 :     return false;
    +     106             :   }
    +     107             : 
    +     108       83951 :   if (!std::isfinite(msg->snap.y)) {
    +     109           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s->snap.y'!!!", node_name.c_str(), var_name.c_str());
    +     110           0 :     return false;
    +     111             :   }
    +     112             : 
    +     113       83951 :   if (!std::isfinite(msg->snap.z)) {
    +     114           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s->snap.z'!!!", node_name.c_str(), var_name.c_str());
    +     115           0 :     return false;
    +     116             :   }
    +     117             : 
    +     118             :   // check attitude rate
    +     119             : 
    +     120       83951 :   if (!std::isfinite(msg->attitude_rate.x)) {
    +     121           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s->attitude_rate.x'!!!", node_name.c_str(), var_name.c_str());
    +     122           0 :     return false;
    +     123             :   }
    +     124             : 
    +     125       83951 :   if (!std::isfinite(msg->attitude_rate.y)) {
    +     126           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s->attitude_rate.y'!!!", node_name.c_str(), var_name.c_str());
    +     127           0 :     return false;
    +     128             :   }
    +     129             : 
    +     130       83951 :   if (!std::isfinite(msg->attitude_rate.z)) {
    +     131           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s->attitude_rate.z'!!!", node_name.c_str(), var_name.c_str());
    +     132           0 :     return false;
    +     133             :   }
    +     134             : 
    +     135             :   // check heading
    +     136             : 
    +     137       83951 :   if (!std::isfinite(msg->heading)) {
    +     138           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s->heading'!!!", node_name.c_str(), var_name.c_str());
    +     139           0 :     return false;
    +     140             :   }
    +     141             : 
    +     142       83951 :   if (!std::isfinite(msg->heading_rate)) {
    +     143           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s->heading_rate'!!!", node_name.c_str(), var_name.c_str());
    +     144           0 :     return false;
    +     145             :   }
    +     146             : 
    +     147       83951 :   if (!std::isfinite(msg->heading_acceleration)) {
    +     148           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s->heading_acceleration'!!!", node_name.c_str(), var_name.c_str());
    +     149           0 :     return false;
    +     150             :   }
    +     151             : 
    +     152       83951 :   if (!std::isfinite(msg->heading_jerk)) {
    +     153           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s->heading_jerk'!!!", node_name.c_str(), var_name.c_str());
    +     154           0 :     return false;
    +     155             :   }
    +     156             : 
    +     157             :   // check throttle
    +     158             : 
    +     159       83951 :   if (!std::isfinite(msg->throttle)) {
    +     160           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s->throttle'!!!", node_name.c_str(), var_name.c_str());
    +     161           0 :     return false;
    +     162             :   }
    +     163             : 
    +     164       83951 :   return true;
    +     165             : }
    +     166             : 
    +     167             : //}
    +     168             : 
    +     169             : /* validateOdometry() //{ */
    +     170             : 
    +     171           0 : bool validateOdometry(const nav_msgs::Odometry& msg, const std::string& node_name, const std::string& var_name) {
    +     172             : 
    +     173             :   // check position
    +     174             : 
    +     175           0 :   if (!std::isfinite(msg.pose.pose.position.x)) {
    +     176           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.pose.pose.position.x'!!!", node_name.c_str(), var_name.c_str());
    +     177           0 :     return false;
    +     178             :   }
    +     179             : 
    +     180           0 :   if (!std::isfinite(msg.pose.pose.position.y)) {
    +     181           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.pose.pose.position.y'!!!", node_name.c_str(), var_name.c_str());
    +     182           0 :     return false;
    +     183             :   }
    +     184             : 
    +     185           0 :   if (!std::isfinite(msg.pose.pose.position.z)) {
    +     186           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.pose.pose.position.z'!!!", node_name.c_str(), var_name.c_str());
    +     187           0 :     return false;
    +     188             :   }
    +     189             : 
    +     190             :   // check orientation
    +     191             : 
    +     192           0 :   if (!std::isfinite(msg.pose.pose.orientation.x)) {
    +     193           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.pose.pose.orientation.x'!!!", node_name.c_str(), var_name.c_str());
    +     194           0 :     return false;
    +     195             :   }
    +     196             : 
    +     197           0 :   if (!std::isfinite(msg.pose.pose.orientation.y)) {
    +     198           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.pose.pose.orientation.y'!!!", node_name.c_str(), var_name.c_str());
    +     199           0 :     return false;
    +     200             :   }
    +     201             : 
    +     202           0 :   if (!std::isfinite(msg.pose.pose.orientation.z)) {
    +     203           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.pose.pose.orientation.z'!!!", node_name.c_str(), var_name.c_str());
    +     204           0 :     return false;
    +     205             :   }
    +     206             : 
    +     207           0 :   if (!std::isfinite(msg.pose.pose.orientation.w)) {
    +     208           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.pose.pose.orientation.w'!!!", node_name.c_str(), var_name.c_str());
    +     209           0 :     return false;
    +     210             :   }
    +     211             : 
    +     212             :   // check velocity
    +     213             : 
    +     214           0 :   if (!std::isfinite(msg.twist.twist.linear.x)) {
    +     215           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.twist.twist.linear.x'!!!", node_name.c_str(), var_name.c_str());
    +     216           0 :     return false;
    +     217             :   }
    +     218             : 
    +     219           0 :   if (!std::isfinite(msg.twist.twist.linear.y)) {
    +     220           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.twist.twist.linear.y'!!!", node_name.c_str(), var_name.c_str());
    +     221           0 :     return false;
    +     222             :   }
    +     223             : 
    +     224           0 :   if (!std::isfinite(msg.twist.twist.linear.z)) {
    +     225           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.twist.twist.linear.z'!!!", node_name.c_str(), var_name.c_str());
    +     226           0 :     return false;
    +     227             :   }
    +     228             : 
    +     229           0 :   return true;
    +     230             : }
    +     231             : 
    +     232             : //}
    +     233             : 
    +     234             : /* validateVelocityReference() //{ */
    +     235             : 
    +     236         468 : bool validateVelocityReference(const mrs_msgs::VelocityReference& msg, const std::string& node_name, const std::string& var_name) {
    +     237             : 
    +     238             :   // check velocity
    +     239             : 
    +     240         468 :   if (!std::isfinite(msg.velocity.x)) {
    +     241           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.velocity.x'!!!", node_name.c_str(), var_name.c_str());
    +     242           0 :     return false;
    +     243             :   }
    +     244             : 
    +     245         468 :   if (!std::isfinite(msg.velocity.y)) {
    +     246           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.velocity.y'!!!", node_name.c_str(), var_name.c_str());
    +     247           0 :     return false;
    +     248             :   }
    +     249             : 
    +     250         468 :   if (!std::isfinite(msg.velocity.z)) {
    +     251           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.velocity.z'!!!", node_name.c_str(), var_name.c_str());
    +     252           0 :     return false;
    +     253             :   }
    +     254             : 
    +     255         468 :   if (!std::isfinite(msg.altitude)) {
    +     256           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.altitude'!!!", node_name.c_str(), var_name.c_str());
    +     257           0 :     return false;
    +     258             :   }
    +     259             : 
    +     260         468 :   if (!std::isfinite(msg.heading)) {
    +     261           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.heading'!!!", node_name.c_str(), var_name.c_str());
    +     262           0 :     return false;
    +     263             :   }
    +     264             : 
    +     265         468 :   if (!std::isfinite(msg.heading_rate)) {
    +     266           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.heading_rate'!!!", node_name.c_str(), var_name.c_str());
    +     267           0 :     return false;
    +     268             :   }
    +     269             : 
    +     270         468 :   return true;
    +     271             : }
    +     272             : 
    +     273             : //}
    +     274             : 
    +     275             : /* validateReference() //{ */
    +     276             : 
    +     277       10417 : bool validateReference(const mrs_msgs::Reference& msg, const std::string& node_name, const std::string& var_name) {
    +     278             : 
    +     279             :   // check position
    +     280             : 
    +     281       10417 :   if (!std::isfinite(msg.position.x)) {
    +     282           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.position.x'!!!", node_name.c_str(), var_name.c_str());
    +     283           0 :     return false;
    +     284             :   }
    +     285             : 
    +     286       10417 :   if (!std::isfinite(msg.position.y)) {
    +     287           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.position.y'!!!", node_name.c_str(), var_name.c_str());
    +     288           0 :     return false;
    +     289             :   }
    +     290             : 
    +     291       10417 :   if (!std::isfinite(msg.position.z)) {
    +     292           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.position.z'!!!", node_name.c_str(), var_name.c_str());
    +     293           0 :     return false;
    +     294             :   }
    +     295             : 
    +     296             :   // check heading
    +     297             : 
    +     298       10417 :   if (!std::isfinite(msg.heading)) {
    +     299           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.heading'!!!", node_name.c_str(), var_name.c_str());
    +     300           0 :     return false;
    +     301             :   }
    +     302             : 
    +     303       10417 :   return true;
    +     304             : }
    +     305             : 
    +     306             : //}
    +     307             : 
    +     308             : /* validateUavState() //{ */
    +     309             : 
    +     310      130266 : bool validateUavState(const mrs_msgs::UavState& msg, const std::string& node_name, const std::string& var_name) {
    +     311             : 
    +     312             :   // check position
    +     313             : 
    +     314      130266 :   if (!std::isfinite(msg.pose.position.x)) {
    +     315           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.pose.position.x'!!!", node_name.c_str(), var_name.c_str());
    +     316           0 :     return false;
    +     317             :   }
    +     318             : 
    +     319      130266 :   if (!std::isfinite(msg.pose.position.y)) {
    +     320           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.pose.position.y'!!!", node_name.c_str(), var_name.c_str());
    +     321           0 :     return false;
    +     322             :   }
    +     323             : 
    +     324      130266 :   if (!std::isfinite(msg.pose.position.z)) {
    +     325           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.pose.position.z'!!!", node_name.c_str(), var_name.c_str());
    +     326           0 :     return false;
    +     327             :   }
    +     328             : 
    +     329             :   // check orientation
    +     330             : 
    +     331      130266 :   if (!std::isfinite(msg.pose.orientation.x)) {
    +     332           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.pose.orientation.x'!!!", node_name.c_str(), var_name.c_str());
    +     333           0 :     return false;
    +     334             :   }
    +     335             : 
    +     336      130266 :   if (!std::isfinite(msg.pose.orientation.y)) {
    +     337           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.pose.orientation.y'!!!", node_name.c_str(), var_name.c_str());
    +     338           0 :     return false;
    +     339             :   }
    +     340             : 
    +     341      130266 :   if (!std::isfinite(msg.pose.orientation.z)) {
    +     342           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.pose.orientation.z'!!!", node_name.c_str(), var_name.c_str());
    +     343           0 :     return false;
    +     344             :   }
    +     345             : 
    +     346      130266 :   if (!std::isfinite(msg.pose.orientation.w)) {
    +     347           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.pose.orientation.w'!!!", node_name.c_str(), var_name.c_str());
    +     348           0 :     return false;
    +     349             :   }
    +     350             : 
    +     351             :   // check linear velocity
    +     352             : 
    +     353      130266 :   if (!std::isfinite(msg.velocity.linear.x)) {
    +     354           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.velocity.linear.x'!!!", node_name.c_str(), var_name.c_str());
    +     355           0 :     return false;
    +     356             :   }
    +     357             : 
    +     358      130266 :   if (!std::isfinite(msg.velocity.linear.y)) {
    +     359           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.velocity.linear.y'!!!", node_name.c_str(), var_name.c_str());
    +     360           0 :     return false;
    +     361             :   }
    +     362             : 
    +     363      130266 :   if (!std::isfinite(msg.velocity.linear.z)) {
    +     364           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.velocity.linear.z'!!!", node_name.c_str(), var_name.c_str());
    +     365           0 :     return false;
    +     366             :   }
    +     367             : 
    +     368             :   // check angular velocity
    +     369             : 
    +     370      130266 :   if (!std::isfinite(msg.velocity.angular.x)) {
    +     371           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.velocity.angular.x'!!!", node_name.c_str(), var_name.c_str());
    +     372           0 :     return false;
    +     373             :   }
    +     374             : 
    +     375      130266 :   if (!std::isfinite(msg.velocity.angular.y)) {
    +     376           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.velocity.angular.y'!!!", node_name.c_str(), var_name.c_str());
    +     377           0 :     return false;
    +     378             :   }
    +     379             : 
    +     380      130266 :   if (!std::isfinite(msg.velocity.angular.z)) {
    +     381           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.velocity.angular.z'!!!", node_name.c_str(), var_name.c_str());
    +     382           0 :     return false;
    +     383             :   }
    +     384             : 
    +     385             :   // check linear acceleration
    +     386             : 
    +     387      130266 :   if (!std::isfinite(msg.acceleration.linear.x)) {
    +     388           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.acceleration.linear.x'!!!", node_name.c_str(), var_name.c_str());
    +     389           0 :     return false;
    +     390             :   }
    +     391             : 
    +     392      130266 :   if (!std::isfinite(msg.acceleration.linear.y)) {
    +     393           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.acceleration.linear.y'!!!", node_name.c_str(), var_name.c_str());
    +     394           0 :     return false;
    +     395             :   }
    +     396             : 
    +     397      130266 :   if (!std::isfinite(msg.acceleration.linear.z)) {
    +     398           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.acceleration.linear.z'!!!", node_name.c_str(), var_name.c_str());
    +     399           0 :     return false;
    +     400             :   }
    +     401             : 
    +     402             :   // check angular acceleration
    +     403             : 
    +     404      130266 :   if (!std::isfinite(msg.acceleration.angular.x)) {
    +     405           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.acceleration.angular.x'!!!", node_name.c_str(), var_name.c_str());
    +     406           0 :     return false;
    +     407             :   }
    +     408             : 
    +     409      130266 :   if (!std::isfinite(msg.acceleration.angular.y)) {
    +     410           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.acceleration.angular.y'!!!", node_name.c_str(), var_name.c_str());
    +     411           0 :     return false;
    +     412             :   }
    +     413             : 
    +     414      130266 :   if (!std::isfinite(msg.acceleration.angular.z)) {
    +     415           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.acceleration.angular.z'!!!", node_name.c_str(), var_name.c_str());
    +     416           0 :     return false;
    +     417             :   }
    +     418             : 
    +     419             :   // check acceleration angular disturbance
    +     420             : 
    +     421      130266 :   if (!std::isfinite(msg.acceleration_disturbance.angular.x)) {
    +     422           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.acceleration_disturbance.angular.x'!!!", node_name.c_str(), var_name.c_str());
    +     423           0 :     return false;
    +     424             :   }
    +     425             : 
    +     426      130266 :   if (!std::isfinite(msg.acceleration_disturbance.angular.y)) {
    +     427           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.acceleration_disturbance.angular.y'!!!", node_name.c_str(), var_name.c_str());
    +     428           0 :     return false;
    +     429             :   }
    +     430             : 
    +     431      130266 :   if (!std::isfinite(msg.acceleration_disturbance.angular.z)) {
    +     432           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.acceleration_disturbance.angular.z'!!!", node_name.c_str(), var_name.c_str());
    +     433           0 :     return false;
    +     434             :   }
    +     435             : 
    +     436             :   // check acceleration linear disturbance
    +     437             : 
    +     438      130266 :   if (!std::isfinite(msg.acceleration_disturbance.linear.x)) {
    +     439           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.acceleration_disturbance.linear.x'!!!", node_name.c_str(), var_name.c_str());
    +     440           0 :     return false;
    +     441             :   }
    +     442             : 
    +     443      130266 :   if (!std::isfinite(msg.acceleration_disturbance.linear.y)) {
    +     444           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.acceleration_disturbance.linear.y'!!!", node_name.c_str(), var_name.c_str());
    +     445           0 :     return false;
    +     446             :   }
    +     447             : 
    +     448      130266 :   if (!std::isfinite(msg.acceleration_disturbance.linear.z)) {
    +     449           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.acceleration_disturbance.linear.z'!!!", node_name.c_str(), var_name.c_str());
    +     450           0 :     return false;
    +     451             :   }
    +     452             : 
    +     453      130266 :   return true;
    +     454             : }
    +     455             : 
    +     456             : //}
    +     457             : 
    +     458             : /* RCChannelToRange() //{ */
    +     459             : 
    +     460        2184 : double RCChannelToRange(double rc_value, double range, double deadband) {
    +     461             : 
    +     462        2184 :   double tmp_neg1_to_1 = (rc_value - 0.5) * 2.0;
    +     463             : 
    +     464        2184 :   if (tmp_neg1_to_1 > 1.0) {
    +     465           0 :     tmp_neg1_to_1 = 1.0;
    +     466        2184 :   } else if (tmp_neg1_to_1 < -1.0) {
    +     467           0 :     tmp_neg1_to_1 = -1.0;
    +     468             :   }
    +     469             : 
    +     470             :   // check the deadband
    +     471        2184 :   if (tmp_neg1_to_1 < deadband && tmp_neg1_to_1 > -deadband) {
    +     472        1716 :     return 0.0;
    +     473             :   }
    +     474             : 
    +     475         468 :   if (tmp_neg1_to_1 > 0) {
    +     476             : 
    +     477         264 :     double tmp = (tmp_neg1_to_1 - deadband) / (1.0 - deadband);
    +     478             : 
    +     479         264 :     return range * tmp;
    +     480             : 
    +     481             :   } else {
    +     482             : 
    +     483         204 :     double tmp = (-tmp_neg1_to_1 - deadband) / (1.0 - deadband);
    +     484             : 
    +     485         204 :     return -range * tmp;
    +     486             :   }
    +     487             : 
    +     488             :   return 0.0;
    +     489             : }
    +     490             : 
    +     491             : //}
    +     492             : 
    +     493             : /* loadDetailedUavModelParams() //{ */
    +     494             : 
    +     495          91 : std::optional<DetailedModelParams_t> loadDetailedUavModelParams(ros::NodeHandle& nh, const std::string& node_name, const std::string& platform_config,
    +     496             :                                                                 const std::string& custom_config) {
    +     497             : 
    +     498         182 :   mrs_lib::ParamLoader param_loader(nh, node_name);
    +     499             : 
    +     500          91 :   if (custom_config != "") {
    +     501          91 :     param_loader.addYamlFile(custom_config);
    +     502             :   }
    +     503             : 
    +     504          91 :   if (platform_config != "") {
    +     505          91 :     param_loader.addYamlFile(platform_config);
    +     506             :   }
    +     507             : 
    +     508             :   double mass;
    +     509             :   double arm_length;
    +     510             :   double body_height;
    +     511             :   double force_constant;
    +     512             :   double torque_constant;
    +     513             :   double prop_radius;
    +     514             :   double rpm_min;
    +     515             :   double rpm_max;
    +     516             : 
    +     517          91 :   bool detailed_loaded = true;
    +     518             : 
    +     519          91 :   detailed_loaded *= param_loader.loadParam("uav_mass", mass, 0.0);
    +     520             : 
    +     521          91 :   detailed_loaded *= param_loader.loadParam("model_params/arm_length", arm_length, 0.0);
    +     522          91 :   detailed_loaded *= param_loader.loadParam("model_params/body_height", body_height, 0.0);
    +     523             : 
    +     524          91 :   detailed_loaded *= param_loader.loadParam("model_params/propulsion/force_constant", force_constant, 0.0);
    +     525          91 :   detailed_loaded *= param_loader.loadParam("model_params/propulsion/torque_constant", torque_constant, 0.0);
    +     526          91 :   detailed_loaded *= param_loader.loadParam("model_params/propulsion/prop_radius", prop_radius, 0.0);
    +     527          91 :   detailed_loaded *= param_loader.loadParam("model_params/propulsion/rpm/min", rpm_min, 0.0);
    +     528          91 :   detailed_loaded *= param_loader.loadParam("model_params/propulsion/rpm/max", rpm_max, 0.0);
    +     529             : 
    +     530         182 :   Eigen::MatrixXd allocation_matrix;
    +     531             : 
    +     532          91 :   detailed_loaded *= param_loader.loadMatrixDynamic("model_params/propulsion/allocation_matrix", allocation_matrix, Eigen::Matrix4d::Identity(), 4, -1);
    +     533             : 
    +     534          91 :   if (!detailed_loaded) {
    +     535           0 :     ROS_WARN(
    +     536             :         "[%s]: detailed UAV model params not loaded, missing some parameters. This will not permit operations when ACTUATORS or CONTROL_GROUP control "
    +     537             :         "outputs would be possible.",
    +     538             :         node_name.c_str());
    +     539           0 :     return {};
    +     540             :   } else {
    +     541          91 :     ROS_INFO("[%s]: detailed UAV model params successfully loaded.", node_name.c_str());
    +     542             :   }
    +     543             : 
    +     544          91 :   int n_motors = allocation_matrix.cols();
    +     545             : 
    +     546         182 :   DetailedModelParams_t model_params;
    +     547             : 
    +     548          91 :   model_params.arm_length  = arm_length;
    +     549          91 :   model_params.body_height = body_height;
    +     550          91 :   model_params.prop_radius = prop_radius;
    +     551             : 
    +     552          91 :   Eigen::Matrix3d inertia_matrix;
    +     553             : 
    +     554          91 :   bool inertia_loaded = param_loader.loadMatrixStatic("model_params/inertia_matrix", inertia_matrix, Eigen::Matrix3d::Identity());
    +     555             : 
    +     556          91 :   if (inertia_loaded) {
    +     557             : 
    +     558           0 :     model_params.inertia = inertia_matrix;
    +     559           0 :     ROS_INFO("[%s]: inertia matrix loaded from config file:", node_name.c_str());
    +     560           0 :     ROS_INFO_STREAM(model_params.inertia);
    +     561             : 
    +     562             :   } else {
    +     563             : 
    +     564          91 :     ROS_INFO("[%s]: inertia matrix missing in the config file, computing it from the other params.", node_name.c_str());
    +     565             : 
    +     566             :     // create the inertia matrix
    +     567          91 :     model_params.inertia       = Eigen::Matrix3d::Zero();
    +     568          91 :     model_params.inertia(0, 0) = mass * (3.0 * arm_length * arm_length + body_height * body_height) / 12.0;
    +     569          91 :     model_params.inertia(1, 1) = mass * (3.0 * arm_length * arm_length + body_height * body_height) / 12.0;
    +     570          91 :     model_params.inertia(2, 2) = (mass * arm_length * arm_length) / 2.0;
    +     571             : 
    +     572          91 :     ROS_INFO("[%s]: inertia computed form parameters:", node_name.c_str());
    +     573          91 :     ROS_INFO_STREAM(model_params.inertia);
    +     574             :   }
    +     575             : 
    +     576             :   // create the force-torque allocation matrix
    +     577          91 :   model_params.force_torque_mixer = allocation_matrix;
    +     578          91 :   model_params.force_torque_mixer.row(0) *= arm_length * force_constant;
    +     579          91 :   model_params.force_torque_mixer.row(1) *= arm_length * force_constant;
    +     580          91 :   model_params.force_torque_mixer.row(2) *= torque_constant * (3.0 * prop_radius) * force_constant;
    +     581          91 :   model_params.force_torque_mixer.row(3) *= force_constant;
    +     582             : 
    +     583             :   // | ------- create the control group allocation matrix ------- |
    +     584             : 
    +     585             :   // pseudoinverse of the force-torque matrix (maximum norm)
    +     586             :   Eigen::MatrixXd alloc_tmp =
    +     587         182 :       model_params.force_torque_mixer.transpose() * (model_params.force_torque_mixer * model_params.force_torque_mixer.transpose()).inverse();
    +     588             : 
    +     589             :   // | ------------- normalize the allocation matrix ------------ |
    +     590             :   // this will make it match the PX4 control group mixing
    +     591             : 
    +     592             :   // the first two columns (roll, pitch)
    +     593         461 :   for (int i = 0; i < n_motors; i++) {
    +     594         370 :     alloc_tmp.block(i, 0, 1, 2).normalize();
    +     595             :   }
    +     596             : 
    +     597             :   // the 3rd column (yaw)
    +     598         461 :   for (int i = 0; i < n_motors; i++) {
    +     599         370 :     if (alloc_tmp(i, 2) > 1e-2) {
    +     600         185 :       alloc_tmp(i, 2) = 1.0;
    +     601         185 :     } else if (alloc_tmp(i, 2) < -1e-2) {
    +     602         185 :       alloc_tmp(i, 2) = -1.0;
    +     603             :     } else {
    +     604           0 :       alloc_tmp(i, 2) = 0.0;
    +     605             :     }
    +     606             :   }
    +     607             : 
    +     608             :   // the 4th column (throttle)
    +     609         461 :   for (int i = 0; i < n_motors; i++) {
    +     610         370 :     alloc_tmp(i, 3) = 1.0;
    +     611             :   }
    +     612             : 
    +     613          91 :   model_params.control_group_mixer = alloc_tmp;
    +     614             : 
    +     615          91 :   return model_params;
    +     616             : }
    +     617             : 
    +     618             : //}
    +     619             : 
    +     620             : /* getLowestOutput() //{ */
    +     621             : 
    +     622       14794 : CONTROL_OUTPUT getLowestOuput(const ControlOutputModalities_t& outputs) {
    +     623             : 
    +     624       14794 :   if (outputs.actuators) {
    +     625          16 :     return ACTUATORS_CMD;
    +     626             :   }
    +     627             : 
    +     628       14778 :   if (outputs.control_group) {
    +     629          16 :     return CONTROL_GROUP;
    +     630             :   }
    +     631             : 
    +     632       14762 :   if (outputs.attitude_rate) {
    +     633       14655 :     return ATTITUDE_RATE;
    +     634             :   }
    +     635             : 
    +     636         107 :   if (outputs.attitude) {
    +     637          16 :     return ATTITUDE;
    +     638             :   }
    +     639             : 
    +     640          91 :   if (outputs.acceleration_hdg_rate) {
    +     641          10 :     return ACCELERATION_HDG_RATE;
    +     642             :   }
    +     643             : 
    +     644          81 :   if (outputs.acceleration_hdg) {
    +     645          10 :     return ACCELERATION_HDG;
    +     646             :   }
    +     647             : 
    +     648          71 :   if (outputs.velocity_hdg_rate) {
    +     649          41 :     return VELOCITY_HDG_RATE;
    +     650             :   }
    +     651             : 
    +     652          30 :   if (outputs.velocity_hdg) {
    +     653          20 :     return VELOCITY_HDG;
    +     654             :   }
    +     655             : 
    +     656          10 :   return POSITION;
    +     657             : }
    +     658             : 
    +     659             : //}
    +     660             : 
    +     661             : /* getHighestOutput() //{ */
    +     662             : 
    +     663           0 : CONTROL_OUTPUT getHighestOuput(const ControlOutputModalities_t& outputs) {
    +     664             : 
    +     665           0 :   if (outputs.position) {
    +     666           0 :     return POSITION;
    +     667             :   }
    +     668             : 
    +     669           0 :   if (outputs.velocity_hdg) {
    +     670           0 :     return VELOCITY_HDG;
    +     671             :   }
    +     672             : 
    +     673           0 :   if (outputs.velocity_hdg_rate) {
    +     674           0 :     return VELOCITY_HDG_RATE;
    +     675             :   }
    +     676             : 
    +     677           0 :   if (outputs.acceleration_hdg) {
    +     678           0 :     return ACCELERATION_HDG;
    +     679             :   }
    +     680             : 
    +     681           0 :   if (outputs.acceleration_hdg_rate) {
    +     682           0 :     return ACCELERATION_HDG_RATE;
    +     683             :   }
    +     684             : 
    +     685           0 :   if (outputs.attitude) {
    +     686           0 :     return ATTITUDE;
    +     687             :   }
    +     688             : 
    +     689           0 :   if (outputs.attitude_rate) {
    +     690           0 :     return ATTITUDE_RATE;
    +     691             :   }
    +     692             : 
    +     693           0 :   if (outputs.control_group) {
    +     694           0 :     return CONTROL_GROUP;
    +     695             :   }
    +     696             : 
    +     697           0 :   return ACTUATORS_CMD;
    +     698             : }
    +     699             : 
    +     700             : //}
    +     701             : 
    +     702             : // | -------- extraction of throttle out of hw api cmds ------- |
    +     703             : 
    +     704             : /* extractThrottle() //{ */
    +     705             : 
    +     706      140230 : std::optional<double> extractThrottle(const Controller::ControlOutput& control_output) {
    +     707             : 
    +     708      140230 :   if (!control_output.control_output) {
    +     709       21104 :     return {};
    +     710             :   }
    +     711             : 
    +     712      238252 :   return std::visit(HwApiCmdExtractThrottleVisitor(), control_output.control_output.value());
    +     713             : }
    +     714             : 
    +     715             : //}
    +     716             : 
    +     717             : // | -------------- validation of HW api commands ------------- |
    +     718             : 
    +     719             : /* validateControlOutput() //{ */
    +     720             : 
    +     721       93662 : bool validateControlOutput(const Controller::ControlOutput& control_output, const ControlOutputModalities_t& output_modalities, const std::string& node_name,
    +     722             :                            const std::string& var_name) {
    +     723             : 
    +     724       93662 :   if (!control_output.control_output) {
    +     725           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: the optional variable '%s' is not set!!!", node_name.c_str(), var_name.c_str());
    +     726           0 :     return false;
    +     727             :   }
    +     728             : 
    +     729       93662 :   std::variant<ControlOutputModalities_t> output_modalities_var{output_modalities};
    +     730      187324 :   std::variant<std::string>               node_name_var{node_name};
    +     731       93662 :   std::variant<std::string>               var_name_var{var_name};
    +     732             : 
    +     733       93662 :   return std::visit(HwApiValidateVisitor(), control_output.control_output.value(), output_modalities_var, node_name_var, var_name_var);
    +     734             : }
    +     735             : 
    +     736             : //}
    +     737             : 
    +     738             : /* validateHwApiActuatorCmd() //{ */
    +     739             : 
    +     740        3826 : bool validateHwApiActuatorCmd(const mrs_msgs::HwApiActuatorCmd& msg, const std::string& node_name, const std::string& var_name) {
    +     741             : 
    +     742       19130 :   for (size_t i = 0; i < msg.motors.size(); i++) {
    +     743       15304 :     if (!std::isfinite(msg.motors[i])) {
    +     744           0 :       ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.motors[%d]'!!!", node_name.c_str(), var_name.c_str(), int(i));
    +     745           0 :       return false;
    +     746             :     }
    +     747             :   }
    +     748             : 
    +     749        3826 :   return true;
    +     750             : }
    +     751             : 
    +     752             : //}
    +     753             : 
    +     754             : /* validateHwApiControlGroupCmd() //{ */
    +     755             : 
    +     756        3844 : bool validateHwApiControlGroupCmd(const mrs_msgs::HwApiControlGroupCmd& msg, const std::string& node_name, const std::string& var_name) {
    +     757             : 
    +     758        3844 :   if (!std::isfinite(msg.roll)) {
    +     759           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.roll'!!!", node_name.c_str(), var_name.c_str());
    +     760           0 :     return false;
    +     761             :   }
    +     762             : 
    +     763        3844 :   if (!std::isfinite(msg.pitch)) {
    +     764           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.pitch'!!!", node_name.c_str(), var_name.c_str());
    +     765           0 :     return false;
    +     766             :   }
    +     767             : 
    +     768        3844 :   if (!std::isfinite(msg.yaw)) {
    +     769           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.yaw'!!!", node_name.c_str(), var_name.c_str());
    +     770           0 :     return false;
    +     771             :   }
    +     772             : 
    +     773        3844 :   if (!std::isfinite(msg.throttle)) {
    +     774           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.throttle'!!!", node_name.c_str(), var_name.c_str());
    +     775           0 :     return false;
    +     776             :   }
    +     777             : 
    +     778        3844 :   return true;
    +     779             : }
    +     780             : 
    +     781             : //}
    +     782             : 
    +     783             : /* validateHwApiAttitudeCmd() //{ */
    +     784             : 
    +     785      101595 : bool validateHwApiAttitudeCmd(const mrs_msgs::HwApiAttitudeCmd& msg, const std::string& node_name, const std::string& var_name) {
    +     786             : 
    +     787             :   // check the orientation
    +     788             : 
    +     789      101595 :   if (!std::isfinite(msg.orientation.x)) {
    +     790           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.orientation.x'!!!", node_name.c_str(), var_name.c_str());
    +     791           0 :     return false;
    +     792             :   }
    +     793             : 
    +     794      101595 :   if (!std::isfinite(msg.orientation.y)) {
    +     795           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.orientation.y'!!!", node_name.c_str(), var_name.c_str());
    +     796           0 :     return false;
    +     797             :   }
    +     798             : 
    +     799      101595 :   if (!std::isfinite(msg.orientation.z)) {
    +     800           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.orientation.z'!!!", node_name.c_str(), var_name.c_str());
    +     801           0 :     return false;
    +     802             :   }
    +     803             : 
    +     804      101595 :   if (!std::isfinite(msg.orientation.w)) {
    +     805           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.orientation.w'!!!", node_name.c_str(), var_name.c_str());
    +     806           0 :     return false;
    +     807             :   }
    +     808             : 
    +     809             :   // check the throttle
    +     810             : 
    +     811      101595 :   if (!std::isfinite(msg.throttle)) {
    +     812           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.throttle'!!!", node_name.c_str(), var_name.c_str());
    +     813           0 :     return false;
    +     814             :   }
    +     815             : 
    +     816      101595 :   return true;
    +     817             : }
    +     818             : 
    +     819             : //}
    +     820             : 
    +     821             : /* validateHwApiAttitudeRateCmd() //{ */
    +     822             : 
    +     823       72149 : bool validateHwApiAttitudeRateCmd(const mrs_msgs::HwApiAttitudeRateCmd& msg, const std::string& node_name, const std::string& var_name) {
    +     824             : 
    +     825             :   // check the body rate
    +     826             : 
    +     827       72149 :   if (!std::isfinite(msg.body_rate.x)) {
    +     828           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.body_rate.x'!!!", node_name.c_str(), var_name.c_str());
    +     829           0 :     return false;
    +     830             :   }
    +     831             : 
    +     832       72149 :   if (!std::isfinite(msg.body_rate.y)) {
    +     833           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.body_rate.y'!!!", node_name.c_str(), var_name.c_str());
    +     834           0 :     return false;
    +     835             :   }
    +     836             : 
    +     837       72149 :   if (!std::isfinite(msg.body_rate.z)) {
    +     838           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.body_rate.z'!!!", node_name.c_str(), var_name.c_str());
    +     839           0 :     return false;
    +     840             :   }
    +     841             : 
    +     842             :   // check the throttle
    +     843             : 
    +     844       72149 :   if (!std::isfinite(msg.throttle)) {
    +     845           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.throttle'!!!", node_name.c_str(), var_name.c_str());
    +     846           0 :     return false;
    +     847             :   }
    +     848             : 
    +     849       72149 :   return true;
    +     850             : }
    +     851             : 
    +     852             : //}
    +     853             : 
    +     854             : /* validateHwApiAccelerationHdgRateCmd() //{ */
    +     855             : 
    +     856        1026 : bool validateHwApiAccelerationHdgRateCmd(const mrs_msgs::HwApiAccelerationHdgRateCmd& msg, const std::string& node_name, const std::string& var_name) {
    +     857             : 
    +     858             :   // | ----------------- check the acceleration ----------------- |
    +     859             : 
    +     860        1026 :   if (!std::isfinite(msg.acceleration.x)) {
    +     861           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.acceleration.x'!!!", node_name.c_str(), var_name.c_str());
    +     862           0 :     return false;
    +     863             :   }
    +     864             : 
    +     865        1026 :   if (!std::isfinite(msg.acceleration.y)) {
    +     866           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.acceleration.y'!!!", node_name.c_str(), var_name.c_str());
    +     867           0 :     return false;
    +     868             :   }
    +     869             : 
    +     870        1026 :   if (!std::isfinite(msg.acceleration.z)) {
    +     871           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.acceleration.z'!!!", node_name.c_str(), var_name.c_str());
    +     872           0 :     return false;
    +     873             :   }
    +     874             : 
    +     875             :   // check the heading rate
    +     876             : 
    +     877        1026 :   if (!std::isfinite(msg.heading_rate)) {
    +     878           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.heading_rate'!!!", node_name.c_str(), var_name.c_str());
    +     879           0 :     return false;
    +     880             :   }
    +     881             : 
    +     882        1026 :   return true;
    +     883             : }
    +     884             : 
    +     885             : //}
    +     886             : 
    +     887             : /* validateHwApiAccelerationHdgCmd() //{ */
    +     888             : 
    +     889        1046 : bool validateHwApiAccelerationHdgCmd(const mrs_msgs::HwApiAccelerationHdgCmd& msg, const std::string& node_name, const std::string& var_name) {
    +     890             : 
    +     891             :   // | ----------------- check the acceleration ----------------- |
    +     892             : 
    +     893        1046 :   if (!std::isfinite(msg.acceleration.x)) {
    +     894           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.acceleration.x'!!!", node_name.c_str(), var_name.c_str());
    +     895           0 :     return false;
    +     896             :   }
    +     897             : 
    +     898        1046 :   if (!std::isfinite(msg.acceleration.y)) {
    +     899           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.acceleration.y'!!!", node_name.c_str(), var_name.c_str());
    +     900           0 :     return false;
    +     901             :   }
    +     902             : 
    +     903        1046 :   if (!std::isfinite(msg.acceleration.z)) {
    +     904           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.acceleration.z'!!!", node_name.c_str(), var_name.c_str());
    +     905           0 :     return false;
    +     906             :   }
    +     907             : 
    +     908             :   // check the heading
    +     909             : 
    +     910        1046 :   if (!std::isfinite(msg.heading)) {
    +     911           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.heading'!!!", node_name.c_str(), var_name.c_str());
    +     912           0 :     return false;
    +     913             :   }
    +     914             : 
    +     915        1046 :   return true;
    +     916             : }
    +     917             : 
    +     918             : //}
    +     919             : 
    +     920             : /* validateHwApiVelocityHdgRateCmd() //{ */
    +     921             : 
    +     922        2240 : bool validateHwApiVelocityHdgRateCmd(const mrs_msgs::HwApiVelocityHdgRateCmd& msg, const std::string& node_name, const std::string& var_name) {
    +     923             : 
    +     924             :   // | ----------------- check the velocity ----------------- |
    +     925             : 
    +     926        2240 :   if (!std::isfinite(msg.velocity.x)) {
    +     927           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.velocity.x'!!!", node_name.c_str(), var_name.c_str());
    +     928           0 :     return false;
    +     929             :   }
    +     930             : 
    +     931        2240 :   if (!std::isfinite(msg.velocity.y)) {
    +     932           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.velocity.y'!!!", node_name.c_str(), var_name.c_str());
    +     933           0 :     return false;
    +     934             :   }
    +     935             : 
    +     936        2240 :   if (!std::isfinite(msg.velocity.z)) {
    +     937           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.velocity.z'!!!", node_name.c_str(), var_name.c_str());
    +     938           0 :     return false;
    +     939             :   }
    +     940             : 
    +     941             :   // check the heading rate
    +     942             : 
    +     943        2240 :   if (!std::isfinite(msg.heading_rate)) {
    +     944           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.heading_rate'!!!", node_name.c_str(), var_name.c_str());
    +     945           0 :     return false;
    +     946             :   }
    +     947             : 
    +     948        2240 :   return true;
    +     949             : }
    +     950             : 
    +     951             : //}
    +     952             : 
    +     953             : /* validateHwApiVelocityHdgCmd() //{ */
    +     954             : 
    +     955        1090 : bool validateHwApiVelocityHdgCmd(const mrs_msgs::HwApiVelocityHdgCmd& msg, const std::string& node_name, const std::string& var_name) {
    +     956             : 
    +     957             :   // | ----------------- check the velocity ----------------- |
    +     958             : 
    +     959        1090 :   if (!std::isfinite(msg.velocity.x)) {
    +     960           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.velocity.x'!!!", node_name.c_str(), var_name.c_str());
    +     961           0 :     return false;
    +     962             :   }
    +     963             : 
    +     964        1090 :   if (!std::isfinite(msg.velocity.y)) {
    +     965           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.velocity.y'!!!", node_name.c_str(), var_name.c_str());
    +     966           0 :     return false;
    +     967             :   }
    +     968             : 
    +     969        1090 :   if (!std::isfinite(msg.velocity.z)) {
    +     970           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.velocity.z'!!!", node_name.c_str(), var_name.c_str());
    +     971           0 :     return false;
    +     972             :   }
    +     973             : 
    +     974             :   // check the heading
    +     975             : 
    +     976        1090 :   if (!std::isfinite(msg.heading)) {
    +     977           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.heading'!!!", node_name.c_str(), var_name.c_str());
    +     978           0 :     return false;
    +     979             :   }
    +     980             : 
    +     981        1090 :   return true;
    +     982             : }
    +     983             : 
    +     984             : //}
    +     985             : 
    +     986             : /* validateHwApiPositionHdgCmd() //{ */
    +     987             : 
    +     988         505 : bool validateHwApiPositionCmd(const mrs_msgs::HwApiPositionCmd& msg, const std::string& node_name, const std::string& var_name) {
    +     989             : 
    +     990             :   // | ----------------- check the position ----------------- |
    +     991             : 
    +     992         505 :   if (!std::isfinite(msg.position.x)) {
    +     993           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.position.x'!!!", node_name.c_str(), var_name.c_str());
    +     994           0 :     return false;
    +     995             :   }
    +     996             : 
    +     997         505 :   if (!std::isfinite(msg.position.y)) {
    +     998           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.position.y'!!!", node_name.c_str(), var_name.c_str());
    +     999           0 :     return false;
    +    1000             :   }
    +    1001             : 
    +    1002         505 :   if (!std::isfinite(msg.position.z)) {
    +    1003           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.position.z'!!!", node_name.c_str(), var_name.c_str());
    +    1004           0 :     return false;
    +    1005             :   }
    +    1006             : 
    +    1007             :   // check the heading
    +    1008             : 
    +    1009         505 :   if (!std::isfinite(msg.heading)) {
    +    1010           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in variable '%s.heading'!!!", node_name.c_str(), var_name.c_str());
    +    1011           0 :     return false;
    +    1012             :   }
    +    1013             : 
    +    1014         505 :   return true;
    +    1015             : }
    +    1016             : 
    +    1017             : //}
    +    1018             : 
    +    1019             : // | ------------ initialization of HW api commands ----------- |
    +    1020             : 
    +    1021             : /* initializeDefaultOutput() //{ */
    +    1022             : 
    +    1023       14332 : Controller::HwApiOutputVariant initializeDefaultOutput(const ControlOutputModalities_t& possible_outputs, const mrs_msgs::UavState& uav_state,
    +    1024             :                                                        const double& min_throttle, const double& n_motors) {
    +    1025             : 
    +    1026       14332 :   CONTROL_OUTPUT lowest_output = getLowestOuput(possible_outputs);
    +    1027             : 
    +    1028       14332 :   Controller::HwApiOutputVariant output;
    +    1029             : 
    +    1030       14332 :   switch (lowest_output) {
    +    1031           0 :     case ACTUATORS_CMD: {
    +    1032           0 :       output = mrs_msgs::HwApiActuatorCmd();
    +    1033           0 :       break;
    +    1034             :     }
    +    1035           0 :     case CONTROL_GROUP: {
    +    1036           0 :       output = mrs_msgs::HwApiControlGroupCmd();
    +    1037           0 :       break;
    +    1038             :     }
    +    1039       14331 :     case ATTITUDE_RATE: {
    +    1040       14331 :       output = mrs_msgs::HwApiAttitudeRateCmd();
    +    1041       14331 :       break;
    +    1042             :     }
    +    1043           0 :     case ATTITUDE: {
    +    1044           0 :       output = mrs_msgs::HwApiAttitudeCmd();
    +    1045           0 :       break;
    +    1046             :     }
    +    1047           0 :     case ACCELERATION_HDG_RATE: {
    +    1048           0 :       output = mrs_msgs::HwApiAccelerationHdgRateCmd();
    +    1049           0 :       break;
    +    1050             :     }
    +    1051           0 :     case ACCELERATION_HDG: {
    +    1052           0 :       output = mrs_msgs::HwApiAccelerationHdgCmd();
    +    1053           0 :       break;
    +    1054             :     }
    +    1055           1 :     case VELOCITY_HDG_RATE: {
    +    1056           1 :       output = mrs_msgs::HwApiVelocityHdgRateCmd();
    +    1057           1 :       break;
    +    1058             :     }
    +    1059           0 :     case VELOCITY_HDG: {
    +    1060           0 :       output = mrs_msgs::HwApiVelocityHdgCmd();
    +    1061           0 :       break;
    +    1062             :     }
    +    1063           0 :     case POSITION: {
    +    1064           0 :       output = mrs_msgs::HwApiPositionCmd();
    +    1065           0 :       break;
    +    1066             :     }
    +    1067             :   }
    +    1068             : 
    +    1069       28664 :   std::variant<mrs_msgs::UavState> uav_state_var{uav_state};
    +    1070       14332 :   std::variant<double>             min_throttle_var{min_throttle};
    +    1071       14332 :   std::variant<double>             n_motors_var{n_motors};
    +    1072             : 
    +    1073       14332 :   std::visit(HwApiInitializeVisitor(), output, uav_state_var, min_throttle_var, n_motors_var);
    +    1074             : 
    +    1075       28664 :   return output;
    +    1076             : }  // namespace mrs_uav_managers
    +    1077             : 
    +    1078             : //}
    +    1079             : 
    +    1080             : /* initializeHwApiCmd(mrs_msgs::HwApiActuatorCmd& msg) //{ */
    +    1081             : 
    +    1082           0 : void initializeHwApiCmd(mrs_msgs::HwApiActuatorCmd& msg, const double& min_throttle, const double& n_motors) {
    +    1083             : 
    +    1084           0 :   msg.stamp = ros::Time::now();
    +    1085             : 
    +    1086           0 :   for (int i = 0; i < n_motors; i++) {
    +    1087           0 :     msg.motors.push_back(min_throttle);
    +    1088             :   }
    +    1089           0 : }
    +    1090             : 
    +    1091             : //}
    +    1092             : 
    +    1093             : /* initializeHwApiCmd(mrs_msgs::HwApiControlGroupCmd& msg) //{ */
    +    1094             : 
    +    1095           0 : void initializeHwApiCmd(mrs_msgs::HwApiControlGroupCmd& msg, const double& min_throttle) {
    +    1096             : 
    +    1097           0 :   msg.stamp = ros::Time::now();
    +    1098             : 
    +    1099           0 :   msg.roll     = 0;
    +    1100           0 :   msg.pitch    = 0;
    +    1101           0 :   msg.yaw      = 0;
    +    1102           0 :   msg.throttle = min_throttle;
    +    1103           0 : }
    +    1104             : 
    +    1105             : //}
    +    1106             : 
    +    1107             : /* initializeHwApiCmd(mrs_msgs::HwApiAttitudeRateCmd& msg) //{ */
    +    1108             : 
    +    1109       14331 : void initializeHwApiCmd(mrs_msgs::HwApiAttitudeRateCmd& msg, const double& min_throttle) {
    +    1110             : 
    +    1111       14331 :   msg.stamp = ros::Time::now();
    +    1112             : 
    +    1113       14331 :   msg.body_rate.x = 0;
    +    1114       14331 :   msg.body_rate.y = 0;
    +    1115       14331 :   msg.body_rate.z = 0;
    +    1116       14331 :   msg.throttle    = min_throttle;
    +    1117       14331 : }
    +    1118             : 
    +    1119             : //}
    +    1120             : 
    +    1121             : /* initializeHwApiCmd(mrs_msgs::HwApiAttitudeCmd& msg) //{ */
    +    1122             : 
    +    1123           0 : void initializeHwApiCmd(mrs_msgs::HwApiAttitudeCmd& msg, const mrs_msgs::UavState& uav_state, const double& min_throttle) {
    +    1124             : 
    +    1125           0 :   msg.stamp = ros::Time::now();
    +    1126             : 
    +    1127           0 :   msg.orientation = uav_state.pose.orientation;
    +    1128           0 :   msg.throttle    = min_throttle;
    +    1129           0 : }
    +    1130             : 
    +    1131             : //}
    +    1132             : 
    +    1133             : /* initializeHwApiCmd(mrs_msgs::HwApiAccelerationHdgRateCmd& msg) //{ */
    +    1134             : 
    +    1135           0 : void initializeHwApiCmd(mrs_msgs::HwApiAccelerationHdgRateCmd& msg, const mrs_msgs::UavState& uav_state) {
    +    1136             : 
    +    1137           0 :   msg.header.frame_id = uav_state.header.frame_id;
    +    1138           0 :   msg.header.stamp    = ros::Time::now();
    +    1139             : 
    +    1140           0 :   msg.acceleration.x = 0;
    +    1141           0 :   msg.acceleration.y = 0;
    +    1142           0 :   msg.acceleration.z = 0;
    +    1143           0 :   msg.heading_rate   = 0;
    +    1144           0 : }
    +    1145             : 
    +    1146             : //}
    +    1147             : 
    +    1148             : /* initializeHwApiCmd(mrs_msgs::HwApiAccelerationHdgCmd& msg) //{ */
    +    1149             : 
    +    1150           0 : void initializeHwApiCmd(mrs_msgs::HwApiAccelerationHdgCmd& msg, const mrs_msgs::UavState& uav_state) {
    +    1151             : 
    +    1152           0 :   msg.header.frame_id = uav_state.header.frame_id;
    +    1153           0 :   msg.header.stamp    = ros::Time::now();
    +    1154             : 
    +    1155           0 :   msg.acceleration.x = 0;
    +    1156           0 :   msg.acceleration.y = 0;
    +    1157           0 :   msg.acceleration.z = 0;
    +    1158             : 
    +    1159             :   try {
    +    1160           0 :     msg.heading = mrs_lib::AttitudeConverter(uav_state.pose.orientation).getHeading();
    +    1161             :   }
    +    1162           0 :   catch (std::runtime_error& exrun) {
    +    1163           0 :     msg.heading = 0;
    +    1164             :   }
    +    1165           0 : }
    +    1166             : 
    +    1167             : //}
    +    1168             : 
    +    1169             : /* initializeHwApiCmd(mrs_msgs::HwApiVelocityHdgRateCmd& msg) //{ */
    +    1170             : 
    +    1171           1 : void initializeHwApiCmd(mrs_msgs::HwApiVelocityHdgRateCmd& msg, const mrs_msgs::UavState& uav_state) {
    +    1172             : 
    +    1173           1 :   msg.header.frame_id = uav_state.header.frame_id;
    +    1174           1 :   msg.header.stamp    = ros::Time::now();
    +    1175             : 
    +    1176           1 :   msg.velocity.x   = 0;
    +    1177           1 :   msg.velocity.y   = 0;
    +    1178           1 :   msg.velocity.z   = 0;
    +    1179           1 :   msg.heading_rate = 0;
    +    1180           1 : }
    +    1181             : 
    +    1182             : //}
    +    1183             : 
    +    1184             : /* initializeHwApiCmd(mrs_msgs::HwApiVelocityHdgCmd& msg) //{ */
    +    1185             : 
    +    1186           0 : void initializeHwApiCmd(mrs_msgs::HwApiVelocityHdgCmd& msg, const mrs_msgs::UavState& uav_state) {
    +    1187             : 
    +    1188           0 :   msg.header.frame_id = uav_state.header.frame_id;
    +    1189           0 :   msg.header.stamp    = ros::Time::now();
    +    1190             : 
    +    1191           0 :   msg.velocity.x = 0;
    +    1192           0 :   msg.velocity.y = 0;
    +    1193           0 :   msg.velocity.z = 0;
    +    1194             : 
    +    1195             :   try {
    +    1196           0 :     msg.heading = mrs_lib::AttitudeConverter(uav_state.pose.orientation).getHeading();
    +    1197             :   }
    +    1198           0 :   catch (std::runtime_error& exrun) {
    +    1199           0 :     msg.heading = 0;
    +    1200             :   }
    +    1201           0 : }
    +    1202             : 
    +    1203             : //}
    +    1204             : 
    +    1205             : /* initializeHwApiCmd(mrs_msgs::HwApiPositionCmd& msg) //{ */
    +    1206             : 
    +    1207           0 : void initializeHwApiCmd(mrs_msgs::HwApiPositionCmd& msg, const mrs_msgs::UavState& uav_state) {
    +    1208             : 
    +    1209           0 :   msg.header.frame_id = uav_state.header.frame_id;
    +    1210           0 :   msg.header.stamp    = ros::Time::now();
    +    1211             : 
    +    1212           0 :   msg.position.x = uav_state.pose.position.x;
    +    1213           0 :   msg.position.y = uav_state.pose.position.y;
    +    1214           0 :   msg.position.z = uav_state.pose.position.z;
    +    1215             : 
    +    1216             :   try {
    +    1217           0 :     msg.heading = mrs_lib::AttitudeConverter(uav_state.pose.orientation).getHeading();
    +    1218             :   }
    +    1219           0 :   catch (std::runtime_error& exrun) {
    +    1220           0 :     msg.heading = 0;
    +    1221             :   }
    +    1222           0 : }
    +    1223             : 
    +    1224             : //}
    +    1225             : 
    +    1226             : }  // namespace control_manager
    +    1227             : 
    +    1228             : }  // namespace mrs_uav_managers
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/control_manager/common/common.cpp.gcov.overview.html b/mrs_uav_managers/src/control_manager/common/common.cpp.gcov.overview.html new file mode 100644 index 0000000000..96cf02a42b --- /dev/null +++ b/mrs_uav_managers/src/control_manager/common/common.cpp.gcov.overview.html @@ -0,0 +1,327 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/control_manager/common/common.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_managers/src/control_manager/common/common.cpp.gcov.png b/mrs_uav_managers/src/control_manager/common/common.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..bff27e0e5ac701165b83f61178c4e29c824fd4a5 GIT binary patch literal 2462 zcmV;P31Rk$P);z49%p-CbxmTg(6tug{dq5hd~r=Ivw57sC+hh&G23lY-`(>z;!Y=1t+xGZ9UZC;SJjc|^dZ5R(q zg#f-@f3B_D-}m-MJ#7!G{ZRpK&+ChBw^s_n0Om>j{)s;f+Y|^qW@K^kSRtwQOYsb5 zT4ly5ZYd{pDe(+uT4ly5ZYiIOhzAu=7vdSrw91TD+=4ORK|GOYoGG5)MpA>BR+$-! zJDBN`85=4*s)h>4TDFS`X)x0&GgfgkzLF`PNCJi{o_A|wjrplA#u`;zgrRPk>2_q? z^pWwMO!45;D_1=0Z^v5ZhEWDQX8KB;7s;A$O%4kjLi_YKzgo41b4RAQKE5E0fZ9-3 zx-i$lOsmX*lwHP`PKak?utV_-W(G4~U}j7ogPBg5kv*p|GJDSGy7CE)BIkj^6B@{g z4YB{nKcVrBg%6&8=t3U{Gu<$AsVrB|sdywYgpN%oYIe!YN2$Z9{siQn%|xW1$AnZ) z9|tpSGV_IvoW5s;OFGh0DP+%)&hW|eqm4OITqnCQ*TGDy%#=?dq;iH%x;^H}asV>Abm}!+6JAD+3eJ*9!gPB&D@jPx3pL_Z9W`mg)nDIPr5uY0q zPiWa)h-Wajou~+#yjzDHj7extK6Ugf0y3z-_Zqts)?0M`|ruMmZjFf8D z^SJ4pf+rrwm--2sE3;nG2FSDpJ};0)s;X0lQYdDG$GcPz`N<3b^Ds(%O#m`6-nOao zo-yJKIr?1t7PdGe%jX(1Q6I3lQrw=*o8J{Grqw=rS-?LdQ!hFpC&$_rYh$MG6!F?wdq0n9w}!N9n1yRHK$G63_rHZ2BNUXFZ>786+yQOCIH z_*LE|RqMEIaks)1pZdG%b)Yds8Nen}TyDxFtWbB%pm9CipTYqrZw!S#^kgfXntzrm z^Ni}#8)7t{k6tz4d98_hBR@f6fnnZ2@s8^~dwL*08JFL_bqxi4?lk zY_5$$+?`(N6@;Z`&nd{nf=QrhY28mR3lt8EDC#Zb#4d!Gbv7zmfdxoMxQGt}tYTbu z%>^lr9A-?ucL$Bmb51D)oow0*wu3yTG$s5#mya{^i7uk3*J7?z@i3 zC27sv9!=$-kxe6=Rd6&Wx~?t9xGX(6QnIX1BQr0gco&T$e^dBRv|) zuIo&33`^*3LMm6wP6b>btpO7eGEwo)N2!OR_GFeb@|<=J(|I2L-eT*x?mD--M+QG8?qOi87xx^R&w3|u&mH7GjfUB~Qy-~WDNPH- zEijoMHc9+)51tzFyZ*ee%AeXoZsEOqSne9z5A*>IzsP4vK=aY5EEh>+C&mR#p~%AG zAe=e;NvVDA3rykLOBXby3i9E$#a@WUJ3p@h)3)%-r1VA4*_YBthOy3hbu`%-B$k%F ze|<}XnQCG&vo^&{G?B|IiKdkf5rWT8P zFqQ1WTn96)G6NiGp?80ecR-MU?Dh>u`srpD>PV3wbvV*u`Z$_|U9e1&+;<5pVk&e?FJgPH!A84+oMnc+x@ zR^YIa7+5^83ZY^YfhkW1r@n@-jNdmzMP;|J_7Z*%1x zO*Vn9QyBk`wZd8BBBDKA`Cq>pj2)%896(UZJql=JsZ#Izn1o2YOQRa#k^<~GEIg}Z zqz?xkyfYu3T58q+fRMZ(I*m;M1IvD1bk} c7@hn60so#xc0k3w@Bjb+07*qoM6N<$f~Ap`ZU6uP literal 0 HcmV?d00001 diff --git a/mrs_uav_managers/src/control_manager/common/index-detail-sort-f.html b/mrs_uav_managers/src/control_manager/common/index-detail-sort-f.html new file mode 100644 index 0000000000..745617042d --- /dev/null +++ b/mrs_uav_managers/src/control_manager/common/index-detail-sort-f.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/control_manager/common + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/control_manager/commonHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:24556743.2 %
    Date:2024-04-18 23:11:36Functions:223171.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    common.cpp +
    43.2%43.2%
    +
    43.2 %245 / 56771.0 %22 / 31
    <unnamed>43.2 %245 / 56771.0 %22 / 31
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/control_manager/common/index-detail-sort-l.html b/mrs_uav_managers/src/control_manager/common/index-detail-sort-l.html new file mode 100644 index 0000000000..1cabc60883 --- /dev/null +++ b/mrs_uav_managers/src/control_manager/common/index-detail-sort-l.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/control_manager/common + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/control_manager/commonHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:24556743.2 %
    Date:2024-04-18 23:11:36Functions:223171.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    common.cpp +
    43.2%43.2%
    +
    43.2 %245 / 56771.0 %22 / 31
    <unnamed>43.2 %245 / 56771.0 %22 / 31
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/control_manager/common/index-detail.html b/mrs_uav_managers/src/control_manager/common/index-detail.html new file mode 100644 index 0000000000..c54070b961 --- /dev/null +++ b/mrs_uav_managers/src/control_manager/common/index-detail.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/control_manager/common + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/control_manager/commonHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:24556743.2 %
    Date:2024-04-18 23:11:36Functions:223171.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    common.cpp +
    43.2%43.2%
    +
    43.2 %245 / 56771.0 %22 / 31
    <unnamed>43.2 %245 / 56771.0 %22 / 31
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/control_manager/common/index-sort-f.html b/mrs_uav_managers/src/control_manager/common/index-sort-f.html new file mode 100644 index 0000000000..ebb2fdf94a --- /dev/null +++ b/mrs_uav_managers/src/control_manager/common/index-sort-f.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/control_manager/common + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/control_manager/commonHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:24556743.2 %
    Date:2024-04-18 23:11:36Functions:223171.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    common.cpp +
    43.2%43.2%
    +
    43.2 %245 / 56771.0 %22 / 31
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/control_manager/common/index-sort-l.html b/mrs_uav_managers/src/control_manager/common/index-sort-l.html new file mode 100644 index 0000000000..affe3c88f2 --- /dev/null +++ b/mrs_uav_managers/src/control_manager/common/index-sort-l.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/control_manager/common + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/control_manager/commonHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:24556743.2 %
    Date:2024-04-18 23:11:36Functions:223171.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    common.cpp +
    43.2%43.2%
    +
    43.2 %245 / 56771.0 %22 / 31
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/control_manager/common/index.html b/mrs_uav_managers/src/control_manager/common/index.html new file mode 100644 index 0000000000..40654271e3 --- /dev/null +++ b/mrs_uav_managers/src/control_manager/common/index.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/control_manager/common + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/control_manager/commonHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:24556743.2 %
    Date:2024-04-18 23:11:36Functions:223171.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    common.cpp +
    43.2%43.2%
    +
    43.2 %245 / 56771.0 %22 / 31
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/control_manager/control_manager.cpp.func-sort-c.html b/mrs_uav_managers/src/control_manager/control_manager.cpp.func-sort-c.html new file mode 100644 index 0000000000..3044501779 --- /dev/null +++ b/mrs_uav_managers/src/control_manager/control_manager.cpp.func-sort-c.html @@ -0,0 +1,524 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/control_manager/control_manager.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/control_manager - control_manager.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:2326365363.7 %
    Date:2024-04-18 23:11:36Functions:7711169.4 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_managers::control_manager::ControlManager::parachuteSrv()0
    mrs_uav_managers::control_manager::ControlManager::callbackHover(std_srvs::TriggerRequest_<std::allocator<void> >&, std_srvs::TriggerResponse_<std::allocator<void> >&)0
    mrs_uav_managers::control_manager::ControlManager::loadConfigFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)0
    mrs_uav_managers::control_manager::ControlManager::timerPirouette(ros::TimerEvent const&)0
    mrs_uav_managers::control_manager::ControlManager::callbackGetMinZ(mrs_msgs::GetFloat64Request_<std::allocator<void> >&, mrs_msgs::GetFloat64Response_<std::allocator<void> >&)0
    mrs_uav_managers::control_manager::ControlManager::callbackGotoFcu(mrs_msgs::Vec4Request_<std::allocator<void> >&, mrs_msgs::Vec4Response_<std::allocator<void> >&)0
    mrs_uav_managers::control_manager::ControlManager::callbackSetMinZ(mrs_msgs::Float64StampedSrvRequest_<std::allocator<void> >&, mrs_msgs::Float64StampedSrvResponse_<std::allocator<void> >&)0
    mrs_uav_managers::control_manager::ControlManager::deployParachute[abi:cxx11]()0
    mrs_uav_managers::control_manager::ControlManager::timeoutUavState(double const&)0
    mrs_uav_managers::control_manager::ControlManager::callbackJoystick(boost::shared_ptr<sensor_msgs::Joy_<std::allocator<void> > const>)0
    mrs_uav_managers::control_manager::ControlManager::callbackOdometry(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>)0
    mrs_uav_managers::control_manager::ControlManager::callbackParachute(std_srvs::TriggerRequest_<std::allocator<void> >&, std_srvs::TriggerResponse_<std::allocator<void> >&)0
    mrs_uav_managers::control_manager::ControlManager::callbackPirouette(std_srvs::TriggerRequest_<std::allocator<void> >&, std_srvs::TriggerResponse_<std::allocator<void> >&)0
    mrs_uav_managers::control_manager::ControlManager::callbackSetHeading(mrs_msgs::Vec1Request_<std::allocator<void> >&, mrs_msgs::Vec1Response_<std::allocator<void> >&)0
    mrs_uav_managers::control_manager::ControlManager::callbackUseJoystick(std_srvs::TriggerRequest_<std::allocator<void> >&, std_srvs::TriggerResponse_<std::allocator<void> >&)0
    mrs_uav_managers::control_manager::ControlManager::callbackEnableBumper(std_srvs::SetBoolRequest_<std::allocator<void> >&, std_srvs::SetBoolResponse_<std::allocator<void> >&)0
    mrs_uav_managers::control_manager::ControlManager::callbackGotoAltitude(mrs_msgs::Vec1Request_<std::allocator<void> >&, mrs_msgs::Vec1Response_<std::allocator<void> >&)0
    mrs_uav_managers::control_manager::ControlManager::callbackTransformPose(mrs_msgs::TransformPoseSrvRequest_<std::allocator<void> >&, mrs_msgs::TransformPoseSrvResponse_<std::allocator<void> >&)0
    mrs_uav_managers::control_manager::ControlManager::callbackUseSafetyArea(std_srvs::SetBoolRequest_<std::allocator<void> >&, std_srvs::SetBoolResponse_<std::allocator<void> >&)0
    mrs_uav_managers::control_manager::ControlManager::callbackReferenceTopic(boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > const>)0
    mrs_uav_managers::control_manager::ControlManager::stopTrajectoryTracking[abi:cxx11]()0
    mrs_uav_managers::control_manager::ControlManager::callbackReferenceService(mrs_msgs::ReferenceStampedSrvRequest_<std::allocator<void> >&, mrs_msgs::ReferenceStampedSrvResponse_<std::allocator<void> >&)0
    mrs_uav_managers::control_manager::ControlManager::callbackTransformVector3(mrs_msgs::TransformVector3SrvRequest_<std::allocator<void> >&, mrs_msgs::TransformVector3SrvResponse_<std::allocator<void> >&)0
    mrs_uav_managers::control_manager::ControlManager::resumeTrajectoryTracking[abi:cxx11]()0
    mrs_uav_managers::control_manager::ControlManager::callbackValidateReference(mrs_msgs::ValidateReferenceRequest_<std::allocator<void> >&, mrs_msgs::ValidateReferenceResponse_<std::allocator<void> >&)0
    mrs_uav_managers::control_manager::ControlManager::callbackSetHeadingRelative(mrs_msgs::Vec1Request_<std::allocator<void> >&, mrs_msgs::Vec1Response_<std::allocator<void> >&)0
    mrs_uav_managers::control_manager::ControlManager::callbackTrackerResetStatic(std_srvs::TriggerRequest_<std::allocator<void> >&, std_srvs::TriggerResponse_<std::allocator<void> >&)0
    mrs_uav_managers::control_manager::ControlManager::callbackTransformReference(mrs_msgs::TransformReferenceSrvRequest_<std::allocator<void> >&, mrs_msgs::TransformReferenceSrvResponse_<std::allocator<void> >&)0
    mrs_uav_managers::control_manager::ControlManager::callbackValidateReferenceList(mrs_msgs::ValidateReferenceListRequest_<std::allocator<void> >&, mrs_msgs::ValidateReferenceListResponse_<std::allocator<void> >&)0
    mrs_uav_managers::control_manager::ControlManager::callbackStopTrajectoryTracking(std_srvs::TriggerRequest_<std::allocator<void> >&, std_srvs::TriggerResponse_<std::allocator<void> >&)0
    mrs_uav_managers::control_manager::ControlManager::callbackVelocityReferenceTopic(boost::shared_ptr<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > const>)0
    mrs_uav_managers::control_manager::ControlManager::callbackResumeTrajectoryTracking(std_srvs::TriggerRequest_<std::allocator<void> >&, std_srvs::TriggerResponse_<std::allocator<void> >&)0
    mrs_uav_managers::control_manager::ControlManager::callbackTrajectoryReferenceTopic(boost::shared_ptr<mrs_msgs::TrajectoryReference_<std::allocator<void> > const>)0
    mrs_uav_managers::control_manager::ControlManager::hover[abi:cxx11]()0
    mrs_uav_managers::control_manager::ControlManager::gotoTrajectoryStart[abi:cxx11]()1
    mrs_uav_managers::control_manager::ControlManager::startTrajectoryTracking[abi:cxx11]()1
    mrs_uav_managers::control_manager::ControlManager::callbackGotoTrajectoryStart(std_srvs::TriggerRequest_<std::allocator<void> >&, std_srvs::TriggerResponse_<std::allocator<void> >&)1
    mrs_uav_managers::control_manager::ControlManager::callbackStartTrajectoryTracking(std_srvs::TriggerRequest_<std::allocator<void> >&, std_srvs::TriggerResponse_<std::allocator<void> >&)1
    mrs_uav_managers::control_manager::ControlManager::callbackEland(std_srvs::TriggerRequest_<std::allocator<void> >&, std_srvs::TriggerResponse_<std::allocator<void> >&)2
    mrs_uav_managers::control_manager::ControlManager::callbackEHover(std_srvs::TriggerRequest_<std::allocator<void> >&, std_srvs::TriggerResponse_<std::allocator<void> >&)2
    mrs_uav_managers::control_manager::ControlManager::callbackFailsafe(std_srvs::TriggerRequest_<std::allocator<void> >&, std_srvs::TriggerResponse_<std::allocator<void> >&)4
    mrs_uav_managers::control_manager::ControlManager::setTrajectoryReference[abi:cxx11](mrs_msgs::TrajectoryReference_<std::allocator<void> >)4
    mrs_uav_managers::control_manager::ControlManager::callbackTrajectoryReferenceService(mrs_msgs::TrajectoryReferenceSrvRequest_<std::allocator<void> >&, mrs_msgs::TrajectoryReferenceSrvResponse_<std::allocator<void> >&)4
    mrs_uav_managers::control_manager::ControlManager::ehover[abi:cxx11]()4
    mrs_uav_managers::control_manager::ControlManager::callbackArm(std_srvs::SetBoolRequest_<std::allocator<void> >&, std_srvs::SetBoolResponse_<std::allocator<void> >&)7
    mrs_uav_managers::control_manager::ControlManager::callbackFailsafeEscalating(std_srvs::TriggerRequest_<std::allocator<void> >&, std_srvs::TriggerResponse_<std::allocator<void> >&)7
    mrs_uav_managers::control_manager::ControlManager::failsafe[abi:cxx11]()7
    mrs_uav_managers::control_manager::ControlManager::getNextEscFailsafeState()8
    mrs_uav_managers::control_manager::ControlManager::eland[abi:cxx11]()9
    mrs_uav_managers::control_manager::ControlManager::elandSrv()9
    mrs_uav_managers::control_manager::ControlManager::changeLandingState(mrs_uav_managers::control_manager::LandingStates_t)13
    mrs_uav_managers::control_manager::ControlManager::odometryCallbacksSrv(bool)16
    mrs_uav_managers::control_manager::ControlManager::isOffboard()18
    mrs_uav_managers::control_manager::ControlManager::arming[abi:cxx11](bool)18
    mrs_uav_managers::control_manager::ControlManager::callbackGotoRelative(mrs_msgs::Vec4Request_<std::allocator<void> >&, mrs_msgs::Vec4Response_<std::allocator<void> >&)23
    mrs_uav_managers::control_manager::ControlManager::callbackGoto(mrs_msgs::Vec4Request_<std::allocator<void> >&, mrs_msgs::Vec4Response_<std::allocator<void> >&)26
    mrs_uav_managers::control_manager::ControlManager::isPathToPointInSafetyArea2d(mrs_msgs::ReferenceStamped_<std::allocator<void> > const&, mrs_msgs::ReferenceStamped_<std::allocator<void> > const&)31
    mrs_uav_managers::control_manager::ControlManager::setReference[abi:cxx11](mrs_msgs::ReferenceStamped_<std::allocator<void> >)49
    mrs_uav_managers::control_manager::ControlManager::ungripSrv()69
    (anonymous namespace)::ProxyExec0::ProxyExec0()91
    mrs_uav_managers::control_manager::ControlManager::initialize()91
    mrs_uav_managers::control_manager::ControlManager::preinitialize()91
    mrs_uav_managers::control_manager::ControlManager::setConstraints(mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> > const&)91
    mrs_uav_managers::control_manager::ControlManager::onInit()91
    mrs_uav_managers::control_manager::ControlManager::callbackToggleOutput(std_srvs::SetBoolRequest_<std::allocator<void> >&, std_srvs::SetBoolResponse_<std::allocator<void> >&)92
    mrs_uav_managers::control_manager::ControlManager::callbackSetConstraints(mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> >&, mrs_msgs::DynamicsConstraintsSrvResponse_<std::allocator<void> >&)94
    mrs_uav_managers::control_manager::ControlManager::callbackEmergencyReference(mrs_msgs::ReferenceStampedSrvRequest_<std::allocator<void> >&, mrs_msgs::ReferenceStampedSrvResponse_<std::allocator<void> >&)94
    mrs_uav_managers::control_manager::ControlManager::setCallbacks(bool)95
    mrs_uav_managers::control_manager::ControlManager::callbackEnableCallbacks(std_srvs::SetBoolRequest_<std::allocator<void> >&, std_srvs::SetBoolResponse_<std::allocator<void> >&)95
    mrs_uav_managers::control_manager::ControlManager::toggleOutput(bool const&)113
    mrs_uav_managers::control_manager::ControlManager::bumperGetSectorId(double const&, double const&, double const&)120
    mrs_uav_managers::control_manager::ControlManager::escalatingFailsafe[abi:cxx11]()148
    mrs_uav_managers::control_manager::ControlManager::timerHwApiCapabilities(ros::TimerEvent const&)161
    mrs_uav_managers::control_manager::ControlManager::callbackSwitchController(mrs_msgs::StringRequest_<std::allocator<void> >&, mrs_msgs::StringResponse_<std::allocator<void> >&)177
    mrs_uav_managers::control_manager::ControlManager::callbackSwitchTracker(mrs_msgs::StringRequest_<std::allocator<void> >&, mrs_msgs::StringResponse_<std::allocator<void> >&)178
    mrs_uav_managers::control_manager::ControlManager::initializeControlOutput()192
    mrs_uav_managers::control_manager::ControlManager::switchTracker(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)211
    mrs_uav_managers::control_manager::ControlManager::switchController(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)212
    mrs_uav_managers::control_manager::ControlManager::setConstraintsToTrackers(mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> > const&)298
    mrs_uav_managers::control_manager::ControlManager::bumperPushFromObstacle()299
    mrs_uav_managers::control_manager::ControlManager::setConstraintsToControllers(mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> > const&)360
    mrs_uav_managers::control_manager::ControllerParams::ControllerParams(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, double, double, double, bool)455
    mrs_uav_managers::control_manager::ControlManager::setVelocityReference[abi:cxx11](mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > const&)468
    mrs_uav_managers::control_manager::ControlManager::velocityReferenceToReference(mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > const&)468
    mrs_uav_managers::control_manager::ControlManager::callbackVelocityReferenceService(mrs_msgs::VelocityReferenceStampedSrvRequest_<std::allocator<void> >&, mrs_msgs::VelocityReferenceStampedSrvResponse_<std::allocator<void> >&)468
    mrs_uav_managers::control_manager::ControlManager::getMass()471
    mrs_uav_managers::control_manager::ControlManager::timerEland(ros::TimerEvent const&)494
    mrs_uav_managers::control_manager::ControlManager::isPathToPointInSafetyArea3d(mrs_msgs::ReferenceStamped_<std::allocator<void> > const&, mrs_msgs::ReferenceStamped_<std::allocator<void> > const&)517
    mrs_uav_managers::control_manager::TrackerParams::TrackerParams(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool)547
    mrs_uav_managers::control_manager::ControlManager::isPointInSafetyArea3d(mrs_msgs::ReferenceStamped_<std::allocator<void> > const&)1161
    mrs_uav_managers::control_manager::ControlManager::timerBumper(ros::TimerEvent const&)2167
    mrs_uav_managers::control_manager::ControlManager::timerFailsafe(ros::TimerEvent const&)9711
    mrs_uav_managers::control_manager::ControlManager::callbackValidateReference2d(mrs_msgs::ValidateReferenceRequest_<std::allocator<void> >&, mrs_msgs::ValidateReferenceResponse_<std::allocator<void> >&)9788
    mrs_uav_managers::control_manager::ControlManager::isPointInSafetyArea2d(mrs_msgs::ReferenceStamped_<std::allocator<void> > const&)9942
    mrs_uav_managers::control_manager::ControlManager::getMaxZ(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)11667
    mrs_uav_managers::control_manager::ControlManager::getMinZ(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)11667
    mrs_uav_managers::control_manager::ControlManager::timerStatus(ros::TimerEvent const&)16264
    mrs_uav_managers::control_manager::ControlManager::publishDiagnostics()16355
    mrs_uav_managers::control_manager::ControlManager::isFlyingNormally()16660
    mrs_uav_managers::control_manager::ControlManager::callbackRC(boost::shared_ptr<mrs_msgs::HwApiRcChannels_<std::allocator<void> > const>)21072
    mrs_uav_managers::control_manager::ControlManager::timerJoystick(ros::TimerEvent const&)57735
    mrs_uav_managers::control_manager::ControlManager::callbackGNSS(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>)90132
    mrs_uav_managers::control_manager::ControlManager::enforceControllersConstraints(mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> > const&)119764
    mrs_uav_managers::control_manager::ControlManager::updateTrackers()120314
    mrs_uav_managers::control_manager::ControlManager::asyncControl()129578
    mrs_uav_managers::control_manager::ControlManager::updateControllers(mrs_msgs::UavState_<std::allocator<void> > const&)130025
    mrs_uav_managers::control_manager::ControlManager::publishControlReferenceOdom(std::optional<mrs_msgs::TrackerCommand_<std::allocator<void> > > const&, mrs_uav_managers::Controller::ControlOutput const&)130025
    mrs_uav_managers::control_manager::ControlManager::publish()130025
    mrs_uav_managers::control_manager::ControlManager::callbackUavState(boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const>)155211
    mrs_uav_managers::control_manager::ControlManager::timerSafety(ros::TimerEvent const&)297644
    mrs_uav_managers::control_manager::ControlManager::callbackHwApiStatus(boost::shared_ptr<mrs_msgs::HwApiStatus_<std::allocator<void> > const>)383390
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/control_manager/control_manager.cpp.func.html b/mrs_uav_managers/src/control_manager/control_manager.cpp.func.html new file mode 100644 index 0000000000..fc4629ed91 --- /dev/null +++ b/mrs_uav_managers/src/control_manager/control_manager.cpp.func.html @@ -0,0 +1,524 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/control_manager/control_manager.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/control_manager - control_manager.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:2326365363.7 %
    Date:2024-04-18 23:11:36Functions:7711169.4 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    (anonymous namespace)::ProxyExec0::ProxyExec0()91
    mrs_uav_managers::control_manager::TrackerParams::TrackerParams(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool)547
    mrs_uav_managers::control_manager::ControlManager::callbackRC(boost::shared_ptr<mrs_msgs::HwApiRcChannels_<std::allocator<void> > const>)21072
    mrs_uav_managers::control_manager::ControlManager::initialize()91
    mrs_uav_managers::control_manager::ControlManager::isOffboard()18
    mrs_uav_managers::control_manager::ControlManager::timerEland(ros::TimerEvent const&)494
    mrs_uav_managers::control_manager::ControlManager::callbackArm(std_srvs::SetBoolRequest_<std::allocator<void> >&, std_srvs::SetBoolResponse_<std::allocator<void> >&)7
    mrs_uav_managers::control_manager::ControlManager::timerBumper(ros::TimerEvent const&)2167
    mrs_uav_managers::control_manager::ControlManager::timerSafety(ros::TimerEvent const&)297644
    mrs_uav_managers::control_manager::ControlManager::timerStatus(ros::TimerEvent const&)16264
    mrs_uav_managers::control_manager::ControlManager::asyncControl()129578
    mrs_uav_managers::control_manager::ControlManager::callbackGNSS(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>)90132
    mrs_uav_managers::control_manager::ControlManager::callbackGoto(mrs_msgs::Vec4Request_<std::allocator<void> >&, mrs_msgs::Vec4Response_<std::allocator<void> >&)26
    mrs_uav_managers::control_manager::ControlManager::parachuteSrv()0
    mrs_uav_managers::control_manager::ControlManager::setCallbacks(bool)95
    mrs_uav_managers::control_manager::ControlManager::setReference[abi:cxx11](mrs_msgs::ReferenceStamped_<std::allocator<void> >)49
    mrs_uav_managers::control_manager::ControlManager::toggleOutput(bool const&)113
    mrs_uav_managers::control_manager::ControlManager::callbackEland(std_srvs::TriggerRequest_<std::allocator<void> >&, std_srvs::TriggerResponse_<std::allocator<void> >&)2
    mrs_uav_managers::control_manager::ControlManager::callbackHover(std_srvs::TriggerRequest_<std::allocator<void> >&, std_srvs::TriggerResponse_<std::allocator<void> >&)0
    mrs_uav_managers::control_manager::ControlManager::preinitialize()91
    mrs_uav_managers::control_manager::ControlManager::switchTracker(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)211
    mrs_uav_managers::control_manager::ControlManager::timerFailsafe(ros::TimerEvent const&)9711
    mrs_uav_managers::control_manager::ControlManager::timerJoystick(ros::TimerEvent const&)57735
    mrs_uav_managers::control_manager::ControlManager::callbackEHover(std_srvs::TriggerRequest_<std::allocator<void> >&, std_srvs::TriggerResponse_<std::allocator<void> >&)2
    mrs_uav_managers::control_manager::ControlManager::loadConfigFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)0
    mrs_uav_managers::control_manager::ControlManager::setConstraints(mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> > const&)91
    mrs_uav_managers::control_manager::ControlManager::timerPirouette(ros::TimerEvent const&)0
    mrs_uav_managers::control_manager::ControlManager::updateTrackers()120314
    mrs_uav_managers::control_manager::ControlManager::callbackGetMinZ(mrs_msgs::GetFloat64Request_<std::allocator<void> >&, mrs_msgs::GetFloat64Response_<std::allocator<void> >&)0
    mrs_uav_managers::control_manager::ControlManager::callbackGotoFcu(mrs_msgs::Vec4Request_<std::allocator<void> >&, mrs_msgs::Vec4Response_<std::allocator<void> >&)0
    mrs_uav_managers::control_manager::ControlManager::callbackSetMinZ(mrs_msgs::Float64StampedSrvRequest_<std::allocator<void> >&, mrs_msgs::Float64StampedSrvResponse_<std::allocator<void> >&)0
    mrs_uav_managers::control_manager::ControlManager::deployParachute[abi:cxx11]()0
    mrs_uav_managers::control_manager::ControlManager::timeoutUavState(double const&)0
    mrs_uav_managers::control_manager::ControlManager::callbackFailsafe(std_srvs::TriggerRequest_<std::allocator<void> >&, std_srvs::TriggerResponse_<std::allocator<void> >&)4
    mrs_uav_managers::control_manager::ControlManager::callbackJoystick(boost::shared_ptr<sensor_msgs::Joy_<std::allocator<void> > const>)0
    mrs_uav_managers::control_manager::ControlManager::callbackOdometry(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>)0
    mrs_uav_managers::control_manager::ControlManager::callbackUavState(boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const>)155211
    mrs_uav_managers::control_manager::ControlManager::isFlyingNormally()16660
    mrs_uav_managers::control_manager::ControlManager::switchController(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)212
    mrs_uav_managers::control_manager::ControlManager::bumperGetSectorId(double const&, double const&, double const&)120
    mrs_uav_managers::control_manager::ControlManager::callbackParachute(std_srvs::TriggerRequest_<std::allocator<void> >&, std_srvs::TriggerResponse_<std::allocator<void> >&)0
    mrs_uav_managers::control_manager::ControlManager::callbackPirouette(std_srvs::TriggerRequest_<std::allocator<void> >&, std_srvs::TriggerResponse_<std::allocator<void> >&)0
    mrs_uav_managers::control_manager::ControlManager::updateControllers(mrs_msgs::UavState_<std::allocator<void> > const&)130025
    mrs_uav_managers::control_manager::ControlManager::callbackSetHeading(mrs_msgs::Vec1Request_<std::allocator<void> >&, mrs_msgs::Vec1Response_<std::allocator<void> >&)0
    mrs_uav_managers::control_manager::ControlManager::changeLandingState(mrs_uav_managers::control_manager::LandingStates_t)13
    mrs_uav_managers::control_manager::ControlManager::escalatingFailsafe[abi:cxx11]()148
    mrs_uav_managers::control_manager::ControlManager::publishDiagnostics()16355
    mrs_uav_managers::control_manager::ControlManager::callbackHwApiStatus(boost::shared_ptr<mrs_msgs::HwApiStatus_<std::allocator<void> > const>)383390
    mrs_uav_managers::control_manager::ControlManager::callbackUseJoystick(std_srvs::TriggerRequest_<std::allocator<void> >&, std_srvs::TriggerResponse_<std::allocator<void> >&)0
    mrs_uav_managers::control_manager::ControlManager::gotoTrajectoryStart[abi:cxx11]()1
    mrs_uav_managers::control_manager::ControlManager::callbackEnableBumper(std_srvs::SetBoolRequest_<std::allocator<void> >&, std_srvs::SetBoolResponse_<std::allocator<void> >&)0
    mrs_uav_managers::control_manager::ControlManager::callbackGotoAltitude(mrs_msgs::Vec1Request_<std::allocator<void> >&, mrs_msgs::Vec1Response_<std::allocator<void> >&)0
    mrs_uav_managers::control_manager::ControlManager::callbackGotoRelative(mrs_msgs::Vec4Request_<std::allocator<void> >&, mrs_msgs::Vec4Response_<std::allocator<void> >&)23
    mrs_uav_managers::control_manager::ControlManager::callbackToggleOutput(std_srvs::SetBoolRequest_<std::allocator<void> >&, std_srvs::SetBoolResponse_<std::allocator<void> >&)92
    mrs_uav_managers::control_manager::ControlManager::odometryCallbacksSrv(bool)16
    mrs_uav_managers::control_manager::ControlManager::setVelocityReference[abi:cxx11](mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > const&)468
    mrs_uav_managers::control_manager::ControlManager::callbackSwitchTracker(mrs_msgs::StringRequest_<std::allocator<void> >&, mrs_msgs::StringResponse_<std::allocator<void> >&)178
    mrs_uav_managers::control_manager::ControlManager::callbackTransformPose(mrs_msgs::TransformPoseSrvRequest_<std::allocator<void> >&, mrs_msgs::TransformPoseSrvResponse_<std::allocator<void> >&)0
    mrs_uav_managers::control_manager::ControlManager::callbackUseSafetyArea(std_srvs::SetBoolRequest_<std::allocator<void> >&, std_srvs::SetBoolResponse_<std::allocator<void> >&)0
    mrs_uav_managers::control_manager::ControlManager::isPointInSafetyArea2d(mrs_msgs::ReferenceStamped_<std::allocator<void> > const&)9942
    mrs_uav_managers::control_manager::ControlManager::isPointInSafetyArea3d(mrs_msgs::ReferenceStamped_<std::allocator<void> > const&)1161
    mrs_uav_managers::control_manager::ControlManager::bumperPushFromObstacle()299
    mrs_uav_managers::control_manager::ControlManager::callbackReferenceTopic(boost::shared_ptr<mrs_msgs::ReferenceStamped_<std::allocator<void> > const>)0
    mrs_uav_managers::control_manager::ControlManager::callbackSetConstraints(mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> >&, mrs_msgs::DynamicsConstraintsSrvResponse_<std::allocator<void> >&)94
    mrs_uav_managers::control_manager::ControlManager::setTrajectoryReference[abi:cxx11](mrs_msgs::TrajectoryReference_<std::allocator<void> >)4
    mrs_uav_managers::control_manager::ControlManager::stopTrajectoryTracking[abi:cxx11]()0
    mrs_uav_managers::control_manager::ControlManager::timerHwApiCapabilities(ros::TimerEvent const&)161
    mrs_uav_managers::control_manager::ControlManager::callbackEnableCallbacks(std_srvs::SetBoolRequest_<std::allocator<void> >&, std_srvs::SetBoolResponse_<std::allocator<void> >&)95
    mrs_uav_managers::control_manager::ControlManager::getNextEscFailsafeState()8
    mrs_uav_managers::control_manager::ControlManager::initializeControlOutput()192
    mrs_uav_managers::control_manager::ControlManager::startTrajectoryTracking[abi:cxx11]()1
    mrs_uav_managers::control_manager::ControlManager::callbackReferenceService(mrs_msgs::ReferenceStampedSrvRequest_<std::allocator<void> >&, mrs_msgs::ReferenceStampedSrvResponse_<std::allocator<void> >&)0
    mrs_uav_managers::control_manager::ControlManager::callbackSwitchController(mrs_msgs::StringRequest_<std::allocator<void> >&, mrs_msgs::StringResponse_<std::allocator<void> >&)177
    mrs_uav_managers::control_manager::ControlManager::callbackTransformVector3(mrs_msgs::TransformVector3SrvRequest_<std::allocator<void> >&, mrs_msgs::TransformVector3SrvResponse_<std::allocator<void> >&)0
    mrs_uav_managers::control_manager::ControlManager::resumeTrajectoryTracking[abi:cxx11]()0
    mrs_uav_managers::control_manager::ControlManager::setConstraintsToTrackers(mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> > const&)298
    mrs_uav_managers::control_manager::ControlManager::callbackValidateReference(mrs_msgs::ValidateReferenceRequest_<std::allocator<void> >&, mrs_msgs::ValidateReferenceResponse_<std::allocator<void> >&)0
    mrs_uav_managers::control_manager::ControlManager::callbackEmergencyReference(mrs_msgs::ReferenceStampedSrvRequest_<std::allocator<void> >&, mrs_msgs::ReferenceStampedSrvResponse_<std::allocator<void> >&)94
    mrs_uav_managers::control_manager::ControlManager::callbackFailsafeEscalating(std_srvs::TriggerRequest_<std::allocator<void> >&, std_srvs::TriggerResponse_<std::allocator<void> >&)7
    mrs_uav_managers::control_manager::ControlManager::callbackSetHeadingRelative(mrs_msgs::Vec1Request_<std::allocator<void> >&, mrs_msgs::Vec1Response_<std::allocator<void> >&)0
    mrs_uav_managers::control_manager::ControlManager::callbackTrackerResetStatic(std_srvs::TriggerRequest_<std::allocator<void> >&, std_srvs::TriggerResponse_<std::allocator<void> >&)0
    mrs_uav_managers::control_manager::ControlManager::callbackTransformReference(mrs_msgs::TransformReferenceSrvRequest_<std::allocator<void> >&, mrs_msgs::TransformReferenceSrvResponse_<std::allocator<void> >&)0
    mrs_uav_managers::control_manager::ControlManager::callbackGotoTrajectoryStart(std_srvs::TriggerRequest_<std::allocator<void> >&, std_srvs::TriggerResponse_<std::allocator<void> >&)1
    mrs_uav_managers::control_manager::ControlManager::callbackValidateReference2d(mrs_msgs::ValidateReferenceRequest_<std::allocator<void> >&, mrs_msgs::ValidateReferenceResponse_<std::allocator<void> >&)9788
    mrs_uav_managers::control_manager::ControlManager::isPathToPointInSafetyArea2d(mrs_msgs::ReferenceStamped_<std::allocator<void> > const&, mrs_msgs::ReferenceStamped_<std::allocator<void> > const&)31
    mrs_uav_managers::control_manager::ControlManager::isPathToPointInSafetyArea3d(mrs_msgs::ReferenceStamped_<std::allocator<void> > const&, mrs_msgs::ReferenceStamped_<std::allocator<void> > const&)517
    mrs_uav_managers::control_manager::ControlManager::publishControlReferenceOdom(std::optional<mrs_msgs::TrackerCommand_<std::allocator<void> > > const&, mrs_uav_managers::Controller::ControlOutput const&)130025
    mrs_uav_managers::control_manager::ControlManager::setConstraintsToControllers(mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> > const&)360
    mrs_uav_managers::control_manager::ControlManager::velocityReferenceToReference(mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > const&)468
    mrs_uav_managers::control_manager::ControlManager::callbackValidateReferenceList(mrs_msgs::ValidateReferenceListRequest_<std::allocator<void> >&, mrs_msgs::ValidateReferenceListResponse_<std::allocator<void> >&)0
    mrs_uav_managers::control_manager::ControlManager::enforceControllersConstraints(mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> > const&)119764
    mrs_uav_managers::control_manager::ControlManager::callbackStopTrajectoryTracking(std_srvs::TriggerRequest_<std::allocator<void> >&, std_srvs::TriggerResponse_<std::allocator<void> >&)0
    mrs_uav_managers::control_manager::ControlManager::callbackVelocityReferenceTopic(boost::shared_ptr<mrs_msgs::VelocityReferenceStamped_<std::allocator<void> > const>)0
    mrs_uav_managers::control_manager::ControlManager::callbackStartTrajectoryTracking(std_srvs::TriggerRequest_<std::allocator<void> >&, std_srvs::TriggerResponse_<std::allocator<void> >&)1
    mrs_uav_managers::control_manager::ControlManager::callbackResumeTrajectoryTracking(std_srvs::TriggerRequest_<std::allocator<void> >&, std_srvs::TriggerResponse_<std::allocator<void> >&)0
    mrs_uav_managers::control_manager::ControlManager::callbackTrajectoryReferenceTopic(boost::shared_ptr<mrs_msgs::TrajectoryReference_<std::allocator<void> > const>)0
    mrs_uav_managers::control_manager::ControlManager::callbackVelocityReferenceService(mrs_msgs::VelocityReferenceStampedSrvRequest_<std::allocator<void> >&, mrs_msgs::VelocityReferenceStampedSrvResponse_<std::allocator<void> >&)468
    mrs_uav_managers::control_manager::ControlManager::callbackTrajectoryReferenceService(mrs_msgs::TrajectoryReferenceSrvRequest_<std::allocator<void> >&, mrs_msgs::TrajectoryReferenceSrvResponse_<std::allocator<void> >&)4
    mrs_uav_managers::control_manager::ControlManager::eland[abi:cxx11]()9
    mrs_uav_managers::control_manager::ControlManager::hover[abi:cxx11]()0
    mrs_uav_managers::control_manager::ControlManager::arming[abi:cxx11](bool)18
    mrs_uav_managers::control_manager::ControlManager::ehover[abi:cxx11]()4
    mrs_uav_managers::control_manager::ControlManager::onInit()91
    mrs_uav_managers::control_manager::ControlManager::getMass()471
    mrs_uav_managers::control_manager::ControlManager::getMaxZ(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)11667
    mrs_uav_managers::control_manager::ControlManager::getMinZ(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)11667
    mrs_uav_managers::control_manager::ControlManager::publish()130025
    mrs_uav_managers::control_manager::ControlManager::elandSrv()9
    mrs_uav_managers::control_manager::ControlManager::failsafe[abi:cxx11]()7
    mrs_uav_managers::control_manager::ControlManager::ungripSrv()69
    mrs_uav_managers::control_manager::ControllerParams::ControllerParams(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, double, double, double, bool)455
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/control_manager/control_manager.cpp.gcov.frameset.html b/mrs_uav_managers/src/control_manager/control_manager.cpp.gcov.frameset.html new file mode 100644 index 0000000000..34fe5178be --- /dev/null +++ b/mrs_uav_managers/src/control_manager/control_manager.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/control_manager/control_manager.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_managers/src/control_manager/control_manager.cpp.gcov.html b/mrs_uav_managers/src/control_manager/control_manager.cpp.gcov.html new file mode 100644 index 0000000000..f24b029d5c --- /dev/null +++ b/mrs_uav_managers/src/control_manager/control_manager.cpp.gcov.html @@ -0,0 +1,8847 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/control_manager/control_manager.cpp + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/control_manager - control_manager.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:2326365363.7 %
    Date:2024-04-18 23:11:36Functions:7711169.4 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : /* includes //{ */
    +       2             : 
    +       3             : #include <ros/ros.h>
    +       4             : #include <ros/package.h>
    +       5             : #include <nodelet/nodelet.h>
    +       6             : 
    +       7             : #include <mrs_uav_managers/control_manager/common.h>
    +       8             : #include <control_manager/output_publisher.h>
    +       9             : 
    +      10             : #include <mrs_uav_managers/controller.h>
    +      11             : #include <mrs_uav_managers/tracker.h>
    +      12             : 
    +      13             : #include <mrs_msgs/String.h>
    +      14             : #include <mrs_msgs/Float64Stamped.h>
    +      15             : #include <mrs_msgs/Float64StampedSrv.h>
    +      16             : #include <mrs_msgs/ObstacleSectors.h>
    +      17             : #include <mrs_msgs/BoolStamped.h>
    +      18             : #include <mrs_msgs/ControlManagerDiagnostics.h>
    +      19             : #include <mrs_msgs/DynamicsConstraints.h>
    +      20             : #include <mrs_msgs/ControlError.h>
    +      21             : #include <mrs_msgs/GetFloat64.h>
    +      22             : #include <mrs_msgs/ValidateReference.h>
    +      23             : #include <mrs_msgs/ValidateReferenceList.h>
    +      24             : #include <mrs_msgs/TrackerCommand.h>
    +      25             : #include <mrs_msgs/EstimatorInput.h>
    +      26             : 
    +      27             : #include <geometry_msgs/Point32.h>
    +      28             : #include <geometry_msgs/TwistStamped.h>
    +      29             : #include <geometry_msgs/PoseArray.h>
    +      30             : #include <geometry_msgs/Vector3Stamped.h>
    +      31             : 
    +      32             : #include <nav_msgs/Odometry.h>
    +      33             : 
    +      34             : #include <sensor_msgs/Joy.h>
    +      35             : #include <sensor_msgs/NavSatFix.h>
    +      36             : 
    +      37             : #include <mrs_lib/safety_zone/safety_zone.h>
    +      38             : #include <mrs_lib/profiler.h>
    +      39             : #include <mrs_lib/param_loader.h>
    +      40             : #include <mrs_lib/utils.h>
    +      41             : #include <mrs_lib/mutex.h>
    +      42             : #include <mrs_lib/transformer.h>
    +      43             : #include <mrs_lib/geometry/misc.h>
    +      44             : #include <mrs_lib/geometry/cyclic.h>
    +      45             : #include <mrs_lib/attitude_converter.h>
    +      46             : #include <mrs_lib/subscribe_handler.h>
    +      47             : #include <mrs_lib/msg_extractor.h>
    +      48             : #include <mrs_lib/quadratic_throttle_model.h>
    +      49             : #include <mrs_lib/publisher_handler.h>
    +      50             : #include <mrs_lib/service_client_handler.h>
    +      51             : 
    +      52             : #include <mrs_msgs/HwApiCapabilities.h>
    +      53             : #include <mrs_msgs/HwApiStatus.h>
    +      54             : #include <mrs_msgs/HwApiRcChannels.h>
    +      55             : 
    +      56             : #include <mrs_msgs/HwApiActuatorCmd.h>
    +      57             : #include <mrs_msgs/HwApiControlGroupCmd.h>
    +      58             : #include <mrs_msgs/HwApiAttitudeRateCmd.h>
    +      59             : #include <mrs_msgs/HwApiAttitudeCmd.h>
    +      60             : #include <mrs_msgs/HwApiAccelerationHdgRateCmd.h>
    +      61             : #include <mrs_msgs/HwApiAccelerationHdgCmd.h>
    +      62             : #include <mrs_msgs/HwApiVelocityHdgRateCmd.h>
    +      63             : #include <mrs_msgs/HwApiVelocityHdgCmd.h>
    +      64             : #include <mrs_msgs/HwApiPositionCmd.h>
    +      65             : 
    +      66             : #include <std_msgs/Float64.h>
    +      67             : 
    +      68             : #include <future>
    +      69             : 
    +      70             : #include <pluginlib/class_loader.h>
    +      71             : 
    +      72             : #include <nodelet/loader.h>
    +      73             : 
    +      74             : #include <eigen3/Eigen/Eigen>
    +      75             : 
    +      76             : #include <visualization_msgs/Marker.h>
    +      77             : #include <visualization_msgs/MarkerArray.h>
    +      78             : 
    +      79             : #include <mrs_msgs/Reference.h>
    +      80             : #include <mrs_msgs/ReferenceStamped.h>
    +      81             : #include <mrs_msgs/ReferenceList.h>
    +      82             : #include <mrs_msgs/TrajectoryReference.h>
    +      83             : 
    +      84             : #include <mrs_msgs/ReferenceStampedSrv.h>
    +      85             : #include <mrs_msgs/ReferenceStampedSrvRequest.h>
    +      86             : #include <mrs_msgs/ReferenceStampedSrvResponse.h>
    +      87             : 
    +      88             : #include <mrs_msgs/VelocityReferenceStampedSrv.h>
    +      89             : #include <mrs_msgs/VelocityReferenceStampedSrvRequest.h>
    +      90             : #include <mrs_msgs/VelocityReferenceStampedSrvResponse.h>
    +      91             : 
    +      92             : #include <mrs_msgs/TransformReferenceSrv.h>
    +      93             : #include <mrs_msgs/TransformReferenceSrvRequest.h>
    +      94             : #include <mrs_msgs/TransformReferenceSrvResponse.h>
    +      95             : 
    +      96             : #include <mrs_msgs/TransformPoseSrv.h>
    +      97             : #include <mrs_msgs/TransformPoseSrvRequest.h>
    +      98             : #include <mrs_msgs/TransformPoseSrvResponse.h>
    +      99             : 
    +     100             : #include <mrs_msgs/TransformVector3Srv.h>
    +     101             : #include <mrs_msgs/TransformVector3SrvRequest.h>
    +     102             : #include <mrs_msgs/TransformVector3SrvResponse.h>
    +     103             : 
    +     104             : #include <mrs_msgs/Float64StampedSrv.h>
    +     105             : #include <mrs_msgs/Float64StampedSrvRequest.h>
    +     106             : #include <mrs_msgs/Float64StampedSrvResponse.h>
    +     107             : 
    +     108             : #include <mrs_msgs/Vec4.h>
    +     109             : #include <mrs_msgs/Vec4Request.h>
    +     110             : #include <mrs_msgs/Vec4Response.h>
    +     111             : 
    +     112             : #include <mrs_msgs/Vec1.h>
    +     113             : #include <mrs_msgs/Vec1Request.h>
    +     114             : #include <mrs_msgs/Vec1Response.h>
    +     115             : 
    +     116             : //}
    +     117             : 
    +     118             : /* defines //{ */
    +     119             : 
    +     120             : #define TAU 2 * M_PI
    +     121             : #define REF_X 0
    +     122             : #define REF_Y 1
    +     123             : #define REF_Z 2
    +     124             : #define REF_HEADING 3
    +     125             : #define ELAND_STR "eland"
    +     126             : #define EHOVER_STR "ehover"
    +     127             : #define ESCALATING_FAILSAFE_STR "escalating_failsafe"
    +     128             : #define FAILSAFE_STR "failsafe"
    +     129             : #define INPUT_UAV_STATE 0
    +     130             : #define INPUT_ODOMETRY 1
    +     131             : #define RC_DEADBAND 0.2
    +     132             : 
    +     133             : //}
    +     134             : 
    +     135             : /* using //{ */
    +     136             : 
    +     137             : using vec2_t = mrs_lib::geometry::vec_t<2>;
    +     138             : using vec3_t = mrs_lib::geometry::vec_t<3>;
    +     139             : 
    +     140             : using radians  = mrs_lib::geometry::radians;
    +     141             : using sradians = mrs_lib::geometry::sradians;
    +     142             : 
    +     143             : //}
    +     144             : 
    +     145             : namespace mrs_uav_managers
    +     146             : {
    +     147             : 
    +     148             : namespace control_manager
    +     149             : {
    +     150             : 
    +     151             : /* //{ class ControlManager */
    +     152             : 
    +     153             : // state machine
    +     154             : typedef enum
    +     155             : {
    +     156             : 
    +     157             :   IDLE_STATE,
    +     158             :   LANDING_STATE,
    +     159             : 
    +     160             : } LandingStates_t;
    +     161             : 
    +     162             : const char* state_names[2] = {"IDLING", "LANDING"};
    +     163             : 
    +     164             : // state machine
    +     165             : typedef enum
    +     166             : {
    +     167             : 
    +     168             :   FCU_FRAME,
    +     169             :   RELATIVE_FRAME,
    +     170             :   ABSOLUTE_FRAME
    +     171             : 
    +     172             : } ReferenceFrameType_t;
    +     173             : 
    +     174             : // state machine
    +     175             : typedef enum
    +     176             : {
    +     177             : 
    +     178             :   ESC_NONE_STATE     = 0,
    +     179             :   ESC_EHOVER_STATE   = 1,
    +     180             :   ESC_ELAND_STATE    = 2,
    +     181             :   ESC_FAILSAFE_STATE = 3,
    +     182             :   ESC_FINISHED_STATE = 4,
    +     183             : 
    +     184             : } EscalatingFailsafeStates_t;
    +     185             : 
    +     186             : /* class ControllerParams() //{ */
    +     187             : 
    +     188             : class ControllerParams {
    +     189             : 
    +     190             : public:
    +     191             :   ControllerParams(std::string address, std::string name_space, double eland_threshold, double failsafe_threshold, double odometry_innovation_threshold,
    +     192             :                    bool human_switchable);
    +     193             : 
    +     194             : public:
    +     195             :   double      failsafe_threshold;
    +     196             :   double      eland_threshold;
    +     197             :   double      odometry_innovation_threshold;
    +     198             :   std::string address;
    +     199             :   std::string name_space;
    +     200             :   bool        human_switchable;
    +     201             : };
    +     202             : 
    +     203         455 : ControllerParams::ControllerParams(std::string address, std::string name_space, double eland_threshold, double failsafe_threshold,
    +     204         455 :                                    double odometry_innovation_threshold, bool human_switchable) {
    +     205             : 
    +     206         455 :   this->eland_threshold               = eland_threshold;
    +     207         455 :   this->odometry_innovation_threshold = odometry_innovation_threshold;
    +     208         455 :   this->failsafe_threshold            = failsafe_threshold;
    +     209         455 :   this->address                       = address;
    +     210         455 :   this->name_space                    = name_space;
    +     211         455 :   this->human_switchable              = human_switchable;
    +     212         455 : }
    +     213             : 
    +     214             : //}
    +     215             : 
    +     216             : /* class TrackerParams() //{ */
    +     217             : 
    +     218             : class TrackerParams {
    +     219             : 
    +     220             : public:
    +     221             :   TrackerParams(std::string address, std::string name_space, bool human_switchable);
    +     222             : 
    +     223             : public:
    +     224             :   std::string address;
    +     225             :   std::string name_space;
    +     226             :   bool        human_switchable;
    +     227             : };
    +     228             : 
    +     229         547 : TrackerParams::TrackerParams(std::string address, std::string name_space, bool human_switchable) {
    +     230             : 
    +     231         547 :   this->address          = address;
    +     232         547 :   this->name_space       = name_space;
    +     233         547 :   this->human_switchable = human_switchable;
    +     234         547 : }
    +     235             : 
    +     236             : //}
    +     237             : 
    +     238             : class ControlManager : public nodelet::Nodelet {
    +     239             : 
    +     240             : public:
    +     241             :   virtual void onInit();
    +     242             : 
    +     243             : private:
    +     244             :   ros::NodeHandle   nh_;
    +     245             :   std::atomic<bool> is_initialized_ = false;
    +     246             :   std::string       _uav_name_;
    +     247             :   std::string       _body_frame_;
    +     248             : 
    +     249             :   std::string _custom_config_;
    +     250             :   std::string _platform_config_;
    +     251             :   std::string _world_config_;
    +     252             :   std::string _network_config_;
    +     253             : 
    +     254             :   // | --------------- dynamic loading of trackers -------------- |
    +     255             : 
    +     256             :   std::unique_ptr<pluginlib::ClassLoader<mrs_uav_managers::Tracker>> tracker_loader_;  // pluginlib loader of dynamically loaded trackers
    +     257             :   std::vector<std::string>                                           _tracker_names_;  // list of tracker names
    +     258             :   std::map<std::string, TrackerParams>                               trackers_;        // map between tracker names and tracker param
    +     259             :   std::vector<boost::shared_ptr<mrs_uav_managers::Tracker>>          tracker_list_;    // list of trackers, routines are callable from this
    +     260             :   std::mutex                                                         mutex_tracker_list_;
    +     261             : 
    +     262             :   // | ------------- dynamic loading of controllers ------------- |
    +     263             : 
    +     264             :   std::unique_ptr<pluginlib::ClassLoader<mrs_uav_managers::Controller>> controller_loader_;  // pluginlib loader of dynamically loaded controllers
    +     265             :   std::vector<std::string>                                              _controller_names_;  // list of controller names
    +     266             :   std::map<std::string, ControllerParams>                               controllers_;        // map between controller names and controller params
    +     267             :   std::vector<boost::shared_ptr<mrs_uav_managers::Controller>>          controller_list_;    // list of controllers, routines are callable from this
    +     268             :   std::mutex                                                            mutex_controller_list_;
    +     269             : 
    +     270             :   // | ------------------------- HW API ------------------------- |
    +     271             : 
    +     272             :   mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities> sh_hw_api_capabilities_;
    +     273             : 
    +     274             :   OutputPublisher control_output_publisher_;
    +     275             : 
    +     276             :   ControlOutputModalities_t _hw_api_inputs_;
    +     277             : 
    +     278             :   double desired_uav_state_rate_ = 100.0;
    +     279             : 
    +     280             :   // this timer will check till we already got the hardware api diagnostics
    +     281             :   // then it will trigger the initialization of the controllers and finish
    +     282             :   // the initialization of the ControlManager
    +     283             :   ros::Timer timer_hw_api_capabilities_;
    +     284             :   void       timerHwApiCapabilities(const ros::TimerEvent& event);
    +     285             : 
    +     286             :   void preinitialize(void);
    +     287             :   void initialize(void);
    +     288             : 
    +     289             :   // | ------------ tracker and controller switching ------------ |
    +     290             : 
    +     291             :   std::tuple<bool, std::string> switchController(const std::string& controller_name);
    +     292             :   std::tuple<bool, std::string> switchTracker(const std::string& tracker_name);
    +     293             : 
    +     294             :   // the time of last switching of a tracker or a controller
    +     295             :   ros::Time  controller_tracker_switch_time_;
    +     296             :   std::mutex mutex_controller_tracker_switch_time_;
    +     297             : 
    +     298             :   // | -------------------- the transformer  -------------------- |
    +     299             : 
    +     300             :   std::shared_ptr<mrs_lib::Transformer> transformer_;
    +     301             : 
    +     302             :   // | ------------------- scope timer logger ------------------- |
    +     303             : 
    +     304             :   bool                                       scope_timer_enabled_ = false;
    +     305             :   std::shared_ptr<mrs_lib::ScopeTimerLogger> scope_timer_logger_;
    +     306             : 
    +     307             :   // | --------------------- general params --------------------- |
    +     308             : 
    +     309             :   // defines the type of state input: odometry or uav_state mesasge types
    +     310             :   int _state_input_;
    +     311             : 
    +     312             :   // names of important trackers
    +     313             :   std::string _null_tracker_name_;     // null tracker is active when UAV is not in the air
    +     314             :   std::string _ehover_tracker_name_;   // ehover tracker is used for emergency hovering
    +     315             :   std::string _landoff_tracker_name_;  // landoff is used for landing and takeoff
    +     316             : 
    +     317             :   // names of important controllers
    +     318             :   std::string _failsafe_controller_name_;  // controller used for feed-forward failsafe
    +     319             :   std::string _eland_controller_name_;     // controller used for emergancy landing
    +     320             : 
    +     321             :   // joystick control
    +     322             :   bool        _joystick_enabled_ = false;
    +     323             :   int         _joystick_mode_;
    +     324             :   std::string _joystick_tracker_name_;
    +     325             :   std::string _joystick_controller_name_;
    +     326             :   std::string _joystick_fallback_tracker_name_;
    +     327             :   std::string _joystick_fallback_controller_name_;
    +     328             : 
    +     329             :   // should disarm after emergancy landing?
    +     330             :   bool _eland_disarm_enabled_ = false;
    +     331             : 
    +     332             :   // enabling the emergency handoff -> will disable eland and failsafe
    +     333             :   bool _rc_emergency_handoff_ = false;
    +     334             : 
    +     335             :   // what throttle should be output when null tracker is active?
    +     336             :   double _min_throttle_null_tracker_ = 0.0;
    +     337             : 
    +     338             :   // rates of all the timers
    +     339             :   double _status_timer_rate_   = 0;
    +     340             :   double _safety_timer_rate_   = 0;
    +     341             :   double _elanding_timer_rate_ = 0;
    +     342             :   double _failsafe_timer_rate_ = 0;
    +     343             :   double _bumper_timer_rate_   = 0;
    +     344             : 
    +     345             :   bool _snap_trajectory_to_safety_area_ = false;
    +     346             : 
    +     347             :   // | -------------- uav_state/odometry subscriber ------------- |
    +     348             : 
    +     349             :   mrs_lib::SubscribeHandler<nav_msgs::Odometry> sh_odometry_;
    +     350             :   mrs_lib::SubscribeHandler<mrs_msgs::UavState> sh_uav_state_;
    +     351             : 
    +     352             :   mrs_msgs::UavState uav_state_;
    +     353             :   mrs_msgs::UavState previous_uav_state_;
    +     354             :   bool               got_uav_state_               = false;
    +     355             :   double             _uav_state_max_missing_time_ = 0;  // how long should we tolerate missing state estimate?
    +     356             :   double             uav_roll_                    = 0;
    +     357             :   double             uav_pitch_                   = 0;
    +     358             :   double             uav_yaw_                     = 0;
    +     359             :   double             uav_heading_                 = 0;
    +     360             :   std::mutex         mutex_uav_state_;
    +     361             : 
    +     362             :   // odometry hiccup detection
    +     363             :   double uav_state_avg_dt_        = 1;
    +     364             :   double uav_state_hiccup_factor_ = 1;
    +     365             :   int    uav_state_count_         = 0;
    +     366             : 
    +     367             :   mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix> sh_gnss_;
    +     368             : 
    +     369             :   // | -------------- safety area max z subscriber -------------- |
    +     370             : 
    +     371             :   mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped> sh_max_z_;
    +     372             : 
    +     373             :   // | ------------- odometry innovation subscriber ------------- |
    +     374             : 
    +     375             :   // odometry innovation is published by the odometry node
    +     376             :   // it is used to issue eland if the estimator's input is too wonky
    +     377             :   mrs_lib::SubscribeHandler<nav_msgs::Odometry> sh_odometry_innovation_;
    +     378             : 
    +     379             :   // | --------------------- common handlers -------------------- |
    +     380             : 
    +     381             :   // contains handlers that are shared with trackers and controllers
    +     382             :   std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t> common_handlers_;
    +     383             : 
    +     384             :   // | --------------- tracker and controller IDs --------------- |
    +     385             : 
    +     386             :   // keeping track of currently active controllers and trackers
    +     387             :   unsigned int active_tracker_idx_    = 0;
    +     388             :   unsigned int active_controller_idx_ = 0;
    +     389             : 
    +     390             :   // indeces of some notable trackers
    +     391             :   unsigned int _ehover_tracker_idx_               = 0;
    +     392             :   unsigned int _landoff_tracker_idx_              = 0;
    +     393             :   unsigned int _joystick_tracker_idx_             = 0;
    +     394             :   unsigned int _joystick_controller_idx_          = 0;
    +     395             :   unsigned int _failsafe_controller_idx_          = 0;
    +     396             :   unsigned int _joystick_fallback_controller_idx_ = 0;
    +     397             :   unsigned int _joystick_fallback_tracker_idx_    = 0;
    +     398             :   unsigned int _null_tracker_idx_                 = 0;
    +     399             :   unsigned int _eland_controller_idx_             = 0;
    +     400             : 
    +     401             :   // | -------------- enabling the output publisher ------------- |
    +     402             : 
    +     403             :   void              toggleOutput(const bool& input);
    +     404             :   std::atomic<bool> output_enabled_ = false;
    +     405             : 
    +     406             :   // | ----------------------- publishers ----------------------- |
    +     407             : 
    +     408             :   mrs_lib::PublisherHandler<mrs_msgs::ControllerDiagnostics>     ph_controller_diagnostics_;
    +     409             :   mrs_lib::PublisherHandler<mrs_msgs::TrackerCommand>            ph_tracker_cmd_;
    +     410             :   mrs_lib::PublisherHandler<mrs_msgs::EstimatorInput>            ph_mrs_odom_input_;
    +     411             :   mrs_lib::PublisherHandler<nav_msgs::Odometry>                  ph_control_reference_odom_;
    +     412             :   mrs_lib::PublisherHandler<mrs_msgs::ControlManagerDiagnostics> ph_diagnostics_;
    +     413             :   mrs_lib::PublisherHandler<std_msgs::Empty>                     ph_offboard_on_;
    +     414             :   mrs_lib::PublisherHandler<mrs_msgs::Float64Stamped>            ph_tilt_error_;
    +     415             :   mrs_lib::PublisherHandler<std_msgs::Float64>                   ph_mass_estimate_;
    +     416             :   mrs_lib::PublisherHandler<std_msgs::Float64>                   ph_mass_nominal_;
    +     417             :   mrs_lib::PublisherHandler<std_msgs::Float64>                   ph_throttle_;
    +     418             :   mrs_lib::PublisherHandler<std_msgs::Float64>                   ph_thrust_;
    +     419             :   mrs_lib::PublisherHandler<mrs_msgs::ControlError>              ph_control_error_;
    +     420             :   mrs_lib::PublisherHandler<visualization_msgs::MarkerArray>     ph_safety_area_markers_;
    +     421             :   mrs_lib::PublisherHandler<visualization_msgs::MarkerArray>     ph_safety_area_coordinates_markers_;
    +     422             :   mrs_lib::PublisherHandler<visualization_msgs::MarkerArray>     ph_disturbances_markers_;
    +     423             :   mrs_lib::PublisherHandler<mrs_msgs::DynamicsConstraints>       ph_current_constraints_;
    +     424             :   mrs_lib::PublisherHandler<mrs_msgs::Float64Stamped>            ph_heading_;
    +     425             :   mrs_lib::PublisherHandler<mrs_msgs::Float64Stamped>            ph_speed_;
    +     426             : 
    +     427             :   // | --------------------- service servers -------------------- |
    +     428             : 
    +     429             :   ros::ServiceServer service_server_switch_tracker_;
    +     430             :   ros::ServiceServer service_server_switch_controller_;
    +     431             :   ros::ServiceServer service_server_reset_tracker_;
    +     432             :   ros::ServiceServer service_server_hover_;
    +     433             :   ros::ServiceServer service_server_ehover_;
    +     434             :   ros::ServiceServer service_server_failsafe_;
    +     435             :   ros::ServiceServer service_server_failsafe_escalating_;
    +     436             :   ros::ServiceServer service_server_toggle_output_;
    +     437             :   ros::ServiceServer service_server_arm_;
    +     438             :   ros::ServiceServer service_server_enable_callbacks_;
    +     439             :   ros::ServiceServer service_server_set_constraints_;
    +     440             :   ros::ServiceServer service_server_use_joystick_;
    +     441             :   ros::ServiceServer service_server_use_safety_area_;
    +     442             :   ros::ServiceServer service_server_emergency_reference_;
    +     443             :   ros::ServiceServer service_server_pirouette_;
    +     444             :   ros::ServiceServer service_server_eland_;
    +     445             :   ros::ServiceServer service_server_parachute_;
    +     446             :   ros::ServiceServer service_server_set_min_z_;
    +     447             : 
    +     448             :   // human callbable services for references
    +     449             :   ros::ServiceServer service_server_goto_;
    +     450             :   ros::ServiceServer service_server_goto_fcu_;
    +     451             :   ros::ServiceServer service_server_goto_relative_;
    +     452             :   ros::ServiceServer service_server_goto_altitude_;
    +     453             :   ros::ServiceServer service_server_set_heading_;
    +     454             :   ros::ServiceServer service_server_set_heading_relative_;
    +     455             : 
    +     456             :   // the reference service and subscriber
    +     457             :   ros::ServiceServer                                    service_server_reference_;
    +     458             :   mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped> sh_reference_;
    +     459             : 
    +     460             :   // the velocity reference service and subscriber
    +     461             :   ros::ServiceServer                                            service_server_velocity_reference_;
    +     462             :   mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped> sh_velocity_reference_;
    +     463             : 
    +     464             :   // trajectory tracking
    +     465             :   ros::ServiceServer                                       service_server_trajectory_reference_;
    +     466             :   mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference> sh_trajectory_reference_;
    +     467             :   ros::ServiceServer                                       service_server_start_trajectory_tracking_;
    +     468             :   ros::ServiceServer                                       service_server_stop_trajectory_tracking_;
    +     469             :   ros::ServiceServer                                       service_server_resume_trajectory_tracking_;
    +     470             :   ros::ServiceServer                                       service_server_goto_trajectory_start_;
    +     471             : 
    +     472             :   // transform service servers
    +     473             :   ros::ServiceServer service_server_transform_reference_;
    +     474             :   ros::ServiceServer service_server_transform_pose_;
    +     475             :   ros::ServiceServer service_server_transform_vector3_;
    +     476             : 
    +     477             :   // safety area services
    +     478             :   ros::ServiceServer service_server_validate_reference_;
    +     479             :   ros::ServiceServer service_server_validate_reference_2d_;
    +     480             :   ros::ServiceServer service_server_validate_reference_list_;
    +     481             : 
    +     482             :   // bumper service servers
    +     483             :   ros::ServiceServer service_server_bumper_enabler_;
    +     484             :   ros::ServiceServer service_server_bumper_repulsion_enabler_;
    +     485             : 
    +     486             :   // service clients
    +     487             :   mrs_lib::ServiceClientHandler<std_srvs::SetBool> sch_arming_;
    +     488             :   mrs_lib::ServiceClientHandler<std_srvs::Trigger> sch_eland_;
    +     489             :   mrs_lib::ServiceClientHandler<std_srvs::Trigger> sch_shutdown_;
    +     490             :   mrs_lib::ServiceClientHandler<std_srvs::SetBool> sch_set_odometry_callbacks_;
    +     491             :   mrs_lib::ServiceClientHandler<std_srvs::Trigger> sch_parachute_;
    +     492             : 
    +     493             :   // safety area min z servers
    +     494             :   ros::ServiceServer service_server_get_min_z_;
    +     495             : 
    +     496             :   // | --------- trackers' and controllers' last results -------- |
    +     497             : 
    +     498             :   // the last result of an active tracker
    +     499             :   std::optional<mrs_msgs::TrackerCommand> last_tracker_cmd_;
    +     500             :   std::mutex                              mutex_last_tracker_cmd_;
    +     501             : 
    +     502             :   // the last result of an active controller
    +     503             :   Controller::ControlOutput last_control_output_;
    +     504             :   std::mutex                mutex_last_control_output_;
    +     505             : 
    +     506             :   // | -------------- HW API diagnostics subscriber ------------- |
    +     507             : 
    +     508             :   mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus> sh_hw_api_status_;
    +     509             : 
    +     510             :   bool offboard_mode_          = false;
    +     511             :   bool offboard_mode_was_true_ = false;  // if it was ever true
    +     512             :   bool armed_                  = false;
    +     513             : 
    +     514             :   // | -------------------- throttle and mass ------------------- |
    +     515             : 
    +     516             :   // throttle mass estimation during eland
    +     517             :   double    throttle_mass_estimate_   = 0;
    +     518             :   bool      throttle_under_threshold_ = false;
    +     519             :   ros::Time throttle_mass_estimate_first_time_;
    +     520             : 
    +     521             :   // | ---------------------- safety params --------------------- |
    +     522             : 
    +     523             :   // failsafe when tilt error is too large
    +     524             :   bool   _tilt_error_disarm_enabled_;
    +     525             :   double _tilt_error_disarm_timeout_;
    +     526             :   double _tilt_error_disarm_threshold_;
    +     527             : 
    +     528             :   ros::Time tilt_error_disarm_time_;
    +     529             :   bool      tilt_error_disarm_over_thr_ = false;
    +     530             : 
    +     531             :   // elanding when tilt error is too large
    +     532             :   bool   _tilt_limit_eland_enabled_;
    +     533             :   double _tilt_limit_eland_ = 0;  // [rad]
    +     534             : 
    +     535             :   // disarming when tilt error is too large
    +     536             :   bool   _tilt_limit_disarm_enabled_;
    +     537             :   double _tilt_limit_disarm_ = 0;  // [rad]
    +     538             : 
    +     539             :   // elanding when yaw error is too large
    +     540             :   bool   _yaw_error_eland_enabled_;
    +     541             :   double _yaw_error_eland_ = 0;  // [rad]
    +     542             : 
    +     543             :   // keeping track of control errors
    +     544             :   std::optional<double> tilt_error_ = 0;
    +     545             :   std::optional<double> yaw_error_  = 0;
    +     546             :   std::mutex            mutex_attitude_error_;
    +     547             : 
    +     548             :   std::optional<Eigen::Vector3d> position_error_;
    +     549             :   std::mutex                     mutex_position_error_;
    +     550             : 
    +     551             :   // control error for triggering failsafe, eland, etc.
    +     552             :   // this filled with the current controllers failsafe threshold
    +     553             :   double _failsafe_threshold_                = 0;  // control error for triggering failsafe
    +     554             :   double _eland_threshold_                   = 0;  // control error for triggering eland
    +     555             :   bool   _odometry_innovation_check_enabled_ = false;
    +     556             :   double _odometry_innovation_threshold_     = 0;  // innovation size for triggering eland
    +     557             : 
    +     558             :   bool callbacks_enabled_ = true;
    +     559             : 
    +     560             :   // | ------------------------ parachute ----------------------- |
    +     561             : 
    +     562             :   bool _parachute_enabled_ = false;
    +     563             : 
    +     564             :   std::tuple<bool, std::string> deployParachute(void);
    +     565             :   bool                          parachuteSrv(void);
    +     566             : 
    +     567             :   // | ----------------------- safety area ---------------------- |
    +     568             : 
    +     569             :   // safety area
    +     570             :   std::unique_ptr<mrs_lib::SafetyZone> safety_zone_;
    +     571             : 
    +     572             :   std::atomic<bool> use_safety_area_ = false;
    +     573             : 
    +     574             :   std::string _safety_area_horizontal_frame_;
    +     575             :   std::string _safety_area_vertical_frame_;
    +     576             : 
    +     577             :   std::atomic<double> _safety_area_min_z_ = 0;
    +     578             : 
    +     579             :   double _safety_area_max_z_ = 0;
    +     580             : 
    +     581             :   // safety area routines
    +     582             :   // those are passed to trackers using the common_handlers object
    +     583             :   bool   isPointInSafetyArea2d(const mrs_msgs::ReferenceStamped& point);
    +     584             :   bool   isPointInSafetyArea3d(const mrs_msgs::ReferenceStamped& point);
    +     585             :   bool   isPathToPointInSafetyArea2d(const mrs_msgs::ReferenceStamped& from, const mrs_msgs::ReferenceStamped& to);
    +     586             :   bool   isPathToPointInSafetyArea3d(const mrs_msgs::ReferenceStamped& from, const mrs_msgs::ReferenceStamped& to);
    +     587             :   double getMinZ(const std::string& frame_id);
    +     588             :   double getMaxZ(const std::string& frame_id);
    +     589             : 
    +     590             :   // | ------------------------ callbacks ----------------------- |
    +     591             : 
    +     592             :   // topic callbacks
    +     593             :   void callbackOdometry(const nav_msgs::Odometry::ConstPtr msg);
    +     594             :   void callbackUavState(const mrs_msgs::UavState::ConstPtr msg);
    +     595             :   void callbackHwApiStatus(const mrs_msgs::HwApiStatus::ConstPtr msg);
    +     596             :   void callbackGNSS(const sensor_msgs::NavSatFix::ConstPtr msg);
    +     597             :   void callbackRC(const mrs_msgs::HwApiRcChannels::ConstPtr msg);
    +     598             : 
    +     599             :   // topic timeouts
    +     600             :   void timeoutUavState(const double& missing_for);
    +     601             : 
    +     602             :   // switching controller and tracker services
    +     603             :   bool callbackSwitchTracker(mrs_msgs::String::Request& req, mrs_msgs::String::Response& res);
    +     604             :   bool callbackSwitchController(mrs_msgs::String::Request& req, mrs_msgs::String::Response& res);
    +     605             :   bool callbackTrackerResetStatic(std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res);
    +     606             : 
    +     607             :   // reference callbacks
    +     608             :   void callbackReferenceTopic(const mrs_msgs::ReferenceStamped::ConstPtr msg);
    +     609             :   void callbackVelocityReferenceTopic(const mrs_msgs::VelocityReferenceStamped::ConstPtr msg);
    +     610             :   void callbackTrajectoryReferenceTopic(const mrs_msgs::TrajectoryReference::ConstPtr msg);
    +     611             :   bool callbackGoto(mrs_msgs::Vec4::Request& req, mrs_msgs::Vec4::Response& res);
    +     612             :   bool callbackGotoFcu(mrs_msgs::Vec4::Request& req, mrs_msgs::Vec4::Response& res);
    +     613             :   bool callbackGotoRelative(mrs_msgs::Vec4::Request& req, mrs_msgs::Vec4::Response& res);
    +     614             :   bool callbackGotoAltitude(mrs_msgs::Vec1::Request& req, mrs_msgs::Vec1::Response& res);
    +     615             :   bool callbackSetHeading(mrs_msgs::Vec1::Request& req, mrs_msgs::Vec1::Response& res);
    +     616             :   bool callbackSetHeadingRelative(mrs_msgs::Vec1::Request& req, mrs_msgs::Vec1::Response& res);
    +     617             :   bool callbackReferenceService(mrs_msgs::ReferenceStampedSrv::Request& req, mrs_msgs::ReferenceStampedSrv::Response& res);
    +     618             :   bool callbackVelocityReferenceService(mrs_msgs::VelocityReferenceStampedSrv::Request& req, mrs_msgs::VelocityReferenceStampedSrv::Response& res);
    +     619             :   bool callbackTrajectoryReferenceService(mrs_msgs::TrajectoryReferenceSrv::Request& req, mrs_msgs::TrajectoryReferenceSrv::Response& res);
    +     620             :   bool callbackEmergencyReference(mrs_msgs::ReferenceStampedSrv::Request& req, mrs_msgs::ReferenceStampedSrv::Response& res);
    +     621             : 
    +     622             :   // safety callbacks
    +     623             :   bool callbackHover(std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res);
    +     624             :   bool callbackStartTrajectoryTracking([[maybe_unused]] std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res);
    +     625             :   bool callbackStopTrajectoryTracking([[maybe_unused]] std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res);
    +     626             :   bool callbackResumeTrajectoryTracking([[maybe_unused]] std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res);
    +     627             :   bool callbackGotoTrajectoryStart([[maybe_unused]] std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res);
    +     628             :   bool callbackEHover(std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res);
    +     629             :   bool callbackFailsafe(std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res);
    +     630             :   bool callbackFailsafeEscalating(std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res);
    +     631             :   bool callbackEland(std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res);
    +     632             :   bool callbackParachute([[maybe_unused]] std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res);
    +     633             :   bool callbackSetMinZ(mrs_msgs::Float64StampedSrv::Request& req, mrs_msgs::Float64StampedSrv::Response& res);
    +     634             :   bool callbackToggleOutput(std_srvs::SetBool::Request& req, std_srvs::SetBool::Response& res);
    +     635             :   bool callbackArm(std_srvs::SetBool::Request& req, std_srvs::SetBool::Response& res);
    +     636             :   bool callbackEnableCallbacks(std_srvs::SetBool::Request& req, std_srvs::SetBool::Response& res);
    +     637             :   bool callbackEnableBumper(std_srvs::SetBool::Request& req, std_srvs::SetBool::Response& res);
    +     638             :   bool callbackUseSafetyArea(std_srvs::SetBool::Request& req, std_srvs::SetBool::Response& res);
    +     639             : 
    +     640             :   bool callbackGetMinZ(mrs_msgs::GetFloat64::Request& req, mrs_msgs::GetFloat64::Response& res);
    +     641             : 
    +     642             :   bool callbackValidateReference(mrs_msgs::ValidateReference::Request& req, mrs_msgs::ValidateReference::Response& res);
    +     643             :   bool callbackValidateReference2d(mrs_msgs::ValidateReference::Request& req, mrs_msgs::ValidateReference::Response& res);
    +     644             :   bool callbackValidateReferenceList(mrs_msgs::ValidateReferenceList::Request& req, mrs_msgs::ValidateReferenceList::Response& res);
    +     645             : 
    +     646             :   // transformation callbacks
    +     647             :   bool callbackTransformReference(mrs_msgs::TransformReferenceSrv::Request& req, mrs_msgs::TransformReferenceSrv::Response& res);
    +     648             :   bool callbackTransformPose(mrs_msgs::TransformPoseSrv::Request& req, mrs_msgs::TransformPoseSrv::Response& res);
    +     649             :   bool callbackTransformVector3(mrs_msgs::TransformVector3Srv::Request& req, mrs_msgs::TransformVector3Srv::Response& res);
    +     650             : 
    +     651             :   // | ----------------------- constraints ---------------------- |
    +     652             : 
    +     653             :   // sets constraints to all trackers
    +     654             :   bool callbackSetConstraints(mrs_msgs::DynamicsConstraintsSrv::Request& req, mrs_msgs::DynamicsConstraintsSrv::Response& res);
    +     655             : 
    +     656             :   // constraints management
    +     657             :   bool              got_constraints_ = false;
    +     658             :   std::mutex        mutex_constraints_;
    +     659             :   void              setConstraints(const mrs_msgs::DynamicsConstraintsSrvRequest& constraints);
    +     660             :   void              setConstraintsToTrackers(const mrs_msgs::DynamicsConstraintsSrvRequest& constraints);
    +     661             :   void              setConstraintsToControllers(const mrs_msgs::DynamicsConstraintsSrvRequest& constraints);
    +     662             :   std::atomic<bool> constraints_being_enforced_ = false;
    +     663             : 
    +     664             :   std::optional<mrs_msgs::DynamicsConstraintsSrvRequest> enforceControllersConstraints(const mrs_msgs::DynamicsConstraintsSrvRequest& constraints);
    +     665             : 
    +     666             :   mrs_msgs::DynamicsConstraintsSrvRequest current_constraints_;
    +     667             :   mrs_msgs::DynamicsConstraintsSrvRequest sanitized_constraints_;
    +     668             : 
    +     669             :   // | ------------------ emergency triggered? ------------------ |
    +     670             : 
    +     671             :   std::atomic<bool> failsafe_triggered_ = false;
    +     672             :   std::atomic<bool> eland_triggered_    = false;
    +     673             : 
    +     674             :   // | ------------------------- timers ------------------------- |
    +     675             : 
    +     676             :   // timer for regular status publishing
    +     677             :   ros::Timer timer_status_;
    +     678             :   void       timerStatus(const ros::TimerEvent& event);
    +     679             : 
    +     680             :   // timer for issuing the failsafe landing
    +     681             :   ros::Timer timer_failsafe_;
    +     682             :   void       timerFailsafe(const ros::TimerEvent& event);
    +     683             : 
    +     684             :   // oneshot timer for running controllers and trackers
    +     685             :   void              asyncControl(void);
    +     686             :   std::atomic<bool> running_async_control_ = false;
    +     687             :   std::future<void> async_control_result_;
    +     688             : 
    +     689             :   // timer for issuing emergancy landing
    +     690             :   ros::Timer timer_eland_;
    +     691             :   void       timerEland(const ros::TimerEvent& event);
    +     692             : 
    +     693             :   // timer for regular checking of controller errors
    +     694             :   ros::Timer        timer_safety_;
    +     695             :   void              timerSafety(const ros::TimerEvent& event);
    +     696             :   std::atomic<bool> running_safety_timer_        = false;
    +     697             :   std::atomic<bool> odometry_switch_in_progress_ = false;
    +     698             : 
    +     699             :   // timer for issuing the pirouette
    +     700             :   ros::Timer timer_pirouette_;
    +     701             :   void       timerPirouette(const ros::TimerEvent& event);
    +     702             : 
    +     703             :   // | --------------------- obstacle bumper -------------------- |
    +     704             : 
    +     705             :   // bumper timer
    +     706             :   ros::Timer timer_bumper_;
    +     707             :   void       timerBumper(const ros::TimerEvent& event);
    +     708             : 
    +     709             :   // bumper subscriber
    +     710             :   mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors> sh_bumper_;
    +     711             : 
    +     712             :   bool        _bumper_switch_tracker_    = false;
    +     713             :   bool        _bumper_switch_controller_ = false;
    +     714             :   std::string _bumper_tracker_name_;
    +     715             :   std::string _bumper_controller_name_;
    +     716             :   std::string bumper_previous_tracker_;
    +     717             :   std::string bumper_previous_controller_;
    +     718             : 
    +     719             :   std::atomic<bool> bumper_enabled_   = false;
    +     720             :   std::atomic<bool> bumper_repulsing_ = false;
    +     721             : 
    +     722             :   bool _bumper_horizontal_derive_from_dynamics_;
    +     723             :   bool _bumper_vertical_derive_from_dynamics_;
    +     724             : 
    +     725             :   double _bumper_horizontal_distance_ = 0;
    +     726             :   double _bumper_vertical_distance_   = 0;
    +     727             : 
    +     728             :   double _bumper_horizontal_overshoot_ = 0;
    +     729             :   double _bumper_vertical_overshoot_   = 0;
    +     730             : 
    +     731             :   int  bumperGetSectorId(const double& x, const double& y, const double& z);
    +     732             :   void bumperPushFromObstacle(void);
    +     733             : 
    +     734             :   // | --------------- safety checks and failsafes -------------- |
    +     735             : 
    +     736             :   // escalating failsafe (eland -> failsafe -> disarm)
    +     737             :   bool                       _service_escalating_failsafe_enabled_ = false;
    +     738             :   bool                       _rc_escalating_failsafe_enabled_      = false;
    +     739             :   double                     _escalating_failsafe_timeout_         = 0;
    +     740             :   ros::Time                  escalating_failsafe_time_;
    +     741             :   bool                       _escalating_failsafe_ehover_   = false;
    +     742             :   bool                       _escalating_failsafe_eland_    = false;
    +     743             :   bool                       _escalating_failsafe_failsafe_ = false;
    +     744             :   double                     _rc_escalating_failsafe_threshold_;
    +     745             :   int                        _rc_escalating_failsafe_channel_  = 0;
    +     746             :   bool                       rc_escalating_failsafe_triggered_ = false;
    +     747             :   EscalatingFailsafeStates_t state_escalating_failsafe_        = ESC_NONE_STATE;
    +     748             : 
    +     749             :   std::string _tracker_error_action_;
    +     750             : 
    +     751             :   // emergancy landing state machine
    +     752             :   LandingStates_t current_state_landing_  = IDLE_STATE;
    +     753             :   LandingStates_t previous_state_landing_ = IDLE_STATE;
    +     754             :   std::mutex      mutex_landing_state_machine_;
    +     755             :   void            changeLandingState(LandingStates_t new_state);
    +     756             :   double          _uav_mass_ = 0;
    +     757             :   double          _elanding_cutoff_mass_factor_;
    +     758             :   double          _elanding_cutoff_timeout_;
    +     759             :   double          landing_uav_mass_ = 0;
    +     760             : 
    +     761             :   // initial body disturbance loaded from params
    +     762             :   double _initial_body_disturbance_x_ = 0;
    +     763             :   double _initial_body_disturbance_y_ = 0;
    +     764             : 
    +     765             :   // profiling
    +     766             :   mrs_lib::Profiler profiler_;
    +     767             :   bool              _profiler_enabled_ = false;
    +     768             : 
    +     769             :   // diagnostics publishing
    +     770             :   void       publishDiagnostics(void);
    +     771             :   std::mutex mutex_diagnostics_;
    +     772             : 
    +     773             :   void                                             ungripSrv(void);
    +     774             :   mrs_lib::ServiceClientHandler<std_srvs::Trigger> sch_ungrip_;
    +     775             : 
    +     776             :   bool isFlyingNormally(void);
    +     777             : 
    +     778             :   // | ------------------------ pirouette ----------------------- |
    +     779             : 
    +     780             :   bool       _pirouette_enabled_ = false;
    +     781             :   double     _pirouette_speed_;
    +     782             :   double     _pirouette_timer_rate_;
    +     783             :   std::mutex mutex_pirouette_;
    +     784             :   double     pirouette_initial_heading_;
    +     785             :   double     pirouette_iterator_;
    +     786             :   bool       callbackPirouette(std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res);
    +     787             : 
    +     788             :   // | -------------------- joystick control -------------------- |
    +     789             : 
    +     790             :   mrs_lib::SubscribeHandler<sensor_msgs::Joy> sh_joystick_;
    +     791             : 
    +     792             :   void callbackJoystick(const sensor_msgs::Joy::ConstPtr msg);
    +     793             :   bool callbackUseJoystick([[maybe_unused]] std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res);
    +     794             : 
    +     795             :   // joystick buttons mappings
    +     796             :   int _channel_A_, _channel_B_, _channel_X_, _channel_Y_, _channel_start_, _channel_back_, _channel_LT_, _channel_RT_, _channel_L_joy_, _channel_R_joy_;
    +     797             : 
    +     798             :   // channel numbers and channel multipliers
    +     799             :   int    _channel_pitch_, _channel_roll_, _channel_heading_, _channel_throttle_;
    +     800             :   double _channel_mult_pitch_, _channel_mult_roll_, _channel_mult_heading_, _channel_mult_throttle_;
    +     801             : 
    +     802             :   ros::Timer timer_joystick_;
    +     803             :   void       timerJoystick(const ros::TimerEvent& event);
    +     804             :   double     _joystick_timer_rate_ = 0;
    +     805             : 
    +     806             :   double _joystick_carrot_distance_ = 0;
    +     807             : 
    +     808             :   ros::Time joystick_start_press_time_;
    +     809             :   bool      joystick_start_pressed_ = false;
    +     810             : 
    +     811             :   ros::Time joystick_back_press_time_;
    +     812             :   bool      joystick_back_pressed_ = false;
    +     813             :   bool      joystick_goto_enabled_ = false;
    +     814             : 
    +     815             :   bool      joystick_failsafe_pressed_ = false;
    +     816             :   ros::Time joystick_failsafe_press_time_;
    +     817             : 
    +     818             :   bool      joystick_eland_pressed_ = false;
    +     819             :   ros::Time joystick_eland_press_time_;
    +     820             : 
    +     821             :   // | ------------------- RC joystick control ------------------ |
    +     822             : 
    +     823             :   // listening to the RC channels as told by pixhawk
    +     824             :   mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels> sh_hw_api_rc_;
    +     825             : 
    +     826             :   // the RC channel mapping of the main 4 control signals
    +     827             :   double _rc_channel_pitch_, _rc_channel_roll_, _rc_channel_heading_, _rc_channel_throttle_;
    +     828             : 
    +     829             :   bool              _rc_goto_enabled_               = false;
    +     830             :   std::atomic<bool> rc_goto_active_                 = false;
    +     831             :   double            rc_joystick_channel_last_value_ = 0.5;
    +     832             :   bool              rc_joystick_channel_was_low_    = false;
    +     833             :   int               _rc_joystick_channel_           = 0;
    +     834             : 
    +     835             :   double _rc_horizontal_speed_ = 0;
    +     836             :   double _rc_vertical_speed_   = 0;
    +     837             :   double _rc_heading_rate_     = 0;
    +     838             : 
    +     839             :   // | ------------------- trajectory loading ------------------- |
    +     840             : 
    +     841             :   mrs_lib::PublisherHandler<geometry_msgs::PoseArray>        pub_debug_original_trajectory_poses_;
    +     842             :   mrs_lib::PublisherHandler<visualization_msgs::MarkerArray> pub_debug_original_trajectory_markers_;
    +     843             : 
    +     844             :   // | --------------------- other routines --------------------- |
    +     845             : 
    +     846             :   // this is called to update the trackers and to receive position control command from the active one
    +     847             :   void updateTrackers(void);
    +     848             : 
    +     849             :   // this is called to update the controllers and to receive attitude control command from the active one
    +     850             :   void updateControllers(const mrs_msgs::UavState& uav_state);
    +     851             : 
    +     852             :   // sets the reference to the active tracker
    +     853             :   std::tuple<bool, std::string> setReference(const mrs_msgs::ReferenceStamped reference_in);
    +     854             : 
    +     855             :   // sets the velocity reference to the active tracker
    +     856             :   std::tuple<bool, std::string> setVelocityReference(const mrs_msgs::VelocityReferenceStamped& reference_in);
    +     857             : 
    +     858             :   // sets the reference trajectory to the active tracker
    +     859             :   std::tuple<bool, std::string, bool, std::vector<std::string>, std::vector<bool>, std::vector<std::string>> setTrajectoryReference(
    +     860             :       const mrs_msgs::TrajectoryReference trajectory_in);
    +     861             : 
    +     862             :   // publishes
    +     863             :   void publish(void);
    +     864             : 
    +     865             :   bool loadConfigFile(const std::string& file_path, const std::string ns);
    +     866             : 
    +     867             :   double getMass(void);
    +     868             : 
    +     869             :   // publishes rviz-visualizable control reference
    +     870             :   void publishControlReferenceOdom(const std::optional<mrs_msgs::TrackerCommand>& tracker_command, const Controller::ControlOutput& control_output);
    +     871             : 
    +     872             :   void initializeControlOutput(void);
    +     873             : 
    +     874             :   // tell the mrs_odometry to disable its callbacks
    +     875             :   void odometryCallbacksSrv(const bool input);
    +     876             : 
    +     877             :   mrs_msgs::ReferenceStamped velocityReferenceToReference(const mrs_msgs::VelocityReferenceStamped& vel_reference);
    +     878             : 
    +     879             :   void                          setCallbacks(bool in);
    +     880             :   bool                          isOffboard(void);
    +     881             :   bool                          elandSrv(void);
    +     882             :   std::tuple<bool, std::string> arming(const bool input);
    +     883             : 
    +     884             :   // safety functions impl
    +     885             :   std::tuple<bool, std::string> ehover(void);
    +     886             :   std::tuple<bool, std::string> hover(void);
    +     887             :   std::tuple<bool, std::string> startTrajectoryTracking(void);
    +     888             :   std::tuple<bool, std::string> stopTrajectoryTracking(void);
    +     889             :   std::tuple<bool, std::string> resumeTrajectoryTracking(void);
    +     890             :   std::tuple<bool, std::string> gotoTrajectoryStart(void);
    +     891             :   std::tuple<bool, std::string> eland(void);
    +     892             :   std::tuple<bool, std::string> failsafe(void);
    +     893             :   std::tuple<bool, std::string> escalatingFailsafe(void);
    +     894             : 
    +     895             :   EscalatingFailsafeStates_t getNextEscFailsafeState(void);
    +     896             : };
    +     897             : 
    +     898             : //}
    +     899             : 
    +     900             : /* //{ onInit() */
    +     901             : 
    +     902          91 : void ControlManager::onInit() {
    +     903          91 :   preinitialize();
    +     904          91 : }
    +     905             : 
    +     906             : //}
    +     907             : 
    +     908             : /* preinitialize() //{ */
    +     909             : 
    +     910          91 : void ControlManager::preinitialize(void) {
    +     911             : 
    +     912          91 :   nh_ = nodelet::Nodelet::getMTPrivateNodeHandle();
    +     913             : 
    +     914          91 :   ros::Time::waitForValid();
    +     915             : 
    +     916          91 :   mrs_lib::SubscribeHandlerOptions shopts;
    +     917          91 :   shopts.nh                 = nh_;
    +     918          91 :   shopts.node_name          = "ControlManager";
    +     919          91 :   shopts.no_message_timeout = mrs_lib::no_timeout;
    +     920          91 :   shopts.threadsafe         = true;
    +     921          91 :   shopts.autostart          = true;
    +     922          91 :   shopts.queue_size         = 10;
    +     923          91 :   shopts.transport_hints    = ros::TransportHints().tcpNoDelay();
    +     924             : 
    +     925          91 :   sh_hw_api_capabilities_ = mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities>(shopts, "hw_api_capabilities_in");
    +     926             : 
    +     927          91 :   timer_hw_api_capabilities_ = nh_.createTimer(ros::Rate(1.0), &ControlManager::timerHwApiCapabilities, this);
    +     928          91 : }
    +     929             : 
    +     930             : //}
    +     931             : 
    +     932             : /* initialize() //{ */
    +     933             : 
    +     934          91 : void ControlManager::initialize(void) {
    +     935             : 
    +     936          91 :   joystick_start_press_time_      = ros::Time(0);
    +     937          91 :   joystick_failsafe_press_time_   = ros::Time(0);
    +     938          91 :   joystick_eland_press_time_      = ros::Time(0);
    +     939          91 :   escalating_failsafe_time_       = ros::Time(0);
    +     940          91 :   controller_tracker_switch_time_ = ros::Time(0);
    +     941             : 
    +     942          91 :   ROS_INFO("[ControlManager]: initializing");
    +     943             : 
    +     944             :   // --------------------------------------------------------------
    +     945             :   // |         common handler for trackers and controllers        |
    +     946             :   // --------------------------------------------------------------
    +     947             : 
    +     948          91 :   common_handlers_ = std::make_shared<mrs_uav_managers::control_manager::CommonHandlers_t>();
    +     949             : 
    +     950             :   // --------------------------------------------------------------
    +     951             :   // |                           params                           |
    +     952             :   // --------------------------------------------------------------
    +     953             : 
    +     954         182 :   mrs_lib::ParamLoader param_loader(nh_, "ControlManager");
    +     955             : 
    +     956          91 :   param_loader.loadParam("custom_config", _custom_config_);
    +     957          91 :   param_loader.loadParam("platform_config", _platform_config_);
    +     958          91 :   param_loader.loadParam("world_config", _world_config_);
    +     959          91 :   param_loader.loadParam("network_config", _network_config_);
    +     960             : 
    +     961          91 :   if (_custom_config_ != "") {
    +     962          91 :     param_loader.addYamlFile(_custom_config_);
    +     963             :   }
    +     964             : 
    +     965          91 :   if (_platform_config_ != "") {
    +     966          91 :     param_loader.addYamlFile(_platform_config_);
    +     967             :   }
    +     968             : 
    +     969          91 :   if (_world_config_ != "") {
    +     970          91 :     param_loader.addYamlFile(_world_config_);
    +     971             :   }
    +     972             : 
    +     973          91 :   if (_network_config_ != "") {
    +     974          91 :     param_loader.addYamlFile(_network_config_);
    +     975             :   }
    +     976             : 
    +     977          91 :   param_loader.addYamlFileFromParam("private_config");
    +     978          91 :   param_loader.addYamlFileFromParam("public_config");
    +     979          91 :   param_loader.addYamlFileFromParam("private_trackers");
    +     980          91 :   param_loader.addYamlFileFromParam("private_controllers");
    +     981          91 :   param_loader.addYamlFileFromParam("public_controllers");
    +     982             : 
    +     983             :   // params passed from the launch file are not prefixed
    +     984          91 :   param_loader.loadParam("uav_name", _uav_name_);
    +     985          91 :   param_loader.loadParam("body_frame", _body_frame_);
    +     986          91 :   param_loader.loadParam("enable_profiler", _profiler_enabled_);
    +     987          91 :   param_loader.loadParam("uav_mass", _uav_mass_);
    +     988          91 :   param_loader.loadParam("body_disturbance_x", _initial_body_disturbance_x_);
    +     989          91 :   param_loader.loadParam("body_disturbance_y", _initial_body_disturbance_y_);
    +     990          91 :   param_loader.loadParam("g", common_handlers_->g);
    +     991             : 
    +     992             :   // motor params are also not prefixed, since they are common to more nodes
    +     993          91 :   param_loader.loadParam("motor_params/a", common_handlers_->throttle_model.A);
    +     994          91 :   param_loader.loadParam("motor_params/b", common_handlers_->throttle_model.B);
    +     995          91 :   param_loader.loadParam("motor_params/n_motors", common_handlers_->throttle_model.n_motors);
    +     996             : 
    +     997             :   // | ----------------------- safety area ---------------------- |
    +     998             : 
    +     999             :   bool use_safety_area;
    +    1000          91 :   param_loader.loadParam("safety_area/enabled", use_safety_area);
    +    1001          91 :   use_safety_area_ = use_safety_area;
    +    1002             : 
    +    1003          91 :   param_loader.loadParam("safety_area/horizontal/frame_name", _safety_area_horizontal_frame_);
    +    1004             : 
    +    1005          91 :   param_loader.loadParam("safety_area/vertical/frame_name", _safety_area_vertical_frame_);
    +    1006          91 :   param_loader.loadParam("safety_area/vertical/max_z", _safety_area_max_z_);
    +    1007             : 
    +    1008             :   {
    +    1009             :     double temp;
    +    1010          91 :     param_loader.loadParam("safety_area/vertical/min_z", temp);
    +    1011             : 
    +    1012          91 :     _safety_area_min_z_ = temp;
    +    1013             :   }
    +    1014             : 
    +    1015          91 :   if (use_safety_area_) {
    +    1016             : 
    +    1017         213 :     Eigen::MatrixXd border_points = param_loader.loadMatrixDynamic2("safety_area/horizontal/points", -1, 2);
    +    1018             : 
    +    1019             :     try {
    +    1020             : 
    +    1021         142 :       std::vector<Eigen::MatrixXd> polygon_obstacle_points;
    +    1022          71 :       std::vector<Eigen::MatrixXd> point_obstacle_points;
    +    1023             : 
    +    1024          71 :       safety_zone_ = std::make_unique<mrs_lib::SafetyZone>(border_points);
    +    1025             :     }
    +    1026             : 
    +    1027           0 :     catch (mrs_lib::SafetyZone::BorderError& e) {
    +    1028           0 :       ROS_ERROR("[ControlManager]: SafetyArea: wrong configruation for the safety zone border polygon");
    +    1029           0 :       ros::shutdown();
    +    1030             :     }
    +    1031           0 :     catch (...) {
    +    1032           0 :       ROS_ERROR("[ControlManager]: SafetyArea: unhandled exception!");
    +    1033           0 :       ros::shutdown();
    +    1034             :     }
    +    1035             : 
    +    1036          71 :     ROS_INFO("[ControlManager]: safety area initialized");
    +    1037             :   }
    +    1038             : 
    +    1039          91 :   param_loader.setPrefix("mrs_uav_managers/control_manager/");
    +    1040             : 
    +    1041          91 :   param_loader.loadParam("state_input", _state_input_);
    +    1042             : 
    +    1043          91 :   if (!(_state_input_ == INPUT_UAV_STATE || _state_input_ == INPUT_ODOMETRY)) {
    +    1044           0 :     ROS_ERROR("[ControlManager]: the state_input parameter has to be in {0, 1}");
    +    1045           0 :     ros::shutdown();
    +    1046             :   }
    +    1047             : 
    +    1048          91 :   param_loader.loadParam("safety/min_throttle_null_tracker", _min_throttle_null_tracker_);
    +    1049          91 :   param_loader.loadParam("safety/ehover_tracker", _ehover_tracker_name_);
    +    1050          91 :   param_loader.loadParam("safety/failsafe_controller", _failsafe_controller_name_);
    +    1051             : 
    +    1052          91 :   param_loader.loadParam("safety/eland/controller", _eland_controller_name_);
    +    1053          91 :   param_loader.loadParam("safety/eland/cutoff_mass_factor", _elanding_cutoff_mass_factor_);
    +    1054          91 :   param_loader.loadParam("safety/eland/cutoff_timeout", _elanding_cutoff_timeout_);
    +    1055          91 :   param_loader.loadParam("safety/eland/timer_rate", _elanding_timer_rate_);
    +    1056          91 :   param_loader.loadParam("safety/eland/disarm", _eland_disarm_enabled_);
    +    1057             : 
    +    1058          91 :   param_loader.loadParam("safety/escalating_failsafe/service/enabled", _service_escalating_failsafe_enabled_);
    +    1059          91 :   param_loader.loadParam("safety/escalating_failsafe/rc/enabled", _rc_escalating_failsafe_enabled_);
    +    1060          91 :   param_loader.loadParam("safety/escalating_failsafe/rc/channel_number", _rc_escalating_failsafe_channel_);
    +    1061          91 :   param_loader.loadParam("safety/escalating_failsafe/rc/threshold", _rc_escalating_failsafe_threshold_);
    +    1062          91 :   param_loader.loadParam("safety/escalating_failsafe/timeout", _escalating_failsafe_timeout_);
    +    1063          91 :   param_loader.loadParam("safety/escalating_failsafe/ehover", _escalating_failsafe_ehover_);
    +    1064          91 :   param_loader.loadParam("safety/escalating_failsafe/eland", _escalating_failsafe_eland_);
    +    1065          91 :   param_loader.loadParam("safety/escalating_failsafe/failsafe", _escalating_failsafe_failsafe_);
    +    1066             : 
    +    1067          91 :   param_loader.loadParam("safety/tilt_limit/eland/enabled", _tilt_limit_eland_enabled_);
    +    1068          91 :   param_loader.loadParam("safety/tilt_limit/eland/limit", _tilt_limit_eland_);
    +    1069             : 
    +    1070          91 :   _tilt_limit_eland_ = M_PI * (_tilt_limit_eland_ / 180.0);
    +    1071             : 
    +    1072          91 :   if (_tilt_limit_eland_enabled_ && fabs(_tilt_limit_eland_) < 1e-3) {
    +    1073           0 :     ROS_ERROR("[ControlManager]: safety/tilt_limit/eland/enabled = 'TRUE' but the limit is too low");
    +    1074           0 :     ros::shutdown();
    +    1075             :   }
    +    1076             : 
    +    1077          91 :   param_loader.loadParam("safety/tilt_limit/disarm/enabled", _tilt_limit_disarm_enabled_);
    +    1078          91 :   param_loader.loadParam("safety/tilt_limit/disarm/limit", _tilt_limit_disarm_);
    +    1079             : 
    +    1080          91 :   _tilt_limit_disarm_ = M_PI * (_tilt_limit_disarm_ / 180.0);
    +    1081             : 
    +    1082          91 :   if (_tilt_limit_disarm_enabled_ && fabs(_tilt_limit_disarm_) < 1e-3) {
    +    1083           0 :     ROS_ERROR("[ControlManager]: safety/tilt_limit/disarm/enabled = 'TRUE' but the limit is too low");
    +    1084           0 :     ros::shutdown();
    +    1085             :   }
    +    1086             : 
    +    1087          91 :   param_loader.loadParam("safety/yaw_error_eland/enabled", _yaw_error_eland_enabled_);
    +    1088          91 :   param_loader.loadParam("safety/yaw_error_eland/limit", _yaw_error_eland_);
    +    1089             : 
    +    1090          91 :   _yaw_error_eland_ = M_PI * (_yaw_error_eland_ / 180.0);
    +    1091             : 
    +    1092          91 :   if (_yaw_error_eland_enabled_ && fabs(_yaw_error_eland_) < 1e-3) {
    +    1093           0 :     ROS_ERROR("[ControlManager]: safety/yaw_error_eland/enabled = 'TRUE' but the limit is too low");
    +    1094           0 :     ros::shutdown();
    +    1095             :   }
    +    1096             : 
    +    1097          91 :   param_loader.loadParam("status_timer_rate", _status_timer_rate_);
    +    1098          91 :   param_loader.loadParam("safety/safety_timer_rate", _safety_timer_rate_);
    +    1099          91 :   param_loader.loadParam("safety/failsafe_timer_rate", _failsafe_timer_rate_);
    +    1100          91 :   param_loader.loadParam("safety/rc_emergency_handoff/enabled", _rc_emergency_handoff_);
    +    1101             : 
    +    1102          91 :   param_loader.loadParam("safety/odometry_max_missing_time", _uav_state_max_missing_time_);
    +    1103          91 :   param_loader.loadParam("safety/odometry_innovation_eland/enabled", _odometry_innovation_check_enabled_);
    +    1104             : 
    +    1105          91 :   param_loader.loadParam("safety/tilt_error_disarm/enabled", _tilt_error_disarm_enabled_);
    +    1106          91 :   param_loader.loadParam("safety/tilt_error_disarm/timeout", _tilt_error_disarm_timeout_);
    +    1107          91 :   param_loader.loadParam("safety/tilt_error_disarm/error_threshold", _tilt_error_disarm_threshold_);
    +    1108             : 
    +    1109          91 :   _tilt_error_disarm_threshold_ = M_PI * (_tilt_error_disarm_threshold_ / 180.0);
    +    1110             : 
    +    1111          91 :   if (_tilt_error_disarm_enabled_ && fabs(_tilt_error_disarm_threshold_) < 1e-3) {
    +    1112           0 :     ROS_ERROR("[ControlManager]: safety/tilt_error_disarm/enabled = 'TRUE' but the limit is too low");
    +    1113           0 :     ros::shutdown();
    +    1114             :   }
    +    1115             : 
    +    1116             :   // default constraints
    +    1117             : 
    +    1118          91 :   param_loader.loadParam("default_constraints/horizontal/speed", current_constraints_.constraints.horizontal_speed);
    +    1119          91 :   param_loader.loadParam("default_constraints/horizontal/acceleration", current_constraints_.constraints.horizontal_acceleration);
    +    1120          91 :   param_loader.loadParam("default_constraints/horizontal/jerk", current_constraints_.constraints.horizontal_jerk);
    +    1121          91 :   param_loader.loadParam("default_constraints/horizontal/snap", current_constraints_.constraints.horizontal_snap);
    +    1122             : 
    +    1123          91 :   param_loader.loadParam("default_constraints/vertical/ascending/speed", current_constraints_.constraints.vertical_ascending_speed);
    +    1124          91 :   param_loader.loadParam("default_constraints/vertical/ascending/acceleration", current_constraints_.constraints.vertical_ascending_acceleration);
    +    1125          91 :   param_loader.loadParam("default_constraints/vertical/ascending/jerk", current_constraints_.constraints.vertical_ascending_jerk);
    +    1126          91 :   param_loader.loadParam("default_constraints/vertical/ascending/snap", current_constraints_.constraints.vertical_ascending_snap);
    +    1127             : 
    +    1128          91 :   param_loader.loadParam("default_constraints/vertical/descending/speed", current_constraints_.constraints.vertical_descending_speed);
    +    1129          91 :   param_loader.loadParam("default_constraints/vertical/descending/acceleration", current_constraints_.constraints.vertical_descending_acceleration);
    +    1130          91 :   param_loader.loadParam("default_constraints/vertical/descending/jerk", current_constraints_.constraints.vertical_descending_jerk);
    +    1131          91 :   param_loader.loadParam("default_constraints/vertical/descending/snap", current_constraints_.constraints.vertical_descending_snap);
    +    1132             : 
    +    1133          91 :   param_loader.loadParam("default_constraints/heading/speed", current_constraints_.constraints.heading_speed);
    +    1134          91 :   param_loader.loadParam("default_constraints/heading/acceleration", current_constraints_.constraints.heading_acceleration);
    +    1135          91 :   param_loader.loadParam("default_constraints/heading/jerk", current_constraints_.constraints.heading_jerk);
    +    1136          91 :   param_loader.loadParam("default_constraints/heading/snap", current_constraints_.constraints.heading_snap);
    +    1137             : 
    +    1138          91 :   param_loader.loadParam("default_constraints/angular_speed/roll", current_constraints_.constraints.roll_rate);
    +    1139          91 :   param_loader.loadParam("default_constraints/angular_speed/pitch", current_constraints_.constraints.pitch_rate);
    +    1140          91 :   param_loader.loadParam("default_constraints/angular_speed/yaw", current_constraints_.constraints.yaw_rate);
    +    1141             : 
    +    1142          91 :   param_loader.loadParam("default_constraints/tilt", current_constraints_.constraints.tilt);
    +    1143             : 
    +    1144          91 :   current_constraints_.constraints.tilt = M_PI * (current_constraints_.constraints.tilt / 180.0);
    +    1145             : 
    +    1146             :   // joystick
    +    1147             : 
    +    1148          91 :   param_loader.loadParam("joystick/enabled", _joystick_enabled_);
    +    1149          91 :   param_loader.loadParam("joystick/mode", _joystick_mode_);
    +    1150          91 :   param_loader.loadParam("joystick/carrot_distance", _joystick_carrot_distance_);
    +    1151          91 :   param_loader.loadParam("joystick/joystick_timer_rate", _joystick_timer_rate_);
    +    1152          91 :   param_loader.loadParam("joystick/attitude_control/tracker", _joystick_tracker_name_);
    +    1153          91 :   param_loader.loadParam("joystick/attitude_control/controller", _joystick_controller_name_);
    +    1154          91 :   param_loader.loadParam("joystick/attitude_control/fallback/tracker", _joystick_fallback_tracker_name_);
    +    1155          91 :   param_loader.loadParam("joystick/attitude_control/fallback/controller", _joystick_fallback_controller_name_);
    +    1156             : 
    +    1157          91 :   param_loader.loadParam("joystick/channels/A", _channel_A_);
    +    1158          91 :   param_loader.loadParam("joystick/channels/B", _channel_B_);
    +    1159          91 :   param_loader.loadParam("joystick/channels/X", _channel_X_);
    +    1160          91 :   param_loader.loadParam("joystick/channels/Y", _channel_Y_);
    +    1161          91 :   param_loader.loadParam("joystick/channels/start", _channel_start_);
    +    1162          91 :   param_loader.loadParam("joystick/channels/back", _channel_back_);
    +    1163          91 :   param_loader.loadParam("joystick/channels/LT", _channel_LT_);
    +    1164          91 :   param_loader.loadParam("joystick/channels/RT", _channel_RT_);
    +    1165          91 :   param_loader.loadParam("joystick/channels/L_joy", _channel_L_joy_);
    +    1166          91 :   param_loader.loadParam("joystick/channels/R_joy", _channel_R_joy_);
    +    1167             : 
    +    1168             :   // load channels
    +    1169          91 :   param_loader.loadParam("joystick/channels/pitch", _channel_pitch_);
    +    1170          91 :   param_loader.loadParam("joystick/channels/roll", _channel_roll_);
    +    1171          91 :   param_loader.loadParam("joystick/channels/heading", _channel_heading_);
    +    1172          91 :   param_loader.loadParam("joystick/channels/throttle", _channel_throttle_);
    +    1173             : 
    +    1174             :   // load channel multipliers
    +    1175          91 :   param_loader.loadParam("joystick/channel_multipliers/pitch", _channel_mult_pitch_);
    +    1176          91 :   param_loader.loadParam("joystick/channel_multipliers/roll", _channel_mult_roll_);
    +    1177          91 :   param_loader.loadParam("joystick/channel_multipliers/heading", _channel_mult_heading_);
    +    1178          91 :   param_loader.loadParam("joystick/channel_multipliers/throttle", _channel_mult_throttle_);
    +    1179             : 
    +    1180             :   bool bumper_enabled;
    +    1181          91 :   param_loader.loadParam("obstacle_bumper/enabled", bumper_enabled);
    +    1182          91 :   bumper_enabled_ = bumper_enabled;
    +    1183             : 
    +    1184          91 :   param_loader.loadParam("obstacle_bumper/switch_tracker", _bumper_switch_tracker_);
    +    1185          91 :   param_loader.loadParam("obstacle_bumper/switch_controller", _bumper_switch_controller_);
    +    1186          91 :   param_loader.loadParam("obstacle_bumper/tracker", _bumper_tracker_name_);
    +    1187          91 :   param_loader.loadParam("obstacle_bumper/controller", _bumper_controller_name_);
    +    1188          91 :   param_loader.loadParam("obstacle_bumper/timer_rate", _bumper_timer_rate_);
    +    1189             : 
    +    1190          91 :   param_loader.loadParam("obstacle_bumper/horizontal/min_distance_to_obstacle", _bumper_horizontal_distance_);
    +    1191          91 :   param_loader.loadParam("obstacle_bumper/horizontal/derived_from_dynamics", _bumper_horizontal_derive_from_dynamics_);
    +    1192             : 
    +    1193          91 :   param_loader.loadParam("obstacle_bumper/vertical/min_distance_to_obstacle", _bumper_vertical_distance_);
    +    1194          91 :   param_loader.loadParam("obstacle_bumper/vertical/derived_from_dynamics", _bumper_vertical_derive_from_dynamics_);
    +    1195             : 
    +    1196          91 :   param_loader.loadParam("obstacle_bumper/horizontal/overshoot", _bumper_horizontal_overshoot_);
    +    1197          91 :   param_loader.loadParam("obstacle_bumper/vertical/overshoot", _bumper_vertical_overshoot_);
    +    1198             : 
    +    1199          91 :   param_loader.loadParam("safety/tracker_error_action", _tracker_error_action_);
    +    1200             : 
    +    1201          91 :   param_loader.loadParam("trajectory_tracking/snap_to_safety_area", _snap_trajectory_to_safety_area_);
    +    1202             : 
    +    1203             :   // check the values of tracker error action
    +    1204          91 :   if (_tracker_error_action_ != ELAND_STR && _tracker_error_action_ != EHOVER_STR) {
    +    1205           0 :     ROS_ERROR("[ControlManager]: the tracker_error_action parameter (%s) is not correct, requires {%s, %s}", _tracker_error_action_.c_str(), ELAND_STR,
    +    1206             :               EHOVER_STR);
    +    1207           0 :     ros::shutdown();
    +    1208             :   }
    +    1209             : 
    +    1210          91 :   param_loader.loadParam("rc_joystick/enabled", _rc_goto_enabled_);
    +    1211          91 :   param_loader.loadParam("rc_joystick/channel_number", _rc_joystick_channel_);
    +    1212          91 :   param_loader.loadParam("rc_joystick/horizontal_speed", _rc_horizontal_speed_);
    +    1213          91 :   param_loader.loadParam("rc_joystick/vertical_speed", _rc_vertical_speed_);
    +    1214          91 :   param_loader.loadParam("rc_joystick/heading_rate", _rc_heading_rate_);
    +    1215             : 
    +    1216          91 :   param_loader.loadParam("rc_joystick/channels/pitch", _rc_channel_pitch_);
    +    1217          91 :   param_loader.loadParam("rc_joystick/channels/roll", _rc_channel_roll_);
    +    1218          91 :   param_loader.loadParam("rc_joystick/channels/heading", _rc_channel_heading_);
    +    1219          91 :   param_loader.loadParam("rc_joystick/channels/throttle", _rc_channel_throttle_);
    +    1220             : 
    +    1221          91 :   param_loader.loadParam("pirouette/speed", _pirouette_speed_);
    +    1222          91 :   param_loader.loadParam("pirouette/timer_rate", _pirouette_timer_rate_);
    +    1223             : 
    +    1224          91 :   param_loader.loadParam("safety/parachute/enabled", _parachute_enabled_);
    +    1225             : 
    +    1226             :   // --------------------------------------------------------------
    +    1227             :   // |             initialize the last control output             |
    +    1228             :   // --------------------------------------------------------------
    +    1229             : 
    +    1230          91 :   initializeControlOutput();
    +    1231             : 
    +    1232             :   // | --------------------- tf transformer --------------------- |
    +    1233             : 
    +    1234          91 :   transformer_ = std::make_shared<mrs_lib::Transformer>(nh_, "ControlManager");
    +    1235          91 :   transformer_->setDefaultPrefix(_uav_name_);
    +    1236          91 :   transformer_->retryLookupNewest(true);
    +    1237             : 
    +    1238             :   // | ------------------- scope timer logger ------------------- |
    +    1239             : 
    +    1240          91 :   param_loader.loadParam("scope_timer/enabled", scope_timer_enabled_);
    +    1241         273 :   const std::string scope_timer_log_filename = param_loader.loadParam2("scope_timer/log_filename", std::string(""));
    +    1242          91 :   scope_timer_logger_                        = std::make_shared<mrs_lib::ScopeTimerLogger>(scope_timer_log_filename, scope_timer_enabled_);
    +    1243             : 
    +    1244             :   // bind transformer to trackers and controllers for use
    +    1245          91 :   common_handlers_->transformer = transformer_;
    +    1246             : 
    +    1247             :   // bind scope timer to trackers and controllers for use
    +    1248          91 :   common_handlers_->scope_timer.enabled = scope_timer_enabled_;
    +    1249          91 :   common_handlers_->scope_timer.logger  = scope_timer_logger_;
    +    1250             : 
    +    1251          91 :   common_handlers_->safety_area.use_safety_area       = use_safety_area_;
    +    1252          91 :   common_handlers_->safety_area.isPointInSafetyArea2d = boost::bind(&ControlManager::isPointInSafetyArea2d, this, _1);
    +    1253          91 :   common_handlers_->safety_area.isPointInSafetyArea3d = boost::bind(&ControlManager::isPointInSafetyArea3d, this, _1);
    +    1254          91 :   common_handlers_->safety_area.getMinZ               = boost::bind(&ControlManager::getMinZ, this, _1);
    +    1255          91 :   common_handlers_->safety_area.getMaxZ               = boost::bind(&ControlManager::getMaxZ, this, _1);
    +    1256             : 
    +    1257          91 :   common_handlers_->getMass = boost::bind(&ControlManager::getMass, this);
    +    1258             : 
    +    1259          91 :   common_handlers_->detailed_model_params = loadDetailedUavModelParams(nh_, "ControlManager", _platform_config_, _custom_config_);
    +    1260             : 
    +    1261          91 :   common_handlers_->control_output_modalities = _hw_api_inputs_;
    +    1262             : 
    +    1263          91 :   common_handlers_->uav_name = _uav_name_;
    +    1264             : 
    +    1265          91 :   common_handlers_->parent_nh = nh_;
    +    1266             : 
    +    1267             :   // --------------------------------------------------------------
    +    1268             :   // |                        load trackers                       |
    +    1269             :   // --------------------------------------------------------------
    +    1270             : 
    +    1271         182 :   std::vector<std::string> custom_trackers;
    +    1272             : 
    +    1273          91 :   param_loader.loadParam("mrs_trackers", _tracker_names_);
    +    1274          91 :   param_loader.loadParam("trackers", custom_trackers);
    +    1275             : 
    +    1276          91 :   if (!custom_trackers.empty()) {
    +    1277           1 :     _tracker_names_.insert(_tracker_names_.end(), custom_trackers.begin(), custom_trackers.end());
    +    1278             :   }
    +    1279             : 
    +    1280          91 :   param_loader.loadParam("null_tracker", _null_tracker_name_);
    +    1281          91 :   param_loader.loadParam("landing_takeoff_tracker", _landoff_tracker_name_);
    +    1282             : 
    +    1283          91 :   tracker_loader_ = std::make_unique<pluginlib::ClassLoader<mrs_uav_managers::Tracker>>("mrs_uav_managers", "mrs_uav_managers::Tracker");
    +    1284             : 
    +    1285         638 :   for (int i = 0; i < int(_tracker_names_.size()); i++) {
    +    1286             : 
    +    1287        1094 :     std::string tracker_name = _tracker_names_[i];
    +    1288             : 
    +    1289             :     // load the controller parameters
    +    1290        1094 :     std::string address;
    +    1291        1094 :     std::string name_space;
    +    1292             :     bool        human_switchable;
    +    1293             : 
    +    1294         547 :     param_loader.loadParam(tracker_name + "/address", address);
    +    1295         547 :     param_loader.loadParam(tracker_name + "/namespace", name_space);
    +    1296         547 :     param_loader.loadParam(tracker_name + "/human_switchable", human_switchable, false);
    +    1297             : 
    +    1298        1641 :     TrackerParams new_tracker(address, name_space, human_switchable);
    +    1299         547 :     trackers_.insert(std::pair<std::string, TrackerParams>(tracker_name, new_tracker));
    +    1300             : 
    +    1301             :     try {
    +    1302         547 :       ROS_INFO("[ControlManager]: loading the tracker '%s'", new_tracker.address.c_str());
    +    1303         547 :       tracker_list_.push_back(tracker_loader_->createInstance(new_tracker.address.c_str()));
    +    1304             :     }
    +    1305           0 :     catch (pluginlib::CreateClassException& ex1) {
    +    1306           0 :       ROS_ERROR("[ControlManager]: CreateClassException for the tracker '%s'", new_tracker.address.c_str());
    +    1307           0 :       ROS_ERROR("[ControlManager]: Error: %s", ex1.what());
    +    1308           0 :       ros::shutdown();
    +    1309             :     }
    +    1310           0 :     catch (pluginlib::PluginlibException& ex) {
    +    1311           0 :       ROS_ERROR("[ControlManager]: PluginlibException for the tracker '%s'", new_tracker.address.c_str());
    +    1312           0 :       ROS_ERROR("[ControlManager]: Error: %s", ex.what());
    +    1313           0 :       ros::shutdown();
    +    1314             :     }
    +    1315             :   }
    +    1316             : 
    +    1317          91 :   ROS_INFO("[ControlManager]: trackers were loaded");
    +    1318             : 
    +    1319         638 :   for (int i = 0; i < int(tracker_list_.size()); i++) {
    +    1320             : 
    +    1321         547 :     std::map<std::string, TrackerParams>::iterator it;
    +    1322         547 :     it = trackers_.find(_tracker_names_[i]);
    +    1323             : 
    +    1324             :     // create private handlers
    +    1325             :     std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t> private_handlers =
    +    1326        1094 :         std::make_shared<mrs_uav_managers::control_manager::PrivateHandlers_t>();
    +    1327             : 
    +    1328         547 :     private_handlers->loadConfigFile = boost::bind(&ControlManager::loadConfigFile, this, _1, it->second.name_space);
    +    1329         547 :     private_handlers->name_space     = it->second.name_space;
    +    1330         547 :     private_handlers->runtime_name   = _tracker_names_[i];
    +    1331         547 :     private_handlers->param_loader   = std::make_unique<mrs_lib::ParamLoader>(ros::NodeHandle(nh_, it->second.name_space), _tracker_names_[i]);
    +    1332             : 
    +    1333         547 :     if (_custom_config_ != "") {
    +    1334         547 :       private_handlers->param_loader->addYamlFile(_custom_config_);
    +    1335             :     }
    +    1336             : 
    +    1337         547 :     if (_platform_config_ != "") {
    +    1338         547 :       private_handlers->param_loader->addYamlFile(_platform_config_);
    +    1339             :     }
    +    1340             : 
    +    1341         547 :     if (_world_config_ != "") {
    +    1342         547 :       private_handlers->param_loader->addYamlFile(_world_config_);
    +    1343             :     }
    +    1344             : 
    +    1345         547 :     if (_network_config_ != "") {
    +    1346         547 :       private_handlers->param_loader->addYamlFile(_network_config_);
    +    1347             :     }
    +    1348             : 
    +    1349         547 :     bool success = false;
    +    1350             : 
    +    1351             :     try {
    +    1352         547 :       ROS_INFO("[ControlManager]: initializing the tracker '%s'", it->second.address.c_str());
    +    1353         547 :       success = tracker_list_[i]->initialize(ros::NodeHandle(nh_, it->second.name_space), common_handlers_, private_handlers);
    +    1354             :     }
    +    1355           0 :     catch (std::runtime_error& ex) {
    +    1356           0 :       ROS_ERROR("[ControlManager]: exception caught during tracker initialization: '%s'", ex.what());
    +    1357             :     }
    +    1358             : 
    +    1359         547 :     if (!success) {
    +    1360           0 :       ROS_ERROR("[ControlManager]: failed to initialize the tracker '%s'", it->second.address.c_str());
    +    1361           0 :       ros::shutdown();
    +    1362             :     }
    +    1363             :   }
    +    1364             : 
    +    1365          91 :   ROS_INFO("[ControlManager]: trackers were initialized");
    +    1366             : 
    +    1367             :   // --------------------------------------------------------------
    +    1368             :   // |           check the existance of selected trackers         |
    +    1369             :   // --------------------------------------------------------------
    +    1370             : 
    +    1371             :   // | ------ check for the existance of the hover tracker ------ |
    +    1372             : 
    +    1373             :   // check if the hover_tracker is within the loaded trackers
    +    1374             :   {
    +    1375          91 :     auto idx = idxInVector(_ehover_tracker_name_, _tracker_names_);
    +    1376             : 
    +    1377          91 :     if (idx) {
    +    1378          91 :       _ehover_tracker_idx_ = idx.value();
    +    1379             :     } else {
    +    1380           0 :       ROS_ERROR("[ControlManager]: the safety/hover_tracker (%s) is not within the loaded trackers", _ehover_tracker_name_.c_str());
    +    1381           0 :       ros::shutdown();
    +    1382             :     }
    +    1383             :   }
    +    1384             : 
    +    1385             :   // | ----- check for the existence of the landoff tracker ----- |
    +    1386             : 
    +    1387             :   {
    +    1388          91 :     auto idx = idxInVector(_landoff_tracker_name_, _tracker_names_);
    +    1389             : 
    +    1390          91 :     if (idx) {
    +    1391          91 :       _landoff_tracker_idx_ = idx.value();
    +    1392             :     } else {
    +    1393           0 :       ROS_ERROR("[ControlManager]: the landoff tracker (%s) is not within the loaded trackers", _landoff_tracker_name_.c_str());
    +    1394           0 :       ros::shutdown();
    +    1395             :     }
    +    1396             :   }
    +    1397             : 
    +    1398             :   // | ------- check for the existence of the null tracker ------ |
    +    1399             : 
    +    1400             :   {
    +    1401          91 :     auto idx = idxInVector(_null_tracker_name_, _tracker_names_);
    +    1402             : 
    +    1403          91 :     if (idx) {
    +    1404          91 :       _null_tracker_idx_ = idx.value();
    +    1405             :     } else {
    +    1406           0 :       ROS_ERROR("[ControlManager]: the null tracker (%s) is not within the loaded trackers", _null_tracker_name_.c_str());
    +    1407           0 :       ros::shutdown();
    +    1408             :     }
    +    1409             :   }
    +    1410             : 
    +    1411             :   // --------------------------------------------------------------
    +    1412             :   // |         check existance of trackers for joystick           |
    +    1413             :   // --------------------------------------------------------------
    +    1414             : 
    +    1415          91 :   if (_joystick_enabled_) {
    +    1416             : 
    +    1417          91 :     auto idx = idxInVector(_joystick_tracker_name_, _tracker_names_);
    +    1418             : 
    +    1419          91 :     if (idx) {
    +    1420          91 :       _joystick_tracker_idx_ = idx.value();
    +    1421             :     } else {
    +    1422           0 :       ROS_ERROR("[ControlManager]: the joystick tracker (%s) is not within the loaded trackers", _joystick_tracker_name_.c_str());
    +    1423           0 :       ros::shutdown();
    +    1424             :     }
    +    1425             :   }
    +    1426             : 
    +    1427          91 :   if (_bumper_switch_tracker_) {
    +    1428             : 
    +    1429          91 :     auto idx = idxInVector(_bumper_tracker_name_, _tracker_names_);
    +    1430             : 
    +    1431          91 :     if (!idx) {
    +    1432           0 :       ROS_ERROR("[ControlManager]: the bumper tracker (%s) is not within the loaded trackers", _bumper_tracker_name_.c_str());
    +    1433           0 :       ros::shutdown();
    +    1434             :     }
    +    1435             :   }
    +    1436             : 
    +    1437             :   {
    +    1438          91 :     auto idx = idxInVector(_joystick_fallback_tracker_name_, _tracker_names_);
    +    1439             : 
    +    1440          91 :     if (idx) {
    +    1441          91 :       _joystick_fallback_tracker_idx_ = idx.value();
    +    1442             :     } else {
    +    1443           0 :       ROS_ERROR("[ControlManager]: the joystick fallback tracker (%s) is not within the loaded trackers", _joystick_fallback_tracker_name_.c_str());
    +    1444           0 :       ros::shutdown();
    +    1445             :     }
    +    1446             :   }
    +    1447             : 
    +    1448             :   // --------------------------------------------------------------
    +    1449             :   // |                    load the controllers                    |
    +    1450             :   // --------------------------------------------------------------
    +    1451             : 
    +    1452         182 :   std::vector<std::string> custom_controllers;
    +    1453             : 
    +    1454          91 :   param_loader.loadParam("mrs_controllers", _controller_names_);
    +    1455          91 :   param_loader.loadParam("controllers", custom_controllers);
    +    1456             : 
    +    1457          91 :   if (!custom_controllers.empty()) {
    +    1458           0 :     _controller_names_.insert(_controller_names_.end(), custom_controllers.begin(), custom_controllers.end());
    +    1459             :   }
    +    1460             : 
    +    1461          91 :   controller_loader_ = std::make_unique<pluginlib::ClassLoader<mrs_uav_managers::Controller>>("mrs_uav_managers", "mrs_uav_managers::Controller");
    +    1462             : 
    +    1463             :   // for each controller in the list
    +    1464         546 :   for (int i = 0; i < int(_controller_names_.size()); i++) {
    +    1465             : 
    +    1466         910 :     std::string controller_name = _controller_names_[i];
    +    1467             : 
    +    1468             :     // load the controller parameters
    +    1469         910 :     std::string address;
    +    1470         910 :     std::string name_space;
    +    1471             :     double      eland_threshold, failsafe_threshold, odometry_innovation_threshold;
    +    1472             :     bool        human_switchable;
    +    1473         455 :     param_loader.loadParam(controller_name + "/address", address);
    +    1474         455 :     param_loader.loadParam(controller_name + "/namespace", name_space);
    +    1475         455 :     param_loader.loadParam(controller_name + "/eland_threshold", eland_threshold);
    +    1476         455 :     param_loader.loadParam(controller_name + "/failsafe_threshold", failsafe_threshold);
    +    1477         455 :     param_loader.loadParam(controller_name + "/odometry_innovation_threshold", odometry_innovation_threshold);
    +    1478         455 :     param_loader.loadParam(controller_name + "/human_switchable", human_switchable, false);
    +    1479             : 
    +    1480             :     // check if the controller can output some of the required outputs
    +    1481             :     {
    +    1482             : 
    +    1483         455 :       ControlOutputModalities_t outputs;
    +    1484         455 :       param_loader.loadParam(controller_name + "/outputs/actuators", outputs.actuators, false);
    +    1485         455 :       param_loader.loadParam(controller_name + "/outputs/control_group", outputs.control_group, false);
    +    1486         455 :       param_loader.loadParam(controller_name + "/outputs/attitude_rate", outputs.attitude_rate, false);
    +    1487         455 :       param_loader.loadParam(controller_name + "/outputs/attitude", outputs.attitude, false);
    +    1488         455 :       param_loader.loadParam(controller_name + "/outputs/acceleration_hdg_rate", outputs.acceleration_hdg_rate, false);
    +    1489         455 :       param_loader.loadParam(controller_name + "/outputs/acceleration_hdg", outputs.acceleration_hdg, false);
    +    1490         455 :       param_loader.loadParam(controller_name + "/outputs/velocity_hdg_rate", outputs.velocity_hdg_rate, false);
    +    1491         455 :       param_loader.loadParam(controller_name + "/outputs/velocity_hdg", outputs.velocity_hdg, false);
    +    1492         455 :       param_loader.loadParam(controller_name + "/outputs/position", outputs.position, false);
    +    1493             : 
    +    1494         455 :       bool meets_actuators             = (_hw_api_inputs_.actuators && outputs.actuators);
    +    1495         455 :       bool meets_control_group         = (_hw_api_inputs_.control_group && outputs.control_group);
    +    1496         455 :       bool meets_attitude_rate         = (_hw_api_inputs_.attitude_rate && outputs.attitude_rate);
    +    1497         455 :       bool meets_attitude              = (_hw_api_inputs_.attitude && outputs.attitude);
    +    1498         455 :       bool meets_acceleration_hdg_rate = (_hw_api_inputs_.acceleration_hdg_rate && outputs.acceleration_hdg_rate);
    +    1499         455 :       bool meets_acceleration_hdg      = (_hw_api_inputs_.acceleration_hdg && outputs.acceleration_hdg);
    +    1500         455 :       bool meets_velocity_hdg_rate     = (_hw_api_inputs_.velocity_hdg_rate && outputs.velocity_hdg_rate);
    +    1501         455 :       bool meets_velocity_hdg          = (_hw_api_inputs_.velocity_hdg && outputs.velocity_hdg);
    +    1502         455 :       bool meets_position              = (_hw_api_inputs_.position && outputs.position);
    +    1503             : 
    +    1504         440 :       bool meets_requirements = meets_actuators || meets_control_group || meets_attitude_rate || meets_attitude || meets_acceleration_hdg_rate ||
    +    1505         895 :                                 meets_acceleration_hdg || meets_velocity_hdg_rate || meets_velocity_hdg || meets_position;
    +    1506             : 
    +    1507         455 :       if (!meets_requirements) {
    +    1508             : 
    +    1509           0 :         ROS_ERROR("[ControlManager]: the controller '%s' does not meet the control output requirements, which are some of the following",
    +    1510             :                   controller_name.c_str());
    +    1511             : 
    +    1512           0 :         if (_hw_api_inputs_.actuators) {
    +    1513           0 :           ROS_ERROR("[ControlManager]: - actuators");
    +    1514             :         }
    +    1515             : 
    +    1516           0 :         if (_hw_api_inputs_.control_group) {
    +    1517           0 :           ROS_ERROR("[ControlManager]: - control group");
    +    1518             :         }
    +    1519             : 
    +    1520           0 :         if (_hw_api_inputs_.attitude_rate) {
    +    1521           0 :           ROS_ERROR("[ControlManager]: - attitude rate");
    +    1522             :         }
    +    1523             : 
    +    1524           0 :         if (_hw_api_inputs_.attitude) {
    +    1525           0 :           ROS_ERROR("[ControlManager]: - attitude");
    +    1526             :         }
    +    1527             : 
    +    1528           0 :         if (_hw_api_inputs_.acceleration_hdg_rate) {
    +    1529           0 :           ROS_ERROR("[ControlManager]: - acceleration+hdg rate");
    +    1530             :         }
    +    1531             : 
    +    1532           0 :         if (_hw_api_inputs_.acceleration_hdg) {
    +    1533           0 :           ROS_ERROR("[ControlManager]: - acceleration+hdg");
    +    1534             :         }
    +    1535             : 
    +    1536           0 :         if (_hw_api_inputs_.velocity_hdg_rate) {
    +    1537           0 :           ROS_ERROR("[ControlManager]: - velocity+hdg rate");
    +    1538             :         }
    +    1539             : 
    +    1540           0 :         if (_hw_api_inputs_.velocity_hdg) {
    +    1541           0 :           ROS_ERROR("[ControlManager]: - velocity+hdg");
    +    1542             :         }
    +    1543             : 
    +    1544           0 :         if (_hw_api_inputs_.position) {
    +    1545           0 :           ROS_ERROR("[ControlManager]: - position");
    +    1546             :         }
    +    1547             : 
    +    1548           0 :         ros::shutdown();
    +    1549             :       }
    +    1550             : 
    +    1551         455 :       if ((_hw_api_inputs_.actuators || _hw_api_inputs_.control_group) && !common_handlers_->detailed_model_params) {
    +    1552           0 :         ROS_ERROR(
    +    1553             :             "[ControlManager]: the HW API supports 'actuators' or 'control_group' input, but the 'detailed uav model params' were not loaded sucessfully");
    +    1554           0 :         ros::shutdown();
    +    1555             :       }
    +    1556             :     }
    +    1557             : 
    +    1558             :     // | --- alter the timer rates based on the hw capabilities --- |
    +    1559             : 
    +    1560         455 :     CONTROL_OUTPUT lowest_output = getLowestOuput(_hw_api_inputs_);
    +    1561             : 
    +    1562         455 :     if (lowest_output == ACTUATORS_CMD || lowest_output == CONTROL_GROUP) {
    +    1563          30 :       _safety_timer_rate_     = 200.0;
    +    1564          30 :       desired_uav_state_rate_ = 250.0;
    +    1565         425 :     } else if (lowest_output == ATTITUDE_RATE || lowest_output == ATTITUDE) {
    +    1566         335 :       _safety_timer_rate_     = 100.0;
    +    1567         335 :       desired_uav_state_rate_ = 100.0;
    +    1568          90 :     } else if (lowest_output == ACCELERATION_HDG_RATE || lowest_output == ACCELERATION_HDG) {
    +    1569          20 :       _safety_timer_rate_     = 30.0;
    +    1570          20 :       _status_timer_rate_     = 1.0;
    +    1571          20 :       desired_uav_state_rate_ = 40.0;
    +    1572             : 
    +    1573          20 :       if (_uav_state_max_missing_time_ < 0.2) {
    +    1574           4 :         _uav_state_max_missing_time_ = 0.2;
    +    1575             :       }
    +    1576          70 :     } else if (lowest_output >= VELOCITY_HDG_RATE) {
    +    1577          70 :       _safety_timer_rate_     = 20.0;
    +    1578          70 :       _status_timer_rate_     = 1.0;
    +    1579          70 :       desired_uav_state_rate_ = 20.0;
    +    1580             : 
    +    1581          70 :       if (_uav_state_max_missing_time_ < 1.0) {
    +    1582          14 :         _uav_state_max_missing_time_ = 1.0;
    +    1583             :       }
    +    1584             :     }
    +    1585             : 
    +    1586         455 :     if (eland_threshold == 0) {
    +    1587          92 :       eland_threshold = 1e6;
    +    1588             :     }
    +    1589             : 
    +    1590         455 :     if (failsafe_threshold == 0) {
    +    1591          92 :       failsafe_threshold = 1e6;
    +    1592             :     }
    +    1593             : 
    +    1594         455 :     if (odometry_innovation_threshold == 0) {
    +    1595          93 :       odometry_innovation_threshold = 1e6;
    +    1596             :     }
    +    1597             : 
    +    1598        1365 :     ControllerParams new_controller(address, name_space, eland_threshold, failsafe_threshold, odometry_innovation_threshold, human_switchable);
    +    1599         455 :     controllers_.insert(std::pair<std::string, ControllerParams>(controller_name, new_controller));
    +    1600             : 
    +    1601             :     try {
    +    1602         455 :       ROS_INFO("[ControlManager]: loading the controller '%s'", new_controller.address.c_str());
    +    1603         455 :       controller_list_.push_back(controller_loader_->createInstance(new_controller.address.c_str()));
    +    1604             :     }
    +    1605           0 :     catch (pluginlib::CreateClassException& ex1) {
    +    1606           0 :       ROS_ERROR("[ControlManager]: CreateClassException for the controller '%s'", new_controller.address.c_str());
    +    1607           0 :       ROS_ERROR("[ControlManager]: Error: %s", ex1.what());
    +    1608           0 :       ros::shutdown();
    +    1609             :     }
    +    1610           0 :     catch (pluginlib::PluginlibException& ex) {
    +    1611           0 :       ROS_ERROR("[ControlManager]: PluginlibException for the controller '%s'", new_controller.address.c_str());
    +    1612           0 :       ROS_ERROR("[ControlManager]: Error: %s", ex.what());
    +    1613           0 :       ros::shutdown();
    +    1614             :     }
    +    1615             :   }
    +    1616             : 
    +    1617          91 :   ROS_INFO("[ControlManager]: controllers were loaded");
    +    1618             : 
    +    1619         546 :   for (int i = 0; i < int(controller_list_.size()); i++) {
    +    1620             : 
    +    1621         455 :     std::map<std::string, ControllerParams>::iterator it;
    +    1622         455 :     it = controllers_.find(_controller_names_[i]);
    +    1623             : 
    +    1624             :     // create private handlers
    +    1625             :     std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t> private_handlers =
    +    1626         910 :         std::make_shared<mrs_uav_managers::control_manager::PrivateHandlers_t>();
    +    1627             : 
    +    1628         455 :     private_handlers->loadConfigFile = boost::bind(&ControlManager::loadConfigFile, this, _1, it->second.name_space);
    +    1629         455 :     private_handlers->name_space     = it->second.name_space;
    +    1630         455 :     private_handlers->runtime_name   = _controller_names_[i];
    +    1631         455 :     private_handlers->param_loader   = std::make_unique<mrs_lib::ParamLoader>(ros::NodeHandle(nh_, it->second.name_space), _controller_names_[i]);
    +    1632             : 
    +    1633         455 :     if (_custom_config_ != "") {
    +    1634         455 :       private_handlers->param_loader->addYamlFile(_custom_config_);
    +    1635             :     }
    +    1636             : 
    +    1637         455 :     if (_platform_config_ != "") {
    +    1638         455 :       private_handlers->param_loader->addYamlFile(_platform_config_);
    +    1639             :     }
    +    1640             : 
    +    1641         455 :     if (_world_config_ != "") {
    +    1642         455 :       private_handlers->param_loader->addYamlFile(_world_config_);
    +    1643             :     }
    +    1644             : 
    +    1645         455 :     if (_network_config_ != "") {
    +    1646         455 :       private_handlers->param_loader->addYamlFile(_network_config_);
    +    1647             :     }
    +    1648             : 
    +    1649         455 :     bool success = false;
    +    1650             : 
    +    1651             :     try {
    +    1652             : 
    +    1653         455 :       ROS_INFO("[ControlManager]: initializing the controller '%s'", it->second.address.c_str());
    +    1654         455 :       success = controller_list_[i]->initialize(ros::NodeHandle(nh_, it->second.name_space), common_handlers_, private_handlers);
    +    1655             :     }
    +    1656           0 :     catch (std::runtime_error& ex) {
    +    1657           0 :       ROS_ERROR("[ControlManager]: exception caught during controller initialization: '%s'", ex.what());
    +    1658             :     }
    +    1659             : 
    +    1660         455 :     if (!success) {
    +    1661           0 :       ROS_ERROR("[ControlManager]: failed to initialize the controller '%s'", it->second.address.c_str());
    +    1662           0 :       ros::shutdown();
    +    1663             :     }
    +    1664             :   }
    +    1665             : 
    +    1666          91 :   ROS_INFO("[ControlManager]: controllers were initialized");
    +    1667             : 
    +    1668             :   {
    +    1669          91 :     auto idx = idxInVector(_failsafe_controller_name_, _controller_names_);
    +    1670             : 
    +    1671          91 :     if (idx) {
    +    1672          91 :       _failsafe_controller_idx_ = idx.value();
    +    1673             :     } else {
    +    1674           0 :       ROS_ERROR("[ControlManager]: the failsafe controller (%s) is not within the loaded controllers", _failsafe_controller_name_.c_str());
    +    1675           0 :       ros::shutdown();
    +    1676             :     }
    +    1677             :   }
    +    1678             : 
    +    1679             :   {
    +    1680          91 :     auto idx = idxInVector(_eland_controller_name_, _controller_names_);
    +    1681             : 
    +    1682          91 :     if (idx) {
    +    1683          91 :       _eland_controller_idx_ = idx.value();
    +    1684             :     } else {
    +    1685           0 :       ROS_ERROR("[ControlManager]: the eland controller (%s) is not within the loaded controllers", _eland_controller_name_.c_str());
    +    1686           0 :       ros::shutdown();
    +    1687             :     }
    +    1688             :   }
    +    1689             : 
    +    1690             :   {
    +    1691          91 :     auto idx = idxInVector(_joystick_controller_name_, _controller_names_);
    +    1692             : 
    +    1693          91 :     if (idx) {
    +    1694          91 :       _joystick_controller_idx_ = idx.value();
    +    1695             :     } else {
    +    1696           0 :       ROS_ERROR("[ControlManager]: the joystick controller (%s) is not within the loaded controllers", _joystick_controller_name_.c_str());
    +    1697           0 :       ros::shutdown();
    +    1698             :     }
    +    1699             :   }
    +    1700             : 
    +    1701          91 :   if (_bumper_switch_controller_) {
    +    1702             : 
    +    1703          91 :     auto idx = idxInVector(_bumper_controller_name_, _controller_names_);
    +    1704             : 
    +    1705          91 :     if (!idx) {
    +    1706           0 :       ROS_ERROR("[ControlManager]: the bumper controller (%s) is not within the loaded controllers", _bumper_controller_name_.c_str());
    +    1707           0 :       ros::shutdown();
    +    1708             :     }
    +    1709             :   }
    +    1710             : 
    +    1711             :   {
    +    1712          91 :     auto idx = idxInVector(_joystick_fallback_controller_name_, _controller_names_);
    +    1713             : 
    +    1714          91 :     if (idx) {
    +    1715          91 :       _joystick_fallback_controller_idx_ = idx.value();
    +    1716             :     } else {
    +    1717           0 :       ROS_ERROR("[ControlManager]: the joystick fallback controller (%s) is not within the loaded controllers", _joystick_fallback_controller_name_.c_str());
    +    1718           0 :       ros::shutdown();
    +    1719             :     }
    +    1720             :   }
    +    1721             : 
    +    1722             :   // --------------------------------------------------------------
    +    1723             :   // |                  activate the NullTracker                  |
    +    1724             :   // --------------------------------------------------------------
    +    1725             : 
    +    1726          91 :   ROS_INFO("[ControlManager]: activating the null tracker");
    +    1727             : 
    +    1728          91 :   tracker_list_[_null_tracker_idx_]->activate(last_tracker_cmd_);
    +    1729          91 :   active_tracker_idx_ = _null_tracker_idx_;
    +    1730             : 
    +    1731             :   // --------------------------------------------------------------
    +    1732             :   // |    activate the eland controller as the first controller   |
    +    1733             :   // --------------------------------------------------------------
    +    1734             : 
    +    1735          91 :   ROS_INFO("[ControlManager]: activating the the eland controller (%s) as the first controller", _controller_names_[_eland_controller_idx_].c_str());
    +    1736             : 
    +    1737          91 :   controller_list_[_eland_controller_idx_]->activate(last_control_output_);
    +    1738          91 :   active_controller_idx_ = _eland_controller_idx_;
    +    1739             : 
    +    1740             :   // update the time
    +    1741             :   {
    +    1742         182 :     std::scoped_lock lock(mutex_controller_tracker_switch_time_);
    +    1743             : 
    +    1744          91 :     controller_tracker_switch_time_ = ros::Time::now();
    +    1745             :   }
    +    1746             : 
    +    1747          91 :   output_enabled_ = false;
    +    1748             : 
    +    1749             :   // | --------------- set the default constraints -------------- |
    +    1750             : 
    +    1751          91 :   sanitized_constraints_ = current_constraints_;
    +    1752          91 :   setConstraints(current_constraints_);
    +    1753             : 
    +    1754             :   // | ------------------------ profiler ------------------------ |
    +    1755             : 
    +    1756          91 :   profiler_ = mrs_lib::Profiler(nh_, "ControlManager", _profiler_enabled_);
    +    1757             : 
    +    1758             :   // | ----------------------- publishers ----------------------- |
    +    1759             : 
    +    1760          91 :   control_output_publisher_ = OutputPublisher(nh_);
    +    1761             : 
    +    1762          91 :   ph_controller_diagnostics_             = mrs_lib::PublisherHandler<mrs_msgs::ControllerDiagnostics>(nh_, "controller_diagnostics_out", 1);
    +    1763          91 :   ph_tracker_cmd_                        = mrs_lib::PublisherHandler<mrs_msgs::TrackerCommand>(nh_, "tracker_cmd_out", 1);
    +    1764          91 :   ph_mrs_odom_input_                     = mrs_lib::PublisherHandler<mrs_msgs::EstimatorInput>(nh_, "estimator_input_out", 1);
    +    1765          91 :   ph_control_reference_odom_             = mrs_lib::PublisherHandler<nav_msgs::Odometry>(nh_, "control_reference_out", 1);
    +    1766          91 :   ph_diagnostics_                        = mrs_lib::PublisherHandler<mrs_msgs::ControlManagerDiagnostics>(nh_, "diagnostics_out", 1);
    +    1767          91 :   ph_offboard_on_                        = mrs_lib::PublisherHandler<std_msgs::Empty>(nh_, "offboard_on_out", 1);
    +    1768          91 :   ph_tilt_error_                         = mrs_lib::PublisherHandler<mrs_msgs::Float64Stamped>(nh_, "tilt_error_out", 1);
    +    1769          91 :   ph_mass_estimate_                      = mrs_lib::PublisherHandler<std_msgs::Float64>(nh_, "mass_estimate_out", 1, false, 10.0);
    +    1770          91 :   ph_mass_nominal_                       = mrs_lib::PublisherHandler<std_msgs::Float64>(nh_, "mass_nominal_out", 1, true);
    +    1771          91 :   ph_throttle_                           = mrs_lib::PublisherHandler<std_msgs::Float64>(nh_, "throttle_out", 1, false, 10.0);
    +    1772          91 :   ph_thrust_                             = mrs_lib::PublisherHandler<std_msgs::Float64>(nh_, "thrust_out", 1, false, 100.0);
    +    1773          91 :   ph_control_error_                      = mrs_lib::PublisherHandler<mrs_msgs::ControlError>(nh_, "control_error_out", 1);
    +    1774          91 :   ph_safety_area_markers_                = mrs_lib::PublisherHandler<visualization_msgs::MarkerArray>(nh_, "safety_area_markers_out", 1, true, 1.0);
    +    1775          91 :   ph_safety_area_coordinates_markers_    = mrs_lib::PublisherHandler<visualization_msgs::MarkerArray>(nh_, "safety_area_coordinates_markers_out", 1, true, 1.0);
    +    1776          91 :   ph_disturbances_markers_               = mrs_lib::PublisherHandler<visualization_msgs::MarkerArray>(nh_, "disturbances_markers_out", 1, false, 10.0);
    +    1777          91 :   ph_current_constraints_                = mrs_lib::PublisherHandler<mrs_msgs::DynamicsConstraints>(nh_, "current_constraints_out", 1);
    +    1778          91 :   ph_heading_                            = mrs_lib::PublisherHandler<mrs_msgs::Float64Stamped>(nh_, "heading_out", 1);
    +    1779          91 :   ph_speed_                              = mrs_lib::PublisherHandler<mrs_msgs::Float64Stamped>(nh_, "speed_out", 1, false, 10.0);
    +    1780          91 :   pub_debug_original_trajectory_poses_   = mrs_lib::PublisherHandler<geometry_msgs::PoseArray>(nh_, "trajectory_original/poses_out", 1, true);
    +    1781          91 :   pub_debug_original_trajectory_markers_ = mrs_lib::PublisherHandler<visualization_msgs::MarkerArray>(nh_, "trajectory_original/markers_out", 1, true);
    +    1782             : 
    +    1783             :   // | ------------------ publish nominal mass ------------------ |
    +    1784             : 
    +    1785             :   {
    +    1786          91 :     std_msgs::Float64 nominal_mass;
    +    1787             : 
    +    1788          91 :     nominal_mass.data = _uav_mass_;
    +    1789             : 
    +    1790          91 :     ph_mass_nominal_.publish(nominal_mass);
    +    1791             :   }
    +    1792             : 
    +    1793             :   // | ----------------------- subscribers ---------------------- |
    +    1794             : 
    +    1795         182 :   mrs_lib::SubscribeHandlerOptions shopts;
    +    1796          91 :   shopts.nh                 = nh_;
    +    1797          91 :   shopts.node_name          = "ControlManager";
    +    1798          91 :   shopts.no_message_timeout = mrs_lib::no_timeout;
    +    1799          91 :   shopts.threadsafe         = true;
    +    1800          91 :   shopts.autostart          = true;
    +    1801          91 :   shopts.queue_size         = 10;
    +    1802          91 :   shopts.transport_hints    = ros::TransportHints().tcpNoDelay();
    +    1803             : 
    +    1804          91 :   if (_state_input_ == INPUT_UAV_STATE) {
    +    1805          91 :     sh_uav_state_ = mrs_lib::SubscribeHandler<mrs_msgs::UavState>(shopts, "uav_state_in", &ControlManager::callbackUavState, this);
    +    1806           0 :   } else if (_state_input_ == INPUT_ODOMETRY) {
    +    1807           0 :     sh_odometry_ = mrs_lib::SubscribeHandler<nav_msgs::Odometry>(shopts, "odometry_in", &ControlManager::callbackOdometry, this);
    +    1808             :   }
    +    1809             : 
    +    1810          91 :   if (_odometry_innovation_check_enabled_) {
    +    1811          91 :     sh_odometry_innovation_ = mrs_lib::SubscribeHandler<nav_msgs::Odometry>(shopts, "odometry_innovation_in");
    +    1812             :   }
    +    1813             : 
    +    1814          91 :   sh_bumper_    = mrs_lib::SubscribeHandler<mrs_msgs::ObstacleSectors>(shopts, "bumper_sectors_in");
    +    1815          91 :   sh_max_z_     = mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped>(shopts, "max_z_in");
    +    1816          91 :   sh_joystick_  = mrs_lib::SubscribeHandler<sensor_msgs::Joy>(shopts, "joystick_in", &ControlManager::callbackJoystick, this);
    +    1817          91 :   sh_gnss_      = mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix>(shopts, "gnss_in", &ControlManager::callbackGNSS, this);
    +    1818          91 :   sh_hw_api_rc_ = mrs_lib::SubscribeHandler<mrs_msgs::HwApiRcChannels>(shopts, "hw_api_rc_in", &ControlManager::callbackRC, this);
    +    1819             : 
    +    1820          91 :   sh_hw_api_status_ = mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus>(shopts, "hw_api_status_in", &ControlManager::callbackHwApiStatus, this);
    +    1821             : 
    +    1822             :   // | -------------------- general services -------------------- |
    +    1823             : 
    +    1824          91 :   service_server_switch_tracker_             = nh_.advertiseService("switch_tracker_in", &ControlManager::callbackSwitchTracker, this);
    +    1825          91 :   service_server_switch_controller_          = nh_.advertiseService("switch_controller_in", &ControlManager::callbackSwitchController, this);
    +    1826          91 :   service_server_reset_tracker_              = nh_.advertiseService("tracker_reset_static_in", &ControlManager::callbackTrackerResetStatic, this);
    +    1827          91 :   service_server_hover_                      = nh_.advertiseService("hover_in", &ControlManager::callbackHover, this);
    +    1828          91 :   service_server_ehover_                     = nh_.advertiseService("ehover_in", &ControlManager::callbackEHover, this);
    +    1829          91 :   service_server_failsafe_                   = nh_.advertiseService("failsafe_in", &ControlManager::callbackFailsafe, this);
    +    1830          91 :   service_server_failsafe_escalating_        = nh_.advertiseService("failsafe_escalating_in", &ControlManager::callbackFailsafeEscalating, this);
    +    1831          91 :   service_server_toggle_output_              = nh_.advertiseService("toggle_output_in", &ControlManager::callbackToggleOutput, this);
    +    1832          91 :   service_server_arm_                        = nh_.advertiseService("arm_in", &ControlManager::callbackArm, this);
    +    1833          91 :   service_server_enable_callbacks_           = nh_.advertiseService("enable_callbacks_in", &ControlManager::callbackEnableCallbacks, this);
    +    1834          91 :   service_server_set_constraints_            = nh_.advertiseService("set_constraints_in", &ControlManager::callbackSetConstraints, this);
    +    1835          91 :   service_server_use_joystick_               = nh_.advertiseService("use_joystick_in", &ControlManager::callbackUseJoystick, this);
    +    1836          91 :   service_server_use_safety_area_            = nh_.advertiseService("use_safety_area_in", &ControlManager::callbackUseSafetyArea, this);
    +    1837          91 :   service_server_eland_                      = nh_.advertiseService("eland_in", &ControlManager::callbackEland, this);
    +    1838          91 :   service_server_parachute_                  = nh_.advertiseService("parachute_in", &ControlManager::callbackParachute, this);
    +    1839          91 :   service_server_set_min_z_                  = nh_.advertiseService("set_min_z_in", &ControlManager::callbackSetMinZ, this);
    +    1840          91 :   service_server_transform_reference_        = nh_.advertiseService("transform_reference_in", &ControlManager::callbackTransformReference, this);
    +    1841          91 :   service_server_transform_pose_             = nh_.advertiseService("transform_pose_in", &ControlManager::callbackTransformPose, this);
    +    1842          91 :   service_server_transform_vector3_          = nh_.advertiseService("transform_vector3_in", &ControlManager::callbackTransformVector3, this);
    +    1843          91 :   service_server_bumper_enabler_             = nh_.advertiseService("bumper_in", &ControlManager::callbackEnableBumper, this);
    +    1844          91 :   service_server_get_min_z_                  = nh_.advertiseService("get_min_z_in", &ControlManager::callbackGetMinZ, this);
    +    1845          91 :   service_server_validate_reference_         = nh_.advertiseService("validate_reference_in", &ControlManager::callbackValidateReference, this);
    +    1846          91 :   service_server_validate_reference_2d_      = nh_.advertiseService("validate_reference_2d_in", &ControlManager::callbackValidateReference2d, this);
    +    1847          91 :   service_server_validate_reference_list_    = nh_.advertiseService("validate_reference_list_in", &ControlManager::callbackValidateReferenceList, this);
    +    1848          91 :   service_server_start_trajectory_tracking_  = nh_.advertiseService("start_trajectory_tracking_in", &ControlManager::callbackStartTrajectoryTracking, this);
    +    1849          91 :   service_server_stop_trajectory_tracking_   = nh_.advertiseService("stop_trajectory_tracking_in", &ControlManager::callbackStopTrajectoryTracking, this);
    +    1850          91 :   service_server_resume_trajectory_tracking_ = nh_.advertiseService("resume_trajectory_tracking_in", &ControlManager::callbackResumeTrajectoryTracking, this);
    +    1851          91 :   service_server_goto_trajectory_start_      = nh_.advertiseService("goto_trajectory_start_in", &ControlManager::callbackGotoTrajectoryStart, this);
    +    1852             : 
    +    1853          91 :   sch_arming_                 = mrs_lib::ServiceClientHandler<std_srvs::SetBool>(nh_, "hw_api_arming_out");
    +    1854          91 :   sch_eland_                  = mrs_lib::ServiceClientHandler<std_srvs::Trigger>(nh_, "eland_out");
    +    1855          91 :   sch_shutdown_               = mrs_lib::ServiceClientHandler<std_srvs::Trigger>(nh_, "shutdown_out");
    +    1856          91 :   sch_set_odometry_callbacks_ = mrs_lib::ServiceClientHandler<std_srvs::SetBool>(nh_, "set_odometry_callbacks_out");
    +    1857          91 :   sch_ungrip_                 = mrs_lib::ServiceClientHandler<std_srvs::Trigger>(nh_, "ungrip_out");
    +    1858          91 :   sch_parachute_              = mrs_lib::ServiceClientHandler<std_srvs::Trigger>(nh_, "parachute_out");
    +    1859             : 
    +    1860             :   // | ---------------- setpoint command services --------------- |
    +    1861             : 
    +    1862             :   // human callable
    +    1863          91 :   service_server_goto_                 = nh_.advertiseService("goto_in", &ControlManager::callbackGoto, this);
    +    1864          91 :   service_server_goto_fcu_             = nh_.advertiseService("goto_fcu_in", &ControlManager::callbackGotoFcu, this);
    +    1865          91 :   service_server_goto_relative_        = nh_.advertiseService("goto_relative_in", &ControlManager::callbackGotoRelative, this);
    +    1866          91 :   service_server_goto_altitude_        = nh_.advertiseService("goto_altitude_in", &ControlManager::callbackGotoAltitude, this);
    +    1867          91 :   service_server_set_heading_          = nh_.advertiseService("set_heading_in", &ControlManager::callbackSetHeading, this);
    +    1868          91 :   service_server_set_heading_relative_ = nh_.advertiseService("set_heading_relative_in", &ControlManager::callbackSetHeadingRelative, this);
    +    1869             : 
    +    1870          91 :   service_server_reference_ = nh_.advertiseService("reference_in", &ControlManager::callbackReferenceService, this);
    +    1871          91 :   sh_reference_             = mrs_lib::SubscribeHandler<mrs_msgs::ReferenceStamped>(shopts, "reference_in", &ControlManager::callbackReferenceTopic, this);
    +    1872             : 
    +    1873          91 :   service_server_velocity_reference_ = nh_.advertiseService("velocity_reference_in", &ControlManager::callbackVelocityReferenceService, this);
    +    1874             :   sh_velocity_reference_ =
    +    1875          91 :       mrs_lib::SubscribeHandler<mrs_msgs::VelocityReferenceStamped>(shopts, "velocity_reference_in", &ControlManager::callbackVelocityReferenceTopic, this);
    +    1876             : 
    +    1877          91 :   service_server_trajectory_reference_ = nh_.advertiseService("trajectory_reference_in", &ControlManager::callbackTrajectoryReferenceService, this);
    +    1878             :   sh_trajectory_reference_ =
    +    1879          91 :       mrs_lib::SubscribeHandler<mrs_msgs::TrajectoryReference>(shopts, "trajectory_reference_in", &ControlManager::callbackTrajectoryReferenceTopic, this);
    +    1880             : 
    +    1881             :   // | --------------------- other services --------------------- |
    +    1882             : 
    +    1883          91 :   service_server_emergency_reference_ = nh_.advertiseService("emergency_reference_in", &ControlManager::callbackEmergencyReference, this);
    +    1884          91 :   service_server_pirouette_           = nh_.advertiseService("pirouette_in", &ControlManager::callbackPirouette, this);
    +    1885             : 
    +    1886             :   // | ------------------------- timers ------------------------- |
    +    1887             : 
    +    1888          91 :   timer_status_    = nh_.createTimer(ros::Rate(_status_timer_rate_), &ControlManager::timerStatus, this);
    +    1889          91 :   timer_safety_    = nh_.createTimer(ros::Rate(_safety_timer_rate_), &ControlManager::timerSafety, this);
    +    1890          91 :   timer_bumper_    = nh_.createTimer(ros::Rate(1.0), &ControlManager::timerBumper, this);
    +    1891          91 :   timer_eland_     = nh_.createTimer(ros::Rate(_elanding_timer_rate_), &ControlManager::timerEland, this, false, false);
    +    1892          91 :   timer_failsafe_  = nh_.createTimer(ros::Rate(_failsafe_timer_rate_), &ControlManager::timerFailsafe, this, false, false);
    +    1893          91 :   timer_pirouette_ = nh_.createTimer(ros::Rate(_pirouette_timer_rate_), &ControlManager::timerPirouette, this, false, false);
    +    1894          91 :   timer_joystick_  = nh_.createTimer(ros::Rate(_joystick_timer_rate_), &ControlManager::timerJoystick, this);
    +    1895             : 
    +    1896             :   // | ----------------------- finish init ---------------------- |
    +    1897             : 
    +    1898          91 :   if (!param_loader.loadedSuccessfully()) {
    +    1899           0 :     ROS_ERROR("[ControlManager]: could not load all parameters!");
    +    1900           0 :     ros::shutdown();
    +    1901             :   }
    +    1902             : 
    +    1903          91 :   is_initialized_ = true;
    +    1904             : 
    +    1905          91 :   ROS_INFO("[ControlManager]: initialized");
    +    1906          91 : }
    +    1907             : 
    +    1908             : //}
    +    1909             : 
    +    1910             : // --------------------------------------------------------------
    +    1911             : // |                           timers                           |
    +    1912             : // --------------------------------------------------------------
    +    1913             : 
    +    1914             : /* timerHwApiCapabilities() //{ */
    +    1915             : 
    +    1916         161 : void ControlManager::timerHwApiCapabilities(const ros::TimerEvent& event) {
    +    1917             : 
    +    1918         322 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("timerHwApiCapabilities", _status_timer_rate_, 1.0, event);
    +    1919         322 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("ControlManager::timerHwApiCapabilities", scope_timer_logger_, scope_timer_enabled_);
    +    1920             : 
    +    1921         161 :   if (!sh_hw_api_capabilities_.hasMsg()) {
    +    1922          70 :     ROS_INFO_THROTTLE(1.0, "[ControlManager]: waiting for HW API capabilities");
    +    1923          70 :     return;
    +    1924             :   }
    +    1925             : 
    +    1926         182 :   auto hw_ap_capabilities = sh_hw_api_capabilities_.getMsg();
    +    1927             : 
    +    1928          91 :   ROS_INFO("[ControlManager]: got HW API capabilities, the possible control modes are:");
    +    1929             : 
    +    1930          91 :   if (hw_ap_capabilities->accepts_actuator_cmd) {
    +    1931           3 :     ROS_INFO("[ControlManager]: - actuator command");
    +    1932           3 :     _hw_api_inputs_.actuators = true;
    +    1933             :   }
    +    1934             : 
    +    1935          91 :   if (hw_ap_capabilities->accepts_control_group_cmd) {
    +    1936           3 :     ROS_INFO("[ControlManager]: - control group command");
    +    1937           3 :     _hw_api_inputs_.control_group = true;
    +    1938             :   }
    +    1939             : 
    +    1940          91 :   if (hw_ap_capabilities->accepts_attitude_rate_cmd) {
    +    1941          64 :     ROS_INFO("[ControlManager]: - attitude rate command");
    +    1942          64 :     _hw_api_inputs_.attitude_rate = true;
    +    1943             :   }
    +    1944             : 
    +    1945          91 :   if (hw_ap_capabilities->accepts_attitude_cmd) {
    +    1946          62 :     ROS_INFO("[ControlManager]: - attitude command");
    +    1947          62 :     _hw_api_inputs_.attitude = true;
    +    1948             :   }
    +    1949             : 
    +    1950          91 :   if (hw_ap_capabilities->accepts_acceleration_hdg_rate_cmd) {
    +    1951           2 :     ROS_INFO("[ControlManager]: - acceleration+hdg rate command");
    +    1952           2 :     _hw_api_inputs_.acceleration_hdg_rate = true;
    +    1953             :   }
    +    1954             : 
    +    1955          91 :   if (hw_ap_capabilities->accepts_acceleration_hdg_cmd) {
    +    1956           2 :     ROS_INFO("[ControlManager]: - acceleration+hdg command");
    +    1957           2 :     _hw_api_inputs_.acceleration_hdg = true;
    +    1958             :   }
    +    1959             : 
    +    1960          91 :   if (hw_ap_capabilities->accepts_velocity_hdg_rate_cmd) {
    +    1961           8 :     ROS_INFO("[ControlManager]: - velocityhdg rate command");
    +    1962           8 :     _hw_api_inputs_.velocity_hdg_rate = true;
    +    1963             :   }
    +    1964             : 
    +    1965          91 :   if (hw_ap_capabilities->accepts_velocity_hdg_cmd) {
    +    1966           4 :     ROS_INFO("[ControlManager]: - velocityhdg command");
    +    1967           4 :     _hw_api_inputs_.velocity_hdg = true;
    +    1968             :   }
    +    1969             : 
    +    1970          91 :   if (hw_ap_capabilities->accepts_position_cmd) {
    +    1971           2 :     ROS_INFO("[ControlManager]: - position command");
    +    1972           2 :     _hw_api_inputs_.position = true;
    +    1973             :   }
    +    1974             : 
    +    1975          91 :   initialize();
    +    1976             : 
    +    1977          91 :   timer_hw_api_capabilities_.stop();
    +    1978             : }
    +    1979             : 
    +    1980             : //}
    +    1981             : 
    +    1982             : /* //{ timerStatus() */
    +    1983             : 
    +    1984       16264 : void ControlManager::timerStatus(const ros::TimerEvent& event) {
    +    1985             : 
    +    1986       16264 :   if (!is_initialized_)
    +    1987           0 :     return;
    +    1988             : 
    +    1989       48792 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("timerStatus", _status_timer_rate_, 0.1, event);
    +    1990       48792 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("ControlManager::timerStatus", scope_timer_logger_, scope_timer_enabled_);
    +    1991             : 
    +    1992             :   // copy member variables
    +    1993       32528 :   auto uav_state             = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +    1994       32528 :   auto last_control_output   = mrs_lib::get_mutexed(mutex_last_control_output_, last_control_output_);
    +    1995       16264 :   auto yaw_error             = mrs_lib::get_mutexed(mutex_attitude_error_, yaw_error_);
    +    1996       16264 :   auto position_error        = mrs_lib::get_mutexed(mutex_position_error_, position_error_);
    +    1997       16264 :   auto active_controller_idx = mrs_lib::get_mutexed(mutex_controller_list_, active_controller_idx_);
    +    1998       16264 :   auto active_tracker_idx    = mrs_lib::get_mutexed(mutex_tracker_list_, active_tracker_idx_);
    +    1999             : 
    +    2000             :   double uav_x, uav_y, uav_z;
    +    2001       16264 :   uav_x = uav_state.pose.position.x;
    +    2002       16264 :   uav_y = uav_state.pose.position.y;
    +    2003       16264 :   uav_z = uav_state.pose.position.z;
    +    2004             : 
    +    2005             :   // --------------------------------------------------------------
    +    2006             :   // |                      print the status                      |
    +    2007             :   // --------------------------------------------------------------
    +    2008             : 
    +    2009             :   {
    +    2010       32528 :     std::string controller = _controller_names_[active_controller_idx];
    +    2011       32528 :     std::string tracker    = _tracker_names_[active_tracker_idx];
    +    2012       16264 :     double      mass       = last_control_output.diagnostics.total_mass;
    +    2013       16264 :     double      bx_b       = last_control_output.diagnostics.disturbance_bx_b;
    +    2014       16264 :     double      by_b       = last_control_output.diagnostics.disturbance_by_b;
    +    2015       16264 :     double      wx_w       = last_control_output.diagnostics.disturbance_wx_w;
    +    2016       16264 :     double      wy_w       = last_control_output.diagnostics.disturbance_wy_w;
    +    2017             : 
    +    2018       16264 :     ROS_INFO_THROTTLE(5.0, "[ControlManager]: tracker: '%s', controller: '%s', mass: '%.2f kg', disturbances: body [%.2f, %.2f] N, world [%.2f, %.2f] N",
    +    2019             :                       tracker.c_str(), controller.c_str(), mass, bx_b, by_b, wx_w, wy_w);
    +    2020             :   }
    +    2021             : 
    +    2022             :   // --------------------------------------------------------------
    +    2023             :   // |                   publish the diagnostics                  |
    +    2024             :   // --------------------------------------------------------------
    +    2025             : 
    +    2026       16264 :   publishDiagnostics();
    +    2027             : 
    +    2028             :   // --------------------------------------------------------------
    +    2029             :   // |                publish if the offboard is on               |
    +    2030             :   // --------------------------------------------------------------
    +    2031             : 
    +    2032       16264 :   if (offboard_mode_) {
    +    2033             : 
    +    2034       11051 :     std_msgs::Empty offboard_on_out;
    +    2035             : 
    +    2036       11051 :     ph_offboard_on_.publish(offboard_on_out);
    +    2037             :   }
    +    2038             : 
    +    2039             :   // --------------------------------------------------------------
    +    2040             :   // |                   publish the tilt error                   |
    +    2041             :   // --------------------------------------------------------------
    +    2042             :   {
    +    2043       32528 :     std::scoped_lock lock(mutex_attitude_error_);
    +    2044             : 
    +    2045       16264 :     if (tilt_error_) {
    +    2046             : 
    +    2047       32528 :       mrs_msgs::Float64Stamped tilt_error_out;
    +    2048       16264 :       tilt_error_out.header.stamp    = ros::Time::now();
    +    2049       16264 :       tilt_error_out.header.frame_id = uav_state.header.frame_id;
    +    2050       16264 :       tilt_error_out.value           = (180.0 / M_PI) * tilt_error_.value();
    +    2051             : 
    +    2052       16264 :       ph_tilt_error_.publish(tilt_error_out);
    +    2053             :     }
    +    2054             :   }
    +    2055             : 
    +    2056             :   // --------------------------------------------------------------
    +    2057             :   // |                  publish the control error                 |
    +    2058             :   // --------------------------------------------------------------
    +    2059             : 
    +    2060       16264 :   if (position_error) {
    +    2061             : 
    +    2062        9948 :     Eigen::Vector3d pos_error_value = position_error.value();
    +    2063             : 
    +    2064       19896 :     mrs_msgs::ControlError msg_out;
    +    2065             : 
    +    2066        9948 :     msg_out.header.stamp    = ros::Time::now();
    +    2067        9948 :     msg_out.header.frame_id = uav_state.header.frame_id;
    +    2068             : 
    +    2069        9948 :     msg_out.position_errors.x    = pos_error_value[0];
    +    2070        9948 :     msg_out.position_errors.y    = pos_error_value[1];
    +    2071        9948 :     msg_out.position_errors.z    = pos_error_value[2];
    +    2072        9948 :     msg_out.total_position_error = pos_error_value.norm();
    +    2073             : 
    +    2074        9948 :     if (yaw_error_) {
    +    2075        9948 :       msg_out.yaw_error = yaw_error.value();
    +    2076             :     }
    +    2077             : 
    +    2078        9948 :     std::map<std::string, ControllerParams>::iterator it;
    +    2079             : 
    +    2080        9948 :     it = controllers_.find(_controller_names_[active_controller_idx]);
    +    2081             : 
    +    2082        9948 :     msg_out.position_eland_threshold    = it->second.eland_threshold;
    +    2083        9948 :     msg_out.position_failsafe_threshold = it->second.failsafe_threshold;
    +    2084             : 
    +    2085        9948 :     ph_control_error_.publish(msg_out);
    +    2086             :   }
    +    2087             : 
    +    2088             :   // --------------------------------------------------------------
    +    2089             :   // |                  publish the mass estimate                 |
    +    2090             :   // --------------------------------------------------------------
    +    2091             : 
    +    2092       16264 :   if (last_control_output.diagnostics.mass_estimator) {
    +    2093             : 
    +    2094        8671 :     std_msgs::Float64 mass_estimate_out;
    +    2095        8671 :     mass_estimate_out.data = _uav_mass_ + last_control_output.diagnostics.mass_difference;
    +    2096             : 
    +    2097        8671 :     ph_mass_estimate_.publish(mass_estimate_out);
    +    2098             :   }
    +    2099             : 
    +    2100             :   // --------------------------------------------------------------
    +    2101             :   // |                 publish the current heading                |
    +    2102             :   // --------------------------------------------------------------
    +    2103             : 
    +    2104       16264 :   if (_state_input_ == INPUT_UAV_STATE && sh_uav_state_.hasMsg()) {
    +    2105             : 
    +    2106             :     try {
    +    2107             : 
    +    2108             :       double heading;
    +    2109             : 
    +    2110       13857 :       heading = mrs_lib::AttitudeConverter(uav_state.pose.orientation).getHeading();
    +    2111             : 
    +    2112       27714 :       mrs_msgs::Float64Stamped heading_out;
    +    2113       13857 :       heading_out.header = uav_state.header;
    +    2114       13857 :       heading_out.value  = heading;
    +    2115             : 
    +    2116       13857 :       ph_heading_.publish(heading_out);
    +    2117             :     }
    +    2118           0 :     catch (...) {
    +    2119           0 :       ROS_ERROR_THROTTLE(1.0, "exception caught, could not transform heading");
    +    2120             :     }
    +    2121             :   }
    +    2122             : 
    +    2123             :   // --------------------------------------------------------------
    +    2124             :   // |                  publish the current speed                 |
    +    2125             :   // --------------------------------------------------------------
    +    2126             : 
    +    2127       16264 :   if (_state_input_ == INPUT_UAV_STATE && sh_uav_state_.hasMsg()) {
    +    2128             : 
    +    2129       13857 :     double speed = sqrt(pow(uav_state.velocity.linear.x, 2) + pow(uav_state.velocity.linear.y, 2) + pow(uav_state.velocity.linear.z, 2));
    +    2130             : 
    +    2131       27714 :     mrs_msgs::Float64Stamped speed_out;
    +    2132       13857 :     speed_out.header = uav_state.header;
    +    2133       13857 :     speed_out.value  = speed;
    +    2134             : 
    +    2135       13857 :     ph_speed_.publish(speed_out);
    +    2136             :   }
    +    2137             : 
    +    2138             :   // --------------------------------------------------------------
    +    2139             :   // |               publish the safety area markers              |
    +    2140             :   // --------------------------------------------------------------
    +    2141             : 
    +    2142       16264 :   if (use_safety_area_) {
    +    2143             : 
    +    2144       26276 :     mrs_msgs::ReferenceStamped temp_ref;
    +    2145       13138 :     temp_ref.header.frame_id = _safety_area_horizontal_frame_;
    +    2146             : 
    +    2147       26276 :     geometry_msgs::TransformStamped tf;
    +    2148             : 
    +    2149       39414 :     auto ret = transformer_->getTransform(_safety_area_horizontal_frame_, "local_origin", ros::Time(0));
    +    2150             : 
    +    2151       13138 :     if (ret) {
    +    2152             : 
    +    2153       10987 :       ROS_INFO_ONCE("[ControlManager]: got TFs, publishing safety area markers");
    +    2154             : 
    +    2155       21974 :       visualization_msgs::MarkerArray safety_area_marker_array;
    +    2156       21974 :       visualization_msgs::MarkerArray safety_area_coordinates_marker_array;
    +    2157             : 
    +    2158       21974 :       mrs_lib::Polygon border = safety_zone_->getBorder();
    +    2159             : 
    +    2160       21974 :       std::vector<geometry_msgs::Point> border_points_bot_original = border.getPointMessageVector(getMinZ(_safety_area_horizontal_frame_));
    +    2161       21974 :       std::vector<geometry_msgs::Point> border_points_top_original = border.getPointMessageVector(getMaxZ(_safety_area_horizontal_frame_));
    +    2162             : 
    +    2163       21974 :       std::vector<geometry_msgs::Point> border_points_bot_transformed = border_points_bot_original;
    +    2164       21974 :       std::vector<geometry_msgs::Point> border_points_top_transformed = border_points_bot_original;
    +    2165             : 
    +    2166             :       // if we fail in transforming the area at some point
    +    2167             :       // do not publish it at all
    +    2168       10987 :       bool tf_success = true;
    +    2169             : 
    +    2170       21974 :       geometry_msgs::TransformStamped tf = ret.value();
    +    2171             : 
    +    2172             :       /* transform area points to local origin //{ */
    +    2173             : 
    +    2174             :       // transform border bottom points to local origin
    +    2175       54935 :       for (size_t i = 0; i < border_points_bot_original.size(); i++) {
    +    2176             : 
    +    2177       43948 :         temp_ref.header.frame_id      = _safety_area_horizontal_frame_;
    +    2178       43948 :         temp_ref.header.stamp         = ros::Time(0);
    +    2179       43948 :         temp_ref.reference.position.x = border_points_bot_original[i].x;
    +    2180       43948 :         temp_ref.reference.position.y = border_points_bot_original[i].y;
    +    2181       43948 :         temp_ref.reference.position.z = border_points_bot_original[i].z;
    +    2182             : 
    +    2183       87896 :         if (auto ret = transformer_->transform(temp_ref, tf)) {
    +    2184             : 
    +    2185       43948 :           temp_ref = ret.value();
    +    2186             : 
    +    2187       43948 :           border_points_bot_transformed[i].x = temp_ref.reference.position.x;
    +    2188       43948 :           border_points_bot_transformed[i].y = temp_ref.reference.position.y;
    +    2189       43948 :           border_points_bot_transformed[i].z = temp_ref.reference.position.z;
    +    2190             : 
    +    2191             :         } else {
    +    2192           0 :           tf_success = false;
    +    2193             :         }
    +    2194             :       }
    +    2195             : 
    +    2196             :       // transform border top points to local origin
    +    2197       54935 :       for (size_t i = 0; i < border_points_top_original.size(); i++) {
    +    2198             : 
    +    2199       43948 :         temp_ref.header.frame_id      = _safety_area_horizontal_frame_;
    +    2200       43948 :         temp_ref.header.stamp         = ros::Time(0);
    +    2201       43948 :         temp_ref.reference.position.x = border_points_top_original[i].x;
    +    2202       43948 :         temp_ref.reference.position.y = border_points_top_original[i].y;
    +    2203       43948 :         temp_ref.reference.position.z = border_points_top_original[i].z;
    +    2204             : 
    +    2205       87896 :         if (auto ret = transformer_->transform(temp_ref, tf)) {
    +    2206             : 
    +    2207       43948 :           temp_ref = ret.value();
    +    2208             : 
    +    2209       43948 :           border_points_top_transformed[i].x = temp_ref.reference.position.x;
    +    2210       43948 :           border_points_top_transformed[i].y = temp_ref.reference.position.y;
    +    2211       43948 :           border_points_top_transformed[i].z = temp_ref.reference.position.z;
    +    2212             : 
    +    2213             :         } else {
    +    2214           0 :           tf_success = false;
    +    2215             :         }
    +    2216             :       }
    +    2217             : 
    +    2218             :       //}
    +    2219             : 
    +    2220       21974 :       visualization_msgs::Marker safety_area_marker;
    +    2221             : 
    +    2222       10987 :       safety_area_marker.header.frame_id = _uav_name_ + "/local_origin";
    +    2223       10987 :       safety_area_marker.type            = visualization_msgs::Marker::LINE_LIST;
    +    2224       10987 :       safety_area_marker.color.a         = 0.15;
    +    2225       10987 :       safety_area_marker.scale.x         = 0.2;
    +    2226       10987 :       safety_area_marker.color.r         = 1;
    +    2227       10987 :       safety_area_marker.color.g         = 0;
    +    2228       10987 :       safety_area_marker.color.b         = 0;
    +    2229             : 
    +    2230       10987 :       safety_area_marker.pose.orientation = mrs_lib::AttitudeConverter(0, 0, 0);
    +    2231             : 
    +    2232       21974 :       visualization_msgs::Marker safety_area_coordinates_marker;
    +    2233             : 
    +    2234       10987 :       safety_area_coordinates_marker.header.frame_id = _uav_name_ + "/local_origin";
    +    2235       10987 :       safety_area_coordinates_marker.type            = visualization_msgs::Marker::TEXT_VIEW_FACING;
    +    2236       10987 :       safety_area_coordinates_marker.color.a         = 1;
    +    2237       10987 :       safety_area_coordinates_marker.scale.z         = 1.0;
    +    2238       10987 :       safety_area_coordinates_marker.color.r         = 0;
    +    2239       10987 :       safety_area_coordinates_marker.color.g         = 0;
    +    2240       10987 :       safety_area_coordinates_marker.color.b         = 0;
    +    2241             : 
    +    2242       10987 :       safety_area_coordinates_marker.id = 0;
    +    2243             : 
    +    2244       10987 :       safety_area_coordinates_marker.pose.orientation = mrs_lib::AttitudeConverter(0, 0, 0);
    +    2245             : 
    +    2246             :       /* adding safety area points //{ */
    +    2247             : 
    +    2248             :       // bottom border
    +    2249       54935 :       for (size_t i = 0; i < border_points_bot_transformed.size(); i++) {
    +    2250             : 
    +    2251       43948 :         safety_area_marker.points.push_back(border_points_bot_transformed[i]);
    +    2252       43948 :         safety_area_marker.points.push_back(border_points_bot_transformed[(i + 1) % border_points_bot_transformed.size()]);
    +    2253             : 
    +    2254       87896 :         std::stringstream ss;
    +    2255             : 
    +    2256       43948 :         if (_safety_area_horizontal_frame_ == "latlon_origin") {
    +    2257           0 :           ss << "idx: " << i << std::endl
    +    2258           0 :              << std::setprecision(6) << std::fixed << "lat: " << border_points_bot_original[i].x << std::endl
    +    2259           0 :              << "lon: " << border_points_bot_original[i].y;
    +    2260             :         } else {
    +    2261       43948 :           ss << "idx: " << i << std::endl
    +    2262       43948 :              << std::setprecision(1) << std::fixed << "x: " << border_points_bot_original[i].x << std::endl
    +    2263       43948 :              << "y: " << border_points_bot_original[i].y;
    +    2264             :         }
    +    2265             : 
    +    2266       43948 :         safety_area_coordinates_marker.color.r = 0;
    +    2267       43948 :         safety_area_coordinates_marker.color.g = 0;
    +    2268       43948 :         safety_area_coordinates_marker.color.b = 0;
    +    2269             : 
    +    2270       43948 :         safety_area_coordinates_marker.pose.position = border_points_bot_transformed[i];
    +    2271       43948 :         safety_area_coordinates_marker.text          = ss.str();
    +    2272       43948 :         safety_area_coordinates_marker.id++;
    +    2273             : 
    +    2274       43948 :         safety_area_coordinates_marker_array.markers.push_back(safety_area_coordinates_marker);
    +    2275             :       }
    +    2276             : 
    +    2277             :       // top border + top/bot edges
    +    2278       54935 :       for (size_t i = 0; i < border_points_top_transformed.size(); i++) {
    +    2279             : 
    +    2280       43948 :         safety_area_marker.points.push_back(border_points_top_transformed[i]);
    +    2281       43948 :         safety_area_marker.points.push_back(border_points_top_transformed[(i + 1) % border_points_top_transformed.size()]);
    +    2282             : 
    +    2283       43948 :         safety_area_marker.points.push_back(border_points_bot_transformed[i]);
    +    2284       43948 :         safety_area_marker.points.push_back(border_points_top_transformed[i]);
    +    2285             : 
    +    2286       87896 :         std::stringstream ss;
    +    2287             : 
    +    2288       43948 :         if (_safety_area_horizontal_frame_ == "latlon_origin") {
    +    2289           0 :           ss << "idx: " << i << std::endl
    +    2290           0 :              << std::setprecision(6) << std::fixed << "lat: " << border_points_bot_original[i].x << std::endl
    +    2291           0 :              << "lon: " << border_points_bot_original[i].y;
    +    2292             :         } else {
    +    2293       43948 :           ss << "idx: " << i << std::endl
    +    2294       43948 :              << std::setprecision(1) << std::fixed << "x: " << border_points_bot_original[i].x << std::endl
    +    2295       43948 :              << "y: " << border_points_bot_original[i].y;
    +    2296             :         }
    +    2297             : 
    +    2298       43948 :         safety_area_coordinates_marker.color.r = 1;
    +    2299       43948 :         safety_area_coordinates_marker.color.g = 1;
    +    2300       43948 :         safety_area_coordinates_marker.color.b = 1;
    +    2301             : 
    +    2302       43948 :         safety_area_coordinates_marker.pose.position = border_points_top_transformed[i];
    +    2303       43948 :         safety_area_coordinates_marker.text          = ss.str();
    +    2304       43948 :         safety_area_coordinates_marker.id++;
    +    2305             : 
    +    2306       43948 :         safety_area_coordinates_marker_array.markers.push_back(safety_area_coordinates_marker);
    +    2307             :       }
    +    2308             : 
    +    2309             :       //}
    +    2310             : 
    +    2311       10987 :       if (tf_success) {
    +    2312             : 
    +    2313       10987 :         safety_area_marker_array.markers.push_back(safety_area_marker);
    +    2314             : 
    +    2315       10987 :         ph_safety_area_markers_.publish(safety_area_marker_array);
    +    2316             : 
    +    2317       10987 :         ph_safety_area_coordinates_markers_.publish(safety_area_coordinates_marker_array);
    +    2318             :       }
    +    2319             : 
    +    2320             :     } else {
    +    2321        2151 :       ROS_WARN_ONCE("[ControlManager]: missing TFs, can not publish safety area markers");
    +    2322             :     }
    +    2323             :   }
    +    2324             : 
    +    2325             :   // --------------------------------------------------------------
    +    2326             :   // |              publish the disturbances markers              |
    +    2327             :   // --------------------------------------------------------------
    +    2328             : 
    +    2329       16264 :   if (last_control_output.diagnostics.disturbance_estimator && got_uav_state_) {
    +    2330             : 
    +    2331       17446 :     visualization_msgs::MarkerArray msg_out;
    +    2332             : 
    +    2333        8723 :     double id = 0;
    +    2334             : 
    +    2335        8723 :     double multiplier = 1.0;
    +    2336             : 
    +    2337        8723 :     Eigen::Quaterniond quat_eigen = mrs_lib::AttitudeConverter(uav_state.pose.orientation);
    +    2338             : 
    +    2339        8723 :     Eigen::Vector3d      vec3d;
    +    2340        8723 :     geometry_msgs::Point point;
    +    2341             : 
    +    2342             :     /* world disturbance //{ */
    +    2343             :     {
    +    2344             : 
    +    2345       17446 :       visualization_msgs::Marker marker;
    +    2346             : 
    +    2347        8723 :       marker.header.frame_id = uav_state.header.frame_id;
    +    2348        8723 :       marker.header.stamp    = ros::Time::now();
    +    2349        8723 :       marker.ns              = "control_manager";
    +    2350        8723 :       marker.id              = id++;
    +    2351        8723 :       marker.type            = visualization_msgs::Marker::ARROW;
    +    2352        8723 :       marker.action          = visualization_msgs::Marker::ADD;
    +    2353             : 
    +    2354             :       /* position //{ */
    +    2355             : 
    +    2356        8723 :       marker.pose.position.x = 0.0;
    +    2357        8723 :       marker.pose.position.y = 0.0;
    +    2358        8723 :       marker.pose.position.z = 0.0;
    +    2359             : 
    +    2360             :       //}
    +    2361             : 
    +    2362             :       /* orientation //{ */
    +    2363             : 
    +    2364        8723 :       marker.pose.orientation = mrs_lib::AttitudeConverter(0, 0, 0);
    +    2365             : 
    +    2366             :       //}
    +    2367             : 
    +    2368             :       /* origin //{ */
    +    2369        8723 :       point.x = uav_x;
    +    2370        8723 :       point.y = uav_y;
    +    2371        8723 :       point.z = uav_z;
    +    2372             : 
    +    2373        8723 :       marker.points.push_back(point);
    +    2374             : 
    +    2375             :       //}
    +    2376             : 
    +    2377             :       /* tip //{ */
    +    2378             : 
    +    2379        8723 :       point.x = uav_x + multiplier * last_control_output.diagnostics.disturbance_wx_w;
    +    2380        8723 :       point.y = uav_y + multiplier * last_control_output.diagnostics.disturbance_wy_w;
    +    2381        8723 :       point.z = uav_z;
    +    2382             : 
    +    2383        8723 :       marker.points.push_back(point);
    +    2384             : 
    +    2385             :       //}
    +    2386             : 
    +    2387        8723 :       marker.scale.x = 0.05;
    +    2388        8723 :       marker.scale.y = 0.05;
    +    2389        8723 :       marker.scale.z = 0.05;
    +    2390             : 
    +    2391        8723 :       marker.color.a = 0.5;
    +    2392        8723 :       marker.color.r = 1.0;
    +    2393        8723 :       marker.color.g = 0.0;
    +    2394        8723 :       marker.color.b = 0.0;
    +    2395             : 
    +    2396        8723 :       marker.mesh_resource = "package://pr2_description/meshes/base_v0/base.dae";
    +    2397             : 
    +    2398        8723 :       msg_out.markers.push_back(marker);
    +    2399             :     }
    +    2400             : 
    +    2401             :     //}
    +    2402             : 
    +    2403             :     /* body disturbance //{ */
    +    2404             :     {
    +    2405             : 
    +    2406       17446 :       visualization_msgs::Marker marker;
    +    2407             : 
    +    2408        8723 :       marker.header.frame_id = uav_state.header.frame_id;
    +    2409        8723 :       marker.header.stamp    = ros::Time::now();
    +    2410        8723 :       marker.ns              = "control_manager";
    +    2411        8723 :       marker.id              = id++;
    +    2412        8723 :       marker.type            = visualization_msgs::Marker::ARROW;
    +    2413        8723 :       marker.action          = visualization_msgs::Marker::ADD;
    +    2414             : 
    +    2415             :       /* position //{ */
    +    2416             : 
    +    2417        8723 :       marker.pose.position.x = 0.0;
    +    2418        8723 :       marker.pose.position.y = 0.0;
    +    2419        8723 :       marker.pose.position.z = 0.0;
    +    2420             : 
    +    2421             :       //}
    +    2422             : 
    +    2423             :       /* orientation //{ */
    +    2424             : 
    +    2425        8723 :       marker.pose.orientation = mrs_lib::AttitudeConverter(0, 0, 0);
    +    2426             : 
    +    2427             :       //}
    +    2428             : 
    +    2429             :       /* origin //{ */
    +    2430             : 
    +    2431        8723 :       point.x = uav_x;
    +    2432        8723 :       point.y = uav_y;
    +    2433        8723 :       point.z = uav_z;
    +    2434             : 
    +    2435        8723 :       marker.points.push_back(point);
    +    2436             : 
    +    2437             :       //}
    +    2438             : 
    +    2439             :       /* tip //{ */
    +    2440             : 
    +    2441        8723 :       vec3d << multiplier * last_control_output.diagnostics.disturbance_bx_b, multiplier * last_control_output.diagnostics.disturbance_by_b, 0;
    +    2442        8723 :       vec3d = quat_eigen * vec3d;
    +    2443             : 
    +    2444        8723 :       point.x = uav_x + vec3d[0];
    +    2445        8723 :       point.y = uav_y + vec3d[1];
    +    2446        8723 :       point.z = uav_z + vec3d[2];
    +    2447             : 
    +    2448        8723 :       marker.points.push_back(point);
    +    2449             : 
    +    2450             :       //}
    +    2451             : 
    +    2452        8723 :       marker.scale.x = 0.05;
    +    2453        8723 :       marker.scale.y = 0.05;
    +    2454        8723 :       marker.scale.z = 0.05;
    +    2455             : 
    +    2456        8723 :       marker.color.a = 0.5;
    +    2457        8723 :       marker.color.r = 0.0;
    +    2458        8723 :       marker.color.g = 1.0;
    +    2459        8723 :       marker.color.b = 0.0;
    +    2460             : 
    +    2461        8723 :       marker.mesh_resource = "package://pr2_description/meshes/base_v0/base.dae";
    +    2462             : 
    +    2463        8723 :       msg_out.markers.push_back(marker);
    +    2464             :     }
    +    2465             : 
    +    2466             :     //}
    +    2467             : 
    +    2468        8723 :     ph_disturbances_markers_.publish(msg_out);
    +    2469             :   }
    +    2470             : 
    +    2471             :   // --------------------------------------------------------------
    +    2472             :   // |               publish the current constraints              |
    +    2473             :   // --------------------------------------------------------------
    +    2474             : 
    +    2475       16264 :   if (got_constraints_) {
    +    2476             : 
    +    2477       13792 :     auto sanitized_constraints = mrs_lib::get_mutexed(mutex_constraints_, sanitized_constraints_);
    +    2478             : 
    +    2479       13792 :     mrs_msgs::DynamicsConstraints constraints = sanitized_constraints.constraints;
    +    2480             : 
    +    2481       13792 :     ph_current_constraints_.publish(constraints);
    +    2482             :   }
    +    2483             : }
    +    2484             : 
    +    2485             : //}
    +    2486             : 
    +    2487             : /* //{ timerSafety() */
    +    2488             : 
    +    2489      297644 : void ControlManager::timerSafety(const ros::TimerEvent& event) {
    +    2490             : 
    +    2491      297644 :   mrs_lib::AtomicScopeFlag unset_running(running_safety_timer_);
    +    2492             : 
    +    2493      297645 :   if (!is_initialized_)
    +    2494           0 :     return;
    +    2495             : 
    +    2496      595290 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("timerSafety", _safety_timer_rate_, 0.05, event);
    +    2497      595290 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("ControlManager::timerSafety", scope_timer_logger_, scope_timer_enabled_);
    +    2498             : 
    +    2499             :   // copy member variables
    +    2500      297645 :   auto last_control_output   = mrs_lib::get_mutexed(mutex_last_control_output_, last_control_output_);
    +    2501      297645 :   auto last_tracker_cmd      = mrs_lib::get_mutexed(mutex_last_tracker_cmd_, last_tracker_cmd_);
    +    2502      297645 :   auto [uav_state, uav_yaw]  = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_, uav_yaw_);
    +    2503      297645 :   auto active_controller_idx = mrs_lib::get_mutexed(mutex_controller_list_, active_controller_idx_);
    +    2504      297645 :   auto active_tracker_idx    = mrs_lib::get_mutexed(mutex_tracker_list_, active_tracker_idx_);
    +    2505             : 
    +    2506      568251 :   if (!got_uav_state_ || (_state_input_ == INPUT_UAV_STATE && _odometry_innovation_check_enabled_ && !sh_odometry_innovation_.hasMsg()) ||
    +    2507      270606 :       active_tracker_idx == _null_tracker_idx_) {
    +    2508      103607 :     return;
    +    2509             :   }
    +    2510             : 
    +    2511      194038 :   if (odometry_switch_in_progress_) {
    +    2512           5 :     ROS_WARN("[ControlManager]: timerSafety tried to run while odometry switch in progress");
    +    2513           5 :     return;
    +    2514             :   }
    +    2515             : 
    +    2516             :   // | ------------------------ timeouts ------------------------ |
    +    2517             : 
    +    2518      194033 :   if (_state_input_ == INPUT_UAV_STATE && sh_uav_state_.hasMsg()) {
    +    2519      194033 :     double missing_for = (ros::Time::now() - sh_uav_state_.lastMsgTime()).toSec();
    +    2520             : 
    +    2521      194033 :     if (missing_for > _uav_state_max_missing_time_) {
    +    2522           0 :       timeoutUavState(missing_for);
    +    2523             :     }
    +    2524             :   }
    +    2525             : 
    +    2526      194033 :   if (_state_input_ == INPUT_ODOMETRY && sh_odometry_.hasMsg()) {
    +    2527           0 :     double missing_for = (ros::Time::now() - sh_odometry_.lastMsgTime()).toSec();
    +    2528             : 
    +    2529           0 :     if (missing_for > _uav_state_max_missing_time_) {
    +    2530           0 :       timeoutUavState(missing_for);
    +    2531             :     }
    +    2532             :   }
    +    2533             : 
    +    2534             :   // | -------------- eland and failsafe thresholds ------------- |
    +    2535             : 
    +    2536      194033 :   std::map<std::string, ControllerParams>::iterator it;
    +    2537      194033 :   it = controllers_.find(_controller_names_[active_controller_idx]);
    +    2538             : 
    +    2539      194033 :   _eland_threshold_               = it->second.eland_threshold;
    +    2540      194033 :   _failsafe_threshold_            = it->second.failsafe_threshold;
    +    2541      194033 :   _odometry_innovation_threshold_ = it->second.odometry_innovation_threshold;
    +    2542             : 
    +    2543             :   // | --------- calculate control errors and tilt angle -------- |
    +    2544             : 
    +    2545             :   // This means that the timerFailsafe only does its work when Controllers and Trackers produce valid output.
    +    2546             :   // Cases when the commands are not valid should be handle in updateControllers() and updateTrackers() methods.
    +    2547      194033 :   if (!last_tracker_cmd || !last_control_output.control_output) {
    +    2548         175 :     return;
    +    2549             :   }
    +    2550             : 
    +    2551             :   {
    +    2552      193858 :     std::scoped_lock lock(mutex_attitude_error_);
    +    2553             : 
    +    2554      193858 :     tilt_error_ = 0;
    +    2555      193858 :     yaw_error_  = 0;
    +    2556             :   }
    +    2557             : 
    +    2558             :   {
    +    2559      193858 :     Eigen::Vector3d position_error = Eigen::Vector3d::Zero();
    +    2560             : 
    +    2561      193858 :     bool position_error_set = false;
    +    2562             : 
    +    2563      193858 :     if (last_tracker_cmd->use_position_horizontal && !std::holds_alternative<mrs_msgs::HwApiPositionCmd>(last_control_output.control_output.value())) {
    +    2564             : 
    +    2565      192821 :       position_error[0] = last_tracker_cmd->position.x - uav_state.pose.position.x;
    +    2566      192821 :       position_error[1] = last_tracker_cmd->position.y - uav_state.pose.position.y;
    +    2567             : 
    +    2568      192821 :       position_error_set = true;
    +    2569             :     }
    +    2570             : 
    +    2571      193858 :     if (last_tracker_cmd->use_position_vertical && !std::holds_alternative<mrs_msgs::HwApiPositionCmd>(last_control_output.control_output.value())) {
    +    2572             : 
    +    2573      192821 :       position_error[2] = last_tracker_cmd->position.z - uav_state.pose.position.z;
    +    2574             : 
    +    2575      192820 :       position_error_set = true;
    +    2576             :     }
    +    2577             : 
    +    2578      193857 :     if (position_error_set) {
    +    2579             : 
    +    2580      192820 :       mrs_lib::set_mutexed(mutex_position_error_, {position_error}, position_error_);
    +    2581             :     }
    +    2582             :   }
    +    2583             : 
    +    2584             :   // rotate the drone's z axis
    +    2585      193858 :   tf2::Transform uav_state_transform = mrs_lib::AttitudeConverter(uav_state.pose.orientation);
    +    2586      193858 :   tf2::Vector3   uav_z_in_world      = uav_state_transform * tf2::Vector3(0, 0, 1);
    +    2587             : 
    +    2588             :   // calculate the angle between the drone's z axis and the world's z axis
    +    2589      193858 :   double tilt_angle = acos(uav_z_in_world.dot(tf2::Vector3(0, 0, 1)));
    +    2590             : 
    +    2591             :   // | ------------ calculate the tilt and yaw error ------------ |
    +    2592             : 
    +    2593             :   // | --------------------- the tilt error --------------------- |
    +    2594             : 
    +    2595      193858 :   if (last_control_output.desired_orientation) {
    +    2596             : 
    +    2597             :     // calculate the desired drone's z axis in the world frame
    +    2598      169293 :     tf2::Transform attitude_cmd_transform = mrs_lib::AttitudeConverter(last_control_output.desired_orientation.value());
    +    2599      169293 :     tf2::Vector3   uav_z_in_world_desired = attitude_cmd_transform * tf2::Vector3(0, 0, 1);
    +    2600             : 
    +    2601             :     {
    +    2602      169293 :       std::scoped_lock lock(mutex_attitude_error_);
    +    2603             : 
    +    2604             :       // calculate the angle between the drone's z axis and the world's z axis
    +    2605      169293 :       tilt_error_ = acos(uav_z_in_world.dot(uav_z_in_world_desired));
    +    2606             : 
    +    2607             :       // calculate the yaw error
    +    2608      169293 :       double cmd_yaw = mrs_lib::AttitudeConverter(last_control_output.desired_orientation.value()).getYaw();
    +    2609      169293 :       yaw_error_     = fabs(radians::diff(cmd_yaw, uav_yaw));
    +    2610             :     }
    +    2611             :   }
    +    2612             : 
    +    2613      193858 :   auto position_error          = mrs_lib::get_mutexed(mutex_position_error_, position_error_);
    +    2614      193858 :   auto [tilt_error, yaw_error] = mrs_lib::get_mutexed(mutex_attitude_error_, tilt_error_, yaw_error_);
    +    2615             : 
    +    2616             :   // --------------------------------------------------------------
    +    2617             :   // |   activate the failsafe controller in case of large error  |
    +    2618             :   // --------------------------------------------------------------
    +    2619             : 
    +    2620      193858 :   if (position_error) {
    +    2621             : 
    +    2622      192821 :     if (position_error->norm() > _failsafe_threshold_ && !failsafe_triggered_) {
    +    2623             : 
    +    2624          16 :       auto controller_tracker_switch_time = mrs_lib::get_mutexed(mutex_controller_tracker_switch_time_, controller_tracker_switch_time_);
    +    2625             : 
    +    2626          16 :       if ((ros::Time::now() - controller_tracker_switch_time).toSec() > 1.0) {
    +    2627             : 
    +    2628           1 :         if (!failsafe_triggered_) {
    +    2629             : 
    +    2630           1 :           ROS_ERROR("[ControlManager]: activating failsafe land: control_error=%.2f/%.2f m (x: %.2f, y: %.2f, z: %.2f)", position_error->norm(),
    +    2631             :                     _failsafe_threshold_, position_error.value()[0], position_error.value()[1], position_error.value()[2]);
    +    2632             : 
    +    2633           1 :           failsafe();
    +    2634             :         }
    +    2635             :       }
    +    2636             :     }
    +    2637             :   }
    +    2638             : 
    +    2639             :   // --------------------------------------------------------------
    +    2640             :   // |     activate emergency land in case of large innovation    |
    +    2641             :   // --------------------------------------------------------------
    +    2642             : 
    +    2643      193858 :   if (_odometry_innovation_check_enabled_) {
    +    2644             : 
    +    2645      193858 :     std::optional<nav_msgs::Odometry::ConstPtr> innovation;
    +    2646             : 
    +    2647      193858 :     if (sh_odometry_innovation_.hasMsg()) {
    +    2648      193858 :       innovation = {sh_odometry_innovation_.getMsg()};
    +    2649             :     } else {
    +    2650           0 :       ROS_WARN_THROTTLE(1.0, "[ControlManager]: missing estimator innnovation but the innovation check is enabled!");
    +    2651             :     }
    +    2652             : 
    +    2653      193858 :     if (innovation) {
    +    2654             : 
    +    2655      193858 :       auto [x, y, z] = mrs_lib::getPosition(innovation.value());
    +    2656             : 
    +    2657      193857 :       double heading = 0;
    +    2658             :       try {
    +    2659      193857 :         heading = mrs_lib::getHeading(innovation.value());
    +    2660             :       }
    +    2661           0 :       catch (mrs_lib::AttitudeConverter::GetHeadingException& e) {
    +    2662           0 :         ROS_ERROR_THROTTLE(1.0, "[ControlManager]: exception caught: '%s'", e.what());
    +    2663             :       }
    +    2664             : 
    +    2665      193858 :       double last_innovation = mrs_lib::geometry::dist(vec3_t(x, y, z), vec3_t(0, 0, 0));
    +    2666             : 
    +    2667      193858 :       if (last_innovation > _odometry_innovation_threshold_ || radians::diff(heading, 0) > M_PI_2) {
    +    2668             : 
    +    2669           3 :         auto controller_tracker_switch_time = mrs_lib::get_mutexed(mutex_controller_tracker_switch_time_, controller_tracker_switch_time_);
    +    2670             : 
    +    2671           3 :         if ((ros::Time::now() - controller_tracker_switch_time).toSec() > 1.0) {
    +    2672             : 
    +    2673           2 :           if (!failsafe_triggered_ && !eland_triggered_) {
    +    2674             : 
    +    2675           2 :             ROS_ERROR("[ControlManager]: activating emergency land: odometry innovation too large: %.2f/%.2f (x: %.2f, y: %.2f, z: %.2f, heading: %.2f)",
    +    2676             :                       last_innovation, _odometry_innovation_threshold_, x, y, z, heading);
    +    2677             : 
    +    2678           2 :             eland();
    +    2679             :           }
    +    2680             :         }
    +    2681             :       }
    +    2682             :     }
    +    2683             :   }
    +    2684             : 
    +    2685             :   // --------------------------------------------------------------
    +    2686             :   // |   activate emergency land in case of medium control error  |
    +    2687             :   // --------------------------------------------------------------
    +    2688             : 
    +    2689             :   // | ------------------- tilt control error ------------------- |
    +    2690             : 
    +    2691      193858 :   if (_tilt_limit_eland_enabled_ && tilt_angle > _tilt_limit_eland_) {
    +    2692             : 
    +    2693           0 :     auto controller_tracker_switch_time = mrs_lib::get_mutexed(mutex_controller_tracker_switch_time_, controller_tracker_switch_time_);
    +    2694             : 
    +    2695           0 :     if ((ros::Time::now() - controller_tracker_switch_time).toSec() > 1.0) {
    +    2696             : 
    +    2697           0 :       if (!failsafe_triggered_ && !eland_triggered_) {
    +    2698             : 
    +    2699           0 :         ROS_ERROR("[ControlManager]: activating emergency land: tilt angle too large (%.2f/%.2f deg)", (180.0 / M_PI) * tilt_angle,
    +    2700             :                   (180.0 / M_PI) * _tilt_limit_eland_);
    +    2701             : 
    +    2702           0 :         eland();
    +    2703             :       }
    +    2704             :     }
    +    2705             :   }
    +    2706             : 
    +    2707             :   // | ----------------- position control error ----------------- |
    +    2708             : 
    +    2709      193858 :   if (position_error) {
    +    2710             : 
    +    2711      192821 :     double error_size = position_error->norm();
    +    2712             : 
    +    2713      192821 :     if (error_size > _eland_threshold_ / 2.0) {
    +    2714             : 
    +    2715         856 :       auto controller_tracker_switch_time = mrs_lib::get_mutexed(mutex_controller_tracker_switch_time_, controller_tracker_switch_time_);
    +    2716             : 
    +    2717         856 :       if ((ros::Time::now() - controller_tracker_switch_time).toSec() > 1.0) {
    +    2718             : 
    +    2719         628 :         if (!failsafe_triggered_ && !eland_triggered_) {
    +    2720             : 
    +    2721          65 :           ROS_DEBUG_THROTTLE(1.0, "[ControlManager]: releasing payload due to large position error");
    +    2722             : 
    +    2723          65 :           ungripSrv();
    +    2724             :         }
    +    2725             :       }
    +    2726             :     }
    +    2727             : 
    +    2728      192821 :     if (error_size > _eland_threshold_) {
    +    2729             : 
    +    2730         441 :       auto controller_tracker_switch_time = mrs_lib::get_mutexed(mutex_controller_tracker_switch_time_, controller_tracker_switch_time_);
    +    2731             : 
    +    2732         441 :       if ((ros::Time::now() - controller_tracker_switch_time).toSec() > 1.0) {
    +    2733             : 
    +    2734         257 :         if (!failsafe_triggered_ && !eland_triggered_) {
    +    2735             : 
    +    2736           3 :           ROS_ERROR("[ControlManager]: activating emergency land: position error %.2f/%.2f m (error x: %.2f, y: %.2f, z: %.2f)", error_size, _eland_threshold_,
    +    2737             :                     position_error.value()[0], position_error.value()[1], position_error.value()[2]);
    +    2738             : 
    +    2739           3 :           eland();
    +    2740             :         }
    +    2741             :       }
    +    2742             :     }
    +    2743             :   }
    +    2744             : 
    +    2745             :   // | -------------------- yaw control error ------------------- |
    +    2746             :   // do not have to mutex the yaw_error_ here since I am filling it in this function
    +    2747             : 
    +    2748      193858 :   if (_yaw_error_eland_enabled_ && yaw_error) {
    +    2749             : 
    +    2750      193858 :     if (yaw_error.value() > (_yaw_error_eland_ / 2.0)) {
    +    2751             : 
    +    2752           0 :       auto controller_tracker_switch_time = mrs_lib::get_mutexed(mutex_controller_tracker_switch_time_, controller_tracker_switch_time_);
    +    2753             : 
    +    2754           0 :       if ((ros::Time::now() - controller_tracker_switch_time).toSec() > 1.0) {
    +    2755             : 
    +    2756           0 :         if (!failsafe_triggered_ && !eland_triggered_) {
    +    2757             : 
    +    2758           0 :           ROS_DEBUG_THROTTLE(1.0, "[ControlManager]: releasing payload: yaw error %.2f/%.2f deg", (180.0 / M_PI) * yaw_error.value(),
    +    2759             :                              (180.0 / M_PI) * _yaw_error_eland_ / 2.0);
    +    2760             : 
    +    2761           0 :           ungripSrv();
    +    2762             :         }
    +    2763             :       }
    +    2764             :     }
    +    2765             : 
    +    2766      193857 :     if (yaw_error.value() > _yaw_error_eland_) {
    +    2767             : 
    +    2768           0 :       auto controller_tracker_switch_time = mrs_lib::get_mutexed(mutex_controller_tracker_switch_time_, controller_tracker_switch_time_);
    +    2769             : 
    +    2770           0 :       if ((ros::Time::now() - controller_tracker_switch_time).toSec() > 1.0) {
    +    2771             : 
    +    2772           0 :         if (!failsafe_triggered_ && !eland_triggered_) {
    +    2773             : 
    +    2774           0 :           ROS_ERROR("[ControlManager]: activating emergency land: yaw error %.2f/%.2f deg", (180.0 / M_PI) * yaw_error.value(),
    +    2775             :                     (180.0 / M_PI) * _yaw_error_eland_);
    +    2776             : 
    +    2777           0 :           eland();
    +    2778             :         }
    +    2779             :       }
    +    2780             :     }
    +    2781             :   }
    +    2782             : 
    +    2783             :   // --------------------------------------------------------------
    +    2784             :   // |      disarm the drone when the tilt exceeds the limit      |
    +    2785             :   // --------------------------------------------------------------
    +    2786      193858 :   if (_tilt_limit_disarm_enabled_ && tilt_angle > _tilt_limit_disarm_) {
    +    2787             : 
    +    2788           0 :     ROS_ERROR("[ControlManager]: tilt angle too large, disarming: tilt angle=%.2f/%.2f deg", (180.0 / M_PI) * tilt_angle, (180.0 / M_PI) * _tilt_limit_disarm_);
    +    2789             : 
    +    2790           0 :     arming(false);
    +    2791             :   }
    +    2792             : 
    +    2793             :   // --------------------------------------------------------------
    +    2794             :   // |     disarm the drone when tilt error exceeds the limit     |
    +    2795             :   // --------------------------------------------------------------
    +    2796             : 
    +    2797      193858 :   if (_tilt_error_disarm_enabled_ && tilt_error) {
    +    2798             : 
    +    2799      193856 :     auto controller_tracker_switch_time = mrs_lib::get_mutexed(mutex_controller_tracker_switch_time_, controller_tracker_switch_time_);
    +    2800             : 
    +    2801             :     // the time from the last controller/tracker switch
    +    2802             :     // fyi: we should not
    +    2803      193858 :     double time_from_ctrl_tracker_switch = (ros::Time::now() - controller_tracker_switch_time).toSec();
    +    2804             : 
    +    2805             :     // if the tile error is over the threshold
    +    2806             :     // && we are not ramping up during takeoff
    +    2807      193858 :     if (fabs(tilt_error.value()) > _tilt_error_disarm_threshold_ && !last_control_output.diagnostics.ramping_up) {
    +    2808             : 
    +    2809             :       // only account for the error if some time passed from the last tracker/controller switch
    +    2810           0 :       if (time_from_ctrl_tracker_switch > 1.0) {
    +    2811             : 
    +    2812             :         // if the threshold was not exceeded before
    +    2813           0 :         if (!tilt_error_disarm_over_thr_) {
    +    2814             : 
    +    2815           0 :           tilt_error_disarm_over_thr_ = true;
    +    2816           0 :           tilt_error_disarm_time_     = ros::Time::now();
    +    2817             : 
    +    2818           0 :           ROS_WARN("[ControlManager]: tilt error exceeded threshold (%.2f/%.2f deg)", (180.0 / M_PI) * tilt_error.value(),
    +    2819             :                    (180.0 / M_PI) * _tilt_error_disarm_threshold_);
    +    2820             : 
    +    2821             :           // if it was exceeded before, just keep it
    +    2822             :         } else {
    +    2823             : 
    +    2824           0 :           ROS_WARN_THROTTLE(0.1, "[ControlManager]: tilt error (%.2f deg) over threshold for %.2f s", (180.0 / M_PI) * tilt_error.value(),
    +    2825             :                             (ros::Time::now() - tilt_error_disarm_time_).toSec());
    +    2826             :         }
    +    2827             : 
    +    2828             :         // if the tile error is bad, but the controller just switched,
    +    2829             :         // don't think its bad anymore
    +    2830             :       } else {
    +    2831             : 
    +    2832           0 :         tilt_error_disarm_over_thr_ = false;
    +    2833           0 :         tilt_error_disarm_time_     = ros::Time::now();
    +    2834             :       }
    +    2835             : 
    +    2836             :       // if the tilt error is fine
    +    2837             :     } else {
    +    2838             : 
    +    2839             :       // make it fine
    +    2840      193858 :       tilt_error_disarm_over_thr_ = false;
    +    2841      193858 :       tilt_error_disarm_time_     = ros::Time::now();
    +    2842             :     }
    +    2843             : 
    +    2844             :     // calculate the time over the threshold
    +    2845      193857 :     double tot = (ros::Time::now() - tilt_error_disarm_time_).toSec();
    +    2846             : 
    +    2847             :     // if the tot exceeds the limit (and if we are actually over the threshold)
    +    2848      193858 :     if (tilt_error_disarm_over_thr_ && (tot > _tilt_error_disarm_timeout_)) {
    +    2849             : 
    +    2850           0 :       bool is_flying = offboard_mode_ && active_tracker_idx != _null_tracker_idx_;
    +    2851             : 
    +    2852             :       // only when flying and not in failsafe
    +    2853           0 :       if (is_flying) {
    +    2854             : 
    +    2855           0 :         ROS_ERROR("[ControlManager]: tilt error too large for %.2f s, disarming", tot);
    +    2856             : 
    +    2857           0 :         toggleOutput(false);
    +    2858           0 :         arming(false);
    +    2859             :       }
    +    2860             :     }
    +    2861             :   }
    +    2862             : 
    +    2863             :   // | --------- dropping out of OFFBOARD in mid flight --------- |
    +    2864             : 
    +    2865             :   // if we are not in offboard and the drone is in mid air (NullTracker is not active)
    +    2866      193860 :   if (offboard_mode_was_true_ && !offboard_mode_ && active_tracker_idx != _null_tracker_idx_) {
    +    2867             : 
    +    2868           0 :     ROS_ERROR_THROTTLE(1.0, "[ControlManager]: we fell out of OFFBOARD in mid air, disabling output");
    +    2869             : 
    +    2870           0 :     toggleOutput(false);
    +    2871             :   }
    +    2872             : }  // namespace control_manager
    +    2873             : 
    +    2874             : //}
    +    2875             : 
    +    2876             : /* //{ timerEland() */
    +    2877             : 
    +    2878         494 : void ControlManager::timerEland(const ros::TimerEvent& event) {
    +    2879             : 
    +    2880         494 :   if (!is_initialized_)
    +    2881         126 :     return;
    +    2882             : 
    +    2883         988 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("timerEland", _elanding_timer_rate_, 0.01, event);
    +    2884         988 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("ControlManager::timerEland", scope_timer_logger_, scope_timer_enabled_);
    +    2885             : 
    +    2886             :   // copy member variables
    +    2887         494 :   auto last_control_output = mrs_lib::get_mutexed(mutex_last_control_output_, last_control_output_);
    +    2888             : 
    +    2889         494 :   if (!last_control_output.control_output) {
    +    2890           0 :     return;
    +    2891             :   }
    +    2892             : 
    +    2893         494 :   auto throttle = extractThrottle(last_control_output);
    +    2894             : 
    +    2895         494 :   if (!throttle) {
    +    2896         126 :     ROS_ERROR_THROTTLE(1.0, "[ControlManager]: TODO: implement landing detection mechanism for the current control modality");
    +    2897         126 :     return;
    +    2898             :   }
    +    2899             : 
    +    2900         368 :   if (current_state_landing_ == IDLE_STATE) {
    +    2901             : 
    +    2902           0 :     return;
    +    2903             : 
    +    2904         368 :   } else if (current_state_landing_ == LANDING_STATE) {
    +    2905             : 
    +    2906             :     // --------------------------------------------------------------
    +    2907             :     // |                            TODO                            |
    +    2908             :     // This section needs work. The throttle landing detection      |
    +    2909             :     // mechanism should be extracted and other mechanisms, such     |
    +    2910             :     // as velocity-based detection should be used for high          |
    +    2911             :     // modalities                                                   |
    +    2912             :     // --------------------------------------------------------------
    +    2913             : 
    +    2914         368 :     if (!last_control_output.control_output) {
    +    2915           0 :       ROS_WARN_THROTTLE(1.0, "[ControlManager]: timerEland: last_control_output has not been initialized, returning");
    +    2916           0 :       ROS_WARN_THROTTLE(1.0, "[ControlManager]: tip: the RC eland is probably triggered");
    +    2917           0 :       return;
    +    2918             :     }
    +    2919             : 
    +    2920             :     // recalculate the mass based on the throttle
    +    2921         368 :     throttle_mass_estimate_ = mrs_lib::quadratic_throttle_model::throttleToForce(common_handlers_->throttle_model, throttle.value()) / common_handlers_->g;
    +    2922         368 :     ROS_INFO_THROTTLE(1.0, "[ControlManager]: landing: initial mass: %.2f throttle_mass_estimate: %.2f", landing_uav_mass_, throttle_mass_estimate_);
    +    2923             : 
    +    2924             :     // condition for automatic motor turn off
    +    2925         368 :     if (((throttle_mass_estimate_ < _elanding_cutoff_mass_factor_ * landing_uav_mass_) || throttle < 0.01)) {
    +    2926          88 :       if (!throttle_under_threshold_) {
    +    2927             : 
    +    2928           4 :         throttle_mass_estimate_first_time_ = ros::Time::now();
    +    2929           4 :         throttle_under_threshold_          = true;
    +    2930             :       }
    +    2931             : 
    +    2932          88 :       ROS_INFO_THROTTLE(0.1, "[ControlManager]: throttle is under cutoff factor for %.2f s", (ros::Time::now() - throttle_mass_estimate_first_time_).toSec());
    +    2933             : 
    +    2934             :     } else {
    +    2935         280 :       throttle_mass_estimate_first_time_ = ros::Time::now();
    +    2936         280 :       throttle_under_threshold_          = false;
    +    2937             :     }
    +    2938             : 
    +    2939         368 :     if (throttle_under_threshold_ && ((ros::Time::now() - throttle_mass_estimate_first_time_).toSec() > _elanding_cutoff_timeout_)) {
    +    2940             :       // enable callbacks? ... NO
    +    2941             : 
    +    2942           4 :       ROS_INFO("[ControlManager]: reached cutoff throttle, disabling output");
    +    2943           4 :       toggleOutput(false);
    +    2944             : 
    +    2945             :       // disarm the drone
    +    2946           4 :       if (_eland_disarm_enabled_) {
    +    2947             : 
    +    2948           4 :         ROS_INFO("[ControlManager]: calling for disarm");
    +    2949           4 :         arming(false);
    +    2950             :       }
    +    2951             : 
    +    2952           4 :       changeLandingState(IDLE_STATE);
    +    2953             : 
    +    2954           4 :       ROS_WARN("[ControlManager]: emergency landing finished");
    +    2955             : 
    +    2956           4 :       ROS_DEBUG("[ControlManager]: stopping eland timer");
    +    2957           4 :       timer_eland_.stop();
    +    2958           4 :       ROS_DEBUG("[ControlManager]: eland timer stopped");
    +    2959             : 
    +    2960             :       // we should NOT set eland_triggered_=true
    +    2961             :     }
    +    2962             :   }
    +    2963             : }
    +    2964             : 
    +    2965             : //}
    +    2966             : 
    +    2967             : /* //{ timerFailsafe() */
    +    2968             : 
    +    2969        9711 : void ControlManager::timerFailsafe(const ros::TimerEvent& event) {
    +    2970             : 
    +    2971        9711 :   if (!is_initialized_) {
    +    2972           0 :     return;
    +    2973             :   }
    +    2974             : 
    +    2975        9711 :   ROS_INFO_ONCE("[ControlManager]: timerFailsafe() spinning");
    +    2976             : 
    +    2977       19422 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("timerFailsafe", _failsafe_timer_rate_, 0.01, event);
    +    2978       19422 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("ControlManager::timerFailsafe", scope_timer_logger_, scope_timer_enabled_);
    +    2979             : 
    +    2980             :   // copy member variables
    +    2981        9711 :   auto uav_state = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +    2982             : 
    +    2983        9711 :   updateControllers(uav_state);
    +    2984             : 
    +    2985        9711 :   publish();
    +    2986             : 
    +    2987        9711 :   auto last_control_output = mrs_lib::get_mutexed(mutex_last_control_output_, last_control_output_);
    +    2988             : 
    +    2989        9711 :   if (!last_control_output.control_output) {
    +    2990           0 :     ROS_ERROR_THROTTLE(1.0, "[ControlManager]: timerFailsafe: the control output produced by the failsafe controller is empty!");
    +    2991           0 :     return;
    +    2992             :   }
    +    2993             : 
    +    2994        9711 :   auto throttle = extractThrottle(last_control_output);
    +    2995             : 
    +    2996        9711 :   if (!throttle) {
    +    2997           0 :     ROS_DEBUG_THROTTLE(1.0, "[ControlManager]: FailsafeTimer: could not extract throttle out of the last control output");
    +    2998           0 :     return;
    +    2999             :   }
    +    3000             : 
    +    3001             :   // --------------------------------------------------------------
    +    3002             :   // |                            TODO                            |
    +    3003             :   // This section needs work. The throttle landing detection      |
    +    3004             :   // mechanism should be extracted and other mechanisms, such     |
    +    3005             :   // as velocity-based detection should be used for high          |
    +    3006             :   // modalities                                                   |
    +    3007             :   // --------------------------------------------------------------
    +    3008             : 
    +    3009        9711 :   double throttle_mass_estimate_ = mrs_lib::quadratic_throttle_model::throttleToForce(common_handlers_->throttle_model, throttle.value()) / common_handlers_->g;
    +    3010        9711 :   ROS_INFO_THROTTLE(1.0, "[ControlManager]: failsafe: initial mass: %.2f throttle_mass_estimate: %.2f", landing_uav_mass_, throttle_mass_estimate_);
    +    3011             : 
    +    3012             :   // condition for automatic motor turn off
    +    3013        9711 :   if (((throttle_mass_estimate_ < _elanding_cutoff_mass_factor_ * landing_uav_mass_))) {
    +    3014             : 
    +    3015        1414 :     if (!throttle_under_threshold_) {
    +    3016             : 
    +    3017           7 :       throttle_mass_estimate_first_time_ = ros::Time::now();
    +    3018           7 :       throttle_under_threshold_          = true;
    +    3019             :     }
    +    3020             : 
    +    3021        1414 :     ROS_INFO_THROTTLE(0.1, "[ControlManager]: throttle is under cutoff factor for %.2f s", (ros::Time::now() - throttle_mass_estimate_first_time_).toSec());
    +    3022             : 
    +    3023             :   } else {
    +    3024             : 
    +    3025        8297 :     throttle_mass_estimate_first_time_ = ros::Time::now();
    +    3026        8297 :     throttle_under_threshold_          = false;
    +    3027             :   }
    +    3028             : 
    +    3029             :   // condition for automatic motor turn off
    +    3030        9711 :   if (throttle_under_threshold_ && ((ros::Time::now() - throttle_mass_estimate_first_time_).toSec() > _elanding_cutoff_timeout_)) {
    +    3031             : 
    +    3032           7 :     ROS_INFO_THROTTLE(1.0, "[ControlManager]: detecting zero throttle, disarming");
    +    3033             : 
    +    3034           7 :     arming(false);
    +    3035             :   }
    +    3036             : }
    +    3037             : 
    +    3038             : //}
    +    3039             : 
    +    3040             : /* //{ timerJoystick() */
    +    3041             : 
    +    3042       57735 : void ControlManager::timerJoystick(const ros::TimerEvent& event) {
    +    3043             : 
    +    3044       57735 :   if (!is_initialized_) {
    +    3045           0 :     return;
    +    3046             :   }
    +    3047             : 
    +    3048      173205 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("timerJoystick", _status_timer_rate_, 0.05, event);
    +    3049      173205 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("ControlManager::timerJoystick", scope_timer_logger_, scope_timer_enabled_);
    +    3050             : 
    +    3051      115470 :   auto last_tracker_cmd = mrs_lib::get_mutexed(mutex_last_tracker_cmd_, last_tracker_cmd_);
    +    3052             : 
    +    3053             :   // if start was pressed and held for > 3.0 s
    +    3054       57735 :   if (joystick_start_pressed_ && joystick_start_press_time_ != ros::Time(0) && (ros::Time::now() - joystick_start_press_time_).toSec() > 3.0) {
    +    3055             : 
    +    3056           0 :     joystick_start_press_time_ = ros::Time(0);
    +    3057             : 
    +    3058           0 :     ROS_INFO("[ControlManager]: transitioning to joystick control: activating '%s' and '%s'", _joystick_tracker_name_.c_str(),
    +    3059             :              _joystick_controller_name_.c_str());
    +    3060             : 
    +    3061           0 :     joystick_start_pressed_ = false;
    +    3062             : 
    +    3063           0 :     switchTracker(_joystick_tracker_name_);
    +    3064           0 :     switchController(_joystick_controller_name_);
    +    3065             :   }
    +    3066             : 
    +    3067             :   // if RT+LT were pressed and held for > 0.1 s
    +    3068       57735 :   if (joystick_failsafe_pressed_ && joystick_failsafe_press_time_ != ros::Time(0) && (ros::Time::now() - joystick_failsafe_press_time_).toSec() > 0.1) {
    +    3069             : 
    +    3070           0 :     joystick_failsafe_press_time_ = ros::Time(0);
    +    3071             : 
    +    3072           0 :     ROS_INFO("[ControlManager]: activating failsafe by joystick");
    +    3073             : 
    +    3074           0 :     joystick_failsafe_pressed_ = false;
    +    3075             : 
    +    3076           0 :     failsafe();
    +    3077             :   }
    +    3078             : 
    +    3079             :   // if joypads were pressed and held for > 0.1 s
    +    3080       57735 :   if (joystick_eland_pressed_ && joystick_eland_press_time_ != ros::Time(0) && (ros::Time::now() - joystick_eland_press_time_).toSec() > 0.1) {
    +    3081             : 
    +    3082           0 :     joystick_eland_press_time_ = ros::Time(0);
    +    3083             : 
    +    3084           0 :     ROS_INFO("[ControlManager]: activating eland by joystick");
    +    3085             : 
    +    3086           0 :     joystick_failsafe_pressed_ = false;
    +    3087             : 
    +    3088           0 :     eland();
    +    3089             :   }
    +    3090             : 
    +    3091             :   // if back was pressed and held for > 0.1 s
    +    3092       57735 :   if (joystick_back_pressed_ && joystick_back_press_time_ != ros::Time(0) && (ros::Time::now() - joystick_back_press_time_).toSec() > 0.1) {
    +    3093             : 
    +    3094           0 :     joystick_back_press_time_ = ros::Time(0);
    +    3095             : 
    +    3096             :     // activate/deactivate the joystick goto functionality
    +    3097           0 :     joystick_goto_enabled_ = !joystick_goto_enabled_;
    +    3098             : 
    +    3099           0 :     ROS_INFO("[ControlManager]: joystick control %s", joystick_goto_enabled_ ? "activated" : "deactivated");
    +    3100             :   }
    +    3101             : 
    +    3102             :   // if the GOTO functionality is enabled...
    +    3103       57735 :   if (joystick_goto_enabled_ && sh_joystick_.hasMsg()) {
    +    3104             : 
    +    3105           0 :     auto joystick_data = sh_joystick_.getMsg();
    +    3106             : 
    +    3107             :     // create the reference
    +    3108             : 
    +    3109           0 :     mrs_msgs::Vec4::Request request;
    +    3110             : 
    +    3111           0 :     if (fabs(joystick_data->axes[_channel_pitch_]) >= 0.05 || fabs(joystick_data->axes[_channel_roll_]) >= 0.05 ||
    +    3112           0 :         fabs(joystick_data->axes[_channel_heading_]) >= 0.05 || fabs(joystick_data->axes[_channel_throttle_]) >= 0.05) {
    +    3113             : 
    +    3114           0 :       if (_joystick_mode_ == 0) {
    +    3115             : 
    +    3116           0 :         request.goal[REF_X]       = _channel_mult_pitch_ * joystick_data->axes[_channel_pitch_] * _joystick_carrot_distance_;
    +    3117           0 :         request.goal[REF_Y]       = _channel_mult_roll_ * joystick_data->axes[_channel_roll_] * _joystick_carrot_distance_;
    +    3118           0 :         request.goal[REF_Z]       = _channel_mult_throttle_ * joystick_data->axes[_channel_throttle_];
    +    3119           0 :         request.goal[REF_HEADING] = _channel_mult_heading_ * joystick_data->axes[_channel_heading_];
    +    3120             : 
    +    3121           0 :         mrs_msgs::Vec4::Response response;
    +    3122             : 
    +    3123           0 :         callbackGotoFcu(request, response);
    +    3124             : 
    +    3125           0 :       } else if (_joystick_mode_ == 1) {
    +    3126             : 
    +    3127           0 :         mrs_msgs::TrajectoryReference trajectory;
    +    3128             : 
    +    3129           0 :         double dt = 0.2;
    +    3130             : 
    +    3131           0 :         trajectory.fly_now         = true;
    +    3132           0 :         trajectory.header.frame_id = "fcu_untilted";
    +    3133           0 :         trajectory.use_heading     = true;
    +    3134           0 :         trajectory.dt              = dt;
    +    3135             : 
    +    3136           0 :         mrs_msgs::Reference point;
    +    3137           0 :         point.position.x = 0;
    +    3138           0 :         point.position.y = 0;
    +    3139           0 :         point.position.z = 0;
    +    3140           0 :         point.heading    = 0;
    +    3141             : 
    +    3142           0 :         trajectory.points.push_back(point);
    +    3143             : 
    +    3144           0 :         double speed = 1.0;
    +    3145             : 
    +    3146           0 :         for (int i = 0; i < 50; i++) {
    +    3147             : 
    +    3148           0 :           point.position.x += _channel_mult_pitch_ * joystick_data->axes[_channel_pitch_] * (speed * dt);
    +    3149           0 :           point.position.y += _channel_mult_roll_ * joystick_data->axes[_channel_roll_] * (speed * dt);
    +    3150           0 :           point.position.z += _channel_mult_throttle_ * joystick_data->axes[_channel_throttle_] * (speed * dt);
    +    3151           0 :           point.heading = _channel_mult_heading_ * joystick_data->axes[_channel_heading_];
    +    3152             : 
    +    3153           0 :           trajectory.points.push_back(point);
    +    3154             :         }
    +    3155             : 
    +    3156           0 :         setTrajectoryReference(trajectory);
    +    3157             :       }
    +    3158             :     }
    +    3159             :   }
    +    3160             : 
    +    3161       57735 :   if (rc_goto_active_ && last_tracker_cmd && sh_hw_api_rc_.hasMsg()) {
    +    3162             : 
    +    3163             :     // create the reference
    +    3164        1092 :     mrs_msgs::VelocityReferenceStampedSrv::Request request;
    +    3165             : 
    +    3166         546 :     double des_x       = 0;
    +    3167         546 :     double des_y       = 0;
    +    3168         546 :     double des_z       = 0;
    +    3169         546 :     double des_heading = 0;
    +    3170             : 
    +    3171         546 :     bool nothing_to_do = true;
    +    3172             : 
    +    3173             :     // copy member variables
    +    3174        1092 :     mrs_msgs::HwApiRcChannelsConstPtr rc_channels = sh_hw_api_rc_.getMsg();
    +    3175             : 
    +    3176         546 :     if (rc_channels->channels.size() < 4) {
    +    3177             : 
    +    3178           0 :       ROS_ERROR_THROTTLE(1.0, "[ControlManager]: RC control channel numbers are out of range (the # of channels in rc/in topic is %d)",
    +    3179             :                          int(rc_channels->channels.size()));
    +    3180           0 :       ROS_ERROR_THROTTLE(1.0, "[ControlManager]: tip: this could be caused by the RC failsafe not being configured!");
    +    3181             : 
    +    3182             :     } else {
    +    3183             : 
    +    3184         546 :       double tmp_x       = RCChannelToRange(rc_channels->channels[_rc_channel_pitch_], _rc_horizontal_speed_, 0.1);
    +    3185         546 :       double tmp_y       = -RCChannelToRange(rc_channels->channels[_rc_channel_roll_], _rc_horizontal_speed_, 0.1);
    +    3186         546 :       double tmp_z       = RCChannelToRange(rc_channels->channels[_rc_channel_throttle_], _rc_vertical_speed_, 0.3);
    +    3187         546 :       double tmp_heading = -RCChannelToRange(rc_channels->channels[_rc_channel_heading_], _rc_heading_rate_, 0.1);
    +    3188             : 
    +    3189         546 :       if (abs(tmp_x) > 1e-3) {
    +    3190          90 :         des_x         = tmp_x;
    +    3191          90 :         nothing_to_do = false;
    +    3192             :       }
    +    3193             : 
    +    3194         546 :       if (abs(tmp_y) > 1e-3) {
    +    3195         111 :         des_y         = tmp_y;
    +    3196         111 :         nothing_to_do = false;
    +    3197             :       }
    +    3198             : 
    +    3199         546 :       if (abs(tmp_z) > 1e-3) {
    +    3200         219 :         des_z         = tmp_z;
    +    3201         219 :         nothing_to_do = false;
    +    3202             :       }
    +    3203             : 
    +    3204         546 :       if (abs(tmp_heading) > 1e-3) {
    +    3205          48 :         des_heading   = tmp_heading;
    +    3206          48 :         nothing_to_do = false;
    +    3207             :       }
    +    3208             :     }
    +    3209             : 
    +    3210         546 :     if (!nothing_to_do) {
    +    3211             : 
    +    3212         468 :       request.reference.header.frame_id = "fcu_untilted";
    +    3213             : 
    +    3214         468 :       request.reference.reference.use_heading_rate = true;
    +    3215             : 
    +    3216         468 :       request.reference.reference.velocity.x   = des_x;
    +    3217         468 :       request.reference.reference.velocity.y   = des_y;
    +    3218         468 :       request.reference.reference.velocity.z   = des_z;
    +    3219         468 :       request.reference.reference.heading_rate = des_heading;
    +    3220             : 
    +    3221         936 :       mrs_msgs::VelocityReferenceStampedSrv::Response response;
    +    3222             : 
    +    3223             :       // disable callbacks of all trackers
    +    3224         468 :       std_srvs::SetBoolRequest req_enable_callbacks;
    +    3225             : 
    +    3226             :       // enable the callbacks for the active tracker
    +    3227         468 :       req_enable_callbacks.data = true;
    +    3228             :       {
    +    3229         468 :         std::scoped_lock lock(mutex_tracker_list_);
    +    3230             : 
    +    3231         936 :         tracker_list_[active_tracker_idx_]->enableCallbacks(
    +    3232         936 :             std_srvs::SetBoolRequest::ConstPtr(std::make_unique<std_srvs::SetBoolRequest>(req_enable_callbacks)));
    +    3233             :       }
    +    3234             : 
    +    3235         468 :       callbacks_enabled_ = true;
    +    3236             : 
    +    3237         468 :       callbackVelocityReferenceService(request, response);
    +    3238             : 
    +    3239         468 :       callbacks_enabled_ = false;
    +    3240             : 
    +    3241         468 :       ROS_INFO_THROTTLE(1.0, "[ControlManager]: goto by RC with speed x=%.2f, y=%.2f, z=%.2f, heading_rate=%.2f", des_x, des_y, des_z, des_heading);
    +    3242             : 
    +    3243             :       // disable the callbacks back again
    +    3244         468 :       req_enable_callbacks.data = false;
    +    3245             :       {
    +    3246         468 :         std::scoped_lock lock(mutex_tracker_list_);
    +    3247             : 
    +    3248         936 :         tracker_list_[active_tracker_idx_]->enableCallbacks(
    +    3249         936 :             std_srvs::SetBoolRequest::ConstPtr(std::make_unique<std_srvs::SetBoolRequest>(req_enable_callbacks)));
    +    3250             :       }
    +    3251             :     }
    +    3252             :   }
    +    3253             : }
    +    3254             : 
    +    3255             : //}
    +    3256             : 
    +    3257             : /* //{ timerBumper() */
    +    3258             : 
    +    3259        2167 : void ControlManager::timerBumper(const ros::TimerEvent& event) {
    +    3260             : 
    +    3261        2167 :   if (!is_initialized_)
    +    3262        1868 :     return;
    +    3263             : 
    +    3264        4334 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("timerBumper", _bumper_timer_rate_, 0.05, event);
    +    3265        4334 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("ControlManager::timerBumper", scope_timer_logger_, scope_timer_enabled_);
    +    3266             : 
    +    3267             :   // | ---------------------- preconditions --------------------- |
    +    3268             : 
    +    3269        2167 :   if (!sh_bumper_.hasMsg()) {
    +    3270        1864 :     return;
    +    3271             :   }
    +    3272             : 
    +    3273         303 :   if (!bumper_enabled_) {
    +    3274           0 :     return;
    +    3275             :   }
    +    3276             : 
    +    3277         303 :   if (!isFlyingNormally() && !bumper_repulsing_) {
    +    3278           4 :     return;
    +    3279             :   }
    +    3280             : 
    +    3281         299 :   if (!got_uav_state_) {
    +    3282           0 :     return;
    +    3283             :   }
    +    3284             : 
    +    3285         299 :   if (sh_bumper_.hasMsg() && (ros::Time::now() - sh_bumper_.lastMsgTime()).toSec() > 1.0) {
    +    3286             : 
    +    3287           0 :     ROS_ERROR_THROTTLE(1.0, "[ControlManager]: obstacle bumper is missing messages although we got them before");
    +    3288             : 
    +    3289           0 :     return;
    +    3290             :   }
    +    3291             : 
    +    3292         299 :   timer_bumper_.setPeriod(ros::Duration(1.0 / _bumper_timer_rate_));
    +    3293             : 
    +    3294             :   // | ------------------ call the bumper logic ----------------- |
    +    3295             : 
    +    3296         299 :   bumperPushFromObstacle();
    +    3297             : }
    +    3298             : 
    +    3299             : //}
    +    3300             : 
    +    3301             : /* //{ timerPirouette() */
    +    3302             : 
    +    3303           0 : void ControlManager::timerPirouette(const ros::TimerEvent& event) {
    +    3304             : 
    +    3305           0 :   if (!is_initialized_)
    +    3306           0 :     return;
    +    3307             : 
    +    3308           0 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("timerPirouette", _pirouette_timer_rate_, 0.01, event);
    +    3309           0 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("ControlManager::timerPirouette", scope_timer_logger_, scope_timer_enabled_);
    +    3310             : 
    +    3311           0 :   pirouette_iterator_++;
    +    3312             : 
    +    3313           0 :   double pirouette_duration  = (2 * M_PI) / _pirouette_speed_;
    +    3314           0 :   double pirouette_n_steps   = pirouette_duration * _pirouette_timer_rate_;
    +    3315           0 :   double pirouette_step_size = (2 * M_PI) / pirouette_n_steps;
    +    3316             : 
    +    3317           0 :   if (rc_escalating_failsafe_triggered_ || failsafe_triggered_ || eland_triggered_ || (pirouette_iterator_ > pirouette_duration * _pirouette_timer_rate_)) {
    +    3318             : 
    +    3319           0 :     _pirouette_enabled_ = false;
    +    3320           0 :     timer_pirouette_.stop();
    +    3321             : 
    +    3322           0 :     setCallbacks(true);
    +    3323             : 
    +    3324           0 :     return;
    +    3325             :   }
    +    3326             : 
    +    3327             :   // set the reference
    +    3328           0 :   mrs_msgs::ReferenceStamped reference_request;
    +    3329             : 
    +    3330           0 :   auto last_tracker_cmd = mrs_lib::get_mutexed(mutex_last_tracker_cmd_, last_tracker_cmd_);
    +    3331             : 
    +    3332           0 :   reference_request.header.frame_id      = "";
    +    3333           0 :   reference_request.header.stamp         = ros::Time(0);
    +    3334           0 :   reference_request.reference.position.x = last_tracker_cmd->position.x;
    +    3335           0 :   reference_request.reference.position.y = last_tracker_cmd->position.y;
    +    3336           0 :   reference_request.reference.position.z = last_tracker_cmd->position.z;
    +    3337           0 :   reference_request.reference.heading    = pirouette_initial_heading_ + pirouette_iterator_ * pirouette_step_size;
    +    3338             : 
    +    3339             :   // enable the callbacks for the active tracker
    +    3340             :   {
    +    3341           0 :     std::scoped_lock lock(mutex_tracker_list_);
    +    3342             : 
    +    3343           0 :     std_srvs::SetBoolRequest req_enable_callbacks;
    +    3344           0 :     req_enable_callbacks.data = true;
    +    3345             : 
    +    3346           0 :     tracker_list_[active_tracker_idx_]->enableCallbacks(std_srvs::SetBoolRequest::ConstPtr(std::make_unique<std_srvs::SetBoolRequest>(req_enable_callbacks)));
    +    3347             : 
    +    3348           0 :     callbacks_enabled_ = true;
    +    3349             :   }
    +    3350             : 
    +    3351           0 :   setReference(reference_request);
    +    3352             : 
    +    3353             :   {
    +    3354           0 :     std::scoped_lock lock(mutex_tracker_list_);
    +    3355             : 
    +    3356             :     // disable the callbacks for the active tracker
    +    3357           0 :     std_srvs::SetBoolRequest req_enable_callbacks;
    +    3358           0 :     req_enable_callbacks.data = false;
    +    3359             : 
    +    3360           0 :     tracker_list_[active_tracker_idx_]->enableCallbacks(std_srvs::SetBoolRequest::ConstPtr(std::make_unique<std_srvs::SetBoolRequest>(req_enable_callbacks)));
    +    3361             : 
    +    3362           0 :     callbacks_enabled_ = false;
    +    3363             :   }
    +    3364             : }
    +    3365             : 
    +    3366             : //}
    +    3367             : 
    +    3368             : // --------------------------------------------------------------
    +    3369             : // |                           asyncs                           |
    +    3370             : // --------------------------------------------------------------
    +    3371             : 
    +    3372             : /* asyncControl() //{ */
    +    3373             : 
    +    3374      129578 : void ControlManager::asyncControl(void) {
    +    3375             : 
    +    3376      129578 :   if (!is_initialized_)
    +    3377           0 :     return;
    +    3378             : 
    +    3379      259156 :   mrs_lib::AtomicScopeFlag unset_running(running_async_control_);
    +    3380             : 
    +    3381      388734 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("asyncControl");
    +    3382      388734 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("ControlManager::asyncControl", scope_timer_logger_, scope_timer_enabled_);
    +    3383             : 
    +    3384             :   // copy member variables
    +    3385      259156 :   auto uav_state           = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +    3386      129578 :   auto current_constraints = mrs_lib::get_mutexed(mutex_constraints_, current_constraints_);
    +    3387             : 
    +    3388      129578 :   if (!failsafe_triggered_) {  // when failsafe is triggered, updateControllers() and publish() is called in timerFailsafe()
    +    3389             : 
    +    3390             :     // run the safety timer
    +    3391             :     // in the case of large control errors, the safety mechanisms will be triggered before the controllers and trackers are updated...
    +    3392      120320 :     while (running_safety_timer_) {
    +    3393             : 
    +    3394         846 :       ROS_DEBUG("[ControlManager]: waiting for safety timer to finish");
    +    3395         846 :       ros::Duration wait(0.001);
    +    3396         846 :       wait.sleep();
    +    3397             : 
    +    3398         846 :       if (!running_safety_timer_) {
    +    3399         840 :         ROS_DEBUG("[ControlManager]: safety timer finished");
    +    3400         840 :         break;
    +    3401             :       }
    +    3402             :     }
    +    3403             : 
    +    3404      120314 :     ros::TimerEvent safety_timer_event;
    +    3405      120314 :     timerSafety(safety_timer_event);
    +    3406             : 
    +    3407      120314 :     updateTrackers();
    +    3408             : 
    +    3409      120314 :     updateControllers(uav_state);
    +    3410             : 
    +    3411      120314 :     if (got_constraints_) {
    +    3412             : 
    +    3413             :       // update the constraints to trackers, if need to
    +    3414      119670 :       auto enforce = enforceControllersConstraints(current_constraints);
    +    3415             : 
    +    3416      119670 :       if (enforce && !constraints_being_enforced_) {
    +    3417             : 
    +    3418          60 :         setConstraintsToTrackers(enforce.value());
    +    3419          60 :         mrs_lib::set_mutexed(mutex_constraints_, enforce.value(), sanitized_constraints_);
    +    3420             : 
    +    3421          60 :         constraints_being_enforced_ = true;
    +    3422             : 
    +    3423          60 :         auto active_controller_idx = mrs_lib::get_mutexed(mutex_controller_list_, active_controller_idx_);
    +    3424             : 
    +    3425          60 :         ROS_WARN_THROTTLE(1.0, "[ControlManager]: the controller '%s' is enforcing constraints over the ConstraintManager",
    +    3426             :                           _controller_names_[active_controller_idx].c_str());
    +    3427             : 
    +    3428      119610 :       } else if (!enforce && constraints_being_enforced_) {
    +    3429             : 
    +    3430          53 :         ROS_INFO_THROTTLE(1.0, "[ControlManager]: constraint values returned to original values");
    +    3431             : 
    +    3432          53 :         constraints_being_enforced_ = false;
    +    3433             : 
    +    3434          53 :         mrs_lib::set_mutexed(mutex_constraints_, current_constraints, sanitized_constraints_);
    +    3435             : 
    +    3436          53 :         setConstraintsToTrackers(current_constraints);
    +    3437             :       }
    +    3438             :     }
    +    3439             : 
    +    3440      120314 :     publish();
    +    3441             :   }
    +    3442             : 
    +    3443             :   // if odometry switch happened, we finish it here and turn the safety timer back on
    +    3444      129578 :   if (odometry_switch_in_progress_) {
    +    3445             : 
    +    3446           5 :     ROS_DEBUG("[ControlManager]: starting safety timer");
    +    3447           5 :     timer_safety_.start();
    +    3448           5 :     ROS_DEBUG("[ControlManager]: safety timer started");
    +    3449           5 :     odometry_switch_in_progress_ = false;
    +    3450             : 
    +    3451             :     {
    +    3452          10 :       std::scoped_lock lock(mutex_uav_state_);
    +    3453             : 
    +    3454           5 :       ROS_INFO("[ControlManager]: odometry after switch: x=%.2f, y=%.2f, z=%.2f, heading=%.2f", uav_state.pose.position.x, uav_state.pose.position.y,
    +    3455             :                uav_state.pose.position.z, uav_heading_);
    +    3456             :     }
    +    3457             :   }
    +    3458             : }
    +    3459             : 
    +    3460             : //}
    +    3461             : 
    +    3462             : // --------------------------------------------------------------
    +    3463             : // |                          callbacks                         |
    +    3464             : // --------------------------------------------------------------
    +    3465             : 
    +    3466             : // | --------------------- topic callbacks -------------------- |
    +    3467             : 
    +    3468             : /* //{ callbackOdometry() */
    +    3469             : 
    +    3470           0 : void ControlManager::callbackOdometry(const nav_msgs::Odometry::ConstPtr msg) {
    +    3471             : 
    +    3472           0 :   if (!is_initialized_)
    +    3473           0 :     return;
    +    3474             : 
    +    3475           0 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("callbackOdometry");
    +    3476           0 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("ControlManager::callbackOdometry", scope_timer_logger_, scope_timer_enabled_);
    +    3477             : 
    +    3478           0 :   nav_msgs::OdometryConstPtr odom = msg;
    +    3479             : 
    +    3480             :   // | ------------------ check for time stamp ------------------ |
    +    3481             : 
    +    3482             :   {
    +    3483           0 :     std::scoped_lock lock(mutex_uav_state_);
    +    3484             : 
    +    3485           0 :     if (uav_state_.header.stamp == odom->header.stamp) {
    +    3486           0 :       return;
    +    3487             :     }
    +    3488             :   }
    +    3489             : 
    +    3490             :   // | --------------------- check for nans --------------------- |
    +    3491             : 
    +    3492           0 :   if (!validateOdometry(*odom, "ControlManager", "odometry")) {
    +    3493           0 :     ROS_ERROR_THROTTLE(1.0, "[ControlManager]: incoming 'odometry' contains invalid values, throwing it away");
    +    3494           0 :     return;
    +    3495             :   }
    +    3496             : 
    +    3497             :   // | ---------------------- frame switch ---------------------- |
    +    3498             : 
    +    3499             :   /* Odometry frame switch //{ */
    +    3500             : 
    +    3501             :   // | -- prepare an OdometryConstPtr for trackers & controllers -- |
    +    3502             : 
    +    3503           0 :   mrs_msgs::UavState uav_state_odom;
    +    3504             : 
    +    3505           0 :   uav_state_odom.header   = odom->header;
    +    3506           0 :   uav_state_odom.pose     = odom->pose.pose;
    +    3507           0 :   uav_state_odom.velocity = odom->twist.twist;
    +    3508             : 
    +    3509             :   // | ----- check for change in odometry frame of reference ---- |
    +    3510             : 
    +    3511           0 :   if (got_uav_state_) {
    +    3512             : 
    +    3513           0 :     if (odom->header.frame_id != uav_state_.header.frame_id) {
    +    3514             : 
    +    3515           0 :       ROS_INFO("[ControlManager]: detecting switch of odometry frame");
    +    3516             :       {
    +    3517           0 :         std::scoped_lock lock(mutex_uav_state_);
    +    3518             : 
    +    3519           0 :         ROS_INFO("[ControlManager]: odometry before switch: x=%.2f, y=%.2f, z=%.2f, heading=%.2f", uav_state_.pose.position.x, uav_state_.pose.position.y,
    +    3520             :                  uav_state_.pose.position.z, uav_heading_);
    +    3521             :       }
    +    3522             : 
    +    3523           0 :       odometry_switch_in_progress_ = true;
    +    3524             : 
    +    3525             :       // we have to stop safety timer, otherwise it will interfere
    +    3526           0 :       ROS_DEBUG("[ControlManager]: stopping the safety timer");
    +    3527           0 :       timer_safety_.stop();
    +    3528           0 :       ROS_DEBUG("[ControlManager]: safety timer stopped");
    +    3529             : 
    +    3530             :       // wait for the safety timer to stop if its running
    +    3531           0 :       while (running_safety_timer_) {
    +    3532             : 
    +    3533           0 :         ROS_DEBUG("[ControlManager]: waiting for safety timer to finish");
    +    3534           0 :         ros::Duration wait(0.001);
    +    3535           0 :         wait.sleep();
    +    3536             : 
    +    3537           0 :         if (!running_safety_timer_) {
    +    3538           0 :           ROS_DEBUG("[ControlManager]: safety timer finished");
    +    3539           0 :           break;
    +    3540             :         }
    +    3541             :       }
    +    3542             : 
    +    3543             :       // we have to also for the oneshot control timer to finish
    +    3544           0 :       while (running_async_control_) {
    +    3545             : 
    +    3546           0 :         ROS_DEBUG("[ControlManager]: waiting for control timer to finish");
    +    3547           0 :         ros::Duration wait(0.001);
    +    3548           0 :         wait.sleep();
    +    3549             : 
    +    3550           0 :         if (!running_async_control_) {
    +    3551           0 :           ROS_DEBUG("[ControlManager]: control timer finished");
    +    3552           0 :           break;
    +    3553             :         }
    +    3554             :       }
    +    3555             : 
    +    3556             :       {
    +    3557           0 :         std::scoped_lock lock(mutex_controller_list_, mutex_tracker_list_);
    +    3558             : 
    +    3559           0 :         tracker_list_[active_tracker_idx_]->switchOdometrySource(uav_state_odom);
    +    3560           0 :         controller_list_[active_controller_idx_]->switchOdometrySource(uav_state_odom);
    +    3561             :       }
    +    3562             :     }
    +    3563             :   }
    +    3564             : 
    +    3565             :   //}
    +    3566             : 
    +    3567             :   // | ----------- copy the odometry to the uav_state ----------- |
    +    3568             : 
    +    3569             :   {
    +    3570           0 :     std::scoped_lock lock(mutex_uav_state_);
    +    3571             : 
    +    3572           0 :     previous_uav_state_ = uav_state_;
    +    3573             : 
    +    3574           0 :     uav_state_ = mrs_msgs::UavState();
    +    3575             : 
    +    3576           0 :     uav_state_.header           = odom->header;
    +    3577           0 :     uav_state_.pose             = odom->pose.pose;
    +    3578           0 :     uav_state_.velocity.angular = odom->twist.twist.angular;
    +    3579             : 
    +    3580             :     // transform the twist into the header's frame
    +    3581             :     {
    +    3582             :       // the velocity from the odometry
    +    3583           0 :       geometry_msgs::Vector3Stamped speed_child_frame;
    +    3584           0 :       speed_child_frame.header.frame_id = odom->child_frame_id;
    +    3585           0 :       speed_child_frame.header.stamp    = odom->header.stamp;
    +    3586           0 :       speed_child_frame.vector.x        = odom->twist.twist.linear.x;
    +    3587           0 :       speed_child_frame.vector.y        = odom->twist.twist.linear.y;
    +    3588           0 :       speed_child_frame.vector.z        = odom->twist.twist.linear.z;
    +    3589             : 
    +    3590           0 :       auto res = transformer_->transformSingle(speed_child_frame, odom->header.frame_id);
    +    3591             : 
    +    3592           0 :       if (res) {
    +    3593           0 :         uav_state_.velocity.linear.x = res.value().vector.x;
    +    3594           0 :         uav_state_.velocity.linear.y = res.value().vector.y;
    +    3595           0 :         uav_state_.velocity.linear.z = res.value().vector.z;
    +    3596             :       } else {
    +    3597           0 :         ROS_ERROR_THROTTLE(1.0, "[ControlManager]: could not transform the odometry speed from '%s' to '%s'", odom->child_frame_id.c_str(),
    +    3598             :                            odom->header.frame_id.c_str());
    +    3599           0 :         return;
    +    3600             :       }
    +    3601             :     }
    +    3602             : 
    +    3603             :     // calculate the euler angles
    +    3604           0 :     std::tie(uav_roll_, uav_pitch_, uav_yaw_) = mrs_lib::AttitudeConverter(odom->pose.pose.orientation);
    +    3605             : 
    +    3606             :     try {
    +    3607           0 :       uav_heading_ = mrs_lib::AttitudeConverter(odom->pose.pose.orientation).getHeading();
    +    3608             :     }
    +    3609           0 :     catch (...) {
    +    3610           0 :       ROS_ERROR_THROTTLE(1.0, "[ControlManager]: could not calculate UAV heading");
    +    3611             :     }
    +    3612             : 
    +    3613           0 :     transformer_->setDefaultFrame(odom->header.frame_id);
    +    3614             : 
    +    3615           0 :     got_uav_state_ = true;
    +    3616             :   }
    +    3617             : 
    +    3618             :   // run the control loop asynchronously in an OneShotTimer
    +    3619             :   // but only if its not already running
    +    3620           0 :   if (!running_async_control_) {
    +    3621             : 
    +    3622           0 :     running_async_control_ = true;
    +    3623             : 
    +    3624           0 :     async_control_result_ = std::async(std::launch::async, &ControlManager::asyncControl, this);
    +    3625             :   }
    +    3626             : }
    +    3627             : 
    +    3628             : //}
    +    3629             : 
    +    3630             : /* //{ callbackUavState() */
    +    3631             : 
    +    3632      155211 : void ControlManager::callbackUavState(const mrs_msgs::UavState::ConstPtr msg) {
    +    3633             : 
    +    3634      155211 :   if (!is_initialized_)
    +    3635       24945 :     return;
    +    3636             : 
    +    3637      310422 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("callbackUavState");
    +    3638      310422 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("ControlManager::callbackUavState", scope_timer_logger_, scope_timer_enabled_);
    +    3639             : 
    +    3640      155211 :   mrs_msgs::UavStateConstPtr uav_state = msg;
    +    3641             : 
    +    3642             :   // | ------------------ check for time stamp ------------------ |
    +    3643             : 
    +    3644             :   {
    +    3645      155211 :     std::scoped_lock lock(mutex_uav_state_);
    +    3646             : 
    +    3647      155211 :     if (uav_state_.header.stamp == uav_state->header.stamp) {
    +    3648       24945 :       return;
    +    3649             :     }
    +    3650             :   }
    +    3651             : 
    +    3652             :   // | --------------------- check for nans --------------------- |
    +    3653             : 
    +    3654      130266 :   if (!validateUavState(*uav_state, "ControlManager", "uav_state")) {
    +    3655           0 :     ROS_ERROR_THROTTLE(1.0, "[ControlManager]: incoming 'uav_state' contains invalid values, throwing it away");
    +    3656           0 :     return;
    +    3657             :   }
    +    3658             : 
    +    3659             :   // | -------------------- check for hiccups ------------------- |
    +    3660             : 
    +    3661             :   /* hickup detection //{ */
    +    3662             : 
    +    3663      130266 :   double alpha               = 0.99;
    +    3664      130266 :   double alpha2              = 0.666;
    +    3665      130266 :   double uav_state_count_lim = 1000;
    +    3666             : 
    +    3667      130266 :   double uav_state_dt = (ros::Time::now() - previous_uav_state_.header.stamp).toSec();
    +    3668             : 
    +    3669             :   // belive only reasonable numbers
    +    3670      130266 :   if (uav_state_dt <= 1.0) {
    +    3671             : 
    +    3672      130084 :     uav_state_avg_dt_ = alpha * uav_state_avg_dt_ + (1 - alpha) * uav_state_dt;
    +    3673             : 
    +    3674      130084 :     if (uav_state_count_ < uav_state_count_lim) {
    +    3675       69520 :       uav_state_count_++;
    +    3676             :     }
    +    3677             :   }
    +    3678             : 
    +    3679      130266 :   if (uav_state_count_ == uav_state_count_lim) {
    +    3680             : 
    +    3681             :     /* ROS_INFO_STREAM("[ControlManager]: uav_state_dt = " << uav_state_dt); */
    +    3682             : 
    +    3683       60619 :     if (uav_state_dt < uav_state_avg_dt_ && uav_state_dt > 0.0001) {
    +    3684             : 
    +    3685       29826 :       uav_state_hiccup_factor_ = alpha2 * uav_state_hiccup_factor_ + (1 - alpha2) * (uav_state_avg_dt_ / uav_state_dt);
    +    3686             : 
    +    3687       30793 :     } else if (uav_state_avg_dt_ > 0.0001) {
    +    3688             : 
    +    3689       30793 :       uav_state_hiccup_factor_ = alpha2 * uav_state_hiccup_factor_ + (1 - alpha2) * (uav_state_dt / uav_state_avg_dt_);
    +    3690             :     }
    +    3691             : 
    +    3692       60619 :     if (uav_state_hiccup_factor_ > 3.141592653) {
    +    3693             : 
    +    3694             :       /* ROS_ERROR_STREAM_THROTTLE(0.1, "[ControlManager]: hiccup factor = " << uav_state_hiccup_factor_); */
    +    3695             : 
    +    3696           0 :       ROS_WARN_THROTTLE(2.0, "[ControlManager]: ");
    +    3697           0 :       ROS_WARN_THROTTLE(2.0, "[ControlManager]: // | ------------------------- WARNING ------------------------ |");
    +    3698           0 :       ROS_WARN_THROTTLE(2.0, "[ControlManager]: // |                                                            |");
    +    3699           0 :       ROS_WARN_THROTTLE(2.0, "[ControlManager]: // |            UAV_STATE has a large hiccup factor!            |");
    +    3700           0 :       ROS_WARN_THROTTLE(2.0, "[ControlManager]: // |           hint, hint: you are probably rosbagging          |");
    +    3701           0 :       ROS_WARN_THROTTLE(2.0, "[ControlManager]: // |           lot of data or publishing lot of large           |");
    +    3702           0 :       ROS_WARN_THROTTLE(2.0, "[ControlManager]: // |          messages without mutual nodelet managers.         |");
    +    3703           0 :       ROS_WARN_THROTTLE(2.0, "[ControlManager]: // |                                                            |");
    +    3704           0 :       ROS_WARN_THROTTLE(2.0, "[ControlManager]: // | ------------------------- WARNING ------------------------ |");
    +    3705           0 :       ROS_WARN_THROTTLE(2.0, "[ControlManager]: ");
    +    3706             :     }
    +    3707             :   }
    +    3708             : 
    +    3709             :   //}
    +    3710             : 
    +    3711             :   // | ---------------------- frame switch ---------------------- |
    +    3712             : 
    +    3713             :   /* frame switch //{ */
    +    3714             : 
    +    3715             :   // | ----- check for change in odometry frame of reference ---- |
    +    3716             : 
    +    3717      130266 :   if (got_uav_state_) {
    +    3718             : 
    +    3719      130175 :     if (uav_state->estimator_iteration != uav_state_.estimator_iteration) {
    +    3720             : 
    +    3721           5 :       ROS_INFO("[ControlManager]: detecting switch of odometry frame");
    +    3722             :       {
    +    3723          10 :         std::scoped_lock lock(mutex_uav_state_);
    +    3724             : 
    +    3725           5 :         ROS_INFO("[ControlManager]: odometry before switch: x=%.2f, y=%.2f, z=%.2f, heading=%.2f", uav_state_.pose.position.x, uav_state_.pose.position.y,
    +    3726             :                  uav_state_.pose.position.z, uav_heading_);
    +    3727             :       }
    +    3728             : 
    +    3729           5 :       odometry_switch_in_progress_ = true;
    +    3730             : 
    +    3731             :       // we have to stop safety timer, otherwise it will interfere
    +    3732           5 :       ROS_DEBUG("[ControlManager]: stopping the safety timer");
    +    3733           5 :       timer_safety_.stop();
    +    3734           5 :       ROS_DEBUG("[ControlManager]: safety timer stopped");
    +    3735             : 
    +    3736             :       // wait for the safety timer to stop if its running
    +    3737           5 :       while (running_safety_timer_) {
    +    3738             : 
    +    3739           0 :         ROS_DEBUG("[ControlManager]: waiting for safety timer to finish");
    +    3740           0 :         ros::Duration wait(0.001);
    +    3741           0 :         wait.sleep();
    +    3742             : 
    +    3743           0 :         if (!running_safety_timer_) {
    +    3744           0 :           ROS_DEBUG("[ControlManager]: safety timer finished");
    +    3745           0 :           break;
    +    3746             :         }
    +    3747             :       }
    +    3748             : 
    +    3749             :       // we have to also for the oneshot control timer to finish
    +    3750           5 :       while (running_async_control_) {
    +    3751             : 
    +    3752           0 :         ROS_DEBUG("[ControlManager]: waiting for control timer to finish");
    +    3753           0 :         ros::Duration wait(0.001);
    +    3754           0 :         wait.sleep();
    +    3755             : 
    +    3756           0 :         if (!running_async_control_) {
    +    3757           0 :           ROS_DEBUG("[ControlManager]: control timer finished");
    +    3758           0 :           break;
    +    3759             :         }
    +    3760             :       }
    +    3761             : 
    +    3762             :       {
    +    3763          10 :         std::scoped_lock lock(mutex_controller_list_, mutex_tracker_list_);
    +    3764             : 
    +    3765           5 :         tracker_list_[active_tracker_idx_]->switchOdometrySource(*uav_state);
    +    3766           5 :         controller_list_[active_controller_idx_]->switchOdometrySource(*uav_state);
    +    3767             :       }
    +    3768             :     }
    +    3769             :   }
    +    3770             : 
    +    3771             :   //}
    +    3772             : 
    +    3773             :   // --------------------------------------------------------------
    +    3774             :   // |           copy the UavState message for later use          |
    +    3775             :   // --------------------------------------------------------------
    +    3776             : 
    +    3777             :   {
    +    3778      130266 :     std::scoped_lock lock(mutex_uav_state_);
    +    3779             : 
    +    3780      130266 :     previous_uav_state_ = uav_state_;
    +    3781             : 
    +    3782      130266 :     uav_state_ = *uav_state;
    +    3783             : 
    +    3784      130266 :     std::tie(uav_roll_, uav_pitch_, uav_yaw_) = mrs_lib::AttitudeConverter(uav_state_.pose.orientation);
    +    3785             : 
    +    3786             :     try {
    +    3787      130266 :       uav_heading_ = mrs_lib::AttitudeConverter(uav_state_.pose.orientation).getHeading();
    +    3788             :     }
    +    3789           0 :     catch (...) {
    +    3790           0 :       ROS_ERROR_THROTTLE(1.0, "[ControlManager]: could not calculate UAV heading, not updating it");
    +    3791             :     }
    +    3792             : 
    +    3793      130266 :     transformer_->setDefaultFrame(uav_state->header.frame_id);
    +    3794             : 
    +    3795      130266 :     got_uav_state_ = true;
    +    3796             :   }
    +    3797             : 
    +    3798             :   // run the control loop asynchronously in an OneShotTimer
    +    3799             :   // but only if its not already running
    +    3800      130266 :   if (!running_async_control_) {
    +    3801             : 
    +    3802      129578 :     running_async_control_ = true;
    +    3803             : 
    +    3804      129578 :     async_control_result_ = std::async(std::launch::async, &ControlManager::asyncControl, this);
    +    3805             :   }
    +    3806             : }
    +    3807             : 
    +    3808             : //}
    +    3809             : 
    +    3810             : /* //{ callbackGNSS() */
    +    3811             : 
    +    3812       90132 : void ControlManager::callbackGNSS(const sensor_msgs::NavSatFix::ConstPtr msg) {
    +    3813             : 
    +    3814       90132 :   if (!is_initialized_)
    +    3815         106 :     return;
    +    3816             : 
    +    3817      270078 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("callbackGNSS");
    +    3818      270078 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("ControlManager::callbackGNSS", scope_timer_logger_, scope_timer_enabled_);
    +    3819             : 
    +    3820       90026 :   transformer_->setLatLon(msg->latitude, msg->longitude);
    +    3821             : }
    +    3822             : 
    +    3823             : //}
    +    3824             : 
    +    3825             : /* callbackJoystick() //{ */
    +    3826             : 
    +    3827           0 : void ControlManager::callbackJoystick(const sensor_msgs::Joy::ConstPtr msg) {
    +    3828             : 
    +    3829           0 :   if (!is_initialized_)
    +    3830           0 :     return;
    +    3831             : 
    +    3832           0 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("callbackJoystick");
    +    3833           0 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("ControlManager::callbackJoystick", scope_timer_logger_, scope_timer_enabled_);
    +    3834             : 
    +    3835             :   // copy member variables
    +    3836           0 :   auto active_tracker_idx    = mrs_lib::get_mutexed(mutex_tracker_list_, active_tracker_idx_);
    +    3837           0 :   auto active_controller_idx = mrs_lib::get_mutexed(mutex_controller_list_, active_controller_idx_);
    +    3838             : 
    +    3839           0 :   sensor_msgs::JoyConstPtr joystick_data = msg;
    +    3840             : 
    +    3841             :   // TODO check if the array is smaller than the largest idx
    +    3842           0 :   if (joystick_data->buttons.size() == 0 || joystick_data->axes.size() == 0) {
    +    3843           0 :     return;
    +    3844             :   }
    +    3845             : 
    +    3846             :   // | ---- switching back to fallback tracker and controller --- |
    +    3847             : 
    +    3848             :   // if any of the A, B, X, Y buttons are pressed when flying with joystick, switch back to fallback controller and tracker
    +    3849           0 :   if ((joystick_data->buttons[_channel_A_] == 1 || joystick_data->buttons[_channel_B_] == 1 || joystick_data->buttons[_channel_X_] == 1 ||
    +    3850           0 :        joystick_data->buttons[_channel_Y_] == 1) &&
    +    3851           0 :       active_tracker_idx == _joystick_tracker_idx_ && active_controller_idx == _joystick_controller_idx_) {
    +    3852             : 
    +    3853           0 :     ROS_INFO("[ControlManager]: switching from joystick to normal control");
    +    3854             : 
    +    3855           0 :     switchTracker(_joystick_fallback_tracker_name_);
    +    3856           0 :     switchController(_joystick_fallback_controller_name_);
    +    3857             : 
    +    3858           0 :     joystick_goto_enabled_ = false;
    +    3859             :   }
    +    3860             : 
    +    3861             :   // | ------- joystick control activation ------- |
    +    3862             : 
    +    3863             :   // if start button was pressed
    +    3864           0 :   if (joystick_data->buttons[_channel_start_] == 1) {
    +    3865             : 
    +    3866           0 :     if (!joystick_start_pressed_) {
    +    3867             : 
    +    3868           0 :       ROS_INFO("[ControlManager]: joystick start button pressed");
    +    3869             : 
    +    3870           0 :       joystick_start_pressed_    = true;
    +    3871           0 :       joystick_start_press_time_ = ros::Time::now();
    +    3872             :     }
    +    3873             : 
    +    3874           0 :   } else if (joystick_start_pressed_) {
    +    3875             : 
    +    3876           0 :     ROS_INFO("[ControlManager]: joystick start button released");
    +    3877             : 
    +    3878           0 :     joystick_start_pressed_    = false;
    +    3879           0 :     joystick_start_press_time_ = ros::Time(0);
    +    3880             :   }
    +    3881             : 
    +    3882             :   // | ---------------- Joystick goto activation ---------------- |
    +    3883             : 
    +    3884             :   // if back button was pressed
    +    3885           0 :   if (joystick_data->buttons[_channel_back_] == 1) {
    +    3886             : 
    +    3887           0 :     if (!joystick_back_pressed_) {
    +    3888             : 
    +    3889           0 :       ROS_INFO("[ControlManager]: joystick back button pressed");
    +    3890             : 
    +    3891           0 :       joystick_back_pressed_    = true;
    +    3892           0 :       joystick_back_press_time_ = ros::Time::now();
    +    3893             :     }
    +    3894             : 
    +    3895           0 :   } else if (joystick_back_pressed_) {
    +    3896             : 
    +    3897           0 :     ROS_INFO("[ControlManager]: joystick back button released");
    +    3898             : 
    +    3899           0 :     joystick_back_pressed_    = false;
    +    3900           0 :     joystick_back_press_time_ = ros::Time(0);
    +    3901             :   }
    +    3902             : 
    +    3903             :   // | ------------------------ Failsafes ----------------------- |
    +    3904             : 
    +    3905             :   // if LT and RT buttons are both pressed down
    +    3906           0 :   if (joystick_data->axes[_channel_LT_] < -0.99 && joystick_data->axes[_channel_RT_] < -0.99) {
    +    3907             : 
    +    3908           0 :     if (!joystick_failsafe_pressed_) {
    +    3909             : 
    +    3910           0 :       ROS_INFO("[ControlManager]: joystick Failsafe pressed");
    +    3911             : 
    +    3912           0 :       joystick_failsafe_pressed_    = true;
    +    3913           0 :       joystick_failsafe_press_time_ = ros::Time::now();
    +    3914             :     }
    +    3915             : 
    +    3916           0 :   } else if (joystick_failsafe_pressed_) {
    +    3917             : 
    +    3918           0 :     ROS_INFO("[ControlManager]: joystick Failsafe released");
    +    3919             : 
    +    3920           0 :     joystick_failsafe_pressed_    = false;
    +    3921           0 :     joystick_failsafe_press_time_ = ros::Time(0);
    +    3922             :   }
    +    3923             : 
    +    3924             :   // if left and right joypads are both pressed down
    +    3925           0 :   if (joystick_data->buttons[_channel_L_joy_] == 1 && joystick_data->buttons[_channel_R_joy_] == 1) {
    +    3926             : 
    +    3927           0 :     if (!joystick_eland_pressed_) {
    +    3928             : 
    +    3929           0 :       ROS_INFO("[ControlManager]: joystick eland pressed");
    +    3930             : 
    +    3931           0 :       joystick_eland_pressed_    = true;
    +    3932           0 :       joystick_eland_press_time_ = ros::Time::now();
    +    3933             :     }
    +    3934             : 
    +    3935           0 :   } else if (joystick_eland_pressed_) {
    +    3936             : 
    +    3937           0 :     ROS_INFO("[ControlManager]: joystick eland released");
    +    3938             : 
    +    3939           0 :     joystick_eland_pressed_    = false;
    +    3940           0 :     joystick_eland_press_time_ = ros::Time(0);
    +    3941             :   }
    +    3942             : }
    +    3943             : 
    +    3944             : //}
    +    3945             : 
    +    3946             : /* //{ callbackHwApiStatus() */
    +    3947             : 
    +    3948      383390 : void ControlManager::callbackHwApiStatus(const mrs_msgs::HwApiStatus::ConstPtr msg) {
    +    3949             : 
    +    3950      383390 :   if (!is_initialized_)
    +    3951         363 :     return;
    +    3952             : 
    +    3953     1149081 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("callbackHwApiStatus");
    +    3954     1149081 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("ControlManager::callbackHwApiStatus", scope_timer_logger_, scope_timer_enabled_);
    +    3955             : 
    +    3956      766054 :   mrs_msgs::HwApiStatusConstPtr state = msg;
    +    3957             : 
    +    3958             :   // | ------ detect and print the changes in offboard mode ----- |
    +    3959      383027 :   if (state->offboard) {
    +    3960             : 
    +    3961      266679 :     if (!offboard_mode_) {
    +    3962          85 :       offboard_mode_          = true;
    +    3963          85 :       offboard_mode_was_true_ = true;
    +    3964          85 :       ROS_INFO("[ControlManager]: detected: OFFBOARD mode ON");
    +    3965             :     }
    +    3966             : 
    +    3967             :   } else {
    +    3968             : 
    +    3969      116348 :     if (offboard_mode_) {
    +    3970           0 :       offboard_mode_ = false;
    +    3971           0 :       ROS_INFO("[ControlManager]: detected: OFFBOARD mode OFF");
    +    3972             :     }
    +    3973             :   }
    +    3974             : 
    +    3975             :   // | --------- detect and print the changes in arming --------- |
    +    3976      383027 :   if (state->armed == true) {
    +    3977             : 
    +    3978      279266 :     if (!armed_) {
    +    3979          90 :       armed_ = true;
    +    3980          90 :       ROS_INFO("[ControlManager]: detected: vehicle ARMED");
    +    3981             :     }
    +    3982             : 
    +    3983             :   } else {
    +    3984             : 
    +    3985      103761 :     if (armed_) {
    +    3986          20 :       armed_ = false;
    +    3987          20 :       ROS_INFO("[ControlManager]: detected: vehicle DISARMED");
    +    3988             :     }
    +    3989             :   }
    +    3990             : }
    +    3991             : 
    +    3992             : //}
    +    3993             : 
    +    3994             : /* //{ callbackRC() */
    +    3995             : 
    +    3996       21072 : void ControlManager::callbackRC(const mrs_msgs::HwApiRcChannels::ConstPtr msg) {
    +    3997             : 
    +    3998       21072 :   if (!is_initialized_)
    +    3999           0 :     return;
    +    4000             : 
    +    4001       63216 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("callbackRC");
    +    4002       63216 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("ControlManager::callbackRC", scope_timer_logger_, scope_timer_enabled_);
    +    4003             : 
    +    4004       42144 :   mrs_msgs::HwApiRcChannelsConstPtr rc = msg;
    +    4005             : 
    +    4006       21072 :   ROS_INFO_ONCE("[ControlManager]: getting RC channels");
    +    4007             : 
    +    4008             :   // | ------------------- rc joystic control ------------------- |
    +    4009             : 
    +    4010             :   // when the switch change its position
    +    4011       21072 :   if (_rc_goto_enabled_) {
    +    4012             : 
    +    4013       21072 :     if (_rc_joystick_channel_ >= int(rc->channels.size())) {
    +    4014             : 
    +    4015           0 :       ROS_ERROR_THROTTLE(1.0, "[ControlManager]: RC joystick activation channel number (%d) is out of range [0-%d]", _rc_joystick_channel_,
    +    4016             :                          int(rc->channels.size()));
    +    4017             : 
    +    4018             :     } else {
    +    4019             : 
    +    4020       21072 :       bool channel_low  = rc->channels[_rc_joystick_channel_] < (0.5 - RC_DEADBAND) ? true : false;
    +    4021       21072 :       bool channel_high = rc->channels[_rc_joystick_channel_] > (0.5 + RC_DEADBAND) ? true : false;
    +    4022             : 
    +    4023       21072 :       if (channel_low) {
    +    4024       19292 :         rc_joystick_channel_was_low_ = true;
    +    4025             :       }
    +    4026             : 
    +    4027             :       // rc control activation
    +    4028       21072 :       if (!rc_goto_active_) {
    +    4029             : 
    +    4030       19293 :         if (rc_joystick_channel_last_value_ < (0.5 - RC_DEADBAND) && channel_high) {
    +    4031             : 
    +    4032           2 :           if (isFlyingNormally()) {
    +    4033             : 
    +    4034           2 :             ROS_INFO_THROTTLE(1.0, "[ControlManager]: activating RC joystick");
    +    4035             : 
    +    4036           2 :             callbacks_enabled_ = false;
    +    4037             : 
    +    4038           2 :             std_srvs::SetBoolRequest req_goto_out;
    +    4039           2 :             req_goto_out.data = false;
    +    4040             : 
    +    4041           2 :             std_srvs::SetBoolRequest req_enable_callbacks;
    +    4042           2 :             req_enable_callbacks.data = callbacks_enabled_;
    +    4043             : 
    +    4044             :             {
    +    4045           4 :               std::scoped_lock lock(mutex_tracker_list_);
    +    4046             : 
    +    4047             :               // disable callbacks of all trackers
    +    4048          14 :               for (int i = 0; i < int(tracker_list_.size()); i++) {
    +    4049          12 :                 tracker_list_[i]->enableCallbacks(std_srvs::SetBoolRequest::ConstPtr(std::make_unique<std_srvs::SetBoolRequest>(req_enable_callbacks)));
    +    4050             :               }
    +    4051             :             }
    +    4052             : 
    +    4053           2 :             rc_goto_active_ = true;
    +    4054             : 
    +    4055             :           } else {
    +    4056             : 
    +    4057           0 :             ROS_WARN_THROTTLE(1.0, "[ControlManager]: can not activate RC joystick, not flying normally");
    +    4058           2 :           }
    +    4059             : 
    +    4060       19291 :         } else if (channel_high && !rc_joystick_channel_was_low_) {
    +    4061             : 
    +    4062           0 :           ROS_WARN_THROTTLE(1.0, "[ControlManager]: can not activate RC joystick, the switch is ON from the beginning");
    +    4063             :         }
    +    4064             :       }
    +    4065             : 
    +    4066             :       // rc control deactivation
    +    4067       21072 :       if (rc_goto_active_ && channel_low) {
    +    4068             : 
    +    4069           1 :         ROS_INFO("[ControlManager]: deactivating RC joystick");
    +    4070             : 
    +    4071           1 :         callbacks_enabled_ = true;
    +    4072             : 
    +    4073           1 :         std_srvs::SetBoolRequest req_goto_out;
    +    4074           1 :         req_goto_out.data = true;
    +    4075             : 
    +    4076           1 :         std_srvs::SetBoolRequest req_enable_callbacks;
    +    4077           1 :         req_enable_callbacks.data = callbacks_enabled_;
    +    4078             : 
    +    4079             :         {
    +    4080           2 :           std::scoped_lock lock(mutex_tracker_list_);
    +    4081             : 
    +    4082             :           // enable callbacks of all trackers
    +    4083           7 :           for (int i = 0; i < int(tracker_list_.size()); i++) {
    +    4084           6 :             tracker_list_[i]->enableCallbacks(std_srvs::SetBoolRequest::ConstPtr(std::make_unique<std_srvs::SetBoolRequest>(req_enable_callbacks)));
    +    4085             :           }
    +    4086             :         }
    +    4087             : 
    +    4088           1 :         rc_goto_active_ = false;
    +    4089             :       }
    +    4090             : 
    +    4091             :       // do not forget to update the last... variable
    +    4092             :       // only do that if its out of the deadband
    +    4093       21072 :       if (channel_high || channel_low) {
    +    4094       21072 :         rc_joystick_channel_last_value_ = rc->channels[_rc_joystick_channel_];
    +    4095             :       }
    +    4096             :     }
    +    4097             :   }
    +    4098             : 
    +    4099             :   // | ------------------------ rc eland ------------------------ |
    +    4100       21072 :   if (_rc_escalating_failsafe_enabled_) {
    +    4101             : 
    +    4102       21072 :     if (_rc_escalating_failsafe_channel_ >= int(rc->channels.size())) {
    +    4103             : 
    +    4104           0 :       ROS_ERROR_THROTTLE(1.0, "[ControlManager]: RC eland channel number (%d) is out of range [0-%d]", _rc_escalating_failsafe_channel_,
    +    4105             :                          int(rc->channels.size()));
    +    4106             : 
    +    4107             :     } else {
    +    4108             : 
    +    4109       21072 :       if (rc->channels[_rc_escalating_failsafe_channel_] >= _rc_escalating_failsafe_threshold_) {
    +    4110             : 
    +    4111         141 :         ROS_WARN_THROTTLE(1.0, "[ControlManager]: triggering escalating failsafe by RC");
    +    4112             : 
    +    4113         282 :         auto [success, message] = escalatingFailsafe();
    +    4114             : 
    +    4115         141 :         if (success) {
    +    4116           3 :           rc_escalating_failsafe_triggered_ = true;
    +    4117             :         }
    +    4118             :       }
    +    4119             :     }
    +    4120             :   }
    +    4121             : }
    +    4122             : 
    +    4123             : //}
    +    4124             : 
    +    4125             : // | --------------------- topic timeouts --------------------- |
    +    4126             : 
    +    4127             : /* timeoutUavState() //{ */
    +    4128             : 
    +    4129           0 : void ControlManager::timeoutUavState(const double& missing_for) {
    +    4130             : 
    +    4131           0 :   auto last_control_output = mrs_lib::get_mutexed(mutex_last_control_output_, last_control_output_);
    +    4132             : 
    +    4133           0 :   if (output_enabled_ && last_control_output.control_output && !failsafe_triggered_) {
    +    4134             : 
    +    4135             :     // We need to fire up timerFailsafe, which will regularly trigger the controllers
    +    4136             :     // in place of the callbackUavState/callbackOdometry().
    +    4137             : 
    +    4138           0 :     ROS_ERROR_THROTTLE(0.1, "[ControlManager]: not receiving uav_state/odometry for %.3f s, initiating failsafe land", missing_for);
    +    4139             : 
    +    4140           0 :     failsafe();
    +    4141             :   }
    +    4142           0 : }
    +    4143             : 
    +    4144             : //}
    +    4145             : 
    +    4146             : // | -------------------- service callbacks ------------------- |
    +    4147             : 
    +    4148             : /* //{ callbackSwitchTracker() */
    +    4149             : 
    +    4150         178 : bool ControlManager::callbackSwitchTracker(mrs_msgs::String::Request& req, mrs_msgs::String::Response& res) {
    +    4151             : 
    +    4152         178 :   if (!is_initialized_)
    +    4153           0 :     return false;
    +    4154             : 
    +    4155         178 :   if (failsafe_triggered_ || eland_triggered_) {
    +    4156             : 
    +    4157           0 :     std::stringstream ss;
    +    4158           0 :     ss << "can not switch tracker, eland or failsafe active";
    +    4159             : 
    +    4160           0 :     res.message = ss.str();
    +    4161           0 :     res.success = false;
    +    4162             : 
    +    4163           0 :     ROS_WARN_STREAM("[ControlManager]: " << ss.str());
    +    4164             : 
    +    4165           0 :     return true;
    +    4166             :   }
    +    4167             : 
    +    4168         178 :   auto [success, response] = switchTracker(req.value);
    +    4169             : 
    +    4170         178 :   res.success = success;
    +    4171         178 :   res.message = response;
    +    4172             : 
    +    4173         178 :   return true;
    +    4174             : }
    +    4175             : 
    +    4176             : //}
    +    4177             : 
    +    4178             : /* callbackSwitchController() //{ */
    +    4179             : 
    +    4180         177 : bool ControlManager::callbackSwitchController(mrs_msgs::String::Request& req, mrs_msgs::String::Response& res) {
    +    4181             : 
    +    4182         177 :   if (!is_initialized_)
    +    4183           0 :     return false;
    +    4184             : 
    +    4185         177 :   if (failsafe_triggered_ || eland_triggered_) {
    +    4186             : 
    +    4187           0 :     std::stringstream ss;
    +    4188           0 :     ss << "can not switch controller, eland or failsafe active";
    +    4189             : 
    +    4190           0 :     res.message = ss.str();
    +    4191           0 :     res.success = false;
    +    4192             : 
    +    4193           0 :     ROS_WARN_STREAM("[ControlManager]: " << ss.str());
    +    4194             : 
    +    4195           0 :     return true;
    +    4196             :   }
    +    4197             : 
    +    4198         177 :   auto [success, response] = switchController(req.value);
    +    4199             : 
    +    4200         177 :   res.success = success;
    +    4201         177 :   res.message = response;
    +    4202             : 
    +    4203         177 :   return true;
    +    4204             : }
    +    4205             : 
    +    4206             : //}
    +    4207             : 
    +    4208             : /* //{ callbackSwitchTracker() */
    +    4209             : 
    +    4210           0 : bool ControlManager::callbackTrackerResetStatic([[maybe_unused]] std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res) {
    +    4211             : 
    +    4212           0 :   if (!is_initialized_)
    +    4213           0 :     return false;
    +    4214             : 
    +    4215           0 :   std::stringstream message;
    +    4216             : 
    +    4217           0 :   if (failsafe_triggered_ || eland_triggered_) {
    +    4218             : 
    +    4219           0 :     message << "can not reset tracker, eland or failsafe active";
    +    4220             : 
    +    4221           0 :     res.message = message.str();
    +    4222           0 :     res.success = false;
    +    4223             : 
    +    4224           0 :     ROS_WARN_STREAM("[ControlManager]: " << message.str());
    +    4225             : 
    +    4226           0 :     return true;
    +    4227             :   }
    +    4228             : 
    +    4229             :   // reactivate the current tracker
    +    4230             :   {
    +    4231           0 :     std::scoped_lock lock(mutex_tracker_list_);
    +    4232             : 
    +    4233           0 :     std::string tracker_name = _tracker_names_[active_tracker_idx_];
    +    4234             : 
    +    4235           0 :     bool succ = tracker_list_[active_tracker_idx_]->resetStatic();
    +    4236             : 
    +    4237           0 :     if (succ) {
    +    4238           0 :       message << "the tracker '" << tracker_name << "' was reset";
    +    4239           0 :       ROS_INFO_STREAM("[ControlManager]: " << message.str());
    +    4240             :     } else {
    +    4241           0 :       message << "the tracker '" << tracker_name << "' reset failed!";
    +    4242           0 :       ROS_ERROR_STREAM("[ControlManager]: " << message.str());
    +    4243             :     }
    +    4244             :   }
    +    4245             : 
    +    4246           0 :   res.message = message.str();
    +    4247           0 :   res.success = true;
    +    4248             : 
    +    4249           0 :   return true;
    +    4250             : }
    +    4251             : 
    +    4252             : //}
    +    4253             : 
    +    4254             : /* //{ callbackEHover() */
    +    4255             : 
    +    4256           2 : bool ControlManager::callbackEHover([[maybe_unused]] std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res) {
    +    4257             : 
    +    4258           2 :   if (!is_initialized_)
    +    4259           0 :     return false;
    +    4260             : 
    +    4261           2 :   if (failsafe_triggered_ || eland_triggered_) {
    +    4262             : 
    +    4263           0 :     std::stringstream ss;
    +    4264           0 :     ss << "can not switch controller, eland or failsafe active";
    +    4265             : 
    +    4266           0 :     res.message = ss.str();
    +    4267           0 :     res.success = false;
    +    4268             : 
    +    4269           0 :     ROS_WARN_STREAM("[ControlManager]: " << ss.str());
    +    4270             : 
    +    4271           0 :     return true;
    +    4272             :   }
    +    4273             : 
    +    4274           2 :   ROS_WARN_THROTTLE(1.0, "[ControlManager]: ehover trigger by callback");
    +    4275             : 
    +    4276           2 :   auto [success, message] = ehover();
    +    4277             : 
    +    4278           2 :   res.success = success;
    +    4279           2 :   res.message = message;
    +    4280             : 
    +    4281           2 :   return true;
    +    4282             : }
    +    4283             : 
    +    4284             : //}
    +    4285             : 
    +    4286             : /* callbackFailsafe() //{ */
    +    4287             : 
    +    4288           4 : bool ControlManager::callbackFailsafe([[maybe_unused]] std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res) {
    +    4289             : 
    +    4290           4 :   if (!is_initialized_)
    +    4291           0 :     return false;
    +    4292             : 
    +    4293           4 :   if (failsafe_triggered_) {
    +    4294             : 
    +    4295           0 :     std::stringstream ss;
    +    4296           0 :     ss << "can not activate failsafe, it is already active";
    +    4297             : 
    +    4298           0 :     res.message = ss.str();
    +    4299           0 :     res.success = false;
    +    4300             : 
    +    4301           0 :     ROS_INFO_STREAM("[ControlManager]: " << ss.str());
    +    4302             : 
    +    4303           0 :     return true;
    +    4304             :   }
    +    4305             : 
    +    4306           4 :   ROS_WARN_THROTTLE(1.0, "[ControlManager]: failsafe triggered by callback");
    +    4307             : 
    +    4308           4 :   auto [success, message] = failsafe();
    +    4309             : 
    +    4310           4 :   res.success = success;
    +    4311           4 :   res.message = message;
    +    4312             : 
    +    4313           4 :   return true;
    +    4314             : }
    +    4315             : 
    +    4316             : //}
    +    4317             : 
    +    4318             : /* callbackFailsafeEscalating() //{ */
    +    4319             : 
    +    4320           7 : bool ControlManager::callbackFailsafeEscalating([[maybe_unused]] std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res) {
    +    4321             : 
    +    4322           7 :   if (!is_initialized_)
    +    4323           0 :     return false;
    +    4324             : 
    +    4325           7 :   if (_service_escalating_failsafe_enabled_) {
    +    4326             : 
    +    4327           7 :     ROS_WARN_THROTTLE(1.0, "[ControlManager]: escalating failsafe triggered by callback");
    +    4328             : 
    +    4329          14 :     auto [success, message] = escalatingFailsafe();
    +    4330             : 
    +    4331           7 :     res.success = success;
    +    4332           7 :     res.message = message;
    +    4333             : 
    +    4334             :   } else {
    +    4335             : 
    +    4336           0 :     std::stringstream ss;
    +    4337           0 :     ss << "escalating failsafe is disabled";
    +    4338             : 
    +    4339           0 :     res.success = false;
    +    4340           0 :     res.message = ss.str();
    +    4341             : 
    +    4342           0 :     ROS_WARN_THROTTLE(1.0, "[ControlManager]: %s", ss.str().c_str());
    +    4343             :   }
    +    4344             : 
    +    4345           7 :   return true;
    +    4346             : }
    +    4347             : 
    +    4348             : //}
    +    4349             : 
    +    4350             : /* //{ callbackELand() */
    +    4351             : 
    +    4352           2 : bool ControlManager::callbackEland([[maybe_unused]] std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res) {
    +    4353             : 
    +    4354           2 :   if (!is_initialized_)
    +    4355           0 :     return false;
    +    4356             : 
    +    4357           2 :   ROS_WARN_THROTTLE(1.0, "[ControlManager]: eland triggered by callback");
    +    4358             : 
    +    4359           2 :   auto [success, message] = eland();
    +    4360             : 
    +    4361           2 :   res.success = success;
    +    4362           2 :   res.message = message;
    +    4363             : 
    +    4364           2 :   return true;
    +    4365             : }
    +    4366             : 
    +    4367             : //}
    +    4368             : 
    +    4369             : /* //{ callbackParachute() */
    +    4370             : 
    +    4371           0 : bool ControlManager::callbackParachute([[maybe_unused]] std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res) {
    +    4372             : 
    +    4373           0 :   if (!is_initialized_)
    +    4374           0 :     return false;
    +    4375             : 
    +    4376           0 :   if (!_parachute_enabled_) {
    +    4377             : 
    +    4378           0 :     std::stringstream ss;
    +    4379           0 :     ss << "parachute disabled";
    +    4380           0 :     ROS_WARN_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    4381           0 :     res.message = ss.str();
    +    4382           0 :     res.success = false;
    +    4383             :   }
    +    4384             : 
    +    4385           0 :   ROS_WARN_THROTTLE(1.0, "[ControlManager]: parachute triggered by callback");
    +    4386             : 
    +    4387           0 :   auto [success, message] = deployParachute();
    +    4388             : 
    +    4389           0 :   res.success = success;
    +    4390           0 :   res.message = message;
    +    4391             : 
    +    4392           0 :   return true;
    +    4393             : }
    +    4394             : 
    +    4395             : //}
    +    4396             : 
    +    4397             : /* //{ callbackSetMinZ() */
    +    4398             : 
    +    4399           0 : bool ControlManager::callbackSetMinZ([[maybe_unused]] mrs_msgs::Float64StampedSrv::Request& req, mrs_msgs::Float64StampedSrv::Response& res) {
    +    4400             : 
    +    4401           0 :   if (!is_initialized_)
    +    4402           0 :     return false;
    +    4403             : 
    +    4404           0 :   if (!use_safety_area_) {
    +    4405           0 :     res.success = true;
    +    4406           0 :     res.message = "safety area is disabled";
    +    4407           0 :     return true;
    +    4408             :   }
    +    4409             : 
    +    4410             :   // | -------- transform min_z to the safety area frame -------- |
    +    4411             : 
    +    4412           0 :   mrs_msgs::ReferenceStamped point;
    +    4413           0 :   point.header               = req.header;
    +    4414           0 :   point.reference.position.z = req.value;
    +    4415             : 
    +    4416           0 :   auto result = transformer_->transformSingle(point, _safety_area_vertical_frame_);
    +    4417             : 
    +    4418           0 :   if (result) {
    +    4419             : 
    +    4420           0 :     _safety_area_min_z_ = result.value().reference.position.z;
    +    4421             : 
    +    4422           0 :     res.success = true;
    +    4423           0 :     res.message = "safety area's min z updated";
    +    4424             : 
    +    4425             :   } else {
    +    4426             : 
    +    4427           0 :     res.success = false;
    +    4428           0 :     res.message = "could not transform the value to safety area's vertical frame";
    +    4429             :   }
    +    4430             : 
    +    4431           0 :   return true;
    +    4432             : }
    +    4433             : 
    +    4434             : //}
    +    4435             : 
    +    4436             : /* //{ callbackToggleOutput() */
    +    4437             : 
    +    4438          92 : bool ControlManager::callbackToggleOutput(std_srvs::SetBool::Request& req, std_srvs::SetBool::Response& res) {
    +    4439             : 
    +    4440          92 :   if (!is_initialized_)
    +    4441           0 :     return false;
    +    4442             : 
    +    4443          92 :   ROS_INFO("[ControlManager]: toggling output by service");
    +    4444             : 
    +    4445             :   // copy member variables
    +    4446         184 :   auto uav_state = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +    4447             : 
    +    4448         184 :   std::stringstream ss;
    +    4449             : 
    +    4450          92 :   bool prereq_check = true;
    +    4451             : 
    +    4452             :   {
    +    4453         184 :     mrs_msgs::ReferenceStamped current_coord;
    +    4454          92 :     current_coord.header.frame_id      = uav_state.header.frame_id;
    +    4455          92 :     current_coord.reference.position.x = uav_state.pose.position.x;
    +    4456          92 :     current_coord.reference.position.y = uav_state.pose.position.y;
    +    4457             : 
    +    4458          92 :     if (!isPointInSafetyArea2d(current_coord)) {
    +    4459           1 :       ss << "cannot toggle output, the UAV is outside of the safety area!";
    +    4460           1 :       prereq_check = false;
    +    4461             :     }
    +    4462             :   }
    +    4463             : 
    +    4464          92 :   if (req.data && (failsafe_triggered_ || eland_triggered_ || rc_escalating_failsafe_triggered_)) {
    +    4465           0 :     ss << "cannot toggle output ON, we landed in emergency";
    +    4466           0 :     prereq_check = false;
    +    4467             :   }
    +    4468             : 
    +    4469          92 :   if (!sh_hw_api_status_.hasMsg() || (ros::Time::now() - sh_hw_api_status_.lastMsgTime()).toSec() > 1.0) {
    +    4470           0 :     ss << "cannot toggle output ON, missing HW API status!";
    +    4471           0 :     prereq_check = false;
    +    4472             :   }
    +    4473             : 
    +    4474          92 :   if (!prereq_check) {
    +    4475             : 
    +    4476           1 :     res.message = ss.str();
    +    4477           1 :     res.success = false;
    +    4478             : 
    +    4479           1 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    4480             : 
    +    4481           1 :     return false;
    +    4482             : 
    +    4483             :   } else {
    +    4484             : 
    +    4485          91 :     toggleOutput(req.data);
    +    4486             : 
    +    4487          91 :     ss << "Output: " << (output_enabled_ ? "ON" : "OFF");
    +    4488          91 :     res.message = ss.str();
    +    4489          91 :     res.success = true;
    +    4490             : 
    +    4491          91 :     ROS_INFO_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    4492             : 
    +    4493          91 :     publishDiagnostics();
    +    4494             : 
    +    4495          91 :     return true;
    +    4496             :   }
    +    4497             : }
    +    4498             : 
    +    4499             : //}
    +    4500             : 
    +    4501             : /* callbackArm() //{ */
    +    4502             : 
    +    4503           7 : bool ControlManager::callbackArm(std_srvs::SetBool::Request& req, std_srvs::SetBool::Response& res) {
    +    4504             : 
    +    4505           7 :   if (!is_initialized_)
    +    4506           0 :     return false;
    +    4507             : 
    +    4508           7 :   ROS_INFO("[ControlManager]: arming by service");
    +    4509             : 
    +    4510          14 :   std::stringstream ss;
    +    4511             : 
    +    4512           7 :   if (failsafe_triggered_ || eland_triggered_) {
    +    4513             : 
    +    4514           0 :     ss << "can not " << (req.data ? "arm" : "disarm") << ", eland or failsafe active";
    +    4515             : 
    +    4516           0 :     res.message = ss.str();
    +    4517           0 :     res.success = false;
    +    4518             : 
    +    4519           0 :     ROS_ERROR_STREAM("[ControlManager]: " << ss.str());
    +    4520             : 
    +    4521           0 :     return true;
    +    4522             :   }
    +    4523             : 
    +    4524           7 :   if (req.data) {
    +    4525             : 
    +    4526           0 :     ss << "this service is not allowed to arm the UAV";
    +    4527           0 :     res.success = false;
    +    4528           0 :     ROS_ERROR_STREAM("[ControlManager]: " << ss.str());
    +    4529             : 
    +    4530             :   } else {
    +    4531             : 
    +    4532          14 :     auto [success, message] = arming(false);
    +    4533             : 
    +    4534           7 :     if (success) {
    +    4535             : 
    +    4536           7 :       ss << "disarmed";
    +    4537           7 :       res.success = true;
    +    4538           7 :       ROS_INFO_STREAM("[ControlManager]: " << ss.str());
    +    4539             : 
    +    4540             :     } else {
    +    4541             : 
    +    4542           0 :       ss << "could not disarm: " << message;
    +    4543           0 :       res.success = false;
    +    4544           0 :       ROS_ERROR_STREAM("[ControlManager]: " << ss.str());
    +    4545             :     }
    +    4546             :   }
    +    4547             : 
    +    4548           7 :   res.message = ss.str();
    +    4549             : 
    +    4550           7 :   return true;
    +    4551             : }
    +    4552             : 
    +    4553             : //}
    +    4554             : 
    +    4555             : /* //{ callbackEnableCallbacks() */
    +    4556             : 
    +    4557          95 : bool ControlManager::callbackEnableCallbacks(std_srvs::SetBool::Request& req, std_srvs::SetBool::Response& res) {
    +    4558             : 
    +    4559          95 :   if (!is_initialized_)
    +    4560           0 :     return false;
    +    4561             : 
    +    4562          95 :   setCallbacks(req.data);
    +    4563             : 
    +    4564          95 :   std::stringstream ss;
    +    4565             : 
    +    4566          95 :   ss << "callbacks " << (callbacks_enabled_ ? "enabled" : "disabled");
    +    4567             : 
    +    4568          95 :   res.message = ss.str();
    +    4569          95 :   res.success = true;
    +    4570             : 
    +    4571          95 :   ROS_INFO_STREAM("[ControlManager]: " << ss.str());
    +    4572             : 
    +    4573          95 :   return true;
    +    4574             : }
    +    4575             : 
    +    4576             : //}
    +    4577             : 
    +    4578             : /* callbackSetConstraints() //{ */
    +    4579             : 
    +    4580          94 : bool ControlManager::callbackSetConstraints(mrs_msgs::DynamicsConstraintsSrv::Request& req, mrs_msgs::DynamicsConstraintsSrv::Response& res) {
    +    4581             : 
    +    4582          94 :   if (!is_initialized_) {
    +    4583           0 :     res.message = "not initialized";
    +    4584           0 :     res.success = false;
    +    4585           0 :     return true;
    +    4586             :   }
    +    4587             : 
    +    4588             :   {
    +    4589         188 :     std::scoped_lock lock(mutex_constraints_);
    +    4590             : 
    +    4591          94 :     current_constraints_ = req;
    +    4592             : 
    +    4593          94 :     auto enforced = enforceControllersConstraints(current_constraints_);
    +    4594             : 
    +    4595          94 :     if (enforced) {
    +    4596           0 :       sanitized_constraints_      = enforced.value();
    +    4597           0 :       constraints_being_enforced_ = true;
    +    4598             :     } else {
    +    4599          94 :       sanitized_constraints_      = req;
    +    4600          94 :       constraints_being_enforced_ = false;
    +    4601             :     }
    +    4602             : 
    +    4603          94 :     got_constraints_ = true;
    +    4604             : 
    +    4605          94 :     setConstraintsToControllers(current_constraints_);
    +    4606          94 :     setConstraintsToTrackers(sanitized_constraints_);
    +    4607             :   }
    +    4608             : 
    +    4609          94 :   res.message = "setting constraints";
    +    4610          94 :   res.success = true;
    +    4611             : 
    +    4612          94 :   return true;
    +    4613             : }
    +    4614             : 
    +    4615             : //}
    +    4616             : 
    +    4617             : /* //{ callbackEmergencyReference() */
    +    4618             : 
    +    4619          94 : bool ControlManager::callbackEmergencyReference(mrs_msgs::ReferenceStampedSrv::Request& req, mrs_msgs::ReferenceStampedSrv::Response& res) {
    +    4620             : 
    +    4621          94 :   if (!is_initialized_)
    +    4622           0 :     return false;
    +    4623             : 
    +    4624         188 :   auto uav_state = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +    4625             : 
    +    4626          94 :   callbacks_enabled_ = false;
    +    4627             : 
    +    4628          94 :   mrs_msgs::ReferenceSrvResponse::ConstPtr tracker_response;
    +    4629             : 
    +    4630         188 :   std::stringstream ss;
    +    4631             : 
    +    4632             :   // transform the reference to the current frame
    +    4633         188 :   mrs_msgs::ReferenceStamped original_reference;
    +    4634          94 :   original_reference.header    = req.header;
    +    4635          94 :   original_reference.reference = req.reference;
    +    4636             : 
    +    4637         188 :   auto ret = transformer_->transformSingle(original_reference, uav_state.header.frame_id);
    +    4638             : 
    +    4639          94 :   if (!ret) {
    +    4640             : 
    +    4641           0 :     ss << "the emergency reference could not be transformed";
    +    4642             : 
    +    4643           0 :     ROS_WARN_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    4644           0 :     res.message = ss.str();
    +    4645           0 :     res.success = false;
    +    4646           0 :     return true;
    +    4647             :   }
    +    4648             : 
    +    4649          94 :   mrs_msgs::ReferenceStamped transformed_reference = ret.value();
    +    4650             : 
    +    4651          94 :   std_srvs::SetBoolRequest req_enable_callbacks;
    +    4652             : 
    +    4653          94 :   mrs_msgs::ReferenceSrvRequest req_goto_out;
    +    4654          94 :   req_goto_out.reference = transformed_reference.reference;
    +    4655             : 
    +    4656             :   {
    +    4657         188 :     std::scoped_lock lock(mutex_tracker_list_);
    +    4658             : 
    +    4659             :     // disable callbacks of all trackers
    +    4660          94 :     req_enable_callbacks.data = false;
    +    4661         658 :     for (int i = 0; i < int(tracker_list_.size()); i++) {
    +    4662         564 :       tracker_list_[i]->enableCallbacks(std_srvs::SetBoolRequest::ConstPtr(std::make_unique<std_srvs::SetBoolRequest>(req_enable_callbacks)));
    +    4663             :     }
    +    4664             : 
    +    4665             :     // enable the callbacks for the active tracker
    +    4666          94 :     req_enable_callbacks.data = true;
    +    4667          94 :     tracker_list_[active_tracker_idx_]->enableCallbacks(std_srvs::SetBoolRequest::ConstPtr(std::make_unique<std_srvs::SetBoolRequest>(req_enable_callbacks)));
    +    4668             : 
    +    4669             :     // call the setReference()
    +    4670         282 :     tracker_response = tracker_list_[active_tracker_idx_]->setReference(
    +    4671         282 :         mrs_msgs::ReferenceSrvRequest::ConstPtr(std::make_unique<mrs_msgs::ReferenceSrvRequest>(req_goto_out)));
    +    4672             : 
    +    4673             :     // disable the callbacks back again
    +    4674          94 :     req_enable_callbacks.data = false;
    +    4675          94 :     tracker_list_[active_tracker_idx_]->enableCallbacks(std_srvs::SetBoolRequest::ConstPtr(std::make_unique<std_srvs::SetBoolRequest>(req_enable_callbacks)));
    +    4676             : 
    +    4677          94 :     if (tracker_response != mrs_msgs::ReferenceSrvResponse::Ptr()) {
    +    4678          94 :       res.message = tracker_response->message;
    +    4679          94 :       res.success = tracker_response->success;
    +    4680             :     } else {
    +    4681           0 :       ss << "the tracker '" << _tracker_names_[active_tracker_idx_] << "' does not implement the 'setReference()' function!";
    +    4682           0 :       res.message = ss.str();
    +    4683           0 :       res.success = false;
    +    4684             :     }
    +    4685             :   }
    +    4686             : 
    +    4687          94 :   return true;
    +    4688             : }
    +    4689             : 
    +    4690             : //}
    +    4691             : 
    +    4692             : /* callbackPirouette() //{ */
    +    4693             : 
    +    4694           0 : bool ControlManager::callbackPirouette([[maybe_unused]] std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res) {
    +    4695             : 
    +    4696           0 :   if (!is_initialized_)
    +    4697           0 :     return false;
    +    4698             : 
    +    4699             :   // copy member variables
    +    4700           0 :   auto uav_state = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +    4701             : 
    +    4702             :   double uav_heading;
    +    4703             :   try {
    +    4704           0 :     uav_heading = mrs_lib::AttitudeConverter(uav_state.pose.orientation).getHeading();
    +    4705             :   }
    +    4706           0 :   catch (...) {
    +    4707           0 :     std::stringstream ss;
    +    4708           0 :     ss << "could not calculate the UAV heading to initialize the pirouette";
    +    4709             : 
    +    4710           0 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    4711             : 
    +    4712           0 :     res.message = ss.str();
    +    4713           0 :     res.success = false;
    +    4714             : 
    +    4715           0 :     return false;
    +    4716             :   }
    +    4717             : 
    +    4718           0 :   if (_pirouette_enabled_) {
    +    4719           0 :     res.success = false;
    +    4720           0 :     res.message = "already active";
    +    4721           0 :     return true;
    +    4722             :   }
    +    4723             : 
    +    4724           0 :   if (failsafe_triggered_ || eland_triggered_ || rc_escalating_failsafe_triggered_) {
    +    4725             : 
    +    4726           0 :     std::stringstream ss;
    +    4727           0 :     ss << "can not activate the pirouette, eland or failsafe active";
    +    4728             : 
    +    4729           0 :     res.message = ss.str();
    +    4730           0 :     res.success = false;
    +    4731             : 
    +    4732           0 :     ROS_ERROR_STREAM("[ControlManager]: " << ss.str());
    +    4733             : 
    +    4734           0 :     return true;
    +    4735             :   }
    +    4736             : 
    +    4737           0 :   _pirouette_enabled_ = true;
    +    4738             : 
    +    4739           0 :   setCallbacks(false);
    +    4740             : 
    +    4741           0 :   pirouette_initial_heading_ = uav_heading;
    +    4742           0 :   pirouette_iterator_        = 0;
    +    4743           0 :   timer_pirouette_.start();
    +    4744             : 
    +    4745           0 :   res.success = true;
    +    4746           0 :   res.message = "activated";
    +    4747             : 
    +    4748           0 :   return true;
    +    4749             : }
    +    4750             : 
    +    4751             : //}
    +    4752             : 
    +    4753             : /* callbackUseJoystick() //{ */
    +    4754             : 
    +    4755           0 : bool ControlManager::callbackUseJoystick([[maybe_unused]] std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res) {
    +    4756             : 
    +    4757           0 :   if (!is_initialized_) {
    +    4758           0 :     return false;
    +    4759             :   }
    +    4760             : 
    +    4761           0 :   std::stringstream ss;
    +    4762             : 
    +    4763             :   {
    +    4764           0 :     auto [success, response] = switchTracker(_joystick_tracker_name_);
    +    4765             : 
    +    4766           0 :     if (!success) {
    +    4767             : 
    +    4768           0 :       ss << "switching to '" << _joystick_tracker_name_ << "' was unsuccessfull: '" << response << "'";
    +    4769           0 :       ROS_ERROR_STREAM("[ControlManager]: " << ss.str());
    +    4770             : 
    +    4771           0 :       res.success = false;
    +    4772           0 :       res.message = ss.str();
    +    4773             : 
    +    4774           0 :       return true;
    +    4775             :     }
    +    4776             :   }
    +    4777             : 
    +    4778           0 :   auto [success, response] = switchController(_joystick_controller_name_);
    +    4779             : 
    +    4780           0 :   if (!success) {
    +    4781             : 
    +    4782           0 :     ss << "switching to '" << _joystick_controller_name_ << "' was unsuccessfull: '" << response << "'";
    +    4783           0 :     ROS_ERROR_STREAM("[ControlManager]: " << ss.str());
    +    4784             : 
    +    4785           0 :     res.success = false;
    +    4786           0 :     res.message = ss.str();
    +    4787             : 
    +    4788             :     // switch back to hover tracker
    +    4789           0 :     switchTracker(_ehover_tracker_name_);
    +    4790             : 
    +    4791             :     // switch back to safety controller
    +    4792           0 :     switchController(_eland_controller_name_);
    +    4793             : 
    +    4794           0 :     ROS_ERROR_STREAM("[ControlManager]: " << ss.str());
    +    4795             : 
    +    4796           0 :     return true;
    +    4797             :   }
    +    4798             : 
    +    4799           0 :   ss << "switched to joystick control";
    +    4800             : 
    +    4801           0 :   res.success = true;
    +    4802           0 :   res.message = ss.str();
    +    4803             : 
    +    4804           0 :   ROS_INFO_STREAM("[ControlManager]: " << ss.str());
    +    4805             : 
    +    4806           0 :   return true;
    +    4807             : }
    +    4808             : 
    +    4809             : //}
    +    4810             : 
    +    4811             : /* //{ callbackHover() */
    +    4812             : 
    +    4813           0 : bool ControlManager::callbackHover([[maybe_unused]] std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res) {
    +    4814             : 
    +    4815           0 :   if (!is_initialized_)
    +    4816           0 :     return false;
    +    4817             : 
    +    4818           0 :   auto [success, message] = hover();
    +    4819             : 
    +    4820           0 :   res.success = success;
    +    4821           0 :   res.message = message;
    +    4822             : 
    +    4823           0 :   return true;
    +    4824             : }
    +    4825             : 
    +    4826             : //}
    +    4827             : 
    +    4828             : /* //{ callbackStartTrajectoryTracking() */
    +    4829             : 
    +    4830           1 : bool ControlManager::callbackStartTrajectoryTracking([[maybe_unused]] std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res) {
    +    4831             : 
    +    4832           1 :   if (!is_initialized_)
    +    4833           0 :     return false;
    +    4834             : 
    +    4835           1 :   auto [success, message] = startTrajectoryTracking();
    +    4836             : 
    +    4837           1 :   res.success = success;
    +    4838           1 :   res.message = message;
    +    4839             : 
    +    4840           1 :   return true;
    +    4841             : }
    +    4842             : 
    +    4843             : //}
    +    4844             : 
    +    4845             : /* //{ callbackStopTrajectoryTracking() */
    +    4846             : 
    +    4847           0 : bool ControlManager::callbackStopTrajectoryTracking([[maybe_unused]] std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res) {
    +    4848             : 
    +    4849           0 :   if (!is_initialized_)
    +    4850           0 :     return false;
    +    4851             : 
    +    4852           0 :   auto [success, message] = stopTrajectoryTracking();
    +    4853             : 
    +    4854           0 :   res.success = success;
    +    4855           0 :   res.message = message;
    +    4856             : 
    +    4857           0 :   return true;
    +    4858             : }
    +    4859             : 
    +    4860             : //}
    +    4861             : 
    +    4862             : /* //{ callbackResumeTrajectoryTracking() */
    +    4863             : 
    +    4864           0 : bool ControlManager::callbackResumeTrajectoryTracking([[maybe_unused]] std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res) {
    +    4865             : 
    +    4866           0 :   if (!is_initialized_)
    +    4867           0 :     return false;
    +    4868             : 
    +    4869           0 :   auto [success, message] = resumeTrajectoryTracking();
    +    4870             : 
    +    4871           0 :   res.success = success;
    +    4872           0 :   res.message = message;
    +    4873             : 
    +    4874           0 :   return true;
    +    4875             : }
    +    4876             : 
    +    4877             : //}
    +    4878             : 
    +    4879             : /* //{ callbackGotoTrajectoryStart() */
    +    4880             : 
    +    4881           1 : bool ControlManager::callbackGotoTrajectoryStart([[maybe_unused]] std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res) {
    +    4882             : 
    +    4883           1 :   if (!is_initialized_)
    +    4884           0 :     return false;
    +    4885             : 
    +    4886           1 :   auto [success, message] = gotoTrajectoryStart();
    +    4887             : 
    +    4888           1 :   res.success = success;
    +    4889           1 :   res.message = message;
    +    4890             : 
    +    4891           1 :   return true;
    +    4892             : }
    +    4893             : 
    +    4894             : //}
    +    4895             : 
    +    4896             : /* //{ callbackTransformReference() */
    +    4897             : 
    +    4898           0 : bool ControlManager::callbackTransformReference(mrs_msgs::TransformReferenceSrv::Request& req, mrs_msgs::TransformReferenceSrv::Response& res) {
    +    4899             : 
    +    4900           0 :   if (!is_initialized_)
    +    4901           0 :     return false;
    +    4902             : 
    +    4903             :   // transform the reference to the current frame
    +    4904           0 :   mrs_msgs::ReferenceStamped transformed_reference = req.reference;
    +    4905             : 
    +    4906           0 :   if (auto ret = transformer_->transformSingle(transformed_reference, req.frame_id)) {
    +    4907             : 
    +    4908           0 :     res.reference = ret.value();
    +    4909           0 :     res.message   = "transformation successful";
    +    4910           0 :     res.success   = true;
    +    4911           0 :     return true;
    +    4912             : 
    +    4913             :   } else {
    +    4914             : 
    +    4915           0 :     res.message = "the reference could not be transformed";
    +    4916           0 :     res.success = false;
    +    4917           0 :     return true;
    +    4918             :   }
    +    4919             : 
    +    4920             :   return true;
    +    4921             : }
    +    4922             : 
    +    4923             : //}
    +    4924             : 
    +    4925             : /* //{ callbackTransformPose() */
    +    4926             : 
    +    4927           0 : bool ControlManager::callbackTransformPose(mrs_msgs::TransformPoseSrv::Request& req, mrs_msgs::TransformPoseSrv::Response& res) {
    +    4928             : 
    +    4929           0 :   if (!is_initialized_)
    +    4930           0 :     return false;
    +    4931             : 
    +    4932             :   // transform the reference to the current frame
    +    4933           0 :   geometry_msgs::PoseStamped transformed_pose = req.pose;
    +    4934             : 
    +    4935           0 :   if (auto ret = transformer_->transformSingle(transformed_pose, req.frame_id)) {
    +    4936             : 
    +    4937           0 :     res.pose    = ret.value();
    +    4938           0 :     res.message = "transformation successful";
    +    4939           0 :     res.success = true;
    +    4940           0 :     return true;
    +    4941             : 
    +    4942             :   } else {
    +    4943             : 
    +    4944           0 :     res.message = "the pose could not be transformed";
    +    4945           0 :     res.success = false;
    +    4946           0 :     return true;
    +    4947             :   }
    +    4948             : 
    +    4949             :   return true;
    +    4950             : }
    +    4951             : 
    +    4952             : //}
    +    4953             : 
    +    4954             : /* //{ callbackTransformVector3() */
    +    4955             : 
    +    4956           0 : bool ControlManager::callbackTransformVector3(mrs_msgs::TransformVector3Srv::Request& req, mrs_msgs::TransformVector3Srv::Response& res) {
    +    4957             : 
    +    4958           0 :   if (!is_initialized_)
    +    4959           0 :     return false;
    +    4960             : 
    +    4961             :   // transform the reference to the current frame
    +    4962           0 :   geometry_msgs::Vector3Stamped transformed_vector3 = req.vector;
    +    4963             : 
    +    4964           0 :   if (auto ret = transformer_->transformSingle(transformed_vector3, req.frame_id)) {
    +    4965             : 
    +    4966           0 :     res.vector  = ret.value();
    +    4967           0 :     res.message = "transformation successful";
    +    4968           0 :     res.success = true;
    +    4969           0 :     return true;
    +    4970             : 
    +    4971             :   } else {
    +    4972             : 
    +    4973           0 :     res.message = "the twist could not be transformed";
    +    4974           0 :     res.success = false;
    +    4975           0 :     return true;
    +    4976             :   }
    +    4977             : 
    +    4978             :   return true;
    +    4979             : }
    +    4980             : 
    +    4981             : //}
    +    4982             : 
    +    4983             : /* //{ callbackEnableBumper() */
    +    4984             : 
    +    4985           0 : bool ControlManager::callbackEnableBumper(std_srvs::SetBool::Request& req, std_srvs::SetBool::Response& res) {
    +    4986             : 
    +    4987           0 :   if (!is_initialized_)
    +    4988           0 :     return false;
    +    4989             : 
    +    4990           0 :   bumper_enabled_ = req.data;
    +    4991             : 
    +    4992           0 :   std::stringstream ss;
    +    4993             : 
    +    4994           0 :   ss << "bumper " << (bumper_enabled_ ? "enalbed" : "disabled");
    +    4995             : 
    +    4996           0 :   ROS_INFO_STREAM("[ControlManager]: " << ss.str());
    +    4997             : 
    +    4998           0 :   res.success = true;
    +    4999           0 :   res.message = ss.str();
    +    5000             : 
    +    5001           0 :   return true;
    +    5002             : }
    +    5003             : 
    +    5004             : //}
    +    5005             : 
    +    5006             : /* //{ callbackUseSafetyArea() */
    +    5007             : 
    +    5008           0 : bool ControlManager::callbackUseSafetyArea(std_srvs::SetBool::Request& req, std_srvs::SetBool::Response& res) {
    +    5009             : 
    +    5010           0 :   if (!is_initialized_)
    +    5011           0 :     return false;
    +    5012             : 
    +    5013           0 :   use_safety_area_ = req.data;
    +    5014             : 
    +    5015           0 :   std::stringstream ss;
    +    5016             : 
    +    5017           0 :   ss << "safety area " << (use_safety_area_ ? "enabled" : "disabled");
    +    5018             : 
    +    5019           0 :   ROS_INFO_STREAM("[ControlManager]: " << ss.str());
    +    5020             : 
    +    5021           0 :   res.success = true;
    +    5022           0 :   res.message = ss.str();
    +    5023             : 
    +    5024           0 :   return true;
    +    5025             : }
    +    5026             : 
    +    5027             : //}
    +    5028             : 
    +    5029             : /* //{ callbackGetMinZ() */
    +    5030             : 
    +    5031           0 : bool ControlManager::callbackGetMinZ([[maybe_unused]] mrs_msgs::GetFloat64::Request& req, mrs_msgs::GetFloat64::Response& res) {
    +    5032             : 
    +    5033           0 :   if (!is_initialized_) {
    +    5034           0 :     return false;
    +    5035             :   }
    +    5036             : 
    +    5037           0 :   auto uav_state = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +    5038             : 
    +    5039           0 :   res.success = true;
    +    5040           0 :   res.value   = getMinZ(uav_state.header.frame_id);
    +    5041             : 
    +    5042           0 :   return true;
    +    5043             : }
    +    5044             : 
    +    5045             : //}
    +    5046             : 
    +    5047             : /* //{ callbackValidateReference() */
    +    5048             : 
    +    5049           0 : bool ControlManager::callbackValidateReference(mrs_msgs::ValidateReference::Request& req, mrs_msgs::ValidateReference::Response& res) {
    +    5050             : 
    +    5051           0 :   if (!is_initialized_) {
    +    5052           0 :     res.message = "not initialized";
    +    5053           0 :     res.success = false;
    +    5054           0 :     return true;
    +    5055             :   }
    +    5056             : 
    +    5057           0 :   if (!validateReference(req.reference.reference, "ControlManager", "reference_for_validation")) {
    +    5058           0 :     ROS_ERROR_THROTTLE(1.0, "[ControlManager]: NaN detected in variable 'req.reference'!!!");
    +    5059           0 :     res.message = "NaNs/infs in input!";
    +    5060           0 :     res.success = false;
    +    5061           0 :     return true;
    +    5062             :   }
    +    5063             : 
    +    5064             :   // copy member variables
    +    5065           0 :   auto uav_state        = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +    5066           0 :   auto last_tracker_cmd = mrs_lib::get_mutexed(mutex_last_tracker_cmd_, last_tracker_cmd_);
    +    5067             : 
    +    5068             :   // transform the reference to the current frame
    +    5069           0 :   mrs_msgs::ReferenceStamped original_reference;
    +    5070           0 :   original_reference.header    = req.reference.header;
    +    5071           0 :   original_reference.reference = req.reference.reference;
    +    5072             : 
    +    5073           0 :   auto ret = transformer_->transformSingle(original_reference, uav_state.header.frame_id);
    +    5074             : 
    +    5075           0 :   if (!ret) {
    +    5076             : 
    +    5077           0 :     ROS_WARN_THROTTLE(1.0, "[ControlManager]: the reference could not be transformed");
    +    5078           0 :     res.message = "the reference could not be transformed";
    +    5079           0 :     res.success = false;
    +    5080           0 :     return true;
    +    5081             :   }
    +    5082             : 
    +    5083           0 :   mrs_msgs::ReferenceStamped transformed_reference = ret.value();
    +    5084             : 
    +    5085           0 :   if (!isPointInSafetyArea3d(transformed_reference)) {
    +    5086           0 :     ROS_ERROR_THROTTLE(1.0, "[ControlManager]: reference validation failed, the point is outside of the safety area!");
    +    5087           0 :     res.message = "the point is outside of the safety area";
    +    5088           0 :     res.success = false;
    +    5089           0 :     return true;
    +    5090             :   }
    +    5091             : 
    +    5092           0 :   if (last_tracker_cmd) {
    +    5093             : 
    +    5094           0 :     mrs_msgs::ReferenceStamped from_point;
    +    5095           0 :     from_point.header.frame_id      = uav_state.header.frame_id;
    +    5096           0 :     from_point.reference.position.x = last_tracker_cmd->position.x;
    +    5097           0 :     from_point.reference.position.y = last_tracker_cmd->position.y;
    +    5098           0 :     from_point.reference.position.z = last_tracker_cmd->position.z;
    +    5099             : 
    +    5100           0 :     if (!isPathToPointInSafetyArea3d(from_point, transformed_reference)) {
    +    5101           0 :       ROS_ERROR_THROTTLE(1.0, "[ControlManager]: reference validation failed, the path is going outside the safety area!");
    +    5102           0 :       res.message = "the path is going outside the safety area";
    +    5103           0 :       res.success = false;
    +    5104           0 :       return true;
    +    5105             :     }
    +    5106             :   }
    +    5107             : 
    +    5108           0 :   res.message = "the reference is ok";
    +    5109           0 :   res.success = true;
    +    5110           0 :   return true;
    +    5111             : }
    +    5112             : 
    +    5113             : //}
    +    5114             : 
    +    5115             : /* //{ callbackValidateReference2d() */
    +    5116             : 
    +    5117        9788 : bool ControlManager::callbackValidateReference2d(mrs_msgs::ValidateReference::Request& req, mrs_msgs::ValidateReference::Response& res) {
    +    5118             : 
    +    5119        9788 :   if (!is_initialized_) {
    +    5120           0 :     res.message = "not initialized";
    +    5121           0 :     res.success = false;
    +    5122           0 :     return true;
    +    5123             :   }
    +    5124             : 
    +    5125        9788 :   if (!validateReference(req.reference.reference, "ControlManager", "reference_for_validation")) {
    +    5126           0 :     ROS_ERROR_THROTTLE(1.0, "[ControlManager]: NaN detected in variable 'req.reference'!!!");
    +    5127           0 :     res.message = "NaNs/infs in input!";
    +    5128           0 :     res.success = false;
    +    5129           0 :     return true;
    +    5130             :   }
    +    5131             : 
    +    5132             :   // copy member variables
    +    5133       19576 :   auto uav_state        = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +    5134       19576 :   auto last_tracker_cmd = mrs_lib::get_mutexed(mutex_last_tracker_cmd_, last_tracker_cmd_);
    +    5135             : 
    +    5136             :   // transform the reference to the current frame
    +    5137       19576 :   mrs_msgs::ReferenceStamped original_reference;
    +    5138        9788 :   original_reference.header    = req.reference.header;
    +    5139        9788 :   original_reference.reference = req.reference.reference;
    +    5140             : 
    +    5141       19576 :   auto ret = transformer_->transformSingle(original_reference, uav_state.header.frame_id);
    +    5142             : 
    +    5143        9788 :   if (!ret) {
    +    5144             : 
    +    5145           0 :     ROS_WARN_THROTTLE(1.0, "[ControlManager]: the reference could not be transformed");
    +    5146           0 :     res.message = "the reference could not be transformed";
    +    5147           0 :     res.success = false;
    +    5148           0 :     return true;
    +    5149             :   }
    +    5150             : 
    +    5151       19576 :   mrs_msgs::ReferenceStamped transformed_reference = ret.value();
    +    5152             : 
    +    5153        9788 :   if (!isPointInSafetyArea2d(transformed_reference)) {
    +    5154          75 :     ROS_ERROR_THROTTLE(1.0, "[ControlManager]: reference validation failed, the point is outside of the safety area!");
    +    5155          75 :     res.message = "the point is outside of the safety area";
    +    5156          75 :     res.success = false;
    +    5157          75 :     return true;
    +    5158             :   }
    +    5159             : 
    +    5160        9713 :   if (last_tracker_cmd) {
    +    5161             : 
    +    5162          31 :     mrs_msgs::ReferenceStamped from_point;
    +    5163          31 :     from_point.header.frame_id      = uav_state.header.frame_id;
    +    5164          31 :     from_point.reference.position.x = last_tracker_cmd->position.x;
    +    5165          31 :     from_point.reference.position.y = last_tracker_cmd->position.y;
    +    5166          31 :     from_point.reference.position.z = last_tracker_cmd->position.z;
    +    5167             : 
    +    5168          31 :     if (!isPathToPointInSafetyArea2d(from_point, transformed_reference)) {
    +    5169           0 :       ROS_ERROR_THROTTLE(1.0, "[ControlManager]: reference validation failed, the path is going outside the safety area!");
    +    5170           0 :       res.message = "the path is going outside the safety area";
    +    5171           0 :       res.success = false;
    +    5172           0 :       return true;
    +    5173             :     }
    +    5174             :   }
    +    5175             : 
    +    5176        9713 :   res.message = "the reference is ok";
    +    5177        9713 :   res.success = true;
    +    5178        9713 :   return true;
    +    5179             : }
    +    5180             : 
    +    5181             : //}
    +    5182             : 
    +    5183             : /* //{ callbackValidateReferenceList() */
    +    5184             : 
    +    5185           0 : bool ControlManager::callbackValidateReferenceList(mrs_msgs::ValidateReferenceList::Request& req, mrs_msgs::ValidateReferenceList::Response& res) {
    +    5186             : 
    +    5187           0 :   if (!is_initialized_) {
    +    5188           0 :     res.message = "not initialized";
    +    5189           0 :     return false;
    +    5190             :   }
    +    5191             : 
    +    5192             :   // copy member variables
    +    5193           0 :   auto uav_state        = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +    5194           0 :   auto last_tracker_cmd = mrs_lib::get_mutexed(mutex_last_tracker_cmd_, last_tracker_cmd_);
    +    5195             : 
    +    5196             :   // get the transformer
    +    5197           0 :   auto ret = transformer_->getTransform(uav_state.header.frame_id, req.list.header.frame_id, req.list.header.stamp);
    +    5198             : 
    +    5199           0 :   if (!ret) {
    +    5200             : 
    +    5201           0 :     ROS_DEBUG("[ControlManager]: could not find transform for the reference");
    +    5202           0 :     res.message = "could not find transform";
    +    5203           0 :     return false;
    +    5204             :   }
    +    5205             : 
    +    5206           0 :   geometry_msgs::TransformStamped tf = ret.value();
    +    5207             : 
    +    5208           0 :   for (int i = 0; i < int(req.list.list.size()); i++) {
    +    5209             : 
    +    5210           0 :     res.success.push_back(true);
    +    5211             : 
    +    5212           0 :     mrs_msgs::ReferenceStamped original_reference;
    +    5213           0 :     original_reference.header    = req.list.header;
    +    5214           0 :     original_reference.reference = req.list.list[i];
    +    5215             : 
    +    5216           0 :     res.success[i] = validateReference(original_reference.reference, "ControlManager", "reference_list");
    +    5217             : 
    +    5218           0 :     auto ret = transformer_->transformSingle(original_reference, uav_state.header.frame_id);
    +    5219             : 
    +    5220           0 :     if (!ret) {
    +    5221             : 
    +    5222           0 :       ROS_DEBUG("[ControlManager]: the reference could not be transformed");
    +    5223           0 :       res.success[i] = false;
    +    5224             :     }
    +    5225             : 
    +    5226           0 :     mrs_msgs::ReferenceStamped transformed_reference = ret.value();
    +    5227             : 
    +    5228           0 :     if (!isPointInSafetyArea3d(transformed_reference)) {
    +    5229           0 :       res.success[i] = false;
    +    5230             :     }
    +    5231             : 
    +    5232           0 :     if (last_tracker_cmd) {
    +    5233             : 
    +    5234           0 :       mrs_msgs::ReferenceStamped from_point;
    +    5235           0 :       from_point.header.frame_id      = uav_state.header.frame_id;
    +    5236           0 :       from_point.reference.position.x = last_tracker_cmd->position.x;
    +    5237           0 :       from_point.reference.position.y = last_tracker_cmd->position.y;
    +    5238           0 :       from_point.reference.position.z = last_tracker_cmd->position.z;
    +    5239             : 
    +    5240           0 :       if (!isPathToPointInSafetyArea3d(from_point, transformed_reference)) {
    +    5241           0 :         res.success[i] = false;
    +    5242             :       }
    +    5243             :     }
    +    5244             :   }
    +    5245             : 
    +    5246           0 :   res.message = "references were checked";
    +    5247           0 :   return true;
    +    5248             : }
    +    5249             : 
    +    5250             : //}
    +    5251             : 
    +    5252             : // | -------------- setpoint topics and services -------------- |
    +    5253             : 
    +    5254             : /* //{ callbackReferenceService() */
    +    5255             : 
    +    5256           0 : bool ControlManager::callbackReferenceService(mrs_msgs::ReferenceStampedSrv::Request& req, mrs_msgs::ReferenceStampedSrv::Response& res) {
    +    5257             : 
    +    5258           0 :   if (!is_initialized_) {
    +    5259           0 :     res.message = "not initialized";
    +    5260           0 :     res.success = false;
    +    5261           0 :     return true;
    +    5262             :   }
    +    5263             : 
    +    5264           0 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("callbackReferenceService");
    +    5265           0 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("ControlManager::callbackReferenceService", scope_timer_logger_, scope_timer_enabled_);
    +    5266             : 
    +    5267           0 :   mrs_msgs::ReferenceStamped des_reference;
    +    5268           0 :   des_reference.header    = req.header;
    +    5269           0 :   des_reference.reference = req.reference;
    +    5270             : 
    +    5271           0 :   auto [success, message] = setReference(des_reference);
    +    5272             : 
    +    5273           0 :   res.success = success;
    +    5274           0 :   res.message = message;
    +    5275             : 
    +    5276           0 :   return true;
    +    5277             : }
    +    5278             : 
    +    5279             : //}
    +    5280             : 
    +    5281             : /* //{ callbackReferenceTopic() */
    +    5282             : 
    +    5283           0 : void ControlManager::callbackReferenceTopic(const mrs_msgs::ReferenceStamped::ConstPtr msg) {
    +    5284             : 
    +    5285           0 :   if (!is_initialized_)
    +    5286           0 :     return;
    +    5287             : 
    +    5288           0 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("callbackReferenceTopic");
    +    5289           0 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("ControlManager::callbackReferenceTopic", scope_timer_logger_, scope_timer_enabled_);
    +    5290             : 
    +    5291           0 :   setReference(*msg);
    +    5292             : }
    +    5293             : 
    +    5294             : //}
    +    5295             : 
    +    5296             : /* //{ callbackVelocityReferenceService() */
    +    5297             : 
    +    5298         468 : bool ControlManager::callbackVelocityReferenceService(mrs_msgs::VelocityReferenceStampedSrv::Request&  req,
    +    5299             :                                                       mrs_msgs::VelocityReferenceStampedSrv::Response& res) {
    +    5300             : 
    +    5301         468 :   if (!is_initialized_) {
    +    5302           0 :     res.message = "not initialized";
    +    5303           0 :     res.success = false;
    +    5304           0 :     return true;
    +    5305             :   }
    +    5306             : 
    +    5307        1404 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("callbackVelocityReferenceService");
    +    5308        1404 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("ControlManager::callbackVelocityReferenceService", scope_timer_logger_, scope_timer_enabled_);
    +    5309             : 
    +    5310         936 :   mrs_msgs::VelocityReferenceStamped des_reference;
    +    5311         468 :   des_reference = req.reference;
    +    5312             : 
    +    5313         468 :   auto [success, message] = setVelocityReference(des_reference);
    +    5314             : 
    +    5315         468 :   res.success = success;
    +    5316         468 :   res.message = message;
    +    5317             : 
    +    5318         468 :   return true;
    +    5319             : }
    +    5320             : 
    +    5321             : //}
    +    5322             : 
    +    5323             : /* //{ callbackVelocityReferenceTopic() */
    +    5324             : 
    +    5325           0 : void ControlManager::callbackVelocityReferenceTopic(const mrs_msgs::VelocityReferenceStamped::ConstPtr msg) {
    +    5326             : 
    +    5327           0 :   if (!is_initialized_)
    +    5328           0 :     return;
    +    5329             : 
    +    5330           0 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("callbackVelocityReferenceTopic");
    +    5331           0 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("ControlManager::callbackVelocityReferenceTopic", scope_timer_logger_, scope_timer_enabled_);
    +    5332             : 
    +    5333           0 :   setVelocityReference(*msg);
    +    5334             : }
    +    5335             : 
    +    5336             : //}
    +    5337             : 
    +    5338             : /* //{ callbackTrajectoryReferenceService() */
    +    5339             : 
    +    5340           4 : bool ControlManager::callbackTrajectoryReferenceService(mrs_msgs::TrajectoryReferenceSrv::Request& req, mrs_msgs::TrajectoryReferenceSrv::Response& res) {
    +    5341             : 
    +    5342           4 :   if (!is_initialized_) {
    +    5343           0 :     res.message = "not initialized";
    +    5344           0 :     res.success = false;
    +    5345           0 :     return true;
    +    5346             :   }
    +    5347             : 
    +    5348          12 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("callbackTrajectoryReferenceService");
    +    5349          12 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("ControlManager::callbackTrajectoryReferenceService", scope_timer_logger_, scope_timer_enabled_);
    +    5350             : 
    +    5351           8 :   auto [success, message, modified, tracker_names, tracker_successes, tracker_messages] = setTrajectoryReference(req.trajectory);
    +    5352             : 
    +    5353           4 :   res.success          = success;
    +    5354           4 :   res.message          = message;
    +    5355           4 :   res.modified         = modified;
    +    5356           4 :   res.tracker_names    = tracker_names;
    +    5357           4 :   res.tracker_messages = tracker_messages;
    +    5358             : 
    +    5359          28 :   for (size_t i = 0; i < tracker_successes.size(); i++) {
    +    5360          24 :     res.tracker_successes.push_back(tracker_successes[i]);
    +    5361             :   }
    +    5362             : 
    +    5363           4 :   return true;
    +    5364             : }
    +    5365             : 
    +    5366             : //}
    +    5367             : 
    +    5368             : /* //{ callbackTrajectoryReferenceTopic() */
    +    5369             : 
    +    5370           0 : void ControlManager::callbackTrajectoryReferenceTopic(const mrs_msgs::TrajectoryReference::ConstPtr msg) {
    +    5371             : 
    +    5372           0 :   if (!is_initialized_)
    +    5373           0 :     return;
    +    5374             : 
    +    5375           0 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("callbackTrajectoryReferenceTopic");
    +    5376           0 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("ControlManager::callbackTrajectoryReferenceTopic", scope_timer_logger_, scope_timer_enabled_);
    +    5377             : 
    +    5378           0 :   setTrajectoryReference(*msg);
    +    5379             : }
    +    5380             : 
    +    5381             : //}
    +    5382             : 
    +    5383             : // | ------------- human-callable "goto" services ------------- |
    +    5384             : 
    +    5385             : /* //{ callbackGoto() */
    +    5386             : 
    +    5387          26 : bool ControlManager::callbackGoto(mrs_msgs::Vec4::Request& req, mrs_msgs::Vec4::Response& res) {
    +    5388             : 
    +    5389          26 :   if (!is_initialized_) {
    +    5390           0 :     res.message = "not initialized";
    +    5391           0 :     res.success = false;
    +    5392           0 :     return true;
    +    5393             :   }
    +    5394             : 
    +    5395          78 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("callbackGoto");
    +    5396          78 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("ControlManager::callbackGoto", scope_timer_logger_, scope_timer_enabled_);
    +    5397             : 
    +    5398          52 :   mrs_msgs::ReferenceStamped des_reference;
    +    5399          26 :   des_reference.header.frame_id      = "";
    +    5400          26 :   des_reference.header.stamp         = ros::Time(0);
    +    5401          26 :   des_reference.reference.position.x = req.goal[REF_X];
    +    5402          26 :   des_reference.reference.position.y = req.goal[REF_Y];
    +    5403          26 :   des_reference.reference.position.z = req.goal[REF_Z];
    +    5404          26 :   des_reference.reference.heading    = req.goal[REF_HEADING];
    +    5405             : 
    +    5406          52 :   auto [success, message] = setReference(des_reference);
    +    5407             : 
    +    5408          26 :   res.success = success;
    +    5409          26 :   res.message = message;
    +    5410             : 
    +    5411          26 :   return true;
    +    5412             : }
    +    5413             : 
    +    5414             : //}
    +    5415             : 
    +    5416             : /* //{ callbackGotoFcu() */
    +    5417             : 
    +    5418           0 : bool ControlManager::callbackGotoFcu(mrs_msgs::Vec4::Request& req, mrs_msgs::Vec4::Response& res) {
    +    5419             : 
    +    5420           0 :   if (!is_initialized_) {
    +    5421           0 :     res.message = "not initialized";
    +    5422           0 :     res.success = false;
    +    5423           0 :     return true;
    +    5424             :   }
    +    5425             : 
    +    5426           0 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("callbackGotoFcu");
    +    5427           0 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("ControlManager::callbackGotoFcu", scope_timer_logger_, scope_timer_enabled_);
    +    5428             : 
    +    5429           0 :   mrs_msgs::ReferenceStamped des_reference;
    +    5430           0 :   des_reference.header.frame_id      = "fcu_untilted";
    +    5431           0 :   des_reference.header.stamp         = ros::Time(0);
    +    5432           0 :   des_reference.reference.position.x = req.goal[REF_X];
    +    5433           0 :   des_reference.reference.position.y = req.goal[REF_Y];
    +    5434           0 :   des_reference.reference.position.z = req.goal[REF_Z];
    +    5435           0 :   des_reference.reference.heading    = req.goal[REF_HEADING];
    +    5436             : 
    +    5437           0 :   auto [success, message] = setReference(des_reference);
    +    5438             : 
    +    5439           0 :   res.success = success;
    +    5440           0 :   res.message = message;
    +    5441             : 
    +    5442           0 :   return true;
    +    5443             : }
    +    5444             : 
    +    5445             : //}
    +    5446             : 
    +    5447             : /* //{ callbackGotoRelative() */
    +    5448             : 
    +    5449          23 : bool ControlManager::callbackGotoRelative(mrs_msgs::Vec4::Request& req, mrs_msgs::Vec4::Response& res) {
    +    5450             : 
    +    5451          23 :   if (!is_initialized_) {
    +    5452           0 :     res.message = "not initialized";
    +    5453           0 :     res.success = false;
    +    5454           0 :     return true;
    +    5455             :   }
    +    5456             : 
    +    5457          69 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("callbackGotoRelative");
    +    5458          69 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("ControlManager::callbackGotoRelative", scope_timer_logger_, scope_timer_enabled_);
    +    5459             : 
    +    5460          46 :   auto last_tracker_cmd = mrs_lib::get_mutexed(mutex_last_tracker_cmd_, last_tracker_cmd_);
    +    5461             : 
    +    5462          23 :   if (!last_tracker_cmd) {
    +    5463           0 :     res.message = "not flying";
    +    5464           0 :     res.success = false;
    +    5465           0 :     return true;
    +    5466             :   }
    +    5467             : 
    +    5468          46 :   mrs_msgs::ReferenceStamped des_reference;
    +    5469          23 :   des_reference.header.frame_id      = "";
    +    5470          23 :   des_reference.header.stamp         = ros::Time(0);
    +    5471          23 :   des_reference.reference.position.x = last_tracker_cmd->position.x + req.goal[REF_X];
    +    5472          23 :   des_reference.reference.position.y = last_tracker_cmd->position.y + req.goal[REF_Y];
    +    5473          23 :   des_reference.reference.position.z = last_tracker_cmd->position.z + req.goal[REF_Z];
    +    5474          23 :   des_reference.reference.heading    = last_tracker_cmd->heading + req.goal[REF_HEADING];
    +    5475             : 
    +    5476          46 :   auto [success, message] = setReference(des_reference);
    +    5477             : 
    +    5478          23 :   res.success = success;
    +    5479          23 :   res.message = message;
    +    5480             : 
    +    5481          23 :   return true;
    +    5482             : }
    +    5483             : 
    +    5484             : //}
    +    5485             : 
    +    5486             : /* //{ callbackGotoAltitude() */
    +    5487             : 
    +    5488           0 : bool ControlManager::callbackGotoAltitude(mrs_msgs::Vec1::Request& req, mrs_msgs::Vec1::Response& res) {
    +    5489             : 
    +    5490           0 :   if (!is_initialized_) {
    +    5491           0 :     res.message = "not initialized";
    +    5492           0 :     res.success = false;
    +    5493           0 :     return true;
    +    5494             :   }
    +    5495             : 
    +    5496           0 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("callbackGotoAltitude");
    +    5497           0 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("ControlManager::callbackGotoAltitude", scope_timer_logger_, scope_timer_enabled_);
    +    5498             : 
    +    5499           0 :   auto last_tracker_cmd = mrs_lib::get_mutexed(mutex_last_tracker_cmd_, last_tracker_cmd_);
    +    5500             : 
    +    5501           0 :   if (!last_tracker_cmd) {
    +    5502           0 :     res.message = "not flying";
    +    5503           0 :     res.success = false;
    +    5504           0 :     return true;
    +    5505             :   }
    +    5506             : 
    +    5507           0 :   mrs_msgs::ReferenceStamped des_reference;
    +    5508           0 :   des_reference.header.frame_id      = "";
    +    5509           0 :   des_reference.header.stamp         = ros::Time(0);
    +    5510           0 :   des_reference.reference.position.x = last_tracker_cmd->position.x;
    +    5511           0 :   des_reference.reference.position.y = last_tracker_cmd->position.y;
    +    5512           0 :   des_reference.reference.position.z = req.goal;
    +    5513           0 :   des_reference.reference.heading    = last_tracker_cmd->heading;
    +    5514             : 
    +    5515           0 :   auto [success, message] = setReference(des_reference);
    +    5516             : 
    +    5517           0 :   res.success = success;
    +    5518           0 :   res.message = message;
    +    5519             : 
    +    5520           0 :   return true;
    +    5521             : }
    +    5522             : 
    +    5523             : //}
    +    5524             : 
    +    5525             : /* //{ callbackSetHeading() */
    +    5526             : 
    +    5527           0 : bool ControlManager::callbackSetHeading(mrs_msgs::Vec1::Request& req, mrs_msgs::Vec1::Response& res) {
    +    5528             : 
    +    5529           0 :   if (!is_initialized_) {
    +    5530           0 :     res.message = "not initialized";
    +    5531           0 :     res.success = false;
    +    5532           0 :     return true;
    +    5533             :   }
    +    5534             : 
    +    5535           0 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("callbackSetHeading");
    +    5536           0 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("ControlManager::callbackSetHeading", scope_timer_logger_, scope_timer_enabled_);
    +    5537             : 
    +    5538           0 :   auto last_tracker_cmd = mrs_lib::get_mutexed(mutex_last_tracker_cmd_, last_tracker_cmd_);
    +    5539             : 
    +    5540           0 :   if (!last_tracker_cmd) {
    +    5541           0 :     res.message = "not flying";
    +    5542           0 :     res.success = false;
    +    5543           0 :     return true;
    +    5544             :   }
    +    5545             : 
    +    5546           0 :   mrs_msgs::ReferenceStamped des_reference;
    +    5547           0 :   des_reference.header.frame_id      = "";
    +    5548           0 :   des_reference.header.stamp         = ros::Time(0);
    +    5549           0 :   des_reference.reference.position.x = last_tracker_cmd->position.x;
    +    5550           0 :   des_reference.reference.position.y = last_tracker_cmd->position.y;
    +    5551           0 :   des_reference.reference.position.z = last_tracker_cmd->position.z;
    +    5552           0 :   des_reference.reference.heading    = req.goal;
    +    5553             : 
    +    5554           0 :   auto [success, message] = setReference(des_reference);
    +    5555             : 
    +    5556           0 :   res.success = success;
    +    5557           0 :   res.message = message;
    +    5558             : 
    +    5559           0 :   return true;
    +    5560             : }
    +    5561             : 
    +    5562             : //}
    +    5563             : 
    +    5564             : /* //{ callbackSetHeadingRelative() */
    +    5565             : 
    +    5566           0 : bool ControlManager::callbackSetHeadingRelative(mrs_msgs::Vec1::Request& req, mrs_msgs::Vec1::Response& res) {
    +    5567             : 
    +    5568           0 :   if (!is_initialized_) {
    +    5569           0 :     res.message = "not initialized";
    +    5570           0 :     res.success = false;
    +    5571           0 :     return true;
    +    5572             :   }
    +    5573             : 
    +    5574           0 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("callbackSetHeadingRelative");
    +    5575           0 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("ControlManager::callbackSetHeadingRelative", scope_timer_logger_, scope_timer_enabled_);
    +    5576             : 
    +    5577           0 :   auto last_tracker_cmd = mrs_lib::get_mutexed(mutex_last_tracker_cmd_, last_tracker_cmd_);
    +    5578             : 
    +    5579           0 :   if (!last_tracker_cmd) {
    +    5580           0 :     res.message = "not flying";
    +    5581           0 :     res.success = false;
    +    5582           0 :     return true;
    +    5583             :   }
    +    5584             : 
    +    5585           0 :   mrs_msgs::ReferenceStamped des_reference;
    +    5586           0 :   des_reference.header.frame_id      = "";
    +    5587           0 :   des_reference.header.stamp         = ros::Time(0);
    +    5588           0 :   des_reference.reference.position.x = last_tracker_cmd->position.x;
    +    5589           0 :   des_reference.reference.position.y = last_tracker_cmd->position.y;
    +    5590           0 :   des_reference.reference.position.z = last_tracker_cmd->position.z;
    +    5591           0 :   des_reference.reference.heading    = last_tracker_cmd->heading + req.goal;
    +    5592             : 
    +    5593           0 :   auto [success, message] = setReference(des_reference);
    +    5594             : 
    +    5595           0 :   res.success = success;
    +    5596           0 :   res.message = message;
    +    5597             : 
    +    5598           0 :   return true;
    +    5599             : }
    +    5600             : 
    +    5601             : //}
    +    5602             : 
    +    5603             : // --------------------------------------------------------------
    +    5604             : // |                          routines                          |
    +    5605             : // --------------------------------------------------------------
    +    5606             : 
    +    5607             : /* setReference() //{ */
    +    5608             : 
    +    5609          49 : std::tuple<bool, std::string> ControlManager::setReference(const mrs_msgs::ReferenceStamped reference_in) {
    +    5610             : 
    +    5611          98 :   std::stringstream ss;
    +    5612             : 
    +    5613          49 :   if (!callbacks_enabled_) {
    +    5614           0 :     ss << "can not set the reference, the callbacks are disabled";
    +    5615           0 :     ROS_WARN_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    5616           0 :     return std::tuple(false, ss.str());
    +    5617             :   }
    +    5618             : 
    +    5619          49 :   if (!validateReference(reference_in.reference, "ControlManager", "reference")) {
    +    5620           0 :     ss << "incoming reference is not finite!!!";
    +    5621           0 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    5622           0 :     return std::tuple(false, ss.str());
    +    5623             :   }
    +    5624             : 
    +    5625             :   // copy member variables
    +    5626          98 :   auto uav_state        = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +    5627          98 :   auto last_tracker_cmd = mrs_lib::get_mutexed(mutex_last_tracker_cmd_, last_tracker_cmd_);
    +    5628             : 
    +    5629             :   // transform the reference to the current frame
    +    5630          98 :   auto ret = transformer_->transformSingle(reference_in, uav_state.header.frame_id);
    +    5631             : 
    +    5632          49 :   if (!ret) {
    +    5633             : 
    +    5634           0 :     ss << "the reference could not be transformed";
    +    5635           0 :     ROS_WARN_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    5636           0 :     return std::tuple(false, ss.str());
    +    5637             :   }
    +    5638             : 
    +    5639          98 :   mrs_msgs::ReferenceStamped transformed_reference = ret.value();
    +    5640             : 
    +    5641             :   // safety area check
    +    5642          49 :   if (!isPointInSafetyArea3d(transformed_reference)) {
    +    5643           0 :     ss << "failed to set the reference, the point is outside of the safety area!";
    +    5644           0 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    5645           0 :     return std::tuple(false, ss.str());
    +    5646             :   }
    +    5647             : 
    +    5648          49 :   if (last_tracker_cmd) {
    +    5649             : 
    +    5650          49 :     mrs_msgs::ReferenceStamped from_point;
    +    5651          49 :     from_point.header.frame_id      = uav_state.header.frame_id;
    +    5652          49 :     from_point.reference.position.x = last_tracker_cmd->position.x;
    +    5653          49 :     from_point.reference.position.y = last_tracker_cmd->position.y;
    +    5654          49 :     from_point.reference.position.z = last_tracker_cmd->position.z;
    +    5655             : 
    +    5656          49 :     if (!isPathToPointInSafetyArea3d(from_point, transformed_reference)) {
    +    5657           0 :       ss << "failed to set the reference, the path is going outside the safety area!";
    +    5658           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    5659           0 :       return std::tuple(false, ss.str());
    +    5660             :     }
    +    5661             :   }
    +    5662             : 
    +    5663          49 :   mrs_msgs::ReferenceSrvResponse::ConstPtr tracker_response;
    +    5664             : 
    +    5665             :   // prepare the message for current tracker
    +    5666          49 :   mrs_msgs::ReferenceSrvRequest reference_request;
    +    5667          49 :   reference_request.reference = transformed_reference.reference;
    +    5668             : 
    +    5669             :   {
    +    5670          98 :     std::scoped_lock lock(mutex_tracker_list_);
    +    5671             : 
    +    5672         147 :     tracker_response = tracker_list_[active_tracker_idx_]->setReference(
    +    5673         147 :         mrs_msgs::ReferenceSrvRequest::ConstPtr(std::make_unique<mrs_msgs::ReferenceSrvRequest>(reference_request)));
    +    5674             : 
    +    5675          49 :     if (tracker_response != mrs_msgs::ReferenceSrvResponse::Ptr()) {
    +    5676             : 
    +    5677          98 :       return std::tuple(tracker_response->success, tracker_response->message);
    +    5678             : 
    +    5679             :     } else {
    +    5680             : 
    +    5681           0 :       ss << "the tracker '" << _tracker_names_[active_tracker_idx_] << "' does not implement the 'setReference()' function!";
    +    5682           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[ControlManager]: failed to set the reference: " << ss.str());
    +    5683           0 :       return std::tuple(false, ss.str());
    +    5684             :     }
    +    5685             :   }
    +    5686             : }
    +    5687             : 
    +    5688             : //}
    +    5689             : 
    +    5690             : /* setVelocityReference() //{ */
    +    5691             : 
    +    5692         468 : std::tuple<bool, std::string> ControlManager::setVelocityReference(const mrs_msgs::VelocityReferenceStamped& reference_in) {
    +    5693             : 
    +    5694         936 :   std::stringstream ss;
    +    5695             : 
    +    5696         468 :   if (!callbacks_enabled_) {
    +    5697           0 :     ss << "can not set the reference, the callbacks are disabled";
    +    5698           0 :     ROS_WARN_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    5699           0 :     return std::tuple(false, ss.str());
    +    5700             :   }
    +    5701             : 
    +    5702         468 :   if (!validateVelocityReference(reference_in.reference, "ControlManager", "velocity_reference")) {
    +    5703           0 :     ss << "velocity command is not valid!";
    +    5704           0 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    5705           0 :     return std::tuple(false, ss.str());
    +    5706             :   }
    +    5707             : 
    +    5708             :   {
    +    5709         468 :     std::scoped_lock lock(mutex_last_tracker_cmd_);
    +    5710             : 
    +    5711         468 :     if (!last_tracker_cmd_) {
    +    5712           0 :       ss << "could not set velocity command, not flying!";
    +    5713           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    5714           0 :       return std::tuple(false, ss.str());
    +    5715             :     }
    +    5716             :   }
    +    5717             : 
    +    5718             :   // copy member variables
    +    5719         936 :   auto uav_state        = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +    5720         936 :   auto last_tracker_cmd = mrs_lib::get_mutexed(mutex_last_tracker_cmd_, last_tracker_cmd_);
    +    5721             : 
    +    5722             :   // | -- transform the velocity reference to the current frame - |
    +    5723             : 
    +    5724         936 :   mrs_msgs::VelocityReferenceStamped transformed_reference = reference_in;
    +    5725             : 
    +    5726         936 :   auto ret = transformer_->getTransform(reference_in.header.frame_id, uav_state.header.frame_id, reference_in.header.stamp);
    +    5727             : 
    +    5728         936 :   geometry_msgs::TransformStamped tf;
    +    5729             : 
    +    5730         468 :   if (!ret) {
    +    5731           0 :     ss << "could not find tf from " << reference_in.header.frame_id << " to " << uav_state.header.frame_id;
    +    5732           0 :     ROS_WARN_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    5733           0 :     return std::tuple(false, ss.str());
    +    5734             :   } else {
    +    5735         468 :     tf = ret.value();
    +    5736             :   }
    +    5737             : 
    +    5738             :   // transform the velocity
    +    5739             :   {
    +    5740         468 :     geometry_msgs::Vector3Stamped velocity;
    +    5741         468 :     velocity.header   = reference_in.header;
    +    5742         468 :     velocity.vector.x = reference_in.reference.velocity.x;
    +    5743         468 :     velocity.vector.y = reference_in.reference.velocity.y;
    +    5744         468 :     velocity.vector.z = reference_in.reference.velocity.z;
    +    5745             : 
    +    5746         468 :     auto ret = transformer_->transform(velocity, tf);
    +    5747             : 
    +    5748         468 :     if (!ret) {
    +    5749             : 
    +    5750           0 :       ss << "the velocity reference could not be transformed";
    +    5751           0 :       ROS_WARN_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    5752           0 :       return std::tuple(false, ss.str());
    +    5753             : 
    +    5754             :     } else {
    +    5755         468 :       transformed_reference.reference.velocity.x = ret->vector.x;
    +    5756         468 :       transformed_reference.reference.velocity.y = ret->vector.y;
    +    5757         468 :       transformed_reference.reference.velocity.z = ret->vector.z;
    +    5758             :     }
    +    5759             :   }
    +    5760             : 
    +    5761             :   // transform the z and the heading
    +    5762             :   {
    +    5763         468 :     geometry_msgs::PoseStamped pose;
    +    5764         468 :     pose.header           = reference_in.header;
    +    5765         468 :     pose.pose.position.x  = 0;
    +    5766         468 :     pose.pose.position.y  = 0;
    +    5767         468 :     pose.pose.position.z  = reference_in.reference.altitude;
    +    5768         468 :     pose.pose.orientation = mrs_lib::AttitudeConverter(0, 0, reference_in.reference.heading);
    +    5769             : 
    +    5770         468 :     auto ret = transformer_->transform(pose, tf);
    +    5771             : 
    +    5772         468 :     if (!ret) {
    +    5773             : 
    +    5774           0 :       ss << "the velocity reference could not be transformed";
    +    5775           0 :       ROS_WARN_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    5776           0 :       return std::tuple(false, ss.str());
    +    5777             : 
    +    5778             :     } else {
    +    5779         468 :       transformed_reference.reference.altitude = ret->pose.position.z;
    +    5780         468 :       transformed_reference.reference.heading  = mrs_lib::AttitudeConverter(ret->pose.orientation).getHeading();
    +    5781             :     }
    +    5782             :   }
    +    5783             : 
    +    5784             :   // the heading rate doees not need to be transformed
    +    5785         468 :   transformed_reference.reference.heading_rate = reference_in.reference.heading_rate;
    +    5786             : 
    +    5787         468 :   transformed_reference.header.stamp    = tf.header.stamp;
    +    5788         468 :   transformed_reference.header.frame_id = transformer_->frame_to(tf);
    +    5789             : 
    +    5790         936 :   mrs_msgs::ReferenceStamped eqivalent_reference = velocityReferenceToReference(transformed_reference);
    +    5791             : 
    +    5792         468 :   ROS_DEBUG("[ControlManager]: equivalent reference: %.2f, %.2f, %.2f, %.2f", eqivalent_reference.reference.position.x,
    +    5793             :             eqivalent_reference.reference.position.y, eqivalent_reference.reference.position.z, eqivalent_reference.reference.heading);
    +    5794             : 
    +    5795             :   // safety area check
    +    5796         468 :   if (!isPointInSafetyArea3d(eqivalent_reference)) {
    +    5797           0 :     ss << "failed to set the reference, the point is outside of the safety area!";
    +    5798           0 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    5799           0 :     return std::tuple(false, ss.str());
    +    5800             :   }
    +    5801             : 
    +    5802         468 :   if (last_tracker_cmd) {
    +    5803             : 
    +    5804         468 :     mrs_msgs::ReferenceStamped from_point;
    +    5805         468 :     from_point.header.frame_id      = uav_state.header.frame_id;
    +    5806         468 :     from_point.reference.position.x = last_tracker_cmd->position.x;
    +    5807         468 :     from_point.reference.position.y = last_tracker_cmd->position.y;
    +    5808         468 :     from_point.reference.position.z = last_tracker_cmd->position.z;
    +    5809             : 
    +    5810         468 :     if (!isPathToPointInSafetyArea3d(from_point, eqivalent_reference)) {
    +    5811           0 :       ss << "failed to set the reference, the path is going outside the safety area!";
    +    5812           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    5813           0 :       return std::tuple(false, ss.str());
    +    5814             :     }
    +    5815             :   }
    +    5816             : 
    +    5817         468 :   mrs_msgs::VelocityReferenceSrvResponse::ConstPtr tracker_response;
    +    5818             : 
    +    5819             :   // prepare the message for current tracker
    +    5820         468 :   mrs_msgs::VelocityReferenceSrvRequest reference_request;
    +    5821         468 :   reference_request.reference = transformed_reference.reference;
    +    5822             : 
    +    5823             :   {
    +    5824         936 :     std::scoped_lock lock(mutex_tracker_list_);
    +    5825             : 
    +    5826        1404 :     tracker_response = tracker_list_[active_tracker_idx_]->setVelocityReference(
    +    5827        1404 :         mrs_msgs::VelocityReferenceSrvRequest::ConstPtr(std::make_unique<mrs_msgs::VelocityReferenceSrvRequest>(reference_request)));
    +    5828             : 
    +    5829         468 :     if (tracker_response != mrs_msgs::VelocityReferenceSrvResponse::Ptr()) {
    +    5830             : 
    +    5831         936 :       return std::tuple(tracker_response->success, tracker_response->message);
    +    5832             : 
    +    5833             :     } else {
    +    5834             : 
    +    5835           0 :       ss << "the tracker '" << _tracker_names_[active_tracker_idx_] << "' does not implement the 'setVelocityReference()' function!";
    +    5836           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[ControlManager]: failed to set the velocity reference: " << ss.str());
    +    5837           0 :       return std::tuple(false, ss.str());
    +    5838             :     }
    +    5839             :   }
    +    5840             : }
    +    5841             : 
    +    5842             : //}
    +    5843             : 
    +    5844             : /* setTrajectoryReference() //{ */
    +    5845             : 
    +    5846           4 : std::tuple<bool, std::string, bool, std::vector<std::string>, std::vector<bool>, std::vector<std::string>> ControlManager::setTrajectoryReference(
    +    5847             :     const mrs_msgs::TrajectoryReference trajectory_in) {
    +    5848             : 
    +    5849           8 :   auto uav_state = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +    5850             : 
    +    5851           8 :   std::stringstream ss;
    +    5852             : 
    +    5853           4 :   if (!callbacks_enabled_) {
    +    5854           0 :     ss << "can not set the reference, the callbacks are disabled";
    +    5855           0 :     ROS_WARN_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    5856           0 :     return std::tuple(false, ss.str(), false, std::vector<std::string>(), std::vector<bool>(), std::vector<std::string>());
    +    5857             :   }
    +    5858             : 
    +    5859             :   /* validate the size and check for NaNs //{ */
    +    5860             : 
    +    5861             :   // check for the size 0, which is invalid
    +    5862           4 :   if (trajectory_in.points.size() == 0) {
    +    5863             : 
    +    5864           0 :     ss << "can not load trajectory with size 0";
    +    5865           0 :     ROS_WARN_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    5866           0 :     return std::tuple(false, ss.str(), false, std::vector<std::string>(), std::vector<bool>(), std::vector<std::string>());
    +    5867             :   }
    +    5868             : 
    +    5869         584 :   for (int i = 0; i < int(trajectory_in.points.size()); i++) {
    +    5870             : 
    +    5871             :     // check the point for NaN/inf
    +    5872         580 :     bool valid = validateReference(trajectory_in.points[i], "ControlManager", "trajectory_in.points[]");
    +    5873             : 
    +    5874         580 :     if (!valid) {
    +    5875             : 
    +    5876           0 :       ss << "trajectory contains NaNs/infs.";
    +    5877           0 :       ROS_WARN_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    5878           0 :       return std::tuple(false, ss.str(), false, std::vector<std::string>(), std::vector<bool>(), std::vector<std::string>());
    +    5879             :     }
    +    5880             :   }
    +    5881             : 
    +    5882             :   //}
    +    5883             : 
    +    5884             :   /* publish the debugging topics of the original trajectory //{ */
    +    5885             : 
    +    5886             :   {
    +    5887             : 
    +    5888           8 :     geometry_msgs::PoseArray debug_trajectory_out;
    +    5889           4 :     debug_trajectory_out.header = trajectory_in.header;
    +    5890             : 
    +    5891           4 :     debug_trajectory_out.header.frame_id = transformer_->resolveFrame(debug_trajectory_out.header.frame_id);
    +    5892             : 
    +    5893           4 :     if (debug_trajectory_out.header.stamp == ros::Time(0)) {
    +    5894           2 :       debug_trajectory_out.header.stamp = ros::Time::now();
    +    5895             :     }
    +    5896             : 
    +    5897         580 :     for (int i = 0; i < int(trajectory_in.points.size()) - 1; i++) {
    +    5898             : 
    +    5899         576 :       geometry_msgs::Pose new_pose;
    +    5900             : 
    +    5901         576 :       new_pose.position.x = trajectory_in.points[i].position.x;
    +    5902         576 :       new_pose.position.y = trajectory_in.points[i].position.y;
    +    5903         576 :       new_pose.position.z = trajectory_in.points[i].position.z;
    +    5904             : 
    +    5905         576 :       new_pose.orientation = mrs_lib::AttitudeConverter(0, 0, trajectory_in.points[i].heading);
    +    5906             : 
    +    5907         576 :       debug_trajectory_out.poses.push_back(new_pose);
    +    5908             :     }
    +    5909             : 
    +    5910           4 :     pub_debug_original_trajectory_poses_.publish(debug_trajectory_out);
    +    5911             : 
    +    5912           8 :     visualization_msgs::MarkerArray msg_out;
    +    5913             : 
    +    5914           8 :     visualization_msgs::Marker marker;
    +    5915             : 
    +    5916           4 :     marker.header = trajectory_in.header;
    +    5917             : 
    +    5918           4 :     marker.header.frame_id = transformer_->resolveFrame(marker.header.frame_id);
    +    5919             : 
    +    5920           4 :     if (marker.header.frame_id == "") {
    +    5921           0 :       marker.header.frame_id = uav_state.header.frame_id;
    +    5922             :     }
    +    5923             : 
    +    5924           4 :     if (marker.header.stamp == ros::Time(0)) {
    +    5925           2 :       marker.header.stamp = ros::Time::now();
    +    5926             :     }
    +    5927             : 
    +    5928           4 :     marker.type             = visualization_msgs::Marker::LINE_LIST;
    +    5929           4 :     marker.color.a          = 1;
    +    5930           4 :     marker.scale.x          = 0.05;
    +    5931           4 :     marker.color.r          = 0;
    +    5932           4 :     marker.color.g          = 1;
    +    5933           4 :     marker.color.b          = 0;
    +    5934           4 :     marker.pose.orientation = mrs_lib::AttitudeConverter(0, 0, 0);
    +    5935             : 
    +    5936         580 :     for (int i = 0; i < int(trajectory_in.points.size()) - 1; i++) {
    +    5937             : 
    +    5938         576 :       geometry_msgs::Point point1;
    +    5939             : 
    +    5940         576 :       point1.x = trajectory_in.points[i].position.x;
    +    5941         576 :       point1.y = trajectory_in.points[i].position.y;
    +    5942         576 :       point1.z = trajectory_in.points[i].position.z;
    +    5943             : 
    +    5944         576 :       marker.points.push_back(point1);
    +    5945             : 
    +    5946         576 :       geometry_msgs::Point point2;
    +    5947             : 
    +    5948         576 :       point2.x = trajectory_in.points[i + 1].position.x;
    +    5949         576 :       point2.y = trajectory_in.points[i + 1].position.y;
    +    5950         576 :       point2.z = trajectory_in.points[i + 1].position.z;
    +    5951             : 
    +    5952         576 :       marker.points.push_back(point2);
    +    5953             :     }
    +    5954             : 
    +    5955           4 :     msg_out.markers.push_back(marker);
    +    5956             : 
    +    5957           4 :     pub_debug_original_trajectory_markers_.publish(msg_out);
    +    5958             :   }
    +    5959             : 
    +    5960             :   //}
    +    5961             : 
    +    5962           8 :   mrs_msgs::TrajectoryReference processed_trajectory = trajectory_in;
    +    5963             : 
    +    5964           4 :   int trajectory_size = int(processed_trajectory.points.size());
    +    5965             : 
    +    5966           4 :   bool trajectory_modified = false;
    +    5967             : 
    +    5968             :   /* safety area check //{ */
    +    5969             : 
    +    5970           4 :   if (use_safety_area_) {
    +    5971             : 
    +    5972           4 :     int last_valid_idx    = 0;
    +    5973           4 :     int first_invalid_idx = -1;
    +    5974             : 
    +    5975           4 :     double min_z = getMinZ(processed_trajectory.header.frame_id);
    +    5976           4 :     double max_z = getMaxZ(processed_trajectory.header.frame_id);
    +    5977             : 
    +    5978         584 :     for (int i = 0; i < trajectory_size; i++) {
    +    5979             : 
    +    5980         580 :       if (_snap_trajectory_to_safety_area_) {
    +    5981             : 
    +    5982             :         // saturate the trajectory to min and max Z
    +    5983           0 :         if (processed_trajectory.points[i].position.z < min_z) {
    +    5984             : 
    +    5985           0 :           processed_trajectory.points[i].position.z = min_z;
    +    5986           0 :           ROS_WARN_THROTTLE(1.0, "[ControlManager]: the trajectory violates the minimum Z!");
    +    5987           0 :           trajectory_modified = true;
    +    5988             :         }
    +    5989             : 
    +    5990           0 :         if (processed_trajectory.points[i].position.z > max_z) {
    +    5991             : 
    +    5992           0 :           processed_trajectory.points[i].position.z = max_z;
    +    5993           0 :           ROS_WARN_THROTTLE(1.0, "[ControlManager]: the trajectory violates the maximum Z!");
    +    5994           0 :           trajectory_modified = true;
    +    5995             :         }
    +    5996             :       }
    +    5997             : 
    +    5998             :       // check the point against the safety area
    +    5999         580 :       mrs_msgs::ReferenceStamped des_reference;
    +    6000         580 :       des_reference.header    = processed_trajectory.header;
    +    6001         580 :       des_reference.reference = processed_trajectory.points[i];
    +    6002             : 
    +    6003         580 :       if (!isPointInSafetyArea3d(des_reference)) {
    +    6004             : 
    +    6005           0 :         ROS_WARN_THROTTLE(1.0, "[ControlManager]: the trajectory contains points outside of the safety area!");
    +    6006           0 :         trajectory_modified = true;
    +    6007             : 
    +    6008             :         // the first invalid point
    +    6009           0 :         if (first_invalid_idx == -1) {
    +    6010             : 
    +    6011           0 :           first_invalid_idx = i;
    +    6012             : 
    +    6013           0 :           last_valid_idx = i - 1;
    +    6014             :         }
    +    6015             : 
    +    6016             :         // the point is ok
    +    6017             :       } else {
    +    6018             : 
    +    6019             :         // we found a point, which is ok, after finding a point which was not ok
    +    6020         580 :         if (first_invalid_idx != -1) {
    +    6021             : 
    +    6022             :           // special case, we had no valid point so far
    +    6023           0 :           if (last_valid_idx == -1) {
    +    6024             : 
    +    6025           0 :             ss << "the trajectory starts outside of the safety area!";
    +    6026           0 :             ROS_WARN_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    6027           0 :             return std::tuple(false, ss.str(), false, std::vector<std::string>(), std::vector<bool>(), std::vector<std::string>());
    +    6028             : 
    +    6029             :             // we have a valid point in the past
    +    6030             :           } else {
    +    6031             : 
    +    6032           0 :             if (!_snap_trajectory_to_safety_area_) {
    +    6033           0 :               break;
    +    6034             :             }
    +    6035             : 
    +    6036           0 :             bool interpolation_success = true;
    +    6037             : 
    +    6038             :             // iterpolate between the last valid point and this new valid point
    +    6039           0 :             double angle = atan2((processed_trajectory.points[i].position.y - processed_trajectory.points[last_valid_idx].position.y),
    +    6040           0 :                                  (processed_trajectory.points[i].position.x - processed_trajectory.points[last_valid_idx].position.x));
    +    6041             : 
    +    6042             :             double dist_two_points =
    +    6043           0 :                 mrs_lib::geometry::dist(vec2_t(processed_trajectory.points[i].position.x, processed_trajectory.points[i].position.y),
    +    6044           0 :                                         vec2_t(processed_trajectory.points[last_valid_idx].position.x, processed_trajectory.points[last_valid_idx].position.y));
    +    6045           0 :             double step = dist_two_points / (i - last_valid_idx);
    +    6046             : 
    +    6047           0 :             for (int j = last_valid_idx; j < i; j++) {
    +    6048             : 
    +    6049           0 :               mrs_msgs::ReferenceStamped temp_point;
    +    6050           0 :               temp_point.header.frame_id      = processed_trajectory.header.frame_id;
    +    6051           0 :               temp_point.reference.position.x = processed_trajectory.points[last_valid_idx].position.x + (j - last_valid_idx) * cos(angle) * step;
    +    6052           0 :               temp_point.reference.position.y = processed_trajectory.points[last_valid_idx].position.y + (j - last_valid_idx) * sin(angle) * step;
    +    6053             : 
    +    6054           0 :               if (!isPointInSafetyArea2d(temp_point)) {
    +    6055             : 
    +    6056           0 :                 interpolation_success = false;
    +    6057           0 :                 break;
    +    6058             : 
    +    6059             :               } else {
    +    6060             : 
    +    6061           0 :                 processed_trajectory.points[j].position.x = temp_point.reference.position.x;
    +    6062           0 :                 processed_trajectory.points[j].position.y = temp_point.reference.position.y;
    +    6063             :               }
    +    6064             :             }
    +    6065             : 
    +    6066           0 :             if (!interpolation_success) {
    +    6067           0 :               break;
    +    6068             :             }
    +    6069             :           }
    +    6070             : 
    +    6071           0 :           first_invalid_idx = -1;
    +    6072             :         }
    +    6073             :       }
    +    6074             :     }
    +    6075             : 
    +    6076             :     // special case, the trajectory does not end with a valid point
    +    6077           4 :     if (first_invalid_idx != -1) {
    +    6078             : 
    +    6079             :       // super special case, the whole trajectory is invalid
    +    6080           0 :       if (first_invalid_idx == 0) {
    +    6081             : 
    +    6082           0 :         ss << "the whole trajectory is outside of the safety area!";
    +    6083           0 :         ROS_WARN_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    6084           0 :         return std::tuple(false, ss.str(), false, std::vector<std::string>(), std::vector<bool>(), std::vector<std::string>());
    +    6085             : 
    +    6086             :         // there is a good portion of the trajectory in the beginning
    +    6087             :       } else {
    +    6088             : 
    +    6089           0 :         trajectory_size = last_valid_idx + 1;
    +    6090           0 :         processed_trajectory.points.resize(trajectory_size);
    +    6091           0 :         trajectory_modified = true;
    +    6092             :       }
    +    6093             :     }
    +    6094             :   }
    +    6095             : 
    +    6096           4 :   if (trajectory_size == 0) {
    +    6097             : 
    +    6098           0 :     ss << "the trajectory happened to be empty after all the checks! This message should not appear!";
    +    6099           0 :     ROS_WARN_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    6100           0 :     return std::tuple(false, ss.str(), false, std::vector<std::string>(), std::vector<bool>(), std::vector<std::string>());
    +    6101             :   }
    +    6102             : 
    +    6103             :   //}
    +    6104             : 
    +    6105             :   /* transform the trajectory to the current control frame //{ */
    +    6106             : 
    +    6107           4 :   std::optional<geometry_msgs::TransformStamped> tf_traj_state;
    +    6108             : 
    +    6109           4 :   if (processed_trajectory.header.stamp > ros::Time::now()) {
    +    6110           0 :     tf_traj_state = transformer_->getTransform(processed_trajectory.header.frame_id, "", processed_trajectory.header.stamp);
    +    6111             :   } else {
    +    6112           4 :     tf_traj_state = transformer_->getTransform(processed_trajectory.header.frame_id, "", uav_state_.header.stamp);
    +    6113             :   }
    +    6114             : 
    +    6115           4 :   if (!tf_traj_state) {
    +    6116           0 :     ss << "could not create TF transformer for the trajectory";
    +    6117           0 :     ROS_WARN_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    6118           0 :     return std::tuple(false, ss.str(), false, std::vector<std::string>(), std::vector<bool>(), std::vector<std::string>());
    +    6119             :   }
    +    6120             : 
    +    6121           4 :   processed_trajectory.header.frame_id = transformer_->frame_to(*tf_traj_state);
    +    6122             : 
    +    6123         584 :   for (int i = 0; i < trajectory_size; i++) {
    +    6124             : 
    +    6125         580 :     mrs_msgs::ReferenceStamped trajectory_point;
    +    6126         580 :     trajectory_point.header    = processed_trajectory.header;
    +    6127         580 :     trajectory_point.reference = processed_trajectory.points[i];
    +    6128             : 
    +    6129         580 :     auto ret = transformer_->transform(trajectory_point, *tf_traj_state);
    +    6130             : 
    +    6131         580 :     if (!ret) {
    +    6132             : 
    +    6133           0 :       ss << "trajectory cannnot be transformed";
    +    6134           0 :       ROS_WARN_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    6135           0 :       return std::tuple(false, ss.str(), false, std::vector<std::string>(), std::vector<bool>(), std::vector<std::string>());
    +    6136             : 
    +    6137             :     } else {
    +    6138             : 
    +    6139             :       // transform the points in the trajectory to the current frame
    +    6140         580 :       processed_trajectory.points[i] = ret.value().reference;
    +    6141             :     }
    +    6142             :   }
    +    6143             : 
    +    6144             :   //}
    +    6145             : 
    +    6146           4 :   mrs_msgs::TrajectoryReferenceSrvResponse::ConstPtr response;
    +    6147           8 :   mrs_msgs::TrajectoryReferenceSrvRequest            request;
    +    6148             : 
    +    6149             :   // check for empty trajectory
    +    6150           4 :   if (processed_trajectory.points.size() == 0) {
    +    6151           0 :     ss << "reference trajectory was processing and it is now empty, this should not happen!";
    +    6152           0 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    6153           0 :     return std::tuple(false, ss.str(), false, std::vector<std::string>(), std::vector<bool>(), std::vector<std::string>());
    +    6154             :   }
    +    6155             : 
    +    6156             :   // prepare the message for current tracker
    +    6157           4 :   request.trajectory = processed_trajectory;
    +    6158             : 
    +    6159             :   bool                     success;
    +    6160           8 :   std::string              message;
    +    6161             :   bool                     modified;
    +    6162           8 :   std::vector<std::string> tracker_names;
    +    6163           8 :   std::vector<bool>        tracker_successes;
    +    6164           8 :   std::vector<std::string> tracker_messages;
    +    6165             : 
    +    6166             :   {
    +    6167           8 :     std::scoped_lock lock(mutex_tracker_list_);
    +    6168             : 
    +    6169             :     // set the trajectory to the currently active tracker
    +    6170          12 :     response = tracker_list_[active_tracker_idx_]->setTrajectoryReference(
    +    6171          12 :         mrs_msgs::TrajectoryReferenceSrvRequest::ConstPtr(std::make_unique<mrs_msgs::TrajectoryReferenceSrvRequest>(request)));
    +    6172             : 
    +    6173           4 :     tracker_names.push_back(_tracker_names_[active_tracker_idx_]);
    +    6174             : 
    +    6175           4 :     if (response != mrs_msgs::TrajectoryReferenceSrvResponse::Ptr()) {
    +    6176             : 
    +    6177           3 :       success  = response->success;
    +    6178           3 :       message  = response->message;
    +    6179           3 :       modified = response->modified || trajectory_modified;
    +    6180           3 :       tracker_successes.push_back(response->success);
    +    6181           3 :       tracker_messages.push_back(response->message);
    +    6182             : 
    +    6183             :     } else {
    +    6184             : 
    +    6185           1 :       ss << "the active tracker '" << _tracker_names_[active_tracker_idx_] << "' does not implement the 'setTrajectoryReference()' function!";
    +    6186           1 :       ROS_WARN_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    6187             : 
    +    6188           1 :       success  = true;
    +    6189           1 :       message  = ss.str();
    +    6190           1 :       modified = false;
    +    6191           1 :       tracker_successes.push_back(false);
    +    6192           1 :       tracker_messages.push_back(ss.str());
    +    6193             :     }
    +    6194             : 
    +    6195             :     // set the trajectory to the non-active trackers
    +    6196          28 :     for (size_t i = 0; i < tracker_list_.size(); i++) {
    +    6197             : 
    +    6198          24 :       if (i != active_tracker_idx_) {
    +    6199             : 
    +    6200          20 :         tracker_names.push_back(_tracker_names_[i]);
    +    6201             : 
    +    6202          60 :         response = tracker_list_[i]->setTrajectoryReference(
    +    6203          60 :             mrs_msgs::TrajectoryReferenceSrvRequest::ConstPtr(std::make_unique<mrs_msgs::TrajectoryReferenceSrvRequest>(request)));
    +    6204             : 
    +    6205          20 :         if (response != mrs_msgs::TrajectoryReferenceSrvResponse::Ptr()) {
    +    6206             : 
    +    6207           1 :           tracker_successes.push_back(response->success);
    +    6208           1 :           tracker_messages.push_back(response->message);
    +    6209             : 
    +    6210           1 :           if (response->success) {
    +    6211           2 :             std::stringstream ss;
    +    6212           1 :             ss << "trajectory loaded to non-active tracker '" << _tracker_names_[i];
    +    6213           1 :             ROS_INFO_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    6214             :           }
    +    6215             : 
    +    6216             :         } else {
    +    6217             : 
    +    6218          19 :           std::stringstream ss;
    +    6219          19 :           ss << "the tracker \"" << _tracker_names_[i] << "\" does not implement setTrajectoryReference()";
    +    6220          19 :           tracker_successes.push_back(false);
    +    6221          19 :           tracker_messages.push_back(ss.str());
    +    6222             :         }
    +    6223             :       }
    +    6224             :     }
    +    6225             :   }
    +    6226             : 
    +    6227           4 :   return std::tuple(success, message, modified, tracker_names, tracker_successes, tracker_messages);
    +    6228             : }
    +    6229             : 
    +    6230             : //}
    +    6231             : 
    +    6232             : /* isOffboard() //{ */
    +    6233             : 
    +    6234          18 : bool ControlManager::isOffboard(void) {
    +    6235             : 
    +    6236          18 :   if (!sh_hw_api_status_.hasMsg()) {
    +    6237           0 :     return false;
    +    6238             :   }
    +    6239             : 
    +    6240          18 :   mrs_msgs::HwApiStatusConstPtr hw_api_status = sh_hw_api_status_.getMsg();
    +    6241             : 
    +    6242          18 :   return hw_api_status->connected && hw_api_status->offboard;
    +    6243             : }
    +    6244             : 
    +    6245             : //}
    +    6246             : 
    +    6247             : /* setCallbacks() //{ */
    +    6248             : 
    +    6249          95 : void ControlManager::setCallbacks(bool in) {
    +    6250             : 
    +    6251          95 :   callbacks_enabled_ = in;
    +    6252             : 
    +    6253          95 :   std_srvs::SetBoolRequest req_enable_callbacks;
    +    6254          95 :   req_enable_callbacks.data = callbacks_enabled_;
    +    6255             : 
    +    6256             :   {
    +    6257         190 :     std::scoped_lock lock(mutex_tracker_list_);
    +    6258             : 
    +    6259             :     // set callbacks to all trackers
    +    6260         665 :     for (int i = 0; i < int(tracker_list_.size()); i++) {
    +    6261         570 :       tracker_list_[i]->enableCallbacks(std_srvs::SetBoolRequest::ConstPtr(std::make_unique<std_srvs::SetBoolRequest>(req_enable_callbacks)));
    +    6262             :     }
    +    6263             :   }
    +    6264          95 : }
    +    6265             : 
    +    6266             : //}
    +    6267             : 
    +    6268             : /* publishDiagnostics() //{ */
    +    6269             : 
    +    6270       16355 : void ControlManager::publishDiagnostics(void) {
    +    6271             : 
    +    6272       16355 :   if (!is_initialized_) {
    +    6273           0 :     return;
    +    6274             :   }
    +    6275             : 
    +    6276       49065 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("publishDiagnostics");
    +    6277       49065 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("ControlManager::publishDiagnostics", scope_timer_logger_, scope_timer_enabled_);
    +    6278             : 
    +    6279       32710 :   std::scoped_lock lock(mutex_diagnostics_);
    +    6280             : 
    +    6281       32710 :   mrs_msgs::ControlManagerDiagnostics diagnostics_msg;
    +    6282             : 
    +    6283       16355 :   diagnostics_msg.stamp    = ros::Time::now();
    +    6284       16355 :   diagnostics_msg.uav_name = _uav_name_;
    +    6285             : 
    +    6286       16355 :   diagnostics_msg.desired_uav_state_rate = desired_uav_state_rate_;
    +    6287             : 
    +    6288       16355 :   diagnostics_msg.output_enabled = output_enabled_;
    +    6289             : 
    +    6290       16355 :   diagnostics_msg.joystick_active = rc_goto_active_;
    +    6291             : 
    +    6292             :   {
    +    6293       16355 :     std::scoped_lock lock(mutex_tracker_list_, mutex_controller_list_);
    +    6294             : 
    +    6295       16355 :     diagnostics_msg.flying_normally = isFlyingNormally();
    +    6296             :   }
    +    6297             : 
    +    6298       16355 :   diagnostics_msg.bumper_active = bumper_repulsing_;
    +    6299             : 
    +    6300             :   // | ----------------- fill the tracker status ---------------- |
    +    6301             : 
    +    6302             :   {
    +    6303       32710 :     std::scoped_lock lock(mutex_tracker_list_);
    +    6304             : 
    +    6305       16355 :     mrs_msgs::TrackerStatus tracker_status;
    +    6306             : 
    +    6307       16355 :     diagnostics_msg.active_tracker = _tracker_names_[active_tracker_idx_];
    +    6308       16355 :     diagnostics_msg.tracker_status = tracker_list_[active_tracker_idx_]->getStatus();
    +    6309             :   }
    +    6310             : 
    +    6311             :   // | --------------- fill the controller status --------------- |
    +    6312             : 
    +    6313             :   {
    +    6314       32710 :     std::scoped_lock lock(mutex_controller_list_);
    +    6315             : 
    +    6316       16355 :     mrs_msgs::ControllerStatus controller_status;
    +    6317             : 
    +    6318       16355 :     diagnostics_msg.active_controller = _controller_names_[active_controller_idx_];
    +    6319       16355 :     diagnostics_msg.controller_status = controller_list_[active_controller_idx_]->getStatus();
    +    6320             :   }
    +    6321             : 
    +    6322             :   // | ------------ fill in the available controllers ----------- |
    +    6323             : 
    +    6324       98130 :   for (int i = 0; i < int(_controller_names_.size()); i++) {
    +    6325       81775 :     if ((_controller_names_[i] != _failsafe_controller_name_) && (_controller_names_[i] != _eland_controller_name_)) {
    +    6326       49065 :       diagnostics_msg.available_controllers.push_back(_controller_names_[i]);
    +    6327       49065 :       diagnostics_msg.human_switchable_controllers.push_back(controllers_.at(_controller_names_[i]).human_switchable);
    +    6328             :     }
    +    6329             :   }
    +    6330             : 
    +    6331             :   // | ------------- fill in the available trackers ------------- |
    +    6332             : 
    +    6333      114706 :   for (int i = 0; i < int(_tracker_names_.size()); i++) {
    +    6334       98351 :     if (_tracker_names_[i] != _null_tracker_name_) {
    +    6335       81996 :       diagnostics_msg.available_trackers.push_back(_tracker_names_[i]);
    +    6336       81996 :       diagnostics_msg.human_switchable_trackers.push_back(trackers_.at(_tracker_names_[i]).human_switchable);
    +    6337             :     }
    +    6338             :   }
    +    6339             : 
    +    6340             :   // | ------------------------- publish ------------------------ |
    +    6341             : 
    +    6342       16355 :   ph_diagnostics_.publish(diagnostics_msg);
    +    6343             : }
    +    6344             : 
    +    6345             : //}
    +    6346             : 
    +    6347             : /* setConstraintsToTrackers() //{ */
    +    6348             : 
    +    6349         298 : void ControlManager::setConstraintsToTrackers(const mrs_msgs::DynamicsConstraintsSrvRequest& constraints) {
    +    6350             : 
    +    6351         894 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("setConstraintsToTrackers");
    +    6352         894 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("ControlManager::setConstraintsToTrackers", scope_timer_logger_, scope_timer_enabled_);
    +    6353             : 
    +    6354         298 :   mrs_msgs::DynamicsConstraintsSrvResponse::ConstPtr response;
    +    6355             : 
    +    6356             :   {
    +    6357         596 :     std::scoped_lock lock(mutex_tracker_list_);
    +    6358             : 
    +    6359             :     // for each tracker
    +    6360        2089 :     for (int i = 0; i < int(tracker_list_.size()); i++) {
    +    6361             : 
    +    6362             :       // if it is the active one, update and retrieve the command
    +    6363        5373 :       response = tracker_list_[i]->setConstraints(
    +    6364        5373 :           mrs_msgs::DynamicsConstraintsSrvRequest::ConstPtr(std::make_unique<mrs_msgs::DynamicsConstraintsSrvRequest>(constraints)));
    +    6365             :     }
    +    6366             :   }
    +    6367         298 : }
    +    6368             : 
    +    6369             : //}
    +    6370             : 
    +    6371             : /* setConstraintsToControllers() //{ */
    +    6372             : 
    +    6373         360 : void ControlManager::setConstraintsToControllers(const mrs_msgs::DynamicsConstraintsSrvRequest& constraints) {
    +    6374             : 
    +    6375        1080 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("setConstraintsToControllers");
    +    6376        1080 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("ControlManager::setConstraintsToControllers", scope_timer_logger_, scope_timer_enabled_);
    +    6377             : 
    +    6378         360 :   mrs_msgs::DynamicsConstraintsSrvResponse::ConstPtr response;
    +    6379             : 
    +    6380             :   {
    +    6381         720 :     std::scoped_lock lock(mutex_controller_list_);
    +    6382             : 
    +    6383             :     // for each controller
    +    6384        2160 :     for (int i = 0; i < int(controller_list_.size()); i++) {
    +    6385             : 
    +    6386             :       // if it is the active one, update and retrieve the command
    +    6387        5400 :       response = controller_list_[i]->setConstraints(
    +    6388        5400 :           mrs_msgs::DynamicsConstraintsSrvRequest::ConstPtr(std::make_unique<mrs_msgs::DynamicsConstraintsSrvRequest>(constraints)));
    +    6389             :     }
    +    6390             :   }
    +    6391         360 : }
    +    6392             : 
    +    6393             : //}
    +    6394             : 
    +    6395             : /* setConstraints() //{ */
    +    6396             : 
    +    6397          91 : void ControlManager::setConstraints(const mrs_msgs::DynamicsConstraintsSrvRequest& constraints) {
    +    6398             : 
    +    6399         273 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("setConstraints");
    +    6400         273 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("ControlManager::setConstraints", scope_timer_logger_, scope_timer_enabled_);
    +    6401             : 
    +    6402          91 :   mrs_msgs::DynamicsConstraintsSrvResponse::ConstPtr response;
    +    6403             : 
    +    6404          91 :   setConstraintsToTrackers(constraints);
    +    6405             : 
    +    6406          91 :   setConstraintsToControllers(constraints);
    +    6407          91 : }
    +    6408             : 
    +    6409             : //}
    +    6410             : 
    +    6411             : 
    +    6412             : /* enforceControllerConstraints() //{ */
    +    6413             : 
    +    6414      119764 : std::optional<mrs_msgs::DynamicsConstraintsSrvRequest> ControlManager::enforceControllersConstraints(
    +    6415             :     const mrs_msgs::DynamicsConstraintsSrvRequest& constraints) {
    +    6416             : 
    +    6417             :   // copy member variables
    +    6418      239528 :   auto last_control_output = mrs_lib::get_mutexed(mutex_last_control_output_, last_control_output_);
    +    6419             : 
    +    6420      119764 :   if (!last_control_output.control_output || !last_control_output.diagnostics.controller_enforcing_constraints) {
    +    6421      100667 :     return {};
    +    6422             :   }
    +    6423             : 
    +    6424       19097 :   bool enforcing = false;
    +    6425             : 
    +    6426       19097 :   auto constraints_out = constraints;
    +    6427             : 
    +    6428       38194 :   std::scoped_lock lock(mutex_tracker_list_);
    +    6429             : 
    +    6430             :   // enforce horizontal speed
    +    6431       19097 :   if (last_control_output.diagnostics.horizontal_speed_constraint < constraints.constraints.horizontal_speed) {
    +    6432       13764 :     constraints_out.constraints.horizontal_speed = last_control_output.diagnostics.horizontal_speed_constraint;
    +    6433             : 
    +    6434       13764 :     enforcing = true;
    +    6435             :   }
    +    6436             : 
    +    6437             :   // enforce horizontal acceleration
    +    6438       19097 :   if (last_control_output.diagnostics.horizontal_acc_constraint < constraints.constraints.horizontal_acceleration) {
    +    6439       17471 :     constraints_out.constraints.horizontal_acceleration = last_control_output.diagnostics.horizontal_acc_constraint;
    +    6440             : 
    +    6441       17471 :     enforcing = true;
    +    6442             :   }
    +    6443             : 
    +    6444             :   // enforce vertical ascending speed
    +    6445       19097 :   if (last_control_output.diagnostics.vertical_asc_speed_constraint < constraints.constraints.vertical_ascending_speed) {
    +    6446       13764 :     constraints_out.constraints.vertical_ascending_speed = last_control_output.diagnostics.vertical_asc_speed_constraint;
    +    6447             : 
    +    6448       13764 :     enforcing = true;
    +    6449             :   }
    +    6450             : 
    +    6451             :   // enforce vertical ascending acceleration
    +    6452       19097 :   if (last_control_output.diagnostics.vertical_asc_acc_constraint < constraints.constraints.vertical_ascending_acceleration) {
    +    6453           0 :     constraints_out.constraints.vertical_ascending_acceleration = last_control_output.diagnostics.vertical_asc_acc_constraint;
    +    6454             : 
    +    6455           0 :     enforcing = true;
    +    6456             :   }
    +    6457             : 
    +    6458             :   // enforce vertical descending speed
    +    6459       19097 :   if (last_control_output.diagnostics.vertical_desc_speed_constraint < constraints.constraints.vertical_descending_speed) {
    +    6460       13764 :     constraints_out.constraints.vertical_descending_speed = last_control_output.diagnostics.vertical_desc_speed_constraint;
    +    6461             : 
    +    6462       13764 :     enforcing = true;
    +    6463             :   }
    +    6464             : 
    +    6465             :   // enforce vertical descending acceleration
    +    6466       19097 :   if (last_control_output.diagnostics.vertical_desc_acc_constraint < constraints.constraints.vertical_descending_acceleration) {
    +    6467           0 :     constraints_out.constraints.vertical_descending_acceleration = last_control_output.diagnostics.vertical_desc_acc_constraint;
    +    6468             : 
    +    6469           0 :     enforcing = true;
    +    6470             :   }
    +    6471             : 
    +    6472       19097 :   if (enforcing) {
    +    6473       17471 :     return {constraints_out};
    +    6474             :   } else {
    +    6475        1626 :     return {};
    +    6476             :   }
    +    6477             : }
    +    6478             : 
    +    6479             : //}
    +    6480             : 
    +    6481             : /* isFlyingNormally() //{ */
    +    6482             : 
    +    6483       16660 : bool ControlManager::isFlyingNormally(void) {
    +    6484             : 
    +    6485       14043 :   return callbacks_enabled_ && (output_enabled_) && (offboard_mode_) && (armed_) &&
    +    6486        8703 :          (((active_tracker_idx_ != _ehover_tracker_idx_) && (active_controller_idx_ != _eland_controller_idx_) &&
    +    6487        8703 :            (active_controller_idx_ != _failsafe_controller_idx_)) ||
    +    6488       32890 :           _controller_names_.size() == 1) &&
    +    6489       23176 :          (((active_tracker_idx_ != _null_tracker_idx_) && (active_tracker_idx_ != _landoff_tracker_idx_)) || _tracker_names_.size() == 1);
    +    6490             : }
    +    6491             : 
    +    6492             : //}
    +    6493             : 
    +    6494             : /* //{ getMass() */
    +    6495             : 
    +    6496         471 : double ControlManager::getMass(void) {
    +    6497             : 
    +    6498         942 :   auto last_control_output = mrs_lib::get_mutexed(mutex_last_control_output_, last_control_output_);
    +    6499             : 
    +    6500         471 :   if (last_control_output.diagnostics.mass_estimator) {
    +    6501          14 :     return _uav_mass_ + last_control_output.diagnostics.mass_difference;
    +    6502             :   } else {
    +    6503         457 :     return _uav_mass_;
    +    6504             :   }
    +    6505             : }
    +    6506             : 
    +    6507             : //}
    +    6508             : 
    +    6509             : /* loadConfigFile() //{ */
    +    6510             : 
    +    6511           0 : bool ControlManager::loadConfigFile(const std::string& file_path, const std::string ns) {
    +    6512             : 
    +    6513           0 :   const std::string name_space = nh_.getNamespace() + "/" + ns;
    +    6514             : 
    +    6515           0 :   ROS_INFO("[ControlManager]: loading '%s' under the namespace '%s'", file_path.c_str(), name_space.c_str());
    +    6516             : 
    +    6517             :   // load the user-requested file
    +    6518             :   {
    +    6519           0 :     std::string command = "rosparam load " + file_path + " " + name_space;
    +    6520           0 :     int         result  = std::system(command.c_str());
    +    6521             : 
    +    6522           0 :     if (result != 0) {
    +    6523           0 :       ROS_ERROR("[ControlManager]: failed to load '%s'", file_path.c_str());
    +    6524           0 :       return false;
    +    6525             :     }
    +    6526             :   }
    +    6527             : 
    +    6528             :   // load the platform config
    +    6529           0 :   if (_platform_config_ != "") {
    +    6530           0 :     std::string command = "rosparam load " + _platform_config_ + " " + name_space;
    +    6531           0 :     int         result  = std::system(command.c_str());
    +    6532             : 
    +    6533           0 :     if (result != 0) {
    +    6534           0 :       ROS_ERROR("[ControlManager]: failed to load the platform config file '%s'", _platform_config_.c_str());
    +    6535           0 :       return false;
    +    6536             :     }
    +    6537             :   }
    +    6538             : 
    +    6539             :   // load the custom config
    +    6540           0 :   if (_custom_config_ != "") {
    +    6541           0 :     std::string command = "rosparam load " + _custom_config_ + " " + name_space;
    +    6542           0 :     int         result  = std::system(command.c_str());
    +    6543             : 
    +    6544           0 :     if (result != 0) {
    +    6545           0 :       ROS_ERROR("[ControlManager]: failed to load the custom config file '%s'", _custom_config_.c_str());
    +    6546           0 :       return false;
    +    6547             :     }
    +    6548             :   }
    +    6549             : 
    +    6550           0 :   return true;
    +    6551             : }
    +    6552             : 
    +    6553             : //}
    +    6554             : 
    +    6555             : // | ----------------------- safety area ---------------------- |
    +    6556             : 
    +    6557             : /* //{ isPointInSafetyArea3d() */
    +    6558             : 
    +    6559        1161 : bool ControlManager::isPointInSafetyArea3d(const mrs_msgs::ReferenceStamped& point) {
    +    6560             : 
    +    6561        1161 :   if (!use_safety_area_) {
    +    6562         485 :     return true;
    +    6563             :   }
    +    6564             : 
    +    6565        1352 :   auto tfed_horizontal = transformer_->transformSingle(point, _safety_area_horizontal_frame_);
    +    6566             : 
    +    6567         676 :   if (!tfed_horizontal) {
    +    6568           0 :     ROS_ERROR_THROTTLE(1.0, "[ControlManager]: SafetyArea: Could not transform the point to the safety area horizontal frame");
    +    6569           0 :     return false;
    +    6570             :   }
    +    6571             : 
    +    6572         676 :   if (!safety_zone_->isPointValid(tfed_horizontal->reference.position.x, tfed_horizontal->reference.position.y)) {
    +    6573           0 :     return false;
    +    6574             :   }
    +    6575             : 
    +    6576         676 :   if (point.reference.position.z < getMinZ(point.header.frame_id) || point.reference.position.z > getMaxZ(point.header.frame_id)) {
    +    6577           0 :     return false;
    +    6578             :   }
    +    6579             : 
    +    6580         676 :   return true;
    +    6581             : }
    +    6582             : 
    +    6583             : //}
    +    6584             : 
    +    6585             : /* //{ isPointInSafetyArea2d() */
    +    6586             : 
    +    6587        9942 : bool ControlManager::isPointInSafetyArea2d(const mrs_msgs::ReferenceStamped& point) {
    +    6588             : 
    +    6589        9942 :   if (!use_safety_area_) {
    +    6590         592 :     return true;
    +    6591             :   }
    +    6592             : 
    +    6593       18700 :   auto tfed_horizontal = transformer_->transformSingle(point, _safety_area_horizontal_frame_);
    +    6594             : 
    +    6595        9350 :   if (!tfed_horizontal) {
    +    6596           0 :     ROS_ERROR_THROTTLE(1.0, "[ControlManager]: SafetyArea: Could not transform the point to the safety area horizontal frame");
    +    6597           0 :     return false;
    +    6598             :   }
    +    6599             : 
    +    6600        9350 :   if (!safety_zone_->isPointValid(tfed_horizontal->reference.position.x, tfed_horizontal->reference.position.y)) {
    +    6601          76 :     return false;
    +    6602             :   }
    +    6603             : 
    +    6604        9274 :   return true;
    +    6605             : }
    +    6606             : 
    +    6607             : //}
    +    6608             : 
    +    6609             : /* //{ isPathToPointInSafetyArea3d() */
    +    6610             : 
    +    6611         517 : bool ControlManager::isPathToPointInSafetyArea3d(const mrs_msgs::ReferenceStamped& start, const mrs_msgs::ReferenceStamped& end) {
    +    6612             : 
    +    6613         517 :   if (!use_safety_area_) {
    +    6614         485 :     return true;
    +    6615             :   }
    +    6616             : 
    +    6617          32 :   if (!isPointInSafetyArea3d(start) || !isPointInSafetyArea3d(end)) {
    +    6618           0 :     return false;
    +    6619             :   }
    +    6620             : 
    +    6621          64 :   mrs_msgs::ReferenceStamped start_transformed, end_transformed;
    +    6622             : 
    +    6623             :   {
    +    6624          32 :     auto ret = transformer_->transformSingle(start, _safety_area_horizontal_frame_);
    +    6625             : 
    +    6626          32 :     if (!ret) {
    +    6627             : 
    +    6628           0 :       ROS_ERROR("[ControlManager]: SafetyArea: Could not transform the first point in the path");
    +    6629             : 
    +    6630           0 :       return false;
    +    6631             :     }
    +    6632             : 
    +    6633          32 :     start_transformed = ret.value();
    +    6634             :   }
    +    6635             : 
    +    6636             :   {
    +    6637          32 :     auto ret = transformer_->transformSingle(end, _safety_area_horizontal_frame_);
    +    6638             : 
    +    6639          32 :     if (!ret) {
    +    6640             : 
    +    6641           0 :       ROS_ERROR("[ControlManager]: SafetyArea: Could not transform the first point in the path");
    +    6642             : 
    +    6643           0 :       return false;
    +    6644             :     }
    +    6645             : 
    +    6646          32 :     end_transformed = ret.value();
    +    6647             :   }
    +    6648             : 
    +    6649          32 :   return safety_zone_->isPathValid(start_transformed.reference.position.x, start_transformed.reference.position.y, end_transformed.reference.position.x,
    +    6650          32 :                                    end_transformed.reference.position.y);
    +    6651             : }
    +    6652             : 
    +    6653             : //}
    +    6654             : 
    +    6655             : /* //{ isPathToPointInSafetyArea2d() */
    +    6656             : 
    +    6657          31 : bool ControlManager::isPathToPointInSafetyArea2d(const mrs_msgs::ReferenceStamped& start, const mrs_msgs::ReferenceStamped& end) {
    +    6658             : 
    +    6659          31 :   if (!use_safety_area_) {
    +    6660           0 :     return true;
    +    6661             :   }
    +    6662             : 
    +    6663          62 :   mrs_msgs::ReferenceStamped start_transformed, end_transformed;
    +    6664             : 
    +    6665          31 :   if (!isPointInSafetyArea2d(start) || !isPointInSafetyArea2d(end)) {
    +    6666           0 :     return false;
    +    6667             :   }
    +    6668             : 
    +    6669             :   {
    +    6670          31 :     auto ret = transformer_->transformSingle(start, _safety_area_horizontal_frame_);
    +    6671             : 
    +    6672          31 :     if (!ret) {
    +    6673             : 
    +    6674           0 :       ROS_ERROR("[ControlManager]: SafetyArea: Could not transform the first point in the path");
    +    6675             : 
    +    6676           0 :       return false;
    +    6677             :     }
    +    6678             : 
    +    6679          31 :     start_transformed = ret.value();
    +    6680             :   }
    +    6681             : 
    +    6682             :   {
    +    6683          31 :     auto ret = transformer_->transformSingle(end, _safety_area_horizontal_frame_);
    +    6684             : 
    +    6685          31 :     if (!ret) {
    +    6686             : 
    +    6687           0 :       ROS_ERROR("[ControlManager]: SafetyArea: Could not transform the first point in the path");
    +    6688             : 
    +    6689           0 :       return false;
    +    6690             :     }
    +    6691             : 
    +    6692          31 :     end_transformed = ret.value();
    +    6693             :   }
    +    6694             : 
    +    6695          31 :   return safety_zone_->isPathValid(start_transformed.reference.position.x, start_transformed.reference.position.y, end_transformed.reference.position.x,
    +    6696          31 :                                    end_transformed.reference.position.y);
    +    6697             : }
    +    6698             : 
    +    6699             : //}
    +    6700             : 
    +    6701             : /* //{ getMaxZ() */
    +    6702             : 
    +    6703       11667 : double ControlManager::getMaxZ(const std::string& frame_id) {
    +    6704             : 
    +    6705             :   // | ------- first, calculate max_z from the safety area ------ |
    +    6706             : 
    +    6707       11667 :   double safety_area_max_z = std::numeric_limits<float>::max();
    +    6708             : 
    +    6709             :   {
    +    6710             : 
    +    6711       23334 :     geometry_msgs::PointStamped point;
    +    6712             : 
    +    6713       11667 :     point.header.frame_id = _safety_area_vertical_frame_;
    +    6714       11667 :     point.point.x         = 0;
    +    6715       11667 :     point.point.y         = 0;
    +    6716       11667 :     point.point.z         = _safety_area_max_z_;
    +    6717             : 
    +    6718       11667 :     auto ret = transformer_->transformSingle(point, frame_id);
    +    6719             : 
    +    6720       11667 :     if (!ret) {
    +    6721           0 :       ROS_ERROR_THROTTLE(1.0, "[ControlManager]: SafetyArea: Could not transform safety area's max_z to '%s'", frame_id.c_str());
    +    6722             :     }
    +    6723             : 
    +    6724       11667 :     safety_area_max_z = ret->point.z;
    +    6725             :   }
    +    6726             : 
    +    6727             :   // | ------------ overwrite from estimation manager ----------- |
    +    6728             : 
    +    6729       11667 :   double estimation_manager_max_z = std::numeric_limits<float>::max();
    +    6730             : 
    +    6731             :   {
    +    6732             :     // if possible, override it with max z from the estimation manager
    +    6733       11667 :     if (sh_max_z_.hasMsg()) {
    +    6734             : 
    +    6735       23306 :       auto msg = sh_max_z_.getMsg();
    +    6736             : 
    +    6737             :       // transform it into the safety area frame
    +    6738       23306 :       geometry_msgs::PointStamped point;
    +    6739       11653 :       point.header  = msg->header;
    +    6740       11653 :       point.point.x = 0;
    +    6741       11653 :       point.point.y = 0;
    +    6742       11653 :       point.point.z = msg->value;
    +    6743             : 
    +    6744       11653 :       auto ret = transformer_->transformSingle(point, frame_id);
    +    6745             : 
    +    6746       11653 :       if (!ret) {
    +    6747           0 :         ROS_ERROR_THROTTLE(1.0, "[ControlManager]: SafetyArea: Could not transform estimation manager's max_z to the current control frame");
    +    6748             :       }
    +    6749             : 
    +    6750       11653 :       estimation_manager_max_z = ret->point.z;
    +    6751             :     }
    +    6752             :   }
    +    6753             : 
    +    6754       11667 :   if (estimation_manager_max_z < safety_area_max_z) {
    +    6755       10872 :     return estimation_manager_max_z;
    +    6756             :   } else {
    +    6757         795 :     return safety_area_max_z;
    +    6758             :   }
    +    6759             : }
    +    6760             : 
    +    6761             : //}
    +    6762             : 
    +    6763             : /* //{ getMinZ() */
    +    6764             : 
    +    6765       11667 : double ControlManager::getMinZ(const std::string& frame_id) {
    +    6766             : 
    +    6767       11667 :   if (!use_safety_area_) {
    +    6768           0 :     return std::numeric_limits<double>::lowest();
    +    6769             :   }
    +    6770             : 
    +    6771       23334 :   geometry_msgs::PointStamped point;
    +    6772             : 
    +    6773       11667 :   point.header.frame_id = _safety_area_vertical_frame_;
    +    6774       11667 :   point.point.x         = 0;
    +    6775       11667 :   point.point.y         = 0;
    +    6776       11667 :   point.point.z         = _safety_area_min_z_;
    +    6777             : 
    +    6778       23334 :   auto ret = transformer_->transformSingle(point, frame_id);
    +    6779             : 
    +    6780       11667 :   if (!ret) {
    +    6781           0 :     ROS_ERROR_THROTTLE(1.0, "[ControlManager]: SafetyArea: Could not transform safety area's min_z to '%s'", frame_id.c_str());
    +    6782           0 :     return std::numeric_limits<double>::lowest();
    +    6783             :   }
    +    6784             : 
    +    6785       11667 :   return ret->point.z;
    +    6786             : }
    +    6787             : 
    +    6788             : //}
    +    6789             : 
    +    6790             : // | --------------------- obstacle bumper -------------------- |
    +    6791             : 
    +    6792             : /* bumperPushFromObstacle() //{ */
    +    6793             : 
    +    6794         299 : void ControlManager::bumperPushFromObstacle(void) {
    +    6795             : 
    +    6796             :   // | --------------- fabricate the min distances -------------- |
    +    6797             : 
    +    6798         299 :   double min_distance_horizontal = _bumper_horizontal_distance_;
    +    6799         299 :   double min_distance_vertical   = _bumper_vertical_distance_;
    +    6800             : 
    +    6801         299 :   if (_bumper_horizontal_derive_from_dynamics_ || _bumper_vertical_derive_from_dynamics_) {
    +    6802             : 
    +    6803         299 :     auto constraints = mrs_lib::get_mutexed(mutex_constraints_, current_constraints_);
    +    6804             : 
    +    6805         299 :     if (_bumper_horizontal_derive_from_dynamics_) {
    +    6806             : 
    +    6807         299 :       const double horizontal_t_stop    = constraints.constraints.horizontal_speed / constraints.constraints.horizontal_acceleration;
    +    6808         299 :       const double horizontal_stop_dist = (horizontal_t_stop * constraints.constraints.horizontal_speed) / 2.0;
    +    6809             : 
    +    6810         299 :       min_distance_horizontal += 1.5 * horizontal_stop_dist;
    +    6811             :     }
    +    6812             : 
    +    6813         299 :     if (_bumper_vertical_derive_from_dynamics_) {
    +    6814             : 
    +    6815             : 
    +    6816             :       // larger from the two accelerations
    +    6817         598 :       const double vert_acc = constraints.constraints.vertical_ascending_acceleration > constraints.constraints.vertical_descending_acceleration
    +    6818         299 :                                   ? constraints.constraints.vertical_ascending_acceleration
    +    6819             :                                   : constraints.constraints.vertical_descending_acceleration;
    +    6820             : 
    +    6821             :       // larger from the two speeds
    +    6822         598 :       const double vert_speed = constraints.constraints.vertical_ascending_speed > constraints.constraints.vertical_descending_speed
    +    6823         299 :                                     ? constraints.constraints.vertical_ascending_speed
    +    6824             :                                     : constraints.constraints.vertical_descending_speed;
    +    6825             : 
    +    6826         299 :       const double vertical_t_stop    = vert_speed / vert_acc;
    +    6827         299 :       const double vertical_stop_dist = (vertical_t_stop * vert_speed) / 2.0;
    +    6828             : 
    +    6829         299 :       min_distance_vertical += 1.5 * vertical_stop_dist;
    +    6830             :     }
    +    6831             :   }
    +    6832             : 
    +    6833             :   // | ----------------------------  ---------------------------- |
    +    6834             : 
    +    6835             :   // copy member variables
    +    6836         299 :   mrs_msgs::ObstacleSectorsConstPtr bumper_data = sh_bumper_.getMsg();
    +    6837         299 :   auto                              uav_state   = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +    6838             : 
    +    6839         299 :   double sector_size = TAU / double(bumper_data->n_horizontal_sectors);
    +    6840             : 
    +    6841         299 :   double direction          = 0;
    +    6842         299 :   double repulsion_distance = std::numeric_limits<double>::max();
    +    6843             : 
    +    6844         299 :   bool horizontal_collision_detected = false;
    +    6845         299 :   bool vertical_collision_detected   = false;
    +    6846             : 
    +    6847         299 :   double min_horizontal_sector_distance = std::numeric_limits<double>::max();
    +    6848         299 :   size_t min_sector_id                  = 0;
    +    6849             : 
    +    6850        2691 :   for (unsigned long i = 0; i < bumper_data->n_horizontal_sectors; i++) {
    +    6851             : 
    +    6852        2392 :     if (bumper_data->sectors[i] < 0) {
    +    6853           0 :       continue;
    +    6854             :     }
    +    6855             : 
    +    6856        2392 :     if (bumper_data->sectors[i] < min_horizontal_sector_distance) {
    +    6857         299 :       min_horizontal_sector_distance = bumper_data->sectors[i];
    +    6858         299 :       min_sector_id                  = i;
    +    6859             :     }
    +    6860             :   }
    +    6861             : 
    +    6862             :   // if the sector is under the threshold distance
    +    6863         299 :   if (min_horizontal_sector_distance < min_distance_horizontal) {
    +    6864             : 
    +    6865             :     // get the desired direction of motion
    +    6866         120 :     double oposite_direction  = double(min_sector_id) * sector_size + M_PI;
    +    6867         120 :     int    oposite_sector_idx = bumperGetSectorId(cos(oposite_direction), sin(oposite_direction), 0);
    +    6868             : 
    +    6869             :     // get the id of the oposite sector
    +    6870         120 :     direction = oposite_direction;
    +    6871             : 
    +    6872         120 :     ROS_WARN_THROTTLE(1.0, "[ControlManager]: Bumper: found potential collision (sector %lu vs. %d), obstacle distance: %.2f, repulsing", min_sector_id,
    +    6873             :                       oposite_sector_idx, bumper_data->sectors[min_sector_id]);
    +    6874             : 
    +    6875         120 :     repulsion_distance = min_distance_horizontal + _bumper_horizontal_overshoot_ - bumper_data->sectors[min_sector_id];
    +    6876             : 
    +    6877         120 :     horizontal_collision_detected = true;
    +    6878             :   }
    +    6879             : 
    +    6880         299 :   double vertical_repulsion_distance = 0;
    +    6881             : 
    +    6882             :   // check for vertical collision down
    +    6883         299 :   if (bumper_data->sectors[bumper_data->n_horizontal_sectors] > 0 && bumper_data->sectors[bumper_data->n_horizontal_sectors] <= min_distance_vertical) {
    +    6884             : 
    +    6885           0 :     ROS_INFO_THROTTLE(1.0, "[ControlManager]: Bumper: potential collision below");
    +    6886           0 :     vertical_collision_detected = true;
    +    6887           0 :     vertical_repulsion_distance = min_distance_vertical - bumper_data->sectors[bumper_data->n_horizontal_sectors];
    +    6888             :   }
    +    6889             : 
    +    6890             :   // check for vertical collision up
    +    6891         299 :   if (bumper_data->sectors[bumper_data->n_horizontal_sectors + 1] > 0 && bumper_data->sectors[bumper_data->n_horizontal_sectors + 1] <= min_distance_vertical) {
    +    6892             : 
    +    6893           0 :     ROS_INFO_THROTTLE(1.0, "[ControlManager]: Bumper: potential collision above");
    +    6894           0 :     vertical_collision_detected = true;
    +    6895           0 :     vertical_repulsion_distance = -(min_distance_vertical - bumper_data->sectors[bumper_data->n_horizontal_sectors + 1]);
    +    6896             :   }
    +    6897             : 
    +    6898             :   // if potential collision was detected and we should start the repulsing_
    +    6899         299 :   if (horizontal_collision_detected || vertical_collision_detected) {
    +    6900             : 
    +    6901         120 :     if (!bumper_repulsing_) {
    +    6902             : 
    +    6903           1 :       if (_bumper_switch_tracker_) {
    +    6904             : 
    +    6905           1 :         auto        active_tracker_idx  = mrs_lib::get_mutexed(mutex_tracker_list_, active_tracker_idx_);
    +    6906           2 :         std::string active_tracker_name = _tracker_names_[active_tracker_idx];
    +    6907             : 
    +    6908             :         // remember the previously active tracker
    +    6909           1 :         bumper_previous_tracker_ = active_tracker_name;
    +    6910             : 
    +    6911           1 :         if (active_tracker_name != _bumper_tracker_name_) {
    +    6912             : 
    +    6913           0 :           switchTracker(_bumper_tracker_name_);
    +    6914             :         }
    +    6915             :       }
    +    6916             : 
    +    6917           1 :       if (_bumper_switch_controller_) {
    +    6918             : 
    +    6919           1 :         auto        active_controller_idx  = mrs_lib::get_mutexed(mutex_controller_list_, active_controller_idx_);
    +    6920           2 :         std::string active_controller_name = _controller_names_[active_controller_idx];
    +    6921             : 
    +    6922             :         // remember the previously active controller
    +    6923           1 :         bumper_previous_controller_ = active_controller_name;
    +    6924             : 
    +    6925           1 :         if (active_controller_name != _bumper_controller_name_) {
    +    6926             : 
    +    6927           1 :           switchController(_bumper_controller_name_);
    +    6928             :         }
    +    6929             :       }
    +    6930             :     }
    +    6931             : 
    +    6932         120 :     bumper_repulsing_ = true;
    +    6933             : 
    +    6934         120 :     callbacks_enabled_ = false;
    +    6935             : 
    +    6936           0 :     mrs_msgs::ReferenceSrvResponse::ConstPtr tracker_response;
    +    6937             : 
    +    6938         120 :     std_srvs::SetBoolRequest req_enable_callbacks;
    +    6939             : 
    +    6940             :     // create the reference in the fcu_untilted frame
    +    6941         120 :     mrs_msgs::ReferenceStamped reference_fcu_untilted;
    +    6942             : 
    +    6943         120 :     reference_fcu_untilted.header.frame_id = "fcu_untilted";
    +    6944             : 
    +    6945         120 :     if (horizontal_collision_detected) {
    +    6946         120 :       reference_fcu_untilted.reference.position.x = cos(direction) * repulsion_distance;
    +    6947         120 :       reference_fcu_untilted.reference.position.y = sin(direction) * repulsion_distance;
    +    6948             :     } else {
    +    6949           0 :       reference_fcu_untilted.reference.position.x = 0;
    +    6950           0 :       reference_fcu_untilted.reference.position.y = 0;
    +    6951             :     }
    +    6952             : 
    +    6953         120 :     reference_fcu_untilted.reference.heading = 0;
    +    6954             : 
    +    6955         120 :     if (vertical_collision_detected) {
    +    6956           0 :       reference_fcu_untilted.reference.position.z = vertical_repulsion_distance;
    +    6957             :     } else {
    +    6958         120 :       reference_fcu_untilted.reference.position.z = 0;
    +    6959             :     }
    +    6960             : 
    +    6961             :     {
    +    6962         120 :       std::scoped_lock lock(mutex_tracker_list_);
    +    6963             : 
    +    6964             :       // transform the reference into the currently used frame
    +    6965             :       // this is under the mutex_tracker_list since we don't won't the odometry switch to happen
    +    6966             :       // to the tracker before we actually call the goto service
    +    6967             : 
    +    6968         120 :       auto ret = transformer_->transformSingle(reference_fcu_untilted, uav_state.header.frame_id);
    +    6969             : 
    +    6970         120 :       if (!ret) {
    +    6971           0 :         ROS_WARN_THROTTLE(1.0, "[ControlManager]: Bumper: bumper reference could not be transformed");
    +    6972           0 :         return;
    +    6973             :       }
    +    6974             : 
    +    6975         120 :       reference_fcu_untilted = ret.value();
    +    6976             : 
    +    6977             :       // copy the reference into the service type message
    +    6978         120 :       mrs_msgs::ReferenceSrvRequest req_goto_out;
    +    6979         120 :       req_goto_out.reference = reference_fcu_untilted.reference;
    +    6980             : 
    +    6981             :       // disable callbacks of all trackers
    +    6982         120 :       req_enable_callbacks.data = false;
    +    6983         840 :       for (size_t i = 0; i < tracker_list_.size(); i++) {
    +    6984         720 :         tracker_list_[i]->enableCallbacks(std_srvs::SetBoolRequest::ConstPtr(std::make_unique<std_srvs::SetBoolRequest>(req_enable_callbacks)));
    +    6985             :       }
    +    6986             : 
    +    6987             :       // enable the callbacks for the active tracker
    +    6988         120 :       req_enable_callbacks.data = true;
    +    6989         120 :       tracker_list_[active_tracker_idx_]->enableCallbacks(std_srvs::SetBoolRequest::ConstPtr(std::make_unique<std_srvs::SetBoolRequest>(req_enable_callbacks)));
    +    6990             : 
    +    6991             :       // call the goto
    +    6992         360 :       tracker_response = tracker_list_[active_tracker_idx_]->setReference(
    +    6993         360 :           mrs_msgs::ReferenceSrvRequest::ConstPtr(std::make_unique<mrs_msgs::ReferenceSrvRequest>(req_goto_out)));
    +    6994             : 
    +    6995             :       // disable the callbacks back again
    +    6996         120 :       req_enable_callbacks.data = false;
    +    6997         120 :       tracker_list_[active_tracker_idx_]->enableCallbacks(std_srvs::SetBoolRequest::ConstPtr(std::make_unique<std_srvs::SetBoolRequest>(req_enable_callbacks)));
    +    6998             :     }
    +    6999             :   }
    +    7000             : 
    +    7001             :   // if repulsing_ and the distance is safe once again
    +    7002         299 :   if (bumper_repulsing_ && !horizontal_collision_detected && !vertical_collision_detected) {
    +    7003             : 
    +    7004           1 :     ROS_INFO_THROTTLE(1.0, "[ControlManager]: Bumper: no more collision, stopping repulsion");
    +    7005             : 
    +    7006           1 :     if (_bumper_switch_tracker_) {
    +    7007             : 
    +    7008           1 :       auto        active_tracker_idx  = mrs_lib::get_mutexed(mutex_tracker_list_, active_tracker_idx_);
    +    7009           2 :       std::string active_tracker_name = _tracker_names_[active_tracker_idx];
    +    7010             : 
    +    7011           1 :       if (active_tracker_name != bumper_previous_tracker_) {
    +    7012             : 
    +    7013           0 :         switchTracker(bumper_previous_tracker_);
    +    7014             :       }
    +    7015             :     }
    +    7016             : 
    +    7017           1 :     if (_bumper_switch_controller_) {
    +    7018             : 
    +    7019           1 :       auto        active_controller_idx  = mrs_lib::get_mutexed(mutex_controller_list_, active_controller_idx_);
    +    7020           2 :       std::string active_controller_name = _controller_names_[active_controller_idx];
    +    7021             : 
    +    7022           1 :       if (active_controller_name != bumper_previous_controller_) {
    +    7023             : 
    +    7024           1 :         switchController(bumper_previous_controller_);
    +    7025             :       }
    +    7026             :     }
    +    7027             : 
    +    7028           1 :     std_srvs::SetBoolRequest req_enable_callbacks;
    +    7029             : 
    +    7030             :     {
    +    7031           2 :       std::scoped_lock lock(mutex_tracker_list_);
    +    7032             : 
    +    7033             :       // enable callbacks of all trackers
    +    7034           1 :       req_enable_callbacks.data = true;
    +    7035           7 :       for (size_t i = 0; i < tracker_list_.size(); i++) {
    +    7036           6 :         tracker_list_[i]->enableCallbacks(std_srvs::SetBoolRequest::ConstPtr(std::make_unique<std_srvs::SetBoolRequest>(req_enable_callbacks)));
    +    7037             :       }
    +    7038             :     }
    +    7039             : 
    +    7040           1 :     callbacks_enabled_ = true;
    +    7041             : 
    +    7042           1 :     bumper_repulsing_ = false;
    +    7043             :   }
    +    7044             : }
    +    7045             : 
    +    7046             : //}
    +    7047             : 
    +    7048             : /* bumperGetSectorId() //{ */
    +    7049             : 
    +    7050         120 : int ControlManager::bumperGetSectorId(const double& x, const double& y, [[maybe_unused]] const double& z) {
    +    7051             : 
    +    7052             :   // copy member variables
    +    7053         120 :   mrs_msgs::ObstacleSectorsConstPtr bumper_data = sh_bumper_.getMsg();
    +    7054             : 
    +    7055             :   // heading of the point in drone frame
    +    7056         120 :   double point_heading_horizontal = atan2(y, x);
    +    7057             : 
    +    7058         120 :   point_heading_horizontal += TAU;
    +    7059             : 
    +    7060             :   // if point_heading_horizontal is greater then 2*M_PI mod it
    +    7061         120 :   if (fabs(point_heading_horizontal) >= TAU) {
    +    7062         120 :     point_heading_horizontal = fmod(point_heading_horizontal, TAU);
    +    7063             :   }
    +    7064             : 
    +    7065             :   // heading of the right edge of the first sector
    +    7066         120 :   double sector_size = TAU / double(bumper_data->n_horizontal_sectors);
    +    7067             : 
    +    7068             :   // calculate the idx
    +    7069         120 :   int idx = floor((point_heading_horizontal + (sector_size / 2.0)) / sector_size);
    +    7070             : 
    +    7071         120 :   if (idx > int(bumper_data->n_horizontal_sectors) - 1) {
    +    7072           0 :     idx -= bumper_data->n_horizontal_sectors;
    +    7073             :   }
    +    7074             : 
    +    7075         240 :   return idx;
    +    7076             : }
    +    7077             : 
    +    7078             : //}
    +    7079             : 
    +    7080             : // | ------------------------- safety ------------------------- |
    +    7081             : 
    +    7082             : /* //{ changeLandingState() */
    +    7083             : 
    +    7084          13 : void ControlManager::changeLandingState(LandingStates_t new_state) {
    +    7085             : 
    +    7086             :   // copy member variables
    +    7087          26 :   auto last_control_output = mrs_lib::get_mutexed(mutex_last_control_output_, last_control_output_);
    +    7088             : 
    +    7089             :   {
    +    7090          13 :     std::scoped_lock lock(mutex_landing_state_machine_);
    +    7091             : 
    +    7092          13 :     previous_state_landing_ = current_state_landing_;
    +    7093          13 :     current_state_landing_  = new_state;
    +    7094             :   }
    +    7095             : 
    +    7096          13 :   switch (current_state_landing_) {
    +    7097             : 
    +    7098           4 :     case IDLE_STATE:
    +    7099           4 :       break;
    +    7100           9 :     case LANDING_STATE: {
    +    7101             : 
    +    7102           9 :       ROS_DEBUG("[ControlManager]: starting eland timer");
    +    7103           9 :       timer_eland_.start();
    +    7104           9 :       ROS_DEBUG("[ControlManager]: eland timer started");
    +    7105           9 :       eland_triggered_ = true;
    +    7106           9 :       bumper_enabled_  = false;
    +    7107             : 
    +    7108           9 :       landing_uav_mass_ = getMass();
    +    7109             :     }
    +    7110             : 
    +    7111           9 :     break;
    +    7112             :   }
    +    7113             : 
    +    7114          13 :   ROS_INFO("[ControlManager]: switching emergency landing state %s -> %s", state_names[previous_state_landing_], state_names[current_state_landing_]);
    +    7115          13 : }
    +    7116             : 
    +    7117             : //}
    +    7118             : 
    +    7119             : /* hover() //{ */
    +    7120             : 
    +    7121           0 : std::tuple<bool, std::string> ControlManager::hover(void) {
    +    7122           0 :   if (!is_initialized_)
    +    7123           0 :     return std::tuple(false, "the ControlManager is not initialized");
    +    7124             : 
    +    7125           0 :   if (eland_triggered_)
    +    7126           0 :     return std::tuple(false, "cannot hover, eland already triggered");
    +    7127             : 
    +    7128           0 :   if (failsafe_triggered_)
    +    7129           0 :     return std::tuple(false, "cannot hover, failsafe already triggered");
    +    7130             : 
    +    7131             :   {
    +    7132           0 :     std::scoped_lock lock(mutex_tracker_list_);
    +    7133             : 
    +    7134           0 :     std_srvs::TriggerResponse::ConstPtr response;
    +    7135           0 :     std_srvs::TriggerRequest            request;
    +    7136             : 
    +    7137           0 :     response = tracker_list_[active_tracker_idx_]->hover(std_srvs::TriggerRequest::ConstPtr(std::make_unique<std_srvs::TriggerRequest>(request)));
    +    7138             : 
    +    7139           0 :     if (response != std_srvs::TriggerResponse::Ptr()) {
    +    7140             : 
    +    7141           0 :       return std::tuple(response->success, response->message);
    +    7142             : 
    +    7143             :     } else {
    +    7144             : 
    +    7145           0 :       std::stringstream ss;
    +    7146           0 :       ss << "the tracker '" << _tracker_names_[active_tracker_idx_] << "' does not implement the 'hover()' function!";
    +    7147             : 
    +    7148           0 :       return std::tuple(false, ss.str());
    +    7149             :     }
    +    7150             :   }
    +    7151             : }
    +    7152             : 
    +    7153             : //}
    +    7154             : 
    +    7155             : /* //{ ehover() */
    +    7156             : 
    +    7157           4 : std::tuple<bool, std::string> ControlManager::ehover(void) {
    +    7158             : 
    +    7159           4 :   if (!is_initialized_)
    +    7160           0 :     return std::tuple(false, "the ControlManager is not initialized");
    +    7161             : 
    +    7162           4 :   if (eland_triggered_)
    +    7163           0 :     return std::tuple(false, "cannot ehover, eland already triggered");
    +    7164             : 
    +    7165           4 :   if (failsafe_triggered_)
    +    7166           0 :     return std::tuple(false, "cannot ehover, failsafe already triggered");
    +    7167             : 
    +    7168             :   // copy the member variables
    +    7169           8 :   auto last_control_output = mrs_lib::get_mutexed(mutex_last_control_output_, last_control_output_);
    +    7170           4 :   auto active_tracker_idx  = mrs_lib::get_mutexed(mutex_tracker_list_, active_tracker_idx_);
    +    7171             : 
    +    7172           4 :   if (active_tracker_idx == _null_tracker_idx_) {
    +    7173             : 
    +    7174           0 :     std::stringstream ss;
    +    7175           0 :     ss << "can not trigger ehover while not flying";
    +    7176           0 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    7177             : 
    +    7178           0 :     return std::tuple(false, ss.str());
    +    7179             :   }
    +    7180             : 
    +    7181           4 :   ungripSrv();
    +    7182             : 
    +    7183             :   {
    +    7184             : 
    +    7185           4 :     auto [success, message] = switchTracker(_ehover_tracker_name_);
    +    7186             : 
    +    7187             :     // check if the tracker was successfully switched
    +    7188             :     // this is vital, that is the core of the hover
    +    7189           4 :     if (!success) {
    +    7190             : 
    +    7191           0 :       std::stringstream ss;
    +    7192           0 :       ss << "error during switching to ehover tracker: '" << message << "'";
    +    7193           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    7194             : 
    +    7195           0 :       return std::tuple(success, ss.str());
    +    7196             :     }
    +    7197             :   }
    +    7198             : 
    +    7199             :   {
    +    7200           8 :     auto [success, message] = switchController(_eland_controller_name_);
    +    7201             : 
    +    7202             :     // check if the controller was successfully switched
    +    7203             :     // this is not vital, we can continue without that
    +    7204           4 :     if (!success) {
    +    7205             : 
    +    7206           0 :       std::stringstream ss;
    +    7207           0 :       ss << "error during switching to ehover controller: '" << message << "'";
    +    7208           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    7209             :     }
    +    7210             :   }
    +    7211             : 
    +    7212           4 :   std::stringstream ss;
    +    7213           4 :   ss << "ehover activated";
    +    7214           4 :   ROS_INFO_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    7215             : 
    +    7216           4 :   callbacks_enabled_ = false;
    +    7217             : 
    +    7218           4 :   return std::tuple(true, ss.str());
    +    7219             : }
    +    7220             : 
    +    7221             : //}
    +    7222             : 
    +    7223             : /* eland() //{ */
    +    7224             : 
    +    7225           9 : std::tuple<bool, std::string> ControlManager::eland(void) {
    +    7226             : 
    +    7227           9 :   if (!is_initialized_)
    +    7228           0 :     return std::tuple(false, "the ControlManager is not initialized");
    +    7229             : 
    +    7230           9 :   if (eland_triggered_)
    +    7231           0 :     return std::tuple(false, "cannot eland, eland already triggered");
    +    7232             : 
    +    7233           9 :   if (failsafe_triggered_)
    +    7234           0 :     return std::tuple(false, "cannot eland, failsafe already triggered");
    +    7235             : 
    +    7236             :   // copy member variables
    +    7237          18 :   auto last_control_output = mrs_lib::get_mutexed(mutex_last_control_output_, last_control_output_);
    +    7238           9 :   auto active_tracker_idx  = mrs_lib::get_mutexed(mutex_tracker_list_, active_tracker_idx_);
    +    7239             : 
    +    7240           9 :   if (active_tracker_idx == _null_tracker_idx_) {
    +    7241             : 
    +    7242           0 :     std::stringstream ss;
    +    7243           0 :     ss << "can not trigger eland while not flying";
    +    7244           0 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    7245             : 
    +    7246           0 :     return std::tuple(false, ss.str());
    +    7247             :   }
    +    7248             : 
    +    7249           9 :   if (_rc_emergency_handoff_) {
    +    7250             : 
    +    7251           0 :     toggleOutput(false);
    +    7252             : 
    +    7253           0 :     return std::tuple(true, "RC emergency handoff is ON, disabling output");
    +    7254             :   }
    +    7255             : 
    +    7256             :   {
    +    7257           9 :     auto [success, message] = switchTracker(_ehover_tracker_name_);
    +    7258             : 
    +    7259             :     // check if the tracker was successfully switched
    +    7260             :     // this is vital
    +    7261           9 :     if (!success) {
    +    7262             : 
    +    7263           0 :       std::stringstream ss;
    +    7264           0 :       ss << "error during switching to eland tracker: '" << message << "'";
    +    7265           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    7266             : 
    +    7267           0 :       return std::tuple(success, ss.str());
    +    7268             :     }
    +    7269             :   }
    +    7270             : 
    +    7271             :   {
    +    7272          18 :     auto [success, message] = switchController(_eland_controller_name_);
    +    7273             : 
    +    7274             :     // check if the controller was successfully switched
    +    7275             :     // this is not vital, we can continue without it
    +    7276           9 :     if (!success) {
    +    7277             : 
    +    7278           0 :       std::stringstream ss;
    +    7279           0 :       ss << "error during switching to eland controller: '" << message << "'";
    +    7280           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    7281             :     }
    +    7282             :   }
    +    7283             : 
    +    7284             :   // | ----------------- call the eland service ----------------- |
    +    7285             : 
    +    7286           9 :   std::stringstream ss;
    +    7287             :   bool              success;
    +    7288             : 
    +    7289           9 :   if (elandSrv()) {
    +    7290             : 
    +    7291           9 :     changeLandingState(LANDING_STATE);
    +    7292             : 
    +    7293           9 :     odometryCallbacksSrv(false);
    +    7294             : 
    +    7295           9 :     ss << "eland activated";
    +    7296           9 :     ROS_INFO_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    7297             : 
    +    7298           9 :     success = true;
    +    7299             : 
    +    7300           9 :     callbacks_enabled_ = false;
    +    7301             : 
    +    7302             :   } else {
    +    7303             : 
    +    7304           0 :     ss << "error during activation of eland";
    +    7305           0 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    7306             : 
    +    7307           0 :     success = false;
    +    7308             :   }
    +    7309             : 
    +    7310          18 :   return std::tuple(success, ss.str());
    +    7311             : }
    +    7312             : 
    +    7313             : //}
    +    7314             : 
    +    7315             : /* failsafe() //{ */
    +    7316             : 
    +    7317           7 : std::tuple<bool, std::string> ControlManager::failsafe(void) {
    +    7318             : 
    +    7319             :   // copy member variables
    +    7320          14 :   auto last_control_output   = mrs_lib::get_mutexed(mutex_last_control_output_, last_control_output_);
    +    7321           7 :   auto active_controller_idx = mrs_lib::get_mutexed(mutex_controller_list_, active_controller_idx_);
    +    7322           7 :   auto active_tracker_idx    = mrs_lib::get_mutexed(mutex_tracker_list_, active_tracker_idx_);
    +    7323             : 
    +    7324           7 :   if (!is_initialized_) {
    +    7325           0 :     return std::tuple(false, "the ControlManager is not initialized");
    +    7326             :   }
    +    7327             : 
    +    7328           7 :   if (failsafe_triggered_) {
    +    7329           0 :     return std::tuple(false, "cannot, failsafe already triggered");
    +    7330             :   }
    +    7331             : 
    +    7332           7 :   if (active_tracker_idx == _null_tracker_idx_) {
    +    7333             : 
    +    7334           0 :     std::stringstream ss;
    +    7335           0 :     ss << "can not trigger failsafe while not flying";
    +    7336           0 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    7337           0 :     return std::tuple(false, ss.str());
    +    7338             :   }
    +    7339             : 
    +    7340           7 :   if (_rc_emergency_handoff_) {
    +    7341             : 
    +    7342           0 :     toggleOutput(false);
    +    7343             : 
    +    7344           0 :     return std::tuple(true, "RC emergency handoff is ON, disabling output");
    +    7345             :   }
    +    7346             : 
    +    7347           7 :   if (getLowestOuput(_hw_api_inputs_) == POSITION) {
    +    7348           0 :     return eland();
    +    7349             :   }
    +    7350             : 
    +    7351           7 :   if (_parachute_enabled_) {
    +    7352             : 
    +    7353           0 :     auto [success, message] = deployParachute();
    +    7354             : 
    +    7355           0 :     if (success) {
    +    7356             : 
    +    7357           0 :       std::stringstream ss;
    +    7358           0 :       ss << "failsafe activated (parachute): '" << message << "'";
    +    7359           0 :       ROS_INFO_STREAM("[ControlManager]: " << ss.str());
    +    7360             : 
    +    7361           0 :       return std::tuple(true, ss.str());
    +    7362             : 
    +    7363             :     } else {
    +    7364             : 
    +    7365           0 :       std::stringstream ss;
    +    7366           0 :       ss << "could not deploy parachute: '" << message << "', continuing with normal failsafe";
    +    7367           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    7368             :     }
    +    7369             :   }
    +    7370             : 
    +    7371           7 :   if (_failsafe_controller_idx_ != active_controller_idx) {
    +    7372             : 
    +    7373             :     try {
    +    7374             : 
    +    7375          14 :       std::scoped_lock lock(mutex_controller_list_);
    +    7376             : 
    +    7377           7 :       ROS_INFO("[ControlManager]: activating the controller '%s'", _failsafe_controller_name_.c_str());
    +    7378           7 :       controller_list_[_failsafe_controller_idx_]->activate(last_control_output);
    +    7379             : 
    +    7380             :       {
    +    7381          14 :         std::scoped_lock lock(mutex_controller_tracker_switch_time_);
    +    7382             : 
    +    7383             :         // update the time (used in failsafe)
    +    7384           7 :         controller_tracker_switch_time_ = ros::Time::now();
    +    7385             :       }
    +    7386             : 
    +    7387           7 :       failsafe_triggered_ = true;
    +    7388           7 :       ROS_DEBUG("[ControlManager]: stopping eland timer");
    +    7389           7 :       timer_eland_.stop();
    +    7390           7 :       ROS_DEBUG("[ControlManager]: eland timer stopped");
    +    7391             : 
    +    7392           7 :       landing_uav_mass_ = getMass();
    +    7393             : 
    +    7394           7 :       eland_triggered_ = false;
    +    7395           7 :       ROS_DEBUG("[ControlManager]: starting failsafe timer");
    +    7396           7 :       timer_failsafe_.start();
    +    7397           7 :       ROS_DEBUG("[ControlManager]: failsafe timer started");
    +    7398             : 
    +    7399           7 :       bumper_enabled_ = false;
    +    7400             : 
    +    7401           7 :       odometryCallbacksSrv(false);
    +    7402             : 
    +    7403           7 :       callbacks_enabled_ = false;
    +    7404             : 
    +    7405           7 :       ROS_INFO_THROTTLE(1.0, "[ControlManager]: the controller '%s' was activated", _failsafe_controller_name_.c_str());
    +    7406             : 
    +    7407             :       // super important, switch the active controller idx
    +    7408             :       try {
    +    7409           7 :         controller_list_[active_controller_idx_]->deactivate();
    +    7410           7 :         active_controller_idx_ = _failsafe_controller_idx_;
    +    7411             :       }
    +    7412           0 :       catch (std::runtime_error& exrun) {
    +    7413           0 :         ROS_ERROR_THROTTLE(1.0, "[ControlManager]: could not deactivate the controller '%s'", _controller_names_[active_controller_idx_].c_str());
    +    7414             :       }
    +    7415             :     }
    +    7416           0 :     catch (std::runtime_error& exrun) {
    +    7417           0 :       ROS_ERROR_THROTTLE(1.0, "[ControlManager]: error during activation of the controller '%s'", _failsafe_controller_name_.c_str());
    +    7418           0 :       ROS_ERROR_THROTTLE(1.0, "[ControlManager]: exception: '%s'", exrun.what());
    +    7419             :     }
    +    7420             :   }
    +    7421             : 
    +    7422          14 :   return std::tuple(true, "failsafe activated");
    +    7423             : }
    +    7424             : 
    +    7425             : //}
    +    7426             : 
    +    7427             : /* escalatingFailsafe() //{ */
    +    7428             : 
    +    7429         148 : std::tuple<bool, std::string> ControlManager::escalatingFailsafe(void) {
    +    7430         296 :   std::stringstream ss;
    +    7431             : 
    +    7432         148 :   if ((ros::Time::now() - escalating_failsafe_time_).toSec() < _escalating_failsafe_timeout_) {
    +    7433             : 
    +    7434         140 :     ss << "too soon for escalating failsafe";
    +    7435         140 :     ROS_WARN_STREAM_THROTTLE(0.1, "[ControlManager]: " << ss.str());
    +    7436             : 
    +    7437         140 :     return std::tuple(false, ss.str());
    +    7438             :   }
    +    7439             : 
    +    7440           8 :   if (!output_enabled_) {
    +    7441             : 
    +    7442           0 :     ss << "not escalating failsafe, output is disabled";
    +    7443           0 :     ROS_WARN_STREAM_THROTTLE(0.1, "[ControlManager]: " << ss.str());
    +    7444             : 
    +    7445           0 :     return std::tuple(false, ss.str());
    +    7446             :   }
    +    7447             : 
    +    7448           8 :   ROS_WARN("[ControlManager]: escalating failsafe triggered");
    +    7449             : 
    +    7450           8 :   auto active_tracker_idx    = mrs_lib::get_mutexed(mutex_tracker_list_, active_tracker_idx_);
    +    7451           8 :   auto active_controller_idx = mrs_lib::get_mutexed(mutex_controller_list_, active_controller_idx_);
    +    7452             : 
    +    7453          16 :   std::string active_tracker_name    = _tracker_names_[active_tracker_idx];
    +    7454          16 :   std::string active_controller_name = _controller_names_[active_controller_idx];
    +    7455             : 
    +    7456           8 :   EscalatingFailsafeStates_t next_state = getNextEscFailsafeState();
    +    7457             : 
    +    7458           8 :   escalating_failsafe_time_ = ros::Time::now();
    +    7459             : 
    +    7460           8 :   switch (next_state) {
    +    7461             : 
    +    7462           0 :     case ESC_NONE_STATE: {
    +    7463             : 
    +    7464           0 :       ss << "escalating failsafe has run to impossible situation";
    +    7465           0 :       ROS_ERROR_STREAM_THROTTLE(0.1, "[ControlManager]: " << ss.str());
    +    7466             : 
    +    7467           0 :       return std::tuple(false, "escalating failsafe has run to impossible situation");
    +    7468             : 
    +    7469             :       break;
    +    7470             :     }
    +    7471             : 
    +    7472           2 :     case ESC_EHOVER_STATE: {
    +    7473             : 
    +    7474           2 :       ss << "escalating failsafe escalates to ehover";
    +    7475           2 :       ROS_WARN_STREAM_THROTTLE(0.1, "[ControlManager]: " << ss.str());
    +    7476             : 
    +    7477           4 :       auto [success, message] = ehover();
    +    7478             : 
    +    7479           2 :       if (success) {
    +    7480           2 :         state_escalating_failsafe_ = ESC_EHOVER_STATE;
    +    7481             :       }
    +    7482             : 
    +    7483           2 :       return {success, message};
    +    7484             : 
    +    7485             :       break;
    +    7486             :     }
    +    7487             : 
    +    7488           2 :     case ESC_ELAND_STATE: {
    +    7489             : 
    +    7490           2 :       ss << "escalating failsafe escalates to eland";
    +    7491           2 :       ROS_WARN_STREAM_THROTTLE(0.1, "[ControlManager]: " << ss.str());
    +    7492             : 
    +    7493           4 :       auto [success, message] = eland();
    +    7494             : 
    +    7495           2 :       if (success) {
    +    7496           2 :         state_escalating_failsafe_ = ESC_ELAND_STATE;
    +    7497             :       }
    +    7498             : 
    +    7499           2 :       return {success, message};
    +    7500             : 
    +    7501             :       break;
    +    7502             :     }
    +    7503             : 
    +    7504           2 :     case ESC_FAILSAFE_STATE: {
    +    7505             : 
    +    7506           2 :       escalating_failsafe_time_ = ros::Time::now();
    +    7507             : 
    +    7508           2 :       ss << "escalating failsafe escalates to failsafe";
    +    7509           2 :       ROS_WARN_STREAM_THROTTLE(0.1, "[ControlManager]: " << ss.str());
    +    7510             : 
    +    7511           4 :       auto [success, message] = failsafe();
    +    7512             : 
    +    7513           2 :       if (success) {
    +    7514           2 :         state_escalating_failsafe_ = ESC_FINISHED_STATE;
    +    7515             :       }
    +    7516             : 
    +    7517           2 :       return {success, message};
    +    7518             : 
    +    7519             :       break;
    +    7520             :     }
    +    7521             : 
    +    7522           2 :     case ESC_FINISHED_STATE: {
    +    7523             : 
    +    7524           2 :       escalating_failsafe_time_ = ros::Time::now();
    +    7525             : 
    +    7526           2 :       ss << "escalating failsafe has nothing more to do";
    +    7527           2 :       ROS_WARN_STREAM_THROTTLE(0.1, "[ControlManager]: " << ss.str());
    +    7528             : 
    +    7529           4 :       return std::tuple(false, "escalating failsafe has nothing more to do");
    +    7530             : 
    +    7531             :       break;
    +    7532             :     }
    +    7533             : 
    +    7534           0 :     default: {
    +    7535             : 
    +    7536           0 :       break;
    +    7537             :     }
    +    7538             :   }
    +    7539             : 
    +    7540           0 :   ROS_ERROR("[ControlManager]: escalatingFailsafe() reached the final return, this should not happen!");
    +    7541             : 
    +    7542           0 :   return std::tuple(false, "escalating failsafe exception");
    +    7543             : }
    +    7544             : 
    +    7545             : //}
    +    7546             : 
    +    7547             : /* getNextEscFailsafeState() //{ */
    +    7548             : 
    +    7549           8 : EscalatingFailsafeStates_t ControlManager::getNextEscFailsafeState(void) {
    +    7550           8 :   EscalatingFailsafeStates_t current_state = state_escalating_failsafe_;
    +    7551             : 
    +    7552           8 :   switch (current_state) {
    +    7553             : 
    +    7554           2 :     case ESC_FINISHED_STATE: {
    +    7555             : 
    +    7556           2 :       return ESC_FINISHED_STATE;
    +    7557             : 
    +    7558             :       break;
    +    7559             :     }
    +    7560             : 
    +    7561           2 :     case ESC_NONE_STATE: {
    +    7562             : 
    +    7563           2 :       if (_escalating_failsafe_ehover_) {
    +    7564           2 :         return ESC_EHOVER_STATE;
    +    7565           0 :       } else if (_escalating_failsafe_eland_) {
    +    7566           0 :         return ESC_ELAND_STATE;
    +    7567           0 :       } else if (_escalating_failsafe_failsafe_) {
    +    7568           0 :         return ESC_FAILSAFE_STATE;
    +    7569             :       } else {
    +    7570           0 :         return ESC_FINISHED_STATE;
    +    7571             :       }
    +    7572             : 
    +    7573             :       break;
    +    7574             :     }
    +    7575             : 
    +    7576           2 :     case ESC_EHOVER_STATE: {
    +    7577             : 
    +    7578           2 :       if (_escalating_failsafe_eland_) {
    +    7579           2 :         return ESC_ELAND_STATE;
    +    7580           0 :       } else if (_escalating_failsafe_failsafe_) {
    +    7581           0 :         return ESC_FAILSAFE_STATE;
    +    7582             :       } else {
    +    7583           0 :         return ESC_FINISHED_STATE;
    +    7584             :       }
    +    7585             : 
    +    7586             :       break;
    +    7587             :     }
    +    7588             : 
    +    7589           2 :     case ESC_ELAND_STATE: {
    +    7590             : 
    +    7591           2 :       if (_escalating_failsafe_failsafe_) {
    +    7592           2 :         return ESC_FAILSAFE_STATE;
    +    7593             :       } else {
    +    7594           0 :         return ESC_FINISHED_STATE;
    +    7595             :       }
    +    7596             : 
    +    7597             :       break;
    +    7598             :     }
    +    7599             : 
    +    7600           0 :     case ESC_FAILSAFE_STATE: {
    +    7601             : 
    +    7602           0 :       return ESC_FINISHED_STATE;
    +    7603             : 
    +    7604             :       break;
    +    7605             :     }
    +    7606             :   }
    +    7607             : 
    +    7608           0 :   ROS_ERROR("[ControlManager]: getNextEscFailsafeState() reached the final return, this should not happen!");
    +    7609             : 
    +    7610           0 :   return ESC_NONE_STATE;
    +    7611             : }
    +    7612             : 
    +    7613             : //}
    +    7614             : 
    +    7615             : // | ------------------- trajectory tracking ------------------ |
    +    7616             : 
    +    7617             : /* startTrajectoryTracking() //{ */
    +    7618             : 
    +    7619           1 : std::tuple<bool, std::string> ControlManager::startTrajectoryTracking(void) {
    +    7620           1 :   if (!is_initialized_)
    +    7621           0 :     return std::tuple(false, "the ControlManager is not initialized");
    +    7622             : 
    +    7623             :   {
    +    7624           2 :     std::scoped_lock lock(mutex_tracker_list_);
    +    7625             : 
    +    7626           1 :     std_srvs::TriggerResponse::ConstPtr response;
    +    7627           1 :     std_srvs::TriggerRequest            request;
    +    7628             : 
    +    7629             :     response =
    +    7630           1 :         tracker_list_[active_tracker_idx_]->startTrajectoryTracking(std_srvs::TriggerRequest::ConstPtr(std::make_unique<std_srvs::TriggerRequest>(request)));
    +    7631             : 
    +    7632           1 :     if (response != std_srvs::TriggerResponse::Ptr()) {
    +    7633             : 
    +    7634           2 :       return std::tuple(response->success, response->message);
    +    7635             : 
    +    7636             :     } else {
    +    7637             : 
    +    7638           0 :       std::stringstream ss;
    +    7639           0 :       ss << "the tracker '" << _tracker_names_[active_tracker_idx_] << "' does not implement the 'startTrajectoryTracking()' function!";
    +    7640             : 
    +    7641           0 :       return std::tuple(false, ss.str());
    +    7642             :     }
    +    7643             :   }
    +    7644             : }
    +    7645             : 
    +    7646             : //}
    +    7647             : 
    +    7648             : /* stopTrajectoryTracking() //{ */
    +    7649             : 
    +    7650           0 : std::tuple<bool, std::string> ControlManager::stopTrajectoryTracking(void) {
    +    7651           0 :   if (!is_initialized_)
    +    7652           0 :     return std::tuple(false, "the ControlManager is not initialized");
    +    7653             : 
    +    7654             :   {
    +    7655           0 :     std::scoped_lock lock(mutex_tracker_list_);
    +    7656             : 
    +    7657           0 :     std_srvs::TriggerResponse::ConstPtr response;
    +    7658           0 :     std_srvs::TriggerRequest            request;
    +    7659             : 
    +    7660             :     response =
    +    7661           0 :         tracker_list_[active_tracker_idx_]->stopTrajectoryTracking(std_srvs::TriggerRequest::ConstPtr(std::make_unique<std_srvs::TriggerRequest>(request)));
    +    7662             : 
    +    7663           0 :     if (response != std_srvs::TriggerResponse::Ptr()) {
    +    7664             : 
    +    7665           0 :       return std::tuple(response->success, response->message);
    +    7666             : 
    +    7667             :     } else {
    +    7668             : 
    +    7669           0 :       std::stringstream ss;
    +    7670           0 :       ss << "the tracker '" << _tracker_names_[active_tracker_idx_] << "' does not implement the 'stopTrajectoryTracking()' function!";
    +    7671             : 
    +    7672           0 :       return std::tuple(false, ss.str());
    +    7673             :     }
    +    7674             :   }
    +    7675             : }
    +    7676             : 
    +    7677             : //}
    +    7678             : 
    +    7679             : /* resumeTrajectoryTracking() //{ */
    +    7680             : 
    +    7681           0 : std::tuple<bool, std::string> ControlManager::resumeTrajectoryTracking(void) {
    +    7682           0 :   if (!is_initialized_)
    +    7683           0 :     return std::tuple(false, "the ControlManager is not initialized");
    +    7684             : 
    +    7685             :   {
    +    7686           0 :     std::scoped_lock lock(mutex_tracker_list_);
    +    7687             : 
    +    7688           0 :     std_srvs::TriggerResponse::ConstPtr response;
    +    7689           0 :     std_srvs::TriggerRequest            request;
    +    7690             : 
    +    7691             :     response =
    +    7692           0 :         tracker_list_[active_tracker_idx_]->resumeTrajectoryTracking(std_srvs::TriggerRequest::ConstPtr(std::make_unique<std_srvs::TriggerRequest>(request)));
    +    7693             : 
    +    7694           0 :     if (response != std_srvs::TriggerResponse::Ptr()) {
    +    7695             : 
    +    7696           0 :       return std::tuple(response->success, response->message);
    +    7697             : 
    +    7698             :     } else {
    +    7699             : 
    +    7700           0 :       std::stringstream ss;
    +    7701           0 :       ss << "the tracker '" << _tracker_names_[active_tracker_idx_] << "' does not implement the 'resumeTrajectoryTracking()' function!";
    +    7702             : 
    +    7703           0 :       return std::tuple(false, ss.str());
    +    7704             :     }
    +    7705             :   }
    +    7706             : }
    +    7707             : 
    +    7708             : //}
    +    7709             : 
    +    7710             : /* gotoTrajectoryStart() //{ */
    +    7711             : 
    +    7712           1 : std::tuple<bool, std::string> ControlManager::gotoTrajectoryStart(void) {
    +    7713           1 :   if (!is_initialized_)
    +    7714           0 :     return std::tuple(false, "the ControlManager is not initialized");
    +    7715             : 
    +    7716             :   {
    +    7717           2 :     std::scoped_lock lock(mutex_tracker_list_);
    +    7718             : 
    +    7719           1 :     std_srvs::TriggerResponse::ConstPtr response;
    +    7720           1 :     std_srvs::TriggerRequest            request;
    +    7721             : 
    +    7722           1 :     response = tracker_list_[active_tracker_idx_]->gotoTrajectoryStart(std_srvs::TriggerRequest::ConstPtr(std::make_unique<std_srvs::TriggerRequest>(request)));
    +    7723             : 
    +    7724           1 :     if (response != std_srvs::TriggerResponse::Ptr()) {
    +    7725             : 
    +    7726           2 :       return std::tuple(response->success, response->message);
    +    7727             : 
    +    7728             :     } else {
    +    7729             : 
    +    7730           0 :       std::stringstream ss;
    +    7731           0 :       ss << "the tracker '" << _tracker_names_[active_tracker_idx_] << "' does not implement the 'gotoTrajectoryStart()' function!";
    +    7732             : 
    +    7733           0 :       return std::tuple(false, ss.str());
    +    7734             :     }
    +    7735             :   }
    +    7736             : }
    +    7737             : 
    +    7738             : //}
    +    7739             : 
    +    7740             : // | ----------------- service client wrappers ---------------- |
    +    7741             : 
    +    7742             : /* arming() //{ */
    +    7743             : 
    +    7744          18 : std::tuple<bool, std::string> ControlManager::arming(const bool input) {
    +    7745          36 :   std::stringstream ss;
    +    7746             : 
    +    7747          18 :   if (input) {
    +    7748             : 
    +    7749           0 :     ss << "not allowed to arm using the ControlManager, maybe later when we don't do bugs";
    +    7750           0 :     ROS_WARN_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    7751           0 :     return std::tuple(false, ss.str());
    +    7752             :   }
    +    7753             : 
    +    7754          18 :   if (!input && !isOffboard()) {
    +    7755             : 
    +    7756           0 :     ss << "can not disarm, not in OFFBOARD mode";
    +    7757           0 :     ROS_WARN_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    7758           0 :     return std::tuple(false, ss.str());
    +    7759             :   }
    +    7760             : 
    +    7761          18 :   if (!input && _rc_emergency_handoff_) {
    +    7762             : 
    +    7763           0 :     toggleOutput(false);
    +    7764             : 
    +    7765           0 :     return std::tuple(true, "RC emergency handoff is ON, disabling output");
    +    7766             :   }
    +    7767             : 
    +    7768          18 :   std_srvs::SetBool srv_out;
    +    7769             : 
    +    7770          18 :   srv_out.request.data = input ? 1 : 0;  // arm or disarm?
    +    7771             : 
    +    7772          18 :   ROS_INFO("[ControlManager]: calling for %s", input ? "arming" : "disarming");
    +    7773             : 
    +    7774          18 :   if (sch_arming_.call(srv_out)) {
    +    7775             : 
    +    7776          18 :     if (srv_out.response.success) {
    +    7777             : 
    +    7778          18 :       ss << "service call for " << (input ? "arming" : "disarming") << " was successful";
    +    7779          18 :       ROS_INFO_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    7780             : 
    +    7781          18 :       if (!input) {
    +    7782             : 
    +    7783          18 :         toggleOutput(false);
    +    7784             : 
    +    7785          18 :         ROS_DEBUG("[ControlManager]: stopping failsafe timer");
    +    7786          18 :         timer_failsafe_.stop();
    +    7787          18 :         ROS_DEBUG("[ControlManager]: failsafe timer stopped");
    +    7788             : 
    +    7789          18 :         ROS_DEBUG("[ControlManager]: stopping the eland timer");
    +    7790          18 :         timer_eland_.stop();
    +    7791          18 :         ROS_DEBUG("[ControlManager]: eland timer stopped");
    +    7792             :       }
    +    7793             : 
    +    7794             :     } else {
    +    7795           0 :       ss << "service call for " << (input ? "arming" : "disarming") << " failed";
    +    7796           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    7797             :     }
    +    7798             : 
    +    7799             :   } else {
    +    7800           0 :     ss << "calling for " << (input ? "arming" : "disarming") << " resulted in failure: '" << srv_out.response.message << "'";
    +    7801           0 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[ControlManager]: " << ss.str());
    +    7802             :   }
    +    7803             : 
    +    7804          36 :   return std::tuple(srv_out.response.success, ss.str());
    +    7805             : }
    +    7806             : 
    +    7807             : //}
    +    7808             : 
    +    7809             : /* odometryCallbacksSrv() //{ */
    +    7810             : 
    +    7811          16 : void ControlManager::odometryCallbacksSrv(const bool input) {
    +    7812          16 :   ROS_INFO("[ControlManager]: switching odometry callbacks to %s", input ? "ON" : "OFF");
    +    7813             : 
    +    7814          32 :   std_srvs::SetBool srv;
    +    7815             : 
    +    7816          16 :   srv.request.data = input;
    +    7817             : 
    +    7818          16 :   bool res = sch_set_odometry_callbacks_.call(srv);
    +    7819             : 
    +    7820          16 :   if (res) {
    +    7821             : 
    +    7822          16 :     if (!srv.response.success) {
    +    7823           0 :       ROS_WARN("[ControlManager]: service call for toggle odometry callbacks returned: '%s'", srv.response.message.c_str());
    +    7824             :     }
    +    7825             : 
    +    7826             :   } else {
    +    7827           0 :     ROS_ERROR("[ControlManager]: service call for toggle odometry callbacks failed!");
    +    7828             :   }
    +    7829          16 : }
    +    7830             : 
    +    7831             : //}
    +    7832             : 
    +    7833             : /* elandSrv() //{ */
    +    7834             : 
    +    7835           9 : bool ControlManager::elandSrv(void) {
    +    7836           9 :   ROS_INFO("[ControlManager]: calling for eland");
    +    7837             : 
    +    7838          18 :   std_srvs::Trigger srv;
    +    7839             : 
    +    7840           9 :   bool res = sch_eland_.call(srv);
    +    7841             : 
    +    7842           9 :   if (res) {
    +    7843             : 
    +    7844           9 :     if (!srv.response.success) {
    +    7845           0 :       ROS_WARN("[ControlManager]: service call for eland returned: '%s'", srv.response.message.c_str());
    +    7846             :     }
    +    7847             : 
    +    7848           9 :     return srv.response.success;
    +    7849             : 
    +    7850             :   } else {
    +    7851             : 
    +    7852           0 :     ROS_ERROR("[ControlManager]: service call for eland failed!");
    +    7853             : 
    +    7854           0 :     return false;
    +    7855             :   }
    +    7856             : }
    +    7857             : 
    +    7858             : //}
    +    7859             : 
    +    7860             : /* parachuteSrv() //{ */
    +    7861             : 
    +    7862           0 : bool ControlManager::parachuteSrv(void) {
    +    7863           0 :   ROS_INFO("[ControlManager]: calling for parachute deployment");
    +    7864             : 
    +    7865           0 :   std_srvs::Trigger srv;
    +    7866             : 
    +    7867           0 :   bool res = sch_parachute_.call(srv);
    +    7868             : 
    +    7869           0 :   if (res) {
    +    7870             : 
    +    7871           0 :     if (!srv.response.success) {
    +    7872           0 :       ROS_WARN("[ControlManager]: service call for parachute deployment returned: '%s'", srv.response.message.c_str());
    +    7873             :     }
    +    7874             : 
    +    7875           0 :     return srv.response.success;
    +    7876             : 
    +    7877             :   } else {
    +    7878             : 
    +    7879           0 :     ROS_ERROR("[ControlManager]: service call for parachute deployment failed!");
    +    7880             : 
    +    7881           0 :     return false;
    +    7882             :   }
    +    7883             : }
    +    7884             : 
    +    7885             : //}
    +    7886             : 
    +    7887             : /* ungripSrv() //{ */
    +    7888             : 
    +    7889          69 : void ControlManager::ungripSrv(void) {
    +    7890         138 :   std_srvs::Trigger srv;
    +    7891             : 
    +    7892          69 :   bool res = sch_ungrip_.call(srv);
    +    7893             : 
    +    7894          69 :   if (res) {
    +    7895             : 
    +    7896           0 :     if (!srv.response.success) {
    +    7897           0 :       ROS_DEBUG_THROTTLE(1.0, "[ControlManager]: service call for ungripping payload returned: '%s'", srv.response.message.c_str());
    +    7898             :     }
    +    7899             : 
    +    7900             :   } else {
    +    7901          69 :     ROS_DEBUG_THROTTLE(1.0, "[ControlManager]: service call for ungripping payload failed!");
    +    7902             :   }
    +    7903          69 : }
    +    7904             : 
    +    7905             : //}
    +    7906             : 
    +    7907             : // | ------------------------ routines ------------------------ |
    +    7908             : 
    +    7909             : /* toggleOutput() //{ */
    +    7910             : 
    +    7911         113 : void ControlManager::toggleOutput(const bool& input) {
    +    7912             : 
    +    7913         113 :   if (input == output_enabled_) {
    +    7914           6 :     ROS_WARN_THROTTLE(0.1, "[ControlManager]: output is already %s", input ? "ON" : "OFF");
    +    7915           6 :     return;
    +    7916             :   }
    +    7917             : 
    +    7918         107 :   ROS_INFO("[ControlManager]: switching output %s", input ? "ON" : "OFF");
    +    7919             : 
    +    7920         107 :   output_enabled_ = input;
    +    7921             : 
    +    7922             :   // if switching output off, switch to NullTracker
    +    7923         107 :   if (!output_enabled_) {
    +    7924             : 
    +    7925          20 :     ROS_INFO("[ControlManager]: switching to 'NullTracker' after switching output off");
    +    7926             : 
    +    7927          20 :     switchTracker(_null_tracker_name_);
    +    7928             : 
    +    7929          20 :     ROS_INFO_STREAM("[ControlManager]: switching to the controller '" << _eland_controller_name_ << "' after switching output off");
    +    7930             : 
    +    7931          20 :     switchController(_eland_controller_name_);
    +    7932             : 
    +    7933             :     // | --------- deactivate all trackers and controllers -------- |
    +    7934             : 
    +    7935         140 :     for (int i = 0; i < int(tracker_list_.size()); i++) {
    +    7936             : 
    +    7937         120 :       std::map<std::string, TrackerParams>::iterator it;
    +    7938         120 :       it = trackers_.find(_tracker_names_[i]);
    +    7939             : 
    +    7940             :       try {
    +    7941         120 :         ROS_INFO("[ControlManager]: deactivating the tracker '%s'", it->second.address.c_str());
    +    7942         120 :         tracker_list_[i]->deactivate();
    +    7943             :       }
    +    7944           0 :       catch (std::runtime_error& ex) {
    +    7945           0 :         ROS_ERROR("[ControlManager]: exception caught during tracker deactivation: '%s'", ex.what());
    +    7946             :       }
    +    7947             :     }
    +    7948             : 
    +    7949         120 :     for (int i = 0; i < int(controller_list_.size()); i++) {
    +    7950             : 
    +    7951         100 :       std::map<std::string, ControllerParams>::iterator it;
    +    7952         100 :       it = controllers_.find(_controller_names_[i]);
    +    7953             : 
    +    7954             :       try {
    +    7955         100 :         ROS_INFO("[ControlManager]: deactivating the controller '%s'", it->second.address.c_str());
    +    7956         100 :         controller_list_[i]->deactivate();
    +    7957             :       }
    +    7958           0 :       catch (std::runtime_error& ex) {
    +    7959           0 :         ROS_ERROR("[ControlManager]: exception caught during controller deactivation: '%s'", ex.what());
    +    7960             :       }
    +    7961             :     }
    +    7962             : 
    +    7963          20 :     timer_failsafe_.stop();
    +    7964          20 :     timer_eland_.stop();
    +    7965          20 :     timer_pirouette_.stop();
    +    7966             : 
    +    7967          20 :     offboard_mode_was_true_ = false;
    +    7968             :   }
    +    7969             : }
    +    7970             : 
    +    7971             : //}
    +    7972             : 
    +    7973             : /* switchTracker() //{ */
    +    7974             : 
    +    7975         211 : std::tuple<bool, std::string> ControlManager::switchTracker(const std::string& tracker_name) {
    +    7976             : 
    +    7977         633 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("switchTracker");
    +    7978         633 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("ControlManager::switchTracker", scope_timer_logger_, scope_timer_enabled_);
    +    7979             : 
    +    7980             :   // copy member variables
    +    7981         422 :   auto last_tracker_cmd   = mrs_lib::get_mutexed(mutex_last_tracker_cmd_, last_tracker_cmd_);
    +    7982         211 :   auto active_tracker_idx = mrs_lib::get_mutexed(mutex_tracker_list_, active_tracker_idx_);
    +    7983             : 
    +    7984         422 :   std::stringstream ss;
    +    7985             : 
    +    7986         211 :   if (!got_uav_state_) {
    +    7987             : 
    +    7988           0 :     ss << "can not switch tracker, missing odometry!";
    +    7989           0 :     ROS_ERROR_STREAM("[ControlManager]: " << ss.str());
    +    7990           0 :     return std::tuple(false, ss.str());
    +    7991             :   }
    +    7992             : 
    +    7993         211 :   if (_state_input_ == INPUT_UAV_STATE && _odometry_innovation_check_enabled_ && !sh_odometry_innovation_.hasMsg()) {
    +    7994             : 
    +    7995           0 :     ss << "can not switch tracker, missing odometry innovation!";
    +    7996           0 :     ROS_ERROR_STREAM("[ControlManager]: " << ss.str());
    +    7997           0 :     return std::tuple(false, ss.str());
    +    7998             :   }
    +    7999             : 
    +    8000         211 :   auto new_tracker_idx = idxInVector(tracker_name, _tracker_names_);
    +    8001             : 
    +    8002             :   // check if the tracker exists
    +    8003         211 :   if (!new_tracker_idx) {
    +    8004           2 :     ss << "the tracker '" << tracker_name << "' does not exist!";
    +    8005           2 :     ROS_ERROR_STREAM("[ControlManager]: " << ss.str());
    +    8006           2 :     return std::tuple(false, ss.str());
    +    8007             :   }
    +    8008             : 
    +    8009             :   // check if the tracker is already active
    +    8010         209 :   if (new_tracker_idx.value() == active_tracker_idx) {
    +    8011          12 :     ss << "not switching, the tracker '" << tracker_name << "' is already active!";
    +    8012          12 :     ROS_INFO_STREAM("[ControlManager]: " << ss.str());
    +    8013          12 :     return std::tuple(true, ss.str());
    +    8014             :   }
    +    8015             : 
    +    8016             :   {
    +    8017         197 :     std::scoped_lock lock(mutex_tracker_list_);
    +    8018             : 
    +    8019             :     try {
    +    8020             : 
    +    8021         197 :       ROS_INFO("[ControlManager]: activating the tracker '%s'", _tracker_names_[new_tracker_idx.value()].c_str());
    +    8022             : 
    +    8023         197 :       auto [success, message] = tracker_list_[new_tracker_idx.value()]->activate(last_tracker_cmd);
    +    8024             : 
    +    8025         197 :       if (!success) {
    +    8026             : 
    +    8027           0 :         ss << "the tracker '" << tracker_name << "' could not be activated: '" << message << "'";
    +    8028           0 :         ROS_ERROR_STREAM("[ControlManager]: " << ss.str());
    +    8029           0 :         return std::tuple(false, ss.str());
    +    8030             : 
    +    8031             :       } else {
    +    8032             : 
    +    8033         197 :         ss << "the tracker '" << tracker_name << "' was activated";
    +    8034         197 :         ROS_INFO_STREAM("[ControlManager]: " << ss.str());
    +    8035             : 
    +    8036             :         {
    +    8037         394 :           std::scoped_lock lock(mutex_controller_tracker_switch_time_);
    +    8038             : 
    +    8039             :           // update the time (used in failsafe)
    +    8040         197 :           controller_tracker_switch_time_ = ros::Time::now();
    +    8041             :         }
    +    8042             : 
    +    8043             :         // super important, switch the active tracker idx
    +    8044             :         try {
    +    8045             : 
    +    8046         197 :           ROS_INFO("[ControlManager]: deactivating '%s'", _tracker_names_[active_tracker_idx_].c_str());
    +    8047         197 :           tracker_list_[active_tracker_idx_]->deactivate();
    +    8048             : 
    +    8049             :           // if switching from null tracker, re-activate the already active the controller
    +    8050         197 :           if (active_tracker_idx_ == _null_tracker_idx_) {
    +    8051             : 
    +    8052          84 :             ROS_INFO("[ControlManager]: reactivating '%s' due to switching from 'NullTracker'", _controller_names_[active_controller_idx_].c_str());
    +    8053             :             {
    +    8054         168 :               std::scoped_lock lock(mutex_controller_list_);
    +    8055             : 
    +    8056          84 :               initializeControlOutput();
    +    8057             : 
    +    8058         168 :               auto last_control_output = mrs_lib::get_mutexed(mutex_last_control_output_, last_control_output_);
    +    8059             : 
    +    8060          84 :               controller_list_[active_controller_idx_]->activate(last_control_output);
    +    8061             : 
    +    8062             :               {
    +    8063         168 :                 std::scoped_lock lock(mutex_controller_tracker_switch_time_);
    +    8064             : 
    +    8065             :                 // update the time (used in failsafe)
    +    8066          84 :                 controller_tracker_switch_time_ = ros::Time::now();
    +    8067             :               }
    +    8068             :             }
    +    8069             : 
    +    8070             :             // if switching to null tracker, deactivate the active controller
    +    8071         113 :           } else if (new_tracker_idx == _null_tracker_idx_) {
    +    8072             : 
    +    8073          17 :             ROS_INFO("[ControlManager]: deactivating '%s' due to switching to 'NullTracker'", _controller_names_[active_controller_idx_].c_str());
    +    8074             :             {
    +    8075          34 :               std::scoped_lock lock(mutex_controller_list_);
    +    8076             : 
    +    8077          17 :               controller_list_[active_controller_idx_]->deactivate();
    +    8078             :             }
    +    8079             : 
    +    8080             :             {
    +    8081          17 :               std::scoped_lock lock(mutex_last_tracker_cmd_);
    +    8082             : 
    +    8083          17 :               last_tracker_cmd_ = {};
    +    8084             :             }
    +    8085             : 
    +    8086          17 :             initializeControlOutput();
    +    8087             :           }
    +    8088             : 
    +    8089         197 :           active_tracker_idx_ = new_tracker_idx.value();
    +    8090             :         }
    +    8091           0 :         catch (std::runtime_error& exrun) {
    +    8092           0 :           ROS_ERROR("[ControlManager]: could not deactivate the tracker '%s'", _tracker_names_[active_tracker_idx_].c_str());
    +    8093             :         }
    +    8094             :       }
    +    8095             :     }
    +    8096           0 :     catch (std::runtime_error& exrun) {
    +    8097           0 :       ROS_ERROR("[ControlManager]: error during activation of the tracker '%s'", tracker_name.c_str());
    +    8098           0 :       ROS_ERROR("[ControlManager]: exception: '%s'", exrun.what());
    +    8099             :     }
    +    8100             :   }
    +    8101             : 
    +    8102         197 :   return std::tuple(true, ss.str());
    +    8103             : }
    +    8104             : 
    +    8105             : //}
    +    8106             : 
    +    8107             : /* switchController() //{ */
    +    8108             : 
    +    8109         212 : std::tuple<bool, std::string> ControlManager::switchController(const std::string& controller_name) {
    +    8110             : 
    +    8111         636 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("switchController");
    +    8112         636 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("ControlManager::switchController", scope_timer_logger_, scope_timer_enabled_);
    +    8113             : 
    +    8114             :   // copy member variables
    +    8115         424 :   auto last_control_output   = mrs_lib::get_mutexed(mutex_last_control_output_, last_control_output_);
    +    8116         212 :   auto active_controller_idx = mrs_lib::get_mutexed(mutex_controller_list_, active_controller_idx_);
    +    8117             : 
    +    8118         424 :   std::stringstream ss;
    +    8119             : 
    +    8120         212 :   if (!got_uav_state_) {
    +    8121             : 
    +    8122           0 :     ss << "can not switch controller, missing odometry!";
    +    8123           0 :     ROS_ERROR_STREAM("[ControlManager]: " << ss.str());
    +    8124           0 :     return std::tuple(false, ss.str());
    +    8125             :   }
    +    8126             : 
    +    8127         212 :   if (_state_input_ == INPUT_UAV_STATE && _odometry_innovation_check_enabled_ && !sh_odometry_innovation_.hasMsg()) {
    +    8128             : 
    +    8129           0 :     ss << "can not switch controller, missing odometry innovation!";
    +    8130           0 :     ROS_ERROR_STREAM("[ControlManager]: " << ss.str());
    +    8131           0 :     return std::tuple(false, ss.str());
    +    8132             :   }
    +    8133             : 
    +    8134         212 :   auto new_controller_idx = idxInVector(controller_name, _controller_names_);
    +    8135             : 
    +    8136             :   // check if the controller exists
    +    8137         212 :   if (!new_controller_idx) {
    +    8138           2 :     ss << "the controller '" << controller_name << "' does not exist!";
    +    8139           2 :     ROS_ERROR_STREAM("[ControlManager]: " << ss.str());
    +    8140           2 :     return std::tuple(false, ss.str());
    +    8141             :   }
    +    8142             : 
    +    8143             :   // check if the controller is not active
    +    8144         210 :   if (new_controller_idx.value() == active_controller_idx) {
    +    8145             : 
    +    8146          35 :     ss << "not switching, the controller '" << controller_name << "' is already active!";
    +    8147          35 :     ROS_INFO_STREAM("[ControlManager]: " << ss.str());
    +    8148          35 :     return std::tuple(true, ss.str());
    +    8149             :   }
    +    8150             : 
    +    8151             :   {
    +    8152         175 :     std::scoped_lock lock(mutex_controller_list_);
    +    8153             : 
    +    8154             :     try {
    +    8155             : 
    +    8156         175 :       ROS_INFO("[ControlManager]: activating the controller '%s'", _controller_names_[new_controller_idx.value()].c_str());
    +    8157         175 :       if (!controller_list_[new_controller_idx.value()]->activate(last_control_output)) {
    +    8158             : 
    +    8159           0 :         ss << "the controller '" << controller_name << "' was not activated";
    +    8160           0 :         ROS_ERROR_STREAM("[ControlManager]: " << ss.str());
    +    8161           0 :         return std::tuple(false, ss.str());
    +    8162             : 
    +    8163             :       } else {
    +    8164             : 
    +    8165         175 :         ss << "the controller '" << controller_name << "' was activated";
    +    8166         175 :         ROS_INFO_STREAM("[ControlManager]: " << ss.str());
    +    8167             : 
    +    8168         175 :         ROS_INFO("[ControlManager]: triggering hover after switching to '%s', re-activating '%s'", _controller_names_[new_controller_idx.value()].c_str(),
    +    8169             :                  _tracker_names_[active_tracker_idx_].c_str());
    +    8170             : 
    +    8171             :         // reactivate the current tracker
    +    8172             :         // TODO this is not the most elegant way to restart the tracker after a controller switch
    +    8173             :         // but it serves the purpose
    +    8174             :         {
    +    8175         175 :           std::scoped_lock lock(mutex_tracker_list_);
    +    8176             : 
    +    8177         175 :           tracker_list_[active_tracker_idx_]->deactivate();
    +    8178         175 :           tracker_list_[active_tracker_idx_]->activate({});
    +    8179             :         }
    +    8180             : 
    +    8181             :         {
    +    8182         350 :           std::scoped_lock lock(mutex_controller_tracker_switch_time_);
    +    8183             : 
    +    8184             :           // update the time (used in failsafe)
    +    8185         175 :           controller_tracker_switch_time_ = ros::Time::now();
    +    8186             :         }
    +    8187             : 
    +    8188             :         // super important, switch the active controller idx
    +    8189             :         try {
    +    8190             : 
    +    8191         175 :           controller_list_[active_controller_idx_]->deactivate();
    +    8192         175 :           active_controller_idx_ = new_controller_idx.value();
    +    8193             :         }
    +    8194           0 :         catch (std::runtime_error& exrun) {
    +    8195           0 :           ROS_ERROR("[ControlManager]: could not deactivate controller '%s'", _controller_names_[active_controller_idx_].c_str());
    +    8196             :         }
    +    8197             :       }
    +    8198             :     }
    +    8199           0 :     catch (std::runtime_error& exrun) {
    +    8200           0 :       ROS_ERROR("[ControlManager]: error during activation of controller '%s'", controller_name.c_str());
    +    8201           0 :       ROS_ERROR("[ControlManager]: exception: '%s'", exrun.what());
    +    8202             :     }
    +    8203             :   }
    +    8204             : 
    +    8205         175 :   mrs_msgs::DynamicsConstraintsSrvRequest sanitized_constraints;
    +    8206             : 
    +    8207             :   {
    +    8208         175 :     std::scoped_lock lock(mutex_constraints_);
    +    8209             : 
    +    8210         175 :     sanitized_constraints_ = current_constraints_;
    +    8211         175 :     sanitized_constraints  = sanitized_constraints_;
    +    8212             :   }
    +    8213             : 
    +    8214         175 :   setConstraintsToControllers(sanitized_constraints);
    +    8215             : 
    +    8216         175 :   return std::tuple(true, ss.str());
    +    8217             : }
    +    8218             : 
    +    8219             : //}
    +    8220             : 
    +    8221             : /* updateTrackers() //{ */
    +    8222             : 
    +    8223      120314 : void ControlManager::updateTrackers(void) {
    +    8224             : 
    +    8225      240628 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("updateTrackers");
    +    8226      240628 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("ControlManager::updateTrackers", scope_timer_logger_, scope_timer_enabled_);
    +    8227             : 
    +    8228             :   // copy member variables
    +    8229      120314 :   auto uav_state           = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +    8230      120314 :   auto last_control_output = mrs_lib::get_mutexed(mutex_last_control_output_, last_control_output_);
    +    8231             : 
    +    8232             :   // --------------------------------------------------------------
    +    8233             :   // |                     Update the trackers                    |
    +    8234             :   // --------------------------------------------------------------
    +    8235             : 
    +    8236           0 :   std::optional<mrs_msgs::TrackerCommand> tracker_command;
    +    8237             : 
    +    8238             :   unsigned int active_tracker_idx;
    +    8239             : 
    +    8240             :   {
    +    8241      120314 :     std::scoped_lock lock(mutex_tracker_list_);
    +    8242             : 
    +    8243      120314 :     active_tracker_idx = active_tracker_idx_;
    +    8244             : 
    +    8245             :     // for each tracker
    +    8246      843853 :     for (size_t i = 0; i < tracker_list_.size(); i++) {
    +    8247             : 
    +    8248      723539 :       if (i == active_tracker_idx) {
    +    8249             : 
    +    8250             :         try {
    +    8251             :           // active tracker => update and retrieve the command
    +    8252      120314 :           tracker_command = tracker_list_[i]->update(uav_state, last_control_output);
    +    8253             :         }
    +    8254           0 :         catch (std::runtime_error& exrun) {
    +    8255           0 :           ROS_ERROR_THROTTLE(1.0, "[ControlManager]: caught an exception while updating the active tracker (%s)", _tracker_names_[active_tracker_idx].c_str());
    +    8256           0 :           ROS_ERROR_THROTTLE(1.0, "[ControlManager]: the exception: '%s'", exrun.what());
    +    8257           0 :           tracker_command = {};
    +    8258             :         }
    +    8259             : 
    +    8260             :       } else {
    +    8261             : 
    +    8262             :         try {
    +    8263             :           // nonactive tracker => just update without retrieving the command
    +    8264      603225 :           tracker_list_[i]->update(uav_state, last_control_output);
    +    8265             :         }
    +    8266           0 :         catch (std::runtime_error& exrun) {
    +    8267           0 :           ROS_ERROR_THROTTLE(1.0, "[ControlManager]: caught an exception while updating the tracker '%s'", _tracker_names_[i].c_str());
    +    8268           0 :           ROS_ERROR_THROTTLE(1.0, "[ControlManager]: the exception: '%s'", exrun.what());
    +    8269             :         }
    +    8270             :       }
    +    8271             :     }
    +    8272             : 
    +    8273      120314 :     if (active_tracker_idx == _null_tracker_idx_) {
    +    8274       36363 :       return;
    +    8275             :     }
    +    8276             :   }
    +    8277             : 
    +    8278       83951 :   if (validateTrackerCommand(tracker_command, "ControlManager", "tracker_command")) {
    +    8279             : 
    +    8280      167902 :     std::scoped_lock lock(mutex_last_tracker_cmd_);
    +    8281             : 
    +    8282       83951 :     last_tracker_cmd_ = tracker_command;
    +    8283             : 
    +    8284             :     // | --------- fill in the potentially missing header --------- |
    +    8285             : 
    +    8286       83951 :     if (last_tracker_cmd_->header.frame_id == "") {
    +    8287           0 :       last_tracker_cmd_->header.frame_id = uav_state.header.frame_id;
    +    8288             :     }
    +    8289             : 
    +    8290       83951 :     if (last_tracker_cmd_->header.stamp == ros::Time(0)) {
    +    8291           0 :       last_tracker_cmd_->header.stamp = ros::Time::now();
    +    8292             :     }
    +    8293             : 
    +    8294             :   } else {
    +    8295             : 
    +    8296           0 :     if (active_tracker_idx == _ehover_tracker_idx_) {
    +    8297             : 
    +    8298           0 :       ROS_ERROR_THROTTLE(1.0, "[ControlManager]: the emergency tracker '%s' returned empty or invalid command!", _tracker_names_[active_tracker_idx].c_str());
    +    8299           0 :       failsafe();
    +    8300             : 
    +    8301             :     } else {
    +    8302             : 
    +    8303           0 :       ROS_ERROR_THROTTLE(1.0, "[ControlManager]: the tracker '%s' returned empty or invalid command!", _tracker_names_[active_tracker_idx].c_str());
    +    8304             : 
    +    8305           0 :       if (_tracker_error_action_ == ELAND_STR) {
    +    8306           0 :         eland();
    +    8307           0 :       } else if (_tracker_error_action_ == EHOVER_STR) {
    +    8308           0 :         ehover();
    +    8309             :       } else {
    +    8310           0 :         failsafe();
    +    8311             :       }
    +    8312             :     }
    +    8313             :   }
    +    8314             : }
    +    8315             : 
    +    8316             : //}
    +    8317             : 
    +    8318             : /* updateControllers() //{ */
    +    8319             : 
    +    8320      130025 : void ControlManager::updateControllers(const mrs_msgs::UavState& uav_state) {
    +    8321             : 
    +    8322      260050 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("updateControllers");
    +    8323      260050 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("ControlManager::updateControllers", scope_timer_logger_, scope_timer_enabled_);
    +    8324             : 
    +    8325             :   // copy member variables
    +    8326      130025 :   auto last_tracker_cmd = mrs_lib::get_mutexed(mutex_last_tracker_cmd_, last_tracker_cmd_);
    +    8327             : 
    +    8328             :   // | ----------------- update the controllers ----------------- |
    +    8329             : 
    +    8330             :   // the trackers are not running
    +    8331      130025 :   if (!last_tracker_cmd) {
    +    8332             : 
    +    8333             :     {
    +    8334       72726 :       std::scoped_lock lock(mutex_controller_list_);
    +    8335             : 
    +    8336             :       // nonactive controller => just update without retrieving the command
    +    8337      218178 :       for (int i = 0; i < int(controller_list_.size()); i++) {
    +    8338      181815 :         controller_list_[i]->updateInactive(uav_state, last_tracker_cmd);
    +    8339             :       }
    +    8340             :     }
    +    8341             : 
    +    8342       36363 :     return;
    +    8343             :   }
    +    8344             : 
    +    8345      187324 :   Controller::ControlOutput control_output;
    +    8346             : 
    +    8347             :   unsigned int active_controller_idx;
    +    8348             : 
    +    8349             :   {
    +    8350      187324 :     std::scoped_lock lock(mutex_controller_list_);
    +    8351             : 
    +    8352       93662 :     active_controller_idx = active_controller_idx_;
    +    8353             : 
    +    8354             :     // for each controller
    +    8355      561972 :     for (size_t i = 0; i < controller_list_.size(); i++) {
    +    8356             : 
    +    8357      468310 :       if (i == active_controller_idx) {
    +    8358             : 
    +    8359             :         try {
    +    8360             :           // active controller => update and retrieve the command
    +    8361       93662 :           control_output = controller_list_[active_controller_idx]->updateActive(uav_state, last_tracker_cmd.value());
    +    8362             :         }
    +    8363           0 :         catch (std::runtime_error& exrun) {
    +    8364             : 
    +    8365           0 :           ROS_ERROR_THROTTLE(1.0, "[ControlManager]: an exception while updating the active controller (%s)",
    +    8366             :                              _controller_names_[active_controller_idx].c_str());
    +    8367           0 :           ROS_ERROR_THROTTLE(1.0, "[ControlManager]: the exception: '%s'", exrun.what());
    +    8368             :         }
    +    8369             : 
    +    8370             :       } else {
    +    8371             : 
    +    8372             :         try {
    +    8373             :           // nonactive controller => just update without retrieving the command
    +    8374      374648 :           controller_list_[i]->updateInactive(uav_state, last_tracker_cmd);
    +    8375             :         }
    +    8376           0 :         catch (std::runtime_error& exrun) {
    +    8377             : 
    +    8378           0 :           ROS_ERROR_THROTTLE(1.0, "[ControlManager]: exception while updating the controller '%s'", _controller_names_[i].c_str());
    +    8379           0 :           ROS_ERROR_THROTTLE(1.0, "[ControlManager]: exception: '%s'", exrun.what());
    +    8380             :         }
    +    8381             :       }
    +    8382             :     }
    +    8383             :   }
    +    8384             : 
    +    8385             :   // normally, the active controller returns a valid command
    +    8386       93662 :   if (validateControlOutput(control_output, _hw_api_inputs_, "ControlManager", "control_output")) {
    +    8387             : 
    +    8388       93662 :     mrs_lib::set_mutexed(mutex_last_control_output_, control_output, last_control_output_);
    +    8389             : 
    +    8390             :     // but it can return an empty command, due to some critical internal error
    +    8391             :     // which means we should trigger the failsafe landing
    +    8392             :   } else {
    +    8393             : 
    +    8394             :     // only if the controller is still active, trigger escalating failsafe
    +    8395             :     // if not active, we don't care, we should not ask the controller for
    +    8396             :     // the result anyway -> this could mean a race condition occured
    +    8397             :     // like it once happend during landing
    +    8398           0 :     bool controller_status = false;
    +    8399             : 
    +    8400             :     {
    +    8401           0 :       std::scoped_lock lock(mutex_controller_list_);
    +    8402             : 
    +    8403           0 :       controller_status = controller_list_[active_controller_idx]->getStatus().active;
    +    8404             :     }
    +    8405             : 
    +    8406           0 :     if (controller_status) {
    +    8407             : 
    +    8408           0 :       if (failsafe_triggered_) {
    +    8409             : 
    +    8410           0 :         ROS_ERROR("[ControlManager]: disabling control, the active controller returned an empty command when failsafe was active");
    +    8411             : 
    +    8412           0 :         toggleOutput(false);
    +    8413             : 
    +    8414           0 :       } else if (eland_triggered_) {
    +    8415             : 
    +    8416           0 :         ROS_ERROR("[ControlManager]: triggering failsafe, the active controller returned an empty command when eland was active");
    +    8417             : 
    +    8418           0 :         failsafe();
    +    8419             : 
    +    8420             :       } else {
    +    8421             : 
    +    8422           0 :         ROS_ERROR("[ControlManager]: triggering eland, the active controller returned an empty command");
    +    8423             : 
    +    8424           0 :         eland();
    +    8425             :       }
    +    8426             :     }
    +    8427             :   }
    +    8428             : }
    +    8429             : 
    +    8430             : //}
    +    8431             : 
    +    8432             : /* publish() //{ */
    +    8433             : 
    +    8434      130025 : void ControlManager::publish(void) {
    +    8435             : 
    +    8436      260050 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("publish");
    +    8437      260050 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("ControlManager::publish", scope_timer_logger_, scope_timer_enabled_);
    +    8438             : 
    +    8439             :   // copy member variables
    +    8440      130025 :   auto last_control_output   = mrs_lib::get_mutexed(mutex_last_control_output_, last_control_output_);
    +    8441      130025 :   auto last_tracker_cmd      = mrs_lib::get_mutexed(mutex_last_tracker_cmd_, last_tracker_cmd_);
    +    8442      130025 :   auto active_tracker_idx    = mrs_lib::get_mutexed(mutex_tracker_list_, active_tracker_idx_);
    +    8443      130025 :   auto active_controller_idx = mrs_lib::get_mutexed(mutex_controller_list_, active_controller_idx_);
    +    8444      130025 :   auto uav_state             = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +    8445             : 
    +    8446      130025 :   publishControlReferenceOdom(last_tracker_cmd, last_control_output);
    +    8447             : 
    +    8448             :   // --------------------------------------------------------------
    +    8449             :   // |                 Publish the control command                |
    +    8450             :   // --------------------------------------------------------------
    +    8451             : 
    +    8452      130025 :   mrs_msgs::HwApiAttitudeCmd attitude_target;
    +    8453      130025 :   attitude_target.stamp = ros::Time::now();
    +    8454             : 
    +    8455      130025 :   mrs_msgs::HwApiAttitudeRateCmd attitude_rate_target;
    +    8456      130025 :   attitude_rate_target.stamp = ros::Time::now();
    +    8457             : 
    +    8458      130025 :   if (!output_enabled_) {
    +    8459             : 
    +    8460       22034 :     ROS_WARN_THROTTLE(1.0, "[ControlManager]: output is disabled");
    +    8461             : 
    +    8462      107991 :   } else if (active_tracker_idx == _null_tracker_idx_) {
    +    8463             : 
    +    8464       14332 :     ROS_WARN_THROTTLE(5.0, "[ControlManager]: 'NullTracker' is active, not controlling");
    +    8465             : 
    +    8466             :     Controller::HwApiOutputVariant output =
    +    8467       28664 :         initializeDefaultOutput(_hw_api_inputs_, uav_state, _min_throttle_null_tracker_, common_handlers_->throttle_model.n_motors);
    +    8468             : 
    +    8469             :     {
    +    8470       28664 :       std::scoped_lock lock(mutex_last_control_output_);
    +    8471             : 
    +    8472       14332 :       last_control_output_.control_output = output;
    +    8473             :     }
    +    8474             : 
    +    8475       14332 :     control_output_publisher_.publish(output);
    +    8476             : 
    +    8477       93659 :   } else if (active_tracker_idx != _null_tracker_idx_ && !last_control_output.control_output) {
    +    8478             : 
    +    8479           0 :     ROS_WARN_THROTTLE(1.0, "[ControlManager]: the controller '%s' returned nil command, not publishing anything",
    +    8480             :                       _controller_names_[active_controller_idx].c_str());
    +    8481             : 
    +    8482             :     Controller::HwApiOutputVariant output =
    +    8483           0 :         initializeDefaultOutput(_hw_api_inputs_, uav_state, _min_throttle_null_tracker_, common_handlers_->throttle_model.n_motors);
    +    8484             : 
    +    8485           0 :     control_output_publisher_.publish(output);
    +    8486             : 
    +    8487       93659 :   } else if (last_control_output.control_output) {
    +    8488             : 
    +    8489       93659 :     if (validateHwApiAttitudeCmd(attitude_target, "ControlManager", "last_control_output.control_output")) {
    +    8490       93659 :       control_output_publisher_.publish(last_control_output.control_output.value());
    +    8491             :     } else {
    +    8492           0 :       ROS_ERROR_THROTTLE(1.0, "[ControlManager]: the attitude cmd is not valid just before publishing!");
    +    8493           0 :       return;
    +    8494             :     }
    +    8495             : 
    +    8496             :   } else {
    +    8497           0 :     ROS_ERROR_THROTTLE(1.0, "[ControlManager]: not publishing a control command");
    +    8498             :   }
    +    8499             : 
    +    8500             :   // | ----------- publish the controller diagnostics ----------- |
    +    8501             : 
    +    8502      130025 :   ph_controller_diagnostics_.publish(last_control_output.diagnostics);
    +    8503             : 
    +    8504             :   // | --------- publish the applied throttle and thrust -------- |
    +    8505             : 
    +    8506      130025 :   auto throttle = extractThrottle(last_control_output);
    +    8507             : 
    +    8508      130025 :   if (throttle) {
    +    8509             : 
    +    8510             :     {
    +    8511      103014 :       std_msgs::Float64 msg;
    +    8512      103014 :       msg.data = throttle.value();
    +    8513      103014 :       ph_throttle_.publish(msg);
    +    8514             :     }
    +    8515             : 
    +    8516      103014 :     double thrust = mrs_lib::quadratic_throttle_model::throttleToForce(common_handlers_->throttle_model, throttle.value());
    +    8517             : 
    +    8518             :     {
    +    8519      103014 :       std_msgs::Float64 msg;
    +    8520      103014 :       msg.data = thrust;
    +    8521      103014 :       ph_thrust_.publish(msg);
    +    8522             :     }
    +    8523             :   }
    +    8524             : 
    +    8525             :   // | ----------------- publish tracker command ---------------- |
    +    8526             : 
    +    8527      130025 :   if (last_tracker_cmd) {
    +    8528       93659 :     ph_tracker_cmd_.publish(last_tracker_cmd.value());
    +    8529             :   }
    +    8530             : 
    +    8531             :   // | --------------- publish the odometry input --------------- |
    +    8532             : 
    +    8533      130025 :   if (last_control_output.control_output) {
    +    8534             : 
    +    8535      217842 :     mrs_msgs::EstimatorInput msg;
    +    8536             : 
    +    8537      108921 :     msg.header.frame_id = _uav_name_ + "/fcu";
    +    8538      108921 :     msg.header.stamp    = ros::Time::now();
    +    8539             : 
    +    8540      108921 :     if (last_control_output.desired_unbiased_acceleration) {
    +    8541       79851 :       msg.control_acceleration.x = last_control_output.desired_unbiased_acceleration.value()[0];
    +    8542       79851 :       msg.control_acceleration.y = last_control_output.desired_unbiased_acceleration.value()[1];
    +    8543       79851 :       msg.control_acceleration.z = last_control_output.desired_unbiased_acceleration.value()[2];
    +    8544             :     }
    +    8545             : 
    +    8546      108921 :     if (last_control_output.desired_heading_rate) {
    +    8547       76597 :       msg.control_hdg_rate = last_control_output.desired_heading_rate.value();
    +    8548             :     }
    +    8549             : 
    +    8550      108921 :     if (last_control_output.desired_unbiased_acceleration) {
    +    8551       79851 :       ph_mrs_odom_input_.publish(msg);
    +    8552             :     }
    +    8553             :   }
    +    8554             : }
    +    8555             : 
    +    8556             : //}
    +    8557             : 
    +    8558             : /* deployParachute() //{ */
    +    8559             : 
    +    8560           0 : std::tuple<bool, std::string> ControlManager::deployParachute(void) {
    +    8561             :   // if not enabled, return false
    +    8562           0 :   if (!_parachute_enabled_) {
    +    8563             : 
    +    8564           0 :     std::stringstream ss;
    +    8565           0 :     ss << "can not deploy parachute, it is disabled";
    +    8566           0 :     return std::tuple(false, ss.str());
    +    8567             :   }
    +    8568             : 
    +    8569             :   // we can not disarm if the drone is not in offboard mode
    +    8570             :   // this is super important!
    +    8571           0 :   if (!isOffboard()) {
    +    8572             : 
    +    8573           0 :     std::stringstream ss;
    +    8574           0 :     ss << "can not deploy parachute, not in offboard mode";
    +    8575           0 :     return std::tuple(false, ss.str());
    +    8576             :   }
    +    8577             : 
    +    8578             :   // call the parachute service
    +    8579           0 :   bool succ = parachuteSrv();
    +    8580             : 
    +    8581             :   // if the deployment was successful,
    +    8582           0 :   if (succ) {
    +    8583             : 
    +    8584           0 :     arming(false);
    +    8585             : 
    +    8586           0 :     std::stringstream ss;
    +    8587           0 :     ss << "parachute deployed";
    +    8588             : 
    +    8589           0 :     return std::tuple(true, ss.str());
    +    8590             : 
    +    8591             :   } else {
    +    8592             : 
    +    8593           0 :     std::stringstream ss;
    +    8594           0 :     ss << "error during deployment of parachute";
    +    8595             : 
    +    8596           0 :     return std::tuple(false, ss.str());
    +    8597             :   }
    +    8598             : }
    +    8599             : 
    +    8600             : //}
    +    8601             : 
    +    8602             : /* velocityReferenceToReference() //{ */
    +    8603             : 
    +    8604         468 : mrs_msgs::ReferenceStamped ControlManager::velocityReferenceToReference(const mrs_msgs::VelocityReferenceStamped& vel_reference) {
    +    8605             : 
    +    8606         936 :   auto last_tracker_cmd    = mrs_lib::get_mutexed(mutex_last_tracker_cmd_, last_tracker_cmd_);
    +    8607         936 :   auto uav_state           = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +    8608         468 :   auto current_constraints = mrs_lib::get_mutexed(mutex_constraints_, current_constraints_);
    +    8609             : 
    +    8610         468 :   mrs_msgs::ReferenceStamped reference_out;
    +    8611             : 
    +    8612         468 :   reference_out.header = vel_reference.header;
    +    8613             : 
    +    8614         468 :   if (vel_reference.reference.use_heading) {
    +    8615           0 :     reference_out.reference.heading = vel_reference.reference.heading;
    +    8616         468 :   } else if (vel_reference.reference.use_heading_rate) {
    +    8617         468 :     reference_out.reference.heading = mrs_lib::AttitudeConverter(uav_state.pose.orientation).getHeading() + vel_reference.reference.use_heading_rate;
    +    8618             :   } else {
    +    8619           0 :     reference_out.reference.heading = mrs_lib::AttitudeConverter(uav_state.pose.orientation).getHeading();
    +    8620             :   }
    +    8621             : 
    +    8622         468 :   if (vel_reference.reference.use_altitude) {
    +    8623           0 :     reference_out.reference.position.z = vel_reference.reference.altitude;
    +    8624             :   } else {
    +    8625             : 
    +    8626         468 :     double stopping_time_z = 0;
    +    8627             : 
    +    8628         468 :     if (vel_reference.reference.velocity.x >= 0) {
    +    8629         241 :       stopping_time_z = 1.5 * (fabs(vel_reference.reference.velocity.z) / current_constraints.constraints.vertical_ascending_acceleration) + 1.0;
    +    8630             :     } else {
    +    8631         227 :       stopping_time_z = 1.5 * (fabs(vel_reference.reference.velocity.z) / current_constraints.constraints.vertical_descending_acceleration) + 1.0;
    +    8632             :     }
    +    8633             : 
    +    8634         468 :     reference_out.reference.position.z = last_tracker_cmd->position.z + vel_reference.reference.velocity.z * stopping_time_z;
    +    8635             :   }
    +    8636             : 
    +    8637             :   {
    +    8638         468 :     double stopping_time_x = 1.5 * (fabs(vel_reference.reference.velocity.x) / current_constraints.constraints.horizontal_acceleration) + 1.0;
    +    8639         468 :     double stopping_time_y = 1.5 * (fabs(vel_reference.reference.velocity.y) / current_constraints.constraints.horizontal_acceleration) + 1.0;
    +    8640             : 
    +    8641         468 :     reference_out.reference.position.x = last_tracker_cmd->position.x + vel_reference.reference.velocity.x * stopping_time_x;
    +    8642         468 :     reference_out.reference.position.y = last_tracker_cmd->position.y + vel_reference.reference.velocity.y * stopping_time_y;
    +    8643             :   }
    +    8644             : 
    +    8645         936 :   return reference_out;
    +    8646             : }
    +    8647             : 
    +    8648             : //}
    +    8649             : 
    +    8650             : /* publishControlReferenceOdom() //{ */
    +    8651             : 
    +    8652      130025 : void ControlManager::publishControlReferenceOdom([[maybe_unused]] const std::optional<mrs_msgs::TrackerCommand>& tracker_command,
    +    8653             :                                                  [[maybe_unused]] const Controller::ControlOutput&               control_output) {
    +    8654      130025 :   if (!tracker_command || !control_output.control_output) {
    +    8655       36366 :     return;
    +    8656             :   }
    +    8657             : 
    +    8658      187318 :   auto uav_state = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +    8659             : 
    +    8660      187318 :   nav_msgs::Odometry msg;
    +    8661             : 
    +    8662       93659 :   msg.header = tracker_command->header;
    +    8663             : 
    +    8664       93659 :   if (tracker_command->use_position_horizontal) {
    +    8665       93659 :     msg.pose.pose.position.x = tracker_command->position.x;
    +    8666       93659 :     msg.pose.pose.position.y = tracker_command->position.y;
    +    8667             :   } else {
    +    8668           0 :     msg.pose.pose.position.x = uav_state.pose.position.x;
    +    8669           0 :     msg.pose.pose.position.y = uav_state.pose.position.y;
    +    8670             :   }
    +    8671             : 
    +    8672       93659 :   if (tracker_command->use_position_vertical) {
    +    8673       93659 :     msg.pose.pose.position.z = tracker_command->position.z;
    +    8674             :   } else {
    +    8675           0 :     msg.pose.pose.position.z = uav_state.pose.position.z;
    +    8676             :   }
    +    8677             : 
    +    8678             :   // transform the velocity in the reference to the child_frame
    +    8679       93659 :   if (tracker_command->use_velocity_horizontal || tracker_command->use_velocity_vertical) {
    +    8680             : 
    +    8681       93659 :     msg.child_frame_id = _uav_name_ + "/" + _body_frame_;
    +    8682             : 
    +    8683      187318 :     geometry_msgs::Vector3Stamped velocity;
    +    8684       93659 :     velocity.header = tracker_command->header;
    +    8685             : 
    +    8686       93659 :     if (tracker_command->use_velocity_horizontal) {
    +    8687       93659 :       velocity.vector.x = tracker_command->velocity.x;
    +    8688       93659 :       velocity.vector.y = tracker_command->velocity.y;
    +    8689             :     }
    +    8690             : 
    +    8691       93659 :     if (tracker_command->use_velocity_vertical) {
    +    8692       93659 :       velocity.vector.z = tracker_command->velocity.z;
    +    8693             :     }
    +    8694             : 
    +    8695      187318 :     auto res = transformer_->transformSingle(velocity, msg.child_frame_id);
    +    8696             : 
    +    8697       93659 :     if (res) {
    +    8698       93659 :       msg.twist.twist.linear.x = res.value().vector.x;
    +    8699       93659 :       msg.twist.twist.linear.y = res.value().vector.y;
    +    8700       93659 :       msg.twist.twist.linear.z = res.value().vector.z;
    +    8701             :     } else {
    +    8702           0 :       ROS_ERROR_THROTTLE(1.0, "[ControlManager]: could not transform the reference speed from '%s' to '%s'", velocity.header.frame_id.c_str(),
    +    8703             :                          msg.child_frame_id.c_str());
    +    8704             :     }
    +    8705             :   }
    +    8706             : 
    +    8707             :   // fill in the orientation or heading
    +    8708       93659 :   if (control_output.desired_orientation) {
    +    8709       77788 :     msg.pose.pose.orientation = mrs_lib::AttitudeConverter(control_output.desired_orientation.value());
    +    8710       15871 :   } else if (tracker_command->use_heading) {
    +    8711       15871 :     msg.pose.pose.orientation = mrs_lib::AttitudeConverter(0, 0, tracker_command->heading);
    +    8712             :   }
    +    8713             : 
    +    8714             :   // fill in the attitude rate
    +    8715       93659 :   if (std::holds_alternative<mrs_msgs::HwApiAttitudeRateCmd>(control_output.control_output.value())) {
    +    8716             : 
    +    8717       72146 :     auto attitude_cmd = std::get<mrs_msgs::HwApiAttitudeRateCmd>(control_output.control_output.value());
    +    8718             : 
    +    8719       72146 :     msg.twist.twist.angular.x = attitude_cmd.body_rate.x;
    +    8720       72146 :     msg.twist.twist.angular.y = attitude_cmd.body_rate.y;
    +    8721       72146 :     msg.twist.twist.angular.z = attitude_cmd.body_rate.z;
    +    8722             :   }
    +    8723             : 
    +    8724       93659 :   ph_control_reference_odom_.publish(msg);
    +    8725             : }
    +    8726             : 
    +    8727             : //}
    +    8728             : 
    +    8729             : /* initializeControlOutput() //{ */
    +    8730             : 
    +    8731         192 : void ControlManager::initializeControlOutput(void) {
    +    8732             : 
    +    8733         192 :   Controller::ControlOutput controller_output;
    +    8734             : 
    +    8735         192 :   controller_output.diagnostics.total_mass      = _uav_mass_;
    +    8736         192 :   controller_output.diagnostics.mass_difference = 0.0;
    +    8737             : 
    +    8738         192 :   controller_output.diagnostics.disturbance_bx_b = _initial_body_disturbance_x_;
    +    8739         192 :   controller_output.diagnostics.disturbance_by_b = _initial_body_disturbance_y_;
    +    8740             : 
    +    8741         192 :   if (std::abs(_initial_body_disturbance_x_) > 0.001 || std::abs(_initial_body_disturbance_y_) > 0.001) {
    +    8742           0 :     controller_output.diagnostics.disturbance_estimator = true;
    +    8743             :   }
    +    8744             : 
    +    8745         192 :   controller_output.diagnostics.disturbance_wx_w = 0.0;
    +    8746         192 :   controller_output.diagnostics.disturbance_wy_w = 0.0;
    +    8747             : 
    +    8748         192 :   controller_output.diagnostics.disturbance_bx_w = 0.0;
    +    8749         192 :   controller_output.diagnostics.disturbance_by_w = 0.0;
    +    8750             : 
    +    8751         192 :   controller_output.diagnostics.controller = "none";
    +    8752             : 
    +    8753         192 :   mrs_lib::set_mutexed(mutex_last_control_output_, controller_output, last_control_output_);
    +    8754         192 : }
    +    8755             : 
    +    8756             : //}
    +    8757             : 
    +    8758             : }  // namespace control_manager
    +    8759             : 
    +    8760             : }  // namespace mrs_uav_managers
    +    8761             : 
    +    8762             : #include <pluginlib/class_list_macros.h>
    +    8763          91 : PLUGINLIB_EXPORT_CLASS(mrs_uav_managers::control_manager::ControlManager, nodelet::Nodelet)
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/control_manager/control_manager.cpp.gcov.overview.html b/mrs_uav_managers/src/control_manager/control_manager.cpp.gcov.overview.html new file mode 100644 index 0000000000..f41fccc5d2 --- /dev/null +++ b/mrs_uav_managers/src/control_manager/control_manager.cpp.gcov.overview.html @@ -0,0 +1,2211 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/control_manager/control_manager.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_managers/src/control_manager/control_manager.cpp.gcov.png b/mrs_uav_managers/src/control_manager/control_manager.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..e29b55318a5df5608897cc49d340da4d0502872b GIT binary patch literal 25989 zcmV)hK%>8jP)oImN27<8*7l%>b^?=S<>EX~~zyb#;M%^k@kI_Pm z8qgq*YC!#R9X>{(_x7%3a+Ix^Jq8^-g$-? zN8rL3#|;x<95T>(e5}qjD`q2Aij1p$j1o?cn4va>jFIIdN09{BK29}82{0RH39xOP zEJmF%EHF|8Y-S{b(Ljt|hxce*4&w*Nqv3?au}1*xSlS4qg&4iv(>}OQ8soT)I$%8R zgFFtk0G89TEE?z4FVIr&c^2TQ4jTZMn*2wMHFGKgdf^e}DE;HHy!rr^GC2V7Sb_uW z86|LY1b3+19vsof`e{lHXzY3+C`G`LeNUJfDApyw;XR|Si`XZ0eRLA(*UcD=JH9&L zPP78!c&ZO-`BTV)t*J!J)ZFe7G~_V}Q@f4(F;l1p)No_oTn}?qe9p`~IzLwSxwsUR zfQuUAX&9ikLF;IccjgG}@F5qqV1p}LQU;7#QW1On-SY|kdBltF2#n0?>kj^F>7g_m#B+<|~x|KE}4@Yc~RZ#41Dwg%Q?(NpP2J zm+xtMOi{FJzkt^Cu3C!wHT+P*7y(DjC>mfb-b7_YVUpDt#~8V3Q}F)*ecGbhPqh|8 z6ybL)rW{bv>%r4m>UGI5mWWV=Q6j1XA2Ay{w#X_U!zNVaV_2yjER>>U5E3-}&P zr29KyjE>LrktaqMNVb1ZoZN7-8>rTXd?;@LEnWMi02z5qoak5z2`~GN3JY8fN*C8YWURDRaF z0-}(z_Zuhl*)|Xpw9*1ub4-`9VVn&|L`B!BBdxW!Lmn4kGaPr>JDzgD)8QEWbnZ8t zHedjkqa*g{Bu0U|3K`zjO+1dVq!0+VBhV6O#u^v><$eBE=oW^Mg?O6z$$p`u#du$6L*3$e#a0fRj` ztgIg_(vTR~>wiRkT&P3ai7B+Si##AZF*XB=GeZDNQ@EJ; z_&PxQ%q#_}A)swJaDKDS{TgB;BH#W!gN=7p&26_r`gS2yHlu*5s7GNggl@cKF>EuYzCz!#QZ}7;A!qyC#jeBWr+ai~wZ? z@D$-|fNkt?SCUPOt8c%K3p*ajp&z8l-xGb=$C6kwEab!eIIhCqG7pg(W5r5AgOe-( zma=vw6&)I3VxS{npbsGT*XS|AWmE{0!VB@{TNYP%IOs6zMYTW z>WR~FlucK}^+on*9*C?7E+is{og(Ilfv1U6@?Z~OPwssu#L%lS31i&?7XbUEhca9S zJkW*Teec@J#{w}&FuH??(Kbdm!eh905ssuSbA3GS;V}IH1E&!2Qy5}4M%AtTkRjqr zl9Jqj(Zy+00gA45ATbINQW1k&U{z()L?@FT%ig&l(q8HB&oaOiE*6;?hl|FTd!ziM zqevSFm`Gv)$x?7)#Cni&Q$1izW4Evet^XnE9O$M3-njT)>=@DdA2CQQh$tkG0m0$>B%NU;x-4^xhrJU^j;&M$j;R@Jcm*3rwA%< z37Z|bvWHWi>7M+jUO*1^D5yOFFnkXeY?0v=Km)^vYqMjvqX>XVFJx@$1zdM>{;33bf=A9WAVAtiOa+jhq`0A; z1gaTeftVap06b#QMP|=J<+;E|jCBAY8Rn?D-rEw?UJX!cNk#IOWIlkAAw;4vBIu?+FmH`=U#(m%8P-O~b%e+SK)|;8;yQvMMjrGyD#I9$C0w{i^%zGCGO#f6GL4q$ zIu5ol&|J&}J;edG5dnz-gd9bLkb7l}km1QE)-h5%#w8q1g$RxKq0nJAGtxL2hCe1H zpB!#xq*=66T|B|UnW=LgFogG4~Y$&Rt1u9=n{XHP;qVlY$Jjcy$o<q{;w19v!C#L^sf6y^pJ%#$NVR_74 zlQtjsjte;Hv8TPN2dN=9<(Q(W-M!rsf23XKs~R~%t+SeYUH#8=DrskNU<@Gs4Imul zu1|jO8O9|8TzuCCO34^?N)G{Q>+RLwV^WRrNTxdOi=Lf!j8fYV!(akLz&I8U*hEY? z=R&bo z3r&;sPy{1fcB$gATkL!|QnubY?)3u35@VWb=oL}SNB`(p7uDzdVZ;0dK_f=kN`P$`{Tpy1U>x`+_D;l%eKnEk8gfbm z+&o6j!*V)6k5Q6%@(yG^n_C1_HiS_SkG-`{;Yy`A{`^VnddQo*uI1~R*O48oaKpkN z0RH~F4p576({~+3EeC9)I!JELNl{6F;DrcePaKkN$%9hMBi~1;_--04@ASP>XCSr&ye!*c5J;h(jzbg=vZHJ8U!K;qGZJ6WcAdFyoN`PR-P4cLpqLVK8 zL)r`dAc66rW>3Pn$p_Nu7C;Gk12J2oh--!^JhUvd@)VLeMBXt>wFrpqM?HHy#?o2A z0qQ1OPxa5w{eHXCcD>zxaQg-PAu!?3Yxw!`zdHo{DYaif+KC9bk1-n)11OC#jxqxr zG)9A%p;_H_`PtGOC!u(zwTC+I(&6m+zV(FUSH(uZ*|tMI)o8M>x5xi)yF99<`gg8% zQ*D{+BEQpGS6L~W!0;U1Wym&+RJ3eAX22ytgj3h`CXW$e>lR$v*76w17&I7nly$&O zhcUTl^|qM~VYTas^10R?Iw-Yt{ky#a%VYo8=##?x^ok_$v57mc38SRQ&)3J!cKd84 zMc|r*;xQM%_#so%J~JEsIZjP=W^OmPjlAv5Acm{pn)D-{7`kNIX9iD9S~As{2@~^% zYbJM<6lMk;UDX?Vb>|wbnhm=`1b%wg&m1GsRPj3##-fsPqx}8qBa~Fib{P~BTb;td zERD&vX#l~RQ3H;VaMyHZp&!C9ssZ3gVm4*h7ws7J>~Vl&h*4Y3q2qB%3IYzBnN`*G zMSc1J2cP~iV)fVOeqhwI`Hp?0W09vCn7SqQ=r6iiK8k=Cblg&~sAk>yIt-v&%(5_+ zHw4TkTm~ffIwBywhU^E_k1+$(PGKxP*=#Bd=OYaz(HZPp3)O6W4TFI++%aTW*Y;fj zTz>Y>HJQTb>JfuEwPPG|5Z5tW>G~ucPq`%>X_4-u7~S=zG&I+dmXvlWfK@o4YvMQ` z#>Z&wX))4AH+*0Rw_K5fXLG&5t5R3=p3Md>X@2* zJjEb?7tvWDM#^ij8|;g^44Af7$|K8Y@(VAHhX;4 z&BqM!)^D3_w0Za=A9J z$Mc0f7-xX^sJ9g`p80LA4A@GHDk-+~}icm08(XLWDg@P#@FjXiDilSF2Zdglv%q7XbT6!mA`l@K{LTRm67XMKoHGc#i$3|)EHM4U`#qK1DZqA&%ty4Xzn{azz}hc03B$S(H)Wo z?0_5BwXYCDF=o68STn$li;`S71|tW!?aLJcZX7Xd$h1=v(=an2F9&K=HpwsV^wQ8Z zT$?389mXHQBy~6PH}{u!Ke&dhi5^p7M}~_4u-7DqtXo%VChLC()L1lKV`N7uj`2!H z`Ho|}y<&`f{ky_kGk{OvBg4zW7%?xOHby=gM;s&M<@5NMNn~kVBZ+*{7&(b7@-YMa zPuC2?4sML9v!=dlvKP`#HEqLjjJ2-aUx|mosTOK6hO_e&s^?tLgu7<{|L_*$ephSl zF&Z%8;Fev$SdEV~gVA`(s$*^&Ii_qbk3u$(z<^4C8xWYRSD)dzJ+JG$d!}o-?ll1v z8BWL8T}eAzg|03ki!q1eF{+|$WInDL;Fphuu4lL(U=X4zcuvm7@qjaf=N`hN3PR*r z{hTot*qOT@1a?je@bk=pGKs$N+U&x$o@B}XTmTdZ`0lv?S(IG_{JdNMH|#&33$R~3 zJpLxDP$}W!l?J(QG+$|e5vHF=K9_KVlVenN{mlh%kWGM%#C&rB#*Xou3(z;lSLFg2 z##l%i0I7o>u#{*U0iT{U;L*Hw(t!Ww<2QDq!?l7tAp8kjEwHolO1%xQefJ%&KW!Gmdpk<5zRxvXUybd_9Yb?$(AQ5{dF}!=9 zFCNGODjQM&AZh>Dt^gYL!Vq60j8RPtz*x+9>ACUYu};`sIn@mJj{zl)ACkjTji{7k zFNjLv4G#0b z)B_5uKhtJ@Ks-j9;D!#Esb29Iw~9=3`EjKPHV9J0sEO~}I^U^KOkrV=nlY{pqjrqs z!5_S`#+(ZUwZiQ)tOzyxAMqnTJ;df8S;&=FS0089T@QT(dT)&{-yE{{ z6{l9cg}?s$KQji}#9KYE21CZ8atbd|4vMM(9{1#Plt}?_%az;dup0-2Ywt+|AvX3B zqT&_OJICLXMwabaEisyOxdKYv2giU;hF=&JNuAP;o)r_q0G1LFCoo*xRqMoTmn=Xd zcg0KOyc;o0w8=XXGfd1LYDXC3GiL_R4o?g-JM4`QH#^TIhQ6jH5_2KiEMo~fJ5Qb& zlAOj7vuTLoSIskt*@{a6z0F0F{513ORRDEjF8P4iu9Z#jkurd4J6zqS*x}yFJr2Un z*tqd-^8%K3ligEfsXOi|PI8AjhzC@f*V_d1I=tn(Pfv;A!E`-~y{3!B^pCO+VpCwe zTwJL?l*Ob1+`kb|LD&u#Fgo|Fo{!OMlpP)^ABp8JV4MJ`C#LD#93EEzUrjtW8{>Pn zf=q0lJrR(V2@rU3@kMISqByDnFRm>33jvivA)l{fRQ3J=V$8rj=>GqA$pvuNLa)dL zDDN}snQ5W=6l3upe+PhPJZMo)F=~*n62VYeU zP>m6v0VK)DQ|N(`ECSL!WMcvMul5oG8{VBeh$+aUx(dR3Xxvk<6c$blKT-D}1FXr9 zOLy0yF~jAcSlD&Jl5AC^$e4OApqzo#prk6fv2eKpF0z0#ik8H_5&c=gBm>nYpJt$} zXLqI7_L~Hl-<9-sEhSaG$HpG?BZ@S7&SPVg?}U$LhL;vXruJ5Lt{<(}h>RQ7jGZQw?Xh2k&1lUc=Iv>5YC z_83*Lrkm^@jA;Mdw15%3sq3|LChgk`F|$ILtpRXQ*PcKVpswp(S1h}WFuthZ9x^^= zw|(io^v4HLQ-u1Mm5|duF%!xgS*SkkI&{B}Tf)6u&*gK#7_azz%sWQ;AZEWn+8#t? z3M1BMGO>r|h|txwF@Pa&Ib&mvku!`Z0_v$=d94dy9I#>B2PqdAY{iI2N5;EN1JsQ1 z(H^V4D&D)19aFVso80s~&n%NYltYS3n?RkvtFQ*Br~11Ji-4Lj{<&2+x16=$+wZ(N zquxaZP>!g|Fb2SC*B+3&cHsco+r0^Zs>bp$f91iFX-6?i=e^!r(j7ONah{kR2cB^O zqXVS3DIy@8@i7>i0h{^w%Q_yg8Dl~Wn%S~nl5IaApfq5tE2)A_5jVtkn?h(>z|~TL z1z?m*5w(~Kct|NDAOgBA?z(%Ce|NdvHO%c~K6>^F9~-#EzizkqS`PpO-$vIn-86;w zdr{YCM~w^JSp745GJBv$)_>k#w@Ca*fbiQe0TiRg1*sSBofb}9NH>!JHLW1wxoQ@a z_=;SN0!E?h&N1Tl08}}VtxD>lrs&PX|DvP@bZv`u{p!cBe&nWbIH0C|^jz5xW zqP~W*CwY*@V4N|=c~huzkmSySi#tQEd+xi>+J5|W_^hDVa5v-Kn@_#+Wh6008(5?# z!*c0WDHj)%PzN+&+y}Rnip4ikEr+jNn&K&b<+l|6fEZo@RCb*ToK=t3gXO zgfr^VFx8yD^=+uG3(q-)UY5r=1yIMHbG~(TVw}bBQ6lzeiH}<;Irh>5_&?1|8l$Y} z2{8i!byOpa1-tmgfU1Utq7aqWcT*t%j!xZ~q$rjc?o|T(8gXAEt~iBXBd)cb|B?}> zZs)JHH>%CB_O`N*;^JRKM26mw5UmTeA4?d=16s!T-a>Ky8k%22lL8vrXdNY77BIxT zRZ-RX_?^i8SXSWxvhs4;{Av0doeZ6^gfyUp;(EfkOrtvu-UI#nTf8{J%>k zx^XHhAv!)vfGen5xaWs!i!eU75+bO!Q%qh)dm;Et7CX2wg<>h$zW6y3;CM%qmKObE~@&JZa@AnT!5mLkach{B*ENluYoV}{6`e2Pu4 zNFTvwjx9Hgf)si92tFnWUt&B3d`!ISQKC{|rCse6^TRJ@e@}`)^xtsRlFoQz=Kw(< z5c!_>1DG2 zvo$`4k7kT7WlzBY(dWE!9LFCF#LNl3^o1;z((x?%3i&ApbM5{<2g3{<(AH%3+76Jx z83nvjZZCr)N5P5=+k-&a_iMLlE@5MhL4QsAHC?u#PXGWQ07*naRC)(8?A`+o6}V-^ zaxAWR!12WFKsV?*mkO5m5%4SlnybX9*TPw80@yE+s}gxmwt~>Mp04wnG?eP~B04kD z%y=_}Ix|+xqgN`aWK!^f0Aauhuo!n`eCf34%K$U==ArUx!6a4&%SR))l$HXr82{a{btcsck}=G z;;6T~!EdIX8AIuEEgyHaw{F5-)QHhfh@Wv-KpofF@63vYBQ8`_XEX6DJe>Y1tUnyp)$ylYywIA|0kq-zGK z#whNZTiiV%Mg)i1zF9ZT9hqi~n#J{Kui7EHJMyK3hN4`BjH0I{K;K$Y*jZkM&>>|AMf8jk_ww^$B`5u41etQ zY7@pf;HyrW>ZOp28M`LFVphkfu;F;m$AvI#kI^(t;aOwD{XNe|vU`@2-Qx?FA5+MO zzl3l>0KWdYA;aZNXKUq`O`H1x2>4@7Hp=6V(&lP3kP0@J(LhqzTsDlA1NJSPuR*)I zu_vPTpLUGu2D+|~adc_kX}bcE$94(-`N|^@#B>I@-HANjvoip~sBW=q%@|)LkFTz* zbc%PH@jbn8&1gQc(_=G}OSf9r3>BRqGEs`I)-}V(6bq?*_b<1cg_f6rjT2c>r>w_8)dk`+;Lqy6;_5i(?ld8 zVwnJL;tSyuB2!_^S8@07J69=VC=#O`qnp8GZ=8_c2+JZ57})mO*|_t~k}B~NPe{S` zzd>ygKbrO#u%|6P>46cDpSaDGYdiPdeWdfwEuO7fG3o%T7(eFjBShM{zr)*~jq$kN z;zD^b$qMrw5M!84;9G6Uk+7U+mSecXZ976R{GOLgKCCPc z7f2B17QP%m>yjOg>TfQ(#0jF?Vz7+u7c75|_cMn*X zvk4)rur6Ql;;>e3vD_YL7!YIzCoQoWi|F9=qUdj~PhozZh-1u-AFMXAhF((PiG9d` zF++vHIQR{Sb7^Y)9s9#vF(p+szbe6TC(D71++p&sXXm?u5L_fkL3(^x-$e|oZk?G6 zcxMCsLD*BGTE&}l$`A{e1LZNI6U~rp7l!Pt;vfX9Vw}2W=*Y+zRb5kzA;N{GU$kQk z)o|$hASUU_Fa}dEn;F#@55WXT$K;b>BRbGqY9kmN7D2SEO6F#BrRr=y!M2| zle}V?AATCXyu)c&E?8#uGA+{1k5RsM&zA3ivk*5`PW$o^AMr<~6JeEci2x8Qlkv zBoS&q9Xb6b-3_B3H%nSI2^R<<5X=-R8^w4Ff5mt+A4417zrNE(WkoL(*nZ>#mAZ)G z2Pgt^#7wbBL&R=y$1e*Pp&%p}X9Cn7DILP*a;h5{?qd_90L2+?#`utMb_&cGs}nhG zt`(F0v6|uk4r{weF~cs5u@V-axo*(I)x#8-oOO0<^CRV3YBBb-mU~W%5F4@~!FiiGik8~$k)Bv{_h~IgTu2c;Kb%(OrxRxZUMdA3 zn{slCuUZ;sMsw4h&kXaR-qu<*J!y>F z8HV#bhnR`AafUtHnr{nXLuiXuWH6>#8i+B!aef+LP?c?OHc1u|j@>m!A^Qt)Z=*?T z1`+`%&&Fu#nv|1Za`Q>o+jimO;`EE_3{Yanek(B$BO@FXqYN6_>?m*Ngz`UF*lFt}&ER6H4CD zJIw+O2=IkB;)vlAN15=a0((@%B#h%;FeZz01V)u>xb@06R$*AOyO48;bt}XbS&2DA zWdr25m6-EcxDL|-!b_S*>*!jz6SrantPvRBJVtQw8tS)gOxX#x)BV?M7u~ViC!KF7 z$RmjHKl)k>om0rDm411IF8{76ge?Pnu?|-dGozYBd;le?vsfo4`TFznMgxkLOc$ZYyS z-6!xAXVdu_-0qowooU?l)txw6Djj!c&h)A)u0#!Sf zf|!qQ93$2}H?rYfA)p!~Q=lS7AGtLc0Cnk?KR-I1+mT=#hK7^V(iTV9lF8d+at5nX zIz;I*&~hQ>Yp}%kDS^l5@j>qT9*UJ-A>A0Tl2)Bzyalz~P7J(|_LOB8e0$e8_gNgH zuInF;n#W@no~BR>0%peZ5}RWzuL$E9kyTNmTArI*2B_+K^h?nC1|&Sx8j9kP4h26{ zD28P33qp~KK;7OUZWkK|J#P~T6q81S~9=|ofCNWXiVld_EcEZhA~?y zsJ7xCi~1aVOwW zubh0qjZYq-K|XjE)o*;fU-xZpe89U1oi{!)AIJRLOiLxk9!;)B5&*XZD8hMD;4lZO-7T1pUFGxa9p(O;bWZr zFmb5d#YwojYbq5vJlwbK|1dG131h^jSTKEe;LI-82hNj z%Dm*4Lq0fHx~V{nhCke#D_+M(AwkUD+Fw&vP%}o*)PVQKJftj^OOU2{kpai7bKb}@6*$?q zTp=5839tpDW1}=imW>SH%&;A=z|;ELziiXt;f}53V&NB8{(5u!;*w%myBAkT5p5C* zh;fgl7X=rKcakIuIDc{Vrwta_NPNv^j4qQy({*4Y_eAgHDhM!>t7~x`gWDJ`!#i))E) z{}he8WagY`#F1HeQzH%+U}(hnHRA3g4nEH{;y%ld>%8^-7}?yE{LA(0$5nQn&~AM< zkj|Wm$7b)fO2>w1&Zu7{(-Wga31X1;pQTq@X|R&`ylWxU&A;Ob07r)c4}Z5E^0D^r z9?Wf&H5R{f0s9^RzPwmlIFtsbV$3he1b5wPPbcbHWO#8MoTHdkE?v(hdEBDZ2f&Y! z$8w-6W>39zd4WAm%k_`N*c^vmyE6NAo~^Xa*{>(Q&hh+*VDne)dvi%MjC)#49y`>Q zof>bix|953bZ_A$cofP}vjCLr!7qb|p(3X6P`VSkEi@j_dVrdK6gQz+^)?i*L3Z=yP`n{dH& z6f}P5dY9>SBWh)h@)^6nR9XP6Dgixv)D4YLK4@C`I8@)e?FPE9(k^!M$GQDQZ54j0b6v%#q~-n&Ni4y55~0rU$R4-ZUWQ{1`(>4%kXkSf3X0VzW&&7PTm4;U z-DiNjVz#bpZLqsSF`HEiD7Yb(1$1546f?VX@lCH%)a+3=FhY4(KhLxumvE3uk?c8% zKG@v{yi2E~^BK9X_P-@!=)7fSYQ-u;U?U_eo%RvQPPgfj@m+{G1-HNB2uIL8Clmk?P1)$a~6 z>!zZ3k!qbnuVj2Nf>g^f2u3m?qKQ0mRbQ+V4Sl4DQLglN?jM^;K z_qjnW@YQA&z-MZ+#tVqAHXGB%+h**+2THO3dsbTYP;CZOPjO{85d)7{S>AwgUEg+Z z(ye61HLAS=-Op8f&EfMeQ+tP)KON3e5@6rsPCa?-VG0AU^99?2@ya}ZLJ*p>0juSE zLI~^42dv&=O2Q)*apxEYtjpO!`9w~o>sVt@=o+NEqpo%A8Sk@GuKynZIIQU1UA0;b zz7%zvy1NdF(v;5%`1|i!;d@rdmhMMvn&Q0>iFq{{?BrgkyWU>Q>7xv2>H067J_hf&WCC5o#dXu`mtXx@1XMTq-rOmek>@;)}o+jb@{6L`yZARC{Br+Z&-J5;`Vog!&Zs>*LqGD$ENHQdR}4L-f&^&5sL@eh zQ=x_tUgQi}426pvd&4NP8a*0d|fd0p8Rx^wO28^P9wkj#^@)HZRReE%npGu6N20Sy+c8q4hefSrz zs84g((~hLJb0K^l=IX1Vh6s#FyX&9aKE_;>{;~M*>>Rqr<6B$d0PTwn@wmrT&bfr+ zqy4zI|N5vWQDMoF%A=M#j15nN!6PN0|fLcB(y{Rr6Fx27NFJ&M9 zb6>3SRn{{o;8iL1HKBl)x`hls_-OlpK#oNx#%c&siA@i~xsr4TLPt5mMwvjMXA~uXXO@!ki<<7*x-%Jf~H&r@fM68f}cLraxw&4c`iVW8^&biOZWC4&?57oMH z^i(G{i#1(c*AZ~!hV+-V4;tj(iE-}sQ3RY~?ajJ@tXxa=7)Tc|2VEG4S)_;X;5w|< zzAzOD*egwDabv(O+-H`ENnB?o$#~_JrPh^;9MpYBM9b?o>TpR$i4!{~}=(^X&?O27H=O0Mddyl0@Hx%W_&w_7{YZI)! zP+NTo$Gs3pQ>R+YI#0HkvC_#@F9sU9k&U^A4oK*Zfi!@?SavL|^YWbteN?#SL5cUm3yWl@-%x%8PynN*mfG?St?{)KX_d*$zn8rt|D}IjP;`X`0AvlL+NJ3{~ zO9ik2<2`Om%updQKaYeZi5!e^Oeq2d4+&tIL;r6M_Nu18U?t=}`$!qurwh9J9s6=MdeCL-Jvcp}I327xXO@fv|8Gx~Z%M57g`Y#IZ zpx|9q9=q*I;|)SND)%4X+F=zjdxqe4Mj_Q6feHWqp&FMT$yei6#Ox^=w@-5Gg6jZ2 zTyUF@0AIl!(sIG=HFayI!lz{-^QJ;JMm;fKQ(;6KAFiy>xc86Ixau(5td?E;cts;O zQhk*l1`nrQy9cRu=M!CaF)>8=1q7(NfKZH4*XGuVD+Ty|MwqRSbg9FANS%)-KWZ7| z{(n$Xxhr&>k_yVts-$90S`9GS!O|~4K;6tJ#;9wvmDKGX>Xv1cf0b0F=joPIf8y}h zl1j@ut@JRYftJ+G%ttrKuae>$wxlFG>Z_!xJ%2!H-nx>y`J&0n_72a34~%q4To@Go z6iR*Gr~yZG%d79NUw9e+SKW%wIr!{$oCgI8P3HqggmahM#gpU#Pxrf}kgae1~M;FKX5%_o`A8;Hgs5#*yF=IR? zIlD@wEI))j=A_dHdM>FmB>hCd#3G*ePrPi(`G`jI1NCVEkSN|(&v4P@692)tuIqWR zmNEWtBf78FRGTd9xyNbe`{Sbz$HzZ}( zKinKD0Dq`XlK^v_cAE&Or<#>B_~q4Og#BPZAZHOUT&Fm1WiDt4P?0P3_L)t0sLXD{ zXl+*W-?ee4$8v@CEdX0?{EJrLMHc_zYvbykfqO^@TL#Go38uH$m!8w=jp5 z>K6LngMeCMKBR6Tvs30*DIQ<1wt^yX~^Um#WrF_TXNQQS*G+W$-Id z28Js)BwfdO`8TN?X$E+vI!yx1b(;7X;{ZTC)vTPsFCPN;wQ)5Hz^^U0x&($tz*;%$ z%U=%r?ly8i#*h1&D~(U_KL)ud(o*s5#euzzZ|@$=nPB$B!YbIDi4cs4y!b+lOe|k~ z%EIvdM*4aqvU4S~(9ZAzU>io!&rJYhQh5Mg!_#Q(%th3OT_-X&v-r=X^0{l;568AtuT*Vw` zVF}N$ss%u0a3T?(1aSZ~rbp3~v6nU7i8>6IB z=wWhJD6oR-4U6lQ>$-AF`hj9LK-NZFequm%`(JNKeXG0%11?FT_fr7WdNi4*Wqk)c zVBzud0BGo1sz!!-_?8$cw@(ynm1qzm~p z4|a?fKe&Bt(llBDFNxX;AdGThk-}{_@s9;mw!_&)E&T3rE1r@3B|m1qm?2Dh!T2w4 znlmdQf?e~wX)3#}Q2rsCrk66{0X+s!Xs7FQM0J5jD{jMU3bFcb!{zoi=R$e!%3j{x zd#+=ILo8#2L~l<9#KEZ>05tGXJmg|P1IEkuklWv$nfmQ_v$h}`|LflypQoD&x*H!4 z5_>KI!XcJ1LZWX^2E=)%Hvnkh0w#}IdO zZTkr6LEr78+`ik#{kwgX0UuwzeEX;ZhV3IKM%ljGM;TDv{>s}|SD%!xW%zgdVAtyb zDJ9n0-oD$%`%j@4dN*ROYr@<=xqX-SjjR9wAOJ~3K~&&h`)(gKzz^9zifu`N`1ekv zyaE7JVl8-p=YQP99J{16eTy_4d|KI(d3S-^i3d;%y zfOQf>)eovOOh%IyM{ z@wwjaq1^UE2$&igy!d#)y7(BXn@lSICh?|4%$yECqCeRsPA}sxd9S|fqC~W0EUNhk zVnP@xY++9&$|MrBW0U}3Yg-B{yR+MgIaAg!+`3q1X80qEKVToernlhWcDw&`ab1V~ z-s~UP6Up^F`;fys(4d#wJnA4Yu}?3E05YH+h+JUg^yCx}&;H+!UB@?Sj>>pF$;;@44f#{Bk z7n0(gaAJom;UUpCY6U#1gx+rXxp0KWEnj6sz{k4ACuxc5;pxE0=~9$EyV?V?!p7qU zzzr_K5+Jt-X9Fr3eijzZN=UaV`?`o*d{W66rVksyeIef!gtcJV6?E;OJ_4MD0}{>o zp8}{`hLg59w_HOJY6-A$xr#y4@qLB;r^13o7=Hm}_Ot?$CIDv6Bd{;_u4}rgzw3JT zy3QV~5dgPL1;2W^Iw#oTExunb`R?Nm`18G~VEJQZc=Hb31&S3uqr>?xjU0R|`gdcmZ&N zP}JIHWe@%R#~(b^O&C`eT@yx8m-LOXaC~i6DZhfnZ?t4DRrKb~reM(RYB4 z369fu32>5xd$ioyJ~15pEZ+@ffCaVJh;bkw74tAt2~gK2Zy)liZotT_zh?lN#were z!#InN?1M0K08L}m@bL+orZ`3|F&Rb{`IKm!(Wbo^XHUW!EN+~Dgb#@Wd{kp3mxSG> zE4Z|4I$&{poN&*T7F{L!A??xyZ=6xWMgIeebWsE9yUup5m0_t(_vGh2)|^pde6-}X z3-OstUg!VkM|%I(y^{`IBsyzv|5HR*00egcxA?{HX99S;30K1oqsAuHubKarJ#)go zykF6OSQzi(nY}ybuK}UL7OQ;{jG4l3Jh5}ygdS8(j!MN;`&uN5sWwG5g%BTqfvj5! z`_+AC*FTV&Ut-FDR*cu*CQ17QO#%2=y%`yO@w#`thu*s>biw%hor?S0DSvm-os57- zRG=u~I>8NOr*4n&BO0HZnIJxo8{UGF($6(WQTHK7Ao}Qz0I{-7Yc2Zs6JW)^Z(Ce` zZjMJVHBS(Wz@9s8WYq>@?zL(y9psoVtBTj0jpXn&@zaSL=2j0 zc9WZ>afh1hh}*v$9%4zoF!m~#C~<4>(I*S4&!aPsj0O_0t)rdo3?*m>{1EF}DgtTK z6u~_577}M4{m|3LT?&5)fYtB^^XcQ)ELuF1ki!B+1r4^E0o751a3=g@2sC6iWy6mw-=3e;HlF{0O$;(ZN=T#YooIwo#XH0LqthY-=->H?N70jN)R!hGt4I<{dbsO?huPWzcIR+(~l?fQ}KMNgaHIge!xZOes(*zj<$>&83pi znLRXwU+64T+%`t37D1FNE5=Fbm-kfP1V|x}o}USUl4`-7;x>yqcVSd-SPI#Fs`$R^ z3-dH5-@8(=1ynO2{(U*h9;G}Uh_PH4W4^A|Ew|fK{T>vJf4@2-#7XAk&#sKc=LY1P z62G$KW6U1I%z%DM1vgNb6qWV2Ai);8E&};BDlR4Q-X7K{X4!dNU=0KUN%)0O4htaQIIQEa<$z4fE3lLq2mp0d zkKbJ%W8CBTT*%JGPSNTTLKm&{mE4I8-#kB{3_ZgA_pcIrisFDU)*%l{ zHtu{J?b4i5sR4*>kev;D;l%7iUfv!1E(r5*yO2qu5F04W*6)_T%n$4>hMZwAh29xI$rnPM-+X~I6yN- zI93L26GnJNQt5gX%bRr(L#D=FjZDJUUb>vJo9Fivb$G_04o{r0DNVUfl{(JGsO@@> zuJyr`r&x(Rs!e-E^0z2kc1cT`cMP>)+=t5OGBx03${jnH!Z3r;d;OXzFC*8>L%-z;JRZLyjSi8x;FXEmAwfeHpEA;}aIm zK!)cAJM@sil-x{kt9;zFfN#X`!1mJ#elg;HOP4|Cdc>zX@${HN=h!^i`6 zjj_vqRChgI9@UL*Nd59FPIbN^@e&;>X2)_eCTdJi{<-d?4b)U|mtC&;cL!fYM}cvM zw{Q&v52{*}_*i_huGhKWRlg^lEtjH&U3$RO2_&3Crggk%a}FJpCwv$$W&zCd>DI{vINznC(vFD+=UYKq3jVPNWHi!H5y_ToF#cT{9^eQbYgZvs_!kV zuB!BS(I`p}TwR|iJt4lTfjxfV)TAet=lBTe2~-ze#{g4Ui=B5_c;^Ghi2r5fN>!G+Mi(5P;)?eHTB9&t zGO6gT9rm2_jK@Or6#_YOI=KTh>Ynh61;9V4dxm+CP%$u&MR`w!BW}jMFd(?0&D2%3 zxuK+dJw`IRTP$O72U(zo+-4B;u)97*{%EJr+Z4BGeWnUskHUztpwgl&87-L8fH#ina3ES9jtR9*ZY-RT0gfR3w6%LNtxI zlcumdgJ24aGgzC#v=HBS3Q=bK`%j@CVZCeRxyNwunX$Vbbq9ro2dGN8JBbx(yoO5GEtur@)HG9doyx*o8!XGDj6!nziAAhI@Jy&*A^ktIS+ z3Uy=4=(UFePbs5Ek5X7Oy3eK>zN61v>bXueC*bqz41303vGocCb?SbFVzf|{Wn$u{ zS#B#g*W7K^`MbNa+-q7h+THa>>7MzBo$C|!>+kMbX80Q@((mrd11d58O`-Viu3Y=j zFp0EgV1;}ocVcmaBM9b9? zc~F}FkVjz7ndJ6jJj5#gSTE)bSL&1mc&=^3;8Bt~)mA`RzWW%?s|p)NjjEszCyA=U z@*a|QapAcR)N{nVteONlK!Wn%SsE)*74liZ9<5jqvOgHD`1aPG*_T2aT}ab?DWYlC zmd08#%_3mU;%WwzSC}!bxo(JL#(0HKOb1RA>r+`!5b0git8Lf~VjT1}@9b&F?{c&EdU5iq>)+F?FM0ag## zPK@{p6p|j98iwIKtR7I^&Q!t!O7biWvlPHXhH=4f)>Rmh$>-u%9#d%1yVF8`Y}(_r z6)$kx2-l;FB(o)UxJ)!!G8R|q@kVRK-GFibQMO4*vScpZvBZd_YkEv!1K)DMvjk}9 zI=d(3NMg-GF;7$3b$GUeEg>2!&^2$v8}rbh1N`v`*j1}}ijTDDRSbJw<_;s)3c3X# zU;VO^XU{8@l+WB*Lb)*hWrExQz*O587kEu8x*>&){Q}Lc4fY!UaxaKH>aUA4=)S#J zv{@Jc)_3{$|U?ixuMio4h@ae@B+0Wl&fDdBpV0Eo~e_m;fD6UQ%wCtT2q zt5DnZDLk?o*NfD3>1KF;9nQ!{__QskAIk8|$1uzP<1MsMauoZ^Z7?Aek?%HfQMTu_LU ze^z#v@H2n!a>@L-CaM7z$W%B{ridY~;7%saJD^6$AA}D!XwI3VqWg)pb0$6T>Dr?7 zuzsw5>0zE5r8l&23{AHw=iYAhh##i!`#HAno!svwIhFfK0LkhhYKKU0~-? zpUFbWbhs99Ua%6LnyyD+s2j)39@HLG-z)VY!kQ7MkdAS*&t9$ez!(vmx}5vzg6jlc zCSoFt{2MGVUt>9iufp-b0fGmr7J&Ac?}%EeB^M>&#{Br6?EDd`Aq7B}4q{K%$$r!g{Ox*6Ysk{ZB8*xH=0IF1lX*HmI zIM(uE3{6V4XkKe*u^Gcbdenj|ukFBa%_v)>Cu%+3UC8jU5>Z(n<7-{WFq&a;lxLx& zuv|jP6EVg|x_Y%?a||iH57w*7^SS1INY-A(`_Sx5*+j~0J^;=@>e-Mc9L_W@fUYTI zT>#t^@=B=P9Y&*TRsg8RDCv|8P`l5}J74cK3L~^_?5{S4(HU2}E6BU+%WR5?bNwJi z?pn=olI>Ce{9{4dq4mErwm0^@maw_*s{<6DR`GE{0E?yTVA6-frPy^I2#{Atw}o;f z8Q%un4M&qJO!yMd);RK&aY?bBBC2sS>nyz^KI>h8C1hxZ4@?Nc=+GkIr6>>ap>LUp zki;$EveR{a-jy{&!s9v<0zN97<`L()aWyUCToFG1aS`X}iEQU{>MRO6q>OhVmE0d@ zg7l~vZqT?OfkqmJrKo)WV~m$9m{Zv`4wU9E!*akgO*Dak)8kSkx1o*dRU`pptO5~? zl>&!`F_Nu)y`+F95wOrVi*XHc(*j`C&ZrYolgA8leu=^k1Fx|jjjtbuwH+Gzyc8xf%xA-x7XLP1QbJw8&dJL)R z>AG0>O6)p*_JcRPDq(yq;!aWm`H&bL)wz4^#-SvD?n{nS)~>HiawBf$Qu+`1qck-a z=V$US;gc6;jK7opyRL^V>Rl+})Z9v|W(U09?(w++X6E;QZf4Jw6~><_FAaQ%i{v=U zRCf(pF!R^+b9PSf&)Q00uIKOw=pC?3!nSpa*6 z_d^+=7Nb%}IURlr3GiW0zaeEC0R^>uyFpE4+>q+ZY+|Jb#ms0KKBv;x8ia{+C4qz` ze#q0=f&Q46i&3lTOx8K~OP!=(JnNTDzMa2R*yKSgk zYwJw!KA?rPuE-J6a+^|q+1`e6MFSK7Kf}#E+E0OO7GmSJWs-cXjoanW=(BPA92(tlQ`1IeA( zlX>*D!)xs=?eKhz?cJAFfp$>Lel1 z%p9edGxPj0zWD4aUC>z69_8crNJ{zmnj>i*&Fyo#R*q`MfsqsQy5(w`!pK;ViOsDHp(%19m0?UP)(6t`j4?^Bv?M+%cE&BbXz+P1`k#OQ{)poqS=R$< zH9f4evBNxzQQEER`g~>rL?0Cy!VkWmImzTY?wn<^!>El^KUz$-KZZ&c%xGZOQ5JBo zvFpM00ASChb7W&QcWI0qMk$(G)hw~sc8t~2Fv}kQK?GEFoin_#YEcY!uOv&_F_y_` z!&u^Y>li`hfS`o@Cv%o>eBCTOsI`A2>r1Db&*!4v!>Z`|%! ze5uNt!~1SLp&o#8h}4oILrkUvjnE*kz{I*drU&|_L};K`g^gchALQ>j4Rre870q6f ztZpfQC0}HZl8wZdlJ^?_(dD0v^rSM4s zr~m~1A=mr4NJRUi@xdRh|55GHG<1#Rn(cmL0Hy95v-iXGCi<>{k6_T8P2Yl1bII1= zbh($^BsTZM^_JGv!#ud&(z+;kJ_g4DT;rd&{eMw0SUewxiu*sd8TC?ysFXv^&FiEnGQcV4>qz#1+vdZ2$YV+SjF88? zRP+<%aR4!W@|aWomB$h>=tf)~qnemAQ>~Gim@yhRt9bDQ3Gb`xdLE#0GpfH5ULxib zC49ZOqwJdbac4+4IlTIlkIz|Icc1o0%(YL-SJ}80V^{_FGA|c70Hg@sn>X712TL^x z;Q&Cq00-qc+;9+|>Ngvd?1RCDZKMiL`Y~ykTJr*Bs*JGTdANk#?4ddZGwvSN^ z&tH}jPjQfuBE}#0zyhfok~{dr1w@Q$kQD%nF;}e=qo^ta#=533VXUJ2F(t9QhnNlY zQ{+0SDrWKp?N=x&?L(XeWT)aVXS%0!Ev8N` zg1XJdEdqXqjSK5phvcX9L{L+?)=5@#;kJ2KMz2hG@2$exb1RjHudoh&0_eWvG_)!H z@uUh(4PDim?bd$hVkQrGTWUXjkV$I5_y&QyK2jH{J^$<9qIW|vLbW#}%m!~+neiMA zgI5+V{Xa{1s?}cTs@58ED!#QoC1Sp6Pi(V&q$Bhm7C}Mn{p!81+DkIcp!}-68pf~M z)3fKR_6SCx_Qq6!!v_xbkh>pjzK7h1jYB!%kn4WG^nkHz-?MAE{d~3AkT%r`=wD?< zUcgo-;K&Lil@jnSk=03f(hoyZP82s4YK&OGQz?misD0_L%Pgr9DgmEYiXiGTkxvcm z@ecY>V5DN>egu1RE#JbP*otG+k@D(d8*#ZZyL1bCfC1p13|!Z3-F&)#FGfGmJ;rVI zRzZm4+nTc2ii^f>Qxs*)h%v+#uI^dJHITXnCH#0Gk|`W8B(`uZ5Ya@8DmA_pqhk}7 zc1{7y)pl5nBx1RLjI?%ujXfDgrgFf9;9|8!`V&*29)}*6%;XB%T!T|-|1hIy$!J;* zfEKr>U15Em>n*&rU?@B_xjG)!0%)#3EL(bz1uKMlx*Y_lIPoRFcvy5hj%lAs$jX3b zjOAwmtog3o@wz=KerJ>hP>m7quCk3wRf?};pUNkBbLzz^B~uhvZ}!D#?fvwj)f6A| zvgF{Zmzro?*?!EH813ILUBupc06+|;X- z&+wZKt*UZ(Tz+QWPN5iYf&b zJ(-|V=uKrm)lXF^vG|i`k8+IvwMrTIvQ&Qh;P=gE*cAOfso^$7qXNKX%c7*e*s{lt zrZnLfQr=2mPwF!)dmMWS1K9gw*vD<`j1Ry&;jlCtmqMyxE4oUtP=FeYm-x7#b1OJN z#e`3(Mn*UjO4Dx6=e&B~z5Rq#F1Km2!$T3-(udxm9@v%5T|B5F$MJhi4q7)J*M{o(oQm93ee89zv3y zOn{y)J*g%+pEV><{dDPx$GuldPi0v}_7vI21CF{Sg=3WWV!ciAL8rKZ=eWQ^DLgbR zp#~Q+F0-CBV4KAn^#Y)_>z2ozwzHJ@d7*DM@ximkF;1;qTs*bRq^ZQn;Jb?R zSyWS~N+*B%VAi4Ogrr+GXV^ENc(U2MRy~M>x(=Nf=voln_A#CX zJY5(8`})o^+!(oL6bg;92)`k4Jj|+99uEp-LAwrpQDqSTtKy?3+S=mkf{SZON6^I+ zv%w<=|G@0%#TCypZ?m|l!La*JY~PXC@u+r4#-Hs&UU`-m>1 zpx@Y?wO4-}%vpPxHx)iy=DeyqpyuSP6rF98d#rT0L!A4UKkIe<9jBQ1zD;|8>hf7$*SO^IS@%QSiqpNWi9Mdgk7AE} zuK-SBjb2yLrHE#xBD%z_7-uhYyndY5HGZhFhe~bZ)j4&~0{;;3(Ebl2ac&#hkc9b8`PZffeFF>Y zAWeXaS5QkRn{r&>@A^d$zIVR7Lf4(1;r#hBJ;U`LO)cPf&+ylAUTlM3Mb|ctYECXP zK;|(UBYT`8?RP(fU%mec_e1#Yk8wX_62nM^VYznNJvl~o*P?ir05`M_DB$Ecdv2kc zslKR8+z<004NLrB3uE-X1DS+{6Smmi!Gk1r8so#Ow{Q;Hc)l*RC^XPwKE`Z-^c?_H zV$?RSIBrz_+0La>&FQw-HS3V__7=51fk@WoNH!^@vZ$Q%=L>5c6CE8DL$wmGMrU&8N-#yE(T**PYipg-m(uZ%3i$L zkL>3t} z4>z?-JPbEg+X&_2izl>m{S@VAMoo-%F`Sjxq^46`GS_2h>M?y0SaDV+iSu`HWX$2x zPFtFHO3LyZlo;6nKeDcsEqA)~>%rIE+9RhlDpudjp5%0?C@I0|LW&^tI9-IKso74K z6TJE*+HJ=hCb3|s4#5Bb1n)^iK~xa5FzX<$F+P5xJ(Jmcp|D%5f&g0nVoPXqj`r&I zCf*rY-9w=$De*TI3jc@8v91BetH_tSab{$j#C;(K`Rzs%iT_}IDO)z%mXZ$Q_1=p9 zw(9UDR=W!BV;}MovS|X@$Efg<(xbcLj5P@SGD`@A0BbAq9p!T$fp(6+yhMzC`aG$> zJ$Rb&H2SWCqg4v=`T2nnUvgDT)6rhX9Iyt7UT*CgV7%S#a+^~M6?kXLW7HD^_)@I@ zsKzLi4gxjSqkgnwtN>~;Vi$=(cQ@7EOh{xmU{v^0bQllAwNHU+5CDH|m}?E-*Mn5R z7f~j5+r4oC%5LW=$%5W)sj*f9ey{z7W0T%bg{nA*g4MS{|i7L45e$jBgj@jWyzQ7|G0}HPb%VLaG!E=3ph9YX?_A zLnRa?7vL>CJ9_nibu;&skp&fZW=wvakewRu;*z0&uH)=?af+EXiW#i9ooty@e5GlO zQcbni7)@1Swb>Vo#b-AHplt9Ez)J;g+J>~2%H2gxp=*=*SnT?Y`B(ycSvVf^a(nW7 zHZCr;F&T~W8 z*VwyAmSJWlzAUL^56y8qepJztVJFzaChd4u%NklUKoHML7b{egFHR6y86gaWJX#o| zvTIPsqDYe!BTka&#i(*}WgbnkQkwwVHg+!kIoRQ9z~@*1j0x~k_Dt~s02jPJjK{-y z(nErnWy+vwpIQC&T{Hw*U*08?M^R;faut1h*JfWcwR)NXpX8M0RLU#IcoD1}RC35V zh4lqXUGd^cZVF&`ghnb`aJ`d|7<`VoQI+!2j2uw6Lv~ggt^qL!BSm}TPs7~#x{NVJ zUrj2xy`)=I8BSMQ*{Z|W3J>iVB|dJG0iRQ?k;C|T$CMG*Y~nG6EU-qGU7BeIun8l; zhvI-mKqqe_yT0V-8v~%eYj$H@sWOxTCHMUU-i6M2+Cie4gpsKM2h7Y%x@H1N`iY@I z<$5Kh?s~kETH-s5 + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/control_manager + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/control_managerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:2369369664.1 %
    Date:2024-04-18 23:11:36Functions:8912372.4 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    control_manager.cpp +
    63.7%63.7%
    +
    63.7 %2326 / 365369.4 %77 / 111
    <unnamed>63.7 %2326 / 365369.4 %77 / 111
    output_publisher.cpp +
    100.0%
    +
    100.0 %43 / 43100.0 %12 / 12
    <unnamed>100.0 %43 / 43100.0 %12 / 12
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/control_manager/index-detail-sort-l.html b/mrs_uav_managers/src/control_manager/index-detail-sort-l.html new file mode 100644 index 0000000000..becda47b37 --- /dev/null +++ b/mrs_uav_managers/src/control_manager/index-detail-sort-l.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/control_manager + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/control_managerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:2369369664.1 %
    Date:2024-04-18 23:11:36Functions:8912372.4 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    control_manager.cpp +
    63.7%63.7%
    +
    63.7 %2326 / 365369.4 %77 / 111
    <unnamed>63.7 %2326 / 365369.4 %77 / 111
    output_publisher.cpp +
    100.0%
    +
    100.0 %43 / 43100.0 %12 / 12
    <unnamed>100.0 %43 / 43100.0 %12 / 12
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/control_manager/index-detail.html b/mrs_uav_managers/src/control_manager/index-detail.html new file mode 100644 index 0000000000..be9d5861de --- /dev/null +++ b/mrs_uav_managers/src/control_manager/index-detail.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/control_manager + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/control_managerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:2369369664.1 %
    Date:2024-04-18 23:11:36Functions:8912372.4 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    control_manager.cpp +
    63.7%63.7%
    +
    63.7 %2326 / 365369.4 %77 / 111
    <unnamed>63.7 %2326 / 365369.4 %77 / 111
    output_publisher.cpp +
    100.0%
    +
    100.0 %43 / 43100.0 %12 / 12
    <unnamed>100.0 %43 / 43100.0 %12 / 12
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/control_manager/index-sort-f.html b/mrs_uav_managers/src/control_manager/index-sort-f.html new file mode 100644 index 0000000000..b796cce974 --- /dev/null +++ b/mrs_uav_managers/src/control_manager/index-sort-f.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/control_manager + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/control_managerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:2369369664.1 %
    Date:2024-04-18 23:11:36Functions:8912372.4 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    control_manager.cpp +
    63.7%63.7%
    +
    63.7 %2326 / 365369.4 %77 / 111
    output_publisher.cpp +
    100.0%
    +
    100.0 %43 / 43100.0 %12 / 12
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/control_manager/index-sort-l.html b/mrs_uav_managers/src/control_manager/index-sort-l.html new file mode 100644 index 0000000000..731a9bbf72 --- /dev/null +++ b/mrs_uav_managers/src/control_manager/index-sort-l.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/control_manager + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/control_managerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:2369369664.1 %
    Date:2024-04-18 23:11:36Functions:8912372.4 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    control_manager.cpp +
    63.7%63.7%
    +
    63.7 %2326 / 365369.4 %77 / 111
    output_publisher.cpp +
    100.0%
    +
    100.0 %43 / 43100.0 %12 / 12
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/control_manager/index.html b/mrs_uav_managers/src/control_manager/index.html new file mode 100644 index 0000000000..3859b4a2df --- /dev/null +++ b/mrs_uav_managers/src/control_manager/index.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/control_manager + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/control_managerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:2369369664.1 %
    Date:2024-04-18 23:11:36Functions:8912372.4 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    control_manager.cpp +
    63.7%63.7%
    +
    63.7 %2326 / 365369.4 %77 / 111
    output_publisher.cpp +
    100.0%
    +
    100.0 %43 / 43100.0 %12 / 12
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/control_manager/output_publisher.cpp.func-sort-c.html b/mrs_uav_managers/src/control_manager/output_publisher.cpp.func-sort-c.html new file mode 100644 index 0000000000..a0f66875f2 --- /dev/null +++ b/mrs_uav_managers/src/control_manager/output_publisher.cpp.func-sort-c.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/control_manager/output_publisher.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/control_manager - output_publisher.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:4343100.0 %
    Date:2024-04-18 23:11:36Functions:1212100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_managers::control_manager::OutputPublisher::OutputPublisher(ros::NodeHandle&)91
    mrs_uav_managers::control_manager::OutputPublisher::OutputPublisher()91
    mrs_uav_managers::control_manager::OutputPublisher::publish(mrs_msgs::HwApiPositionCmd_<std::allocator<void> > const&)505
    mrs_uav_managers::control_manager::OutputPublisher::publish(mrs_msgs::HwApiAccelerationHdgRateCmd_<std::allocator<void> > const&)1026
    mrs_uav_managers::control_manager::OutputPublisher::publish(mrs_msgs::HwApiAccelerationHdgCmd_<std::allocator<void> > const&)1046
    mrs_uav_managers::control_manager::OutputPublisher::publish(mrs_msgs::HwApiVelocityHdgCmd_<std::allocator<void> > const&)1090
    mrs_uav_managers::control_manager::OutputPublisher::publish(mrs_msgs::HwApiVelocityHdgRateCmd_<std::allocator<void> > const&)2241
    mrs_uav_managers::control_manager::OutputPublisher::publish(mrs_msgs::HwApiActuatorCmd_<std::allocator<void> > const&)3826
    mrs_uav_managers::control_manager::OutputPublisher::publish(mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> > const&)3844
    mrs_uav_managers::control_manager::OutputPublisher::publish(mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> > const&)7936
    mrs_uav_managers::control_manager::OutputPublisher::publish(mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> > const&)86477
    mrs_uav_managers::control_manager::OutputPublisher::publish(std::variant<mrs_msgs::HwApiActuatorCmd_<std::allocator<void> >, mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> >, mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> >, mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> >, mrs_msgs::HwApiAccelerationHdgRateCmd_<std::allocator<void> >, mrs_msgs::HwApiAccelerationHdgCmd_<std::allocator<void> >, mrs_msgs::HwApiVelocityHdgRateCmd_<std::allocator<void> >, mrs_msgs::HwApiVelocityHdgCmd_<std::allocator<void> >, mrs_msgs::HwApiPositionCmd_<std::allocator<void> > > const&)107991
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/control_manager/output_publisher.cpp.func.html b/mrs_uav_managers/src/control_manager/output_publisher.cpp.func.html new file mode 100644 index 0000000000..249a89b5da --- /dev/null +++ b/mrs_uav_managers/src/control_manager/output_publisher.cpp.func.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/control_manager/output_publisher.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/control_manager - output_publisher.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:4343100.0 %
    Date:2024-04-18 23:11:36Functions:1212100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_managers::control_manager::OutputPublisher::publish(mrs_msgs::HwApiActuatorCmd_<std::allocator<void> > const&)3826
    mrs_uav_managers::control_manager::OutputPublisher::publish(mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> > const&)7936
    mrs_uav_managers::control_manager::OutputPublisher::publish(mrs_msgs::HwApiPositionCmd_<std::allocator<void> > const&)505
    mrs_uav_managers::control_manager::OutputPublisher::publish(mrs_msgs::HwApiVelocityHdgCmd_<std::allocator<void> > const&)1090
    mrs_uav_managers::control_manager::OutputPublisher::publish(mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> > const&)86477
    mrs_uav_managers::control_manager::OutputPublisher::publish(mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> > const&)3844
    mrs_uav_managers::control_manager::OutputPublisher::publish(mrs_msgs::HwApiAccelerationHdgCmd_<std::allocator<void> > const&)1046
    mrs_uav_managers::control_manager::OutputPublisher::publish(mrs_msgs::HwApiVelocityHdgRateCmd_<std::allocator<void> > const&)2241
    mrs_uav_managers::control_manager::OutputPublisher::publish(mrs_msgs::HwApiAccelerationHdgRateCmd_<std::allocator<void> > const&)1026
    mrs_uav_managers::control_manager::OutputPublisher::publish(std::variant<mrs_msgs::HwApiActuatorCmd_<std::allocator<void> >, mrs_msgs::HwApiControlGroupCmd_<std::allocator<void> >, mrs_msgs::HwApiAttitudeRateCmd_<std::allocator<void> >, mrs_msgs::HwApiAttitudeCmd_<std::allocator<void> >, mrs_msgs::HwApiAccelerationHdgRateCmd_<std::allocator<void> >, mrs_msgs::HwApiAccelerationHdgCmd_<std::allocator<void> >, mrs_msgs::HwApiVelocityHdgRateCmd_<std::allocator<void> >, mrs_msgs::HwApiVelocityHdgCmd_<std::allocator<void> >, mrs_msgs::HwApiPositionCmd_<std::allocator<void> > > const&)107991
    mrs_uav_managers::control_manager::OutputPublisher::OutputPublisher(ros::NodeHandle&)91
    mrs_uav_managers::control_manager::OutputPublisher::OutputPublisher()91
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/control_manager/output_publisher.cpp.gcov.frameset.html b/mrs_uav_managers/src/control_manager/output_publisher.cpp.gcov.frameset.html new file mode 100644 index 0000000000..43585be242 --- /dev/null +++ b/mrs_uav_managers/src/control_manager/output_publisher.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/control_manager/output_publisher.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_managers/src/control_manager/output_publisher.cpp.gcov.html b/mrs_uav_managers/src/control_manager/output_publisher.cpp.gcov.html new file mode 100644 index 0000000000..109310ce8d --- /dev/null +++ b/mrs_uav_managers/src/control_manager/output_publisher.cpp.gcov.html @@ -0,0 +1,154 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/control_manager/output_publisher.cpp + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/control_manager - output_publisher.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:4343100.0 %
    Date:2024-04-18 23:11:36Functions:1212100.0 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #include <control_manager/output_publisher.h>
    +       2             : 
    +       3             : namespace mrs_uav_managers
    +       4             : {
    +       5             : 
    +       6             : namespace control_manager
    +       7             : {
    +       8             : 
    +       9          91 : OutputPublisher::OutputPublisher() {
    +      10          91 : }
    +      11             : 
    +      12          91 : OutputPublisher::OutputPublisher(ros::NodeHandle& nh) {
    +      13             : 
    +      14          91 :   ph_hw_api_actuator_cmd_              = mrs_lib::PublisherHandler<mrs_msgs::HwApiActuatorCmd>(nh, "hw_api_actuator_cmd_out", 1);
    +      15          91 :   ph_hw_api_control_group_cmd_         = mrs_lib::PublisherHandler<mrs_msgs::HwApiControlGroupCmd>(nh, "hw_api_control_group_cmd_out", 1);
    +      16          91 :   ph_hw_api_attitude_rate_cmd_         = mrs_lib::PublisherHandler<mrs_msgs::HwApiAttitudeRateCmd>(nh, "hw_api_attitude_rate_cmd_out", 1);
    +      17          91 :   ph_hw_api_attitude_cmd_              = mrs_lib::PublisherHandler<mrs_msgs::HwApiAttitudeCmd>(nh, "hw_api_attitude_cmd_out", 1);
    +      18          91 :   ph_hw_api_acceleration_hdg_rate_cmd_ = mrs_lib::PublisherHandler<mrs_msgs::HwApiAccelerationHdgRateCmd>(nh, "hw_api_acceleration_hdg_rate_cmd_out", 1);
    +      19          91 :   ph_hw_api_acceleration_hdg_cmd_      = mrs_lib::PublisherHandler<mrs_msgs::HwApiAccelerationHdgCmd>(nh, "hw_api_acceleration_hdg_cmd_out", 1);
    +      20          91 :   ph_hw_api_velocity_hdg_rate_cmd_     = mrs_lib::PublisherHandler<mrs_msgs::HwApiVelocityHdgRateCmd>(nh, "hw_api_velocity_hdg_rate_cmd_out", 1);
    +      21          91 :   ph_hw_api_velocity_hdg_cmd_          = mrs_lib::PublisherHandler<mrs_msgs::HwApiVelocityHdgCmd>(nh, "hw_api_velocity_hdg_cmd_out", 1);
    +      22          91 :   ph_hw_api_position_cmd_              = mrs_lib::PublisherHandler<mrs_msgs::HwApiPositionCmd>(nh, "hw_api_position_cmd_out", 1);
    +      23          91 : }
    +      24             : 
    +      25      107991 : void OutputPublisher::publish(const Controller::HwApiOutputVariant& control_output) {
    +      26             : 
    +      27      107991 :   std::visit(OutputPublisher::PublisherVisitor(this), control_output);
    +      28      107991 : }
    +      29             : 
    +      30             : // | ------------------------- private ------------------------ |
    +      31             : 
    +      32        3826 : void OutputPublisher::publish(const mrs_msgs::HwApiActuatorCmd& msg) {
    +      33        3826 :   ph_hw_api_actuator_cmd_.publish(msg);
    +      34        3826 : }
    +      35             : 
    +      36        3844 : void OutputPublisher::publish(const mrs_msgs::HwApiControlGroupCmd& msg) {
    +      37        3844 :   ph_hw_api_control_group_cmd_.publish(msg);
    +      38        3844 : }
    +      39             : 
    +      40       86477 : void OutputPublisher::publish(const mrs_msgs::HwApiAttitudeRateCmd& msg) {
    +      41       86477 :   ph_hw_api_attitude_rate_cmd_.publish(msg);
    +      42       86477 : }
    +      43             : 
    +      44        7936 : void OutputPublisher::publish(const mrs_msgs::HwApiAttitudeCmd& msg) {
    +      45        7936 :   ph_hw_api_attitude_cmd_.publish(msg);
    +      46        7936 : }
    +      47             : 
    +      48        1026 : void OutputPublisher::publish(const mrs_msgs::HwApiAccelerationHdgRateCmd& msg) {
    +      49        1026 :   ph_hw_api_acceleration_hdg_rate_cmd_.publish(msg);
    +      50        1026 : }
    +      51             : 
    +      52        1046 : void OutputPublisher::publish(const mrs_msgs::HwApiAccelerationHdgCmd& msg) {
    +      53        1046 :   ph_hw_api_acceleration_hdg_cmd_.publish(msg);
    +      54        1046 : }
    +      55             : 
    +      56        2241 : void OutputPublisher::publish(const mrs_msgs::HwApiVelocityHdgRateCmd& msg) {
    +      57        2241 :   ph_hw_api_velocity_hdg_rate_cmd_.publish(msg);
    +      58        2241 : }
    +      59             : 
    +      60        1090 : void OutputPublisher::publish(const mrs_msgs::HwApiVelocityHdgCmd& msg) {
    +      61        1090 :   ph_hw_api_velocity_hdg_cmd_.publish(msg);
    +      62        1090 : }
    +      63             : 
    +      64         505 : void OutputPublisher::publish(const mrs_msgs::HwApiPositionCmd& msg) {
    +      65         505 :   ph_hw_api_position_cmd_.publish(msg);
    +      66         505 : }
    +      67             : 
    +      68             : }  // namespace control_manager
    +      69             : 
    +      70             : }  // namespace mrs_uav_managers
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/control_manager/output_publisher.cpp.gcov.overview.html b/mrs_uav_managers/src/control_manager/output_publisher.cpp.gcov.overview.html new file mode 100644 index 0000000000..8bbe8c2bfd --- /dev/null +++ b/mrs_uav_managers/src/control_manager/output_publisher.cpp.gcov.overview.html @@ -0,0 +1,38 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/control_manager/output_publisher.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_managers/src/control_manager/output_publisher.cpp.gcov.png b/mrs_uav_managers/src/control_manager/output_publisher.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..c385c662de6cc4327e3a61ce14e679273fb7fbb9 GIT binary patch literal 307 zcmeAS@N?(olHy`uVBq!ia0vp^0YL1=!VDx=Zs3yuQW60^A+G=b|6c_J%iqVwzWUF= zunH&+rp|e9UJ7J$7I;J!GcfQS0b$0e+I-SL!GoSIjv*eMZ^In<8Web%cPzx|uYg9wc$$GsO#c<%LD z^o61EWbIvRy=0gZWQ-p596VxsjnPP{OElF*Cg6-{dy|A>Y}=H;oU<(ImnK^5lUTi3 z+iSA*={Nb$&wWaG6~8WP+rHV`1hgbCr~Q%KEqQ|=`dh-AP literal 0 HcmV?d00001 diff --git a/mrs_uav_managers/src/estimation_manager/estimation_manager.cpp.func-sort-c.html b/mrs_uav_managers/src/estimation_manager/estimation_manager.cpp.func-sort-c.html new file mode 100644 index 0000000000..6107a31174 --- /dev/null +++ b/mrs_uav_managers/src/estimation_manager/estimation_manager.cpp.func-sort-c.html @@ -0,0 +1,176 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/estimation_manager/estimation_manager.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/estimation_manager - estimation_manager.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:37153469.5 %
    Date:2024-04-18 23:11:36Functions:212487.5 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_managers::estimation_manager::EstimationManager::loadConfigFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)0
    mrs_uav_managers::estimation_manager::EstimationManager::callFailsafeService()0
    mrs_uav_managers::estimation_manager::EstimationManager::switchToHealthyEstimator()0
    mrs_uav_managers::estimation_manager::StateMachine::changeToPreSwitchState()5
    mrs_uav_managers::estimation_manager::EstimationManager::switchToEstimator(boost::shared_ptr<mrs_uav_managers::StateEstimator> const&)5
    mrs_uav_managers::estimation_manager::EstimationManager::callbackChangeEstimator(mrs_msgs::StringRequest_<std::allocator<void> >&, mrs_msgs::StringResponse_<std::allocator<void> >&)5
    (anonymous namespace)::ProxyExec0::ProxyExec0()91
    mrs_uav_managers::estimation_manager::StateMachine::StateMachine(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)91
    mrs_uav_managers::estimation_manager::EstimationManager::timerInitialization(ros::TimerEvent const&)91
    mrs_uav_managers::estimation_manager::EstimationManager::onInit()91
    mrs_uav_managers::estimation_manager::EstimationManager::EstimationManager()91
    mrs_uav_managers::estimation_manager::EstimationManager::callbackToggleServiceCallbacks(std_srvs::SetBoolRequest_<std::allocator<void> >&, std_srvs::SetBoolResponse_<std::allocator<void> >&)126
    mrs_uav_managers::estimation_manager::StateMachine::changeState(mrs_uav_managers::estimation_manager::StateMachine::SMState_t const&)295
    mrs_uav_managers::estimation_manager::StateMachine::getPrintName[abi:cxx11]() const295
    mrs_uav_managers::estimation_manager::StateMachine::getStateAsString[abi:cxx11](mrs_uav_managers::estimation_manager::StateMachine::SMState_t const&) const590
    mrs_uav_managers::estimation_manager::EstimationManager::getName[abi:cxx11]() const3050
    mrs_uav_managers::estimation_manager::StateMachine::getCurrentStateString[abi:cxx11]() const17081
    mrs_uav_managers::estimation_manager::EstimationManager::timerPublishDiagnostics(ros::TimerEvent const&)18061
    mrs_uav_managers::estimation_manager::StateMachine::isInTheAir() const173137
    mrs_uav_managers::estimation_manager::EstimationManager::timerPublish(ros::TimerEvent const&)173141
    mrs_uav_managers::estimation_manager::EstimationManager::timerCheckHealth(ros::TimerEvent const&)173141
    mrs_uav_managers::estimation_manager::StateMachine::isInPublishableState() const191195
    mrs_uav_managers::estimation_manager::StateMachine::isInitialized() const364406
    mrs_uav_managers::estimation_manager::StateMachine::isInState(mrs_uav_managers::estimation_manager::StateMachine::SMState_t const&) const1660834
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/estimation_manager/estimation_manager.cpp.func.html b/mrs_uav_managers/src/estimation_manager/estimation_manager.cpp.func.html new file mode 100644 index 0000000000..044deab592 --- /dev/null +++ b/mrs_uav_managers/src/estimation_manager/estimation_manager.cpp.func.html @@ -0,0 +1,176 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/estimation_manager/estimation_manager.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/estimation_manager - estimation_manager.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:37153469.5 %
    Date:2024-04-18 23:11:36Functions:212487.5 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    (anonymous namespace)::ProxyExec0::ProxyExec0()91
    mrs_uav_managers::estimation_manager::StateMachine::changeState(mrs_uav_managers::estimation_manager::StateMachine::SMState_t const&)295
    mrs_uav_managers::estimation_manager::StateMachine::changeToPreSwitchState()5
    mrs_uav_managers::estimation_manager::StateMachine::StateMachine(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)91
    mrs_uav_managers::estimation_manager::EstimationManager::timerPublish(ros::TimerEvent const&)173141
    mrs_uav_managers::estimation_manager::EstimationManager::loadConfigFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)0
    mrs_uav_managers::estimation_manager::EstimationManager::timerCheckHealth(ros::TimerEvent const&)173141
    mrs_uav_managers::estimation_manager::EstimationManager::switchToEstimator(boost::shared_ptr<mrs_uav_managers::StateEstimator> const&)5
    mrs_uav_managers::estimation_manager::EstimationManager::callFailsafeService()0
    mrs_uav_managers::estimation_manager::EstimationManager::timerInitialization(ros::TimerEvent const&)91
    mrs_uav_managers::estimation_manager::EstimationManager::callbackChangeEstimator(mrs_msgs::StringRequest_<std::allocator<void> >&, mrs_msgs::StringResponse_<std::allocator<void> >&)5
    mrs_uav_managers::estimation_manager::EstimationManager::timerPublishDiagnostics(ros::TimerEvent const&)18061
    mrs_uav_managers::estimation_manager::EstimationManager::switchToHealthyEstimator()0
    mrs_uav_managers::estimation_manager::EstimationManager::callbackToggleServiceCallbacks(std_srvs::SetBoolRequest_<std::allocator<void> >&, std_srvs::SetBoolResponse_<std::allocator<void> >&)126
    mrs_uav_managers::estimation_manager::EstimationManager::onInit()91
    mrs_uav_managers::estimation_manager::EstimationManager::EstimationManager()91
    mrs_uav_managers::estimation_manager::StateMachine::isInTheAir() const173137
    mrs_uav_managers::estimation_manager::StateMachine::getPrintName[abi:cxx11]() const295
    mrs_uav_managers::estimation_manager::StateMachine::isInitialized() const364406
    mrs_uav_managers::estimation_manager::StateMachine::getStateAsString[abi:cxx11](mrs_uav_managers::estimation_manager::StateMachine::SMState_t const&) const590
    mrs_uav_managers::estimation_manager::StateMachine::isInPublishableState() const191195
    mrs_uav_managers::estimation_manager::StateMachine::getCurrentStateString[abi:cxx11]() const17081
    mrs_uav_managers::estimation_manager::StateMachine::isInState(mrs_uav_managers::estimation_manager::StateMachine::SMState_t const&) const1660834
    mrs_uav_managers::estimation_manager::EstimationManager::getName[abi:cxx11]() const3050
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/estimation_manager/estimation_manager.cpp.gcov.frameset.html b/mrs_uav_managers/src/estimation_manager/estimation_manager.cpp.gcov.frameset.html new file mode 100644 index 0000000000..0e76ed7e74 --- /dev/null +++ b/mrs_uav_managers/src/estimation_manager/estimation_manager.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/estimation_manager/estimation_manager.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_managers/src/estimation_manager/estimation_manager.cpp.gcov.html b/mrs_uav_managers/src/estimation_manager/estimation_manager.cpp.gcov.html new file mode 100644 index 0000000000..579c5f3417 --- /dev/null +++ b/mrs_uav_managers/src/estimation_manager/estimation_manager.cpp.gcov.html @@ -0,0 +1,1330 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/estimation_manager/estimation_manager.cpp + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/estimation_manager - estimation_manager.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:37153469.5 %
    Date:2024-04-18 23:11:36Functions:212487.5 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : /*//{ includes */
    +       2             : #include <ros/ros.h>
    +       3             : #include <nodelet/nodelet.h>
    +       4             : 
    +       5             : #include <pluginlib/class_loader.h>
    +       6             : #include <nodelet/loader.h>
    +       7             : 
    +       8             : #include <geometry_msgs/QuaternionStamped.h>
    +       9             : #include <geometry_msgs/Vector3Stamped.h>
    +      10             : 
    +      11             : #include <nav_msgs/Odometry.h>
    +      12             : 
    +      13             : #include <std_srvs/Trigger.h>
    +      14             : #include <std_srvs/SetBool.h>
    +      15             : 
    +      16             : #include <mrs_msgs/UavState.h>
    +      17             : #include <mrs_msgs/Float64Stamped.h>
    +      18             : #include <mrs_msgs/String.h>
    +      19             : #include <mrs_msgs/EstimationDiagnostics.h>
    +      20             : #include <mrs_msgs/HwApiCapabilities.h>
    +      21             : #include <mrs_msgs/ControlManagerDiagnostics.h>
    +      22             : 
    +      23             : #include <mrs_lib/param_loader.h>
    +      24             : #include <mrs_lib/publisher_handler.h>
    +      25             : #include <mrs_lib/service_client_handler.h>
    +      26             : #include <mrs_lib/transformer.h>
    +      27             : #include <mrs_lib/subscribe_handler.h>
    +      28             : #include <mrs_lib/gps_conversions.h>
    +      29             : #include <mrs_lib/scope_timer.h>
    +      30             : 
    +      31             : 
    +      32             : #include <mrs_uav_managers/state_estimator.h>
    +      33             : #include <mrs_uav_managers/agl_estimator.h>
    +      34             : #include <mrs_uav_managers/estimation_manager/support.h>
    +      35             : #include <mrs_uav_managers/estimation_manager/common_handlers.h>
    +      36             : #include <mrs_uav_managers/estimation_manager/private_handlers.h>
    +      37             : /*//}*/
    +      38             : 
    +      39             : namespace mrs_uav_managers
    +      40             : {
    +      41             : 
    +      42             : namespace estimation_manager
    +      43             : {
    +      44             : 
    +      45             : // --------------------------------------------------------------
    +      46             : // |                           classes                          |
    +      47             : // --------------------------------------------------------------
    +      48             : 
    +      49             : /*//{ class StateMachine */
    +      50             : class StateMachine {
    +      51             : 
    +      52             :   /*//{ states */
    +      53             : public:
    +      54             :   typedef enum
    +      55             :   {
    +      56             : 
    +      57             :     UNINITIALIZED_STATE,
    +      58             :     INITIALIZED_STATE,
    +      59             :     READY_FOR_FLIGHT_STATE,
    +      60             :     TAKING_OFF_STATE,
    +      61             :     FLYING_STATE,
    +      62             :     HOVER_STATE,
    +      63             :     LANDING_STATE,
    +      64             :     LANDED_STATE,
    +      65             :     ESTIMATOR_SWITCHING_STATE,
    +      66             :     DUMMY_STATE,
    +      67             :     EMERGENCY_STATE,
    +      68             :     FAILSAFE_STATE,
    +      69             :     ERROR_STATE
    +      70             : 
    +      71             :   } SMState_t;
    +      72             : 
    +      73             :   /*//}*/
    +      74             : 
    +      75             : public:
    +      76        1274 :   StateMachine(const std::string& nodelet_name) : nodelet_name_(nodelet_name) {
    +      77          91 :   }
    +      78             : 
    +      79     1660834 :   bool isInState(const SMState_t& state) const {
    +      80     1660834 :     return mrs_lib::get_mutexed(mtx_state_, current_state_) == state;
    +      81             :   }
    +      82             : 
    +      83      364406 :   bool isInitialized() const {
    +      84      364406 :     return mrs_lib::get_mutexed(mtx_state_, current_state_) != UNINITIALIZED_STATE;
    +      85             :   }
    +      86             : 
    +      87      191195 :   bool isInPublishableState() const {
    +      88      191195 :     const SMState_t current_state = mrs_lib::get_mutexed(mtx_state_, current_state_);
    +      89      146089 :     return current_state == READY_FOR_FLIGHT_STATE || current_state == TAKING_OFF_STATE || current_state == HOVER_STATE || current_state == FLYING_STATE ||
    +      90      337286 :            current_state == LANDING_STATE || current_state == DUMMY_STATE || current_state == FAILSAFE_STATE;
    +      91             :   }
    +      92             : 
    +      93      173137 :   bool isInTheAir() const {
    +      94      173137 :     const SMState_t current_state = mrs_lib::get_mutexed(mtx_state_, current_state_);
    +      95      173137 :     return current_state == TAKING_OFF_STATE || current_state == HOVER_STATE || current_state == FLYING_STATE || current_state == LANDING_STATE;
    +      96             :   }
    +      97             : 
    +      98             :   SMState_t getCurrentState() const {
    +      99             :     return mrs_lib::get_mutexed(mtx_state_, current_state_);
    +     100             :   }
    +     101             : 
    +     102       17081 :   std::string getCurrentStateString() const {
    +     103       17081 :     return mrs_lib::get_mutexed(mtx_state_, sm_state_names_[current_state_]);
    +     104             :   }
    +     105             : 
    +     106         590 :   std::string getStateAsString(const SMState_t& state) const {
    +     107         590 :     return sm_state_names_[state];
    +     108             :   }
    +     109             : 
    +     110             :   /*//{ changeState() */
    +     111         295 :   bool changeState(const SMState_t& target_state) {
    +     112             : 
    +     113         295 :     if (target_state == current_state_) {
    +     114             : 
    +     115           0 :       ROS_WARN("[%s]: requested change to same state %s -> %s", getPrintName().c_str(), getStateAsString(current_state_).c_str(),
    +     116             :                getStateAsString(target_state).c_str());
    +     117           0 :       return true;
    +     118             :     }
    +     119             : 
    +     120         295 :     switch (target_state) {
    +     121             : 
    +     122           0 :       case UNINITIALIZED_STATE: {
    +     123           0 :         ROS_ERROR_THROTTLE(1.0, "[%s]: transition to %s is not possible from any state", getPrintName().c_str(), getStateAsString(UNINITIALIZED_STATE).c_str());
    +     124           0 :         return false;
    +     125             :         break;
    +     126             :       }
    +     127             : 
    +     128          91 :       case INITIALIZED_STATE: {
    +     129          91 :         if (current_state_ != UNINITIALIZED_STATE) {
    +     130           0 :           ROS_ERROR_THROTTLE(1.0, "[%s]: transition to %s is possible only from %s", getPrintName().c_str(), getStateAsString(INITIALIZED_STATE).c_str(),
    +     131             :                              getStateAsString(UNINITIALIZED_STATE).c_str());
    +     132           0 :           return false;
    +     133             :         }
    +     134          91 :         break;
    +     135             :       }
    +     136             : 
    +     137          91 :       case READY_FOR_FLIGHT_STATE: {
    +     138          91 :         if (current_state_ != INITIALIZED_STATE && current_state_ != LANDED_STATE) {
    +     139           0 :           ROS_ERROR_THROTTLE(1.0, "[%s]: transition to %s is possible only from %s or %s", getPrintName().c_str(),
    +     140             :                              getStateAsString(READY_FOR_FLIGHT_STATE).c_str(), getStateAsString(INITIALIZED_STATE).c_str(),
    +     141             :                              getStateAsString(LANDED_STATE).c_str());
    +     142           0 :           return false;
    +     143             :         }
    +     144          91 :         break;
    +     145             :       }
    +     146             : 
    +     147          22 :       case TAKING_OFF_STATE: {
    +     148          22 :         if (current_state_ != READY_FOR_FLIGHT_STATE) {
    +     149           0 :           ROS_ERROR_THROTTLE(1.0, "[%s]: transition to %s is possible only from %s", getPrintName().c_str(), getStateAsString(TAKING_OFF_STATE).c_str(),
    +     150             :                              getStateAsString(READY_FOR_FLIGHT_STATE).c_str());
    +     151           0 :           return false;
    +     152             :         }
    +     153          22 :         break;
    +     154             :       }
    +     155             : 
    +     156          86 :       case FLYING_STATE: {
    +     157          86 :         if (current_state_ != TAKING_OFF_STATE && current_state_ != READY_FOR_FLIGHT_STATE && current_state_ != HOVER_STATE && current_state_ != ESTIMATOR_SWITCHING_STATE) {
    +     158           0 :           ROS_ERROR_THROTTLE(1.0, "[%s]: transition to %s is possible only from %s or %s or %s", getPrintName().c_str(), getStateAsString(FLYING_STATE).c_str(),
    +     159             :                              getStateAsString(TAKING_OFF_STATE).c_str(), getStateAsString(HOVER_STATE).c_str(),
    +     160             :                              getStateAsString(ESTIMATOR_SWITCHING_STATE).c_str());
    +     161           0 :           return false;
    +     162             :         }
    +     163          86 :         break;
    +     164             :       }
    +     165             : 
    +     166           0 :       case HOVER_STATE: {
    +     167           0 :         if (current_state_ != FLYING_STATE) {
    +     168           0 :           ROS_ERROR_THROTTLE(1.0, "[%s]: transition to %s is possible only from %s", getPrintName().c_str(), getStateAsString(HOVER_STATE).c_str(),
    +     169             :                              getStateAsString(FLYING_STATE).c_str());
    +     170           0 :           return false;
    +     171             :         }
    +     172           0 :         break;
    +     173             :       }
    +     174             : 
    +     175           5 :       case ESTIMATOR_SWITCHING_STATE: {
    +     176           5 :         if (current_state_ != FLYING_STATE && current_state_ != HOVER_STATE) {
    +     177           0 :           ROS_ERROR_THROTTLE(1.0, "[%s]: transition to %s is possible only from %s or %s", getPrintName().c_str(),
    +     178             :                              getStateAsString(ESTIMATOR_SWITCHING_STATE).c_str(), getStateAsString(FLYING_STATE).c_str(),
    +     179             :                              getStateAsString(HOVER_STATE).c_str());
    +     180           0 :           return false;
    +     181             :         }
    +     182           5 :         pre_switch_state_ = current_state_;
    +     183           5 :         break;
    +     184             :       }
    +     185             : 
    +     186           0 :       case LANDING_STATE: {
    +     187           0 :         if (current_state_ != FLYING_STATE && current_state_ != HOVER_STATE) {
    +     188           0 :           ROS_ERROR_THROTTLE(1.0, "[%s]: transition to %s is possible only from %s or %s", getPrintName().c_str(), getStateAsString(LANDING_STATE).c_str(),
    +     189             :                              getStateAsString(FLYING_STATE).c_str(), getStateAsString(HOVER_STATE).c_str());
    +     190           0 :           return false;
    +     191             :         }
    +     192           0 :         break;
    +     193             :       }
    +     194             : 
    +     195           0 :       case LANDED_STATE: {
    +     196           0 :         if (current_state_ != LANDING_STATE) {
    +     197           0 :           ROS_ERROR_THROTTLE(1.0, "[%s]: transition to %s is possible only from %s", getPrintName().c_str(), getStateAsString(LANDED_STATE).c_str(),
    +     198             :                              getStateAsString(LANDING_STATE).c_str());
    +     199           0 :           return false;
    +     200             :         }
    +     201           0 :         break;
    +     202             :       }
    +     203             : 
    +     204           0 :       case DUMMY_STATE: {
    +     205           0 :         if (current_state_ != INITIALIZED_STATE) {
    +     206           0 :           ROS_ERROR_THROTTLE(1.0, "[%s]: transition to %s is possible only from %s", getPrintName().c_str(), getStateAsString(DUMMY_STATE).c_str(),
    +     207             :                              getStateAsString(INITIALIZED_STATE).c_str());
    +     208           0 :           return false;
    +     209             :         }
    +     210           0 :         break;
    +     211             :       }
    +     212           0 :       case EMERGENCY_STATE: {
    +     213           0 :         ROS_WARN("[%s]: transition to %s", getPrintName().c_str(), getStateAsString(EMERGENCY_STATE).c_str());
    +     214           0 :         break;
    +     215             :       }
    +     216             : 
    +     217           0 :       case ERROR_STATE: {
    +     218           0 :         ROS_WARN("[%s]: transition to %s", getPrintName().c_str(), getStateAsString(ERROR_STATE).c_str());
    +     219           0 :         break;
    +     220             :       }
    +     221             : 
    +     222           0 :       case FAILSAFE_STATE: {
    +     223           0 :         ROS_WARN("[%s]: transition to %s", getPrintName().c_str(), getStateAsString(FAILSAFE_STATE).c_str());
    +     224           0 :         break;
    +     225             :       }
    +     226             : 
    +     227           0 :       default: {
    +     228           0 :         ROS_ERROR_THROTTLE(1.0, "[%s]: rejected transition to unknown state id %d", getPrintName().c_str(), target_state);
    +     229           0 :         return false;
    +     230             :         break;
    +     231             :       }
    +     232             :     }
    +     233             : 
    +     234         295 :     std::scoped_lock lock(mtx_state_);
    +     235             :     {
    +     236         295 :       previous_state_ = current_state_;
    +     237         295 :       current_state_  = target_state;
    +     238             :     }
    +     239             : 
    +     240         295 :     ROS_INFO("[%s]: successfully changed states %s -> %s", getPrintName().c_str(), getStateAsString(previous_state_).c_str(),
    +     241             :              getStateAsString(current_state_).c_str());
    +     242             : 
    +     243         295 :     return true;
    +     244             :   }
    +     245             :   /*//}*/
    +     246             : 
    +     247             :   /*//{ changeToPreSwitchState() */
    +     248           5 :   void changeToPreSwitchState() {
    +     249           5 :     changeState(pre_switch_state_);
    +     250           5 :   }
    +     251             :   /*//}*/
    +     252             : 
    +     253             : private:
    +     254             :   const std::string name_ = "StateMachine";
    +     255             :   const std::string nodelet_name_;
    +     256             : 
    +     257             :   SMState_t current_state_    = UNINITIALIZED_STATE;
    +     258             :   SMState_t previous_state_   = UNINITIALIZED_STATE;
    +     259             :   SMState_t pre_switch_state_ = UNINITIALIZED_STATE;
    +     260             : 
    +     261             :   mutable std::mutex mtx_state_;
    +     262             : 
    +     263             :   std::string getName() const {
    +     264             :     return name_;
    +     265             :   }
    +     266             : 
    +     267         295 :   std::string getPrintName() const {
    +     268         590 :     return nodelet_name_ + "/" + name_;
    +     269             :   }
    +     270             : 
    +     271             :   // clang-format off
    +     272             :   const std::vector<std::string> sm_state_names_ = {
    +     273             :   "UNINITIALIZED_STATE",
    +     274             :   "INITIALIZED_STATE",
    +     275             :   "READY_FOR_FLIGHT_STATE",
    +     276             :   "TAKING_OFF_STATE",
    +     277             :   "FLYING_STATE",
    +     278             :   "HOVER_STATE",
    +     279             :   "LANDING_STATE",
    +     280             :   "LANDED_STATE",
    +     281             :   "ESTIMATOR_SWITCHING_STATE",
    +     282             :   "DUMMY_STATE",
    +     283             :   "EMERGENCY_STATE",
    +     284             :   "FAILSAFE_STATE",
    +     285             :   "ERROR_STATE"
    +     286             :   };
    +     287             :   // clang-format on
    +     288             : };
    +     289             : /*//}*/
    +     290             : 
    +     291             : /*//{ class EstimationManager */
    +     292             : class EstimationManager : public nodelet::Nodelet {
    +     293             : 
    +     294             : private:
    +     295             :   const std::string nodelet_name_ = "EstimationManager";
    +     296             :   const std::string package_name_ = "mrs_uav_managers";
    +     297             : 
    +     298             :   ros::NodeHandle nh_;
    +     299             : 
    +     300             :   std::string _custom_config_;
    +     301             :   std::string _platform_config_;
    +     302             :   std::string _world_config_;
    +     303             : 
    +     304             :   std::shared_ptr<CommonHandlers_t> ch_;
    +     305             : 
    +     306             :   std::shared_ptr<StateMachine> sm_;
    +     307             : 
    +     308             :   std::string after_midair_activation_tracker_name_;
    +     309             :   std::string takeoff_tracker_name_;
    +     310             : 
    +     311             :   mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics> sh_control_manager_diag_;
    +     312             :   mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput>            sh_control_input_;
    +     313             : 
    +     314             :   mrs_lib::PublisherHandler<mrs_msgs::EstimationDiagnostics> ph_diagnostics_;
    +     315             :   mrs_lib::PublisherHandler<mrs_msgs::Float64Stamped>        ph_max_flight_z_;
    +     316             :   mrs_lib::PublisherHandler<mrs_msgs::UavState>              ph_uav_state_;
    +     317             :   mrs_lib::PublisherHandler<nav_msgs::Odometry>              ph_odom_main_;
    +     318             :   mrs_lib::PublisherHandler<nav_msgs::Odometry>              ph_odom_slow_;  // use topic throttler instead?
    +     319             :   mrs_lib::PublisherHandler<nav_msgs::Odometry>              ph_innovation_;
    +     320             : 
    +     321             :   mrs_lib::PublisherHandler<mrs_msgs::Float64Stamped> ph_altitude_amsl_;
    +     322             :   mrs_lib::PublisherHandler<mrs_msgs::Float64Stamped> ph_altitude_agl_;
    +     323             : 
    +     324             :   mrs_lib::PublisherHandler<geometry_msgs::QuaternionStamped> ph_orientation_;
    +     325             : 
    +     326             :   ros::Timer timer_publish_;
    +     327             :   void       timerPublish(const ros::TimerEvent& event);
    +     328             : 
    +     329             :   ros::Timer timer_publish_diagnostics_;
    +     330             :   void       timerPublishDiagnostics(const ros::TimerEvent& event);
    +     331             : 
    +     332             :   ros::Timer timer_check_health_;
    +     333             :   void       timerCheckHealth(const ros::TimerEvent& event);
    +     334             : 
    +     335             :   ros::Timer timer_initialization_;
    +     336             :   void       timerInitialization(const ros::TimerEvent& event);
    +     337             : 
    +     338             :   ros::ServiceServer srvs_change_estimator_;
    +     339             :   bool               callbackChangeEstimator(mrs_msgs::String::Request& req, mrs_msgs::String::Response& res);
    +     340             :   int                estimator_switch_count_ = 0;
    +     341             : 
    +     342             : 
    +     343             :   ros::ServiceServer srvs_toggle_callbacks_;
    +     344             :   bool               callbackToggleServiceCallbacks(std_srvs::SetBool::Request& req, std_srvs::SetBool::Response& res);
    +     345             :   bool               callbacks_enabled_             = false;
    +     346             :   bool               callbacks_disabled_by_service_ = false;
    +     347             : 
    +     348             :   bool                                             callFailsafeService();
    +     349             :   mrs_lib::ServiceClientHandler<std_srvs::Trigger> srvch_failsafe_;
    +     350             :   bool                                             failsafe_call_succeeded_ = false;
    +     351             : 
    +     352             :   // TODO service clients
    +     353             :   /* mrs_lib::ServiceClientHandler<std_srvs::Trigger> srvc_hover_; */
    +     354             :   /* mrs_lib::ServiceClientHandler<mrs_msgs::ReferenceStampedSrv> srvc_reference_; */
    +     355             :   /* mrs_lib::ServiceClientHandler<std_srvs::Trigger> srvc_ehover_; */
    +     356             :   /* mrs_lib::ServiceClientHandler<std_srvs::SetBool> srvc_enable_callbacks_; */
    +     357             : 
    +     358             :   // | ------------- dynamic loading of estimators ------------- |
    +     359             :   std::unique_ptr<pluginlib::ClassLoader<mrs_uav_managers::StateEstimator>> state_estimator_loader_;  // pluginlib loader of dynamically loaded estimators
    +     360             :   std::vector<std::string>                                                  estimator_names_;         // list of estimator names
    +     361             :   std::vector<boost::shared_ptr<mrs_uav_managers::StateEstimator>>          estimator_list_;          // list of estimators
    +     362             :   std::mutex                                                                mutex_estimator_list_;
    +     363             :   std::vector<std::string>                                                  switchable_estimator_names_;
    +     364             :   std::mutex                                                                mutex_switchable_estimator_names_;
    +     365             :   std::string                                                               initial_estimator_name_ = "UNDEFINED_INITIAL_ESTIMATOR";
    +     366             :   boost::shared_ptr<mrs_uav_managers::StateEstimator>                       initial_estimator_;
    +     367             :   boost::shared_ptr<mrs_uav_managers::StateEstimator>                       active_estimator_;
    +     368             :   std::mutex                                                                mutex_active_estimator_;
    +     369             : 
    +     370             :   std::unique_ptr<pluginlib::ClassLoader<mrs_uav_managers::AglEstimator>> agl_estimator_loader_;  // pluginlib loader of dynamically loaded estimators
    +     371             :   std::string                                                             est_alt_agl_name_ = "UNDEFINED_AGL_ESTIMATOR";
    +     372             :   boost::shared_ptr<mrs_uav_managers::AglEstimator>                       est_alt_agl_;
    +     373             :   bool                                                                    is_using_agl_estimator_;
    +     374             : 
    +     375             :   double max_flight_z_;
    +     376             : 
    +     377             :   bool switchToHealthyEstimator();
    +     378             :   void switchToEstimator(const boost::shared_ptr<mrs_uav_managers::StateEstimator>& target_estimator);
    +     379             : 
    +     380             :   bool loadConfigFile(const std::string& file_path);
    +     381             : 
    +     382             : public:
    +     383          91 :   EstimationManager() {
    +     384          91 :   }
    +     385             : 
    +     386             :   void onInit();
    +     387             : 
    +     388             :   std::string getName() const;
    +     389             : };
    +     390             : /*//}*/
    +     391             : 
    +     392             : /*//{ onInit() */
    +     393          91 : void EstimationManager::onInit() {
    +     394             : 
    +     395          91 :   nh_ = nodelet::Nodelet::getMTPrivateNodeHandle();
    +     396             : 
    +     397          91 :   ros::Time::waitForValid();
    +     398             : 
    +     399          91 :   ROS_INFO("[%s]: initializing", getName().c_str());
    +     400             : 
    +     401          91 :   sm_ = std::make_shared<StateMachine>(nodelet_name_);
    +     402             : 
    +     403          91 :   ch_ = std::make_shared<CommonHandlers_t>();
    +     404             : 
    +     405          91 :   ch_->nodelet_name = nodelet_name_;
    +     406          91 :   ch_->package_name = package_name_;
    +     407             : 
    +     408             :   // finish initialization in a oneshot timer, so that we don't block loading of other nodelets by the nodelet manager
    +     409          91 :   timer_initialization_ = nh_.createTimer(ros::Rate(1.0), &EstimationManager::timerInitialization, this, true, true);
    +     410          91 : }
    +     411             : /*//}*/
    +     412             : 
    +     413             : // --------------------------------------------------------------
    +     414             : // |                          callbacks                         |
    +     415             : // --------------------------------------------------------------
    +     416             : 
    +     417             : // | --------------------- timer callbacks -------------------- |
    +     418             : 
    +     419             : /*//{ timerPublish() */
    +     420      173141 : void EstimationManager::timerPublish([[maybe_unused]] const ros::TimerEvent& event) {
    +     421             : 
    +     422      173141 :   if (!sm_->isInitialized()) {
    +     423       17884 :     return;
    +     424             :   }
    +     425             : 
    +     426      346274 :   mrs_lib::ScopeTimer scope_timer = mrs_lib::ScopeTimer("EstimationManager::timerPublish", ch_->scope_timer.logger, ch_->scope_timer.enabled);
    +     427             : 
    +     428      173137 :   if (sm_->isInState(StateMachine::ESTIMATOR_SWITCHING_STATE)) {
    +     429           0 :     ROS_WARN("[%s]: Not publishing during estimator switching.", getName().c_str());
    +     430           0 :     return;
    +     431             :   }
    +     432             : 
    +     433      173137 :   if (!sm_->isInPublishableState()) {
    +     434       17880 :     ROS_WARN_THROTTLE(1.0, "[%s]: not publishing uav state in %s", getName().c_str(), sm_->getCurrentStateString().c_str());
    +     435       17880 :     return;
    +     436             :   }
    +     437             : 
    +     438      155257 :   mrs_msgs::UavState uav_state;
    +     439      155257 :   auto               ret = active_estimator_->getUavState();
    +     440      155257 :   if (ret) {
    +     441      155257 :     uav_state = ret.value();
    +     442             :   } else {
    +     443           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: Active estimator did not provide uav_state.", getName().c_str());
    +     444           0 :     return;
    +     445             :   }
    +     446             : 
    +     447      155257 :   if (!Support::noNans(uav_state.pose.orientation)) {
    +     448           0 :     ROS_ERROR("[%s]: nan in uav state orientation", getName().c_str());
    +     449           0 :     return;
    +     450             :   }
    +     451             : 
    +     452             : 
    +     453      155257 :   if (active_estimator_->isMitigatingJump()) {
    +     454           0 :     estimator_switch_count_++;
    +     455             :   }
    +     456      155257 :   uav_state.estimator_iteration = estimator_switch_count_;
    +     457             : 
    +     458      155257 :   scope_timer.checkpoint("get uav state");
    +     459             :   // TODO state health checks
    +     460             : 
    +     461      155257 :   ph_uav_state_.publish(uav_state);
    +     462             : 
    +     463      155257 :   scope_timer.checkpoint("pub uav state");
    +     464      310514 :   nav_msgs::Odometry odom_main = Support::uavStateToOdom(uav_state);
    +     465             : 
    +     466      155257 :   scope_timer.checkpoint("uav state to odom");
    +     467      310514 :   const std::vector<double> pose_covariance = active_estimator_->getPoseCovariance();
    +     468     5744512 :   for (size_t i = 0; i < pose_covariance.size(); i++) {
    +     469     5589256 :     odom_main.pose.covariance[i] = pose_covariance[i];
    +     470             :   }
    +     471             : 
    +     472      310514 :   const std::vector<double> twist_covariance = active_estimator_->getTwistCovariance();
    +     473     5744512 :   for (size_t i = 0; i < twist_covariance.size(); i++) {
    +     474     5589256 :     odom_main.twist.covariance[i] = twist_covariance[i];
    +     475             :   }
    +     476             : 
    +     477      155257 :   scope_timer.checkpoint("get covariance");
    +     478      155257 :   ph_odom_main_.publish(odom_main);
    +     479             : 
    +     480      310514 :   nav_msgs::Odometry innovation = active_estimator_->getInnovation();
    +     481      155257 :   ph_innovation_.publish(innovation);
    +     482             : 
    +     483             : 
    +     484      310514 :   mrs_msgs::Float64Stamped agl_height;
    +     485             : 
    +     486      155257 :   if (is_using_agl_estimator_) {
    +     487      126399 :     agl_height = est_alt_agl_->getUavAglHeight();
    +     488      126399 :     ph_altitude_agl_.publish(agl_height);
    +     489             :   }
    +     490             : }
    +     491             : /*//}*/
    +     492             : 
    +     493             : /*//{ timerPublishDiagnostics() */
    +     494       18061 : void EstimationManager::timerPublishDiagnostics([[maybe_unused]] const ros::TimerEvent& event) {
    +     495             : 
    +     496       18061 :   if (!sm_->isInitialized()) {
    +     497        1736 :     return;
    +     498             :   }
    +     499             : 
    +     500       36122 :   mrs_lib::ScopeTimer scope_timer = mrs_lib::ScopeTimer("EstimationManager::timerPublishDiagnostics", ch_->scope_timer.logger, ch_->scope_timer.enabled);
    +     501             : 
    +     502       18061 :   if (sm_->isInState(StateMachine::ESTIMATOR_SWITCHING_STATE)) {
    +     503           0 :     ROS_WARN("[%s]: Not publishing diagnostics during estimator switching.", getName().c_str());
    +     504           0 :     return;
    +     505             :   }
    +     506             : 
    +     507       18061 :   if (!sm_->isInPublishableState()) {
    +     508        1736 :     ROS_WARN_THROTTLE(1.0, "[%s]: not publishing uav state in %s", getName().c_str(), sm_->getCurrentStateString().c_str());
    +     509        1736 :     return;
    +     510             :   }
    +     511             : 
    +     512       16325 :   mrs_msgs::UavState uav_state;
    +     513       16325 :   auto               ret = active_estimator_->getUavState();
    +     514       16325 :   if (ret) {
    +     515       16325 :     uav_state = ret.value();
    +     516             :   } else {
    +     517           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: Active estimator did not provide uav_state.", getName().c_str());
    +     518           0 :     return;
    +     519             :   }
    +     520             : 
    +     521       16325 :   if (!Support::noNans(uav_state.pose.orientation)) {
    +     522           0 :     ROS_ERROR("[%s]: nan in uav state orientation", getName().c_str());
    +     523           0 :     return;
    +     524             :   }
    +     525             : 
    +     526       32650 :   mrs_msgs::Float64Stamped agl_height;
    +     527             : 
    +     528       16325 :   if (is_using_agl_estimator_) {
    +     529       12386 :     agl_height = est_alt_agl_->getUavAglHeight();
    +     530       12386 :     ph_altitude_agl_.publish(agl_height);
    +     531             :   }
    +     532             : 
    +     533       32650 :   mrs_msgs::Float64Stamped max_flight_z_msg;
    +     534       16325 :   max_flight_z_msg.header.stamp = ros::Time::now();
    +     535       16325 :   if (active_estimator_ && active_estimator_->isInitialized()) {
    +     536       16325 :     max_flight_z_msg.header.frame_id = active_estimator_->getFrameId();
    +     537       16325 :     max_flight_z_msg.value           = active_estimator_->getMaxFlightZ();
    +     538             :   }
    +     539       16325 :   max_flight_z_ = max_flight_z_msg.value;
    +     540       16325 :   ph_max_flight_z_.publish(max_flight_z_msg);
    +     541             : 
    +     542             :   // publish diagnostics
    +     543       32650 :   mrs_msgs::EstimationDiagnostics diagnostics;
    +     544             : 
    +     545       16325 :   diagnostics.header.stamp   = uav_state.header.stamp;
    +     546       16325 :   diagnostics.child_frame_id = uav_state.child_frame_id;
    +     547             : 
    +     548       16325 :   diagnostics.pose         = uav_state.pose;
    +     549       16325 :   diagnostics.velocity     = uav_state.velocity;
    +     550       16325 :   diagnostics.acceleration = uav_state.acceleration;
    +     551             : 
    +     552       16325 :   diagnostics.sm_state                 = sm_->getCurrentStateString();
    +     553       16325 :   diagnostics.max_flight_z             = max_flight_z_msg.value;
    +     554       16325 :   diagnostics.estimator_iteration      = estimator_switch_count_;
    +     555       16325 :   diagnostics.estimation_rate          = ch_->desired_uav_state_rate;
    +     556       16325 :   diagnostics.running_state_estimators = estimator_names_;
    +     557             : 
    +     558             :   {
    +     559       32650 :     std::scoped_lock lock(mutex_switchable_estimator_names_);
    +     560       16325 :     diagnostics.switchable_state_estimators = switchable_estimator_names_;
    +     561             :   }
    +     562             : 
    +     563             : 
    +     564       16325 :   if (active_estimator_ && active_estimator_->isInitialized()) {
    +     565       16325 :     diagnostics.header.frame_id         = active_estimator_->getFrameId();
    +     566       16325 :     diagnostics.current_state_estimator = active_estimator_->getName();
    +     567             :   } else {
    +     568           0 :     diagnostics.header.frame_id         = "";
    +     569           0 :     diagnostics.current_state_estimator = "";
    +     570             :   }
    +     571             : 
    +     572       16325 :   diagnostics.estimator_horizontal = uav_state.estimator_horizontal;
    +     573       16325 :   diagnostics.estimator_vertical   = uav_state.estimator_vertical;
    +     574       16325 :   diagnostics.estimator_heading    = uav_state.estimator_heading;
    +     575             : 
    +     576       16325 :   if (is_using_agl_estimator_) {
    +     577       12386 :     diagnostics.estimator_agl_height = est_alt_agl_name_;
    +     578       12386 :     diagnostics.agl_height           = agl_height.value;
    +     579             :   } else {
    +     580        3939 :     diagnostics.estimator_agl_height = "NOT_USED";
    +     581        3939 :     diagnostics.agl_height           = std::nanf("");
    +     582             :   }
    +     583             : 
    +     584       16325 :   diagnostics.platform_config = _platform_config_;
    +     585       16325 :   diagnostics.custom_config   = _custom_config_;
    +     586             : 
    +     587       16325 :   ph_diagnostics_.publish(diagnostics);
    +     588             : 
    +     589       16325 :   ROS_INFO_THROTTLE(5.0, "[%s]: %s. pos: [%.2f, %.2f, %.2f] m. Estimator: %s. Max. z.: %.2f m. Estimator switches: %d.", getName().c_str(),
    +     590             :                     sm_->getCurrentStateString().c_str(), uav_state.pose.position.x, uav_state.pose.position.y, uav_state.pose.position.z,
    +     591             :                     active_estimator_->getName().c_str(), max_flight_z_, estimator_switch_count_);
    +     592             : }
    +     593             : /*//}*/
    +     594             : 
    +     595             : /*//{ timerCheckHealth() */
    +     596      173141 : void EstimationManager::timerCheckHealth([[maybe_unused]] const ros::TimerEvent& event) {
    +     597             : 
    +     598      173141 :   if (!sm_->isInitialized()) {
    +     599           4 :     return;
    +     600             :   }
    +     601             : 
    +     602      519411 :   mrs_lib::ScopeTimer scope_timer = mrs_lib::ScopeTimer("EstimationManager::timerCheckHealth", ch_->scope_timer.logger, ch_->scope_timer.enabled);
    +     603             : 
    +     604             :   /*//{ start ready estimators, check switchable estimators */
    +     605      346274 :   std::vector<std::string> switchable_estimator_names;
    +     606      366557 :   for (auto estimator : estimator_list_) {
    +     607             : 
    +     608      193420 :     if (estimator->isReady()) {
    +     609             :       try {
    +     610        7280 :         ROS_INFO_THROTTLE(1.0, "[%s]: starting the estimator '%s'", getName().c_str(), estimator->getName().c_str());
    +     611        7280 :         estimator->start();
    +     612             :       }
    +     613           0 :       catch (std::runtime_error& ex) {
    +     614           0 :         ROS_ERROR("[%s]: exception caught during estimator starting: '%s'", getName().c_str(), ex.what());
    +     615           0 :         ros::shutdown();
    +     616             :       }
    +     617             :     }
    +     618             : 
    +     619      193420 :     if (estimator->isRunning() && estimator->getName() != "dummy" && estimator->getName() != "ground_truth") {
    +     620      183886 :       switchable_estimator_names.push_back(estimator->getName());
    +     621             :     }
    +     622             :   }
    +     623             : 
    +     624             :   {
    +     625      346274 :     std::scoped_lock lock(mutex_switchable_estimator_names_);
    +     626      173137 :     switchable_estimator_names_ = switchable_estimator_names;
    +     627             :   }
    +     628             : 
    +     629      173137 :   if (is_using_agl_estimator_ && est_alt_agl_->isReady()) {
    +     630          70 :     est_alt_agl_->start();
    +     631             :   }
    +     632             : 
    +     633             :   /*//}*/
    +     634             : 
    +     635      312953 :   if (!callbacks_disabled_by_service_ &&
    +     636      312953 :       (sm_->isInState(StateMachine::FLYING_STATE) || sm_->isInState(StateMachine::HOVER_STATE) || sm_->isInState(StateMachine::READY_FOR_FLIGHT_STATE))) {
    +     637      121541 :     callbacks_enabled_ = true;
    +     638             :   } else {
    +     639       51596 :     callbacks_enabled_ = false;
    +     640             :   }
    +     641             : 
    +     642             :   // TODO fuj if, zmenit na switch
    +     643             :   // activate initial estimator
    +     644      173137 :   if (sm_->isInState(StateMachine::INITIALIZED_STATE) && initial_estimator_->isRunning()) {
    +     645       17062 :     std::scoped_lock lock(mutex_active_estimator_);
    +     646        8531 :     ROS_INFO_THROTTLE(1.0, "[%s]: activating the initial estimator %s", getName().c_str(), initial_estimator_->getName().c_str());
    +     647        8531 :     active_estimator_ = initial_estimator_;
    +     648        8531 :     if (active_estimator_->getName() == "dummy") {
    +     649           0 :       sm_->changeState(StateMachine::DUMMY_STATE);
    +     650             :     } else {
    +     651        8531 :       if (!is_using_agl_estimator_ || est_alt_agl_->isRunning()) {
    +     652          91 :         sm_->changeState(StateMachine::READY_FOR_FLIGHT_STATE);
    +     653             :       } else {
    +     654        8440 :         ROS_INFO_THROTTLE(1.0, "[%s]: %s agl estimator: %s to be running", getName().c_str(), Support::waiting_for_string.c_str(),
    +     655             :                           est_alt_agl_->getName().c_str());
    +     656             :       }
    +     657             :     }
    +     658             :   }
    +     659             : 
    +     660             :   // active estimator is in faulty state, we need to switch to healthy estimator
    +     661      173137 :   if (sm_->isInTheAir() && active_estimator_->isError()) {
    +     662           0 :     sm_->changeState(StateMachine::ESTIMATOR_SWITCHING_STATE);
    +     663             :   }
    +     664             : 
    +     665      173137 :   if (sm_->isInState(StateMachine::ESTIMATOR_SWITCHING_STATE)) {
    +     666           0 :     if (switchToHealthyEstimator()) {
    +     667           0 :       sm_->changeToPreSwitchState();
    +     668             :     } else {  // cannot switch to healthy estimator - failsafe necessary
    +     669           0 :       ROS_ERROR_THROTTLE(1.0, "[%s]: Cannot switch to any healthy estimator. Triggering failsafe.", getName().c_str());
    +     670           0 :       sm_->changeState(StateMachine::FAILSAFE_STATE);
    +     671             :     }
    +     672             :   }
    +     673             : 
    +     674      173137 :   if (sm_->isInState(StateMachine::FAILSAFE_STATE)) {
    +     675           0 :     if (!failsafe_call_succeeded_ && callFailsafeService()) {
    +     676           0 :       ROS_INFO_THROTTLE(1.0, "[%s]: failsafe called successfully", getName().c_str());
    +     677           0 :       failsafe_call_succeeded_ = true;
    +     678             :     }
    +     679           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: we are in failsafe state", getName().c_str());
    +     680             :   }
    +     681             : 
    +     682             :   // standard takeoff
    +     683      173137 :   if (sm_->isInState(StateMachine::READY_FOR_FLIGHT_STATE)) {
    +     684       41029 :     if (sh_control_manager_diag_.hasMsg() && sh_control_manager_diag_.getMsg()->active_tracker == takeoff_tracker_name_) {
    +     685          22 :       sm_->changeState(StateMachine::TAKING_OFF_STATE);
    +     686             :     }
    +     687             :   }
    +     688             : 
    +     689             :   // midair activation
    +     690      173137 :   if (sm_->isInState(StateMachine::READY_FOR_FLIGHT_STATE)) {
    +     691       41007 :     if (sh_control_manager_diag_.hasMsg() && sh_control_manager_diag_.getMsg()->active_tracker == after_midair_activation_tracker_name_) {
    +     692          61 :       sm_->changeState(StateMachine::FLYING_STATE);
    +     693             :     }
    +     694             :   }
    +     695             : 
    +     696      173137 :   if (sm_->isInState(StateMachine::TAKING_OFF_STATE)) {
    +     697       10570 :     if (sh_control_manager_diag_.hasMsg() && sh_control_manager_diag_.getMsg()->active_tracker != takeoff_tracker_name_) {
    +     698          20 :       sm_->changeState(StateMachine::FLYING_STATE);
    +     699             :     }
    +     700             :   }
    +     701             : 
    +     702      173137 :   if (sm_->isInState(StateMachine::FLYING_STATE)) {
    +     703      103828 :     if ((ros::Time::now() - sh_control_input_.lastMsgTime()).toSec() > 0.1) {
    +     704       18443 :       ROS_WARN_THROTTLE(1.0, "[%s]: not received control input for %.4fs, estimation suboptimal, potentially unstable", getName().c_str(),
    +     705             :                         (ros::Time::now() - sh_control_input_.lastMsgTime()).toSec());
    +     706             :     }
    +     707             :   }
    +     708             : }
    +     709             : /*//}*/
    +     710             : 
    +     711             : /*//{ timerInitialization() */
    +     712          91 : void EstimationManager::timerInitialization([[maybe_unused]] const ros::TimerEvent& event) {
    +     713             : 
    +     714         182 :   mrs_lib::ParamLoader param_loader(nh_, getName());
    +     715             : 
    +     716          91 :   param_loader.loadParam("custom_config", _custom_config_);
    +     717          91 :   param_loader.loadParam("platform_config", _platform_config_);
    +     718          91 :   param_loader.loadParam("world_config", _world_config_);
    +     719             : 
    +     720          91 :   if (_custom_config_ != "") {
    +     721          91 :     param_loader.addYamlFile(_custom_config_);
    +     722             :   }
    +     723             : 
    +     724          91 :   if (_platform_config_ != "") {
    +     725          91 :     param_loader.addYamlFile(_platform_config_);
    +     726             :   }
    +     727             : 
    +     728          91 :   if (_world_config_ != "") {
    +     729          91 :     param_loader.addYamlFile(_world_config_);
    +     730             :   }
    +     731             : 
    +     732          91 :   param_loader.addYamlFileFromParam("private_config");
    +     733          91 :   param_loader.addYamlFileFromParam("public_config");
    +     734          91 :   param_loader.addYamlFileFromParam("uav_manager_config");
    +     735          91 :   param_loader.addYamlFileFromParam("estimators_config");
    +     736          91 :   param_loader.addYamlFileFromParam("active_estimators_config");
    +     737             : 
    +     738          91 :   param_loader.loadParam("uav_name", ch_->uav_name);
    +     739             : 
    +     740             :   /*//{ load world_origin parameters */
    +     741             : 
    +     742         182 :   std::string world_origin_units;
    +     743          91 :   bool        is_origin_param_ok = true;
    +     744          91 :   double      world_origin_x     = 0;
    +     745          91 :   double      world_origin_y     = 0;
    +     746             : 
    +     747          91 :   param_loader.loadParam("world_origin/units", world_origin_units);
    +     748             : 
    +     749          91 :   if (Support::toLowercase(world_origin_units) == "utm") {
    +     750           0 :     ROS_INFO("[%s]: Loading world origin in UTM units.", getName().c_str());
    +     751           0 :     is_origin_param_ok &= param_loader.loadParam("world_origin/origin_x", world_origin_x);
    +     752           0 :     is_origin_param_ok &= param_loader.loadParam("world_origin/origin_y", world_origin_y);
    +     753             : 
    +     754          91 :   } else if (Support::toLowercase(world_origin_units) == "latlon") {
    +     755             :     double lat, lon;
    +     756          91 :     ROS_INFO("[%s]: Loading world origin in LatLon units.", getName().c_str());
    +     757          91 :     is_origin_param_ok &= param_loader.loadParam("world_origin/origin_x", lat);
    +     758          91 :     is_origin_param_ok &= param_loader.loadParam("world_origin/origin_y", lon);
    +     759          91 :     mrs_lib::UTM(lat, lon, &world_origin_x, &world_origin_y);
    +     760          91 :     ROS_INFO("[%s]: Converted to UTM x: %f, y: %f.", getName().c_str(), world_origin_x, world_origin_y);
    +     761             : 
    +     762             :   } else {
    +     763           0 :     ROS_ERROR("[%s]: world_origin_units must be (\"UTM\"|\"LATLON\"). Got '%s'", getName().c_str(), world_origin_units.c_str());
    +     764           0 :     ros::shutdown();
    +     765             :   }
    +     766             : 
    +     767          91 :   ch_->world_origin.x = world_origin_x;
    +     768          91 :   ch_->world_origin.y = world_origin_y;
    +     769             : 
    +     770          91 :   if (!is_origin_param_ok) {
    +     771           0 :     ROS_ERROR("[%s]: Could not load all mandatory parameters from world file. Please check your world file.", getName().c_str());
    +     772           0 :     ros::shutdown();
    +     773             :   }
    +     774             :   /*//}*/
    +     775             : 
    +     776             :   /*//{ load tracker names */
    +     777          91 :   param_loader.loadParam("mrs_uav_managers/uav_manager/takeoff/during_takeoff/tracker", takeoff_tracker_name_);
    +     778          91 :   param_loader.loadParam("mrs_uav_managers/uav_manager/midair_activation/after_activation/tracker", after_midair_activation_tracker_name_);
    +     779             :   /*//}*/
    +     780             : 
    +     781          91 :   param_loader.setPrefix(ch_->package_name + "/" + Support::toSnakeCase(ch_->nodelet_name) + "/");
    +     782             : 
    +     783             :   /*//{ load parameters into common handlers */
    +     784          91 :   param_loader.loadParam("frame_id/fcu", ch_->frames.fcu);
    +     785          91 :   ch_->frames.ns_fcu = ch_->uav_name + "/" + ch_->frames.fcu;
    +     786             : 
    +     787          91 :   param_loader.loadParam("frame_id/fcu_untilted", ch_->frames.fcu_untilted);
    +     788          91 :   ch_->frames.ns_fcu_untilted = ch_->uav_name + "/" + ch_->frames.fcu_untilted;
    +     789             : 
    +     790          91 :   param_loader.loadParam("frame_id/rtk_antenna", ch_->frames.rtk_antenna);
    +     791          91 :   ch_->frames.ns_rtk_antenna = ch_->uav_name + "/" + ch_->frames.rtk_antenna;
    +     792             : 
    +     793          91 :   ch_->transformer = std::make_shared<mrs_lib::Transformer>(nh_, getName());
    +     794          91 :   ch_->transformer->retryLookupNewest(true);
    +     795             : 
    +     796          91 :   param_loader.loadParam("rate/diagnostics", ch_->desired_diagnostics_rate);
    +     797             : 
    +     798             :   /*//}*/
    +     799             : 
    +     800             :   /*//{ load parameters */
    +     801             : 
    +     802             :   /*//{ publish debug topics parameters */
    +     803          91 :   param_loader.loadParam("debug_topics/input", ch_->debug_topics.input);
    +     804          91 :   param_loader.loadParam("debug_topics/output", ch_->debug_topics.output);
    +     805          91 :   param_loader.loadParam("debug_topics/state", ch_->debug_topics.state);
    +     806          91 :   param_loader.loadParam("debug_topics/covariance", ch_->debug_topics.covariance);
    +     807          91 :   param_loader.loadParam("debug_topics/innovation", ch_->debug_topics.innovation);
    +     808          91 :   param_loader.loadParam("debug_topics/diagnostics", ch_->debug_topics.diag);
    +     809          91 :   param_loader.loadParam("debug_topics/correction", ch_->debug_topics.correction);
    +     810          91 :   param_loader.loadParam("debug_topics/correction_delay", ch_->debug_topics.corr_delay);
    +     811             :   /*//}*/
    +     812             : 
    +     813             :   /*//}*/
    +     814             : 
    +     815         182 :   mrs_lib::SubscribeHandlerOptions shopts;
    +     816          91 :   shopts.nh                 = nh_;
    +     817          91 :   shopts.node_name          = getName();
    +     818          91 :   shopts.no_message_timeout = mrs_lib::no_timeout;
    +     819          91 :   shopts.threadsafe         = true;
    +     820          91 :   shopts.autostart          = true;
    +     821          91 :   shopts.queue_size         = 10;
    +     822          91 :   shopts.transport_hints    = ros::TransportHints().tcpNoDelay();
    +     823             : 
    +     824             :   /*//{ wait for hw api message */
    +     825             : 
    +     826             :   mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities> sh_hw_api_capabilities_ =
    +     827         273 :       mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities>(shopts, "hw_api_capabilities_in");
    +     828         183 :   while (!sh_hw_api_capabilities_.hasMsg()) {
    +     829          92 :     ROS_INFO("[%s]: %s hw_api_capabilities message at topic: %s", getName().c_str(), Support::waiting_for_string.c_str(),
    +     830             :              sh_hw_api_capabilities_.topicName().c_str());
    +     831          92 :     ros::Duration(1.0).sleep();
    +     832             :   }
    +     833             : 
    +     834         182 :   mrs_msgs::HwApiCapabilitiesConstPtr hw_api_capabilities = sh_hw_api_capabilities_.getMsg();
    +     835             :   /*//}*/
    +     836             : 
    +     837             :   /*//{ wait for desired uav_state rate */
    +     838          91 :   sh_control_manager_diag_ = mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics>(shopts, "control_manager_diagnostics_in");
    +     839         196 :   while (!sh_control_manager_diag_.hasMsg()) {
    +     840         105 :     ROS_INFO("[%s]: %s control_manager_diagnostics message at topic: %s", getName().c_str(), Support::waiting_for_string.c_str(),
    +     841             :              sh_control_manager_diag_.topicName().c_str());
    +     842         105 :     ros::Duration(1.0).sleep();
    +     843             :   }
    +     844             : 
    +     845         182 :   mrs_msgs::ControlManagerDiagnosticsConstPtr control_manager_diag_msg = sh_control_manager_diag_.getMsg();
    +     846          91 :   ch_->desired_uav_state_rate                                          = control_manager_diag_msg->desired_uav_state_rate;
    +     847          91 :   ROS_INFO("[%s]: The estimation is running at: %.2f Hz", getName().c_str(), ch_->desired_uav_state_rate);
    +     848             :   /*//}*/
    +     849             : 
    +     850             :   /*//{ initialize subscribers */
    +     851             : 
    +     852          91 :   sh_control_input_ = mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput>(shopts, "control_input_in");
    +     853             : 
    +     854             :   /*//}*/
    +     855             : 
    +     856             :   /*//{ load state estimator plugins */
    +     857          91 :   param_loader.loadParam("state_estimators", estimator_names_);
    +     858             : 
    +     859          91 :   state_estimator_loader_ = std::make_unique<pluginlib::ClassLoader<mrs_uav_managers::StateEstimator>>("mrs_uav_managers", "mrs_uav_managers::StateEstimator");
    +     860             : 
    +     861         189 :   for (size_t i = 0; i < estimator_names_.size(); i++) {
    +     862             : 
    +     863         196 :     const std::string estimator_name = estimator_names_[i];
    +     864             : 
    +     865             :     // load the estimator parameters
    +     866         196 :     std::string address;
    +     867          98 :     param_loader.loadParam(estimator_name + "/address", address);
    +     868             : 
    +     869             :     try {
    +     870          98 :       ROS_INFO("[%s]: loading the estimator '%s'", getName().c_str(), address.c_str());
    +     871          98 :       estimator_list_.push_back(state_estimator_loader_->createInstance(address.c_str()));
    +     872             :     }
    +     873           0 :     catch (pluginlib::CreateClassException& ex1) {
    +     874           0 :       ROS_ERROR("[%s]: CreateClassException for the estimator '%s'", getName().c_str(), address.c_str());
    +     875           0 :       ROS_ERROR("[%s]: Error: %s", getName().c_str(), ex1.what());
    +     876           0 :       ros::shutdown();
    +     877             :     }
    +     878           0 :     catch (pluginlib::PluginlibException& ex) {
    +     879           0 :       ROS_ERROR("[%s]: PluginlibException for the estimator '%s'", getName().c_str(), address.c_str());
    +     880           0 :       ROS_ERROR("[%s]: Error: %s", getName().c_str(), ex.what());
    +     881           0 :       ros::shutdown();
    +     882             :     }
    +     883             :   }
    +     884             : 
    +     885             :   /*//{ load agl estimator plugins */
    +     886          91 :   param_loader.loadParam("agl_height_estimator", est_alt_agl_name_);
    +     887          91 :   is_using_agl_estimator_ = est_alt_agl_name_ != "";
    +     888          91 :   ROS_WARN_COND(!is_using_agl_estimator_, "[%s]: not using AGL estimator for min height safe checking", getName().c_str());
    +     889             : 
    +     890             : 
    +     891          91 :   if (is_using_agl_estimator_) {
    +     892             : 
    +     893          70 :     agl_estimator_loader_ = std::make_unique<pluginlib::ClassLoader<mrs_uav_managers::AglEstimator>>("mrs_uav_managers", "mrs_uav_managers::AglEstimator");
    +     894             : 
    +     895             :     // load the estimator parameters
    +     896         140 :     std::string address;
    +     897          70 :     param_loader.loadParam(est_alt_agl_name_ + "/address", address);
    +     898             : 
    +     899             :     try {
    +     900          70 :       ROS_INFO("[%s]: loading the estimator '%s'", getName().c_str(), address.c_str());
    +     901          70 :       est_alt_agl_ = agl_estimator_loader_->createInstance(address.c_str());
    +     902             :     }
    +     903           0 :     catch (pluginlib::CreateClassException& ex1) {
    +     904           0 :       ROS_ERROR("[%s]: CreateClassException for the estimator '%s'", getName().c_str(), address.c_str());
    +     905           0 :       ROS_ERROR("[%s]: Error: %s", getName().c_str(), ex1.what());
    +     906           0 :       ros::shutdown();
    +     907             :     }
    +     908           0 :     catch (pluginlib::PluginlibException& ex) {
    +     909           0 :       ROS_ERROR("[%s]: PluginlibException for the estimator '%s'", getName().c_str(), address.c_str());
    +     910           0 :       ROS_ERROR("[%s]: Error: %s", getName().c_str(), ex.what());
    +     911           0 :       ros::shutdown();
    +     912             :     }
    +     913             :   }
    +     914             :   /*//}*/
    +     915             : 
    +     916          91 :   ROS_INFO("[%s]: estimators were loaded", getName().c_str());
    +     917             :   /*//}*/
    +     918             : 
    +     919             :   /*//{ check whether initial estimator was loaded */
    +     920          91 :   param_loader.loadParam("initial_state_estimator", initial_estimator_name_);
    +     921          91 :   bool initial_estimator_found = false;
    +     922          91 :   for (auto estimator : estimator_list_) {
    +     923          91 :     if (estimator->getName() == initial_estimator_name_) {
    +     924          91 :       initial_estimator_      = estimator;
    +     925          91 :       initial_estimator_found = true;
    +     926          91 :       break;
    +     927             :     }
    +     928             :   }
    +     929             : 
    +     930          91 :   if (!initial_estimator_found) {
    +     931           0 :     ROS_ERROR("[%s]: initial estimator %s could not be found among loaded estimators. shutting down", getName().c_str(), initial_estimator_name_.c_str());
    +     932           0 :     ros::shutdown();
    +     933             :   }
    +     934             :   /*//}*/
    +     935             : 
    +     936             :   /*//{ initialize estimators */
    +     937         189 :   for (auto estimator : estimator_list_) {
    +     938             : 
    +     939             :     // create private handlers
    +     940         196 :     std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> ph = std::make_shared<mrs_uav_managers::estimation_manager::PrivateHandlers_t>();
    +     941             : 
    +     942          98 :     ph->loadConfigFile = boost::bind(&EstimationManager::loadConfigFile, this, _1);
    +     943          98 :     ph->param_loader   = std::make_shared<mrs_lib::ParamLoader>(ros::NodeHandle(nh_, estimator->getName()), "EstimationManager/" + estimator->getName());
    +     944             : 
    +     945          98 :     if (_custom_config_ != "") {
    +     946          98 :       ph->param_loader->addYamlFile(_custom_config_);
    +     947             :     }
    +     948             : 
    +     949          98 :     if (_platform_config_ != "") {
    +     950          98 :       ph->param_loader->addYamlFile(_platform_config_);
    +     951             :     }
    +     952             : 
    +     953          98 :     if (_world_config_ != "") {
    +     954          98 :       ph->param_loader->addYamlFile(_world_config_);
    +     955             :     }
    +     956             : 
    +     957             :     try {
    +     958          98 :       ROS_INFO("[%s]: initializing the estimator '%s'", getName().c_str(), estimator->getName().c_str());
    +     959          98 :       estimator->initialize(nh_, ch_, ph);
    +     960             :     }
    +     961           0 :     catch (std::runtime_error& ex) {
    +     962           0 :       ROS_ERROR("[%s]: exception caught during estimator initialization: '%s'", getName().c_str(), ex.what());
    +     963           0 :       ros::shutdown();
    +     964             :     }
    +     965             : 
    +     966          98 :     if (!estimator->isCompatibleWithHwApi(hw_api_capabilities)) {
    +     967           0 :       ROS_ERROR("[%s]: estimator %s is not compatible with the hw api. Shutting down.", getName().c_str(), estimator->getName().c_str());
    +     968           0 :       ros::shutdown();
    +     969             :     }
    +     970             :   }
    +     971             : 
    +     972             :   // | ----------- agl height estimator initialization ---------- |
    +     973          91 :   if (is_using_agl_estimator_) {
    +     974             : 
    +     975         140 :     std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> ph = std::make_shared<mrs_uav_managers::estimation_manager::PrivateHandlers_t>();
    +     976             : 
    +     977          70 :     ph->loadConfigFile = boost::bind(&EstimationManager::loadConfigFile, this, _1);
    +     978          70 :     ph->param_loader   = std::make_shared<mrs_lib::ParamLoader>(ros::NodeHandle(nh_, est_alt_agl_->getName()), "EstimationManager/" + est_alt_agl_->getName());
    +     979             : 
    +     980          70 :     if (_custom_config_ != "") {
    +     981          70 :       ph->param_loader->addYamlFile(_custom_config_);
    +     982             :     }
    +     983             : 
    +     984          70 :     if (_platform_config_ != "") {
    +     985          70 :       ph->param_loader->addYamlFile(_platform_config_);
    +     986             :     }
    +     987             : 
    +     988          70 :     if (_world_config_ != "") {
    +     989          70 :       ph->param_loader->addYamlFile(_world_config_);
    +     990             :     }
    +     991             : 
    +     992             :     try {
    +     993          70 :       ROS_INFO("[%s]: initializing the estimator '%s'", getName().c_str(), est_alt_agl_->getName().c_str());
    +     994          70 :       est_alt_agl_->initialize(nh_, ch_, ph);
    +     995             :     }
    +     996           0 :     catch (std::runtime_error& ex) {
    +     997           0 :       ROS_ERROR("[%s]: exception caught during estimator initialization: '%s'", getName().c_str(), ex.what());
    +     998           0 :       ros::shutdown();
    +     999             :     }
    +    1000             : 
    +    1001          70 :     if (!est_alt_agl_->isCompatibleWithHwApi(hw_api_capabilities)) {
    +    1002           0 :       ROS_ERROR("[%s]: estimator %s is not compatible with the hw api. Shutting down.", getName().c_str(), est_alt_agl_->getName().c_str());
    +    1003           0 :       ros::shutdown();
    +    1004             :     }
    +    1005             :   }
    +    1006             : 
    +    1007          91 :   ROS_INFO("[%s]: estimators were initialized", getName().c_str());
    +    1008             : 
    +    1009             :   /*//}*/
    +    1010             : 
    +    1011             :   /*//{ initialize publishers */
    +    1012          91 :   ph_uav_state_    = mrs_lib::PublisherHandler<mrs_msgs::UavState>(nh_, "uav_state_out", 10);
    +    1013          91 :   ph_odom_main_    = mrs_lib::PublisherHandler<nav_msgs::Odometry>(nh_, "odom_main_out", 10);
    +    1014          91 :   ph_innovation_   = mrs_lib::PublisherHandler<nav_msgs::Odometry>(nh_, "innovation_out", 10);
    +    1015          91 :   ph_diagnostics_  = mrs_lib::PublisherHandler<mrs_msgs::EstimationDiagnostics>(nh_, "diagnostics_out", 10);
    +    1016          91 :   ph_max_flight_z_ = mrs_lib::PublisherHandler<mrs_msgs::Float64Stamped>(nh_, "max_flight_z_agl_out", 10);
    +    1017          91 :   ph_altitude_agl_ = mrs_lib::PublisherHandler<mrs_msgs::Float64Stamped>(nh_, "height_agl_out", 10);
    +    1018             : 
    +    1019             :   /*//}*/
    +    1020             : 
    +    1021             :   /*//{ initialize timers */
    +    1022          91 :   timer_publish_ = nh_.createTimer(ros::Rate(ch_->desired_uav_state_rate), &EstimationManager::timerPublish, this);
    +    1023             : 
    +    1024          91 :   timer_publish_diagnostics_ = nh_.createTimer(ros::Rate(ch_->desired_diagnostics_rate), &EstimationManager::timerPublishDiagnostics, this);
    +    1025             : 
    +    1026          91 :   timer_check_health_ = nh_.createTimer(ros::Rate(ch_->desired_uav_state_rate), &EstimationManager::timerCheckHealth, this);
    +    1027             :   /*//}*/
    +    1028             : 
    +    1029             :   /*//{ initialize service clients */
    +    1030             : 
    +    1031          91 :   srvch_failsafe_.initialize(nh_, "failsafe_out");
    +    1032             : 
    +    1033             :   /*//}*/
    +    1034             : 
    +    1035             :   /*//{ initialize service servers */
    +    1036          91 :   srvs_change_estimator_ = nh_.advertiseService("change_estimator_in", &EstimationManager::callbackChangeEstimator, this);
    +    1037          91 :   srvs_toggle_callbacks_ = nh_.advertiseService("toggle_service_callbacks_in", &EstimationManager::callbackToggleServiceCallbacks, this);
    +    1038             :   /*//}*/
    +    1039             : 
    +    1040             :   /*//{ initialize scope timer */
    +    1041          91 :   param_loader.loadParam("scope_timer/enabled", ch_->scope_timer.enabled);
    +    1042         182 :   std::string       filepath;
    +    1043         182 :   const std::string time_logger_filepath = ros::package::getPath(package_name_) + "/scope_timer/scope_timer.txt";
    +    1044          91 :   ch_->scope_timer.logger                = std::make_shared<mrs_lib::ScopeTimerLogger>(time_logger_filepath, ch_->scope_timer.enabled);
    +    1045             :   /*//}*/
    +    1046             : 
    +    1047          91 :   if (!param_loader.loadedSuccessfully()) {
    +    1048           0 :     ROS_ERROR("[%s]: Could not load all non-optional parameters. Shutting down.", getName().c_str());
    +    1049           0 :     ros::shutdown();
    +    1050             :   }
    +    1051             : 
    +    1052          91 :   sm_->changeState(StateMachine::INITIALIZED_STATE);
    +    1053             : 
    +    1054          91 :   ROS_INFO("[%s]: initialized", getName().c_str());
    +    1055          91 : }
    +    1056             : /*//}*/
    +    1057             : 
    +    1058             : // | -------------------- service callbacks ------------------- |
    +    1059             : 
    +    1060             : /*//{ callbackChangeEstimator() */
    +    1061           5 : bool EstimationManager::callbackChangeEstimator(mrs_msgs::String::Request& req, mrs_msgs::String::Response& res) {
    +    1062             : 
    +    1063           5 :   if (!sm_->isInitialized()) {
    +    1064           0 :     return false;
    +    1065             :   }
    +    1066             : 
    +    1067           5 :   if (!callbacks_enabled_) {
    +    1068           0 :     res.success = false;
    +    1069           0 :     res.message = ("Service callbacks are disabled");
    +    1070           0 :     ROS_WARN("[%s]: Ignoring service call. Callbacks are disabled.", getName().c_str());
    +    1071           0 :     return true;
    +    1072             :   }
    +    1073             : 
    +    1074           5 :   if (req.value == "dummy" || req.value == "ground_truth") {
    +    1075           0 :     res.success = false;
    +    1076           0 :     std::stringstream ss;
    +    1077           0 :     ss << "Switching to " << req.value << " estimator is not allowed.";
    +    1078           0 :     res.message = ss.str();
    +    1079           0 :     ROS_WARN("[%s]: Switching to %s estimator is not allowed.", getName().c_str(), req.value.c_str());
    +    1080           0 :     return true;
    +    1081             :   }
    +    1082             : 
    +    1083             :   // we do not want the switch to be disturbed by a service call
    +    1084           5 :   callbacks_enabled_ = false;
    +    1085             : 
    +    1086           5 :   bool                                                target_estimator_found = false;
    +    1087           5 :   boost::shared_ptr<mrs_uav_managers::StateEstimator> target_estimator;
    +    1088          12 :   for (auto estimator : estimator_list_) {
    +    1089          12 :     if (estimator->getName() == req.value) {
    +    1090           5 :       target_estimator       = estimator;
    +    1091           5 :       target_estimator_found = true;
    +    1092           5 :       break;
    +    1093             :     }
    +    1094             :   }
    +    1095             : 
    +    1096           5 :   if (target_estimator_found) {
    +    1097             : 
    +    1098           5 :     if (target_estimator->isRunning()) {
    +    1099           5 :       sm_->changeState(StateMachine::ESTIMATOR_SWITCHING_STATE);
    +    1100           5 :       switchToEstimator(target_estimator);
    +    1101           5 :       sm_->changeToPreSwitchState();
    +    1102             :     } else {
    +    1103           0 :       ROS_WARN("[%s]: Switch to not running estimator %s requested", getName().c_str(), req.value.c_str());
    +    1104           0 :       res.success = false;
    +    1105           0 :       res.message = ("Requested estimator is not running");
    +    1106           0 :       return true;
    +    1107             :     }
    +    1108             : 
    +    1109             :   } else {
    +    1110           0 :     ROS_WARN("[%s]: Switch to invalid estimator %s requested", getName().c_str(), req.value.c_str());
    +    1111           0 :     res.success = false;
    +    1112           0 :     res.message = ("Not a valid estimator type");
    +    1113           0 :     return true;
    +    1114             :   }
    +    1115             : 
    +    1116           5 :   res.success = true;
    +    1117           5 :   res.message = "Estimator switch successful";
    +    1118             : 
    +    1119             :   // allow service calllbacks after switch again
    +    1120           5 :   callbacks_enabled_ = true;
    +    1121             : 
    +    1122           5 :   return true;
    +    1123             : }
    +    1124             : /*//}*/
    +    1125             : 
    +    1126             : /* //{ callbackToggleServiceCallbacks() */
    +    1127         126 : bool EstimationManager::callbackToggleServiceCallbacks(std_srvs::SetBool::Request& req, std_srvs::SetBool::Response& res) {
    +    1128             : 
    +    1129         126 :   if (!sm_->isInitialized()) {
    +    1130           0 :     ROS_ERROR("[%s]: service for toggling callbacks is not available before initialization.", getName().c_str());
    +    1131           0 :     return false;
    +    1132             :   }
    +    1133             : 
    +    1134         126 :   callbacks_disabled_by_service_ = !req.data;
    +    1135             : 
    +    1136         126 :   res.success = true;
    +    1137         126 :   res.message = (callbacks_disabled_by_service_ ? "Service callbacks disabled" : "Service callbacks enabled");
    +    1138             : 
    +    1139         126 :   if (callbacks_disabled_by_service_) {
    +    1140             : 
    +    1141          43 :     ROS_INFO("[%s]: Service callbacks disabled.", getName().c_str());
    +    1142             : 
    +    1143             :   } else {
    +    1144             : 
    +    1145          83 :     ROS_INFO("[%s]: Service callbacks enabled", getName().c_str());
    +    1146             :   }
    +    1147             : 
    +    1148         126 :   return true;
    +    1149             : }
    +    1150             : 
    +    1151             : //}
    +    1152             : 
    +    1153             : 
    +    1154             : // --------------------------------------------------------------
    +    1155             : // |                        other methods                       |
    +    1156             : // --------------------------------------------------------------
    +    1157             : //
    +    1158             : /*//{ switchToHealthyEstimator() */
    +    1159           0 : bool EstimationManager::switchToHealthyEstimator() {
    +    1160             : 
    +    1161             :   // available estimators should be specified in decreasing priority order in config file
    +    1162           0 :   for (auto estimator : estimator_list_) {
    +    1163           0 :     if (estimator->isRunning()) {
    +    1164           0 :       switchToEstimator(estimator);
    +    1165           0 :       return true;
    +    1166             :     }
    +    1167             :   }
    +    1168           0 :   return false;  // no other estimator is running
    +    1169             : }
    +    1170             : /*//}*/
    +    1171             : 
    +    1172             : /*//{ switchToEstimator() */
    +    1173           5 : void EstimationManager::switchToEstimator(const boost::shared_ptr<mrs_uav_managers::StateEstimator>& target_estimator) {
    +    1174             : 
    +    1175           5 :   std::scoped_lock lock(mutex_active_estimator_);
    +    1176           5 :   ROS_INFO("[%s]: switching estimator from %s to %s", getName().c_str(), active_estimator_->getName().c_str(), target_estimator->getName().c_str());
    +    1177           5 :   active_estimator_ = target_estimator;
    +    1178           5 :   estimator_switch_count_++;
    +    1179           5 : }
    +    1180             : /*//}*/
    +    1181             : 
    +    1182             : /*//{ callFailsafeService() */
    +    1183           0 : bool EstimationManager::callFailsafeService() {
    +    1184           0 :   std_srvs::Trigger srv_out;
    +    1185           0 :   return srvch_failsafe_.call(srv_out);
    +    1186             : }
    +    1187             : /*//}*/
    +    1188             : 
    +    1189             : /*//{ getName() */
    +    1190        3050 : std::string EstimationManager::getName() const {
    +    1191        3050 :   return nodelet_name_;
    +    1192             : }
    +    1193             : /*//}*/
    +    1194             : 
    +    1195             : /* loadConfigFile() //{ */
    +    1196             : 
    +    1197           0 : bool EstimationManager::loadConfigFile(const std::string& file_path) {
    +    1198             : 
    +    1199           0 :   const std::string name_space = nh_.getNamespace() + "/";
    +    1200             : 
    +    1201           0 :   ROS_INFO("[%s]: loading '%s' under the namespace '%s'", getName().c_str(), file_path.c_str(), name_space.c_str());
    +    1202             : 
    +    1203             :   // load the user-requested file
    +    1204             :   {
    +    1205           0 :     std::string command = "rosparam load " + file_path + " " + name_space;
    +    1206           0 :     int         result  = std::system(command.c_str());
    +    1207             : 
    +    1208           0 :     if (result != 0) {
    +    1209           0 :       ROS_ERROR("[%s]: failed to load '%s'", getName().c_str(), file_path.c_str());
    +    1210           0 :       return false;
    +    1211             :     }
    +    1212             :   }
    +    1213             : 
    +    1214             :   // load the platform config
    +    1215           0 :   if (_platform_config_ != "") {
    +    1216           0 :     std::string command = "rosparam load " + _platform_config_ + " " + name_space;
    +    1217           0 :     int         result  = std::system(command.c_str());
    +    1218             : 
    +    1219           0 :     if (result != 0) {
    +    1220           0 :       ROS_ERROR("[%s]: failed to load the platform config file '%s'", getName().c_str(), _platform_config_.c_str());
    +    1221           0 :       return false;
    +    1222             :     }
    +    1223             :   }
    +    1224             : 
    +    1225             :   // load the custom config
    +    1226           0 :   if (_custom_config_ != "") {
    +    1227           0 :     std::string command = "rosparam load " + _custom_config_ + " " + name_space;
    +    1228           0 :     int         result  = std::system(command.c_str());
    +    1229             : 
    +    1230           0 :     if (result != 0) {
    +    1231           0 :       ROS_ERROR("[%s]: failed to load the custom config file '%s'", getName().c_str(), _custom_config_.c_str());
    +    1232           0 :       return false;
    +    1233             :     }
    +    1234             :   }
    +    1235             : 
    +    1236           0 :   return true;
    +    1237             : }
    +    1238             : 
    +    1239             : //}
    +    1240             : 
    +    1241             : }  // namespace estimation_manager
    +    1242             : 
    +    1243             : }  // namespace mrs_uav_managers
    +    1244             : 
    +    1245             : #include <pluginlib/class_list_macros.h>
    +    1246          91 : PLUGINLIB_EXPORT_CLASS(mrs_uav_managers::estimation_manager::EstimationManager, nodelet::Nodelet)
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/estimation_manager/estimation_manager.cpp.gcov.overview.html b/mrs_uav_managers/src/estimation_manager/estimation_manager.cpp.gcov.overview.html new file mode 100644 index 0000000000..4af9db1b17 --- /dev/null +++ b/mrs_uav_managers/src/estimation_manager/estimation_manager.cpp.gcov.overview.html @@ -0,0 +1,332 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/estimation_manager/estimation_manager.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_managers/src/estimation_manager/estimation_manager.cpp.gcov.png b/mrs_uav_managers/src/estimation_manager/estimation_manager.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..7c075a1435facc1fbba70d6050928450ee90fae5 GIT binary patch literal 4322 zcmV<85FPJ{P)YvK+c4e= z?SR_<+|7UnU{k{w-%TPG0Twwr)wRSF2Y8JFg7FeA4x>Vy8SrG+3NyJJO@Q{UWu6#7 zo^@U+uE>dE6j3oX#tzdsT85=@ zzqD(u?+#sS(nbOw(Dw#PC;&8Kw9~i?$IC}uv=dZyA392tt6*fzjkN)={b1ji8CL+b zV=VA*9)7cy*a%ErTLH~o8}QcBSOzuEqLY(NZljeKb8Ads1;XhO+I;+7+>2#-z_u*6 zX_-vzW&_&+L!bU}aZhFj<0FAalH%k0lf?sCX*4%XV@6sHjjr{j(e=6TT^uwn@*qbB z5Hm9b3NJiEZmehav-rmTx+m8%!%euRY|Rx@!QSq7;P~u|ytWC*wwj#HY`$ntNTp@T z>r)}U(P_GpzIe-$(q?&0~DSJ@xhm+zKEb(5^i|DGDZ~Mm&kY6667BQ8dSl zXh<;ECZlpz;JN%t0*^~}c+y(nua!{DZH>Ja{^F5Q{YPOckonVmWVYWca9P~4z~i&< zq^-dBcMVg)yK}#4WS(g)6xYGXOk6Zq??NzNX*n_*#@J5a9-#@)ZIZ4On6LhG@Uc7NIiduz@KoZsYnv;G`A>A$h?34bClxeFr(U(pTmr98Z&0#ButF$Pv6t= zvjL6PLDJ+=M88XN6>M=u=fo9#6a+Xe3S33k^;`!}(fwZz*AY0NK5j-s!#S~)UC(9b ztRjxvJQsI^H4S$qhfdseF>nUdOjC&(t|u7@5s#f|Yl<|8=SX{KSzQ3wC8KC=SWP9zZ{!di{dB8KDBA?quv zgg)7|MgZ>mj=ndZkYd)gjDU81oo~vuQuB2qTwmiEXiw<~MtoOHQ;s{5H{i$s4&{3B z2CX48ei(8<&&NnGOBhEASiubcex@f9`2&KoVchAhp>c4EcP}ZQcm#qTVkn%INPF}W z#>htr5JTIz_9%z&AMVS+Q45uoLs;ZY6== zogUe^zH7{kIiQKWI%bBvvn$Pb#*YGull)}Y!HU%4APB3EN@&HQRZ&-Ci(H@Ok!L#v z0kz#;1;RdY^Rf>?%gv?2ubQ(d`7r@5(q47i1vCw?79)s~ve+ANO;BFN$Q~LnV~mqf zm1PB>wd=#D2=2o$1{Y{|1BNk1w%$Gk80(CE`1)ov6w{3r8cU;ja-BTynk^$e&$|u) z<=|}~F#jh{(B2JJB|pIe1~65NK57)#P@z4Al!jrnyPcm&YATt7vs`B_is1%oAGT2K z5YLpP;)j<5G?X>mjORmYDk>>6+DW^_<1Wp`Kb;>iEB+m0?G6_yLl`Wl%dg=^$6718 zj(`(XE|qH&LZCgM*klXZv?VS2D(w-p2r#qmr7~NjK2^PKj>gY1bCK(OQ1K8dbv|}x zCMsrLZ%;dMepd58!oBLSYoEb)(A~Vz)X3Rjz^k)WBc04c`dn)csnMPgYUCT9b#;(ta zXU+!X6xT>m#APukMW$Dj_q>cu5RhGa%no_CU_lBENr19v9|sFuZcslmf1W)S1MAsy z{{2_^W`CajpJ#twdju`|5uW}3bLF}s9#%r~?js8!gS!$KMM{P==bD!k20XsY`|Ne~ z;SaKE@B+{J;Xx~-u9h56Rum8TKi4(Fh-Ij8jfH)&>-|+ksMCmsS!YJ(<(zoJdsNSu zt{Fg{#>b&Icmu=(E=&U{UQYs#~? zW~W>QzkF`YDoOzlU>>mV>Uv0y3Ny%&zRgZ8W}V?DLeKS@PFJTP(o;hU0mT*DY0ymHh4d6Kt6q74VNx%EIL>1JG zp%ztu8N{`h4coEvfI%i|59vfSv#<+Y_qndM?I`9Eq=n^4)JN)+L-EYo0r^ud zmw3$9V>FIA-5oR6{GN+~!U?x74z9V9t=jU_41nYBpk9BxB+xQsBu2<8=k z@f7XT*(o|&;1*WWa*MkeF7I%cW06e&HUV>@Q8kbYV8*6s>{>Vn|8id9l8D!9v16xZ ztuF-W^ZOIN9Cz>sUdKc0{gY4utZl@hbh%9~s~Z0@9!|)-fh(QDHk|J|*KmPGui?=- zi5Y@zi+&1&5hNB?m{xE%?g}E@vaXGC>~LLzJpq9PzQLD3_=M|_b6JzC2reUn2v_Om zX1jRuf!SX1;x6E-_NZz~%g0H96QMIUoDZOBjwUT&`JAJf3ZTD6Joz&GG4UuqMOK6K z`?+SWsfU+>b6=T{YAwQbO0s)TY7X8N@&Giyq&8?VI01RA*{a_5-6 zEFlGu<`ra&Bm=3yEoO`lm`*h|1|y$wu8re{3yBN|Zj2+N?wBJp`(t872!GuCt!~GfyvLm}BPY!x6+D1I6(kT@3L}k@z_G!~3#!s@<>CF*a=mL> z948dd(V0UuOxuVW;&GwtnTkDMkW6>-i)Ze(8$7sdKADIM^@EF6kMfT2!NJe)?mE&_Ut z+BOA{C7oeAv*#Mda1q7jmRDw_awzb;SSAss1U>_qMu-tla)xJw#Cz=li*~6zt?*^# z%XIw@q6%Qk0p!tVUOT0@$NMu3rde1x1C7jnhdI&B4&ed&K*OjHp;+_r=^=ESQK50A z>9k?Mc!X>TFJ^#u?xz%S5;wS|QH{TY_7#3lyhlc0yx_#4q6Ql?5Thocs+*M#T!u5^ zR*Z3C2Lb_NJPVB&W8KcZkT#q^aIZ)sZ3`g!#G-jK-Xk=T5YiH!;^0iVWDtzCF=<8IBiPyXieLme&@>aq%8>x!?6o`mky%H}5G>T@>T@?8BYfl8s=_D7&nDd4DA z1KNDyxhAiWXGwB=?|%T0yZ#`xQwP6FMK)sMg#udVjI~Y1N}wJErzdDsD}fXmGr-m~ zp7f+1%&EOcJgud*^W&6%R5WqS97~C z)1#!?$Kb#L5D;LGI@ouIB)31)Tx3 z>gQ7$rY(RcS+=*nwy+XVv)~wTQB6I}oT-3I4d8c-jGBp`EWBjrT{UL-f+|kn^%&Lk z-qJf&sl~(1jjmhLbvxgpJ?1QcR_$g1JU;3?glZ*eWzpA8Wq1^5%u<>>_X|#v_-}J! z>Qb4?5X9XFAQcyb8+E^^NSih~GR8)hVfg^aXMaow|0o&S$6frPn!CQT>xcY;%GVX{ zqTsa*c&OQ0zNfbL4FiUP{Nwb$P9p$J7YrYdEMPhj@59Eg;OeHVlzU#}x|?{GRA~ij zu;vTmabhU|`eP&OwuN1QmuJ`uK#cw~OVqRsQRrN>fiG%_1;*7y}` zkaR#BMv+F_g;F2}K(Afds3EmkDGUg3C98t~%ci13ET#TP9=XQ`$p(0PRZHBqMRd9G z{p`vW?2bNd0pJ4$^jO6;HJ8$iWzy*^i$J4ppz6AIr&!D8%u%Gc*ySKOr4uy%)3J7-c`Qn8KubLG@Izs#M;A^C&a`364R>~6(q zwz&2o~fe3Rx_eTQbhLa5^ms^ zapM)4{?a4jEqF`oe0!{xH-W3ct>mbU7w-($4(&(4=R zsp$e?b!11$}>aqvL zEl#g5P~7riQ%+51#+wUEoTxSRO3}p`4hqre2tBVoYtj>MsO_sltU&NzPj%!Q(z+^) z5#biI5HEBuXt*=gh7la8I94fnn9RohnMe#f+|}{EuKvl(aqTA4{*qMiqv=#39=B-j z%S;Inm-w&n0053?+V&|Qu3!s8IH>dN2{{xCVnCdN8A3FS-!_EcirhFMe%KJ|BM632 z9l_ENriu8CLr6yOXAGe+VpriRm|OdO;W&^4YIBU&X^a~#&{#muTW8wxAM^@duCC=v Q6aWAK07*qoM6N<$f(qFs_5c6? literal 0 HcmV?d00001 diff --git a/mrs_uav_managers/src/estimation_manager/estimator.cpp.func-sort-c.html b/mrs_uav_managers/src/estimation_manager/estimator.cpp.func-sort-c.html new file mode 100644 index 0000000000..99023f7890 --- /dev/null +++ b/mrs_uav_managers/src/estimation_manager/estimator.cpp.func-sort-c.html @@ -0,0 +1,172 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/estimation_manager/estimator.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/estimation_manager - estimator.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:628572.9 %
    Date:2024-04-18 23:11:36Functions:192382.6 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_managers::Estimator::getAccGlobal(boost::shared_ptr<sensor_msgs::Imu_<std::allocator<void> > const> const&, double)0
    mrs_uav_managers::Estimator::getHeadingRate(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const> const&)0
    mrs_uav_managers::Estimator::getType[abi:cxx11]() const0
    mrs_uav_managers::Estimator::isStopped() const0
    mrs_uav_managers::Estimator::getCurrentSmStateString[abi:cxx11]() const2115
    mrs_uav_managers::Estimator::changeState(mrs_uav_managers::estimation_manager::SMStates_t)2116
    mrs_uav_managers::Estimator::setCurrentSmState(mrs_uav_managers::estimation_manager::SMStates_t const&)2116
    mrs_uav_managers::Estimator::getPrintName[abi:cxx11]() const3149
    mrs_uav_managers::Estimator::getSmStateString[abi:cxx11](mrs_uav_managers::estimation_manager::SMStates_t const&) const4232
    mrs_uav_managers::Estimator::getMaxFlightZ() const16686
    mrs_uav_managers::Estimator::isStarted() const35362
    mrs_uav_managers::Estimator::getAccGlobal(geometry_msgs::Vector3Stamped_<std::allocator<void> > const&, double)278146
    mrs_uav_managers::Estimator::getAccGlobal(boost::shared_ptr<mrs_msgs::EstimatorInput_<std::allocator<void> > const> const&, double)278599
    mrs_uav_managers::Estimator::isReady() const336749
    mrs_uav_managers::Estimator::getName[abi:cxx11]() const585240
    mrs_uav_managers::Estimator::getFrameId[abi:cxx11]() const688305
    mrs_uav_managers::Estimator::isMitigatingJump() const703363
    mrs_uav_managers::Estimator::publishDiagnostics() const972216
    mrs_uav_managers::Estimator::isError() const1228445
    mrs_uav_managers::Estimator::isRunning() const1598962
    mrs_uav_managers::Estimator::isInitialized() const2485117
    mrs_uav_managers::Estimator::isInState(mrs_uav_managers::estimation_manager::SMStates_t const&) const7362671
    mrs_uav_managers::Estimator::getCurrentSmState() const8088676
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/estimation_manager/estimator.cpp.func.html b/mrs_uav_managers/src/estimation_manager/estimator.cpp.func.html new file mode 100644 index 0000000000..344def412e --- /dev/null +++ b/mrs_uav_managers/src/estimation_manager/estimator.cpp.func.html @@ -0,0 +1,172 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/estimation_manager/estimator.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/estimation_manager - estimator.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:628572.9 %
    Date:2024-04-18 23:11:36Functions:192382.6 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_managers::Estimator::changeState(mrs_uav_managers::estimation_manager::SMStates_t)2116
    mrs_uav_managers::Estimator::getAccGlobal(geometry_msgs::Vector3Stamped_<std::allocator<void> > const&, double)278146
    mrs_uav_managers::Estimator::getAccGlobal(boost::shared_ptr<sensor_msgs::Imu_<std::allocator<void> > const> const&, double)0
    mrs_uav_managers::Estimator::getAccGlobal(boost::shared_ptr<mrs_msgs::EstimatorInput_<std::allocator<void> > const> const&, double)278599
    mrs_uav_managers::Estimator::getHeadingRate(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const> const&)0
    mrs_uav_managers::Estimator::setCurrentSmState(mrs_uav_managers::estimation_manager::SMStates_t const&)2116
    mrs_uav_managers::Estimator::getFrameId[abi:cxx11]() const688305
    mrs_uav_managers::Estimator::getPrintName[abi:cxx11]() const3149
    mrs_uav_managers::Estimator::getMaxFlightZ() const16686
    mrs_uav_managers::Estimator::isInitialized() const2485117
    mrs_uav_managers::Estimator::getSmStateString[abi:cxx11](mrs_uav_managers::estimation_manager::SMStates_t const&) const4232
    mrs_uav_managers::Estimator::isMitigatingJump() const703363
    mrs_uav_managers::Estimator::getCurrentSmState() const8088676
    mrs_uav_managers::Estimator::publishDiagnostics() const972216
    mrs_uav_managers::Estimator::getCurrentSmStateString[abi:cxx11]() const2115
    mrs_uav_managers::Estimator::getName[abi:cxx11]() const585240
    mrs_uav_managers::Estimator::getType[abi:cxx11]() const0
    mrs_uav_managers::Estimator::isError() const1228445
    mrs_uav_managers::Estimator::isReady() const336749
    mrs_uav_managers::Estimator::isInState(mrs_uav_managers::estimation_manager::SMStates_t const&) const7362671
    mrs_uav_managers::Estimator::isRunning() const1598962
    mrs_uav_managers::Estimator::isStarted() const35362
    mrs_uav_managers::Estimator::isStopped() const0
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/estimation_manager/estimator.cpp.gcov.frameset.html b/mrs_uav_managers/src/estimation_manager/estimator.cpp.gcov.frameset.html new file mode 100644 index 0000000000..b138653798 --- /dev/null +++ b/mrs_uav_managers/src/estimation_manager/estimator.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/estimation_manager/estimator.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_managers/src/estimation_manager/estimator.cpp.gcov.html b/mrs_uav_managers/src/estimation_manager/estimator.cpp.gcov.html new file mode 100644 index 0000000000..0e8285be01 --- /dev/null +++ b/mrs_uav_managers/src/estimation_manager/estimator.cpp.gcov.html @@ -0,0 +1,295 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/estimation_manager/estimator.cpp + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/estimation_manager - estimator.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:628572.9 %
    Date:2024-04-18 23:11:36Functions:192382.6 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #include <mrs_uav_managers/estimation_manager/estimator.h>
    +       2             : 
    +       3             : namespace mrs_uav_managers
    +       4             : {
    +       5             : 
    +       6             : /*//{ method implementations */
    +       7             : /*//{ changeState() */
    +       8        2116 : bool Estimator::changeState(SMStates_t new_state) {
    +       9             : 
    +      10        2116 :   if (new_state == getCurrentSmState()) {
    +      11           0 :     return true;
    +      12             :   }
    +      13             : 
    +      14        2116 :   previous_sm_state_ = getCurrentSmState();
    +      15        2116 :   setCurrentSmState(new_state);
    +      16             : 
    +      17        2116 :   ROS_INFO("[%s]: Switching sm state %s -> %s", getPrintName().c_str(), getSmStateString(previous_sm_state_).c_str(), getCurrentSmStateString().c_str());
    +      18        2116 :   return true;
    +      19             : }
    +      20             : /*//}*/
    +      21             : 
    +      22             : /*//{ isInState() */
    +      23     7362671 : bool Estimator::isInState(const SMStates_t& state_in) const {
    +      24     7362671 :   return state_in == getCurrentSmState();
    +      25             : }
    +      26             : /*//}*/
    +      27             : 
    +      28             : /*//{ isInitialized() */
    +      29     2485117 : bool Estimator::isInitialized() const {
    +      30     2485117 :   return !isInState(UNINITIALIZED_STATE);
    +      31             : }
    +      32             : /*//}*/
    +      33             : 
    +      34             : /*//{ isReady() */
    +      35      336749 : bool Estimator::isReady() const {
    +      36      336749 :   return isInState(READY_STATE);
    +      37             : }
    +      38             : /*//}*/
    +      39             : 
    +      40             : /*//{ isStarted() */
    +      41       35362 : bool Estimator::isStarted() const {
    +      42       35362 :   return isInState(STARTED_STATE);
    +      43             : }
    +      44             : /*//}*/
    +      45             : 
    +      46             : /*//{ isRunning() */
    +      47     1598962 : bool Estimator::isRunning() const {
    +      48     1598962 :   return isInState(SMStates_t::RUNNING_STATE);
    +      49             : }
    +      50             : /*//}*/
    +      51             : 
    +      52             : /*//{ isStopped() */
    +      53           0 : bool Estimator::isStopped() const {
    +      54           0 :   return isInState(STOPPED_STATE);
    +      55             : }
    +      56             : /*//}*/
    +      57             : 
    +      58             : /*//{ isError() */
    +      59     1228445 : bool Estimator::isError() const {
    +      60     1228445 :   return isInState(ERROR_STATE);
    +      61             : }
    +      62             : /*//}*/
    +      63             : 
    +      64             : /*//{ getCurrentSmState() */
    +      65     8088676 : SMStates_t Estimator::getCurrentSmState() const {
    +      66     8088676 :   return current_sm_state_;
    +      67             : }
    +      68             : /*//}*/
    +      69             : 
    +      70             : /*//{ setCurrentSmState() */
    +      71        2116 : void Estimator::setCurrentSmState(const SMStates_t& new_state) {
    +      72        2116 :   std::scoped_lock lock(mutex_current_state_);
    +      73        2116 :   current_sm_state_ = new_state;
    +      74        2116 : }
    +      75             : /*//}*/
    +      76             : 
    +      77             : /*//{ getSmStateString() */
    +      78        4232 : std::string Estimator::getSmStateString(const SMStates_t& state) const {
    +      79        4232 :   return sm::state_names[state];
    +      80             : }
    +      81             : /*//}*/
    +      82             : 
    +      83             : /*//{ getCurrentSmStateName() */
    +      84        2115 : std::string Estimator::getCurrentSmStateString(void) const {
    +      85        4231 :   return getSmStateString(getCurrentSmState());
    +      86             : }
    +      87             : /*//}*/
    +      88             : 
    +      89             : /*//{ isMitigatingJump() */
    +      90      703363 : bool Estimator::isMitigatingJump(void) {
    +      91      703363 :   if (is_mitigating_jump_) {
    +      92             :     is_mitigating_jump_ = false;
    +      93             :     return true;
    +      94             :   } else {
    +      95             :     return false;
    +      96      585240 :   }
    +      97      585240 : }
    +      98             : /*//}*/
    +      99             : 
    +     100             : /*//{ getName() */
    +     101             : std::string Estimator::getName(void) const {
    +     102        3149 :   return name_;
    +     103        6298 : }
    +     104             : /*//}*/
    +     105             : 
    +     106             : /*//{ getPrintName() */
    +     107             : std::string Estimator::getPrintName(void) const {
    +     108           0 :   return ch_->nodelet_name + "/" + name_;
    +     109           0 : }
    +     110             : /*//}*/
    +     111             : 
    +     112             : /*//{ getType() */
    +     113             : std::string Estimator::getType(void) const {
    +     114      688305 :   return type_;
    +     115      688305 : }
    +     116             : /*//}*/
    +     117             : 
    +     118             : /*//{ getFrameId() */
    +     119             : std::string Estimator::getFrameId(void) const {
    +     120       16686 :   return ns_frame_id_;
    +     121       16686 : }
    +     122             : /*//}*/
    +     123             : 
    +     124             : /*//{ getMaxFlightZ() */
    +     125             : double Estimator::getMaxFlightZ(void) const {
    +     126      972216 :   return max_flight_z_;
    +     127             : }
    +     128      972216 : /*//}*/
    +     129      972158 : 
    +     130             : /*//{ publishDiagnostics() */
    +     131             : void Estimator::publishDiagnostics() const {
    +     132           3 : 
    +     133           0 :   if (!ch_->debug_topics.diag) {
    +     134           0 :     return;
    +     135           0 :   }
    +     136           0 : 
    +     137           0 :   mrs_msgs::EstimatorDiagnostics msg;
    +     138             :   msg.header.stamp       = ros::Time::now();
    +     139           0 :   msg.header.frame_id    = getFrameId();
    +     140             :   msg.estimator_name     = getName();
    +     141             :   msg.estimator_type     = getType();
    +     142             :   msg.estimator_sm_state = getCurrentSmStateString();
    +     143             : 
    +     144           0 :   ph_diagnostics_.publish(msg);
    +     145             : }
    +     146           0 : /*//}*/
    +     147           0 : 
    +     148           0 : /*//{ getAccGlobal() */
    +     149           0 : tf2::Vector3 Estimator::getAccGlobal(const sensor_msgs::Imu::ConstPtr& input_msg, const double hdg) {
    +     150             : 
    +     151             :   geometry_msgs::Vector3Stamped acc_stamped;
    +     152      278599 :   acc_stamped.vector = input_msg->linear_acceleration;
    +     153             :   acc_stamped.header = input_msg->header;
    +     154      556445 :   return getAccGlobal(acc_stamped, hdg);
    +     155      278109 : }
    +     156      278163 : 
    +     157      552191 : tf2::Vector3 Estimator::getAccGlobal(const mrs_msgs::EstimatorInput::ConstPtr& input_msg, const double hdg) {
    +     158             : 
    +     159             :   geometry_msgs::Vector3Stamped acc_stamped;
    +     160      278146 :   acc_stamped.vector = input_msg->control_acceleration;
    +     161             :   acc_stamped.header = input_msg->header;
    +     162             :   return getAccGlobal(acc_stamped, hdg);
    +     163      553597 : }
    +     164      277988 : 
    +     165      278114 : tf2::Vector3 Estimator::getAccGlobal(const geometry_msgs::Vector3Stamped& acc_stamped, const double hdg) {
    +     166      278114 : 
    +     167      278114 :   // untilt the desired acceleration vector
    +     168      278114 :   geometry_msgs::Vector3Stamped des_acc;
    +     169      278206 :   geometry_msgs::Vector3        des_acc_untilted;
    +     170      556429 :   des_acc.vector.x        = acc_stamped.vector.x;
    +     171      278647 :   des_acc.vector.y        = acc_stamped.vector.y;
    +     172      278647 :   des_acc.vector.z        = acc_stamped.vector.z;
    +     173      278647 :   des_acc.header.frame_id = ch_->frames.ns_fcu;
    +     174      278646 :   des_acc.header.stamp    = acc_stamped.header.stamp;
    +     175             :   auto response_acc       = ch_->transformer->transformSingle(des_acc, ch_->frames.ns_fcu_untilted);
    +     176           0 :   if (response_acc) {
    +     177             :     des_acc_untilted.x = response_acc.value().vector.x;
    +     178             :     des_acc_untilted.y = response_acc.value().vector.y;
    +     179             :     des_acc_untilted.z = response_acc.value().vector.z;
    +     180             :   } else {
    +     181      278644 :     ROS_WARN_THROTTLE(1.0, "[%s]: Transform from %s to %s failed", getPrintName().c_str(), des_acc.header.frame_id.c_str(),
    +     182             :                       ch_->frames.ns_fcu_untilted.c_str());
    +     183      552030 :   }
    +     184             : 
    +     185             :   // rotate the desired acceleration vector to global frame
    +     186             :   const tf2::Vector3 des_acc_global = Support::rotateVecByHdg(des_acc_untilted, hdg);
    +     187             : 
    +     188           0 :   return des_acc_global;
    +     189             : }
    +     190             : /*//}*/
    +     191             : 
    +     192           0 : /*//{ getHeadingRate() */
    +     193             : std::optional<double> Estimator::getHeadingRate(const nav_msgs::OdometryConstPtr& odom_msg) {
    +     194           0 : 
    +     195           0 :   double hdg_rate;
    +     196           0 :   try {
    +     197             :     hdg_rate = mrs_lib::AttitudeConverter(odom_msg->pose.pose.orientation).getHeadingRate(odom_msg->twist.twist.angular);
    +     198           0 :   }
    +     199             :   catch (...) {
    +     200             :     ROS_ERROR_THROTTLE(1.0, "[%s]: failed getting heading rate", getPrintName().c_str());
    +     201             :     return {};
    +     202             :   }
    +     203             :   return hdg_rate;
    +     204             : }
    +     205             : /*//}*/
    +     206             : 
    +     207             : 
    +     208             : /*//}*/
    +     209             : 
    +     210             : }  // namespace mrs_uav_managers
    +     211             : 
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/estimation_manager/estimator.cpp.gcov.overview.html b/mrs_uav_managers/src/estimation_manager/estimator.cpp.gcov.overview.html new file mode 100644 index 0000000000..c6ae1bd90d --- /dev/null +++ b/mrs_uav_managers/src/estimation_manager/estimator.cpp.gcov.overview.html @@ -0,0 +1,73 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/estimation_manager/estimator.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_managers/src/estimation_manager/estimator.cpp.gcov.png b/mrs_uav_managers/src/estimation_manager/estimator.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..38e689fa664cc34ed637652aea57a82c5aa02bdb GIT binary patch literal 869 zcmV-r1DgDaP)#^$_#@epB{)*ZwYoG{l85Z4k0qO!*Dl?Q5pzb| zjlD)ge@cCO=pNAN_yN)kdx7ILjZ-2118WB)W>AV5f&!qpRQ3kW^R{ivw#|Z=d6ggm zsFop<1+yf{Afb31HcwEMj5NA;3rBHp9=LxiYh))?0$n)hZKRPHW>S=uVP>HTV0c8< zID8(;TI5}`CNm+kmSXJztVLHN)+}X;HB07x)(0cJLA&<#-(<~j{|eT=Y(-i37gL~2 zsBl@h%B8Gu^M77n%UbrgXHY~g#U8V6F#8hLRkDJbJ&lMpVWOH$0$O`fP_)eqfTzsU zXs$z0*r||gp)r`~>r$Z^7BuS#@C|ch7W<0hQ&| z?@~5eK@B|0`mg$0a5d#?($#Qjem-l--LL9sk0uRSH|P2R)=Gs=BPgvSuiVtHvr;QXiu%|HXtep?)Y_ vqxN)Ef2G3fe=~5`(0$i~7UAS?Euj1W8JE~m?y<{X00000NkvXXu0mjf@YRp( literal 0 HcmV?d00001 diff --git a/mrs_uav_managers/src/estimation_manager/estimators/agl_estimator.cpp.func-sort-c.html b/mrs_uav_managers/src/estimation_manager/estimators/agl_estimator.cpp.func-sort-c.html new file mode 100644 index 0000000000..fd8c637bc0 --- /dev/null +++ b/mrs_uav_managers/src/estimation_manager/estimators/agl_estimator.cpp.func-sort-c.html @@ -0,0 +1,92 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/estimation_manager/estimators/agl_estimator.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/estimation_manager/estimators - agl_estimator.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:305158.8 %
    Date:2024-04-18 23:11:36Functions:33100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_managers::AglEstimator::isCompatibleWithHwApi(boost::shared_ptr<mrs_msgs::HwApiCapabilities_<std::allocator<void> > const> const&) const70
    mrs_uav_managers::AglEstimator::publishAglHeight() const132616
    mrs_uav_managers::AglEstimator::publishCovariance() const132616
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/estimation_manager/estimators/agl_estimator.cpp.func.html b/mrs_uav_managers/src/estimation_manager/estimators/agl_estimator.cpp.func.html new file mode 100644 index 0000000000..615a81c8f1 --- /dev/null +++ b/mrs_uav_managers/src/estimation_manager/estimators/agl_estimator.cpp.func.html @@ -0,0 +1,92 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/estimation_manager/estimators/agl_estimator.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/estimation_manager/estimators - agl_estimator.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:305158.8 %
    Date:2024-04-18 23:11:36Functions:33100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_managers::AglEstimator::publishAglHeight() const132616
    mrs_uav_managers::AglEstimator::publishCovariance() const132616
    mrs_uav_managers::AglEstimator::isCompatibleWithHwApi(boost::shared_ptr<mrs_msgs::HwApiCapabilities_<std::allocator<void> > const> const&) const70
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/estimation_manager/estimators/agl_estimator.cpp.gcov.frameset.html b/mrs_uav_managers/src/estimation_manager/estimators/agl_estimator.cpp.gcov.frameset.html new file mode 100644 index 0000000000..66ffffc405 --- /dev/null +++ b/mrs_uav_managers/src/estimation_manager/estimators/agl_estimator.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/estimation_manager/estimators/agl_estimator.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_managers/src/estimation_manager/estimators/agl_estimator.cpp.gcov.html b/mrs_uav_managers/src/estimation_manager/estimators/agl_estimator.cpp.gcov.html new file mode 100644 index 0000000000..f1d67a27b8 --- /dev/null +++ b/mrs_uav_managers/src/estimation_manager/estimators/agl_estimator.cpp.gcov.html @@ -0,0 +1,182 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/estimation_manager/estimators/agl_estimator.cpp + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/estimation_manager/estimators - agl_estimator.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:305158.8 %
    Date:2024-04-18 23:11:36Functions:33100.0 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #include <mrs_uav_managers/agl_estimator.h>
    +       2             : 
    +       3             : namespace mrs_uav_managers
    +       4             : {
    +       5             : 
    +       6             : /*//{ publishAglHeight() */
    +       7      132616 : void AglEstimator::publishAglHeight() const {
    +       8      132616 :   ph_agl_height_.publish(mrs_lib::get_mutexed(mtx_agl_height_, agl_height_));
    +       9      132616 : }
    +      10             : /*//}*/
    +      11             : 
    +      12             : /*//{ publishCovariance() */
    +      13      132616 : void AglEstimator::publishCovariance() const {
    +      14             : 
    +      15      132616 :   if (!ch_->debug_topics.covariance) {
    +      16      132616 :     return;
    +      17             :   }
    +      18             : 
    +      19           0 :   ph_agl_height_cov_.publish(mrs_lib::get_mutexed(mtx_agl_height_, agl_height_cov_));
    +      20             : }
    +      21             : /*//}*/
    +      22             : 
    +      23             : /*//{ isCompatibleWithHwApi() */
    +      24          70 : bool AglEstimator::isCompatibleWithHwApi(const mrs_msgs::HwApiCapabilitiesConstPtr& hw_api_capabilities) const {
    +      25             : 
    +      26          70 :   ph_->param_loader->addYamlFile(ros::package::getPath(package_name_) + "/config/private/" + getName() + "/" + getName() + ".yaml");
    +      27          70 :   ph_->param_loader->addYamlFile(ros::package::getPath(package_name_) + "/config/public/" + getName() + "/" + getName() + ".yaml");
    +      28             : 
    +      29          70 :   ph_->param_loader->setPrefix(ch_->package_name + "/" + Support::toSnakeCase(ch_->nodelet_name) + "/" + getName() + "/");
    +      30             : 
    +      31             :   bool requires_gnss, requires_imu, requires_distance_sensor, requires_altitude, requires_magnetometer_heading, requires_position, requires_orientation,
    +      32             :       requires_velocity, requires_angular_velocity;
    +      33             : 
    +      34          70 :   ph_->param_loader->loadParam("requires/gnss", requires_gnss);
    +      35          70 :   ph_->param_loader->loadParam("requires/imu", requires_imu);
    +      36          70 :   ph_->param_loader->loadParam("requires/distance_sensor", requires_distance_sensor);
    +      37          70 :   ph_->param_loader->loadParam("requires/altitude", requires_altitude);
    +      38          70 :   ph_->param_loader->loadParam("requires/magnetometer_heading", requires_magnetometer_heading);
    +      39          70 :   ph_->param_loader->loadParam("requires/position", requires_position);
    +      40          70 :   ph_->param_loader->loadParam("requires/orientation", requires_orientation);
    +      41          70 :   ph_->param_loader->loadParam("requires/velocity", requires_velocity);
    +      42          70 :   ph_->param_loader->loadParam("requires/angular_velocity", requires_angular_velocity);
    +      43             : 
    +      44          70 :   if (!ph_->param_loader->loadedSuccessfully()) {
    +      45           0 :     ROS_ERROR("[%s]: Could not load all non-optional parameters. Shutting down.", getPrintName().c_str());
    +      46           0 :     ros::shutdown();
    +      47             :   }
    +      48             : 
    +      49          70 :   if (requires_gnss && !hw_api_capabilities->produces_gnss) {
    +      50           0 :     ROS_ERROR("[%s]: requires gnss but hw api does not provide it.", getPrintName().c_str());
    +      51           0 :     return false;
    +      52             :   }
    +      53             : 
    +      54          70 :   if (requires_imu && !hw_api_capabilities->produces_imu) {
    +      55           0 :     ROS_ERROR("[%s]: requires imu but hw api does not provide it.", getPrintName().c_str());
    +      56           0 :     return false;
    +      57             :   }
    +      58             : 
    +      59          70 :   if (requires_distance_sensor && !hw_api_capabilities->produces_distance_sensor) {
    +      60           0 :     ROS_ERROR("[%s]: requires distance_sensor but hw api does not provide it.", getPrintName().c_str());
    +      61           0 :     return false;
    +      62             :   }
    +      63             : 
    +      64          70 :   if (requires_altitude && !hw_api_capabilities->produces_altitude) {
    +      65           0 :     ROS_ERROR("[%s]: requires altitude but hw api does not provide it.", getPrintName().c_str());
    +      66           0 :     return false;
    +      67             :   }
    +      68             : 
    +      69          70 :   if (requires_magnetometer_heading && !hw_api_capabilities->produces_magnetometer_heading) {
    +      70           0 :     ROS_ERROR("[%s]: requires magnetometer_heading but hw api does not provide it.", getPrintName().c_str());
    +      71           0 :     return false;
    +      72             :   }
    +      73             : 
    +      74          70 :   if (requires_position && !hw_api_capabilities->produces_position) {
    +      75           0 :     ROS_ERROR("[%s]: requires position but hw api does not provide it.", getPrintName().c_str());
    +      76           0 :     return false;
    +      77             :   }
    +      78             : 
    +      79          70 :   if (requires_orientation && !hw_api_capabilities->produces_orientation) {
    +      80           0 :     ROS_ERROR("[%s]: requires orientation but hw api does not provide it.", getPrintName().c_str());
    +      81           0 :     return false;
    +      82             :   }
    +      83             : 
    +      84          70 :   if (requires_velocity && !hw_api_capabilities->produces_velocity) {
    +      85           0 :     ROS_ERROR("[%s]: requires velocity but hw api does not provide it.", getPrintName().c_str());
    +      86           0 :     return false;
    +      87             :   }
    +      88             : 
    +      89          70 :   if (requires_angular_velocity && !hw_api_capabilities->produces_angular_velocity) {
    +      90           0 :     ROS_ERROR("[%s]: requires angular_velocity but hw api does not provide it.", getPrintName().c_str());
    +      91           0 :     return false;
    +      92             :   }
    +      93             : 
    +      94          70 :   return true;
    +      95             : }
    +      96             : /*//}*/
    +      97             : 
    +      98             : }  // namespace mrs_uav_managers
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/estimation_manager/estimators/agl_estimator.cpp.gcov.overview.html b/mrs_uav_managers/src/estimation_manager/estimators/agl_estimator.cpp.gcov.overview.html new file mode 100644 index 0000000000..0cae5e00e5 --- /dev/null +++ b/mrs_uav_managers/src/estimation_manager/estimators/agl_estimator.cpp.gcov.overview.html @@ -0,0 +1,45 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/estimation_manager/estimators/agl_estimator.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_managers/src/estimation_manager/estimators/agl_estimator.cpp.gcov.png b/mrs_uav_managers/src/estimation_manager/estimators/agl_estimator.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..8e2a94c7d8572c5b8eb0b9ee2d0f2e729546678b GIT binary patch literal 454 zcmV;%0XhDOP)4mx~dDAPk1%2Dk!j5LciZ=>Dq|R1i&o_~?~0cw)UY@bQP7K<}*U52oOT%>hEB zlH;vWGDF9K`>qsz7|gIYbQkKQfgXysMnMhqzr4ZhE^)j>tx79Ssr?JXP)lJniAbZZ z5oO$A5H3CyY$|*yU8i9G4GMOFYd01t*BG3rT%aqCP wnEak0K>vlAKS%1H3gT1T^G5*HDbdOK3oNIBVw!Iu5C8xG07*qoM6N<$g5h<@b^rhX literal 0 HcmV?d00001 diff --git a/mrs_uav_managers/src/estimation_manager/estimators/index-detail-sort-f.html b/mrs_uav_managers/src/estimation_manager/estimators/index-detail-sort-f.html new file mode 100644 index 0000000000..c57bb63478 --- /dev/null +++ b/mrs_uav_managers/src/estimation_manager/estimators/index-detail-sort-f.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/estimation_manager/estimators + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/estimation_manager/estimatorsHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:8213560.7 %
    Date:2024-04-18 23:11:36Functions:1313100.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    agl_estimator.cpp +
    58.8%58.8%
    +
    58.8 %30 / 51100.0 %3 / 3
    <unnamed>58.8 %30 / 51100.0 %3 / 3
    state_estimator.cpp +
    61.9%61.9%
    +
    61.9 %52 / 84100.0 %10 / 10
    <unnamed>61.9 %52 / 84100.0 %10 / 10
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/estimation_manager/estimators/index-detail-sort-l.html b/mrs_uav_managers/src/estimation_manager/estimators/index-detail-sort-l.html new file mode 100644 index 0000000000..ee67cb5eda --- /dev/null +++ b/mrs_uav_managers/src/estimation_manager/estimators/index-detail-sort-l.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/estimation_manager/estimators + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/estimation_manager/estimatorsHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:8213560.7 %
    Date:2024-04-18 23:11:36Functions:1313100.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    agl_estimator.cpp +
    58.8%58.8%
    +
    58.8 %30 / 51100.0 %3 / 3
    <unnamed>58.8 %30 / 51100.0 %3 / 3
    state_estimator.cpp +
    61.9%61.9%
    +
    61.9 %52 / 84100.0 %10 / 10
    <unnamed>61.9 %52 / 84100.0 %10 / 10
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/estimation_manager/estimators/index-detail.html b/mrs_uav_managers/src/estimation_manager/estimators/index-detail.html new file mode 100644 index 0000000000..63db1188c4 --- /dev/null +++ b/mrs_uav_managers/src/estimation_manager/estimators/index-detail.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/estimation_manager/estimators + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/estimation_manager/estimatorsHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:8213560.7 %
    Date:2024-04-18 23:11:36Functions:1313100.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    agl_estimator.cpp +
    58.8%58.8%
    +
    58.8 %30 / 51100.0 %3 / 3
    <unnamed>58.8 %30 / 51100.0 %3 / 3
    state_estimator.cpp +
    61.9%61.9%
    +
    61.9 %52 / 84100.0 %10 / 10
    <unnamed>61.9 %52 / 84100.0 %10 / 10
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/estimation_manager/estimators/index-sort-f.html b/mrs_uav_managers/src/estimation_manager/estimators/index-sort-f.html new file mode 100644 index 0000000000..2fc5c4818e --- /dev/null +++ b/mrs_uav_managers/src/estimation_manager/estimators/index-sort-f.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/estimation_manager/estimators + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/estimation_manager/estimatorsHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:8213560.7 %
    Date:2024-04-18 23:11:36Functions:1313100.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    agl_estimator.cpp +
    58.8%58.8%
    +
    58.8 %30 / 51100.0 %3 / 3
    state_estimator.cpp +
    61.9%61.9%
    +
    61.9 %52 / 84100.0 %10 / 10
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/estimation_manager/estimators/index-sort-l.html b/mrs_uav_managers/src/estimation_manager/estimators/index-sort-l.html new file mode 100644 index 0000000000..7b60574a8d --- /dev/null +++ b/mrs_uav_managers/src/estimation_manager/estimators/index-sort-l.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/estimation_manager/estimators + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/estimation_manager/estimatorsHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:8213560.7 %
    Date:2024-04-18 23:11:36Functions:1313100.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    agl_estimator.cpp +
    58.8%58.8%
    +
    58.8 %30 / 51100.0 %3 / 3
    state_estimator.cpp +
    61.9%61.9%
    +
    61.9 %52 / 84100.0 %10 / 10
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/estimation_manager/estimators/index.html b/mrs_uav_managers/src/estimation_manager/estimators/index.html new file mode 100644 index 0000000000..c866ac9cd0 --- /dev/null +++ b/mrs_uav_managers/src/estimation_manager/estimators/index.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/estimation_manager/estimators + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/estimation_manager/estimatorsHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:8213560.7 %
    Date:2024-04-18 23:11:36Functions:1313100.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    agl_estimator.cpp +
    58.8%58.8%
    +
    58.8 %30 / 51100.0 %3 / 3
    state_estimator.cpp +
    61.9%61.9%
    +
    61.9 %52 / 84100.0 %10 / 10
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/estimation_manager/estimators/state_estimator.cpp.func-sort-c.html b/mrs_uav_managers/src/estimation_manager/estimators/state_estimator.cpp.func-sort-c.html new file mode 100644 index 0000000000..4930e109bb --- /dev/null +++ b/mrs_uav_managers/src/estimation_manager/estimators/state_estimator.cpp.func-sort-c.html @@ -0,0 +1,120 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/estimation_manager/estimators/state_estimator.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/estimation_manager/estimators - state_estimator.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:528461.9 %
    Date:2024-04-18 23:11:36Functions:1010100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_managers::StateEstimator::isCompatibleWithHwApi(boost::shared_ptr<mrs_msgs::HwApiCapabilities_<std::allocator<void> > const> const&) const98
    mrs_uav_managers::StateEstimator::getInnovation() const155257
    mrs_uav_managers::StateEstimator::getPoseCovariance() const155257
    mrs_uav_managers::StateEstimator::getTwistCovariance() const155257
    mrs_uav_managers::StateEstimator::getUavState()171578
    mrs_uav_managers::StateEstimator::publishUavState() const183921
    mrs_uav_managers::StateEstimator::publishOdom() const183947
    mrs_uav_managers::StateEstimator::publishCovariance() const183948
    mrs_uav_managers::StateEstimator::publishInnovation() const183948
    mrs_uav_managers::StateEstimator::rotateQuaternionByHeading(geometry_msgs::Quaternion_<std::allocator<void> > const&, double) const372828
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/estimation_manager/estimators/state_estimator.cpp.func.html b/mrs_uav_managers/src/estimation_manager/estimators/state_estimator.cpp.func.html new file mode 100644 index 0000000000..257355aa64 --- /dev/null +++ b/mrs_uav_managers/src/estimation_manager/estimators/state_estimator.cpp.func.html @@ -0,0 +1,120 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/estimation_manager/estimators/state_estimator.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/estimation_manager/estimators - state_estimator.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:528461.9 %
    Date:2024-04-18 23:11:36Functions:1010100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_managers::StateEstimator::getUavState()171578
    mrs_uav_managers::StateEstimator::publishOdom() const183947
    mrs_uav_managers::StateEstimator::getInnovation() const155257
    mrs_uav_managers::StateEstimator::publishUavState() const183921
    mrs_uav_managers::StateEstimator::getPoseCovariance() const155257
    mrs_uav_managers::StateEstimator::publishCovariance() const183948
    mrs_uav_managers::StateEstimator::publishInnovation() const183948
    mrs_uav_managers::StateEstimator::getTwistCovariance() const155257
    mrs_uav_managers::StateEstimator::isCompatibleWithHwApi(boost::shared_ptr<mrs_msgs::HwApiCapabilities_<std::allocator<void> > const> const&) const98
    mrs_uav_managers::StateEstimator::rotateQuaternionByHeading(geometry_msgs::Quaternion_<std::allocator<void> > const&, double) const372828
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/estimation_manager/estimators/state_estimator.cpp.gcov.frameset.html b/mrs_uav_managers/src/estimation_manager/estimators/state_estimator.cpp.gcov.frameset.html new file mode 100644 index 0000000000..67d1a1c693 --- /dev/null +++ b/mrs_uav_managers/src/estimation_manager/estimators/state_estimator.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/estimation_manager/estimators/state_estimator.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_managers/src/estimation_manager/estimators/state_estimator.cpp.gcov.html b/mrs_uav_managers/src/estimation_manager/estimators/state_estimator.cpp.gcov.html new file mode 100644 index 0000000000..a9d6ab9f65 --- /dev/null +++ b/mrs_uav_managers/src/estimation_manager/estimators/state_estimator.cpp.gcov.html @@ -0,0 +1,263 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/estimation_manager/estimators/state_estimator.cpp + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/estimation_manager/estimators - state_estimator.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:528461.9 %
    Date:2024-04-18 23:11:36Functions:1010100.0 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #include <mrs_uav_managers/state_estimator.h>
    +       2             : 
    +       3             : namespace mrs_uav_managers
    +       4             : {
    +       5             : 
    +       6             : 
    +       7             : /*//{ getUavState() */
    +       8      171578 : std::optional<mrs_msgs::UavState> StateEstimator::getUavState() {
    +       9             : 
    +      10      171578 :   if (!isRunning()) {
    +      11           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: getUavState() was called while estimator is not running", getPrintName().c_str());
    +      12           0 :     return {};
    +      13             :   }
    +      14             : 
    +      15      343145 :   return mrs_lib::get_mutexed(mtx_uav_state_, uav_state_);
    +      16             : }
    +      17             : /*//}*/
    +      18             : 
    +      19             : /*//{ getInnovation() */
    +      20      155257 : nav_msgs::Odometry StateEstimator::getInnovation() const {
    +      21      155257 :   return mrs_lib::get_mutexed(mtx_innovation_, innovation_);
    +      22             : }
    +      23             : /*//}*/
    +      24             : 
    +      25             : /*//{ getPoseCovariance() */
    +      26      155257 : std::vector<double> StateEstimator::getPoseCovariance() const {
    +      27      155257 :   return mrs_lib::get_mutexed(mtx_covariance_, pose_covariance_.values);
    +      28             : }
    +      29             : /*//}*/
    +      30             : 
    +      31             : /*//{ getTwistCovariance() */
    +      32      155257 : std::vector<double> StateEstimator::getTwistCovariance() const {
    +      33      155257 :   return mrs_lib::get_mutexed(mtx_covariance_, twist_covariance_.values);
    +      34             : }
    +      35             : /*//}*/
    +      36             : 
    +      37             : /*//{ publishUavState() */
    +      38      183921 : void StateEstimator::publishUavState() const {
    +      39             : 
    +      40      183921 :   if (!ch_->debug_topics.state) {
    +      41           0 :     return;
    +      42             :   }
    +      43             : 
    +      44      367346 :   auto uav_state = mrs_lib::get_mutexed(mtx_uav_state_, uav_state_);
    +      45      183649 :   ph_uav_state_.publish(uav_state);
    +      46             : }
    +      47             : /*//}*/
    +      48             : 
    +      49             : /*//{ publishOdom() */
    +      50      183947 : void StateEstimator::publishOdom() const {
    +      51             : 
    +      52      367895 :   auto odom = mrs_lib::get_mutexed(mtx_odom_, odom_);
    +      53      183946 :   ph_odom_.publish(odom);
    +      54      183948 : }
    +      55             : /*//}*/
    +      56             : 
    +      57             : /*//{ publishCovariance() */
    +      58      183948 : void StateEstimator::publishCovariance() const {
    +      59             : 
    +      60      183948 :   if (!ch_->debug_topics.covariance) {
    +      61      183948 :     return;
    +      62             :   }
    +      63             : 
    +      64           0 :   auto pose_cov  = mrs_lib::get_mutexed(mtx_covariance_, pose_covariance_);
    +      65           0 :   auto twist_cov = mrs_lib::get_mutexed(mtx_covariance_, twist_covariance_);
    +      66           0 :   ph_pose_covariance_.publish(pose_cov);
    +      67           0 :   ph_twist_covariance_.publish(twist_cov);
    +      68             : }
    +      69             : /*//}*/
    +      70             : 
    +      71             : /*//{ publishInnovation() */
    +      72      183948 : void StateEstimator::publishInnovation() const {
    +      73             : 
    +      74      183948 :   if (!ch_->debug_topics.innovation) {
    +      75      183948 :     return;
    +      76             :   }
    +      77             : 
    +      78           0 :   auto innovation = mrs_lib::get_mutexed(mtx_innovation_, innovation_);
    +      79           0 :   ph_innovation_.publish(innovation);
    +      80             : }
    +      81             : /*//}*/
    +      82             : 
    +      83             : /*//{ rotateQuaternionByHeading() */
    +      84      372828 : std::optional<geometry_msgs::Quaternion> StateEstimator::rotateQuaternionByHeading(const geometry_msgs::Quaternion& q, const double hdg) const {
    +      85             : 
    +      86             :   try {
    +      87      372828 :     tf2::Quaternion tf2_q = mrs_lib::AttitudeConverter(q);
    +      88             : 
    +      89             :     // Obtain heading from quaternion
    +      90      372353 :     double q_hdg = 0;
    +      91      372353 :     q_hdg        = mrs_lib::AttitudeConverter(q).getHeading();
    +      92             : 
    +      93             :     // Build rotation matrix from difference between new heading and quaternion heading
    +      94      371584 :     tf2::Matrix3x3 rot_mat = mrs_lib::AttitudeConverter(Eigen::AngleAxisd(hdg - q_hdg, Eigen::Vector3d::UnitZ()));
    +      95             : 
    +      96             :     // Transform the quaternion orientation by the rotation matrix
    +      97      371266 :     geometry_msgs::Quaternion q_new = mrs_lib::AttitudeConverter(tf2::Transform(rot_mat) * tf2_q);
    +      98      370795 :     return q_new;
    +      99             :   }
    +     100           0 :   catch (...) {
    +     101           0 :     ROS_WARN("[rotateQuaternionByHeading()]: failed to rotate quaternion by heading");
    +     102           0 :     return {};
    +     103             :   }
    +     104             : }
    +     105             : /*//}*/
    +     106             : 
    +     107             : /*//{ isCompatibleWithHwApi() */
    +     108          98 : bool StateEstimator::isCompatibleWithHwApi(const mrs_msgs::HwApiCapabilitiesConstPtr& hw_api_capabilities) const {
    +     109             : 
    +     110          98 :   ph_->param_loader->setPrefix(ch_->package_name + "/" + Support::toSnakeCase(ch_->nodelet_name) + "/" + getName() + "/");
    +     111             : 
    +     112             :   bool requires_gnss, requires_imu, requires_distance_sensor, requires_altitude, requires_magnetometer_heading, requires_position, requires_orientation,
    +     113             :       requires_velocity, requires_angular_velocity;
    +     114             : 
    +     115          98 :   ph_->param_loader->loadParam("requires/gnss", requires_gnss);
    +     116          98 :   ph_->param_loader->loadParam("requires/imu", requires_imu);
    +     117          98 :   ph_->param_loader->loadParam("requires/distance_sensor", requires_distance_sensor);
    +     118          98 :   ph_->param_loader->loadParam("requires/altitude", requires_altitude);
    +     119          98 :   ph_->param_loader->loadParam("requires/magnetometer_heading", requires_magnetometer_heading);
    +     120          98 :   ph_->param_loader->loadParam("requires/position", requires_position);
    +     121          98 :   ph_->param_loader->loadParam("requires/orientation", requires_orientation);
    +     122          98 :   ph_->param_loader->loadParam("requires/velocity", requires_velocity);
    +     123          98 :   ph_->param_loader->loadParam("requires/angular_velocity", requires_angular_velocity);
    +     124             : 
    +     125          98 :   if (!ph_->param_loader->loadedSuccessfully()) {
    +     126           0 :     ROS_ERROR("[%s]: Could not load all non-optional hw_api compatibility parameters. Shutting down.", getPrintName().c_str());
    +     127           0 :     ros::shutdown();
    +     128             :   }
    +     129             : 
    +     130          98 :   if (requires_gnss && !hw_api_capabilities->produces_gnss) {
    +     131           0 :     ROS_ERROR("[%s]: requires gnss but hw api does not provide it.", getPrintName().c_str());
    +     132           0 :     return false;
    +     133             :   }
    +     134             : 
    +     135          98 :   if (requires_imu && !hw_api_capabilities->produces_imu) {
    +     136           0 :     ROS_ERROR("[%s]: requires imu but hw api does not provide it.", getPrintName().c_str());
    +     137           0 :     return false;
    +     138             :   }
    +     139             : 
    +     140          98 :   if (requires_distance_sensor && !hw_api_capabilities->produces_distance_sensor) {
    +     141           0 :     ROS_ERROR("[%s]: requires distance_sensor but hw api does not provide it.", getPrintName().c_str());
    +     142           0 :     return false;
    +     143             :   }
    +     144             : 
    +     145          98 :   if (requires_altitude && !hw_api_capabilities->produces_altitude) {
    +     146           0 :     ROS_ERROR("[%s]: requires altitude but hw api does not provide it.", getPrintName().c_str());
    +     147           0 :     return false;
    +     148             :   }
    +     149             : 
    +     150          98 :   if (requires_magnetometer_heading && !hw_api_capabilities->produces_magnetometer_heading) {
    +     151           0 :     ROS_ERROR("[%s]: requires magnetometer_heading but hw api does not provide it.", getPrintName().c_str());
    +     152           0 :     return false;
    +     153             :   }
    +     154             : 
    +     155          98 :   if (requires_position && !hw_api_capabilities->produces_position) {
    +     156           0 :     ROS_ERROR("[%s]: requires position but hw api does not provide it.", getPrintName().c_str());
    +     157           0 :     return false;
    +     158             :   }
    +     159             : 
    +     160          98 :   if (requires_orientation && !hw_api_capabilities->produces_orientation) {
    +     161           0 :     ROS_ERROR("[%s]: requires orientation but hw api does not provide it.", getPrintName().c_str());
    +     162           0 :     return false;
    +     163             :   }
    +     164             : 
    +     165          98 :   if (requires_velocity && !hw_api_capabilities->produces_velocity) {
    +     166           0 :     ROS_ERROR("[%s]: requires velocity but hw api does not provide it.", getPrintName().c_str());
    +     167           0 :     return false;
    +     168             :   }
    +     169             : 
    +     170          98 :   if (requires_angular_velocity && !hw_api_capabilities->produces_angular_velocity) {
    +     171           0 :     ROS_ERROR("[%s]: requires angular_velocity but hw api does not provide it.", getPrintName().c_str());
    +     172           0 :     return false;
    +     173             :   }
    +     174             : 
    +     175          98 :   return true;
    +     176             : }
    +     177             : /*//}*/
    +     178             : 
    +     179             : }  // namespace mrs_uav_managers
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/estimation_manager/estimators/state_estimator.cpp.gcov.overview.html b/mrs_uav_managers/src/estimation_manager/estimators/state_estimator.cpp.gcov.overview.html new file mode 100644 index 0000000000..f56ba99c77 --- /dev/null +++ b/mrs_uav_managers/src/estimation_manager/estimators/state_estimator.cpp.gcov.overview.html @@ -0,0 +1,65 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/estimation_manager/estimators/state_estimator.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_managers/src/estimation_manager/estimators/state_estimator.cpp.gcov.png b/mrs_uav_managers/src/estimation_manager/estimators/state_estimator.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..bc72d319242788406c563dbf7102614ba4896b70 GIT binary patch literal 753 zcmV=vK{+=A%<`fugT|4D%D%Y?bpOdcEsv|33Z$bJdkYuU(ivHuSf z^%UPM@=~IOTh~HDj!Hx|6wC=>lS0_RtN$X3=c$vZ>m}V+X}&1;=z5b*QR;If{2X#UB6l$>!>VAj=P^#DtsAs{j$`hCuT#=fnKc6X5)<{06RF>=VX9Ua&T#t9I z3NFa>J+7}gM4d3A@l)Z)o~!2lIG89Y-uL6UKDJ>4x$<$&9563-#yQ-CO*(SkJ*PWv zC@FO#@sTp=>c?G0?Gzh<3jm-9X_Co8aejAq{m0Rxm1>z(F?K+%VNzG&y32P%^Z_0n zj(M)hzRiJQq2$^lTeV&p6w_Rrws3R39PRXk%%6}rAM`Uu(Wn61aAD#O%sppB> zS9-q;kM1!`BkLQ--Ca5@;Uj}aYZ_)ydSXyG`$ow)pRT8C6Njl&cA9zhR=(9VqwC`X zo#u3|embu^RUFRZ_UWyY6g(p@qw`Ls2)8&}@lg-FEBBZwN$05_5ilXl%LWp6V~T3j zJ+;?y#gt=WJY%N*D>G&mijLwf8?&PE=BVK2stZU~0HnKLQem5xX~Wi`0H8;=Ck5a} zn1w)rZkz-H#+WTl@lyWc%pue|RkLAN`bjVxxOEX2GnN*W5u_qJOMpQk`M_avOfayWPm}wy`0_Kk~gJg`s12O{@fknXlF=o(=!E>eo^j$FaI5Ive jeDOweqg!!C#q@pv02dn3iqW*`00000NkvXXu0mjf+MZSW literal 0 HcmV?d00001 diff --git a/mrs_uav_managers/src/estimation_manager/index-detail-sort-f.html b/mrs_uav_managers/src/estimation_manager/index-detail-sort-f.html new file mode 100644 index 0000000000..072c044953 --- /dev/null +++ b/mrs_uav_managers/src/estimation_manager/index-detail-sort-f.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/estimation_manager + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/estimation_managerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:43361970.0 %
    Date:2024-04-18 23:11:36Functions:404785.1 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    estimator.cpp +
    72.9%72.9%
    +
    72.9 %62 / 8582.6 %19 / 23
    <unnamed>72.9 %62 / 8582.6 %19 / 23
    estimation_manager.cpp +
    69.5%69.5%
    +
    69.5 %371 / 53487.5 %21 / 24
    <unnamed>69.5 %371 / 53487.5 %21 / 24
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/estimation_manager/index-detail-sort-l.html b/mrs_uav_managers/src/estimation_manager/index-detail-sort-l.html new file mode 100644 index 0000000000..60c1547a72 --- /dev/null +++ b/mrs_uav_managers/src/estimation_manager/index-detail-sort-l.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/estimation_manager + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/estimation_managerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:43361970.0 %
    Date:2024-04-18 23:11:36Functions:404785.1 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    estimation_manager.cpp +
    69.5%69.5%
    +
    69.5 %371 / 53487.5 %21 / 24
    <unnamed>69.5 %371 / 53487.5 %21 / 24
    estimator.cpp +
    72.9%72.9%
    +
    72.9 %62 / 8582.6 %19 / 23
    <unnamed>72.9 %62 / 8582.6 %19 / 23
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/estimation_manager/index-detail.html b/mrs_uav_managers/src/estimation_manager/index-detail.html new file mode 100644 index 0000000000..8478f3d026 --- /dev/null +++ b/mrs_uav_managers/src/estimation_manager/index-detail.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/estimation_manager + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/estimation_managerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:43361970.0 %
    Date:2024-04-18 23:11:36Functions:404785.1 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    estimation_manager.cpp +
    69.5%69.5%
    +
    69.5 %371 / 53487.5 %21 / 24
    <unnamed>69.5 %371 / 53487.5 %21 / 24
    estimator.cpp +
    72.9%72.9%
    +
    72.9 %62 / 8582.6 %19 / 23
    <unnamed>72.9 %62 / 8582.6 %19 / 23
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/estimation_manager/index-sort-f.html b/mrs_uav_managers/src/estimation_manager/index-sort-f.html new file mode 100644 index 0000000000..73695964d3 --- /dev/null +++ b/mrs_uav_managers/src/estimation_manager/index-sort-f.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/estimation_manager + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/estimation_managerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:43361970.0 %
    Date:2024-04-18 23:11:36Functions:404785.1 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    estimator.cpp +
    72.9%72.9%
    +
    72.9 %62 / 8582.6 %19 / 23
    estimation_manager.cpp +
    69.5%69.5%
    +
    69.5 %371 / 53487.5 %21 / 24
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/estimation_manager/index-sort-l.html b/mrs_uav_managers/src/estimation_manager/index-sort-l.html new file mode 100644 index 0000000000..6a17ee29e6 --- /dev/null +++ b/mrs_uav_managers/src/estimation_manager/index-sort-l.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/estimation_manager + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/estimation_managerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:43361970.0 %
    Date:2024-04-18 23:11:36Functions:404785.1 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    estimation_manager.cpp +
    69.5%69.5%
    +
    69.5 %371 / 53487.5 %21 / 24
    estimator.cpp +
    72.9%72.9%
    +
    72.9 %62 / 8582.6 %19 / 23
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/estimation_manager/index.html b/mrs_uav_managers/src/estimation_manager/index.html new file mode 100644 index 0000000000..ddcbe4a266 --- /dev/null +++ b/mrs_uav_managers/src/estimation_manager/index.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/estimation_manager + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/estimation_managerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:43361970.0 %
    Date:2024-04-18 23:11:36Functions:404785.1 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    estimation_manager.cpp +
    69.5%69.5%
    +
    69.5 %371 / 53487.5 %21 / 24
    estimator.cpp +
    72.9%72.9%
    +
    72.9 %62 / 8582.6 %19 / 23
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/gain_manager.cpp.func-sort-c.html b/mrs_uav_managers/src/gain_manager.cpp.func-sort-c.html new file mode 100644 index 0000000000..28356619e8 --- /dev/null +++ b/mrs_uav_managers/src/gain_manager.cpp.func-sort-c.html @@ -0,0 +1,108 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/gain_manager.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src - gain_manager.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:22425886.8 %
    Date:2024-04-18 23:11:36Functions:77100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_managers::gain_manager::GainManager::callbackSetGains(mrs_msgs::StringRequest_<std::allocator<void> >&, mrs_msgs::StringResponse_<std::allocator<void> >&)2
    (anonymous namespace)::ProxyExec0::ProxyExec0()91
    mrs_uav_managers::gain_manager::GainManager::onInit()91
    mrs_uav_managers::gain_manager::GainManager::setGains(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)92
    mrs_uav_managers::gain_manager::GainManager::stringInVector(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&)2010
    mrs_uav_managers::gain_manager::GainManager::timerDiagnostics(ros::TimerEvent const&)2057
    mrs_uav_managers::gain_manager::GainManager::timerGainManagement(ros::TimerEvent const&)20963
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/gain_manager.cpp.func.html b/mrs_uav_managers/src/gain_manager.cpp.func.html new file mode 100644 index 0000000000..469c51bac1 --- /dev/null +++ b/mrs_uav_managers/src/gain_manager.cpp.func.html @@ -0,0 +1,108 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/gain_manager.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src - gain_manager.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:22425886.8 %
    Date:2024-04-18 23:11:36Functions:77100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    (anonymous namespace)::ProxyExec0::ProxyExec0()91
    mrs_uav_managers::gain_manager::GainManager::stringInVector(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&)2010
    mrs_uav_managers::gain_manager::GainManager::callbackSetGains(mrs_msgs::StringRequest_<std::allocator<void> >&, mrs_msgs::StringResponse_<std::allocator<void> >&)2
    mrs_uav_managers::gain_manager::GainManager::timerDiagnostics(ros::TimerEvent const&)2057
    mrs_uav_managers::gain_manager::GainManager::timerGainManagement(ros::TimerEvent const&)20963
    mrs_uav_managers::gain_manager::GainManager::onInit()91
    mrs_uav_managers::gain_manager::GainManager::setGains(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)92
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/gain_manager.cpp.gcov.frameset.html b/mrs_uav_managers/src/gain_manager.cpp.gcov.frameset.html new file mode 100644 index 0000000000..dbde2f3cff --- /dev/null +++ b/mrs_uav_managers/src/gain_manager.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/gain_manager.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_managers/src/gain_manager.cpp.gcov.html b/mrs_uav_managers/src/gain_manager.cpp.gcov.html new file mode 100644 index 0000000000..c808891ded --- /dev/null +++ b/mrs_uav_managers/src/gain_manager.cpp.gcov.html @@ -0,0 +1,730 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/gain_manager.cpp + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src - gain_manager.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:22425886.8 %
    Date:2024-04-18 23:11:36Functions:77100.0 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : /* includes //{ */
    +       2             : 
    +       3             : #include <ros/ros.h>
    +       4             : #include <nodelet/nodelet.h>
    +       5             : 
    +       6             : #include <std_msgs/String.h>
    +       7             : 
    +       8             : #include <mrs_msgs/String.h>
    +       9             : #include <mrs_msgs/EstimationDiagnostics.h>
    +      10             : #include <mrs_msgs/ControlManagerDiagnostics.h>
    +      11             : #include <mrs_msgs/GainManagerDiagnostics.h>
    +      12             : 
    +      13             : #include <mrs_lib/profiler.h>
    +      14             : #include <mrs_lib/scope_timer.h>
    +      15             : #include <mrs_lib/param_loader.h>
    +      16             : #include <mrs_lib/mutex.h>
    +      17             : #include <mrs_lib/publisher_handler.h>
    +      18             : #include <mrs_lib/service_client_handler.h>
    +      19             : #include <mrs_lib/subscribe_handler.h>
    +      20             : 
    +      21             : #include <dynamic_reconfigure/ReconfigureRequest.h>
    +      22             : #include <dynamic_reconfigure/Reconfigure.h>
    +      23             : #include <dynamic_reconfigure/Config.h>
    +      24             : 
    +      25             : //}
    +      26             : 
    +      27             : namespace mrs_uav_managers
    +      28             : {
    +      29             : 
    +      30             : namespace gain_manager
    +      31             : {
    +      32             : 
    +      33             : /* //{ class GainManager */
    +      34             : 
    +      35             : typedef struct
    +      36             : {
    +      37             : 
    +      38             :   double kpxy, kiwxy, kibxy, kvxy, kaxy;
    +      39             :   double kpz, kvz, kaz;
    +      40             :   double kiwxy_lim, kibxy_lim;
    +      41             :   double km, km_lim;
    +      42             :   double kqrp, kqy;
    +      43             : 
    +      44             :   std::string name;
    +      45             : 
    +      46             : } Gains_t;
    +      47             : 
    +      48             : class GainManager : public nodelet::Nodelet {
    +      49             : 
    +      50             : public:
    +      51             :   virtual void onInit();
    +      52             : 
    +      53             : private:
    +      54             :   ros::NodeHandle nh_;
    +      55             : 
    +      56             :   std::atomic<bool> is_initialized_ = false;
    +      57             : 
    +      58             :   // | ----------------------- parameters ----------------------- |
    +      59             : 
    +      60             :   std::vector<std::string> _current_state_estimators_;
    +      61             : 
    +      62             :   std::vector<std::string>       _gain_names_;
    +      63             :   std::map<std::string, Gains_t> _gains_;
    +      64             : 
    +      65             :   std::map<std::string, std::vector<std::string>> _map_type_allowed_gains_;
    +      66             :   std::map<std::string, std::string>              _map_type_default_gains_;
    +      67             :   ;
    +      68             : 
    +      69             :   // | --------------------- service clients -------------------- |
    +      70             : 
    +      71             :   ros::ServiceClient service_client_set_gains_;
    +      72             : 
    +      73             :   // | ----------------------- subscribers ---------------------- |
    +      74             : 
    +      75             :   mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics>     sh_estimation_diag_;
    +      76             :   mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics> sh_control_manager_diag_;
    +      77             : 
    +      78             :   // | --------------------- gain management -------------------- |
    +      79             : 
    +      80             :   bool setGains(std::string gains_name);
    +      81             : 
    +      82             :   ros::ServiceServer service_server_set_gains_;
    +      83             :   bool               callbackSetGains(mrs_msgs::String::Request& req, mrs_msgs::String::Response& res);
    +      84             : 
    +      85             :   std::string last_estimator_name_;
    +      86             :   std::mutex  mutex_last_estimator_name_;
    +      87             : 
    +      88             :   void       timerGainManagement(const ros::TimerEvent& event);
    +      89             :   ros::Timer timer_gain_management_;
    +      90             :   double     _gain_management_rate_;
    +      91             : 
    +      92             :   std::string current_gains_;
    +      93             :   std::mutex  mutex_current_gains_;
    +      94             : 
    +      95             :   // | ------------------ diagnostics publisher ----------------- |
    +      96             : 
    +      97             :   mrs_lib::PublisherHandler<mrs_msgs::GainManagerDiagnostics> ph_diagnostics_;
    +      98             : 
    +      99             :   void       timerDiagnostics(const ros::TimerEvent& event);
    +     100             :   ros::Timer timer_diagnostics_;
    +     101             :   double     _diagnostics_rate_;
    +     102             : 
    +     103             :   // | ------------------------ profiler ------------------------ |
    +     104             : 
    +     105             :   mrs_lib::Profiler profiler_;
    +     106             :   bool              _profiler_enabled_ = false;
    +     107             : 
    +     108             :   // | ------------------- scope timer logger ------------------- |
    +     109             : 
    +     110             :   bool                                       scope_timer_enabled_ = false;
    +     111             :   std::shared_ptr<mrs_lib::ScopeTimerLogger> scope_timer_logger_;
    +     112             : 
    +     113             :   // | ------------------------- helpers ------------------------ |
    +     114             : 
    +     115             :   bool stringInVector(const std::string& value, const std::vector<std::string>& vector);
    +     116             : };
    +     117             : 
    +     118             : //}
    +     119             : 
    +     120             : /* //{ onInit() */
    +     121             : 
    +     122          91 : void GainManager::onInit() {
    +     123             : 
    +     124         182 :   ros::NodeHandle nh_ = nodelet::Nodelet::getMTPrivateNodeHandle();
    +     125             : 
    +     126          91 :   ros::Time::waitForValid();
    +     127             : 
    +     128          91 :   ROS_INFO("[GainManager]: initializing");
    +     129             : 
    +     130             :   // | ------------------------- params ------------------------- |
    +     131             : 
    +     132         182 :   mrs_lib::ParamLoader param_loader(nh_, "GainManager");
    +     133             : 
    +     134         182 :   std::string custom_config_path;
    +     135         182 :   std::string platform_config_path;
    +     136             : 
    +     137          91 :   param_loader.loadParam("custom_config", custom_config_path);
    +     138          91 :   param_loader.loadParam("platform_config", platform_config_path);
    +     139             : 
    +     140          91 :   if (custom_config_path != "") {
    +     141          91 :     param_loader.addYamlFile(custom_config_path);
    +     142             :   }
    +     143             : 
    +     144          91 :   if (platform_config_path != "") {
    +     145          91 :     param_loader.addYamlFile(platform_config_path);
    +     146             :   }
    +     147             : 
    +     148          91 :   param_loader.addYamlFileFromParam("private_config");
    +     149          91 :   param_loader.addYamlFileFromParam("public_config");
    +     150          91 :   param_loader.addYamlFileFromParam("public_gains");
    +     151             : 
    +     152         182 :   const std::string yaml_prefix = "mrs_uav_managers/gain_manager/";
    +     153             : 
    +     154             :   // params passed from the launch file are not prefixed
    +     155          91 :   param_loader.loadParam("enable_profiler", _profiler_enabled_);
    +     156             : 
    +     157          91 :   param_loader.loadParam(yaml_prefix + "gains", _gain_names_);
    +     158             : 
    +     159          91 :   param_loader.loadParam(yaml_prefix + "estimator_types", _current_state_estimators_);
    +     160             : 
    +     161          91 :   param_loader.loadParam(yaml_prefix + "rate", _gain_management_rate_);
    +     162          91 :   param_loader.loadParam(yaml_prefix + "diagnostics_rate", _diagnostics_rate_);
    +     163             : 
    +     164             :   // | ------------------- scope timer logger ------------------- |
    +     165             : 
    +     166          91 :   param_loader.loadParam(yaml_prefix + "scope_timer/enabled", scope_timer_enabled_);
    +     167         273 :   const std::string scope_timer_log_filename = param_loader.loadParam2("scope_timer/log_filename", std::string(""));
    +     168          91 :   scope_timer_logger_                        = std::make_shared<mrs_lib::ScopeTimerLogger>(scope_timer_log_filename, scope_timer_enabled_);
    +     169             : 
    +     170          91 :   std::vector<std::string>::iterator it;
    +     171             : 
    +     172             :   // loading gain_names
    +     173         273 :   for (it = _gain_names_.begin(); it != _gain_names_.end(); ++it) {
    +     174             : 
    +     175         182 :     ROS_INFO_STREAM("[GainManager]: loading gains '" << *it << "'");
    +     176             : 
    +     177         182 :     Gains_t new_gains;
    +     178             : 
    +     179         182 :     param_loader.loadParam(yaml_prefix + *it + "/horizontal/kp", new_gains.kpxy);
    +     180         182 :     param_loader.loadParam(yaml_prefix + *it + "/horizontal/kv", new_gains.kvxy);
    +     181         182 :     param_loader.loadParam(yaml_prefix + *it + "/horizontal/ka", new_gains.kaxy);
    +     182         182 :     param_loader.loadParam(yaml_prefix + *it + "/horizontal/kib", new_gains.kibxy);
    +     183         182 :     param_loader.loadParam(yaml_prefix + *it + "/horizontal/kiw", new_gains.kiwxy);
    +     184         182 :     param_loader.loadParam(yaml_prefix + *it + "/horizontal/kib_lim", new_gains.kibxy_lim);
    +     185         182 :     param_loader.loadParam(yaml_prefix + *it + "/horizontal/kiw_lim", new_gains.kiwxy_lim);
    +     186             : 
    +     187         182 :     param_loader.loadParam(yaml_prefix + *it + "/vertical/kp", new_gains.kpz);
    +     188         182 :     param_loader.loadParam(yaml_prefix + *it + "/vertical/kv", new_gains.kvz);
    +     189         182 :     param_loader.loadParam(yaml_prefix + *it + "/vertical/ka", new_gains.kaz);
    +     190             : 
    +     191         182 :     param_loader.loadParam(yaml_prefix + *it + "/attitude/kq_roll_pitch", new_gains.kqrp);
    +     192         182 :     param_loader.loadParam(yaml_prefix + *it + "/attitude/kq_yaw", new_gains.kqy);
    +     193             : 
    +     194         182 :     param_loader.loadParam(yaml_prefix + *it + "/mass_estimator/km", new_gains.km);
    +     195         182 :     param_loader.loadParam(yaml_prefix + *it + "/mass_estimator/km_lim", new_gains.km_lim);
    +     196             : 
    +     197         182 :     _gains_.insert(std::pair<std::string, Gains_t>(*it, new_gains));
    +     198             :   }
    +     199             : 
    +     200             :   // loading the allowed gains lists
    +     201         728 :   for (it = _current_state_estimators_.begin(); it != _current_state_estimators_.end(); ++it) {
    +     202             : 
    +     203         637 :     std::vector<std::string> temp_vector;
    +     204         637 :     param_loader.loadParam(yaml_prefix + "allowed_gains/" + *it, temp_vector);
    +     205             : 
    +     206         637 :     std::vector<std::string>::iterator it2;
    +     207        1911 :     for (it2 = temp_vector.begin(); it2 != temp_vector.end(); ++it2) {
    +     208        1274 :       if (!stringInVector(*it2, _gain_names_)) {
    +     209           0 :         ROS_ERROR("[GainManager]: the element '%s' of %s/allowed_gains is not a valid gain!", it2->c_str(), it->c_str());
    +     210           0 :         ros::shutdown();
    +     211             :       }
    +     212             :     }
    +     213             : 
    +     214         637 :     _map_type_allowed_gains_.insert(std::pair<std::string, std::vector<std::string>>(*it, temp_vector));
    +     215             :   }
    +     216             : 
    +     217             :   // loading the default gains
    +     218         728 :   for (it = _current_state_estimators_.begin(); it != _current_state_estimators_.end(); ++it) {
    +     219             : 
    +     220         637 :     std::string temp_str;
    +     221         637 :     param_loader.loadParam(yaml_prefix + "default_gains/" + *it, temp_str);
    +     222             : 
    +     223         637 :     if (!stringInVector(temp_str, _map_type_allowed_gains_.at(*it))) {
    +     224           0 :       ROS_ERROR("[GainManager]: the element '%s' of %s/allowed_gains is not a valid gain!", temp_str.c_str(), it->c_str());
    +     225           0 :       ros::shutdown();
    +     226             :     }
    +     227             : 
    +     228         637 :     _map_type_default_gains_.insert(std::pair<std::string, std::string>(*it, temp_str));
    +     229             :   }
    +     230             : 
    +     231          91 :   ROS_INFO("[GainManager]: done loading dynamical params");
    +     232             : 
    +     233          91 :   current_gains_       = "";
    +     234          91 :   last_estimator_name_ = "";
    +     235             : 
    +     236             :   // | ------------------------ services ------------------------ |
    +     237             : 
    +     238          91 :   service_server_set_gains_ = nh_.advertiseService("set_gains_in", &GainManager::callbackSetGains, this);
    +     239             : 
    +     240          91 :   service_client_set_gains_ = nh_.serviceClient<dynamic_reconfigure::Reconfigure>("set_gains_out");
    +     241             : 
    +     242             :   // | ----------------------- subscribers ---------------------- |
    +     243             : 
    +     244         182 :   mrs_lib::SubscribeHandlerOptions shopts;
    +     245          91 :   shopts.nh                 = nh_;
    +     246          91 :   shopts.node_name          = "GainManager";
    +     247          91 :   shopts.no_message_timeout = mrs_lib::no_timeout;
    +     248          91 :   shopts.threadsafe         = true;
    +     249          91 :   shopts.autostart          = true;
    +     250          91 :   shopts.queue_size         = 10;
    +     251          91 :   shopts.transport_hints    = ros::TransportHints().tcpNoDelay();
    +     252             : 
    +     253          91 :   sh_estimation_diag_      = mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics>(shopts, "estimation_diagnostics_in");
    +     254          91 :   sh_control_manager_diag_ = mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics>(shopts, "control_manager_diagnostics_in");
    +     255             : 
    +     256             :   // | ----------------------- publishers ----------------------- |
    +     257             : 
    +     258          91 :   ph_diagnostics_ = mrs_lib::PublisherHandler<mrs_msgs::GainManagerDiagnostics>(nh_, "diagnostics_out", 10);
    +     259             : 
    +     260             :   // | ------------------------- timers ------------------------- |
    +     261             : 
    +     262          91 :   timer_gain_management_ = nh_.createTimer(ros::Rate(_gain_management_rate_), &GainManager::timerGainManagement, this);
    +     263          91 :   timer_diagnostics_     = nh_.createTimer(ros::Rate(_diagnostics_rate_), &GainManager::timerDiagnostics, this);
    +     264             : 
    +     265             :   // | ------------------------ profiler ------------------------ |
    +     266             : 
    +     267          91 :   profiler_ = mrs_lib::Profiler(nh_, "GainManager", _profiler_enabled_);
    +     268             : 
    +     269             :   // | ----------------------- finish init ---------------------- |
    +     270             : 
    +     271          91 :   if (!param_loader.loadedSuccessfully()) {
    +     272           0 :     ROS_ERROR("[GainManager]: could not load all parameters!");
    +     273           0 :     ros::shutdown();
    +     274             :   }
    +     275             : 
    +     276          91 :   is_initialized_ = true;
    +     277             : 
    +     278          91 :   ROS_INFO("[GainManager]: initialized");
    +     279             : 
    +     280          91 :   ROS_DEBUG("[GainManager]: debug output is enabled");
    +     281          91 : }
    +     282             : 
    +     283             : //}
    +     284             : 
    +     285             : // --------------------------------------------------------------
    +     286             : // |                           methods                          |
    +     287             : // --------------------------------------------------------------
    +     288             : 
    +     289             : /* setGains() //{ */
    +     290             : 
    +     291          92 : bool GainManager::setGains(std::string gains_name) {
    +     292             : 
    +     293          92 :   std::map<std::string, Gains_t>::iterator it;
    +     294          92 :   it = _gains_.find(gains_name);
    +     295             : 
    +     296          92 :   if (it == _gains_.end()) {
    +     297           0 :     ROS_WARN("[GainManager]: can not set gains for '%s', the mode is not on a list!", gains_name.c_str());
    +     298           0 :     return false;
    +     299             :   }
    +     300             : 
    +     301         184 :   dynamic_reconfigure::Config          conf;
    +     302         184 :   dynamic_reconfigure::DoubleParameter param;
    +     303             : 
    +     304          92 :   param.name  = "kpxy";
    +     305          92 :   param.value = it->second.kpxy;
    +     306          92 :   conf.doubles.push_back(param);
    +     307             : 
    +     308          92 :   param.name  = "kvxy";
    +     309          92 :   param.value = it->second.kvxy;
    +     310          92 :   conf.doubles.push_back(param);
    +     311             : 
    +     312          92 :   param.name  = "kaxy";
    +     313          92 :   param.value = it->second.kaxy;
    +     314          92 :   conf.doubles.push_back(param);
    +     315             : 
    +     316          92 :   param.name  = "kq_roll_pitch";
    +     317          92 :   param.value = it->second.kqrp;
    +     318          92 :   conf.doubles.push_back(param);
    +     319             : 
    +     320          92 :   param.name  = "kibxy";
    +     321          92 :   param.value = it->second.kibxy;
    +     322          92 :   conf.doubles.push_back(param);
    +     323             : 
    +     324          92 :   param.name  = "kiwxy";
    +     325          92 :   param.value = it->second.kiwxy;
    +     326          92 :   conf.doubles.push_back(param);
    +     327             : 
    +     328          92 :   param.name  = "kibxy_lim";
    +     329          92 :   param.value = it->second.kibxy_lim;
    +     330          92 :   conf.doubles.push_back(param);
    +     331             : 
    +     332          92 :   param.name  = "kiwxy_lim";
    +     333          92 :   param.value = it->second.kiwxy_lim;
    +     334          92 :   conf.doubles.push_back(param);
    +     335             : 
    +     336          92 :   param.name  = "kpz";
    +     337          92 :   param.value = it->second.kpz;
    +     338          92 :   conf.doubles.push_back(param);
    +     339             : 
    +     340          92 :   param.name  = "kvz";
    +     341          92 :   param.value = it->second.kvz;
    +     342          92 :   conf.doubles.push_back(param);
    +     343             : 
    +     344          92 :   param.name  = "kaz";
    +     345          92 :   param.value = it->second.kaz;
    +     346          92 :   conf.doubles.push_back(param);
    +     347             : 
    +     348          92 :   param.name  = "kq_yaw";
    +     349          92 :   param.value = it->second.kqy;
    +     350          92 :   conf.doubles.push_back(param);
    +     351             : 
    +     352          92 :   param.name  = "km";
    +     353          92 :   param.value = it->second.km;
    +     354          92 :   conf.doubles.push_back(param);
    +     355             : 
    +     356          92 :   param.name  = "km_lim";
    +     357          92 :   param.value = it->second.km_lim;
    +     358          92 :   conf.doubles.push_back(param);
    +     359             : 
    +     360         184 :   dynamic_reconfigure::ReconfigureRequest  srv_req;
    +     361         184 :   dynamic_reconfigure::ReconfigureResponse srv_resp;
    +     362             : 
    +     363          92 :   srv_req.config = conf;
    +     364             : 
    +     365         184 :   dynamic_reconfigure::Reconfigure reconf;
    +     366          92 :   reconf.request = srv_req;
    +     367             : 
    +     368          92 :   ROS_INFO_THROTTLE(1.0, "[GainManager]: setting up gains for '%s'", gains_name.c_str());
    +     369             : 
    +     370          92 :   bool res = service_client_set_gains_.call(reconf);
    +     371             : 
    +     372          92 :   if (!res) {
    +     373             : 
    +     374           0 :     ROS_WARN_THROTTLE(1.0, "[GainManager]: the service for setting gains has failed!");
    +     375           0 :     return false;
    +     376             : 
    +     377             :   } else {
    +     378             : 
    +     379          92 :     mrs_lib::set_mutexed(mutex_current_gains_, gains_name, current_gains_);
    +     380             : 
    +     381          92 :     return true;
    +     382             :   }
    +     383             : }
    +     384             : 
    +     385             : //}
    +     386             : 
    +     387             : // --------------------------------------------------------------
    +     388             : // |                          callbacks                         |
    +     389             : // --------------------------------------------------------------
    +     390             : 
    +     391             : // | -------------------- service callbacks ------------------- |
    +     392             : 
    +     393             : /* //{ callbackSetGains() */
    +     394             : 
    +     395           2 : bool GainManager::callbackSetGains(mrs_msgs::String::Request& req, mrs_msgs::String::Response& res) {
    +     396             : 
    +     397           2 :   if (!is_initialized_) {
    +     398           0 :     return false;
    +     399             :   }
    +     400             : 
    +     401           4 :   std::stringstream ss;
    +     402             : 
    +     403           2 :   if (!sh_estimation_diag_.hasMsg()) {
    +     404             : 
    +     405           0 :     ss << "missing estimation diagnostics";
    +     406             : 
    +     407           0 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[GainManager]: " << ss.str());
    +     408             : 
    +     409           0 :     res.message = ss.str();
    +     410           0 :     res.success = false;
    +     411           0 :     return true;
    +     412             :   }
    +     413             : 
    +     414           4 :   auto estimation_diagnostics = sh_estimation_diag_.getMsg();
    +     415             : 
    +     416           2 :   if (!stringInVector(req.value, _gain_names_)) {
    +     417             : 
    +     418           1 :     ss << "the gains '" << req.value.c_str() << "' do not exist (in the GainManager's config)";
    +     419             : 
    +     420           1 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[GainManager]: " << ss.str());
    +     421             : 
    +     422           1 :     res.message = ss.str();
    +     423           1 :     res.success = false;
    +     424           1 :     return true;
    +     425             :   }
    +     426             : 
    +     427           1 :   if (!stringInVector(req.value, _map_type_allowed_gains_.at(estimation_diagnostics->current_state_estimator))) {
    +     428             : 
    +     429           0 :     ss << "the gains '" << req.value.c_str() << "' are not allowed given the current state estimator";
    +     430             : 
    +     431           0 :     ROS_WARN_STREAM_THROTTLE(1.0, "[GainManager]: " << ss.str());
    +     432             : 
    +     433           0 :     res.message = ss.str();
    +     434           0 :     res.success = false;
    +     435           0 :     return true;
    +     436             :   }
    +     437             : 
    +     438             :   // try to set the gains
    +     439           1 :   if (!setGains(req.value)) {
    +     440             : 
    +     441           0 :     ss << "the Se3Controller could not set the gains";
    +     442             : 
    +     443           0 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[GainManager]: " << ss.str());
    +     444             : 
    +     445           0 :     res.message = ss.str();
    +     446           0 :     res.success = false;
    +     447           0 :     return true;
    +     448             : 
    +     449             :   } else {
    +     450             : 
    +     451           1 :     ss << "the gains '" << req.value.c_str() << "' are set";
    +     452             : 
    +     453           1 :     ROS_INFO_STREAM_THROTTLE(1.0, "[GainManager]: " << ss.str());
    +     454             : 
    +     455           1 :     res.message = ss.str();
    +     456           1 :     res.success = true;
    +     457           1 :     return true;
    +     458             :   }
    +     459             : }
    +     460             : 
    +     461             : //}
    +     462             : 
    +     463             : // --------------------------------------------------------------
    +     464             : // |                           timers                           |
    +     465             : // --------------------------------------------------------------
    +     466             : 
    +     467             : /* timerGainManagement() //{ */
    +     468             : 
    +     469       20963 : void GainManager::timerGainManagement(const ros::TimerEvent& event) {
    +     470             : 
    +     471       20963 :   if (!is_initialized_) {
    +     472        4705 :     return;
    +     473             :   }
    +     474             : 
    +     475       41926 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("gainManagementTimer", _gain_management_rate_, 0.01, event);
    +     476       41926 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("GainManager::gainManagementTimer", scope_timer_logger_, scope_timer_enabled_);
    +     477             : 
    +     478       20963 :   if (!sh_estimation_diag_.hasMsg()) {
    +     479        4705 :     return;
    +     480             :   }
    +     481             : 
    +     482       16258 :   if (!sh_control_manager_diag_.hasMsg()) {
    +     483           0 :     return;
    +     484             :   }
    +     485             : 
    +     486       32516 :   auto estimation_diagnostics = sh_estimation_diag_.getMsg();
    +     487             : 
    +     488       32516 :   auto control_manager_diagnostics = sh_estimation_diag_.getMsg();
    +     489             : 
    +     490       32516 :   auto current_gains       = mrs_lib::get_mutexed(mutex_current_gains_, current_gains_);
    +     491       16258 :   auto last_estimator_name = mrs_lib::get_mutexed(mutex_last_estimator_name_, last_estimator_name_);
    +     492             : 
    +     493             :   // | --- automatically set _gains_ when currrent state estimator changes -- |
    +     494       16258 :   if (estimation_diagnostics->current_state_estimator != last_estimator_name) {
    +     495             : 
    +     496          96 :     ROS_INFO_THROTTLE(1.0, "[GainManager]: the state estimator has changed! %s -> %s", last_estimator_name_.c_str(),
    +     497             :                       estimation_diagnostics->current_state_estimator.c_str());
    +     498             : 
    +     499          96 :     std::map<std::string, std::string>::iterator it;
    +     500          96 :     it = _map_type_default_gains_.find(estimation_diagnostics->current_state_estimator);
    +     501             : 
    +     502          96 :     if (it == _map_type_default_gains_.end()) {
    +     503             : 
    +     504           0 :       ROS_WARN_THROTTLE(1.0, "[GainManager]: the state estimator '%s' was not specified in the gain_manager's config!",
    +     505             :                         estimation_diagnostics->current_state_estimator.c_str());
    +     506             : 
    +     507             :     } else {
    +     508             : 
    +     509             :       // if the current gains are within the allowed estimator types, do nothing
    +     510          96 :       if (stringInVector(current_gains, _map_type_allowed_gains_.at(estimation_diagnostics->current_state_estimator))) {
    +     511             : 
    +     512           5 :         last_estimator_name = estimation_diagnostics->current_state_estimator;
    +     513             : 
    +     514             :         // else, try to set the default gains
    +     515             :       } else {
    +     516             : 
    +     517          91 :         ROS_WARN_THROTTLE(1.0, "[GainManager]: the current gains '%s' are not within the allowed gains for '%s'", current_gains.c_str(),
    +     518             :                           estimation_diagnostics->current_state_estimator.c_str());
    +     519             : 
    +     520          91 :         if (setGains(it->second)) {
    +     521             : 
    +     522          91 :           last_estimator_name = estimation_diagnostics->current_state_estimator;
    +     523             : 
    +     524          91 :           ROS_INFO_THROTTLE(1.0, "[GainManager]: gains set to default: '%s'", it->second.c_str());
    +     525             : 
    +     526             :         } else {
    +     527             : 
    +     528           0 :           ROS_WARN_THROTTLE(1.0, "[GainManager]: could not set gains!");
    +     529             :         }
    +     530             :       }
    +     531             :     }
    +     532             :   }
    +     533             : 
    +     534       16258 :   mrs_lib::set_mutexed(mutex_last_estimator_name_, last_estimator_name, last_estimator_name_);
    +     535             : }
    +     536             : 
    +     537             : //}
    +     538             : 
    +     539             : /* timerDiagnostics() //{ */
    +     540             : 
    +     541        2057 : void GainManager::timerDiagnostics(const ros::TimerEvent& event) {
    +     542             : 
    +     543        2057 :   if (!is_initialized_) {
    +     544         458 :     return;
    +     545             :   }
    +     546             : 
    +     547        4114 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("timerDiagnostics", _diagnostics_rate_, 0.01, event);
    +     548        4114 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("GainManager::timerDiagnostics", scope_timer_logger_, scope_timer_enabled_);
    +     549             : 
    +     550        2057 :   if (!sh_estimation_diag_.hasMsg()) {
    +     551         452 :     ROS_WARN_THROTTLE(10.0, "[GainManager]: can not do gain management, missing estimator diagnostics!");
    +     552         452 :     return;
    +     553             :   }
    +     554             : 
    +     555        1605 :   if (!sh_control_manager_diag_.hasMsg()) {
    +     556           0 :     ROS_WARN_THROTTLE(10.0, "[GainManager]: can not do gain management, missing control manager diagnostics!");
    +     557           0 :     return;
    +     558             :   }
    +     559             : 
    +     560        1605 :   auto current_gains = mrs_lib::get_mutexed(mutex_current_gains_, current_gains_);
    +     561             : 
    +     562        1605 :   if (current_gains == "") { // this could happend just before timerGainManagement() finishes
    +     563           6 :     return;
    +     564             :   }
    +     565             : 
    +     566        1599 :   auto estimation_diagnostics = sh_estimation_diag_.getMsg();
    +     567             : 
    +     568        1599 :   mrs_msgs::GainManagerDiagnostics diagnostics;
    +     569             : 
    +     570        1599 :   diagnostics.stamp        = ros::Time::now();
    +     571        1599 :   diagnostics.current_name = current_gains;
    +     572        1599 :   diagnostics.loaded       = _gain_names_;
    +     573             : 
    +     574             :   // get the available gains
    +     575             :   {
    +     576        1599 :     std::map<std::string, std::vector<std::string>>::iterator it;
    +     577        1599 :     it = _map_type_allowed_gains_.find(estimation_diagnostics->current_state_estimator);
    +     578             : 
    +     579        1599 :     if (it == _map_type_allowed_gains_.end()) {
    +     580           0 :       ROS_WARN_THROTTLE(1.0, "[GainManager]: the estimator name '%s' was not specified in the gain_manager's config!",
    +     581             :                         estimation_diagnostics->current_state_estimator.c_str());
    +     582             :     } else {
    +     583        1599 :       diagnostics.available = it->second;
    +     584             :     }
    +     585             :   }
    +     586             : 
    +     587             :   // get the current gain values
    +     588             :   {
    +     589        1599 :     std::map<std::string, Gains_t>::iterator it;
    +     590        1599 :     it = _gains_.find(current_gains);
    +     591             : 
    +     592        1599 :     if (it == _gains_.end()) {
    +     593           0 :       ROS_ERROR("[GainManager]: current gains '%s' not found in the gain list!", current_gains.c_str());
    +     594           0 :       return;
    +     595             :     }
    +     596             : 
    +     597        1599 :     diagnostics.current_values.kpxy = it->second.kpxy;
    +     598        1599 :     diagnostics.current_values.kvxy = it->second.kvxy;
    +     599        1599 :     diagnostics.current_values.kaxy = it->second.kaxy;
    +     600             : 
    +     601        1599 :     diagnostics.current_values.kqrp = it->second.kqrp;
    +     602             : 
    +     603        1599 :     diagnostics.current_values.kibxy     = it->second.kibxy;
    +     604        1599 :     diagnostics.current_values.kibxy_lim = it->second.kibxy_lim;
    +     605             : 
    +     606        1599 :     diagnostics.current_values.kiwxy     = it->second.kiwxy;
    +     607        1599 :     diagnostics.current_values.kiwxy_lim = it->second.kiwxy_lim;
    +     608             : 
    +     609        1599 :     diagnostics.current_values.kpz = it->second.kpz;
    +     610        1599 :     diagnostics.current_values.kvz = it->second.kvz;
    +     611        1599 :     diagnostics.current_values.kaz = it->second.kaz;
    +     612             : 
    +     613        1599 :     diagnostics.current_values.kqy = it->second.kqy;
    +     614             : 
    +     615        1599 :     diagnostics.current_values.km     = it->second.km;
    +     616        1599 :     diagnostics.current_values.km_lim = it->second.km_lim;
    +     617             :   }
    +     618             : 
    +     619        1599 :   ph_diagnostics_.publish(diagnostics);
    +     620             : }
    +     621             : 
    +     622             : //}
    +     623             : 
    +     624             : // --------------------------------------------------------------
    +     625             : // |                          routines                          |
    +     626             : // --------------------------------------------------------------
    +     627             : 
    +     628             : /* stringInVector() //{ */
    +     629             : 
    +     630        2010 : bool GainManager::stringInVector(const std::string& value, const std::vector<std::string>& vector) {
    +     631             : 
    +     632        2010 :   if (std::find(vector.begin(), vector.end(), value) == vector.end()) {
    +     633          92 :     return false;
    +     634             :   } else {
    +     635        1918 :     return true;
    +     636             :   }
    +     637             : }
    +     638             : 
    +     639             : //}
    +     640             : 
    +     641             : }  // namespace gain_manager
    +     642             : 
    +     643             : }  // namespace mrs_uav_managers
    +     644             : 
    +     645             : #include <pluginlib/class_list_macros.h>
    +     646          91 : PLUGINLIB_EXPORT_CLASS(mrs_uav_managers::gain_manager::GainManager, nodelet::Nodelet)
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/gain_manager.cpp.gcov.overview.html b/mrs_uav_managers/src/gain_manager.cpp.gcov.overview.html new file mode 100644 index 0000000000..dedda4d668 --- /dev/null +++ b/mrs_uav_managers/src/gain_manager.cpp.gcov.overview.html @@ -0,0 +1,182 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/gain_manager.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_managers/src/gain_manager.cpp.gcov.png b/mrs_uav_managers/src/gain_manager.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..26b079aec6e9ef3a915fcb0329e31572342913a7 GIT binary patch literal 2153 zcmV-v2$uJWP)t0{{R3FUJ9e0000OP)t-s|NsB0 zs;a7|?_FK${{R500003000620&P%hU00009a7bBm000ie000ie0hKEb8vp3{6OWTxkr*wpmP*g=$ThY zd{9YyPOr8!bW?o4T}f(yZ{PduLX%R&-=IK*cLTh`i32gO;NQFo6a7ui*V4=&@kui) zS}>Bm0gPOX4rX-0l;RwNOD3M$cysa0dk$c@TYL_xlAeXEc)FyxBmxga^5`m4VUOr=J{!k zkV1~C@W|=cfe?8FAiwKq;p#F<5{UL)4t{x1BywPfuHh`CnIw74nY@KZvSnS9IL!qX zqh=1~;cdk|7Y?Y~_bf3TwSoW36idr+hX#{1r2tI;oTQkudQ4LU)@(&y?Ha)KpvM)7 zd#XGF0p(_ffFlq}!8HsxA#ij>?6h!~IBJL|UDEaCsep8J|H7V+MmtKz2VQ0|MA359 z0*>-%6s?LS`3rzr9O$7vKp8oP$mSNHkgol>+d%h9vTNljws};uU3-gh|9PNzOyPac z8eBNj_XIXo`r+uPt@yC<5dwGp>!9jMGsF76fI3-MoL7v>Q688?kX|Omes1}Aw-;#V z`*A(Lo~Qrl{pvgu;76rhz_SJjK>5r$84O2_I-|JTa4S6CWw_?+wQ=zbS9h+3g)huH zut27jy&$k|JxnY6khUImhxKHxM+bFgI_(b&A11nF0If09fZVR-lc|Y#uq0Cd>e`}s z^iq^R5G%}49Yjtlu@X&2x{;y>#y3pykU;Gyl6i`}>n6}qY~-XoQN*JLAhV^LvvN-c zj3UuW4an_U{?tBXU1{T<<54!FSrMa#0;d(DX9gqXq!MYX$XMWh!jZ1A?q!_EQg~Qu zamkl!yJA1z5BmXFhFQz?8^~L(d)DhPfM(po6gYMYKx_dy_4&dn?@#(yt zZNP5+{%TF{8yx_csHz>#1QnK3u2+R7>Zs0Ke{vS|+yKhz`j1Cp9ywiqIgborJC&# zDV`_68wzYwe75q!cNqmNe#lNhqMeKzg-;HbrNC^853|@Sv*yRsWmoBDf&kq)UGoJg z1Quz=xxccY6_O^vHbv1TuEQu$6&9^~UO!Fo!ZS?8(E8aHOfD8F!>1VWC5b)ELDs zN7@Q!q#fyR-YXOrDsMl5v~3mn4Hk5*3PDZWq~8$P+wyr1#rtaF;&epQ8?bE0^GX1j zt!E4Hh2rTc9UQA(_&A z+E=G}BmvT^()e<`A(Xl-a`Oo;f4ebU1~c_%rk3ZC*L`D^-<_HPWZEXZUq+4Qng%6%@w$ZmJ;6{M;Gu{c}-x%eRQFAo2bI6N`Y!>3RcxS6eg zPQYGd0L|m+-kaM~-y^cGgv?{QHi;Xb(K-BesL;z7PX+n?OlII2sd0)Iji{VP*B*#o zIz0dp4@A4>@@P*#eNb7GICoW`HWmI8kh1%-O+{s|U^fabwCLF@Fr%JFA|Fku`Wg&x z(%kmb#c>x*1LusQEVM_Af-00`w#+E#Li_S!th;UF_K@z{&C6emZ9DSMxEM>6INt)~ z3;b@12kuYNLLg{PKfCKd?h}CWJPuOS#O+u_;CLD4=lt9j+Q$#uob?^#?D@j*83#FH zx5>z>WG=$>e;wW-fnRCyi;s3cx8=?YTgI_mhF`fD27v$N3FNlI+CO=U5;XnM0c + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/srcHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:1246171872.5 %
    Date:2024-04-18 23:11:36Functions:647387.7 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    null_tracker.cpp +
    69.5%69.5%
    +
    69.5 %41 / 5955.0 %11 / 20
    <unnamed>69.5 %41 / 5955.0 %11 / 20
    gain_manager.cpp +
    86.8%86.8%
    +
    86.8 %224 / 258100.0 %7 / 7
    <unnamed>86.8 %224 / 258100.0 %7 / 7
    constraint_manager.cpp +
    84.1%84.1%
    +
    84.1 %195 / 232100.0 %8 / 8
    <unnamed>84.1 %195 / 232100.0 %8 / 8
    uav_manager.cpp +
    67.2%67.2%
    +
    67.2 %786 / 1169100.0 %38 / 38
    <unnamed>67.2 %786 / 1169100.0 %38 / 38
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/index-detail-sort-l.html b/mrs_uav_managers/src/index-detail-sort-l.html new file mode 100644 index 0000000000..150b8eb905 --- /dev/null +++ b/mrs_uav_managers/src/index-detail-sort-l.html @@ -0,0 +1,164 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/srcHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:1246171872.5 %
    Date:2024-04-18 23:11:36Functions:647387.7 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    uav_manager.cpp +
    67.2%67.2%
    +
    67.2 %786 / 1169100.0 %38 / 38
    <unnamed>67.2 %786 / 1169100.0 %38 / 38
    null_tracker.cpp +
    69.5%69.5%
    +
    69.5 %41 / 5955.0 %11 / 20
    <unnamed>69.5 %41 / 5955.0 %11 / 20
    constraint_manager.cpp +
    84.1%84.1%
    +
    84.1 %195 / 232100.0 %8 / 8
    <unnamed>84.1 %195 / 232100.0 %8 / 8
    gain_manager.cpp +
    86.8%86.8%
    +
    86.8 %224 / 258100.0 %7 / 7
    <unnamed>86.8 %224 / 258100.0 %7 / 7
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/index-detail.html b/mrs_uav_managers/src/index-detail.html new file mode 100644 index 0000000000..ddc4e6d41f --- /dev/null +++ b/mrs_uav_managers/src/index-detail.html @@ -0,0 +1,164 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/srcHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:1246171872.5 %
    Date:2024-04-18 23:11:36Functions:647387.7 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    constraint_manager.cpp +
    84.1%84.1%
    +
    84.1 %195 / 232100.0 %8 / 8
    <unnamed>84.1 %195 / 232100.0 %8 / 8
    gain_manager.cpp +
    86.8%86.8%
    +
    86.8 %224 / 258100.0 %7 / 7
    <unnamed>86.8 %224 / 258100.0 %7 / 7
    null_tracker.cpp +
    69.5%69.5%
    +
    69.5 %41 / 5955.0 %11 / 20
    <unnamed>69.5 %41 / 5955.0 %11 / 20
    uav_manager.cpp +
    67.2%67.2%
    +
    67.2 %786 / 1169100.0 %38 / 38
    <unnamed>67.2 %786 / 1169100.0 %38 / 38
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/index-sort-f.html b/mrs_uav_managers/src/index-sort-f.html new file mode 100644 index 0000000000..9dc023ba60 --- /dev/null +++ b/mrs_uav_managers/src/index-sort-f.html @@ -0,0 +1,132 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/srcHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:1246171872.5 %
    Date:2024-04-18 23:11:36Functions:647387.7 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    null_tracker.cpp +
    69.5%69.5%
    +
    69.5 %41 / 5955.0 %11 / 20
    gain_manager.cpp +
    86.8%86.8%
    +
    86.8 %224 / 258100.0 %7 / 7
    constraint_manager.cpp +
    84.1%84.1%
    +
    84.1 %195 / 232100.0 %8 / 8
    uav_manager.cpp +
    67.2%67.2%
    +
    67.2 %786 / 1169100.0 %38 / 38
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/index-sort-l.html b/mrs_uav_managers/src/index-sort-l.html new file mode 100644 index 0000000000..0dd6688223 --- /dev/null +++ b/mrs_uav_managers/src/index-sort-l.html @@ -0,0 +1,132 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/srcHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:1246171872.5 %
    Date:2024-04-18 23:11:36Functions:647387.7 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    uav_manager.cpp +
    67.2%67.2%
    +
    67.2 %786 / 1169100.0 %38 / 38
    null_tracker.cpp +
    69.5%69.5%
    +
    69.5 %41 / 5955.0 %11 / 20
    constraint_manager.cpp +
    84.1%84.1%
    +
    84.1 %195 / 232100.0 %8 / 8
    gain_manager.cpp +
    86.8%86.8%
    +
    86.8 %224 / 258100.0 %7 / 7
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/index.html b/mrs_uav_managers/src/index.html new file mode 100644 index 0000000000..c277ccfca6 --- /dev/null +++ b/mrs_uav_managers/src/index.html @@ -0,0 +1,132 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/srcHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:1246171872.5 %
    Date:2024-04-18 23:11:36Functions:647387.7 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    constraint_manager.cpp +
    84.1%84.1%
    +
    84.1 %195 / 232100.0 %8 / 8
    gain_manager.cpp +
    86.8%86.8%
    +
    86.8 %224 / 258100.0 %7 / 7
    null_tracker.cpp +
    69.5%69.5%
    +
    69.5 %41 / 5955.0 %11 / 20
    uav_manager.cpp +
    67.2%67.2%
    +
    67.2 %786 / 1169100.0 %38 / 38
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/null_tracker.cpp.func-sort-c.html b/mrs_uav_managers/src/null_tracker.cpp.func-sort-c.html new file mode 100644 index 0000000000..9224d45b8f --- /dev/null +++ b/mrs_uav_managers/src/null_tracker.cpp.func-sort-c.html @@ -0,0 +1,160 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/null_tracker.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src - null_tracker.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:415969.5 %
    Date:2024-04-18 23:11:36Functions:112055.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_managers::NullTracker::resetStatic()0
    mrs_uav_managers::NullTracker::setReference(boost::shared_ptr<mrs_msgs::ReferenceSrvRequest_<std::allocator<void> > const> const&)0
    mrs_uav_managers::NullTracker::gotoTrajectoryStart(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_managers::NullTracker::setVelocityReference(boost::shared_ptr<mrs_msgs::VelocityReferenceSrvRequest_<std::allocator<void> > const> const&)0
    mrs_uav_managers::NullTracker::switchOdometrySource(mrs_msgs::UavState_<std::allocator<void> > const&)0
    mrs_uav_managers::NullTracker::stopTrajectoryTracking(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_managers::NullTracker::startTrajectoryTracking(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_managers::NullTracker::resumeTrajectoryTracking(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_managers::NullTracker::hover(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_managers::NullTracker::setTrajectoryReference(boost::shared_ptr<mrs_msgs::TrajectoryReferenceSrvRequest_<std::allocator<void> > const> const&)4
    (anonymous namespace)::ProxyExec0::ProxyExec0()91
    mrs_uav_managers::NullTracker::initialize(ros::NodeHandle const&, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t>, std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t>)91
    mrs_uav_managers::NullTracker::~NullTracker()91
    mrs_uav_managers::NullTracker::~NullTracker().291
    mrs_uav_managers::NullTracker::deactivate()205
    mrs_uav_managers::NullTracker::activate[abi:cxx11](std::optional<mrs_msgs::TrackerCommand_<std::allocator<void> > > const&)209
    mrs_uav_managers::NullTracker::setConstraints(boost::shared_ptr<mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> > const> const&)298
    mrs_uav_managers::NullTracker::enableCallbacks(boost::shared_ptr<std_srvs::SetBoolRequest_<std::allocator<void> > const> const&)313
    mrs_uav_managers::NullTracker::getStatus()6424
    mrs_uav_managers::NullTracker::update(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_uav_managers::Controller::ControlOutput const&)120314
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/null_tracker.cpp.func.html b/mrs_uav_managers/src/null_tracker.cpp.func.html new file mode 100644 index 0000000000..d7031c627d --- /dev/null +++ b/mrs_uav_managers/src/null_tracker.cpp.func.html @@ -0,0 +1,160 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/null_tracker.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src - null_tracker.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:415969.5 %
    Date:2024-04-18 23:11:36Functions:112055.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    (anonymous namespace)::ProxyExec0::ProxyExec0()91
    mrs_uav_managers::NullTracker::deactivate()205
    mrs_uav_managers::NullTracker::initialize(ros::NodeHandle const&, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t>, std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t>)91
    mrs_uav_managers::NullTracker::resetStatic()0
    mrs_uav_managers::NullTracker::setReference(boost::shared_ptr<mrs_msgs::ReferenceSrvRequest_<std::allocator<void> > const> const&)0
    mrs_uav_managers::NullTracker::setConstraints(boost::shared_ptr<mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> > const> const&)298
    mrs_uav_managers::NullTracker::enableCallbacks(boost::shared_ptr<std_srvs::SetBoolRequest_<std::allocator<void> > const> const&)313
    mrs_uav_managers::NullTracker::gotoTrajectoryStart(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_managers::NullTracker::setVelocityReference(boost::shared_ptr<mrs_msgs::VelocityReferenceSrvRequest_<std::allocator<void> > const> const&)0
    mrs_uav_managers::NullTracker::switchOdometrySource(mrs_msgs::UavState_<std::allocator<void> > const&)0
    mrs_uav_managers::NullTracker::setTrajectoryReference(boost::shared_ptr<mrs_msgs::TrajectoryReferenceSrvRequest_<std::allocator<void> > const> const&)4
    mrs_uav_managers::NullTracker::stopTrajectoryTracking(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_managers::NullTracker::startTrajectoryTracking(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_managers::NullTracker::resumeTrajectoryTracking(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_managers::NullTracker::hover(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_managers::NullTracker::update(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_uav_managers::Controller::ControlOutput const&)120314
    mrs_uav_managers::NullTracker::activate[abi:cxx11](std::optional<mrs_msgs::TrackerCommand_<std::allocator<void> > > const&)209
    mrs_uav_managers::NullTracker::getStatus()6424
    mrs_uav_managers::NullTracker::~NullTracker()91
    mrs_uav_managers::NullTracker::~NullTracker().291
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/null_tracker.cpp.gcov.frameset.html b/mrs_uav_managers/src/null_tracker.cpp.gcov.frameset.html new file mode 100644 index 0000000000..a33b57e8c3 --- /dev/null +++ b/mrs_uav_managers/src/null_tracker.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/null_tracker.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_managers/src/null_tracker.cpp.gcov.html b/mrs_uav_managers/src/null_tracker.cpp.gcov.html new file mode 100644 index 0000000000..7e404dfce3 --- /dev/null +++ b/mrs_uav_managers/src/null_tracker.cpp.gcov.html @@ -0,0 +1,332 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/null_tracker.cpp + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src - null_tracker.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:415969.5 %
    Date:2024-04-18 23:11:36Functions:112055.0 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #include <ros/ros.h>
    +       2             : 
    +       3             : #include <mrs_uav_managers/tracker.h>
    +       4             : 
    +       5             : namespace mrs_uav_managers
    +       6             : {
    +       7             : 
    +       8             : /* //{ class NullTracker */
    +       9             : 
    +      10             : class NullTracker : public mrs_uav_managers::Tracker {
    +      11             : 
    +      12             : public:
    +      13         182 :   ~NullTracker(){};
    +      14             : 
    +      15             :   bool initialize(const ros::NodeHandle &parent_nh, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t> common_handlers,
    +      16             :                   std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t> private_handlers);
    +      17             : 
    +      18             :   std::tuple<bool, std::string> activate([[maybe_unused]] const std::optional<mrs_msgs::TrackerCommand> &last_tracker_cmd);
    +      19             :   void                          deactivate(void);
    +      20             :   bool                          resetStatic(void);
    +      21             : 
    +      22             :   std::optional<mrs_msgs::TrackerCommand>   update(const mrs_msgs::UavState &uav_state, const Controller::ControlOutput &last_control_output);
    +      23             :   const mrs_msgs::TrackerStatus             getStatus();
    +      24             :   const std_srvs::SetBoolResponse::ConstPtr enableCallbacks(const std_srvs::SetBoolRequest::ConstPtr &cmd);
    +      25             :   const std_srvs::TriggerResponse::ConstPtr switchOdometrySource(const mrs_msgs::UavState &new_uav_state);
    +      26             : 
    +      27             :   const mrs_msgs::ReferenceSrvResponse::ConstPtr           setReference(const mrs_msgs::ReferenceSrvRequest::ConstPtr &cmd);
    +      28             :   const mrs_msgs::VelocityReferenceSrvResponse::ConstPtr   setVelocityReference(const mrs_msgs::VelocityReferenceSrvRequest::ConstPtr &cmd);
    +      29             :   const mrs_msgs::TrajectoryReferenceSrvResponse::ConstPtr setTrajectoryReference(const mrs_msgs::TrajectoryReferenceSrvRequest::ConstPtr &cmd);
    +      30             : 
    +      31             :   const std_srvs::TriggerResponse::ConstPtr hover(const std_srvs::TriggerRequest::ConstPtr &cmd);
    +      32             :   const std_srvs::TriggerResponse::ConstPtr startTrajectoryTracking(const std_srvs::TriggerRequest::ConstPtr &cmd);
    +      33             :   const std_srvs::TriggerResponse::ConstPtr stopTrajectoryTracking(const std_srvs::TriggerRequest::ConstPtr &cmd);
    +      34             :   const std_srvs::TriggerResponse::ConstPtr resumeTrajectoryTracking(const std_srvs::TriggerRequest::ConstPtr &cmd);
    +      35             :   const std_srvs::TriggerResponse::ConstPtr gotoTrajectoryStart(const std_srvs::TriggerRequest::ConstPtr &cmd);
    +      36             : 
    +      37             :   const mrs_msgs::DynamicsConstraintsSrvResponse::ConstPtr setConstraints(const mrs_msgs::DynamicsConstraintsSrvRequest::ConstPtr &cmd);
    +      38             : 
    +      39             : private:
    +      40             :   ros::NodeHandle nh_;
    +      41             :   bool            is_active         = false;
    +      42             :   bool            is_initialized    = false;
    +      43             :   bool            callbacks_enabled = false;
    +      44             : 
    +      45             :   std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t> common_handlers;
    +      46             : };
    +      47             : 
    +      48             : //}
    +      49             : 
    +      50             : // | ------------------- trackers interface ------------------- |
    +      51             : 
    +      52             : /* //{ initialize() */
    +      53             : 
    +      54          91 : bool NullTracker::initialize(const ros::NodeHandle &                                                                parent_nh,
    +      55             :                              [[maybe_unused]] std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t>  common_handlers,
    +      56             :                              [[maybe_unused]] std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t> private_handlers) {
    +      57             : 
    +      58         182 :   ros::NodeHandle nh_(parent_nh, "null_tracker");
    +      59             : 
    +      60          91 :   ros::Time::waitForValid();
    +      61             : 
    +      62          91 :   is_initialized = true;
    +      63             : 
    +      64          91 :   this->common_handlers = common_handlers;
    +      65             : 
    +      66          91 :   ROS_INFO("[NullTracker]: initialized");
    +      67             : 
    +      68         182 :   return true;
    +      69             : }
    +      70             : 
    +      71             : //}
    +      72             : 
    +      73             : /* //{ activate() */
    +      74             : 
    +      75         209 : std::tuple<bool, std::string> NullTracker::activate([[maybe_unused]] const std::optional<mrs_msgs::TrackerCommand> &last_tracker_cmd) {
    +      76             : 
    +      77         209 :   std::stringstream ss;
    +      78         209 :   ss << "activated";
    +      79             : 
    +      80         209 :   ROS_INFO_STREAM("[NullTracker]: " << ss.str());
    +      81         209 :   is_active = true;
    +      82             : 
    +      83         418 :   return std::tuple(true, ss.str());
    +      84             : }
    +      85             : 
    +      86             : //}
    +      87             : 
    +      88             : /* //{ deactivate() */
    +      89             : 
    +      90         205 : void NullTracker::deactivate(void) {
    +      91             : 
    +      92         205 :   ROS_INFO("[NullTracker]: deactivated");
    +      93         205 :   is_active = false;
    +      94         205 : }
    +      95             : 
    +      96             : //}
    +      97             : 
    +      98             : /* //{ resetStatic() */
    +      99             : 
    +     100           0 : bool NullTracker::resetStatic(void) {
    +     101           0 :   return false;
    +     102             : }
    +     103             : 
    +     104             : //}
    +     105             : 
    +     106             : /* switchOdometrySource() //{ */
    +     107             : 
    +     108           0 : const std_srvs::TriggerResponse::ConstPtr NullTracker::switchOdometrySource([[maybe_unused]] const mrs_msgs::UavState &new_uav_state) {
    +     109           0 :   return std_srvs::TriggerResponse::Ptr();
    +     110             : }
    +     111             : 
    +     112             : //}
    +     113             : 
    +     114             : /* //{ update() */
    +     115             : 
    +     116      120314 : std::optional<mrs_msgs::TrackerCommand> NullTracker::update([[maybe_unused]] const mrs_msgs::UavState &       uav_state,
    +     117             :                                                             [[maybe_unused]] const Controller::ControlOutput &last_control_output) {
    +     118             : 
    +     119      120314 :   return {};
    +     120             : }
    +     121             : 
    +     122             : //}
    +     123             : 
    +     124             : /* //{ getStatus() */
    +     125             : 
    +     126        6424 : const mrs_msgs::TrackerStatus NullTracker::getStatus() {
    +     127             : 
    +     128        6424 :   mrs_msgs::TrackerStatus tracker_status;
    +     129             : 
    +     130        6424 :   tracker_status.active            = is_active;
    +     131        6424 :   tracker_status.callbacks_enabled = callbacks_enabled;
    +     132             : 
    +     133        6424 :   return tracker_status;
    +     134             : }
    +     135             : 
    +     136             : //}
    +     137             : 
    +     138             : /* //{ enableCallbacks() */
    +     139             : 
    +     140         313 : const std_srvs::SetBoolResponse::ConstPtr NullTracker::enableCallbacks(const std_srvs::SetBoolRequest::ConstPtr &cmd) {
    +     141             : 
    +     142         626 :   std_srvs::SetBoolResponse res;
    +     143             : 
    +     144         313 :   std::stringstream ss;
    +     145             : 
    +     146         313 :   if (cmd->data != callbacks_enabled) {
    +     147             : 
    +     148          12 :     callbacks_enabled = cmd->data;
    +     149             : 
    +     150          12 :     ss << "callbacks " << (callbacks_enabled ? "enabled" : "disabled");
    +     151             : 
    +     152          12 :     ROS_DEBUG_STREAM("[NullTracker]: " << ss.str());
    +     153             : 
    +     154             :   } else {
    +     155             : 
    +     156         301 :     ss << "callbacks were already " << (callbacks_enabled ? "enabled" : "disabled");
    +     157             :   }
    +     158             : 
    +     159         313 :   res.message = ss.str();
    +     160         313 :   res.success = true;
    +     161             : 
    +     162         939 :   return std_srvs::SetBoolResponse::ConstPtr(std::make_unique<std_srvs::SetBoolResponse>(res));
    +     163             : }
    +     164             : 
    +     165             : //}
    +     166             : 
    +     167             : /* //{ setReference() */
    +     168             : 
    +     169           0 : const mrs_msgs::ReferenceSrvResponse::ConstPtr NullTracker::setReference([[maybe_unused]] const mrs_msgs::ReferenceSrvRequest::ConstPtr &cmd) {
    +     170           0 :   return mrs_msgs::ReferenceSrvResponse::Ptr();
    +     171             : }
    +     172             : 
    +     173             : //}
    +     174             : 
    +     175             : /* //{ setVelocityReference() */
    +     176             : 
    +     177           0 : const mrs_msgs::VelocityReferenceSrvResponse::ConstPtr NullTracker::setVelocityReference([
    +     178             :     [maybe_unused]] const mrs_msgs::VelocityReferenceSrvRequest::ConstPtr &cmd) {
    +     179           0 :   return mrs_msgs::VelocityReferenceSrvResponse::Ptr();
    +     180             : }
    +     181             : 
    +     182             : //}
    +     183             : 
    +     184             : /* //{ setTrajectoryReference() */
    +     185             : 
    +     186           4 : const mrs_msgs::TrajectoryReferenceSrvResponse::ConstPtr NullTracker::setTrajectoryReference([
    +     187             :     [maybe_unused]] const mrs_msgs::TrajectoryReferenceSrvRequest::ConstPtr &cmd) {
    +     188           4 :   return mrs_msgs::TrajectoryReferenceSrvResponse::Ptr();
    +     189             : }
    +     190             : 
    +     191             : //}
    +     192             : 
    +     193             : // | --------------------- other services --------------------- |
    +     194             : 
    +     195             : /* //{ hover() */
    +     196             : 
    +     197           0 : const std_srvs::TriggerResponse::ConstPtr NullTracker::hover([[maybe_unused]] const std_srvs::TriggerRequest::ConstPtr &cmd) {
    +     198           0 :   return std_srvs::TriggerResponse::Ptr();
    +     199             : }
    +     200             : 
    +     201             : //}
    +     202             : 
    +     203             : /* //{ startTrajectoryTracking() */
    +     204             : 
    +     205           0 : const std_srvs::TriggerResponse::ConstPtr NullTracker::startTrajectoryTracking([[maybe_unused]] const std_srvs::TriggerRequest::ConstPtr &cmd) {
    +     206           0 :   return std_srvs::TriggerResponse::Ptr();
    +     207             : }
    +     208             : 
    +     209             : //}
    +     210             : 
    +     211             : /* //{ stopTrajectoryTracking() */
    +     212             : 
    +     213           0 : const std_srvs::TriggerResponse::ConstPtr NullTracker::stopTrajectoryTracking([[maybe_unused]] const std_srvs::TriggerRequest::ConstPtr &cmd) {
    +     214           0 :   return std_srvs::TriggerResponse::Ptr();
    +     215             : }
    +     216             : 
    +     217             : //}
    +     218             : 
    +     219             : /* //{ resumeTrajectoryTracking() */
    +     220             : 
    +     221           0 : const std_srvs::TriggerResponse::ConstPtr NullTracker::resumeTrajectoryTracking([[maybe_unused]] const std_srvs::TriggerRequest::ConstPtr &cmd) {
    +     222           0 :   return std_srvs::TriggerResponse::Ptr();
    +     223             : }
    +     224             : 
    +     225             : //}
    +     226             : 
    +     227             : /* //{ gotoTrajectoryStart() */
    +     228             : 
    +     229           0 : const std_srvs::TriggerResponse::ConstPtr NullTracker::gotoTrajectoryStart([[maybe_unused]] const std_srvs::TriggerRequest::ConstPtr &cmd) {
    +     230           0 :   return std_srvs::TriggerResponse::Ptr();
    +     231             : }
    +     232             : 
    +     233             : //}
    +     234             : 
    +     235             : /* //{ setConstraints() */
    +     236             : 
    +     237         298 : const mrs_msgs::DynamicsConstraintsSrvResponse::ConstPtr NullTracker::setConstraints([
    +     238             :     [maybe_unused]] const mrs_msgs::DynamicsConstraintsSrvRequest::ConstPtr &cmd) {
    +     239             : 
    +     240         298 :   return mrs_msgs::DynamicsConstraintsSrvResponse::Ptr();
    +     241             : }
    +     242             : 
    +     243             : //}
    +     244             : 
    +     245             : }  // namespace mrs_uav_managers
    +     246             : 
    +     247             : #include <pluginlib/class_list_macros.h>
    +     248          91 : PLUGINLIB_EXPORT_CLASS(mrs_uav_managers::NullTracker, mrs_uav_managers::Tracker)
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/null_tracker.cpp.gcov.overview.html b/mrs_uav_managers/src/null_tracker.cpp.gcov.overview.html new file mode 100644 index 0000000000..2b6e65529b --- /dev/null +++ b/mrs_uav_managers/src/null_tracker.cpp.gcov.overview.html @@ -0,0 +1,82 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/null_tracker.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_managers/src/null_tracker.cpp.gcov.png b/mrs_uav_managers/src/null_tracker.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..06fdac01e3b61803906bfe6b75c9e4a898089e16 GIT binary patch literal 809 zcmV+^1J?YBP)f0Qq=z*!GdwScxVb8-emMdv2*IGgWYH=J4_C%DkOB)b=Rk+6R}LK)7M|#1w4Az#YN_`iaW( zy69s|e9wsOm0($X>zcGiUK?Cyrr)673n$;>BC;%YK@vXN>V_0hZb>E4pYBZ{d>`k; z*xUH*YrtNO*4Fe5`siH6)xoH3nTPagYy|9q4Y~tBwp`J!zPZGDOW|DSy|Q0< zy#|)h)fwaqXkDwiJ+Rv}6s4uRFqEtq$DQM*uLO0gGP`nyOC+2(Dc<9$p^?2ZY#%RN z8KLJ)rPlRtMe=+;C{d4fhtgMLU=tC5{HU+UBaj@CGJj=eO(p+kT|*wR+&GU~bU#u{ zF2t^6TN_dYWQ(8SjK03r43`=d3NHj&6g17pW_Zwdp6ww;mLvcJcj-s*Uq+nth!lJXTc(c57@>SH4DHe?Wg6skuWVI9cPFeHsrUZY`{c?}wu++^CPB zjdHf*2-%FEeA5y|z1N{bYXt9VX7+1`>DWj$k8fbzhp{15lba1GDgHrIww$ifB#t1* zcOr3=VZtRcP9NPIvp4SRIXbB<-r_c3Wm3e$;U<$J z%D0Y=y3ZbSi;-*Y1LX5FA0T0IPFwiu2XVoX^2?)4B7b?58Ixb1M + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/transform_manager + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/transform_managerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:34942981.4 %
    Date:2024-04-18 23:11:36Functions:131492.9 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    transform_manager.cpp +
    81.4%81.4%
    +
    81.4 %349 / 42992.9 %13 / 14
    <unnamed>81.4 %349 / 42992.9 %13 / 14
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/transform_manager/index-detail-sort-l.html b/mrs_uav_managers/src/transform_manager/index-detail-sort-l.html new file mode 100644 index 0000000000..92c2c34556 --- /dev/null +++ b/mrs_uav_managers/src/transform_manager/index-detail-sort-l.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/transform_manager + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/transform_managerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:34942981.4 %
    Date:2024-04-18 23:11:36Functions:131492.9 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    transform_manager.cpp +
    81.4%81.4%
    +
    81.4 %349 / 42992.9 %13 / 14
    <unnamed>81.4 %349 / 42992.9 %13 / 14
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/transform_manager/index-detail.html b/mrs_uav_managers/src/transform_manager/index-detail.html new file mode 100644 index 0000000000..006dcb4f49 --- /dev/null +++ b/mrs_uav_managers/src/transform_manager/index-detail.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/transform_manager + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/transform_managerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:34942981.4 %
    Date:2024-04-18 23:11:36Functions:131492.9 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    transform_manager.cpp +
    81.4%81.4%
    +
    81.4 %349 / 42992.9 %13 / 14
    <unnamed>81.4 %349 / 42992.9 %13 / 14
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/transform_manager/index-sort-f.html b/mrs_uav_managers/src/transform_manager/index-sort-f.html new file mode 100644 index 0000000000..7cd5a142e8 --- /dev/null +++ b/mrs_uav_managers/src/transform_manager/index-sort-f.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/transform_manager + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/transform_managerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:34942981.4 %
    Date:2024-04-18 23:11:36Functions:131492.9 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    transform_manager.cpp +
    81.4%81.4%
    +
    81.4 %349 / 42992.9 %13 / 14
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/transform_manager/index-sort-l.html b/mrs_uav_managers/src/transform_manager/index-sort-l.html new file mode 100644 index 0000000000..02ec605e51 --- /dev/null +++ b/mrs_uav_managers/src/transform_manager/index-sort-l.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/transform_manager + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/transform_managerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:34942981.4 %
    Date:2024-04-18 23:11:36Functions:131492.9 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    transform_manager.cpp +
    81.4%81.4%
    +
    81.4 %349 / 42992.9 %13 / 14
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/transform_manager/index.html b/mrs_uav_managers/src/transform_manager/index.html new file mode 100644 index 0000000000..4ff6e20c9d --- /dev/null +++ b/mrs_uav_managers/src/transform_manager/index.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/transform_manager + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/transform_managerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:34942981.4 %
    Date:2024-04-18 23:11:36Functions:131492.9 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    transform_manager.cpp +
    81.4%81.4%
    +
    81.4 %349 / 42992.9 %13 / 14
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/transform_manager/transform_manager.cpp.func-sort-c.html b/mrs_uav_managers/src/transform_manager/transform_manager.cpp.func-sort-c.html new file mode 100644 index 0000000000..2b32a088ad --- /dev/null +++ b/mrs_uav_managers/src/transform_manager/transform_manager.cpp.func-sort-c.html @@ -0,0 +1,136 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/transform_manager/transform_manager.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/transform_manager - transform_manager.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:34942981.4 %
    Date:2024-04-18 23:11:36Functions:131492.9 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_managers::transform_manager::TransformManager::getName[abi:cxx11]() const0
    mrs_uav_managers::transform_manager::TransformManager::transformRtkToFcu(geometry_msgs::PoseStamped_<std::allocator<void> > const&) const6
    (anonymous namespace)::ProxyExec0::ProxyExec0()91
    mrs_uav_managers::transform_manager::TransformManager::publishLocalTf()91
    mrs_uav_managers::transform_manager::TransformManager::onInit()91
    mrs_uav_managers::transform_manager::TransformManager::TransformManager()91
    mrs_uav_managers::transform_manager::TransformManager::getPrintName[abi:cxx11]() const1470
    mrs_uav_managers::transform_manager::TransformManager::callbackRtkGps(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>)3860
    mrs_uav_managers::transform_manager::TransformManager::callbackGnss(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>)93380
    mrs_uav_managers::transform_manager::TransformManager::callbackHeightAgl(boost::shared_ptr<mrs_msgs::Float64Stamped_<std::allocator<void> > const>)138743
    mrs_uav_managers::transform_manager::TransformManager::callbackUavState(boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const>)155204
    mrs_uav_managers::transform_manager::TransformManager::callbackAltitudeAmsl(boost::shared_ptr<mrs_msgs::HwApiAltitude_<std::allocator<void> > const>)158827
    mrs_uav_managers::transform_manager::TransformManager::publishFcuUntiltedTf(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const> const&)197161
    mrs_uav_managers::transform_manager::TransformManager::callbackHwApiOrientation(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>)197161
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/transform_manager/transform_manager.cpp.func.html b/mrs_uav_managers/src/transform_manager/transform_manager.cpp.func.html new file mode 100644 index 0000000000..7a2847c718 --- /dev/null +++ b/mrs_uav_managers/src/transform_manager/transform_manager.cpp.func.html @@ -0,0 +1,136 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/transform_manager/transform_manager.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/transform_manager - transform_manager.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:34942981.4 %
    Date:2024-04-18 23:11:36Functions:131492.9 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    (anonymous namespace)::ProxyExec0::ProxyExec0()91
    mrs_uav_managers::transform_manager::TransformManager::callbackGnss(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>)93380
    mrs_uav_managers::transform_manager::TransformManager::callbackRtkGps(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>)3860
    mrs_uav_managers::transform_manager::TransformManager::publishLocalTf()91
    mrs_uav_managers::transform_manager::TransformManager::callbackUavState(boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const>)155204
    mrs_uav_managers::transform_manager::TransformManager::callbackHeightAgl(boost::shared_ptr<mrs_msgs::Float64Stamped_<std::allocator<void> > const>)138743
    mrs_uav_managers::transform_manager::TransformManager::callbackAltitudeAmsl(boost::shared_ptr<mrs_msgs::HwApiAltitude_<std::allocator<void> > const>)158827
    mrs_uav_managers::transform_manager::TransformManager::publishFcuUntiltedTf(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const> const&)197161
    mrs_uav_managers::transform_manager::TransformManager::callbackHwApiOrientation(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>)197161
    mrs_uav_managers::transform_manager::TransformManager::onInit()91
    mrs_uav_managers::transform_manager::TransformManager::TransformManager()91
    mrs_uav_managers::transform_manager::TransformManager::getPrintName[abi:cxx11]() const1470
    mrs_uav_managers::transform_manager::TransformManager::transformRtkToFcu(geometry_msgs::PoseStamped_<std::allocator<void> > const&) const6
    mrs_uav_managers::transform_manager::TransformManager::getName[abi:cxx11]() const0
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/transform_manager/transform_manager.cpp.gcov.frameset.html b/mrs_uav_managers/src/transform_manager/transform_manager.cpp.gcov.frameset.html new file mode 100644 index 0000000000..e54ea334d2 --- /dev/null +++ b/mrs_uav_managers/src/transform_manager/transform_manager.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/transform_manager/transform_manager.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_managers/src/transform_manager/transform_manager.cpp.gcov.html b/mrs_uav_managers/src/transform_manager/transform_manager.cpp.gcov.html new file mode 100644 index 0000000000..580801cd82 --- /dev/null +++ b/mrs_uav_managers/src/transform_manager/transform_manager.cpp.gcov.html @@ -0,0 +1,1037 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/transform_manager/transform_manager.cpp + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src/transform_manager - transform_manager.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:34942981.4 %
    Date:2024-04-18 23:11:36Functions:131492.9 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : /* //{ includes */
    +       2             : 
    +       3             : #include <ros/ros.h>
    +       4             : #include <nodelet/nodelet.h>
    +       5             : 
    +       6             : #include <mrs_lib/param_loader.h>
    +       7             : #include <mrs_lib/subscribe_handler.h>
    +       8             : #include <mrs_lib/publisher_handler.h>
    +       9             : #include <mrs_lib/attitude_converter.h>
    +      10             : #include <mrs_lib/transformer.h>
    +      11             : #include <mrs_lib/transform_broadcaster.h>
    +      12             : #include <mrs_lib/gps_conversions.h>
    +      13             : 
    +      14             : #include <mrs_msgs/UavState.h>
    +      15             : #include <mrs_msgs/Float64Stamped.h>
    +      16             : #include <mrs_msgs/HwApiAltitude.h>
    +      17             : #include <mrs_msgs/RtkGps.h>
    +      18             : 
    +      19             : #include <tf2_ros/transform_broadcaster.h>
    +      20             : #include <tf2_ros/static_transform_broadcaster.h>
    +      21             : #include <geometry_msgs/TransformStamped.h>
    +      22             : 
    +      23             : #include <sensor_msgs/NavSatFix.h>
    +      24             : 
    +      25             : #include <nav_msgs/Odometry.h>
    +      26             : 
    +      27             : #include <memory>
    +      28             : #include <string>
    +      29             : 
    +      30             : #include <mrs_uav_managers/estimation_manager/support.h>
    +      31             : #include <mrs_uav_managers/estimation_manager/common_handlers.h>
    +      32             : #include <transform_manager/tf_source.h>
    +      33             : #include <transform_manager/tf_mapping_origin.h>
    +      34             : 
    +      35             : /*//}*/
    +      36             : 
    +      37             : namespace mrs_uav_managers
    +      38             : {
    +      39             : 
    +      40             : namespace transform_manager
    +      41             : {
    +      42             : 
    +      43             : /*//{ class TransformManager */
    +      44             : class TransformManager : public nodelet::Nodelet {
    +      45             : 
    +      46             :   using Support = estimation_manager::Support;
    +      47             : 
    +      48             : public:
    +      49          91 :   TransformManager() {
    +      50          91 :     ch_ = std::make_shared<estimation_manager::CommonHandlers_t>();
    +      51             : 
    +      52          91 :     ch_->nodelet_name = nodelet_name_;
    +      53          91 :     ch_->package_name = package_name_;
    +      54          91 :   }
    +      55             : 
    +      56             :   void onInit();
    +      57             :   bool is_initialized_ = false;
    +      58             : 
    +      59             :   std::string getName() const;
    +      60             : 
    +      61             :   std::string getPrintName() const;
    +      62             : 
    +      63             : private:
    +      64             :   std::string _custom_config_;
    +      65             :   std::string _platform_config_;
    +      66             :   std::string _world_config_;
    +      67             : 
    +      68             :   const std::string package_name_ = "mrs_uav_managers";
    +      69             :   const std::string nodelet_name_ = "TransformManager";
    +      70             :   const std::string name_         = "transform_manager";
    +      71             : 
    +      72             :   bool publish_fcu_untilted_tf_;
    +      73             : 
    +      74             :   std::string ns_local_origin_parent_frame_id_;
    +      75             :   std::string ns_local_origin_child_frame_id_;
    +      76             :   bool        publish_local_origin_tf_;
    +      77             : 
    +      78             :   std::string ns_stable_origin_parent_frame_id_;
    +      79             :   std::string ns_stable_origin_child_frame_id_;
    +      80             :   bool        publish_stable_origin_tf_;
    +      81             : 
    +      82             :   std::string         ns_fixed_origin_parent_frame_id_;
    +      83             :   std::string         ns_fixed_origin_child_frame_id_;
    +      84             :   bool                publish_fixed_origin_tf_;
    +      85             :   geometry_msgs::Pose pose_first_;
    +      86             :   geometry_msgs::Pose pose_fixed_;
    +      87             :   geometry_msgs::Pose pose_fixed_diff_;
    +      88             : 
    +      89             :   std::string ns_amsl_origin_parent_frame_id_;
    +      90             :   std::string ns_amsl_origin_child_frame_id_;
    +      91             :   bool        publish_amsl_origin_tf_;
    +      92             : 
    +      93             :   std::string          world_origin_units_;
    +      94             :   geometry_msgs::Point world_origin_;
    +      95             : 
    +      96             :   std::vector<std::string>               tf_source_names_, estimator_names_;
    +      97             :   std::vector<std::unique_ptr<TfSource>> tf_sources_;
    +      98             : 
    +      99             :   std::vector<std::string> utm_source_priority_list_;
    +     100             :   std::string              utm_source_name_;
    +     101             : 
    +     102             :   std::mutex mtx_broadcast_utm_origin_;
    +     103             :   std::mutex mtx_broadcast_world_origin_;
    +     104             : 
    +     105             :   ros::NodeHandle nh_;
    +     106             : 
    +     107             :   std::shared_ptr<estimation_manager::CommonHandlers_t> ch_;
    +     108             : 
    +     109             :   std::shared_ptr<mrs_lib::TransformBroadcaster> broadcaster_;
    +     110             :   tf2_ros::StaticTransformBroadcaster            static_broadcaster_;
    +     111             : 
    +     112             :   std::unique_ptr<TfMappingOrigin> tf_mapping_origin_;
    +     113             : 
    +     114             :   void timeoutCallback(const std::string& topic, const ros::Time& last_msg);
    +     115             : 
    +     116             :   mrs_lib::SubscribeHandler<mrs_msgs::UavState> sh_uav_state_;
    +     117             :   void                                          callbackUavState(const mrs_msgs::UavState::ConstPtr msg);
    +     118             :   std::string                                   first_frame_id_;
    +     119             :   std::string                                   last_frame_id_;
    +     120             :   bool                                          is_first_frame_id_set_        = false;
    +     121             :   bool                                          is_local_static_tf_published_ = false;
    +     122             : 
    +     123             :   mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped> sh_height_agl_;
    +     124             :   void                                                callbackHeightAgl(const mrs_msgs::Float64Stamped::ConstPtr msg);
    +     125             : 
    +     126             :   mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude> sh_altitude_amsl_;
    +     127             :   void                                               callbackAltitudeAmsl(const mrs_msgs::HwApiAltitude::ConstPtr msg);
    +     128             : 
    +     129             :   mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped> sh_hw_api_orientation_;
    +     130             :   void                                                        callbackHwApiOrientation(const geometry_msgs::QuaternionStamped::ConstPtr msg);
    +     131             : 
    +     132             :   mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix> sh_gnss_;
    +     133             :   void                                              callbackGnss(const sensor_msgs::NavSatFix::ConstPtr msg);
    +     134             :   std::atomic<bool>                                 got_utm_offset_ = false;
    +     135             : 
    +     136             :   mrs_lib::SubscribeHandler<mrs_msgs::RtkGps> sh_rtk_gps_;
    +     137             :   void                                        callbackRtkGps(const mrs_msgs::RtkGps::ConstPtr msg);
    +     138             : 
    +     139             :   std::optional<geometry_msgs::Pose> transformRtkToFcu(const geometry_msgs::PoseStamped& pose_in) const;
    +     140             : 
    +     141             :   void publishFcuUntiltedTf(const geometry_msgs::QuaternionStampedConstPtr& msg);
    +     142             : 
    +     143             :   void publishLocalTf();
    +     144             : };
    +     145             : /*//}*/
    +     146             : 
    +     147             : 
    +     148             : /*//{ onInit() */
    +     149          91 : void TransformManager::onInit() {
    +     150             : 
    +     151          91 :   nh_ = nodelet::Nodelet::getMTPrivateNodeHandle();
    +     152             : 
    +     153          91 :   ros::Time::waitForValid();
    +     154             : 
    +     155          91 :   ROS_INFO("[%s]: initializing", getPrintName().c_str());
    +     156             : 
    +     157          91 :   broadcaster_ = std::make_shared<mrs_lib::TransformBroadcaster>();
    +     158             : 
    +     159          91 :   ch_->transformer = std::make_shared<mrs_lib::Transformer>(nh_, getPrintName());
    +     160          91 :   ch_->transformer->retryLookupNewest(true);
    +     161             : 
    +     162         182 :   mrs_lib::ParamLoader param_loader(nh_, getPrintName());
    +     163             : 
    +     164          91 :   param_loader.loadParam("custom_config", _custom_config_);
    +     165          91 :   param_loader.loadParam("platform_config", _platform_config_);
    +     166          91 :   param_loader.loadParam("world_config", _world_config_);
    +     167             : 
    +     168          91 :   if (_custom_config_ != "") {
    +     169          91 :     param_loader.addYamlFile(_custom_config_);
    +     170             :   }
    +     171             : 
    +     172          91 :   if (_platform_config_ != "") {
    +     173          91 :     param_loader.addYamlFile(_platform_config_);
    +     174             :   }
    +     175             : 
    +     176          91 :   if (_world_config_ != "") {
    +     177          91 :     param_loader.addYamlFile(_world_config_);
    +     178             :   }
    +     179             : 
    +     180          91 :   param_loader.addYamlFileFromParam("private_config");
    +     181          91 :   param_loader.addYamlFileFromParam("public_config");
    +     182          91 :   param_loader.addYamlFileFromParam("estimators_config");
    +     183             : 
    +     184         182 :   const std::string yaml_prefix = "mrs_uav_managers/transform_manager/";
    +     185             : 
    +     186          91 :   param_loader.loadParam("uav_name", ch_->uav_name);
    +     187             : 
    +     188             :   /*//{ initialize scope timer */
    +     189          91 :   param_loader.loadParam(yaml_prefix + "scope_timer/enabled", ch_->scope_timer.enabled);
    +     190         182 :   std::string       filepath;
    +     191         182 :   const std::string time_logger_filepath = ros::package::getPath(package_name_) + "/scope_timer/transform_manager_scope_timer.txt";
    +     192          91 :   ch_->scope_timer.logger                = std::make_shared<mrs_lib::ScopeTimerLogger>(time_logger_filepath, ch_->scope_timer.enabled);
    +     193             :   /*//}*/
    +     194             : 
    +     195             :   /*//{ load world_origin parameters */
    +     196             : 
    +     197          91 :   bool   is_origin_param_ok = true;
    +     198          91 :   double world_origin_x     = 0;
    +     199          91 :   double world_origin_y     = 0;
    +     200             : 
    +     201          91 :   param_loader.loadParam("world_origin/units", world_origin_units_);
    +     202             : 
    +     203          91 :   if (Support::toLowercase(world_origin_units_) == "utm") {
    +     204             : 
    +     205           0 :     ROS_INFO("[%s]: Loading world origin in UTM units.", getPrintName().c_str());
    +     206             : 
    +     207           0 :     is_origin_param_ok &= param_loader.loadParam("world_origin/origin_x", world_origin_x);
    +     208           0 :     is_origin_param_ok &= param_loader.loadParam("world_origin/origin_y", world_origin_y);
    +     209             : 
    +     210          91 :   } else if (Support::toLowercase(world_origin_units_) == "latlon") {
    +     211             : 
    +     212          91 :     ROS_INFO("[%s]: Loading world origin in LatLon units.", getPrintName().c_str());
    +     213             : 
    +     214             :     double lat, lon;
    +     215          91 :     is_origin_param_ok &= param_loader.loadParam("world_origin/origin_x", lat);
    +     216          91 :     is_origin_param_ok &= param_loader.loadParam("world_origin/origin_y", lon);
    +     217             : 
    +     218          91 :     mrs_lib::UTM(lat, lon, &world_origin_x, &world_origin_y);
    +     219             : 
    +     220          91 :     ROS_INFO("[%s]: Converted to UTM x: %f, y: %f.", getPrintName().c_str(), world_origin_x, world_origin_y);
    +     221             : 
    +     222             :   } else {
    +     223           0 :     ROS_ERROR("[%s]: world_origin/units must be (\"UTM\"|\"LATLON\"). Got '%s'", getPrintName().c_str(), world_origin_units_.c_str());
    +     224           0 :     ros::shutdown();
    +     225             :   }
    +     226             : 
    +     227          91 :   world_origin_.x = world_origin_x;
    +     228          91 :   world_origin_.y = world_origin_y;
    +     229          91 :   world_origin_.z = 0;
    +     230             : 
    +     231          91 :   if (!is_origin_param_ok) {
    +     232           0 :     ROS_ERROR("[%s]: Could not load all mandatory parameters from world file. Please check your world file.", getPrintName().c_str());
    +     233           0 :     ros::shutdown();
    +     234             :   }
    +     235             : 
    +     236             :   /*//}*/
    +     237             : 
    +     238             :   /*//{ load local_origin parameters */
    +     239         182 :   std::string local_origin_parent_frame_id;
    +     240          91 :   param_loader.loadParam(yaml_prefix + "local_origin_tf/parent", local_origin_parent_frame_id);
    +     241          91 :   ns_local_origin_parent_frame_id_ = ch_->uav_name + "/" + local_origin_parent_frame_id;
    +     242             : 
    +     243         182 :   std::string local_origin_child_frame_id;
    +     244          91 :   param_loader.loadParam(yaml_prefix + "local_origin_tf/child", local_origin_child_frame_id);
    +     245          91 :   ns_local_origin_child_frame_id_ = ch_->uav_name + "/" + local_origin_child_frame_id;
    +     246             : 
    +     247          91 :   param_loader.loadParam(yaml_prefix + "local_origin_tf/enabled", publish_local_origin_tf_);
    +     248             :   /*//}*/
    +     249             : 
    +     250             :   /*//{ load stable_origin parameters */
    +     251         182 :   std::string stable_origin_parent_frame_id;
    +     252          91 :   param_loader.loadParam(yaml_prefix + "stable_origin_tf/parent", stable_origin_parent_frame_id);
    +     253          91 :   ns_stable_origin_parent_frame_id_ = ch_->uav_name + "/" + stable_origin_parent_frame_id;
    +     254             : 
    +     255         182 :   std::string stable_origin_child_frame_id;
    +     256          91 :   param_loader.loadParam(yaml_prefix + "stable_origin_tf/child", stable_origin_child_frame_id);
    +     257          91 :   ns_stable_origin_child_frame_id_ = ch_->uav_name + "/" + stable_origin_child_frame_id;
    +     258             : 
    +     259          91 :   param_loader.loadParam(yaml_prefix + "stable_origin_tf/enabled", publish_stable_origin_tf_);
    +     260             :   /*//}*/
    +     261             : 
    +     262             :   /*//{ load fixed_origin parameters */
    +     263         182 :   std::string fixed_origin_parent_frame_id;
    +     264          91 :   param_loader.loadParam(yaml_prefix + "fixed_origin_tf/parent", fixed_origin_parent_frame_id);
    +     265          91 :   ns_fixed_origin_parent_frame_id_ = ch_->uav_name + "/" + fixed_origin_parent_frame_id;
    +     266             : 
    +     267         182 :   std::string fixed_origin_child_frame_id;
    +     268          91 :   param_loader.loadParam(yaml_prefix + "fixed_origin_tf/child", fixed_origin_child_frame_id);
    +     269          91 :   ns_fixed_origin_child_frame_id_ = ch_->uav_name + "/" + fixed_origin_child_frame_id;
    +     270             : 
    +     271          91 :   param_loader.loadParam(yaml_prefix + "fixed_origin_tf/enabled", publish_fixed_origin_tf_);
    +     272             :   /*//}*/
    +     273             : 
    +     274             :   /*//{ load fcu_untilted parameters */
    +     275         182 :   std::string fcu_frame_id;
    +     276          91 :   param_loader.loadParam(yaml_prefix + "fcu_untilted_tf/parent", fcu_frame_id);
    +     277          91 :   ch_->frames.fcu    = fcu_frame_id;
    +     278          91 :   ch_->frames.ns_fcu = ch_->uav_name + "/" + fcu_frame_id;
    +     279             : 
    +     280         182 :   std::string fcu_untilted_frame_id;
    +     281          91 :   param_loader.loadParam(yaml_prefix + "fcu_untilted_tf/child", fcu_untilted_frame_id);
    +     282          91 :   ch_->frames.fcu_untilted    = fcu_untilted_frame_id;
    +     283          91 :   ch_->frames.ns_fcu_untilted = ch_->uav_name + "/" + fcu_untilted_frame_id;
    +     284             : 
    +     285          91 :   param_loader.loadParam(yaml_prefix + "fcu_untilted_tf/enabled", publish_fcu_untilted_tf_);
    +     286             :   /*//}*/
    +     287             : 
    +     288             :   /*//{ load amsl_origin parameters*/
    +     289         182 :   std::string amsl_parent_frame_id, amsl_child_frame_id;
    +     290          91 :   param_loader.loadParam(yaml_prefix + "altitude_amsl_tf/enabled", publish_amsl_origin_tf_);
    +     291          91 :   param_loader.loadParam(yaml_prefix + "altitude_amsl_tf/parent", amsl_parent_frame_id);
    +     292          91 :   param_loader.loadParam(yaml_prefix + "altitude_amsl_tf/child", amsl_child_frame_id);
    +     293          91 :   ch_->frames.amsl                = amsl_child_frame_id;
    +     294          91 :   ch_->frames.ns_amsl             = ch_->uav_name + "/" + amsl_child_frame_id;
    +     295          91 :   ns_amsl_origin_parent_frame_id_ = ch_->uav_name + "/" + amsl_parent_frame_id;
    +     296          91 :   ns_amsl_origin_child_frame_id_  = ch_->uav_name + "/" + amsl_child_frame_id;
    +     297             : 
    +     298             :   /*//}*/
    +     299             : 
    +     300          91 :   param_loader.loadParam(yaml_prefix + "rtk_antenna/frame_id", ch_->frames.rtk_antenna);
    +     301          91 :   ch_->frames.ns_rtk_antenna = ch_->uav_name + "/" + ch_->frames.rtk_antenna;
    +     302             : 
    +     303          91 :   param_loader.loadParam("mrs_uav_managers/estimation_manager/state_estimators", estimator_names_);
    +     304          91 :   param_loader.loadParam(yaml_prefix + "tf_sources", tf_source_names_);
    +     305             : 
    +     306          91 :   param_loader.loadParam(yaml_prefix + "utm_source_priority", utm_source_priority_list_);
    +     307         284 :   for (auto utm_source : utm_source_priority_list_) {
    +     308         283 :     if (Support::isStringInVector(utm_source, estimator_names_)) {
    +     309          90 :       ROS_INFO("[%s]: the source for utm_origin and world origin is: %s", getPrintName().c_str(), utm_source.c_str());
    +     310          90 :       utm_source_name_ = utm_source;
    +     311          90 :       break;
    +     312             :     }
    +     313             :   }
    +     314             : 
    +     315             :   /*//{ initialize tf sources */
    +     316          91 :   for (size_t i = 0; i < tf_source_names_.size(); i++) {
    +     317             : 
    +     318           0 :     const std::string tf_source_name = tf_source_names_[i];
    +     319           0 :     const bool        is_utm_source  = tf_source_name == utm_source_name_;
    +     320             : 
    +     321           0 :     ROS_INFO("[%s]: loading tf source: %s", getPrintName().c_str(), tf_source_name.c_str());
    +     322             : 
    +     323           0 :     auto source_param_loader = std::make_shared<mrs_lib::ParamLoader>(nh_, "TransformManager/" + tf_source_name);
    +     324             : 
    +     325           0 :     if (_custom_config_ != "") {
    +     326           0 :       source_param_loader->addYamlFile(_custom_config_);
    +     327             :     }
    +     328             : 
    +     329           0 :     if (_platform_config_ != "") {
    +     330           0 :       source_param_loader->addYamlFile(_platform_config_);
    +     331             :     }
    +     332             : 
    +     333           0 :     if (_world_config_ != "") {
    +     334           0 :       source_param_loader->addYamlFile(_world_config_);
    +     335             :     }
    +     336             : 
    +     337           0 :     source_param_loader->addYamlFileFromParam("private_config");
    +     338           0 :     source_param_loader->addYamlFileFromParam("public_config");
    +     339           0 :     source_param_loader->addYamlFileFromParam("estimators_config");
    +     340             : 
    +     341           0 :     tf_sources_.push_back(std::make_unique<TfSource>(tf_source_name, nh_, source_param_loader, broadcaster_, ch_, is_utm_source));
    +     342             :   }
    +     343             : 
    +     344             :   // additionally publish tf of all available estimators
    +     345         189 :   for (int i = 0; i < int(estimator_names_.size()); i++) {
    +     346             : 
    +     347         196 :     const std::string estimator_name = estimator_names_[i];
    +     348          98 :     const bool        is_utm_source  = estimator_name == utm_source_name_;
    +     349          98 :     ROS_INFO("[%s]: loading tf source of estimator: %s", getPrintName().c_str(), estimator_name.c_str());
    +     350             : 
    +     351          98 :     auto estimator_param_loader = std::make_shared<mrs_lib::ParamLoader>(nh_, "TransformManager/" + estimator_name);
    +     352             : 
    +     353          98 :     if (_custom_config_ != "") {
    +     354          98 :       estimator_param_loader->addYamlFile(_custom_config_);
    +     355             :     }
    +     356             : 
    +     357          98 :     if (_platform_config_ != "") {
    +     358          98 :       estimator_param_loader->addYamlFile(_platform_config_);
    +     359             :     }
    +     360             : 
    +     361          98 :     if (_world_config_ != "") {
    +     362          98 :       estimator_param_loader->addYamlFile(_world_config_);
    +     363             :     }
    +     364             : 
    +     365          98 :     estimator_param_loader->addYamlFileFromParam("private_config");
    +     366          98 :     estimator_param_loader->addYamlFileFromParam("public_config");
    +     367          98 :     estimator_param_loader->addYamlFileFromParam("estimators_config");
    +     368             : 
    +     369          98 :     tf_sources_.push_back(std::make_unique<TfSource>(estimator_name, nh_, estimator_param_loader, broadcaster_, ch_, is_utm_source));
    +     370             :   }
    +     371             : 
    +     372             :   // initialize mapping_origin tf
    +     373             :   bool mapping_origin_tf_enabled;
    +     374          91 :   param_loader.loadParam(yaml_prefix + "mapping_origin_tf/enabled", mapping_origin_tf_enabled, false);
    +     375             : 
    +     376          91 :   if (mapping_origin_tf_enabled) {
    +     377             : 
    +     378           0 :     auto mapping_param_loader = std::make_shared<mrs_lib::ParamLoader>(nh_, "TransformManager/mapping_origin_tf");
    +     379             : 
    +     380           0 :     if (_custom_config_ != "") {
    +     381           0 :       mapping_param_loader->addYamlFile(_custom_config_);
    +     382             :     }
    +     383             : 
    +     384           0 :     if (_platform_config_ != "") {
    +     385           0 :       mapping_param_loader->addYamlFile(_platform_config_);
    +     386             :     }
    +     387             : 
    +     388           0 :     if (_world_config_ != "") {
    +     389           0 :       mapping_param_loader->addYamlFile(_world_config_);
    +     390             :     }
    +     391             : 
    +     392           0 :     mapping_param_loader->addYamlFileFromParam("private_config");
    +     393           0 :     mapping_param_loader->addYamlFileFromParam("public_config");
    +     394           0 :     mapping_param_loader->addYamlFileFromParam("estimators_config");
    +     395             : 
    +     396           0 :     tf_mapping_origin_ = std::make_unique<TfMappingOrigin>(nh_, mapping_param_loader, broadcaster_, ch_);
    +     397             :   }
    +     398             : 
    +     399             :   //}
    +     400             : 
    +     401             :   /*//{ initialize subscribers */
    +     402         182 :   mrs_lib::SubscribeHandlerOptions shopts;
    +     403          91 :   shopts.nh                 = nh_;
    +     404          91 :   shopts.node_name          = getPrintName();
    +     405          91 :   shopts.no_message_timeout = mrs_lib::no_timeout;
    +     406          91 :   shopts.threadsafe         = true;
    +     407          91 :   shopts.autostart          = true;
    +     408          91 :   shopts.queue_size         = 10;
    +     409          91 :   shopts.transport_hints    = ros::TransportHints().tcpNoDelay();
    +     410             : 
    +     411          91 :   sh_uav_state_ = mrs_lib::SubscribeHandler<mrs_msgs::UavState>(shopts, "uav_state_in", &TransformManager::callbackUavState, this);
    +     412             : 
    +     413          91 :   sh_height_agl_ = mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped>(shopts, "height_agl_in", &TransformManager::callbackHeightAgl, this);
    +     414             : 
    +     415          91 :   sh_altitude_amsl_ = mrs_lib::SubscribeHandler<mrs_msgs::HwApiAltitude>(shopts, "altitude_amsl_in", &TransformManager::callbackAltitudeAmsl, this);
    +     416             : 
    +     417             :   sh_hw_api_orientation_ =
    +     418          91 :       mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped>(shopts, "orientation_in", &TransformManager::callbackHwApiOrientation, this);
    +     419             : 
    +     420          91 :   if (utm_source_name_ == "rtk" || utm_source_name_ == "rtk_garmin") {
    +     421           3 :     sh_rtk_gps_ = mrs_lib::SubscribeHandler<mrs_msgs::RtkGps>(shopts, "rtk_gps_in", &TransformManager::callbackRtkGps, this);
    +     422             :   } else {
    +     423          88 :     sh_gnss_ = mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix>(shopts, "gnss_in", &TransformManager::callbackGnss, this);
    +     424             :   }
    +     425             :   /*//}*/
    +     426             : 
    +     427          91 :   if (!param_loader.loadedSuccessfully()) {
    +     428           0 :     ROS_ERROR("[%s]: Could not load all non-optional parameters. Shutting down.", getPrintName().c_str());
    +     429           0 :     ros::shutdown();
    +     430             :   }
    +     431             : 
    +     432          91 :   is_initialized_ = true;
    +     433          91 :   ROS_INFO("[%s]: initialized", getPrintName().c_str());
    +     434          91 : }
    +     435             : /*//}*/
    +     436             : 
    +     437             : /*//{ callbackUavState() */
    +     438             : 
    +     439      155204 : void TransformManager::callbackUavState(const mrs_msgs::UavState::ConstPtr msg) {
    +     440             : 
    +     441      155204 :   if (!is_initialized_) {
    +     442           0 :     return;
    +     443             :   }
    +     444             : 
    +     445      310408 :   mrs_lib::ScopeTimer scope_timer = mrs_lib::ScopeTimer("TransformManager::publishFcuUntilted", ch_->scope_timer.logger, ch_->scope_timer.enabled);
    +     446             : 
    +     447             :   // obtain first frame_id
    +     448      155204 :   if (!is_first_frame_id_set_) {
    +     449          91 :     first_frame_id_                = msg->header.frame_id;
    +     450          91 :     last_frame_id_                 = msg->header.frame_id;
    +     451          91 :     pose_fixed_                    = msg->pose;
    +     452          91 :     pose_first_                    = msg->pose;
    +     453          91 :     pose_fixed_diff_.orientation.w = 1;
    +     454             : 
    +     455          91 :     is_first_frame_id_set_ = true;
    +     456             :   }
    +     457             : 
    +     458             :   // publish static tf from fixed_origin to local_origin based on the first message
    +     459      155204 :   if (publish_local_origin_tf_ && !is_local_static_tf_published_) {
    +     460          91 :     publishLocalTf();
    +     461             :   }
    +     462             : 
    +     463      155204 :   if (publish_stable_origin_tf_) {
    +     464             :     /*//{ publish stable_origin tf*/
    +     465      155204 :     geometry_msgs::TransformStamped tf_msg;
    +     466      155204 :     tf_msg.header.stamp    = msg->header.stamp;
    +     467      155204 :     tf_msg.header.frame_id = ns_stable_origin_parent_frame_id_;
    +     468      155204 :     tf_msg.child_frame_id  = ns_stable_origin_child_frame_id_;
    +     469             : 
    +     470             :     // transform pose to first frame_id
    +     471      155204 :     geometry_msgs::PoseStamped pose;
    +     472      155204 :     pose.header = msg->header;
    +     473      155204 :     pose.pose   = msg->pose;
    +     474      155204 :     if (pose.pose.orientation.w == 0 && pose.pose.orientation.z == 0 && pose.pose.orientation.y == 0 && pose.pose.orientation.x == 0) {
    +     475           0 :       ROS_WARN_ONCE("[%s]: Uninitialized quaternion detected during publishing stable_origin tf of %s. Setting w=1", getPrintName().c_str(),
    +     476             :                     pose.header.frame_id.c_str());
    +     477           0 :       pose.pose.orientation.w = 1.0;
    +     478             :     }
    +     479             : 
    +     480      155204 :     auto res = ch_->transformer->transformSingle(pose, first_frame_id_);
    +     481             : 
    +     482      155204 :     if (res) {
    +     483      155204 :       const tf2::Transform      tf       = Support::tf2FromPose(res->pose);
    +     484      155204 :       const tf2::Transform      tf_inv   = tf.inverse();
    +     485      155204 :       const geometry_msgs::Pose pose_inv = Support::poseFromTf2(tf_inv);
    +     486      155204 :       tf_msg.transform.translation       = Support::pointToVector3(pose_inv.position);
    +     487      155204 :       tf_msg.transform.rotation          = pose_inv.orientation;
    +     488             : 
    +     489      155204 :       if (Support::noNans(tf_msg)) {
    +     490             :         try {
    +     491      155204 :           broadcaster_->sendTransform(tf_msg);
    +     492             :         }
    +     493           0 :         catch (...) {
    +     494           0 :           ROS_ERROR("exception caught ");
    +     495             :         }
    +     496             :       } else {
    +     497           0 :         ROS_WARN_THROTTLE(1.0, "[%s]: NaN detected in transform from %s to %s. Not publishing tf.", getPrintName().c_str(), tf_msg.header.frame_id.c_str(),
    +     498             :                           tf_msg.child_frame_id.c_str());
    +     499             :       }
    +     500      155204 :       ROS_INFO_ONCE("[%s]: Broadcasting transform from parent frame: %s to child frame: %s", getPrintName().c_str(), tf_msg.header.frame_id.c_str(),
    +     501             :                     tf_msg.child_frame_id.c_str());
    +     502             :     } else {
    +     503           0 :       ROS_ERROR_THROTTLE(1.0, "[%s]: Could not transform pose to %s. Not publishing stable_origin transform.", getPrintName().c_str(), first_frame_id_.c_str());
    +     504           0 :       return;
    +     505             :     }
    +     506             :     /*//}*/
    +     507             :   }
    +     508             : 
    +     509      155204 :   if (publish_fixed_origin_tf_) {
    +     510             :     /*//{ publish fixed_origin tf*/
    +     511      155204 :     if (msg->header.frame_id != last_frame_id_) {
    +     512           5 :       ROS_WARN("[%s]: Detected estimator change from %s to %s. Updating offset for fixed origin.", getPrintName().c_str(), last_frame_id_.c_str(),
    +     513             :                msg->header.frame_id.c_str());
    +     514             : 
    +     515           5 :       pose_fixed_diff_ = Support::getPoseDiff(msg->pose, pose_fixed_);
    +     516             :     }
    +     517             : 
    +     518             : 
    +     519      155204 :     pose_fixed_ = Support::applyPoseDiff(msg->pose, pose_fixed_diff_);
    +     520             : 
    +     521      310408 :     geometry_msgs::TransformStamped tf_msg;
    +     522      155204 :     tf_msg.header.stamp    = msg->header.stamp;
    +     523      155204 :     tf_msg.header.frame_id = ns_fixed_origin_parent_frame_id_;
    +     524      155204 :     tf_msg.child_frame_id  = ns_fixed_origin_child_frame_id_;
    +     525             : 
    +     526      155204 :     const tf2::Transform      tf       = Support::tf2FromPose(pose_fixed_);
    +     527      155204 :     const tf2::Transform      tf_inv   = tf.inverse();
    +     528      155204 :     const geometry_msgs::Pose pose_inv = Support::poseFromTf2(tf_inv);
    +     529      155204 :     tf_msg.transform.translation       = Support::pointToVector3(pose_inv.position);
    +     530      155204 :     tf_msg.transform.rotation          = pose_inv.orientation;
    +     531             : 
    +     532      155204 :     if (Support::noNans(tf_msg)) {
    +     533             :       try {
    +     534      155204 :         broadcaster_->sendTransform(tf_msg);
    +     535             :       }
    +     536           0 :       catch (...) {
    +     537           0 :         ROS_ERROR("exception caught ");
    +     538             :       }
    +     539             :     } else {
    +     540           0 :       ROS_WARN_THROTTLE(1.0, "[%s]: NaN detected in transform from %s to %s. Not publishing tf.", getPrintName().c_str(), tf_msg.header.frame_id.c_str(),
    +     541             :                         tf_msg.child_frame_id.c_str());
    +     542             :     }
    +     543      155204 :     ROS_INFO_ONCE("[%s]: Broadcasting transform from parent frame: %s to child frame: %s", getPrintName().c_str(), tf_msg.header.frame_id.c_str(),
    +     544             :                   tf_msg.child_frame_id.c_str());
    +     545             :     /*//}*/
    +     546             :   }
    +     547             : 
    +     548             :   /*//{ choose another source of utm and world tfs after estimator switch */
    +     549      155204 :   if (msg->header.frame_id != last_frame_id_) {
    +     550             : 
    +     551          10 :     const std::string last_estimator_name    = Support::frameIdToEstimatorName(last_frame_id_);
    +     552          10 :     const std::string current_estimator_name = Support::frameIdToEstimatorName(msg->header.frame_id);
    +     553             : 
    +     554           5 :     ROS_INFO("[%s]: Detected estimator switch: %s -> %s", getPrintName().c_str(), last_estimator_name.c_str(), current_estimator_name.c_str());
    +     555             : 
    +     556           5 :     bool   valid_utm_source_found = false;
    +     557             :     size_t potential_utm_source_index;
    +     558             : 
    +     559          12 :     for (size_t i = 0; i < tf_sources_.size(); i++) {
    +     560             : 
    +     561             :       // first check if tf source can publish utm origin and is not the switched-from estimator
    +     562          12 :       if (tf_sources_.at(i)->getIsUtmBased() && tf_sources_.at(i)->getName() != last_estimator_name) {
    +     563             : 
    +     564           8 :         valid_utm_source_found     = true;
    +     565           8 :         potential_utm_source_index = i;
    +     566             : 
    +     567             :         // check if switched-to estimator is utm_based, if so, use it
    +     568           8 :         if (tf_sources_.at(i)->getIsUtmBased() && tf_sources_.at(i)->getName() == current_estimator_name) {
    +     569           5 :           potential_utm_source_index = i;
    +     570           5 :           break;
    +     571             :         }
    +     572             :       }
    +     573             :     }
    +     574             : 
    +     575             : 
    +     576             :     // if we found a valid utm source, use it, otherwise stay with the switched-from estimator
    +     577           5 :     if (valid_utm_source_found) {
    +     578             : 
    +     579             :       // stop all estimators from publishing utm source
    +     580          23 :       for (size_t i = 0; i < tf_sources_.size(); i++) {
    +     581          18 :         if (tf_sources_.at(i)->getIsUtmSource()) {
    +     582           5 :           tf_sources_.at(i)->setIsUtmSource(false);
    +     583           5 :           ROS_INFO("[%s]: setting is_utm_source of estimator %s to false", getPrintName().c_str(), last_estimator_name.c_str());
    +     584             :         }
    +     585             :       }
    +     586             : 
    +     587           5 :       tf_sources_.at(potential_utm_source_index)->setIsUtmSource(true);
    +     588           5 :       ROS_INFO("[%s]: setting is_utm_source of estimator %s to true", getPrintName().c_str(), current_estimator_name.c_str());
    +     589             :     }
    +     590             :   }
    +     591             :   /*//}*/
    +     592             : 
    +     593      155204 :   last_frame_id_ = msg->header.frame_id;
    +     594             : }
    +     595             : /*//}*/
    +     596             : 
    +     597             : /*//{ callbackHeightAgl() */
    +     598             : 
    +     599      138743 : void TransformManager::callbackHeightAgl(const mrs_msgs::Float64Stamped::ConstPtr msg) {
    +     600             : 
    +     601      138743 :   if (!is_initialized_) {
    +     602           0 :     return;
    +     603             :   }
    +     604             : 
    +     605      416229 :   mrs_lib::ScopeTimer scope_timer = mrs_lib::ScopeTimer("TransformManager::callbackHeightAgl", ch_->scope_timer.logger, ch_->scope_timer.enabled);
    +     606             : 
    +     607      277486 :   geometry_msgs::TransformStamped tf_msg;
    +     608      138743 :   tf_msg.header.stamp    = msg->header.stamp;
    +     609      138743 :   tf_msg.header.frame_id = ch_->frames.ns_fcu_untilted;
    +     610      138743 :   tf_msg.child_frame_id  = msg->header.frame_id;
    +     611             : 
    +     612      138743 :   tf_msg.transform.translation.x = 0;
    +     613      138743 :   tf_msg.transform.translation.y = 0;
    +     614      138743 :   tf_msg.transform.translation.z = -msg->value;
    +     615      138743 :   tf_msg.transform.rotation.x    = 0;
    +     616      138743 :   tf_msg.transform.rotation.y    = 0;
    +     617      138743 :   tf_msg.transform.rotation.z    = 0;
    +     618      138743 :   tf_msg.transform.rotation.w    = 1;
    +     619             : 
    +     620      138743 :   if (Support::noNans(tf_msg)) {
    +     621             :     try {
    +     622      138743 :       broadcaster_->sendTransform(tf_msg);
    +     623             :     }
    +     624           0 :     catch (...) {
    +     625           0 :       ROS_ERROR("exception caught ");
    +     626             :     }
    +     627             :   } else {
    +     628           0 :     ROS_WARN_THROTTLE(1.0, "[%s]: NaN detected in transform from %s to %s. Not publishing tf.", getPrintName().c_str(), tf_msg.header.frame_id.c_str(),
    +     629             :                       tf_msg.child_frame_id.c_str());
    +     630             :   }
    +     631      138743 :   ROS_INFO_ONCE("[%s]: Broadcasting transform from parent frame: %s to child frame: %s", getPrintName().c_str(), tf_msg.header.frame_id.c_str(),
    +     632             :                 tf_msg.child_frame_id.c_str());
    +     633             : }
    +     634             : /*//}*/
    +     635             : 
    +     636             : /*//{ callbackAltitudeAmsl() */
    +     637             : 
    +     638      158827 : void TransformManager::callbackAltitudeAmsl(const mrs_msgs::HwApiAltitude::ConstPtr msg) {
    +     639             : 
    +     640      158827 :   if (!is_initialized_) {
    +     641           0 :     return;
    +     642             :   }
    +     643             : 
    +     644      476481 :   mrs_lib::ScopeTimer scope_timer = mrs_lib::ScopeTimer("TransformManager::callbackAltitudeAmsl", ch_->scope_timer.logger, ch_->scope_timer.enabled);
    +     645             : 
    +     646      317654 :   geometry_msgs::TransformStamped tf_msg;
    +     647      158827 :   tf_msg.header.stamp    = msg->stamp;
    +     648      158827 :   tf_msg.header.frame_id = ch_->frames.ns_fcu_untilted;
    +     649      158827 :   tf_msg.child_frame_id  = ch_->frames.ns_amsl;
    +     650             : 
    +     651      158827 :   tf_msg.transform.translation.x = 0;
    +     652      158827 :   tf_msg.transform.translation.y = 0;
    +     653      158827 :   tf_msg.transform.translation.z = -msg->amsl;
    +     654      158827 :   tf_msg.transform.rotation.x    = 0;
    +     655      158827 :   tf_msg.transform.rotation.y    = 0;
    +     656      158827 :   tf_msg.transform.rotation.z    = 0;
    +     657      158827 :   tf_msg.transform.rotation.w    = 1;
    +     658             : 
    +     659      158827 :   if (Support::noNans(tf_msg)) {
    +     660             :     try {
    +     661      158786 :       broadcaster_->sendTransform(tf_msg);
    +     662             :     }
    +     663           0 :     catch (...) {
    +     664           0 :       ROS_ERROR("exception caught ");
    +     665             :     }
    +     666             :   } else {
    +     667          41 :     ROS_WARN_THROTTLE(1.0, "[%s]: NaN detected in transform from %s to %s. Not publishing tf.", getPrintName().c_str(), tf_msg.header.frame_id.c_str(),
    +     668             :                       tf_msg.child_frame_id.c_str());
    +     669             :   }
    +     670      158827 :   ROS_INFO_ONCE("[%s]: Broadcasting transform from parent frame: %s to child frame: %s", getPrintName().c_str(), tf_msg.header.frame_id.c_str(),
    +     671             :                 tf_msg.child_frame_id.c_str());
    +     672             : }
    +     673             : /*//}*/
    +     674             : 
    +     675             : /*//{ callbackHwApiOrientation() */
    +     676      197161 : void TransformManager::callbackHwApiOrientation(const geometry_msgs::QuaternionStamped::ConstPtr msg) {
    +     677             : 
    +     678      197161 :   if (!is_initialized_) {
    +     679           0 :     return;
    +     680             :   }
    +     681             : 
    +     682      591483 :   mrs_lib::ScopeTimer scope_timer = mrs_lib::ScopeTimer("TransformManager::publishFcuUntilted", ch_->scope_timer.logger, ch_->scope_timer.enabled);
    +     683             : 
    +     684      197161 :   if (publish_fcu_untilted_tf_) {
    +     685      197161 :     publishFcuUntiltedTf(msg);
    +     686             :   }
    +     687             : }
    +     688             : /*//}*/
    +     689             : 
    +     690             : /*//{ callbackGnss() */
    +     691       93380 : void TransformManager::callbackGnss(const sensor_msgs::NavSatFix::ConstPtr msg) {
    +     692             : 
    +     693       93380 :   if (!is_initialized_) {
    +     694       93292 :     return;
    +     695             :   }
    +     696             : 
    +     697       93380 :   if (got_utm_offset_) {
    +     698       93292 :     return;
    +     699             :   }
    +     700             : 
    +     701         176 :   mrs_lib::ScopeTimer scope_timer = mrs_lib::ScopeTimer("TransformManager::callbackGnss", ch_->scope_timer.logger, ch_->scope_timer.enabled);
    +     702             : 
    +     703             :   double out_x;
    +     704             :   double out_y;
    +     705             : 
    +     706          88 :   mrs_lib::UTM(msg->latitude, msg->longitude, &out_x, &out_y);
    +     707             : 
    +     708          88 :   if (!std::isfinite(out_x)) {
    +     709           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in UTM variable \"out_x\"!!!", getPrintName().c_str());
    +     710           0 :     return;
    +     711             :   }
    +     712             : 
    +     713          88 :   if (!std::isfinite(out_y)) {
    +     714           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in UTM variable \"out_y\"!!!", getPrintName().c_str());
    +     715           0 :     return;
    +     716             :   }
    +     717             : 
    +     718          88 :   geometry_msgs::Point utm_origin;
    +     719          88 :   utm_origin.x = out_x;
    +     720          88 :   utm_origin.y = out_y;
    +     721          88 :   utm_origin.z = msg->altitude;
    +     722             : 
    +     723          88 :   ROS_INFO("[%s]: utm_origin position calculated as: x: %.2f, y: %.2f, z: %.2f from GNSS", getPrintName().c_str(), utm_origin.x, utm_origin.y, utm_origin.z);
    +     724             : 
    +     725         180 :   for (size_t i = 0; i < tf_sources_.size(); i++) {
    +     726          92 :     tf_sources_[i]->setUtmOrigin(utm_origin);
    +     727          92 :     tf_sources_[i]->setWorldOrigin(world_origin_);
    +     728             :   }
    +     729          88 :   got_utm_offset_ = true;
    +     730             : }
    +     731             : /*//}*/
    +     732             : 
    +     733             : /*//{ callbackRtkGps() */
    +     734        3860 : void TransformManager::callbackRtkGps(const mrs_msgs::RtkGps::ConstPtr msg) {
    +     735             : 
    +     736        3860 :   if (!is_initialized_) {
    +     737        3857 :     return;
    +     738             :   }
    +     739             : 
    +     740        3860 :   if (got_utm_offset_) {
    +     741        3854 :     return;
    +     742             :   }
    +     743             : 
    +     744          12 :   mrs_lib::ScopeTimer scope_timer = mrs_lib::ScopeTimer("TransformManager::callbackRtkGps", ch_->scope_timer.logger, ch_->scope_timer.enabled);
    +     745             : 
    +     746             :   double out_x;
    +     747             :   double out_y;
    +     748             : 
    +     749           6 :   geometry_msgs::PoseStamped rtk_pos;
    +     750             : 
    +     751           6 :   if (!std::isfinite(msg->gps.latitude)) {
    +     752           0 :     ROS_ERROR_THROTTLE(1.0, "[%s] NaN detected in RTK variable \"msg->latitude\"!!!", getPrintName().c_str());
    +     753           0 :     return;
    +     754             :   }
    +     755             : 
    +     756           6 :   if (!std::isfinite(msg->gps.longitude)) {
    +     757           0 :     ROS_ERROR_THROTTLE(1.0, "[%s] NaN detected in RTK variable \"msg->longitude\"!!!", getPrintName().c_str());
    +     758           0 :     return;
    +     759             :   }
    +     760             : 
    +     761           6 :   if (!std::isfinite(msg->gps.altitude)) {
    +     762           0 :     ROS_ERROR_THROTTLE(1.0, "[%s] NaN detected in RTK variable \"msg->altitude\"!!!", getPrintName().c_str());
    +     763           0 :     return;
    +     764             :   }
    +     765             : 
    +     766           6 :   if (msg->fix_type.fix_type != mrs_msgs::RtkFixType::RTK_FIX) {
    +     767           0 :     ROS_INFO_THROTTLE(1.0, "[%s] %s RTK FIX", getPrintName().c_str(), Support::waiting_for_string.c_str());
    +     768           0 :     return;
    +     769             :   }
    +     770             : 
    +     771           6 :   rtk_pos.header = msg->header;
    +     772           6 :   mrs_lib::UTM(msg->gps.latitude, msg->gps.longitude, &rtk_pos.pose.position.x, &rtk_pos.pose.position.y);
    +     773           6 :   rtk_pos.pose.position.z  = msg->gps.altitude;
    +     774           6 :   rtk_pos.pose.orientation = mrs_lib::AttitudeConverter(0, 0, 0);
    +     775             : 
    +     776           6 :   rtk_pos.pose.position.x -= ch_->world_origin.x;
    +     777           6 :   rtk_pos.pose.position.y -= ch_->world_origin.y;
    +     778             : 
    +     779             : 
    +     780             :   // transform the RTK position from antenna to FCU
    +     781           6 :   auto res = transformRtkToFcu(rtk_pos);
    +     782           6 :   if (res) {
    +     783           3 :     rtk_pos.pose = res.value();
    +     784             :   } else {
    +     785           3 :     ROS_ERROR_THROTTLE(1.0, "[%s]: transform to fcu failed", getPrintName().c_str());
    +     786           3 :     return;
    +     787             :   }
    +     788             : 
    +     789           3 :   mrs_lib::UTM(msg->gps.latitude, msg->gps.longitude, &out_x, &out_y);
    +     790             : 
    +     791           3 :   if (!std::isfinite(out_x)) {
    +     792           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in UTM variable \"out_x\"!!!", getPrintName().c_str());
    +     793           0 :     return;
    +     794             :   }
    +     795             : 
    +     796           3 :   if (!std::isfinite(out_y)) {
    +     797           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in UTM variable \"out_y\"!!!", getPrintName().c_str());
    +     798           0 :     return;
    +     799             :   }
    +     800             : 
    +     801           3 :   geometry_msgs::Point utm_origin;
    +     802           3 :   utm_origin.x = out_x;
    +     803           3 :   utm_origin.y = out_y;
    +     804           3 :   utm_origin.z = msg->gps.altitude;
    +     805             : 
    +     806           3 :   ROS_INFO("[%s]: utm_origin position calculated as: x: %.2f, y: %.2f, z: %.2f from RTK msg", getPrintName().c_str(), utm_origin.x, utm_origin.y, utm_origin.z);
    +     807             : 
    +     808           9 :   for (size_t i = 0; i < tf_sources_.size(); i++) {
    +     809           6 :     tf_sources_[i]->setUtmOrigin(utm_origin);
    +     810           6 :     tf_sources_[i]->setWorldOrigin(world_origin_);
    +     811             :   }
    +     812           3 :   got_utm_offset_ = true;
    +     813             : }
    +     814             : /*//}*/
    +     815             : 
    +     816             : /*//{ publishFcuUntiltedTf() */
    +     817      197161 : void TransformManager::publishFcuUntiltedTf(const geometry_msgs::QuaternionStampedConstPtr& msg) {
    +     818             : 
    +     819      394322 :   mrs_lib::ScopeTimer scope_timer = mrs_lib::ScopeTimer("TransformManager::publishFcuUntilted", ch_->scope_timer.logger, ch_->scope_timer.enabled);
    +     820             : 
    +     821             :   double heading;
    +     822             : 
    +     823             :   try {
    +     824      197161 :     heading = mrs_lib::AttitudeConverter(msg->quaternion).getHeading();
    +     825             :   }
    +     826           0 :   catch (...) {
    +     827           0 :     ROS_ERROR("[%s]: Exception caught during getting heading", getPrintName().c_str());
    +     828           0 :     return;
    +     829             :   }
    +     830      197161 :   scope_timer.checkpoint("heading");
    +     831             : 
    +     832      197161 :   const Eigen::Matrix3d odom_pixhawk_R = mrs_lib::AttitudeConverter(msg->quaternion);
    +     833      197161 :   const Eigen::Matrix3d undo_heading_R = mrs_lib::AttitudeConverter(Eigen::AngleAxis(-heading, Eigen::Vector3d(0, 0, 1)));
    +     834             : 
    +     835      197161 :   const tf2::Quaternion q     = mrs_lib::AttitudeConverter(undo_heading_R * odom_pixhawk_R);
    +     836      197161 :   const tf2::Quaternion q_inv = q.inverse();
    +     837             : 
    +     838      197161 :   scope_timer.checkpoint("q inverse");
    +     839             : 
    +     840      197161 :   geometry_msgs::TransformStamped tf;
    +     841      197161 :   tf.header.stamp            = msg->header.stamp;  // TODO(petrlmat) ros::Time::now()?
    +     842      197161 :   tf.header.frame_id         = ch_->frames.ns_fcu;
    +     843      197161 :   tf.child_frame_id          = ch_->frames.ns_fcu_untilted;
    +     844      197161 :   tf.transform.translation.x = 0.0;
    +     845      197161 :   tf.transform.translation.y = 0.0;
    +     846      197161 :   tf.transform.translation.z = 0.0;
    +     847      197161 :   tf.transform.rotation      = mrs_lib::AttitudeConverter(q_inv);
    +     848             : 
    +     849      197161 :   scope_timer.checkpoint("tf fill");
    +     850      197161 :   if (Support::noNans(tf)) {
    +     851      197161 :     broadcaster_->sendTransform(tf);
    +     852             :   } else {
    +     853           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaN encountered in fcu_untilted tf", getPrintName().c_str());
    +     854             :   }
    +     855      197161 :   scope_timer.checkpoint("tf pub");
    +     856             : }
    +     857             : /*//}*/
    +     858             : 
    +     859             : /* publishLocalTf() //{*/
    +     860          91 : void TransformManager::publishLocalTf() {
    +     861             : 
    +     862         273 :   mrs_lib::ScopeTimer scope_timer = mrs_lib::ScopeTimer(getPrintName() + "::publishLocalTf", ch_->scope_timer.logger, ch_->scope_timer.enabled);
    +     863             : 
    +     864          91 :   geometry_msgs::TransformStamped tf_msg;
    +     865          91 :   tf_msg.header.stamp = ros::Time::now();
    +     866             : 
    +     867          91 :   tf_msg.header.frame_id       = ns_fixed_origin_child_frame_id_;
    +     868          91 :   tf_msg.child_frame_id        = ns_local_origin_child_frame_id_;
    +     869          91 :   tf_msg.transform.translation = Support::pointToVector3(pose_first_.position);
    +     870          91 :   tf_msg.transform.rotation    = pose_first_.orientation;
    +     871             : 
    +     872          91 :   if (Support::noNans(tf_msg)) {
    +     873             : 
    +     874             :     try {
    +     875          91 :       static_broadcaster_.sendTransform(tf_msg);
    +     876             :     }
    +     877           0 :     catch (...) {
    +     878           0 :       ROS_ERROR("[%s]: exception caught while publishing tf from %s to %s", getPrintName().c_str(), tf_msg.header.frame_id.c_str(),
    +     879             :                 tf_msg.child_frame_id.c_str());
    +     880             :     }
    +     881             : 
    +     882             :   } else {
    +     883           0 :     ROS_WARN_THROTTLE(1.0, "[%s]: NaN detected in transform from %s to %s. Not publishing tf.", getPrintName().c_str(), tf_msg.header.frame_id.c_str(),
    +     884             :                       tf_msg.child_frame_id.c_str());
    +     885             :   }
    +     886          91 :   ROS_INFO_ONCE("[%s]: Broadcasting transform from parent frame: %s to child frame: %s", getPrintName().c_str(), tf_msg.header.frame_id.c_str(),
    +     887             :                 tf_msg.child_frame_id.c_str());
    +     888          91 :   is_local_static_tf_published_ = true;
    +     889          91 : }
    +     890             : /*//}*/
    +     891             : 
    +     892             : /*//{ transformRtkToFcu() */
    +     893           6 : std::optional<geometry_msgs::Pose> TransformManager::transformRtkToFcu(const geometry_msgs::PoseStamped& pose_in) const {
    +     894             : 
    +     895          12 :   geometry_msgs::PoseStamped pose_tmp = pose_in;
    +     896             : 
    +     897             :   // inject current orientation into rtk pose
    +     898          12 :   auto res1 = ch_->transformer->getTransform(ch_->frames.ns_fcu_untilted, ch_->frames.ns_fcu, ros::Time::now());
    +     899           6 :   if (res1) {
    +     900           3 :     pose_tmp.pose.orientation = res1.value().transform.rotation;
    +     901             :   } else {
    +     902           3 :     ROS_ERROR_THROTTLE(1.0, "[%s]: Could not obtain transform from %s to %s.", getPrintName().c_str(), ch_->frames.ns_fcu_untilted.c_str(),
    +     903             :                        ch_->frames.ns_fcu.c_str());
    +     904           3 :     return {};
    +     905             :   }
    +     906             : 
    +     907             :   // invert tf
    +     908           3 :   tf2::Transform             tf_utm_to_antenna = Support::tf2FromPose(pose_tmp.pose);
    +     909           6 :   geometry_msgs::PoseStamped utm_in_antenna;
    +     910           3 :   utm_in_antenna.pose            = Support::poseFromTf2(tf_utm_to_antenna.inverse());
    +     911           3 :   utm_in_antenna.header.stamp    = pose_in.header.stamp;
    +     912           3 :   utm_in_antenna.header.frame_id = ch_->frames.ns_rtk_antenna;
    +     913             : 
    +     914             :   // transform to fcu
    +     915           6 :   geometry_msgs::PoseStamped utm_in_fcu;
    +     916           3 :   utm_in_fcu.header.frame_id = ch_->frames.ns_fcu;
    +     917           3 :   utm_in_fcu.header.stamp    = pose_in.header.stamp;
    +     918           6 :   auto res2                  = ch_->transformer->transformSingle(utm_in_antenna, ch_->frames.ns_fcu);
    +     919             : 
    +     920           3 :   if (res2) {
    +     921           3 :     utm_in_fcu = res2.value();
    +     922             :   } else {
    +     923           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: Could not transform RTK pose from %s to %s.", getPrintName().c_str(), utm_in_antenna.header.frame_id.c_str(),
    +     924             :                        ch_->frames.ns_fcu.c_str());
    +     925           0 :     return {};
    +     926             :   }
    +     927             : 
    +     928             :   // invert tf
    +     929           3 :   tf2::Transform      tf_fcu_to_utm = Support::tf2FromPose(utm_in_fcu.pose);
    +     930           3 :   geometry_msgs::Pose fcu_in_utm    = Support::poseFromTf2(tf_fcu_to_utm.inverse());
    +     931             : 
    +     932           3 :   return fcu_in_utm;
    +     933             : }
    +     934             : /*//}*/
    +     935             : 
    +     936             : /*//{ getName() */
    +     937           0 : std::string TransformManager::getName() const {
    +     938           0 :   return name_;
    +     939             : }
    +     940             : /*//}*/
    +     941             : 
    +     942             : /*//{ getPrintName() */
    +     943        1470 : std::string TransformManager::getPrintName() const {
    +     944        1470 :   return nodelet_name_;
    +     945             : }
    +     946             : /*//}*/
    +     947             : 
    +     948             : }  // namespace transform_manager
    +     949             : 
    +     950             : }  // namespace mrs_uav_managers
    +     951             : 
    +     952             : #include <pluginlib/class_list_macros.h>
    +     953          91 : PLUGINLIB_EXPORT_CLASS(mrs_uav_managers::transform_manager::TransformManager, nodelet::Nodelet)
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/transform_manager/transform_manager.cpp.gcov.overview.html b/mrs_uav_managers/src/transform_manager/transform_manager.cpp.gcov.overview.html new file mode 100644 index 0000000000..30f0c970f4 --- /dev/null +++ b/mrs_uav_managers/src/transform_manager/transform_manager.cpp.gcov.overview.html @@ -0,0 +1,259 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/transform_manager/transform_manager.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_managers/src/transform_manager/transform_manager.cpp.gcov.png b/mrs_uav_managers/src/transform_manager/transform_manager.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..857e6572c7450ea1c97cc6612967829ea96c30ff GIT binary patch literal 3375 zcmV+~4bbw5P)^F{K@mj|?d?9i{=47D z`|YgqqUK57TOxTLGo6!N8*p;p=FY zqfk{ADC*j-Ivyd$Q9MkqP;55T4D4pj6*CZlIbav-Lyb94GKu1A0yk9bWWJQOM*a%c zBj7#A3?OQNFAnm)kD1g_ov%tD82Y1dN3TKf(LHr5Imc*=B;$VH-HIF84G{u403ch~V; zyIu)g7AOy7DQ5Ud-NUnHcy~00*72w;3#SHq8OYX=0;Qe-E!XR~2Y6K%T7ew*x(g3h z5%kQUat2I?bELyHV<0>jm4%=0u0l;pXgYio)oFKW^Av$cMV_dfV_5-3rtD=RkQ*w= z*Bt%Z4K40recXpe{Wm1JY)?aa?j$Y>yB1ID`*D#c$f|C-4jkb-E!Nx1(E{8E_w*w# z9w4DH0}Uj)B6=e0tO8?$wJEsM#TvFe^tFl139Luj1~sfzA)|X-d3MxLs3W%; zkYie)hR4J+u+Lo-v6={N+ecBy*$JK(og^*@2AMxz-QhjV`_|vG5J+oPmj;mx$KUWJ(cGhKlwyIeum9q7@{I32<3#gLfnSm_U^8(O9!+95HkJySyq{~#v;gref^R8D6>wy-??=CcjWjT z*QfTiQU_~a7w61nm#j&V(FO$U6FBUweT@;6V)La0(uAU{6cd%LhN}X6u-vHI`vTg$T)XmsI;xda>-d9#7uInLJBsABIz9>Tf;y@N zuvT$TD=J_+PWu0_iZ9GtM#n$mn>&acjG{Eh&oBt0pCRl z&*sV0iEbhvG=he+fE z$nf!wpo@O=v}fxa*gSTo-F#3ugxx-}z~dz^T<{7h6q393pE^QSX;|=~|^+ z5LRRox41ndX^%av3)Y`1$)+{qUYgXPiIip`qb^54W5-Ol#TMJ|SZKn``lGpPp)6eF zlkUyUU1>YOe+l2w%Gn)RAq6m1$1_ z;%4&gf3yfqHfY5>$>hd(3JfURCdeP)Ya`ql-uh* z_Z1JcsP3kcwj5u~IkNUoDerXk@gf|4pdkgy+Bjx_xaXp3VYeV=i_d5|L;8lE1~ex& z<0d?dEASKcde-WqJg{E(>^%X|vT)JFnJgRz zDi*GmBg=a6lT_78)}z_ARq2bm4QQ}%(H2&P2ijr)51WO15IZAUI1e<@uy=dX^ zj*nvDJnOD;9lEcm8ntjBqDlIunn>ShK5qHKmE>*?!3#-OunaNH%4if0~OX3LUpINqd6lFXOB)vc^^CDVoc~=eo^IZlSR;x8Re8NP|~^kjfG?#YZ1P zaA{)G6=@V=?mB6QhD(@l4ZsuPJ-ON79=|bdr~7d+CV|_U&3GStB{Q&D$L$|$lD2iO zc-K`Vw@ut3=8kGA9g!qbPLN&LHefF@b_6bWIoQ>;1|qCbr}3> zK3c7=+J&!GFt=K5Io=K{!2ZTS1MH{&N>u{Iblb-Uagzcg0l!j?jib-k^+9UvL!FT-PS7O#m$p4Huu5RPll@y*# zz4X5(?)U46yWyH zpRo9lHb=nVBD%;tZ7&eesVRdvCg%V!wPQqA&I+^MfC^%ojbS|SdZ={H;{5&m_h zjII7RTq)g~x?-ym(>ToqI8#Q}UlI&fLA`t-CVg48$G9^DuR)2&deS+c{Q9zmW<6x2 zzP5HDIIfWX3da!4z&)%TcXdeYVZvHIQo3`?S2=llWJkQQ?;1V^bAI*)<}C1~v=qo% zWL=#NSK$;tyLb;B#t8pp7Bf+aVA0Tl{ef*N1 zJZIhJxqb8fRTuqOj%Q3rUS-dVY8#_HobF(w8E6U?iOE*1yN^(0D+dK`m1B&$)?rpb zJh0U)#cI{ewS)rYHU}VBd&}49b=vEW!KME|&UA3qT&~bqv!y}Ds#nF#M2~%KT(ZRK45mzzIzBcN_98%YQ=EMdys(l>Pt!002ovPDHLk FV1mqgX+Z!0 literal 0 HcmV?d00001 diff --git a/mrs_uav_managers/src/uav_manager.cpp.func-sort-c.html b/mrs_uav_managers/src/uav_manager.cpp.func-sort-c.html new file mode 100644 index 0000000000..1f4a9cc7c0 --- /dev/null +++ b/mrs_uav_managers/src/uav_manager.cpp.func-sort-c.html @@ -0,0 +1,232 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/uav_manager.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src - uav_manager.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:786116967.2 %
    Date:2024-04-18 23:11:36Functions:3838100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_managers::uav_manager::UavManager::callbackLandThere(mrs_msgs::ReferenceStampedSrvRequest_<std::allocator<void> >&, mrs_msgs::ReferenceStampedSrvResponse_<std::allocator<void> >&)1
    mrs_uav_managers::uav_manager::UavManager::elandSrv()1
    mrs_uav_managers::uav_manager::UavManager::callbackLand(std_srvs::TriggerRequest_<std::allocator<void> >&, std_srvs::TriggerResponse_<std::allocator<void> >&)2
    mrs_uav_managers::uav_manager::UavManager::callbackLandHome(std_srvs::TriggerRequest_<std::allocator<void> >&, std_srvs::TriggerResponse_<std::allocator<void> >&)2
    mrs_uav_managers::uav_manager::UavManager::callbackMinHeightCheck(std_srvs::SetBoolRequest_<std::allocator<void> >&, std_srvs::SetBoolResponse_<std::allocator<void> >&)2
    mrs_uav_managers::uav_manager::UavManager::ehoverSrv()2
    mrs_uav_managers::uav_manager::UavManager::landSrv()5
    mrs_uav_managers::uav_manager::UavManager::landImpl[abi:cxx11]()5
    mrs_uav_managers::uav_manager::UavManager::disarmSrv()7
    mrs_uav_managers::uav_manager::UavManager::landWithDescendImpl[abi:cxx11]()9
    mrs_uav_managers::uav_manager::UavManager::changeLandingState(mrs_uav_managers::uav_manager::LandingStates_t)17
    mrs_uav_managers::uav_manager::UavManager::takeoffSrv()20
    mrs_uav_managers::uav_manager::UavManager::callbackTakeoff(std_srvs::TriggerRequest_<std::allocator<void> >&, std_srvs::TriggerResponse_<std::allocator<void> >&)22
    mrs_uav_managers::uav_manager::UavManager::ungripSrv()23
    mrs_uav_managers::uav_manager::UavManager::offboardSrv(bool)64
    mrs_uav_managers::uav_manager::UavManager::midairActivationImpl[abi:cxx11]()65
    mrs_uav_managers::uav_manager::UavManager::callbackMidairActivation(std_srvs::TriggerRequest_<std::allocator<void> >&, std_srvs::TriggerResponse_<std::allocator<void> >&)65
    mrs_uav_managers::uav_manager::UavManager::timerMidairActivation(ros::TimerEvent const&)67
    mrs_uav_managers::uav_manager::UavManager::toggleControlOutput(bool const&)68
    (anonymous namespace)::ProxyExec0::ProxyExec0()91
    mrs_uav_managers::uav_manager::UavManager::initialize()91
    mrs_uav_managers::uav_manager::UavManager::preinitialize()91
    mrs_uav_managers::uav_manager::UavManager::onInit()91
    mrs_uav_managers::uav_manager::UavManager::emergencyReferenceSrv(mrs_msgs::ReferenceStamped_<std::allocator<void> > const&)94
    mrs_uav_managers::uav_manager::UavManager::timerHwApiCapabilities(ros::TimerEvent const&)94
    mrs_uav_managers::uav_manager::UavManager::setControlCallbacksSrv(bool const&)95
    mrs_uav_managers::uav_manager::UavManager::setOdometryCallbacksSrv(bool const&)110
    mrs_uav_managers::uav_manager::UavManager::switchControllerSrv(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)177
    mrs_uav_managers::uav_manager::UavManager::switchTrackerSrv(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)178
    mrs_uav_managers::uav_manager::UavManager::timerFlightTime(ros::TimerEvent const&)282
    mrs_uav_managers::uav_manager::UavManager::timerLanding(ros::TimerEvent const&)785
    mrs_uav_managers::uav_manager::UavManager::timerTakeoff(ros::TimerEvent const&)968
    mrs_uav_managers::uav_manager::UavManager::timerDiagnostics(ros::TimerEvent const&)1955
    mrs_uav_managers::uav_manager::UavManager::timerMinHeight(ros::TimerEvent const&)19621
    mrs_uav_managers::uav_manager::UavManager::timerMaxHeight(ros::TimerEvent const&)19690
    mrs_uav_managers::uav_manager::UavManager::timerMaxthrottle(ros::TimerEvent const&)49459
    mrs_uav_managers::uav_manager::UavManager::callbackHwApiGNSS(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>)93370
    mrs_uav_managers::uav_manager::UavManager::callbackOdometry(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>)155152
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/uav_manager.cpp.func.html b/mrs_uav_managers/src/uav_manager.cpp.func.html new file mode 100644 index 0000000000..1b57d65533 --- /dev/null +++ b/mrs_uav_managers/src/uav_manager.cpp.func.html @@ -0,0 +1,232 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/uav_manager.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src - uav_manager.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:786116967.2 %
    Date:2024-04-18 23:11:36Functions:3838100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    (anonymous namespace)::ProxyExec0::ProxyExec0()91
    mrs_uav_managers::uav_manager::UavManager::initialize()91
    mrs_uav_managers::uav_manager::UavManager::takeoffSrv()20
    mrs_uav_managers::uav_manager::UavManager::offboardSrv(bool)64
    mrs_uav_managers::uav_manager::UavManager::callbackLand(std_srvs::TriggerRequest_<std::allocator<void> >&, std_srvs::TriggerResponse_<std::allocator<void> >&)2
    mrs_uav_managers::uav_manager::UavManager::timerLanding(ros::TimerEvent const&)785
    mrs_uav_managers::uav_manager::UavManager::timerTakeoff(ros::TimerEvent const&)968
    mrs_uav_managers::uav_manager::UavManager::preinitialize()91
    mrs_uav_managers::uav_manager::UavManager::timerMaxHeight(ros::TimerEvent const&)19690
    mrs_uav_managers::uav_manager::UavManager::timerMinHeight(ros::TimerEvent const&)19621
    mrs_uav_managers::uav_manager::UavManager::callbackTakeoff(std_srvs::TriggerRequest_<std::allocator<void> >&, std_srvs::TriggerResponse_<std::allocator<void> >&)22
    mrs_uav_managers::uav_manager::UavManager::timerFlightTime(ros::TimerEvent const&)282
    mrs_uav_managers::uav_manager::UavManager::callbackLandHome(std_srvs::TriggerRequest_<std::allocator<void> >&, std_srvs::TriggerResponse_<std::allocator<void> >&)2
    mrs_uav_managers::uav_manager::UavManager::callbackOdometry(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>)155152
    mrs_uav_managers::uav_manager::UavManager::switchTrackerSrv(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)178
    mrs_uav_managers::uav_manager::UavManager::timerDiagnostics(ros::TimerEvent const&)1955
    mrs_uav_managers::uav_manager::UavManager::timerMaxthrottle(ros::TimerEvent const&)49459
    mrs_uav_managers::uav_manager::UavManager::callbackHwApiGNSS(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>)93370
    mrs_uav_managers::uav_manager::UavManager::callbackLandThere(mrs_msgs::ReferenceStampedSrvRequest_<std::allocator<void> >&, mrs_msgs::ReferenceStampedSrvResponse_<std::allocator<void> >&)1
    mrs_uav_managers::uav_manager::UavManager::changeLandingState(mrs_uav_managers::uav_manager::LandingStates_t)17
    mrs_uav_managers::uav_manager::UavManager::landWithDescendImpl[abi:cxx11]()9
    mrs_uav_managers::uav_manager::UavManager::switchControllerSrv(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)177
    mrs_uav_managers::uav_manager::UavManager::toggleControlOutput(bool const&)68
    mrs_uav_managers::uav_manager::UavManager::midairActivationImpl[abi:cxx11]()65
    mrs_uav_managers::uav_manager::UavManager::emergencyReferenceSrv(mrs_msgs::ReferenceStamped_<std::allocator<void> > const&)94
    mrs_uav_managers::uav_manager::UavManager::timerMidairActivation(ros::TimerEvent const&)67
    mrs_uav_managers::uav_manager::UavManager::callbackMinHeightCheck(std_srvs::SetBoolRequest_<std::allocator<void> >&, std_srvs::SetBoolResponse_<std::allocator<void> >&)2
    mrs_uav_managers::uav_manager::UavManager::setControlCallbacksSrv(bool const&)95
    mrs_uav_managers::uav_manager::UavManager::timerHwApiCapabilities(ros::TimerEvent const&)94
    mrs_uav_managers::uav_manager::UavManager::setOdometryCallbacksSrv(bool const&)110
    mrs_uav_managers::uav_manager::UavManager::callbackMidairActivation(std_srvs::TriggerRequest_<std::allocator<void> >&, std_srvs::TriggerResponse_<std::allocator<void> >&)65
    mrs_uav_managers::uav_manager::UavManager::onInit()91
    mrs_uav_managers::uav_manager::UavManager::landSrv()5
    mrs_uav_managers::uav_manager::UavManager::elandSrv()1
    mrs_uav_managers::uav_manager::UavManager::landImpl[abi:cxx11]()5
    mrs_uav_managers::uav_manager::UavManager::disarmSrv()7
    mrs_uav_managers::uav_manager::UavManager::ehoverSrv()2
    mrs_uav_managers::uav_manager::UavManager::ungripSrv()23
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/uav_manager.cpp.gcov.frameset.html b/mrs_uav_managers/src/uav_manager.cpp.gcov.frameset.html new file mode 100644 index 0000000000..f6c3894100 --- /dev/null +++ b/mrs_uav_managers/src/uav_manager.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/uav_manager.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_managers/src/uav_manager.cpp.gcov.html b/mrs_uav_managers/src/uav_manager.cpp.gcov.html new file mode 100644 index 0000000000..c66cc83026 --- /dev/null +++ b/mrs_uav_managers/src/uav_manager.cpp.gcov.html @@ -0,0 +1,2765 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/uav_manager.cpp + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_managers/src - uav_manager.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:786116967.2 %
    Date:2024-04-18 23:11:36Functions:3838100.0 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : /* includes //{ */
    +       2             : 
    +       3             : #include <ros/ros.h>
    +       4             : #include <nodelet/nodelet.h>
    +       5             : 
    +       6             : #include <std_srvs/SetBool.h>
    +       7             : #include <std_srvs/Trigger.h>
    +       8             : #include <std_msgs/String.h>
    +       9             : #include <std_msgs/Float64.h>
    +      10             : 
    +      11             : #include <geometry_msgs/Vector3Stamped.h>
    +      12             : 
    +      13             : #include <nav_msgs/Odometry.h>
    +      14             : #include <mrs_msgs/Vec1.h>
    +      15             : #include <mrs_msgs/Vec4.h>
    +      16             : #include <mrs_msgs/String.h>
    +      17             : #include <mrs_msgs/TrackerCommand.h>
    +      18             : #include <mrs_msgs/Float64Stamped.h>
    +      19             : #include <mrs_msgs/Float64.h>
    +      20             : #include <mrs_msgs/BoolStamped.h>
    +      21             : #include <mrs_msgs/ControlManagerDiagnostics.h>
    +      22             : #include <mrs_msgs/ReferenceStampedSrv.h>
    +      23             : #include <mrs_msgs/ConstraintManagerDiagnostics.h>
    +      24             : #include <mrs_msgs/GainManagerDiagnostics.h>
    +      25             : #include <mrs_msgs/UavManagerDiagnostics.h>
    +      26             : #include <mrs_msgs/EstimationDiagnostics.h>
    +      27             : #include <mrs_msgs/HwApiStatus.h>
    +      28             : #include <mrs_msgs/ControllerDiagnostics.h>
    +      29             : #include <mrs_msgs/HwApiCapabilities.h>
    +      30             : 
    +      31             : #include <sensor_msgs/NavSatFix.h>
    +      32             : 
    +      33             : #include <mrs_lib/profiler.h>
    +      34             : #include <mrs_lib/scope_timer.h>
    +      35             : #include <mrs_lib/param_loader.h>
    +      36             : #include <mrs_lib/mutex.h>
    +      37             : #include <mrs_lib/transformer.h>
    +      38             : #include <mrs_lib/attitude_converter.h>
    +      39             : #include <mrs_lib/subscribe_handler.h>
    +      40             : #include <mrs_lib/publisher_handler.h>
    +      41             : #include <mrs_lib/service_client_handler.h>
    +      42             : #include <mrs_lib/msg_extractor.h>
    +      43             : #include <mrs_lib/geometry/cyclic.h>
    +      44             : #include <mrs_lib/geometry/misc.h>
    +      45             : #include <mrs_lib/quadratic_throttle_model.h>
    +      46             : 
    +      47             : //}
    +      48             : 
    +      49             : /* using //{ */
    +      50             : 
    +      51             : using vec2_t = mrs_lib::geometry::vec_t<2>;
    +      52             : using vec3_t = mrs_lib::geometry::vec_t<3>;
    +      53             : 
    +      54             : using radians  = mrs_lib::geometry::radians;
    +      55             : using sradians = mrs_lib::geometry::sradians;
    +      56             : 
    +      57             : //}
    +      58             : 
    +      59             : namespace mrs_uav_managers
    +      60             : {
    +      61             : 
    +      62             : namespace uav_manager
    +      63             : {
    +      64             : 
    +      65             : /* //{ class UavManager */
    +      66             : 
    +      67             : // state machine
    +      68             : typedef enum
    +      69             : {
    +      70             : 
    +      71             :   IDLE_STATE,
    +      72             :   GOTO_STATE,
    +      73             :   LANDING_STATE,
    +      74             : 
    +      75             : } LandingStates_t;
    +      76             : 
    +      77             : const char* state_names[3] = {
    +      78             : 
    +      79             :     "IDLING", "GOTO", "LANDING"};
    +      80             : 
    +      81             : class UavManager : public nodelet::Nodelet {
    +      82             : 
    +      83             : private:
    +      84             :   ros::NodeHandle nh_;
    +      85             :   bool            is_initialized_ = false;
    +      86             :   std::string     _uav_name_;
    +      87             : 
    +      88             : public:
    +      89             :   std::shared_ptr<mrs_lib::Transformer> transformer_;
    +      90             : 
    +      91             : public:
    +      92             :   bool                                       scope_timer_enabled_ = false;
    +      93             :   std::shared_ptr<mrs_lib::ScopeTimerLogger> scope_timer_logger_;
    +      94             : 
    +      95             : public:
    +      96             :   virtual void onInit();
    +      97             : 
    +      98             :   // | ------------------------- HW API ------------------------- |
    +      99             : 
    +     100             :   mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities> sh_hw_api_capabilities_;
    +     101             : 
    +     102             :   // this timer will check till we already got the hardware api diagnostics
    +     103             :   // then it will trigger the initialization of the controllers and finish
    +     104             :   // the initialization of the ControlManager
    +     105             :   ros::Timer timer_hw_api_capabilities_;
    +     106             :   void       timerHwApiCapabilities(const ros::TimerEvent& event);
    +     107             : 
    +     108             :   void preinitialize(void);
    +     109             :   void initialize(void);
    +     110             : 
    +     111             :   mrs_msgs::HwApiCapabilities hw_api_capabilities_;
    +     112             : 
    +     113             :   // | ----------------------- subscribers ---------------------- |
    +     114             : 
    +     115             :   mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics>        sh_controller_diagnostics_;
    +     116             :   mrs_lib::SubscribeHandler<nav_msgs::Odometry>                     sh_odometry_;
    +     117             :   mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics>        sh_estimation_diagnostics_;
    +     118             :   mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics>    sh_control_manager_diag_;
    +     119             :   mrs_lib::SubscribeHandler<std_msgs::Float64>                      sh_mass_estimate_;
    +     120             :   mrs_lib::SubscribeHandler<std_msgs::Float64>                      sh_throttle_;
    +     121             :   mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped>               sh_height_;
    +     122             :   mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus>                  sh_hw_api_status_;
    +     123             :   mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics>       sh_gains_diag_;
    +     124             :   mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics> sh_constraints_diag_;
    +     125             :   mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix>                 sh_hw_api_gnss_;
    +     126             :   mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped>               sh_max_height_;
    +     127             :   mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand>               sh_tracker_cmd_;
    +     128             : 
    +     129             :   void callbackHwApiGNSS(const sensor_msgs::NavSatFix::ConstPtr msg);
    +     130             :   void callbackOdometry(const nav_msgs::Odometry::ConstPtr msg);
    +     131             : 
    +     132             :   // service servers
    +     133             :   ros::ServiceServer service_server_takeoff_;
    +     134             :   ros::ServiceServer service_server_land_;
    +     135             :   ros::ServiceServer service_server_land_home_;
    +     136             :   ros::ServiceServer service_server_land_there_;
    +     137             :   ros::ServiceServer service_server_midair_activation_;
    +     138             :   ros::ServiceServer service_server_min_height_check_;
    +     139             : 
    +     140             :   // service callbacks
    +     141             :   bool callbackTakeoff(std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res);
    +     142             :   bool callbackLand(std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res);
    +     143             :   bool callbackLandHome(std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res);
    +     144             :   bool callbackLandThere(mrs_msgs::ReferenceStampedSrv::Request& req, mrs_msgs::ReferenceStampedSrv::Response& res);
    +     145             : 
    +     146             :   // service clients
    +     147             :   mrs_lib::ServiceClientHandler<mrs_msgs::Vec1>                sch_takeoff_;
    +     148             :   mrs_lib::ServiceClientHandler<mrs_msgs::String>              sch_switch_tracker_;
    +     149             :   mrs_lib::ServiceClientHandler<mrs_msgs::String>              sch_switch_controller_;
    +     150             :   mrs_lib::ServiceClientHandler<std_srvs::Trigger>             sch_land_;
    +     151             :   mrs_lib::ServiceClientHandler<std_srvs::Trigger>             sch_eland_;
    +     152             :   mrs_lib::ServiceClientHandler<std_srvs::Trigger>             sch_ehover_;
    +     153             :   mrs_lib::ServiceClientHandler<std_srvs::SetBool>             sch_control_callbacks_;
    +     154             :   mrs_lib::ServiceClientHandler<mrs_msgs::ReferenceStampedSrv> sch_emergency_reference_;
    +     155             :   mrs_lib::ServiceClientHandler<std_srvs::SetBool>             sch_arm_;
    +     156             :   mrs_lib::ServiceClientHandler<std_srvs::SetBool>             sch_odometry_callbacks_;
    +     157             :   mrs_lib::ServiceClientHandler<std_srvs::Trigger>             sch_ungrip_;
    +     158             :   mrs_lib::ServiceClientHandler<std_srvs::SetBool>             sch_toggle_control_output_;
    +     159             :   mrs_lib::ServiceClientHandler<std_srvs::Trigger>             sch_offboard_;
    +     160             : 
    +     161             :   // service client wrappers
    +     162             :   bool takeoffSrv(void);
    +     163             :   bool switchTrackerSrv(const std::string& tracker);
    +     164             :   bool switchControllerSrv(const std::string& controller);
    +     165             :   bool landSrv(void);
    +     166             :   bool elandSrv(void);
    +     167             :   bool ehoverSrv(void);
    +     168             :   void disarmSrv(void);
    +     169             :   bool emergencyReferenceSrv(const mrs_msgs::ReferenceStamped& goal);
    +     170             :   void setOdometryCallbacksSrv(const bool& input);
    +     171             :   void setControlCallbacksSrv(const bool& input);
    +     172             :   void ungripSrv(void);
    +     173             :   bool toggleControlOutput(const bool& input);
    +     174             :   bool offboardSrv(const bool in);
    +     175             : 
    +     176             :   ros::Timer timer_takeoff_;
    +     177             :   ros::Timer timer_max_height_;
    +     178             :   ros::Timer timer_min_height_;
    +     179             :   ros::Timer timer_landing_;
    +     180             :   ros::Timer timer_maxthrottle_;
    +     181             :   ros::Timer timer_flighttime_;
    +     182             :   ros::Timer timer_diagnostics_;
    +     183             :   ros::Timer timer_midair_activation_;
    +     184             : 
    +     185             :   // timer callbacks
    +     186             :   void timerLanding(const ros::TimerEvent& event);
    +     187             :   void timerTakeoff(const ros::TimerEvent& event);
    +     188             :   void timerMaxHeight(const ros::TimerEvent& event);
    +     189             :   void timerMinHeight(const ros::TimerEvent& event);
    +     190             :   void timerFlightTime(const ros::TimerEvent& event);
    +     191             :   void timerMaxthrottle(const ros::TimerEvent& event);
    +     192             :   void timerDiagnostics(const ros::TimerEvent& event);
    +     193             : 
    +     194             :   // publishers
    +     195             :   mrs_lib::PublisherHandler<mrs_msgs::UavManagerDiagnostics> ph_diag_;
    +     196             : 
    +     197             :   // max height checking
    +     198             :   bool              _max_height_enabled_ = false;
    +     199             :   double            _max_height_checking_rate_;
    +     200             :   double            _max_height_offset_;
    +     201             :   std::atomic<bool> fixing_max_height_ = false;
    +     202             : 
    +     203             :   // min height checking
    +     204             :   std::atomic<bool> min_height_check_ = false;
    +     205             :   double            _min_height_checking_rate_;
    +     206             :   double            _min_height_offset_;
    +     207             :   double            _min_height_;
    +     208             :   std::atomic<bool> fixing_min_height_ = false;
    +     209             : 
    +     210             :   // mass estimation during landing
    +     211             :   double    throttle_mass_estimate_;
    +     212             :   bool      throttle_under_threshold_ = false;
    +     213             :   ros::Time throttle_mass_estimate_first_time_;
    +     214             : 
    +     215             :   // velocity during landing
    +     216             :   bool      velocity_under_threshold_ = false;
    +     217             :   ros::Time velocity_under_threshold_first_time_;
    +     218             : 
    +     219             :   bool _gain_manager_required_       = false;
    +     220             :   bool _constraint_manager_required_ = false;
    +     221             : 
    +     222             :   std::tuple<bool, std::string> landImpl(void);
    +     223             :   std::tuple<bool, std::string> landWithDescendImpl(void);
    +     224             :   std::tuple<bool, std::string> midairActivationImpl(void);
    +     225             : 
    +     226             :   // saved takeoff coordinates and allows to land there again
    +     227             :   mrs_msgs::ReferenceStamped land_there_reference_;
    +     228             :   std::mutex                 mutex_land_there_reference_;
    +     229             : 
    +     230             :   // to which height to takeoff
    +     231             :   double _takeoff_height_;
    +     232             : 
    +     233             :   std::atomic<bool> takeoff_successful_ = false;
    +     234             : 
    +     235             :   // names of important trackers
    +     236             :   std::string _null_tracker_name_;
    +     237             : 
    +     238             :   // takeoff timer
    +     239             :   double     _takeoff_timer_rate_;
    +     240             :   bool       takingoff_            = false;
    +     241             :   int        number_of_takeoffs_   = 0;
    +     242             :   double     last_mass_difference_ = 0;
    +     243             :   std::mutex mutex_last_mass_difference_;
    +     244             :   bool       waiting_for_takeoff_ = false;
    +     245             : 
    +     246             :   // after takeoff
    +     247             :   std::string _after_takeoff_tracker_name_;
    +     248             :   std::string _after_takeoff_controller_name_;
    +     249             :   std::string _takeoff_tracker_name_;
    +     250             :   std::string _takeoff_controller_name_;
    +     251             : 
    +     252             :   // Landing timer
    +     253             :   std::string _landing_tracker_name_;
    +     254             :   std::string _landing_controller_name_;
    +     255             :   double      _landing_cutoff_mass_factor_;
    +     256             :   double      _landing_cutoff_mass_timeout_;
    +     257             :   double      _landing_timer_rate_;
    +     258             :   double      _landing_descend_height_;
    +     259             :   bool        landing_ = false;
    +     260             :   double      _uav_mass_;
    +     261             :   double      _g_;
    +     262             :   double      landing_uav_mass_;
    +     263             :   bool        _landing_disarm_ = false;
    +     264             :   double      _landing_tracking_tolerance_translation_;
    +     265             :   double      _landing_tracking_tolerance_heading_;
    +     266             : 
    +     267             :   // diagnostics timer
    +     268             :   double _diagnostics_timer_rate_;
    +     269             : 
    +     270             :   mrs_lib::quadratic_throttle_model::MotorParams_t _throttle_model_;
    +     271             : 
    +     272             :   // landing state machine states
    +     273             :   LandingStates_t current_state_landing_  = IDLE_STATE;
    +     274             :   LandingStates_t previous_state_landing_ = IDLE_STATE;
    +     275             : 
    +     276             :   // timer for checking max flight time
    +     277             :   double     _flighttime_timer_rate_;
    +     278             :   double     _flighttime_max_time_;
    +     279             :   bool       _flighttime_timer_enabled_ = false;
    +     280             :   double     flighttime_                = 0;
    +     281             :   std::mutex mutex_flighttime_;
    +     282             : 
    +     283             :   // timer for checking maximum throttle
    +     284             :   bool      _maxthrottle_timer_enabled_ = false;
    +     285             :   double    _maxthrottle_timer_rate_;
    +     286             :   double    _maxthrottle_max_throttle_;
    +     287             :   double    _maxthrottle_eland_timeout_;
    +     288             :   double    _maxthrottle_ungrip_timeout_;
    +     289             :   bool      maxthrottle_above_threshold_ = false;
    +     290             :   ros::Time maxthrottle_first_time_;
    +     291             : 
    +     292             :   // profiler
    +     293             :   mrs_lib::Profiler profiler_;
    +     294             :   bool              _profiler_enabled_ = false;
    +     295             : 
    +     296             :   // midair activation
    +     297             :   void      timerMidairActivation(const ros::TimerEvent& event);
    +     298             :   bool      callbackMidairActivation(std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res);
    +     299             :   ros::Time midair_activation_started_;
    +     300             : 
    +     301             :   bool callbackMinHeightCheck(std_srvs::SetBool::Request& req, std_srvs::SetBool::Response& res);
    +     302             : 
    +     303             :   double      _midair_activation_timer_rate_;
    +     304             :   std::string _midair_activation_during_controller_;
    +     305             :   std::string _midair_activation_during_tracker_;
    +     306             :   std::string _midair_activation_after_controller_;
    +     307             :   std::string _midair_activation_after_tracker_;
    +     308             : 
    +     309             :   void changeLandingState(LandingStates_t new_state);
    +     310             : };
    +     311             : 
    +     312             : //}
    +     313             : 
    +     314             : /* onInit() //{ */
    +     315             : 
    +     316          91 : void UavManager::onInit() {
    +     317          91 :   preinitialize();
    +     318          91 : }
    +     319             : 
    +     320             : //}
    +     321             : 
    +     322             : /* preinitialize() //{ */
    +     323             : 
    +     324          91 : void UavManager::preinitialize(void) {
    +     325             : 
    +     326          91 :   nh_ = nodelet::Nodelet::getMTPrivateNodeHandle();
    +     327             : 
    +     328          91 :   ros::Time::waitForValid();
    +     329             : 
    +     330          91 :   mrs_lib::SubscribeHandlerOptions shopts;
    +     331          91 :   shopts.nh                 = nh_;
    +     332          91 :   shopts.node_name          = "UavManager";
    +     333          91 :   shopts.no_message_timeout = mrs_lib::no_timeout;
    +     334          91 :   shopts.threadsafe         = true;
    +     335          91 :   shopts.autostart          = true;
    +     336          91 :   shopts.queue_size         = 10;
    +     337          91 :   shopts.transport_hints    = ros::TransportHints().tcpNoDelay();
    +     338             : 
    +     339          91 :   sh_hw_api_capabilities_ = mrs_lib::SubscribeHandler<mrs_msgs::HwApiCapabilities>(shopts, "hw_api_capabilities_in");
    +     340             : 
    +     341          91 :   timer_hw_api_capabilities_ = nh_.createTimer(ros::Rate(1.0), &UavManager::timerHwApiCapabilities, this);
    +     342          91 : }
    +     343             : 
    +     344             : //}
    +     345             : 
    +     346             : /* initialize() //{ */
    +     347             : 
    +     348          91 : void UavManager::initialize() {
    +     349             : 
    +     350          91 :   ROS_INFO("[UavManager]: initializing");
    +     351             : 
    +     352         182 :   mrs_lib::ParamLoader param_loader(nh_, "UavManager");
    +     353             : 
    +     354         182 :   std::string custom_config_path;
    +     355         182 :   std::string platform_config_path;
    +     356         182 :   std::string world_config_path;
    +     357             : 
    +     358          91 :   param_loader.loadParam("custom_config", custom_config_path);
    +     359          91 :   param_loader.loadParam("platform_config", platform_config_path);
    +     360          91 :   param_loader.loadParam("world_config", world_config_path);
    +     361             : 
    +     362          91 :   if (custom_config_path != "") {
    +     363          91 :     param_loader.addYamlFile(custom_config_path);
    +     364             :   }
    +     365             : 
    +     366          91 :   if (platform_config_path != "") {
    +     367          91 :     param_loader.addYamlFile(platform_config_path);
    +     368             :   }
    +     369             : 
    +     370          91 :   if (world_config_path != "") {
    +     371          91 :     param_loader.addYamlFile(world_config_path);
    +     372             :   }
    +     373             : 
    +     374          91 :   param_loader.addYamlFileFromParam("private_config");
    +     375          91 :   param_loader.addYamlFileFromParam("public_config");
    +     376             : 
    +     377         182 :   const std::string yaml_prefix = "mrs_uav_managers/uav_manager/";
    +     378             : 
    +     379             :   // params passed from the launch file are not prefixed
    +     380          91 :   param_loader.loadParam("uav_name", _uav_name_);
    +     381          91 :   param_loader.loadParam("enable_profiler", _profiler_enabled_);
    +     382          91 :   param_loader.loadParam("uav_mass", _uav_mass_);
    +     383          91 :   param_loader.loadParam("g", _g_);
    +     384             : 
    +     385             :   // motor params are also not prefixed, since they are common to more nodes
    +     386          91 :   param_loader.loadParam("motor_params/n_motors", _throttle_model_.n_motors);
    +     387          91 :   param_loader.loadParam("motor_params/a", _throttle_model_.A);
    +     388          91 :   param_loader.loadParam("motor_params/b", _throttle_model_.B);
    +     389             : 
    +     390          91 :   param_loader.loadParam(yaml_prefix + "null_tracker", _null_tracker_name_);
    +     391             : 
    +     392          91 :   param_loader.loadParam(yaml_prefix + "takeoff/rate", _takeoff_timer_rate_);
    +     393          91 :   param_loader.loadParam(yaml_prefix + "takeoff/after_takeoff/tracker", _after_takeoff_tracker_name_);
    +     394          91 :   param_loader.loadParam(yaml_prefix + "takeoff/after_takeoff/controller", _after_takeoff_controller_name_);
    +     395          91 :   param_loader.loadParam(yaml_prefix + "takeoff/during_takeoff/controller", _takeoff_controller_name_);
    +     396          91 :   param_loader.loadParam(yaml_prefix + "takeoff/during_takeoff/tracker", _takeoff_tracker_name_);
    +     397          91 :   param_loader.loadParam(yaml_prefix + "takeoff/takeoff_height", _takeoff_height_);
    +     398             : 
    +     399          91 :   if (_takeoff_height_ < 0.5 || _takeoff_height_ > 10.0) {
    +     400           0 :     ROS_ERROR("[UavManager]: the takeoff height (%.2f m) has to be between 0.5 and 10 meters", _takeoff_height_);
    +     401           0 :     ros::shutdown();
    +     402             :   }
    +     403             : 
    +     404          91 :   param_loader.loadParam(yaml_prefix + "landing/rate", _landing_timer_rate_);
    +     405          91 :   param_loader.loadParam(yaml_prefix + "landing/landing_tracker", _landing_tracker_name_);
    +     406          91 :   param_loader.loadParam(yaml_prefix + "landing/landing_controller", _landing_controller_name_);
    +     407          91 :   param_loader.loadParam(yaml_prefix + "landing/landing_cutoff_mass_factor", _landing_cutoff_mass_factor_);
    +     408          91 :   param_loader.loadParam(yaml_prefix + "landing/landing_cutoff_timeout", _landing_cutoff_mass_timeout_);
    +     409          91 :   param_loader.loadParam(yaml_prefix + "landing/disarm", _landing_disarm_);
    +     410          91 :   param_loader.loadParam(yaml_prefix + "landing/descend_height", _landing_descend_height_);
    +     411          91 :   param_loader.loadParam(yaml_prefix + "landing/tracking_tolerance/translation", _landing_tracking_tolerance_translation_);
    +     412          91 :   param_loader.loadParam(yaml_prefix + "landing/tracking_tolerance/heading", _landing_tracking_tolerance_heading_);
    +     413             : 
    +     414          91 :   param_loader.loadParam(yaml_prefix + "midair_activation/rate", _midair_activation_timer_rate_);
    +     415          91 :   param_loader.loadParam(yaml_prefix + "midair_activation/during_activation/controller", _midair_activation_during_controller_);
    +     416          91 :   param_loader.loadParam(yaml_prefix + "midair_activation/during_activation/tracker", _midair_activation_during_tracker_);
    +     417          91 :   param_loader.loadParam(yaml_prefix + "midair_activation/after_activation/controller", _midair_activation_after_controller_);
    +     418          91 :   param_loader.loadParam(yaml_prefix + "midair_activation/after_activation/tracker", _midair_activation_after_tracker_);
    +     419             : 
    +     420          91 :   param_loader.loadParam(yaml_prefix + "max_height_checking/enabled", _max_height_enabled_);
    +     421          91 :   param_loader.loadParam(yaml_prefix + "max_height_checking/rate", _max_height_checking_rate_);
    +     422          91 :   param_loader.loadParam(yaml_prefix + "max_height_checking/safety_height_offset", _max_height_offset_);
    +     423             : 
    +     424             :   {
    +     425             :     bool tmp;
    +     426             : 
    +     427          91 :     param_loader.loadParam(yaml_prefix + "min_height_checking/enabled", tmp);
    +     428             : 
    +     429          91 :     min_height_check_ = tmp;
    +     430             :   }
    +     431             : 
    +     432          91 :   param_loader.loadParam(yaml_prefix + "min_height_checking/rate", _min_height_checking_rate_);
    +     433          91 :   param_loader.loadParam(yaml_prefix + "min_height_checking/safety_height_offset", _min_height_offset_);
    +     434          91 :   param_loader.loadParam(yaml_prefix + "min_height_checking/min_height", _min_height_);
    +     435             : 
    +     436          91 :   param_loader.loadParam(yaml_prefix + "require_gain_manager", _gain_manager_required_);
    +     437          91 :   param_loader.loadParam(yaml_prefix + "require_constraint_manager", _constraint_manager_required_);
    +     438             : 
    +     439          91 :   param_loader.loadParam(yaml_prefix + "flight_timer/enabled", _flighttime_timer_enabled_);
    +     440          91 :   param_loader.loadParam(yaml_prefix + "flight_timer/rate", _flighttime_timer_rate_);
    +     441          91 :   param_loader.loadParam(yaml_prefix + "flight_timer/max_time", _flighttime_max_time_);
    +     442             : 
    +     443          91 :   param_loader.loadParam(yaml_prefix + "max_throttle/enabled", _maxthrottle_timer_enabled_);
    +     444          91 :   param_loader.loadParam(yaml_prefix + "max_throttle/rate", _maxthrottle_timer_rate_);
    +     445          91 :   param_loader.loadParam(yaml_prefix + "max_throttle/max_throttle", _maxthrottle_max_throttle_);
    +     446          91 :   param_loader.loadParam(yaml_prefix + "max_throttle/eland_timeout", _maxthrottle_eland_timeout_);
    +     447          91 :   param_loader.loadParam(yaml_prefix + "max_throttle/ungrip_timeout", _maxthrottle_ungrip_timeout_);
    +     448             : 
    +     449          91 :   param_loader.loadParam(yaml_prefix + "diagnostics/rate", _diagnostics_timer_rate_);
    +     450             : 
    +     451             :   // | ------------------- scope timer logger ------------------- |
    +     452             : 
    +     453          91 :   param_loader.loadParam(yaml_prefix + "scope_timer/enabled", scope_timer_enabled_);
    +     454         273 :   const std::string scope_timer_log_filename = param_loader.loadParam2("scope_timer/log_filename", std::string(""));
    +     455          91 :   scope_timer_logger_                        = std::make_shared<mrs_lib::ScopeTimerLogger>(scope_timer_log_filename, scope_timer_enabled_);
    +     456             : 
    +     457          91 :   if (!param_loader.loadedSuccessfully()) {
    +     458           0 :     ROS_ERROR("[UavManager]: Could not load all parameters!");
    +     459           0 :     ros::shutdown();
    +     460             :   }
    +     461             : 
    +     462             :   // | --------------------- tf transformer --------------------- |
    +     463             : 
    +     464          91 :   transformer_ = std::make_shared<mrs_lib::Transformer>(nh_, "ControlManager");
    +     465          91 :   transformer_->setDefaultPrefix(_uav_name_);
    +     466          91 :   transformer_->retryLookupNewest(true);
    +     467             : 
    +     468             :   // | ----------------------- subscribers ---------------------- |
    +     469             : 
    +     470         182 :   mrs_lib::SubscribeHandlerOptions shopts;
    +     471          91 :   shopts.nh                 = nh_;
    +     472          91 :   shopts.node_name          = "UavManager";
    +     473          91 :   shopts.no_message_timeout = mrs_lib::no_timeout;
    +     474          91 :   shopts.threadsafe         = true;
    +     475          91 :   shopts.autostart          = true;
    +     476          91 :   shopts.queue_size         = 10;
    +     477          91 :   shopts.transport_hints    = ros::TransportHints().tcpNoDelay();
    +     478             : 
    +     479          91 :   sh_controller_diagnostics_ = mrs_lib::SubscribeHandler<mrs_msgs::ControllerDiagnostics>(shopts, "controller_diagnostics_in");
    +     480          91 :   sh_odometry_               = mrs_lib::SubscribeHandler<nav_msgs::Odometry>(shopts, "odometry_in", &UavManager::callbackOdometry, this);
    +     481          91 :   sh_estimation_diagnostics_ = mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics>(shopts, "odometry_diagnostics_in");
    +     482          91 :   sh_control_manager_diag_   = mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics>(shopts, "control_manager_diagnostics_in");
    +     483          91 :   sh_mass_estimate_          = mrs_lib::SubscribeHandler<std_msgs::Float64>(shopts, "mass_estimate_in");
    +     484          91 :   sh_throttle_               = mrs_lib::SubscribeHandler<std_msgs::Float64>(shopts, "throttle_in");
    +     485          91 :   sh_height_                 = mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped>(shopts, "height_in");
    +     486          91 :   sh_hw_api_status_          = mrs_lib::SubscribeHandler<mrs_msgs::HwApiStatus>(shopts, "hw_api_status_in");
    +     487          91 :   sh_gains_diag_             = mrs_lib::SubscribeHandler<mrs_msgs::GainManagerDiagnostics>(shopts, "gain_manager_diagnostics_in");
    +     488          91 :   sh_constraints_diag_       = mrs_lib::SubscribeHandler<mrs_msgs::ConstraintManagerDiagnostics>(shopts, "constraint_manager_diagnostics_in");
    +     489          91 :   sh_hw_api_gnss_            = mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix>(shopts, "hw_api_gnss_in", &UavManager::callbackHwApiGNSS, this);
    +     490          91 :   sh_max_height_             = mrs_lib::SubscribeHandler<mrs_msgs::Float64Stamped>(shopts, "max_height_in");
    +     491          91 :   sh_tracker_cmd_            = mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand>(shopts, "tracker_cmd_in");
    +     492             : 
    +     493             :   // | ----------------------- publishers ----------------------- |
    +     494             : 
    +     495          91 :   ph_diag_ = mrs_lib::PublisherHandler<mrs_msgs::UavManagerDiagnostics>(nh_, "diagnostics_out", 1);
    +     496             : 
    +     497             :   // | --------------------- service servers -------------------- |
    +     498             : 
    +     499          91 :   service_server_takeoff_           = nh_.advertiseService("takeoff_in", &UavManager::callbackTakeoff, this);
    +     500          91 :   service_server_land_              = nh_.advertiseService("land_in", &UavManager::callbackLand, this);
    +     501          91 :   service_server_land_home_         = nh_.advertiseService("land_home_in", &UavManager::callbackLandHome, this);
    +     502          91 :   service_server_land_there_        = nh_.advertiseService("land_there_in", &UavManager::callbackLandThere, this);
    +     503          91 :   service_server_midair_activation_ = nh_.advertiseService("midair_activation_in", &UavManager::callbackMidairActivation, this);
    +     504          91 :   service_server_min_height_check_  = nh_.advertiseService("enable_min_height_check_in", &UavManager::callbackMinHeightCheck, this);
    +     505             : 
    +     506             :   // | --------------------- service clients -------------------- |
    +     507             : 
    +     508          91 :   sch_takeoff_               = mrs_lib::ServiceClientHandler<mrs_msgs::Vec1>(nh_, "takeoff_out");
    +     509          91 :   sch_land_                  = mrs_lib::ServiceClientHandler<std_srvs::Trigger>(nh_, "land_out");
    +     510          91 :   sch_eland_                 = mrs_lib::ServiceClientHandler<std_srvs::Trigger>(nh_, "eland_out");
    +     511          91 :   sch_ehover_                = mrs_lib::ServiceClientHandler<std_srvs::Trigger>(nh_, "ehover_out");
    +     512          91 :   sch_switch_tracker_        = mrs_lib::ServiceClientHandler<mrs_msgs::String>(nh_, "switch_tracker_out");
    +     513          91 :   sch_switch_controller_     = mrs_lib::ServiceClientHandler<mrs_msgs::String>(nh_, "switch_controller_out");
    +     514          91 :   sch_emergency_reference_   = mrs_lib::ServiceClientHandler<mrs_msgs::ReferenceStampedSrv>(nh_, "emergency_reference_out");
    +     515          91 :   sch_control_callbacks_     = mrs_lib::ServiceClientHandler<std_srvs::SetBool>(nh_, "enable_callbacks_out");
    +     516          91 :   sch_arm_                   = mrs_lib::ServiceClientHandler<std_srvs::SetBool>(nh_, "arm_out");
    +     517          91 :   sch_odometry_callbacks_    = mrs_lib::ServiceClientHandler<std_srvs::SetBool>(nh_, "set_odometry_callbacks_out");
    +     518          91 :   sch_ungrip_                = mrs_lib::ServiceClientHandler<std_srvs::Trigger>(nh_, "ungrip_out");
    +     519          91 :   sch_toggle_control_output_ = mrs_lib::ServiceClientHandler<std_srvs::SetBool>(nh_, "toggle_control_output_out");
    +     520          91 :   sch_offboard_              = mrs_lib::ServiceClientHandler<std_srvs::Trigger>(nh_, "offboard_out");
    +     521             : 
    +     522             :   // | ---------------------- state machine --------------------- |
    +     523             : 
    +     524          91 :   current_state_landing_ = IDLE_STATE;
    +     525             : 
    +     526             :   // | ------------------------ profiler ------------------------ |
    +     527             : 
    +     528          91 :   profiler_ = mrs_lib::Profiler(nh_, "UavManager", _profiler_enabled_);
    +     529             : 
    +     530             :   // | ------------------------- timers ------------------------- |
    +     531             : 
    +     532          91 :   timer_landing_           = nh_.createTimer(ros::Rate(_landing_timer_rate_), &UavManager::timerLanding, this, false, false);
    +     533          91 :   timer_takeoff_           = nh_.createTimer(ros::Rate(_takeoff_timer_rate_), &UavManager::timerTakeoff, this, false, false);
    +     534          91 :   timer_flighttime_        = nh_.createTimer(ros::Rate(_flighttime_timer_rate_), &UavManager::timerFlightTime, this, false, false);
    +     535          91 :   timer_diagnostics_       = nh_.createTimer(ros::Rate(_diagnostics_timer_rate_), &UavManager::timerDiagnostics, this);
    +     536          91 :   timer_midair_activation_ = nh_.createTimer(ros::Rate(_midair_activation_timer_rate_), &UavManager::timerMidairActivation, this, false, false);
    +     537         182 :   timer_max_height_        = nh_.createTimer(ros::Rate(_max_height_checking_rate_), &UavManager::timerMaxHeight, this, false,
    +     538         182 :                                       _max_height_enabled_ && hw_api_capabilities_.produces_distance_sensor);
    +     539         182 :   timer_min_height_        = nh_.createTimer(ros::Rate(_min_height_checking_rate_), &UavManager::timerMinHeight, this, false,
    +     540         182 :                                       min_height_check_ && hw_api_capabilities_.produces_distance_sensor);
    +     541             : 
    +     542          88 :   bool should_check_throttle = hw_api_capabilities_.accepts_actuator_cmd || hw_api_capabilities_.accepts_control_group_cmd ||
    +     543         179 :                                hw_api_capabilities_.accepts_attitude_rate_cmd || hw_api_capabilities_.accepts_attitude_cmd;
    +     544             : 
    +     545             :   timer_maxthrottle_ =
    +     546          91 :       nh_.createTimer(ros::Rate(_maxthrottle_timer_rate_), &UavManager::timerMaxthrottle, this, false, _maxthrottle_timer_enabled_ && should_check_throttle);
    +     547             : 
    +     548             :   // | ----------------------- finish init ---------------------- |
    +     549             : 
    +     550          91 :   is_initialized_ = true;
    +     551             : 
    +     552          91 :   ROS_INFO("[UavManager]: initialized");
    +     553             : 
    +     554          91 :   ROS_DEBUG("[UavManager]: debug output is enabled");
    +     555          91 : }
    +     556             : 
    +     557             : //}
    +     558             : 
    +     559             : //}
    +     560             : 
    +     561             : // | ---------------------- state machine --------------------- |
    +     562             : 
    +     563             : /* //{ changeLandingState() */
    +     564             : 
    +     565          17 : void UavManager::changeLandingState(LandingStates_t new_state) {
    +     566             : 
    +     567          17 :   previous_state_landing_ = current_state_landing_;
    +     568          17 :   current_state_landing_  = new_state;
    +     569             : 
    +     570          17 :   switch (current_state_landing_) {
    +     571             : 
    +     572           5 :     case LANDING_STATE: {
    +     573             : 
    +     574           5 :       if (sh_mass_estimate_.hasMsg() && (ros::Time::now() - sh_mass_estimate_.lastMsgTime()).toSec() < 1.0) {
    +     575             : 
    +     576             :         // copy member variables
    +     577           5 :         auto mass_esimtate = sh_mass_estimate_.getMsg();
    +     578             : 
    +     579           5 :         landing_uav_mass_ = mass_esimtate->data;
    +     580             :       }
    +     581             : 
    +     582           5 :       break;
    +     583             :     };
    +     584             : 
    +     585          12 :     default: {
    +     586          12 :       break;
    +     587             :     }
    +     588             :   }
    +     589             : 
    +     590             :   // just for ROS_INFO
    +     591          17 :   ROS_INFO("[UavManager]: Switching landing state %s -> %s", state_names[previous_state_landing_], state_names[current_state_landing_]);
    +     592          17 : }
    +     593             : 
    +     594             : //}
    +     595             : 
    +     596             : // --------------------------------------------------------------
    +     597             : // |                           timers                           |
    +     598             : // --------------------------------------------------------------
    +     599             : 
    +     600             : /* timerHwApiCapabilities() //{ */
    +     601             : 
    +     602          94 : void UavManager::timerHwApiCapabilities(const ros::TimerEvent& event) {
    +     603             : 
    +     604         188 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("timerHwApiCapabilities", 1.0, 1.0, event);
    +     605         188 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("UavManager::timerHwApiCapabilities", scope_timer_logger_, scope_timer_enabled_);
    +     606             : 
    +     607          94 :   if (!sh_hw_api_capabilities_.hasMsg()) {
    +     608           3 :     ROS_INFO_THROTTLE(1.0, "[UavManager]: waiting for HW API capabilities");
    +     609           3 :     return;
    +     610             :   }
    +     611             : 
    +     612          91 :   hw_api_capabilities_ = *sh_hw_api_capabilities_.getMsg();
    +     613             : 
    +     614          91 :   ROS_INFO("[UavManager]: got HW API capabilities, initializing");
    +     615             : 
    +     616          91 :   initialize();
    +     617             : 
    +     618          91 :   timer_hw_api_capabilities_.stop();
    +     619             : }
    +     620             : 
    +     621             : //}
    +     622             : 
    +     623             : /* //{ timerLanding() */
    +     624             : 
    +     625         785 : void UavManager::timerLanding(const ros::TimerEvent& event) {
    +     626             : 
    +     627         785 :   if (!is_initialized_)
    +     628           0 :     return;
    +     629             : 
    +     630        1570 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("timerLanding", _landing_timer_rate_, 0.1, event);
    +     631        1570 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("UavManager::timerLanding", scope_timer_logger_, scope_timer_enabled_);
    +     632             : 
    +     633         785 :   auto land_there_reference = mrs_lib::get_mutexed(mutex_land_there_reference_, land_there_reference_);
    +     634             : 
    +     635             :   // copy member variables
    +     636         785 :   auto control_manager_diagnostics = sh_control_manager_diag_.getMsg();
    +     637         785 :   auto odometry                    = sh_odometry_.getMsg();
    +     638         785 :   auto tracker_cmd                 = sh_tracker_cmd_.getMsg();
    +     639             : 
    +     640         785 :   std::optional<double> desired_throttle;
    +     641             : 
    +     642         785 :   if (sh_throttle_.hasMsg() && (ros::Time::now() - sh_throttle_.lastMsgTime()).toSec() < 1.0) {
    +     643         785 :     desired_throttle = sh_throttle_.getMsg()->data;
    +     644             :   }
    +     645             : 
    +     646         785 :   auto res = transformer_->transformSingle(land_there_reference, odometry->header.frame_id);
    +     647             : 
    +     648         785 :   mrs_msgs::ReferenceStamped land_there_current_frame;
    +     649             : 
    +     650         785 :   if (res) {
    +     651         785 :     land_there_current_frame = res.value();
    +     652             :   } else {
    +     653             : 
    +     654           0 :     ROS_ERROR("[UavManager]: could not transform the reference into the current frame! land by yourself pls.");
    +     655           0 :     return;
    +     656             :   }
    +     657             : 
    +     658         785 :   if (current_state_landing_ == IDLE_STATE) {
    +     659             : 
    +     660           0 :     return;
    +     661             : 
    +     662         785 :   } else if (current_state_landing_ == GOTO_STATE) {
    +     663             : 
    +     664         360 :     auto [pos_x, pos_y, pos_z] = mrs_lib::getPosition(*tracker_cmd);
    +     665         360 :     auto [ref_x, ref_y, ref_z] = mrs_lib::getPosition(land_there_current_frame);
    +     666             : 
    +     667         360 :     double pos_heading = tracker_cmd->heading;
    +     668             : 
    +     669         360 :     double ref_heading = 0;
    +     670             :     try {
    +     671         360 :       ref_heading = mrs_lib::getHeading(land_there_current_frame);
    +     672             :     }
    +     673           0 :     catch (mrs_lib::AttitudeConverter::GetHeadingException& e) {
    +     674           0 :       ROS_ERROR_THROTTLE(1.0, "[UavManager]: exception caught: '%s'", e.what());
    +     675           0 :       return;
    +     676             :     }
    +     677             : 
    +     678         367 :     if (mrs_lib::geometry::dist(vec3_t(pos_x, pos_y, pos_z), vec3_t(ref_x, ref_y, ref_z)) < _landing_tracking_tolerance_translation_ &&
    +     679           7 :         fabs(radians::diff(pos_heading, ref_heading)) < _landing_tracking_tolerance_heading_) {
    +     680             : 
    +     681          14 :       auto [success, message] = landWithDescendImpl();
    +     682             : 
    +     683           7 :       if (!success) {
    +     684             : 
    +     685           0 :         ROS_ERROR_THROTTLE(1.0, "[UavManager]: call for landing failed: '%s'", message.c_str());
    +     686             :       }
    +     687             : 
    +     688         353 :     } else if (!control_manager_diagnostics->tracker_status.have_goal && control_manager_diagnostics->flying_normally) {
    +     689             : 
    +     690           0 :       ROS_WARN_THROTTLE(1.0, "[UavManager]: the tracker does not have a goal while flying home, setting the reference again");
    +     691             : 
    +     692           0 :       mrs_msgs::ReferenceStamped reference_out;
    +     693             : 
    +     694             :       {
    +     695           0 :         std::scoped_lock lock(mutex_land_there_reference_);
    +     696             : 
    +     697             :         // get the current altitude in land_there_reference_.header.frame_id;
    +     698           0 :         geometry_msgs::PoseStamped current_pose;
    +     699           0 :         current_pose.header.stamp     = ros::Time::now();
    +     700           0 :         current_pose.header.frame_id  = _uav_name_ + "/fcu";
    +     701           0 :         current_pose.pose.position.x  = 0;
    +     702           0 :         current_pose.pose.position.y  = 0;
    +     703           0 :         current_pose.pose.position.z  = 0;
    +     704           0 :         current_pose.pose.orientation = mrs_lib::AttitudeConverter(0, 0, 0);
    +     705             : 
    +     706           0 :         auto response = transformer_->transformSingle(current_pose, land_there_reference_.header.frame_id);
    +     707             : 
    +     708           0 :         if (response) {
    +     709             : 
    +     710           0 :           land_there_reference_.reference.position.z = response.value().pose.position.z;
    +     711           0 :           ROS_DEBUG("[UavManager]: current altitude is %.2f m", land_there_reference_.reference.position.z);
    +     712             : 
    +     713             :         } else {
    +     714             : 
    +     715           0 :           std::stringstream ss;
    +     716           0 :           ss << "could not transform current height to " << land_there_reference_.header.frame_id;
    +     717           0 :           ROS_ERROR_STREAM("[UavManager]: " << ss.str());
    +     718             :         }
    +     719             : 
    +     720           0 :         reference_out.header.frame_id = land_there_reference_.header.frame_id;
    +     721           0 :         reference_out.header.stamp    = ros::Time::now();
    +     722           0 :         reference_out.reference       = land_there_reference_.reference;
    +     723             :       }
    +     724             : 
    +     725           0 :       emergencyReferenceSrv(reference_out);
    +     726             :     }
    +     727             : 
    +     728         425 :   } else if (current_state_landing_ == LANDING_STATE) {
    +     729             : 
    +     730             :     // we should not attempt to finish the landing if some other tracked was activated
    +     731         425 :     if (_landing_tracker_name_ == sh_control_manager_diag_.getMsg()->active_tracker) {
    +     732             : 
    +     733         424 :       if (desired_throttle) {
    +     734             : 
    +     735             :         // recalculate the mass based on the throttle
    +     736         424 :         throttle_mass_estimate_ = mrs_lib::quadratic_throttle_model::throttleToForce(_throttle_model_, desired_throttle.value()) / _g_;
    +     737         424 :         ROS_INFO_THROTTLE(1.0, "[UavManager]: landing: initial mass: %.2f throttle_mass_estimate: %.2f", landing_uav_mass_, throttle_mass_estimate_);
    +     738             : 
    +     739             :         // condition for automatic motor turn off
    +     740         424 :         if (((throttle_mass_estimate_ < _landing_cutoff_mass_factor_ * landing_uav_mass_) || desired_throttle < 0.01)) {
    +     741             : 
    +     742         110 :           if (!throttle_under_threshold_) {
    +     743             : 
    +     744           5 :             throttle_mass_estimate_first_time_ = ros::Time::now();
    +     745           5 :             throttle_under_threshold_          = true;
    +     746             :           }
    +     747             : 
    +     748         110 :           ROS_INFO_THROTTLE(0.5, "[UavManager]: throttle is under cutoff factor for %.2f s", (ros::Time::now() - throttle_mass_estimate_first_time_).toSec());
    +     749             : 
    +     750             :         } else {
    +     751             : 
    +     752         314 :           throttle_under_threshold_ = false;
    +     753             :         }
    +     754             : 
    +     755         424 :         if (throttle_under_threshold_ && ((ros::Time::now() - throttle_mass_estimate_first_time_).toSec() > _landing_cutoff_mass_timeout_)) {
    +     756             : 
    +     757           5 :           switchTrackerSrv(_null_tracker_name_);
    +     758             : 
    +     759           5 :           setControlCallbacksSrv(true);
    +     760             : 
    +     761           5 :           if (_landing_disarm_) {
    +     762             : 
    +     763           5 :             ROS_INFO("[UavManager]: disarming after landing");
    +     764             : 
    +     765           5 :             disarmSrv();
    +     766             :           }
    +     767             : 
    +     768           5 :           changeLandingState(IDLE_STATE);
    +     769             : 
    +     770           5 :           ROS_INFO("[UavManager]: landing finished");
    +     771             : 
    +     772           5 :           timer_landing_.stop();
    +     773             :         }
    +     774             : 
    +     775             :       } else {
    +     776             : 
    +     777           0 :         auto odometry = sh_odometry_.getMsg();
    +     778             : 
    +     779           0 :         double z_vel = odometry->twist.twist.linear.z;
    +     780             : 
    +     781           0 :         ROS_INFO_THROTTLE(1.0, "[UavManager]: landing: z-velocity: %.2f", z_vel);
    +     782             : 
    +     783             :         // condition for automatic motor turn off
    +     784           0 :         if (z_vel > -0.1) {
    +     785             : 
    +     786           0 :           if (!velocity_under_threshold_) {
    +     787             : 
    +     788           0 :             velocity_under_threshold_first_time_ = ros::Time::now();
    +     789           0 :             velocity_under_threshold_            = true;
    +     790             :           }
    +     791             : 
    +     792           0 :           ROS_INFO_THROTTLE(0.5, "[UavManager]: velocity over threshold for %.2f s", (ros::Time::now() - velocity_under_threshold_first_time_).toSec());
    +     793             : 
    +     794             :         } else {
    +     795             : 
    +     796           0 :           velocity_under_threshold_ = false;
    +     797             :         }
    +     798             : 
    +     799           0 :         if (velocity_under_threshold_ && ((ros::Time::now() - velocity_under_threshold_first_time_).toSec() > 3.0)) {
    +     800             : 
    +     801           0 :           switchTrackerSrv(_null_tracker_name_);
    +     802             : 
    +     803           0 :           setControlCallbacksSrv(true);
    +     804             : 
    +     805           0 :           if (_landing_disarm_) {
    +     806             : 
    +     807           0 :             ROS_INFO("[UavManager]: disarming after landing");
    +     808             : 
    +     809           0 :             disarmSrv();
    +     810             :           }
    +     811             : 
    +     812           0 :           changeLandingState(IDLE_STATE);
    +     813             : 
    +     814           0 :           ROS_INFO("[UavManager]: landing finished");
    +     815             : 
    +     816           0 :           timer_landing_.stop();
    +     817             :         }
    +     818             :       }
    +     819             : 
    +     820             :     } else {
    +     821             : 
    +     822           1 :       ROS_WARN_THROTTLE(1.0, "[UavManager]: incorrect tracker detected during landing!");
    +     823             :     }
    +     824             :   }
    +     825             : }
    +     826             : 
    +     827             : //}
    +     828             : 
    +     829             : /* //{ timerTakeoff() */
    +     830             : 
    +     831         968 : void UavManager::timerTakeoff(const ros::TimerEvent& event) {
    +     832             : 
    +     833         968 :   if (!is_initialized_)
    +     834           0 :     return;
    +     835             : 
    +     836        1936 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("timerTakeoff", _takeoff_timer_rate_, 0.1, event);
    +     837        1936 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("UavManager::timerTakeoff", scope_timer_logger_, scope_timer_enabled_);
    +     838             : 
    +     839         968 :   auto control_manager_diagnostics = sh_control_manager_diag_.getMsg();
    +     840             : 
    +     841         968 :   if (waiting_for_takeoff_) {
    +     842             : 
    +     843          20 :     if (control_manager_diagnostics->active_tracker == _takeoff_tracker_name_ && control_manager_diagnostics->tracker_status.have_goal) {
    +     844             : 
    +     845          20 :       waiting_for_takeoff_ = false;
    +     846             :     } else {
    +     847             : 
    +     848           0 :       ROS_WARN_THROTTLE(1.0, "[UavManager]: waiting for takeoff confirmation from the ControlManager");
    +     849           0 :       return;
    +     850             :     }
    +     851             :   }
    +     852             : 
    +     853         968 :   if (takingoff_) {
    +     854             : 
    +     855         968 :     if (control_manager_diagnostics->active_tracker != _takeoff_tracker_name_ || !control_manager_diagnostics->tracker_status.have_goal) {
    +     856             : 
    +     857          20 :       ROS_INFO("[UavManager]: take off finished, switching to %s", _after_takeoff_tracker_name_.c_str());
    +     858             : 
    +     859          20 :       switchTrackerSrv(_after_takeoff_tracker_name_);
    +     860             : 
    +     861          20 :       switchControllerSrv(_after_takeoff_controller_name_);
    +     862             : 
    +     863          20 :       setOdometryCallbacksSrv(true);
    +     864             : 
    +     865          20 :       timer_takeoff_.stop();
    +     866             :     }
    +     867             :   }
    +     868             : }
    +     869             : 
    +     870             : //}
    +     871             : 
    +     872             : /* //{ timerMaxHeight() */
    +     873             : 
    +     874       19690 : void UavManager::timerMaxHeight(const ros::TimerEvent& event) {
    +     875             : 
    +     876       19690 :   if (!is_initialized_)
    +     877       13734 :     return;
    +     878             : 
    +     879       39380 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("timerMaxHeight", _max_height_checking_rate_, 0.1, event);
    +     880       39380 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("UavManager::timerMaxHeight", scope_timer_logger_, scope_timer_enabled_);
    +     881             : 
    +     882       19690 :   if (!sh_max_height_.hasMsg() || !sh_height_.hasMsg() || !sh_odometry_.hasMsg()) {
    +     883        7348 :     ROS_WARN_THROTTLE(10.0, "[UavManager]: maxHeightTimer() not spinning, missing data");
    +     884        7348 :     return;
    +     885             :   }
    +     886             : 
    +     887       12342 :   auto control_manager_diag = sh_control_manager_diag_.getMsg();
    +     888             : 
    +     889       12342 :   if (!fixing_max_height_ && !control_manager_diag->flying_normally) {
    +     890        6386 :     return;
    +     891             :   }
    +     892             : 
    +     893        5956 :   auto   odometry = sh_odometry_.getMsg();
    +     894        5956 :   double height   = sh_height_.getMsg()->value;
    +     895             : 
    +     896             :   // transform max z to the height frame
    +     897        5956 :   geometry_msgs::PointStamped point;
    +     898        5956 :   point.header  = sh_max_height_.getMsg()->header;
    +     899        5956 :   point.point.z = sh_max_height_.getMsg()->value;
    +     900             : 
    +     901        5956 :   auto res = transformer_->transformSingle(point, sh_height_.getMsg()->header.frame_id);
    +     902             : 
    +     903             :   double max_z_in_height;
    +     904             : 
    +     905        5956 :   if (res) {
    +     906        5956 :     max_z_in_height = res->point.z;
    +     907             :   } else {
    +     908           0 :     ROS_WARN_THROTTLE(1.0, "[UavManager]: timerMaxHeight() not working, cannot transform max z to the height frame");
    +     909           0 :     return;
    +     910             :   }
    +     911             : 
    +     912        5956 :   auto [odometry_x, odometry_y, odometry_z] = mrs_lib::getPosition(odometry);
    +     913             : 
    +     914        5956 :   double odometry_heading = 0;
    +     915             :   try {
    +     916        5956 :     odometry_heading = mrs_lib::getHeading(odometry);
    +     917             :   }
    +     918           0 :   catch (mrs_lib::AttitudeConverter::GetHeadingException& e) {
    +     919           0 :     ROS_ERROR_THROTTLE(1.0, "[UavManager]: exception caught: '%s'", e.what());
    +     920           0 :     return;
    +     921             :   }
    +     922             : 
    +     923        5956 :   if (height > max_z_in_height) {
    +     924             : 
    +     925          53 :     ROS_WARN_THROTTLE(1.0, "[UavManager]: max height exceeded: %.2f >  %.2f, triggering safety goto", height, max_z_in_height);
    +     926             : 
    +     927         106 :     mrs_msgs::ReferenceStamped reference_out;
    +     928          53 :     reference_out.header.frame_id = odometry->header.frame_id;
    +     929          53 :     reference_out.header.stamp    = ros::Time::now();
    +     930             : 
    +     931          53 :     reference_out.reference.position.x = odometry_x;
    +     932          53 :     reference_out.reference.position.y = odometry_y;
    +     933          53 :     reference_out.reference.position.z = odometry_z + ((max_z_in_height - _max_height_offset_) - height);
    +     934             : 
    +     935          53 :     reference_out.reference.heading = odometry_heading;
    +     936             : 
    +     937          53 :     setControlCallbacksSrv(false);
    +     938             : 
    +     939          53 :     bool success = emergencyReferenceSrv(reference_out);
    +     940             : 
    +     941          53 :     if (success) {
    +     942             : 
    +     943          53 :       ROS_INFO("[UavManager]: descending");
    +     944             : 
    +     945          53 :       fixing_max_height_ = true;
    +     946             : 
    +     947             :     } else {
    +     948             : 
    +     949           0 :       ROS_ERROR_THROTTLE(1.0, "[UavManager]: could not descend");
    +     950             : 
    +     951           0 :       setControlCallbacksSrv(true);
    +     952             :     }
    +     953             :   }
    +     954             : 
    +     955        5956 :   if (fixing_max_height_ && height < max_z_in_height) {
    +     956             : 
    +     957           1 :     setControlCallbacksSrv(true);
    +     958             : 
    +     959           1 :     ROS_WARN_THROTTLE(1.0, "[UavManager]: safe height reached");
    +     960             : 
    +     961           1 :     fixing_max_height_ = false;
    +     962             :   }
    +     963             : }
    +     964             : 
    +     965             : //}
    +     966             : 
    +     967             : /* //{ timerMinHeight() */
    +     968             : 
    +     969       19621 : void UavManager::timerMinHeight(const ros::TimerEvent& event) {
    +     970             : 
    +     971       19621 :   if (!is_initialized_)
    +     972       13753 :     return;
    +     973             : 
    +     974       19621 :   ROS_INFO_ONCE("[UavManager]: min height timer spinning");
    +     975             : 
    +     976       39242 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("timerMinHeight", _min_height_checking_rate_, 0.1, event);
    +     977       39242 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("UavManager::timerMinHeight", scope_timer_logger_, scope_timer_enabled_);
    +     978             : 
    +     979       19621 :   if (!sh_odometry_.hasMsg() || !sh_height_.hasMsg() || !sh_control_manager_diag_.hasMsg()) {
    +     980        7336 :     ROS_WARN_THROTTLE(10.0, "[UavManager]: minHeightTimer() not spinning, missing data");
    +     981        7336 :     return;
    +     982             :   }
    +     983             : 
    +     984       12285 :   auto control_manager_diag = sh_control_manager_diag_.getMsg();
    +     985             : 
    +     986       12285 :   if (!fixing_min_height_ && !control_manager_diag->flying_normally) {
    +     987        6417 :     return;
    +     988             :   }
    +     989             : 
    +     990        5868 :   auto   odometry = sh_odometry_.getMsg();
    +     991        5868 :   double height   = sh_height_.getMsg()->value;
    +     992             : 
    +     993        5868 :   auto [odometry_x, odometry_y, odometry_z] = mrs_lib::getPosition(odometry);
    +     994             : 
    +     995        5868 :   double odometry_heading = 0;
    +     996             : 
    +     997             :   try {
    +     998        5868 :     odometry_heading = mrs_lib::getHeading(odometry);
    +     999             :   }
    +    1000           0 :   catch (mrs_lib::AttitudeConverter::GetHeadingException& e) {
    +    1001           0 :     ROS_ERROR_THROTTLE(1.0, "[UavManager]: exception caught: '%s'", e.what());
    +    1002           0 :     return;
    +    1003             :   }
    +    1004             : 
    +    1005        5868 :   if (height < _min_height_) {
    +    1006             : 
    +    1007          34 :     ROS_WARN_THROTTLE(1.0, "[UavManager]: min height breached: %.2f < %.2f, triggering safety goto", height, _min_height_);
    +    1008             : 
    +    1009          68 :     mrs_msgs::ReferenceStamped reference_out;
    +    1010          34 :     reference_out.header.frame_id = odometry->header.frame_id;
    +    1011          34 :     reference_out.header.stamp    = ros::Time::now();
    +    1012             : 
    +    1013          34 :     reference_out.reference.position.x = odometry_x;
    +    1014          34 :     reference_out.reference.position.y = odometry_y;
    +    1015          34 :     reference_out.reference.position.z = odometry_z + ((_min_height_ + _min_height_offset_) - height);
    +    1016             : 
    +    1017          34 :     reference_out.reference.heading = odometry_heading;
    +    1018             : 
    +    1019          34 :     setControlCallbacksSrv(false);
    +    1020             : 
    +    1021          34 :     bool success = emergencyReferenceSrv(reference_out);
    +    1022             : 
    +    1023          34 :     if (success) {
    +    1024             : 
    +    1025          34 :       ROS_INFO("[UavManager]: ascending");
    +    1026             : 
    +    1027          34 :       fixing_min_height_ = true;
    +    1028             : 
    +    1029             :     } else {
    +    1030             : 
    +    1031           0 :       ROS_ERROR_THROTTLE(1.0, "[UavManager]: could not ascend");
    +    1032             : 
    +    1033           0 :       setControlCallbacksSrv(true);
    +    1034             :     }
    +    1035             :   }
    +    1036             : 
    +    1037        5868 :   if (fixing_min_height_ && height > _min_height_) {
    +    1038             : 
    +    1039           2 :     setControlCallbacksSrv(true);
    +    1040             : 
    +    1041           2 :     ROS_WARN_THROTTLE(1.0, "[UavManager]: safe height reached");
    +    1042             : 
    +    1043           2 :     fixing_min_height_ = false;
    +    1044             :   }
    +    1045             : }
    +    1046             : 
    +    1047             : //}
    +    1048             : 
    +    1049             : /* //{ timerFlightTime() */
    +    1050             : 
    +    1051         282 : void UavManager::timerFlightTime(const ros::TimerEvent& event) {
    +    1052             : 
    +    1053         282 :   if (!is_initialized_)
    +    1054           0 :     return;
    +    1055             : 
    +    1056         846 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("timerFlightTime", _flighttime_timer_rate_, 0.1, event);
    +    1057         846 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("UavManager::timerFlightTime", scope_timer_logger_, scope_timer_enabled_);
    +    1058             : 
    +    1059         282 :   auto flighttime = mrs_lib::get_mutexed(mutex_flighttime_, flighttime_);
    +    1060             : 
    +    1061         282 :   flighttime += 1.0 / _flighttime_timer_rate_;
    +    1062             : 
    +    1063         282 :   mrs_msgs::Float64 flight_time;
    +    1064         282 :   flight_time.value = flighttime;
    +    1065             : 
    +    1066             :   // if enabled, start the timer for measuring the flight time
    +    1067         282 :   if (_flighttime_timer_enabled_) {
    +    1068             : 
    +    1069           0 :     if (flighttime > _flighttime_max_time_) {
    +    1070             : 
    +    1071           0 :       flighttime = 0;
    +    1072           0 :       timer_flighttime_.stop();
    +    1073             : 
    +    1074           0 :       ROS_INFO("[UavManager]: max flight time reached, landing");
    +    1075             : 
    +    1076           0 :       landImpl();
    +    1077             :     }
    +    1078             :   }
    +    1079             : 
    +    1080         282 :   mrs_lib::set_mutexed(mutex_flighttime_, flighttime, flighttime_);
    +    1081             : }
    +    1082             : 
    +    1083             : //}
    +    1084             : 
    +    1085             : /* //{ timerMaxthrottle() */
    +    1086             : 
    +    1087       49459 : void UavManager::timerMaxthrottle(const ros::TimerEvent& event) {
    +    1088             : 
    +    1089       49459 :   if (!is_initialized_)
    +    1090       15555 :     return;
    +    1091             : 
    +    1092       49459 :   if (!sh_throttle_.hasMsg() || (ros::Time::now() - sh_throttle_.lastMsgTime()).toSec() > 1.0) {
    +    1093       15555 :     return;
    +    1094             :   }
    +    1095             : 
    +    1096       33904 :   ROS_INFO_ONCE("[UavManager]: max throttle timer spinning");
    +    1097             : 
    +    1098      101712 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("timerMaxthrottle", _maxthrottle_timer_rate_, 0.03, event);
    +    1099      101712 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("UavManager::timerMaxthrottle", scope_timer_logger_, scope_timer_enabled_);
    +    1100             : 
    +    1101       33904 :   auto desired_throttle = sh_throttle_.getMsg()->data;
    +    1102             : 
    +    1103       33904 :   if (desired_throttle >= _maxthrottle_max_throttle_) {
    +    1104             : 
    +    1105          32 :     if (!maxthrottle_above_threshold_) {
    +    1106             : 
    +    1107           1 :       maxthrottle_first_time_      = ros::Time::now();
    +    1108           1 :       maxthrottle_above_threshold_ = true;
    +    1109           1 :       ROS_WARN_THROTTLE(1.0, "[UavManager]: max throttle exceeded threshold (%.2f/%.2f)", desired_throttle, _maxthrottle_max_throttle_);
    +    1110             : 
    +    1111             :     } else {
    +    1112             : 
    +    1113          31 :       ROS_WARN_THROTTLE(0.1, "[UavManager]: throttle over threshold (%.2f/%.2f) for %.2f s", desired_throttle, _maxthrottle_max_throttle_,
    +    1114             :                         (ros::Time::now() - maxthrottle_first_time_).toSec());
    +    1115             :     }
    +    1116             : 
    +    1117             :   } else {
    +    1118             : 
    +    1119       33872 :     maxthrottle_above_threshold_ = false;
    +    1120             :   }
    +    1121             : 
    +    1122       33904 :   if (maxthrottle_above_threshold_ && (ros::Time::now() - maxthrottle_first_time_).toSec() > _maxthrottle_ungrip_timeout_) {
    +    1123             : 
    +    1124          16 :     ROS_WARN_THROTTLE(1.0, "[UavManager]: throttle over threshold (%.2f/%.2f) for more than %.2f s, ungripping payload", desired_throttle,
    +    1125             :                       _maxthrottle_max_throttle_, _maxthrottle_ungrip_timeout_);
    +    1126             : 
    +    1127          16 :     ungripSrv();
    +    1128             :   }
    +    1129             : 
    +    1130       33904 :   if (maxthrottle_above_threshold_ && (ros::Time::now() - maxthrottle_first_time_).toSec() > _maxthrottle_eland_timeout_) {
    +    1131             : 
    +    1132           1 :     timer_maxthrottle_.stop();
    +    1133             : 
    +    1134           1 :     ROS_ERROR_THROTTLE(1.0, "[UavManager]: throttle over threshold (%.2f/%.2f) for more than %.2f s, calling for emergency landing", desired_throttle,
    +    1135             :                        _maxthrottle_max_throttle_, _maxthrottle_eland_timeout_);
    +    1136             : 
    +    1137           1 :     elandSrv();
    +    1138             :   }
    +    1139             : }
    +    1140             : 
    +    1141             : //}
    +    1142             : 
    +    1143             : /* //{ timerDiagnostics() */
    +    1144             : 
    +    1145        1955 : void UavManager::timerDiagnostics(const ros::TimerEvent& event) {
    +    1146             : 
    +    1147        1955 :   if (!is_initialized_)
    +    1148           0 :     return;
    +    1149             : 
    +    1150        5865 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("timerDiagnostics", _maxthrottle_timer_rate_, 0.03, event);
    +    1151        5865 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("UavManager::timerDiagnostics", scope_timer_logger_, scope_timer_enabled_);
    +    1152             : 
    +    1153        1955 :   bool got_gps_est = false;
    +    1154        1955 :   bool got_rtk_est = false;
    +    1155             : 
    +    1156        1955 :   if (sh_estimation_diagnostics_.hasMsg()) {  // get current position in lat-lon
    +    1157             : 
    +    1158        3244 :     auto                     estimation_diag  = sh_estimation_diagnostics_.getMsg();
    +    1159        1622 :     std::vector<std::string> state_estimators = estimation_diag.get()->switchable_state_estimators;
    +    1160             : 
    +    1161        1931 :     got_gps_est = std::find(state_estimators.begin(), state_estimators.end(), "gps_garmin") != state_estimators.end() ||
    +    1162         309 :                   std::find(state_estimators.begin(), state_estimators.end(), "gps_baro") != state_estimators.end();
    +    1163        1622 :     got_rtk_est = std::find(state_estimators.begin(), state_estimators.end(), "rtk") != state_estimators.end();
    +    1164             :   }
    +    1165             : 
    +    1166        3910 :   mrs_msgs::UavManagerDiagnostics diag;
    +    1167             : 
    +    1168        1955 :   diag.stamp    = ros::Time::now();
    +    1169        1955 :   diag.uav_name = _uav_name_;
    +    1170             : 
    +    1171        1955 :   auto flighttime = mrs_lib::get_mutexed(mutex_flighttime_, flighttime_);
    +    1172             : 
    +    1173             :   // fill in the acumulated flight time
    +    1174        1955 :   diag.flight_time = flighttime;
    +    1175             : 
    +    1176        1955 :   if (sh_odometry_.hasMsg()) {  // get current position in lat-lon
    +    1177             : 
    +    1178        1626 :     if (got_gps_est || got_rtk_est) {
    +    1179             : 
    +    1180        3188 :       nav_msgs::Odometry odom = *sh_odometry_.getMsg();
    +    1181             : 
    +    1182        3188 :       geometry_msgs::PoseStamped uav_pose;
    +    1183        1594 :       uav_pose.pose = mrs_lib::getPose(odom);
    +    1184             : 
    +    1185        4782 :       auto res = transformer_->transformSingle(uav_pose, "latlon_origin");
    +    1186             : 
    +    1187        1594 :       if (res) {
    +    1188        1594 :         diag.cur_latitude  = res.value().pose.position.x;
    +    1189        1594 :         diag.cur_longitude = res.value().pose.position.y;
    +    1190             :       }
    +    1191             :     }
    +    1192             :   }
    +    1193             : 
    +    1194        1955 :   if (takeoff_successful_) {
    +    1195             : 
    +    1196         322 :     if (got_gps_est || got_rtk_est) {
    +    1197             : 
    +    1198         644 :       auto land_there_reference = mrs_lib::get_mutexed(mutex_land_there_reference_, land_there_reference_);
    +    1199             : 
    +    1200         966 :       auto res = transformer_->transformSingle(land_there_reference, "latlon_origin");
    +    1201             : 
    +    1202         322 :       if (res) {
    +    1203         322 :         diag.home_latitude  = res.value().reference.position.x;
    +    1204         322 :         diag.home_longitude = res.value().reference.position.y;
    +    1205             :       }
    +    1206             :     }
    +    1207             :   }
    +    1208             : 
    +    1209        1955 :   ph_diag_.publish(diag);
    +    1210             : }
    +    1211             : 
    +    1212             : //}
    +    1213             : 
    +    1214             : /* //{ timerMidairActivation() */
    +    1215             : 
    +    1216          67 : void UavManager::timerMidairActivation([[maybe_unused]] const ros::TimerEvent& event) {
    +    1217             : 
    +    1218          67 :   if (!is_initialized_)
    +    1219           0 :     return;
    +    1220             : 
    +    1221          67 :   ROS_INFO_THROTTLE(0.1, "[UavManager]: waiting for OFFBOARD");
    +    1222             : 
    +    1223          67 :   if (sh_hw_api_status_.getMsg()->offboard) {
    +    1224             : 
    +    1225          63 :     ROS_INFO("[UavManager]: OFFBOARD detected");
    +    1226             : 
    +    1227          63 :     setOdometryCallbacksSrv(true);
    +    1228             : 
    +    1229             :     {
    +    1230          63 :       bool controller_switched = switchControllerSrv(_midair_activation_after_controller_);
    +    1231             : 
    +    1232          63 :       if (!controller_switched) {
    +    1233             : 
    +    1234           1 :         ROS_ERROR("[UavManager]: could not activate '%s'", _midair_activation_after_controller_.c_str());
    +    1235             : 
    +    1236           1 :         ehoverSrv();
    +    1237             : 
    +    1238           1 :         timer_midair_activation_.stop();
    +    1239             : 
    +    1240           1 :         return;
    +    1241             :       }
    +    1242             :     }
    +    1243             : 
    +    1244             :     {
    +    1245          62 :       bool tracker_switched = switchTrackerSrv(_midair_activation_after_tracker_);
    +    1246             : 
    +    1247          62 :       if (!tracker_switched) {
    +    1248             : 
    +    1249           1 :         ROS_ERROR("[UavManager]: could not activate '%s'", _midair_activation_after_tracker_.c_str());
    +    1250             : 
    +    1251           1 :         ehoverSrv();
    +    1252             : 
    +    1253           1 :         timer_midair_activation_.stop();
    +    1254             : 
    +    1255           1 :         return;
    +    1256             :       }
    +    1257             :     }
    +    1258             : 
    +    1259          61 :     timer_midair_activation_.stop();
    +    1260             : 
    +    1261          61 :     return;
    +    1262             :   }
    +    1263             : 
    +    1264           4 :   if ((ros::Time::now() - midair_activation_started_).toSec() > 0.5) {
    +    1265             : 
    +    1266           0 :     ROS_ERROR("[UavManager]: waiting for OFFBOARD timeouted, reverting");
    +    1267             : 
    +    1268           0 :     toggleControlOutput(false);
    +    1269             : 
    +    1270           0 :     timer_midair_activation_.stop();
    +    1271             : 
    +    1272           0 :     return;
    +    1273             :   }
    +    1274             : }
    +    1275             : 
    +    1276             : //}
    +    1277             : 
    +    1278             : // --------------------------------------------------------------
    +    1279             : // |                          callbacks                         |
    +    1280             : // --------------------------------------------------------------
    +    1281             : 
    +    1282             : // | --------------------- topic callbacks -------------------- |
    +    1283             : 
    +    1284             : /* //{ callbackHwApiGNSS() */
    +    1285             : 
    +    1286       93370 : void UavManager::callbackHwApiGNSS(const sensor_msgs::NavSatFix::ConstPtr msg) {
    +    1287             : 
    +    1288       93370 :   if (!is_initialized_)
    +    1289          30 :     return;
    +    1290             : 
    +    1291      280020 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("callbackHwApiGNSS");
    +    1292      280020 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("UavManager::callbackHwApiGNSS", scope_timer_logger_, scope_timer_enabled_);
    +    1293             : 
    +    1294       93340 :   transformer_->setLatLon(msg->latitude, msg->longitude);
    +    1295             : }
    +    1296             : 
    +    1297             : //}
    +    1298             : 
    +    1299             : /* //{ callbackOdometry() */
    +    1300             : 
    +    1301      155152 : void UavManager::callbackOdometry(const nav_msgs::Odometry::ConstPtr msg) {
    +    1302             : 
    +    1303      155152 :   if (!is_initialized_)
    +    1304           0 :     return;
    +    1305             : 
    +    1306      155152 :   transformer_->setDefaultFrame(msg->header.frame_id);
    +    1307             : }
    +    1308             : 
    +    1309             : //}
    +    1310             : 
    +    1311             : // | -------------------- service callbacks ------------------- |
    +    1312             : 
    +    1313             : /* //{ callbackTakeoff() */
    +    1314             : 
    +    1315          22 : bool UavManager::callbackTakeoff([[maybe_unused]] std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res) {
    +    1316             : 
    +    1317          22 :   if (!is_initialized_)
    +    1318           0 :     return false;
    +    1319             : 
    +    1320          22 :   ROS_INFO("[UavManager]: takeoff called by service");
    +    1321             : 
    +    1322             :   /* preconditions //{ */
    +    1323             : 
    +    1324             :   {
    +    1325          22 :     std::stringstream ss;
    +    1326             : 
    +    1327          22 :     if (!sh_odometry_.hasMsg()) {
    +    1328           0 :       ss << "can not takeoff, missing odometry!";
    +    1329           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1330           0 :       res.message = ss.str();
    +    1331           0 :       res.success = false;
    +    1332           0 :       return true;
    +    1333             :     }
    +    1334             : 
    +    1335          22 :     if (!sh_hw_api_status_.hasMsg() || (ros::Time::now() - sh_hw_api_status_.lastMsgTime()).toSec() > 5.0) {
    +    1336           0 :       ss << "can not takeoff, missing HW API status!";
    +    1337           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1338           0 :       res.message = ss.str();
    +    1339           0 :       res.success = false;
    +    1340           0 :       return true;
    +    1341             :     }
    +    1342             : 
    +    1343          22 :     if (!sh_hw_api_status_.getMsg()->armed) {
    +    1344           0 :       ss << "can not takeoff, UAV not armed!";
    +    1345           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1346           0 :       res.message = ss.str();
    +    1347           0 :       res.success = false;
    +    1348           0 :       return true;
    +    1349             :     }
    +    1350             : 
    +    1351          22 :     if (!sh_hw_api_status_.getMsg()->offboard) {
    +    1352           0 :       ss << "can not takeoff, UAV not in offboard mode!";
    +    1353           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1354           0 :       res.message = ss.str();
    +    1355           0 :       res.success = false;
    +    1356           0 :       return true;
    +    1357             :     }
    +    1358             : 
    +    1359             :     {
    +    1360          22 :       if (!sh_control_manager_diag_.hasMsg() && (ros::Time::now() - sh_control_manager_diag_.lastMsgTime()).toSec() > 5.0) {
    +    1361           0 :         ss << "can not takeoff, missing control manager diagnostics!";
    +    1362           0 :         ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1363           0 :         res.message = ss.str();
    +    1364           0 :         res.success = false;
    +    1365           0 :         return true;
    +    1366             :       }
    +    1367             : 
    +    1368          22 :       if (_null_tracker_name_ != sh_control_manager_diag_.getMsg()->active_tracker) {
    +    1369           0 :         ss << "can not takeoff, need '" << _null_tracker_name_ << "' to be active!";
    +    1370           0 :         ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1371           0 :         res.message = ss.str();
    +    1372           0 :         res.success = false;
    +    1373           0 :         return true;
    +    1374             :       }
    +    1375             :     }
    +    1376             : 
    +    1377          22 :     if (!sh_controller_diagnostics_.hasMsg()) {
    +    1378           0 :       ss << "can not takeoff, missing controller diagnostics!";
    +    1379           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1380           0 :       res.message = ss.str();
    +    1381           0 :       res.success = false;
    +    1382           0 :       return true;
    +    1383             :     }
    +    1384             : 
    +    1385          22 :     if (_gain_manager_required_ && (ros::Time::now() - sh_gains_diag_.lastMsgTime()).toSec() > 5.0) {
    +    1386           0 :       ss << "can not takeoff, GainManager is not running!";
    +    1387           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1388           0 :       res.message = ss.str();
    +    1389           0 :       res.success = false;
    +    1390           0 :       return true;
    +    1391             :     }
    +    1392             : 
    +    1393          22 :     if (_constraint_manager_required_ && (ros::Time::now() - sh_constraints_diag_.lastMsgTime()).toSec() > 5.0) {
    +    1394           0 :       ss << "can not takeoff, ConstraintManager is not running!";
    +    1395           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1396           0 :       res.message = ss.str();
    +    1397           0 :       res.success = false;
    +    1398           0 :       return true;
    +    1399             :     }
    +    1400             : 
    +    1401          22 :     if (!sh_control_manager_diag_.getMsg()->output_enabled) {
    +    1402             : 
    +    1403           0 :       ss << "can not takeoff, Control Manager's output is disabled!";
    +    1404           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1405           0 :       res.message = ss.str();
    +    1406           0 :       res.success = false;
    +    1407           0 :       return true;
    +    1408             :     }
    +    1409             : 
    +    1410          22 :     if (number_of_takeoffs_ > 0) {
    +    1411             : 
    +    1412           0 :       auto last_mass_difference = mrs_lib::get_mutexed(mutex_last_mass_difference_, last_mass_difference_);
    +    1413             : 
    +    1414           0 :       if (last_mass_difference > 1.0) {
    +    1415             : 
    +    1416           0 :         ss << std::setprecision(2);
    +    1417           0 :         ss << "can not takeoff, estimated mass difference is too large: " << _null_tracker_name_ << "!";
    +    1418           0 :         ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1419           0 :         res.message = ss.str();
    +    1420           0 :         res.success = false;
    +    1421           0 :         return true;
    +    1422             :       }
    +    1423             :     }
    +    1424             :   }
    +    1425             : 
    +    1426             :   //}
    +    1427             : 
    +    1428          44 :   auto control_manager_diagnostics = sh_control_manager_diag_.getMsg();
    +    1429          44 :   auto odometry                    = sh_odometry_.getMsg();
    +    1430          22 :   auto [odom_x, odom_y, odom_z]    = mrs_lib::getPosition(sh_odometry_.getMsg());
    +    1431             : 
    +    1432             :   double odom_heading;
    +    1433             :   try {
    +    1434          22 :     odom_heading = mrs_lib::getHeading(sh_odometry_.getMsg());
    +    1435             :   }
    +    1436           0 :   catch (mrs_lib::AttitudeConverter::GetHeadingException& e) {
    +    1437           0 :     ROS_ERROR_THROTTLE(1.0, "[UavManager]: exception caught: '%s'", e.what());
    +    1438             : 
    +    1439           0 :     std::stringstream ss;
    +    1440           0 :     ss << "could not calculate current heading";
    +    1441           0 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1442           0 :     res.message = ss.str();
    +    1443           0 :     res.success = false;
    +    1444           0 :     return true;
    +    1445             :   }
    +    1446             : 
    +    1447          22 :   ROS_INFO("[UavManager]: taking off");
    +    1448             : 
    +    1449          22 :   setOdometryCallbacksSrv(false);
    +    1450             : 
    +    1451             :   // activating the takeoff controller
    +    1452             :   {
    +    1453          22 :     std::string old_controller      = sh_control_manager_diag_.getMsg()->active_controller;
    +    1454          22 :     bool        controller_switched = switchControllerSrv(_takeoff_controller_name_);
    +    1455             : 
    +    1456             :     // if it fails, activate back the old controller
    +    1457             :     // this is no big deal since the control outputs are not used
    +    1458             :     // until NullTracker is active
    +    1459          22 :     if (!controller_switched) {
    +    1460             : 
    +    1461           1 :       std::stringstream ss;
    +    1462           1 :       ss << "could not activate '" << _takeoff_controller_name_ << "' for takeoff";
    +    1463           1 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1464           1 :       res.success = false;
    +    1465           1 :       res.message = ss.str();
    +    1466             : 
    +    1467           1 :       toggleControlOutput(false);
    +    1468           1 :       disarmSrv();
    +    1469             : 
    +    1470           1 :       return true;
    +    1471             :     }
    +    1472             :   }
    +    1473             : 
    +    1474             :   // activate the takeoff tracker
    +    1475             :   {
    +    1476          21 :     std::string old_tracker      = sh_control_manager_diag_.getMsg()->active_tracker;
    +    1477          21 :     bool        tracker_switched = switchTrackerSrv(_takeoff_tracker_name_);
    +    1478             : 
    +    1479             :     // if it fails, activate back the old tracker
    +    1480          21 :     if (!tracker_switched) {
    +    1481             : 
    +    1482           1 :       std::stringstream ss;
    +    1483           1 :       ss << "could not activate '" << _takeoff_tracker_name_ << "' for takeoff";
    +    1484           1 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1485           1 :       res.success = false;
    +    1486           1 :       res.message = ss.str();
    +    1487             : 
    +    1488           1 :       toggleControlOutput(false);
    +    1489           1 :       disarmSrv();
    +    1490             : 
    +    1491           1 :       return true;
    +    1492             :     }
    +    1493             :   }
    +    1494             : 
    +    1495             :   // let's sleep before calling take off.. the motors are rumping-up anyway
    +    1496             :   // this solves on-time-happening race condition in the landoff tracker
    +    1497          20 :   ros::Duration(0.3).sleep();
    +    1498             : 
    +    1499             :   // now the takeoff tracker and controller are active
    +    1500             :   // the UAV is basically hovering on the ground
    +    1501             :   // (the controller is probably rumping up the throttle now)
    +    1502             : 
    +    1503             :   // call the takeoff service at the takeoff tracker
    +    1504             :   {
    +    1505          20 :     bool takeoff_successful = takeoffSrv();
    +    1506             : 
    +    1507             :     // if the takeoff was not successful, switch to NullTracker
    +    1508          20 :     if (takeoff_successful) {
    +    1509             : 
    +    1510             :       // save the current spot for later landing
    +    1511             :       {
    +    1512          20 :         std::scoped_lock lock(mutex_land_there_reference_);
    +    1513             : 
    +    1514          20 :         land_there_reference_.header               = odometry->header;
    +    1515          20 :         land_there_reference_.reference.position.x = odom_x;
    +    1516          20 :         land_there_reference_.reference.position.y = odom_y;
    +    1517          20 :         land_there_reference_.reference.position.z = odom_z;
    +    1518          20 :         land_there_reference_.reference.heading    = odom_heading;
    +    1519             :       }
    +    1520             : 
    +    1521          20 :       timer_flighttime_.start();
    +    1522             : 
    +    1523          40 :       std::stringstream ss;
    +    1524          20 :       ss << "taking off";
    +    1525          20 :       res.success = true;
    +    1526          20 :       res.message = ss.str();
    +    1527          20 :       ROS_INFO_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1528             : 
    +    1529          20 :       takingoff_ = true;
    +    1530          20 :       number_of_takeoffs_++;
    +    1531          20 :       waiting_for_takeoff_ = true;
    +    1532             : 
    +    1533             :       // start the takeoff timer
    +    1534          20 :       timer_takeoff_.start();
    +    1535             : 
    +    1536          20 :       takeoff_successful_ = takeoff_successful;
    +    1537             : 
    +    1538             :     } else {
    +    1539             : 
    +    1540           0 :       std::stringstream ss;
    +    1541           0 :       ss << "takeoff was not successful";
    +    1542           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1543           0 :       res.success = false;
    +    1544           0 :       res.message = ss.str();
    +    1545             : 
    +    1546             :       // if the call for takeoff fails, call for emergency landing
    +    1547           0 :       elandSrv();
    +    1548             :     }
    +    1549             :   }
    +    1550             : 
    +    1551          20 :   return true;
    +    1552             : }
    +    1553             : 
    +    1554             : //}
    +    1555             : 
    +    1556             : /* //{ callbackLand() */
    +    1557             : 
    +    1558           2 : bool UavManager::callbackLand([[maybe_unused]] std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res) {
    +    1559             : 
    +    1560           2 :   if (!is_initialized_)
    +    1561           0 :     return false;
    +    1562             : 
    +    1563           2 :   ROS_INFO("[UavManager]: land called by service");
    +    1564             : 
    +    1565             :   /* preconditions //{ */
    +    1566             : 
    +    1567             :   {
    +    1568           2 :     std::stringstream ss;
    +    1569             : 
    +    1570           2 :     if (!sh_odometry_.hasMsg()) {
    +    1571           0 :       ss << "can not land, missing odometry!";
    +    1572           0 :       res.message = ss.str();
    +    1573           0 :       res.success = false;
    +    1574           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1575           0 :       return true;
    +    1576             :     }
    +    1577             : 
    +    1578             :     {
    +    1579           2 :       if (!sh_control_manager_diag_.hasMsg()) {
    +    1580           0 :         ss << "can not land, missing control manager diagnostics!";
    +    1581           0 :         res.message = ss.str();
    +    1582           0 :         res.success = false;
    +    1583           0 :         ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1584           0 :         return true;
    +    1585             :       }
    +    1586             : 
    +    1587           2 :       if (_null_tracker_name_ == sh_control_manager_diag_.getMsg()->active_tracker) {
    +    1588           0 :         ss << "can not land, '" << _null_tracker_name_ << "' is active!";
    +    1589           0 :         ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1590           0 :         res.message = ss.str();
    +    1591           0 :         res.success = false;
    +    1592           0 :         return true;
    +    1593             :       }
    +    1594             :     }
    +    1595             : 
    +    1596           2 :     if (!sh_controller_diagnostics_.hasMsg()) {
    +    1597           0 :       ss << "can not land, missing controller diagnostics!";
    +    1598           0 :       res.message = ss.str();
    +    1599           0 :       res.success = false;
    +    1600           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1601           0 :       return true;
    +    1602             :     }
    +    1603             : 
    +    1604           2 :     if (!sh_tracker_cmd_.hasMsg()) {
    +    1605           0 :       ss << "can not land, missing position cmd!";
    +    1606           0 :       res.message = ss.str();
    +    1607           0 :       res.success = false;
    +    1608           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1609           0 :       return true;
    +    1610             :     }
    +    1611             :   }
    +    1612             : 
    +    1613             :   //}
    +    1614             : 
    +    1615           2 :   auto [success, message] = landWithDescendImpl();
    +    1616             : 
    +    1617           2 :   res.message = message;
    +    1618           2 :   res.success = success;
    +    1619             : 
    +    1620           2 :   return true;
    +    1621             : }
    +    1622             : 
    +    1623             : //}
    +    1624             : 
    +    1625             : /* //{ callbackLandHome() */
    +    1626             : 
    +    1627           2 : bool UavManager::callbackLandHome([[maybe_unused]] std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res) {
    +    1628             : 
    +    1629           2 :   if (!is_initialized_)
    +    1630           0 :     return false;
    +    1631             : 
    +    1632           2 :   ROS_INFO("[UavManager]: land home called by service");
    +    1633             : 
    +    1634             :   /* preconditions //{ */
    +    1635             : 
    +    1636             :   {
    +    1637           2 :     std::stringstream ss;
    +    1638             : 
    +    1639           2 :     if (number_of_takeoffs_ == 0) {
    +    1640           0 :       ss << "can not land home, did not takeoff before!";
    +    1641           0 :       res.message = ss.str();
    +    1642           0 :       res.success = false;
    +    1643           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1644           0 :       return true;
    +    1645             :     }
    +    1646             : 
    +    1647           2 :     if (!sh_odometry_.hasMsg()) {
    +    1648           0 :       ss << "can not land, missing odometry!";
    +    1649           0 :       res.message = ss.str();
    +    1650           0 :       res.success = false;
    +    1651           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1652           0 :       return true;
    +    1653             :     }
    +    1654             : 
    +    1655             :     {
    +    1656           2 :       if (!sh_control_manager_diag_.hasMsg()) {
    +    1657           0 :         ss << "can not land, missing tracker status!";
    +    1658           0 :         res.message = ss.str();
    +    1659           0 :         res.success = false;
    +    1660           0 :         ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1661           0 :         return true;
    +    1662             :       }
    +    1663             : 
    +    1664           2 :       if (_null_tracker_name_ == sh_control_manager_diag_.getMsg()->active_tracker) {
    +    1665           0 :         ss << "can not land, '" << _null_tracker_name_ << "' is active!";
    +    1666           0 :         ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1667           0 :         res.message = ss.str();
    +    1668           0 :         res.success = false;
    +    1669           0 :         return true;
    +    1670             :       }
    +    1671             :     }
    +    1672             : 
    +    1673           2 :     if (!sh_controller_diagnostics_.hasMsg()) {
    +    1674           0 :       ss << "can not land, missing controller diagnostics command!";
    +    1675           0 :       res.message = ss.str();
    +    1676           0 :       res.success = false;
    +    1677           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1678           0 :       return true;
    +    1679             :     }
    +    1680             : 
    +    1681           2 :     if (!sh_tracker_cmd_.hasMsg()) {
    +    1682           0 :       ss << "can not land, missing position cmd!";
    +    1683           0 :       res.message = ss.str();
    +    1684           0 :       res.success = false;
    +    1685           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1686           0 :       return true;
    +    1687             :     }
    +    1688             : 
    +    1689           2 :     if (fixing_max_height_) {
    +    1690           0 :       ss << "can not land, descedning to safe height!";
    +    1691           0 :       res.message = ss.str();
    +    1692           0 :       res.success = false;
    +    1693           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1694           0 :       return true;
    +    1695             :     }
    +    1696             : 
    +    1697           2 :     if (current_state_landing_ != IDLE_STATE) {
    +    1698           0 :       ss << "can not land, already landing!";
    +    1699           0 :       res.message = ss.str();
    +    1700           0 :       res.success = false;
    +    1701           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1702           0 :       return true;
    +    1703             :     }
    +    1704             :   }
    +    1705             : 
    +    1706             :   //}
    +    1707             : 
    +    1708           2 :   ungripSrv();
    +    1709             : 
    +    1710           4 :   mrs_msgs::ReferenceStamped reference_out;
    +    1711             : 
    +    1712             :   {
    +    1713           2 :     std::scoped_lock lock(mutex_land_there_reference_);
    +    1714             : 
    +    1715             :     // get the current altitude in land_there_reference_.header.frame_id;
    +    1716           2 :     geometry_msgs::PoseStamped current_pose;
    +    1717           2 :     current_pose.header.stamp     = ros::Time::now();
    +    1718           2 :     current_pose.header.frame_id  = _uav_name_ + "/fcu";
    +    1719           2 :     current_pose.pose.position.x  = 0;
    +    1720           2 :     current_pose.pose.position.y  = 0;
    +    1721           2 :     current_pose.pose.position.z  = 0;
    +    1722           2 :     current_pose.pose.orientation = mrs_lib::AttitudeConverter(0, 0, 0);
    +    1723             : 
    +    1724           2 :     auto response = transformer_->transformSingle(current_pose, land_there_reference_.header.frame_id);
    +    1725             : 
    +    1726           2 :     if (response) {
    +    1727             : 
    +    1728           2 :       land_there_reference_.reference.position.z = response.value().pose.position.z;
    +    1729           2 :       ROS_DEBUG("[UavManager]: current altitude is %.2f m", land_there_reference_.reference.position.z);
    +    1730             : 
    +    1731             :     } else {
    +    1732             : 
    +    1733           0 :       std::stringstream ss;
    +    1734           0 :       ss << "could not transform current height to " << land_there_reference_.header.frame_id;
    +    1735           0 :       ROS_ERROR_STREAM("[UavManager]: " << ss.str());
    +    1736             : 
    +    1737           0 :       res.success = false;
    +    1738           0 :       res.message = ss.str();
    +    1739           0 :       return true;
    +    1740             :     }
    +    1741             : 
    +    1742           2 :     reference_out.header.frame_id = land_there_reference_.header.frame_id;
    +    1743           2 :     reference_out.header.stamp    = ros::Time::now();
    +    1744           2 :     reference_out.reference       = land_there_reference_.reference;
    +    1745             : 
    +    1746           2 :     land_there_reference_ = reference_out;
    +    1747             :   }
    +    1748             : 
    +    1749           2 :   bool service_success = emergencyReferenceSrv(reference_out);
    +    1750             : 
    +    1751           2 :   if (service_success) {
    +    1752             : 
    +    1753           4 :     std::stringstream ss;
    +    1754           2 :     ss << "flying home for landing";
    +    1755           2 :     ROS_INFO_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1756             : 
    +    1757           2 :     res.success = true;
    +    1758           2 :     res.message = ss.str();
    +    1759             : 
    +    1760             :     // stop the eventual takeoff
    +    1761           2 :     waiting_for_takeoff_ = false;
    +    1762           2 :     takingoff_           = false;
    +    1763           2 :     timer_takeoff_.stop();
    +    1764             : 
    +    1765           2 :     throttle_under_threshold_          = false;
    +    1766           2 :     throttle_mass_estimate_first_time_ = ros::Time(0);
    +    1767             : 
    +    1768           2 :     changeLandingState(GOTO_STATE);
    +    1769             : 
    +    1770           2 :     timer_landing_.start();
    +    1771             : 
    +    1772             :   } else {
    +    1773             : 
    +    1774           0 :     std::stringstream ss;
    +    1775           0 :     ss << "can not fly home for landing";
    +    1776           0 :     ROS_ERROR_STREAM("[UavManager]: " << ss.str());
    +    1777             : 
    +    1778           0 :     res.success = false;
    +    1779           0 :     res.message = ss.str();
    +    1780             :   }
    +    1781             : 
    +    1782           2 :   return true;
    +    1783             : }
    +    1784             : 
    +    1785             : //}
    +    1786             : 
    +    1787             : /* //{ callbackLandThere() */
    +    1788             : 
    +    1789           1 : bool UavManager::callbackLandThere(mrs_msgs::ReferenceStampedSrv::Request& req, mrs_msgs::ReferenceStampedSrv::Response& res) {
    +    1790             : 
    +    1791           1 :   if (!is_initialized_)
    +    1792           0 :     return false;
    +    1793             : 
    +    1794           1 :   ROS_INFO("[UavManager]: land there called by service");
    +    1795             : 
    +    1796             :   /* preconditions //{ */
    +    1797             : 
    +    1798             :   {
    +    1799           1 :     std::stringstream ss;
    +    1800             : 
    +    1801           1 :     if (!sh_odometry_.hasMsg()) {
    +    1802           0 :       ss << "can not land, missing odometry!";
    +    1803           0 :       res.message = ss.str();
    +    1804           0 :       res.success = false;
    +    1805           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1806           0 :       return true;
    +    1807             :     }
    +    1808             : 
    +    1809             :     {
    +    1810           1 :       if (!sh_control_manager_diag_.hasMsg()) {
    +    1811           0 :         ss << "can not land, missing tracker status!";
    +    1812           0 :         res.message = ss.str();
    +    1813           0 :         res.success = false;
    +    1814           0 :         ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1815           0 :         return true;
    +    1816             :       }
    +    1817             : 
    +    1818           1 :       if (_null_tracker_name_ == sh_control_manager_diag_.getMsg()->active_tracker) {
    +    1819           0 :         ss << "can not land, '" << _null_tracker_name_ << "' is active!";
    +    1820           0 :         ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1821           0 :         res.message = ss.str();
    +    1822           0 :         res.success = false;
    +    1823           0 :         return true;
    +    1824             :       }
    +    1825             :     }
    +    1826             : 
    +    1827           1 :     if (!sh_controller_diagnostics_.hasMsg()) {
    +    1828           0 :       ss << "can not land, missing controller diagnostics!";
    +    1829           0 :       res.message = ss.str();
    +    1830           0 :       res.success = false;
    +    1831           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1832           0 :       return true;
    +    1833             :     }
    +    1834             : 
    +    1835           1 :     if (!sh_tracker_cmd_.hasMsg()) {
    +    1836           0 :       ss << "can not land, missing position cmd!";
    +    1837           0 :       res.message = ss.str();
    +    1838           0 :       res.success = false;
    +    1839           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1840           0 :       return true;
    +    1841             :     }
    +    1842             : 
    +    1843           1 :     if (fixing_max_height_) {
    +    1844           0 :       ss << "can not land, descedning to safe height!";
    +    1845           0 :       res.message = ss.str();
    +    1846           0 :       res.success = false;
    +    1847           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1848           0 :       return true;
    +    1849             :     }
    +    1850             :   }
    +    1851             : 
    +    1852             :   //}
    +    1853             : 
    +    1854           1 :   ungripSrv();
    +    1855             : 
    +    1856           2 :   auto odometry = sh_odometry_.getMsg();
    +    1857             : 
    +    1858             :   // | ------ transform the reference to the current frame ------ |
    +    1859             : 
    +    1860           2 :   mrs_msgs::ReferenceStamped reference_in;
    +    1861           1 :   reference_in.header    = req.header;
    +    1862           1 :   reference_in.reference = req.reference;
    +    1863             : 
    +    1864           2 :   auto result = transformer_->transformSingle(reference_in, odometry->header.frame_id);
    +    1865             : 
    +    1866           1 :   if (!result) {
    +    1867           0 :     std::stringstream ss;
    +    1868           0 :     ss << "can not transform the reference to the current control frame!";
    +    1869           0 :     res.message = ss.str();
    +    1870           0 :     res.success = false;
    +    1871           0 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1872           0 :     return true;
    +    1873             :   }
    +    1874             : 
    +    1875             :   {
    +    1876           1 :     std::scoped_lock lock(mutex_land_there_reference_);
    +    1877             : 
    +    1878           1 :     land_there_reference_.header               = odometry->header;
    +    1879           1 :     land_there_reference_.reference            = reference_in.reference;
    +    1880           1 :     land_there_reference_.reference.position.z = odometry->pose.pose.position.z;
    +    1881             :   }
    +    1882             : 
    +    1883           1 :   bool service_success = emergencyReferenceSrv(land_there_reference_);
    +    1884             : 
    +    1885           1 :   if (service_success) {
    +    1886             : 
    +    1887           2 :     std::stringstream ss;
    +    1888           1 :     ss << "flying there for landing";
    +    1889           1 :     ROS_INFO_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1890             : 
    +    1891           1 :     res.success = true;
    +    1892           1 :     res.message = ss.str();
    +    1893             : 
    +    1894             :     // stop the eventual takeoff
    +    1895           1 :     waiting_for_takeoff_ = false;
    +    1896           1 :     takingoff_           = false;
    +    1897           1 :     timer_takeoff_.stop();
    +    1898             : 
    +    1899           1 :     throttle_under_threshold_          = false;
    +    1900           1 :     throttle_mass_estimate_first_time_ = ros::Time(0);
    +    1901             : 
    +    1902           1 :     changeLandingState(GOTO_STATE);
    +    1903             : 
    +    1904           1 :     timer_landing_.start();
    +    1905             : 
    +    1906             :   } else {
    +    1907             : 
    +    1908           0 :     std::stringstream ss;
    +    1909           0 :     ss << "can not fly there for landing";
    +    1910           0 :     ROS_ERROR_STREAM("[UavManager]: " << ss.str());
    +    1911             : 
    +    1912           0 :     res.success = false;
    +    1913           0 :     res.message = ss.str();
    +    1914             :   }
    +    1915             : 
    +    1916           1 :   return true;
    +    1917             : }
    +    1918             : 
    +    1919             : //}
    +    1920             : 
    +    1921             : /* //{ callbackMidairActivation() */
    +    1922             : 
    +    1923          65 : bool UavManager::callbackMidairActivation([[maybe_unused]] std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res) {
    +    1924             : 
    +    1925          65 :   if (!is_initialized_)
    +    1926           0 :     return false;
    +    1927             : 
    +    1928          65 :   ROS_INFO("[UavManager]: midair activation called by service");
    +    1929             : 
    +    1930             :   /* preconditions //{ */
    +    1931             : 
    +    1932             :   {
    +    1933          65 :     std::stringstream ss;
    +    1934             : 
    +    1935          65 :     if (!sh_odometry_.hasMsg()) {
    +    1936           0 :       ss << "can not activate, missing odometry!";
    +    1937           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1938           0 :       res.message = ss.str();
    +    1939           0 :       res.success = false;
    +    1940           0 :       return true;
    +    1941             :     }
    +    1942             : 
    +    1943          65 :     if (!sh_hw_api_status_.hasMsg() || (ros::Time::now() - sh_hw_api_status_.lastMsgTime()).toSec() > 5.0) {
    +    1944           0 :       ss << "can not activate, missing HW API status!";
    +    1945           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1946           0 :       res.message = ss.str();
    +    1947           0 :       res.success = false;
    +    1948           0 :       return true;
    +    1949             :     }
    +    1950             : 
    +    1951          65 :     if (!sh_hw_api_status_.getMsg()->armed) {
    +    1952           0 :       ss << "can not activate, UAV not armed!";
    +    1953           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1954           0 :       res.message = ss.str();
    +    1955           0 :       res.success = false;
    +    1956           0 :       return true;
    +    1957             :     }
    +    1958             : 
    +    1959          65 :     if (sh_hw_api_status_.getMsg()->offboard) {
    +    1960           0 :       ss << "can not activate, UAV already in offboard mode!";
    +    1961           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1962           0 :       res.message = ss.str();
    +    1963           0 :       res.success = false;
    +    1964           0 :       return true;
    +    1965             :     }
    +    1966             : 
    +    1967             :     {
    +    1968          65 :       if (!sh_control_manager_diag_.hasMsg()) {
    +    1969           0 :         ss << "can not activate, missing control manager diagnostics!";
    +    1970           0 :         ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1971           0 :         res.message = ss.str();
    +    1972           0 :         res.success = false;
    +    1973           0 :         return true;
    +    1974             :       }
    +    1975             : 
    +    1976          65 :       if (_null_tracker_name_ != sh_control_manager_diag_.getMsg()->active_tracker) {
    +    1977           0 :         ss << "can not activate, need '" << _null_tracker_name_ << "' to be active!";
    +    1978           0 :         ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1979           0 :         res.message = ss.str();
    +    1980           0 :         res.success = false;
    +    1981           0 :         return true;
    +    1982             :       }
    +    1983             :     }
    +    1984             : 
    +    1985          65 :     if (!sh_controller_diagnostics_.hasMsg()) {
    +    1986           0 :       ss << "can not activate, missing controller diagnostics!";
    +    1987           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1988           0 :       res.message = ss.str();
    +    1989           0 :       res.success = false;
    +    1990           0 :       return true;
    +    1991             :     }
    +    1992             : 
    +    1993          65 :     if (_gain_manager_required_ && (ros::Time::now() - sh_gains_diag_.lastMsgTime()).toSec() > 5.0) {
    +    1994           0 :       ss << "can not activate, GainManager is not running!";
    +    1995           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    1996           0 :       res.message = ss.str();
    +    1997           0 :       res.success = false;
    +    1998           0 :       return true;
    +    1999             :     }
    +    2000             : 
    +    2001          65 :     if (_constraint_manager_required_ && (ros::Time::now() - sh_constraints_diag_.lastMsgTime()).toSec() > 5.0) {
    +    2002           0 :       ss << "can not activate, ConstraintManager is not running!";
    +    2003           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    2004           0 :       res.message = ss.str();
    +    2005           0 :       res.success = false;
    +    2006           0 :       return true;
    +    2007             :     }
    +    2008             : 
    +    2009          65 :     if (number_of_takeoffs_ > 0) {
    +    2010           0 :       ss << "can not activate, we flew already!";
    +    2011           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    2012           0 :       res.message = ss.str();
    +    2013           0 :       res.success = false;
    +    2014           0 :       return true;
    +    2015             :     }
    +    2016             :   }
    +    2017             : 
    +    2018             :   //}
    +    2019             : 
    +    2020          65 :   auto [success, message] = midairActivationImpl();
    +    2021             : 
    +    2022          65 :   res.message = message;
    +    2023          65 :   res.success = success;
    +    2024             : 
    +    2025          65 :   return true;
    +    2026             : }
    +    2027             : 
    +    2028             : //}
    +    2029             : 
    +    2030             : /* //{ callbackMinHeightCheck() */
    +    2031             : 
    +    2032           2 : bool UavManager::callbackMinHeightCheck([[maybe_unused]] std_srvs::SetBool::Request& req, std_srvs::SetBool::Response& res) {
    +    2033             : 
    +    2034           2 :   if (!is_initialized_)
    +    2035           0 :     return false;
    +    2036             : 
    +    2037           2 :   min_height_check_ = req.data;
    +    2038             : 
    +    2039           2 :   std::stringstream ss;
    +    2040             : 
    +    2041           2 :   ss << "min height check " << (min_height_check_ ? "enabled" : "disabled");
    +    2042             : 
    +    2043           2 :   if (min_height_check_) {
    +    2044           1 :     timer_min_height_.start();
    +    2045             :   } else {
    +    2046           1 :     timer_min_height_.stop();
    +    2047             :   }
    +    2048             : 
    +    2049           2 :   ROS_INFO_STREAM("[UavManager]: " << ss.str());
    +    2050             : 
    +    2051           2 :   res.message = ss.str();
    +    2052           2 :   res.success = true;
    +    2053             : 
    +    2054           2 :   return true;
    +    2055             : }
    +    2056             : 
    +    2057             : //}
    +    2058             : 
    +    2059             : // | ------------------------ routines ------------------------ |
    +    2060             : 
    +    2061             : /* landImpl() //{ */
    +    2062             : 
    +    2063           5 : std::tuple<bool, std::string> UavManager::landImpl(void) {
    +    2064             : 
    +    2065             :   // activating the landing controller
    +    2066             :   {
    +    2067           5 :     std::string old_controller      = sh_control_manager_diag_.getMsg()->active_controller;
    +    2068           5 :     bool        controller_switched = switchControllerSrv(_landing_controller_name_);
    +    2069             : 
    +    2070             :     // if it fails, activate eland
    +    2071             :     // Tomas: I pressume that its more important to get the UAV to the ground rather than
    +    2072             :     // just throw out error.
    +    2073           5 :     if (!controller_switched) {
    +    2074             : 
    +    2075           0 :       std::stringstream ss;
    +    2076           0 :       ss << "could not activate '" << _takeoff_controller_name_ << "' for landing";
    +    2077           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    2078             : 
    +    2079           0 :       elandSrv();
    +    2080             : 
    +    2081           0 :       return std::tuple(false, ss.str());
    +    2082             :     }
    +    2083             :   }
    +    2084             : 
    +    2085             :   // activate the landing tracker
    +    2086             :   {
    +    2087           5 :     std::string old_tracker      = sh_control_manager_diag_.getMsg()->active_tracker;
    +    2088           5 :     bool        tracker_switched = switchTrackerSrv(_landing_tracker_name_);
    +    2089             : 
    +    2090             :     // if it fails, activate eland
    +    2091             :     // Tomas: I pressume that its more important to get the UAV to the ground rather than
    +    2092             :     // just throw out error.
    +    2093           5 :     if (!tracker_switched) {
    +    2094             : 
    +    2095           0 :       std::stringstream ss;
    +    2096           0 :       ss << "could not activate '" << _takeoff_tracker_name_ << "' for landing";
    +    2097           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    2098             : 
    +    2099           0 :       elandSrv();
    +    2100             : 
    +    2101           0 :       return std::tuple(false, ss.str());
    +    2102             :     }
    +    2103             :   }
    +    2104             : 
    +    2105             :   // call the landing service
    +    2106             :   {
    +    2107           5 :     bool land_successful = landSrv();
    +    2108             : 
    +    2109           5 :     if (land_successful) {
    +    2110             : 
    +    2111             :       // stop the eventual takeoff
    +    2112           5 :       waiting_for_takeoff_ = false;
    +    2113           5 :       takingoff_           = false;
    +    2114           5 :       timer_takeoff_.stop();
    +    2115             : 
    +    2116             :       // stop counting the flight time
    +    2117           5 :       timer_flighttime_.stop();
    +    2118             : 
    +    2119          10 :       auto controller_diagnostics = sh_controller_diagnostics_.getMsg();
    +    2120             : 
    +    2121             :       // remember the last valid mass estimated
    +    2122             :       // used during subsequent takeoff
    +    2123           5 :       if (controller_diagnostics->mass_estimator) {
    +    2124           5 :         last_mass_difference_ = controller_diagnostics->mass_difference;
    +    2125             :       }
    +    2126             : 
    +    2127           5 :       setOdometryCallbacksSrv(false);
    +    2128             : 
    +    2129           5 :       changeLandingState(LANDING_STATE);
    +    2130             : 
    +    2131           5 :       throttle_under_threshold_          = false;
    +    2132           5 :       throttle_mass_estimate_first_time_ = ros::Time(0);
    +    2133             : 
    +    2134           5 :       timer_landing_.start();
    +    2135             : 
    +    2136           5 :       std::stringstream ss;
    +    2137           5 :       ss << "landing initiated";
    +    2138           5 :       ROS_INFO_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    2139             : 
    +    2140           5 :       return std::tuple(true, ss.str());
    +    2141             : 
    +    2142             :     } else {
    +    2143             : 
    +    2144           0 :       std::stringstream ss;
    +    2145           0 :       ss << "could not land";
    +    2146           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    2147             : 
    +    2148           0 :       elandSrv();
    +    2149             : 
    +    2150           0 :       return std::tuple(false, ss.str());
    +    2151             :     }
    +    2152             :   }
    +    2153             : }
    +    2154             : 
    +    2155             : //}
    +    2156             : 
    +    2157             : /* landWithDescendImpl() //{ */
    +    2158             : 
    +    2159           9 : std::tuple<bool, std::string> UavManager::landWithDescendImpl(void) {
    +    2160             : 
    +    2161             :   // if the height information is available
    +    2162           9 :   if (sh_height_.hasMsg()) {
    +    2163             : 
    +    2164           9 :     double height = sh_height_.getMsg()->value;
    +    2165             : 
    +    2166           9 :     if (height > 0 && height >= _landing_descend_height_ + 1.0) {
    +    2167             : 
    +    2168           4 :       auto odometry = sh_odometry_.getMsg();
    +    2169             : 
    +    2170           4 :       ungripSrv();
    +    2171             : 
    +    2172             :       {
    +    2173           4 :         std::scoped_lock lock(mutex_land_there_reference_);
    +    2174             : 
    +    2175             :         // FOR FUTURE ME: Do not change this, we need it to be filled for the final check later
    +    2176           4 :         land_there_reference_.header.frame_id      = "";
    +    2177           4 :         land_there_reference_.header.stamp         = ros::Time::now();
    +    2178           4 :         land_there_reference_.reference.position.x = odometry->pose.pose.position.x;
    +    2179           4 :         land_there_reference_.reference.position.y = odometry->pose.pose.position.y;
    +    2180           4 :         land_there_reference_.reference.position.z = odometry->pose.pose.position.z - (height - _landing_descend_height_);
    +    2181           4 :         land_there_reference_.reference.heading    = mrs_lib::AttitudeConverter(odometry->pose.pose.orientation).getHeading();
    +    2182             :       }
    +    2183             : 
    +    2184           4 :       bool service_success = emergencyReferenceSrv(land_there_reference_);
    +    2185             : 
    +    2186           4 :       if (service_success) {
    +    2187             : 
    +    2188           4 :         std::stringstream ss;
    +    2189           4 :         ss << "flying down for landing";
    +    2190           4 :         ROS_INFO_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    2191             : 
    +    2192             :         // stop the eventual takeoff
    +    2193           4 :         waiting_for_takeoff_ = false;
    +    2194           4 :         takingoff_           = false;
    +    2195           4 :         timer_takeoff_.stop();
    +    2196             : 
    +    2197           4 :         changeLandingState(GOTO_STATE);
    +    2198             : 
    +    2199           4 :         throttle_under_threshold_          = false;
    +    2200           4 :         throttle_mass_estimate_first_time_ = ros::Time(0);
    +    2201             : 
    +    2202           4 :         timer_landing_.start();
    +    2203             : 
    +    2204           4 :         return std::tuple(true, ss.str());
    +    2205             : 
    +    2206             :       } else {
    +    2207             : 
    +    2208           0 :         std::stringstream ss;
    +    2209           0 :         ss << "can not fly down for landing";
    +    2210           0 :         ROS_ERROR_STREAM("[UavManager]: " << ss.str());
    +    2211             :       }
    +    2212             :     }
    +    2213             :   }
    +    2214             : 
    +    2215          10 :   auto [success, message] = landImpl();
    +    2216             : 
    +    2217           5 :   return std::tuple(success, message);
    +    2218             : }
    +    2219             : 
    +    2220             : //}
    +    2221             : 
    +    2222             : /* midairActivationImpl() //{ */
    +    2223             : 
    +    2224          65 : std::tuple<bool, std::string> UavManager::midairActivationImpl(void) {
    +    2225             : 
    +    2226             :   // 1. activate the mid-air activation controller
    +    2227             :   // the controller will output hover-like control output
    +    2228         130 :   std::string old_controller;
    +    2229             :   {
    +    2230          65 :     old_controller           = sh_control_manager_diag_.getMsg()->active_controller;
    +    2231          65 :     bool controller_switched = switchControllerSrv(_midair_activation_during_controller_);
    +    2232             : 
    +    2233          65 :     if (!controller_switched) {
    +    2234             : 
    +    2235           0 :       std::stringstream ss;
    +    2236           0 :       ss << "could not activate '" << _midair_activation_during_controller_ << "' for midair activation";
    +    2237           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    2238             : 
    +    2239           0 :       return std::tuple(false, ss.str());
    +    2240             :     }
    +    2241             :   }
    +    2242             : 
    +    2243             :   // 2. turn Control Manager's output ON
    +    2244             :   {
    +    2245          65 :     bool output_enabled = toggleControlOutput(true);
    +    2246             : 
    +    2247          65 :     if (!output_enabled) {
    +    2248             : 
    +    2249           1 :       switchControllerSrv(old_controller);
    +    2250             : 
    +    2251           1 :       std::stringstream ss;
    +    2252           1 :       ss << "could not enable Control Manager's output";
    +    2253           1 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    2254             : 
    +    2255           1 :       return std::tuple(false, ss.str());
    +    2256             :     }
    +    2257             :   }
    +    2258             : 
    +    2259             :   // 3. activate the mid-air activation tracker
    +    2260             :   // this will cause the Control Manager to output something else than min-throttle
    +    2261         128 :   std::string old_tracker;
    +    2262             :   {
    +    2263          64 :     old_tracker = sh_control_manager_diag_.getMsg()->active_tracker;
    +    2264             : 
    +    2265          64 :     bool tracker_switched = switchTrackerSrv(_midair_activation_during_tracker_);
    +    2266             : 
    +    2267          64 :     if (!tracker_switched) {
    +    2268             : 
    +    2269           0 :       switchControllerSrv(old_controller);
    +    2270           0 :       toggleControlOutput(false);
    +    2271             : 
    +    2272           0 :       std::stringstream ss;
    +    2273           0 :       ss << "could not activate '" << _midair_activation_during_tracker_ << "' for midair activation";
    +    2274           0 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    2275             : 
    +    2276           0 :       return std::tuple(false, ss.str());
    +    2277             :     }
    +    2278             :   }
    +    2279             : 
    +    2280             :   // 4. wait for 50 ms, that should be enough for the Pixhawk to start getting data
    +    2281          64 :   ros::Duration(0.05).sleep();
    +    2282             : 
    +    2283             :   // 5. turn on the OFFBOARD MODE
    +    2284             :   // since now, the UAV should be under our control
    +    2285             :   {
    +    2286          64 :     bool offboard_set = offboardSrv(true);
    +    2287             : 
    +    2288          64 :     if (!offboard_set) {
    +    2289             : 
    +    2290           1 :       switchTrackerSrv(old_tracker);
    +    2291           1 :       switchControllerSrv(old_controller);
    +    2292           1 :       toggleControlOutput(false);
    +    2293             : 
    +    2294           1 :       std::stringstream ss;
    +    2295           1 :       ss << "could not activate offboard mode";
    +    2296           1 :       ROS_ERROR_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    2297             : 
    +    2298           1 :       return std::tuple(false, ss.str());
    +    2299             :     }
    +    2300             :   }
    +    2301             : 
    +    2302             :   // remember this time, later check for timeout
    +    2303          63 :   midair_activation_started_ = ros::Time::now();
    +    2304             : 
    +    2305             :   // start the timer which should check if the offboard is on, activate proper controller and tracker or timeout
    +    2306          63 :   timer_midair_activation_.start();
    +    2307             : 
    +    2308          63 :   std::stringstream ss;
    +    2309          63 :   ss << "midair activation initiated, starting the timer";
    +    2310          63 :   ROS_INFO_STREAM_THROTTLE(1.0, "[UavManager]: " << ss.str());
    +    2311             : 
    +    2312          63 :   return std::tuple(true, ss.str());
    +    2313             : }
    +    2314             : 
    +    2315             : //}
    +    2316             : 
    +    2317             : // | ----------------- service client wrappers ---------------- |
    +    2318             : 
    +    2319             : /* setOdometryCallbacksSrv() //{ */
    +    2320             : 
    +    2321         110 : void UavManager::setOdometryCallbacksSrv(const bool& input) {
    +    2322             : 
    +    2323         110 :   ROS_INFO("[UavManager]: switching odometry callbacks to %s", input ? "ON" : "OFF");
    +    2324             : 
    +    2325         220 :   std_srvs::SetBool srv;
    +    2326             : 
    +    2327         110 :   srv.request.data = input;
    +    2328             : 
    +    2329         110 :   bool res = sch_odometry_callbacks_.call(srv);
    +    2330             : 
    +    2331         110 :   if (res) {
    +    2332             : 
    +    2333         110 :     if (!srv.response.success) {
    +    2334           0 :       ROS_WARN("[UavManager]: service call for toggle odometry callbacks returned: %s.", srv.response.message.c_str());
    +    2335             :     }
    +    2336             : 
    +    2337             :   } else {
    +    2338           0 :     ROS_ERROR("[UavManager]: service call for toggle odometry callbacks failed!");
    +    2339             :   }
    +    2340         110 : }
    +    2341             : 
    +    2342             : //}
    +    2343             : 
    +    2344             : /* setControlCallbacksSrv() //{ */
    +    2345             : 
    +    2346          95 : void UavManager::setControlCallbacksSrv(const bool& input) {
    +    2347             : 
    +    2348          95 :   ROS_INFO("[UavManager]: switching control callbacks to %s", input ? "ON" : "OFF");
    +    2349             : 
    +    2350         190 :   std_srvs::SetBool srv;
    +    2351             : 
    +    2352          95 :   srv.request.data = input;
    +    2353             : 
    +    2354          95 :   bool res = sch_control_callbacks_.call(srv);
    +    2355             : 
    +    2356          95 :   if (res) {
    +    2357             : 
    +    2358          95 :     if (!srv.response.success) {
    +    2359           0 :       ROS_WARN("[UavManager]: service call for setting control callbacks returned: %s.", srv.response.message.c_str());
    +    2360             :     }
    +    2361             : 
    +    2362             :   } else {
    +    2363           0 :     ROS_ERROR("[UavManager]: service call for setting control callbacks failed!");
    +    2364             :   }
    +    2365          95 : }
    +    2366             : 
    +    2367             : //}
    +    2368             : 
    +    2369             : /* ungripSrv() //{ */
    +    2370             : 
    +    2371          23 : void UavManager::ungripSrv(void) {
    +    2372             : 
    +    2373          23 :   ROS_DEBUG_THROTTLE(1.0, "[UavManager]: ungripping payload");
    +    2374             : 
    +    2375          46 :   std_srvs::Trigger srv;
    +    2376             : 
    +    2377          23 :   bool res = sch_ungrip_.call(srv);
    +    2378             : 
    +    2379          23 :   if (res) {
    +    2380             : 
    +    2381           0 :     if (!srv.response.success) {
    +    2382           0 :       ROS_DEBUG_THROTTLE(1.0, "[UavManager]: service call for ungripping payload returned: %s.", srv.response.message.c_str());
    +    2383             :     }
    +    2384             : 
    +    2385             :   } else {
    +    2386          23 :     ROS_DEBUG_THROTTLE(1.0, "[UavManager]: service call for ungripping payload failed!");
    +    2387             :   }
    +    2388          23 : }
    +    2389             : 
    +    2390             : //}
    +    2391             : 
    +    2392             : /* toggleControlOutput() //{ */
    +    2393             : 
    +    2394          68 : bool UavManager::toggleControlOutput(const bool& input) {
    +    2395             : 
    +    2396          68 :   ROS_DEBUG_THROTTLE(1.0, "[UavManager]: toggling control output %s", input ? "ON" : "OFF");
    +    2397             : 
    +    2398         136 :   std_srvs::SetBool srv;
    +    2399             : 
    +    2400          68 :   srv.request.data = input;
    +    2401             : 
    +    2402          68 :   bool res = sch_toggle_control_output_.call(srv);
    +    2403             : 
    +    2404          68 :   if (res) {
    +    2405             : 
    +    2406          67 :     if (!srv.response.success) {
    +    2407           0 :       ROS_DEBUG_THROTTLE(1.0, "[UavManager]: service call for control output returned: %s.", srv.response.message.c_str());
    +    2408           0 :       return false;
    +    2409             :     } else {
    +    2410          67 :       return true;
    +    2411             :     }
    +    2412             : 
    +    2413             :   } else {
    +    2414           1 :     ROS_DEBUG_THROTTLE(1.0, "[UavManager]: service call for control output failed!");
    +    2415           1 :     return false;
    +    2416             :   }
    +    2417             : }
    +    2418             : 
    +    2419             : //}
    +    2420             : 
    +    2421             : /* offboardSrv() //{ */
    +    2422             : 
    +    2423          64 : bool UavManager::offboardSrv(const bool in) {
    +    2424             : 
    +    2425          64 :   ROS_DEBUG_THROTTLE(1.0, "[UavManager]: setting offboard to %d", in);
    +    2426             : 
    +    2427         128 :   std_srvs::Trigger srv;
    +    2428             : 
    +    2429          64 :   bool res = sch_offboard_.call(srv);
    +    2430             : 
    +    2431          64 :   if (!res) {
    +    2432             : 
    +    2433           1 :     ROS_DEBUG_THROTTLE(1.0, "[UavManager]: service call for offboard failed!");
    +    2434           1 :     return false;
    +    2435             : 
    +    2436             :   } else {
    +    2437             : 
    +    2438          63 :     if (!srv.response.success) {
    +    2439           0 :       ROS_DEBUG_THROTTLE(1.0, "[UavManager]: service call for offboard failed, returned: %s", srv.response.message.c_str());
    +    2440           0 :       return false;
    +    2441             :     } else {
    +    2442          63 :       return true;
    +    2443             :     }
    +    2444             :   }
    +    2445             : }
    +    2446             : 
    +    2447             : //}
    +    2448             : 
    +    2449             : /* disarmSrv() //{ */
    +    2450             : 
    +    2451           7 : void UavManager::disarmSrv(void) {
    +    2452             : 
    +    2453          14 :   std_srvs::SetBool srv;
    +    2454             : 
    +    2455           7 :   srv.request.data = false;
    +    2456             : 
    +    2457           7 :   bool res = sch_arm_.call(srv);
    +    2458             : 
    +    2459           7 :   if (res) {
    +    2460             : 
    +    2461           7 :     if (!srv.response.success) {
    +    2462           0 :       ROS_WARN_THROTTLE(1.0, "[UavManager]: service call disarming returned: %s.", srv.response.message.c_str());
    +    2463             :     }
    +    2464             : 
    +    2465             :   } else {
    +    2466           0 :     ROS_ERROR_THROTTLE(1.0, "[UavManager]: service call for disarming failed!");
    +    2467             :   }
    +    2468           7 : }
    +    2469             : 
    +    2470             : //}
    +    2471             : 
    +    2472             : /* switchControllerSrv() //{ */
    +    2473             : 
    +    2474         177 : bool UavManager::switchControllerSrv(const std::string& controller) {
    +    2475             : 
    +    2476         177 :   ROS_INFO_STREAM("[UavManager]: activating controller '" << controller << "'");
    +    2477             : 
    +    2478         354 :   mrs_msgs::String srv;
    +    2479         177 :   srv.request.value = controller;
    +    2480             : 
    +    2481         177 :   bool res = sch_switch_controller_.call(srv);
    +    2482             : 
    +    2483         177 :   if (res) {
    +    2484             : 
    +    2485         177 :     if (!srv.response.success) {
    +    2486           2 :       ROS_WARN("[UavManager]: service call for switching controller returned: '%s'", srv.response.message.c_str());
    +    2487             :     }
    +    2488             : 
    +    2489         177 :     return srv.response.success;
    +    2490             : 
    +    2491             :   } else {
    +    2492             : 
    +    2493           0 :     ROS_ERROR("[UavManager]: service call for switching controller failed!");
    +    2494             : 
    +    2495           0 :     return false;
    +    2496             :   }
    +    2497             : }
    +    2498             : 
    +    2499             : //}
    +    2500             : 
    +    2501             : /* switchTrackerSrv() //{ */
    +    2502             : 
    +    2503         178 : bool UavManager::switchTrackerSrv(const std::string& tracker) {
    +    2504             : 
    +    2505         178 :   ROS_INFO_STREAM("[UavManager]: activating tracker '" << tracker << "'");
    +    2506             : 
    +    2507             : 
    +    2508         356 :   mrs_msgs::String srv;
    +    2509         178 :   srv.request.value = tracker;
    +    2510             : 
    +    2511         178 :   bool res = sch_switch_tracker_.call(srv);
    +    2512             : 
    +    2513         178 :   if (res) {
    +    2514             : 
    +    2515         178 :     if (!srv.response.success) {
    +    2516           2 :       ROS_WARN("[UavManager]: service call for switching tracker returned: '%s'", srv.response.message.c_str());
    +    2517             :     }
    +    2518             : 
    +    2519         178 :     return srv.response.success;
    +    2520             : 
    +    2521             :   } else {
    +    2522             : 
    +    2523           0 :     ROS_ERROR("[UavManager]: service call for switching tracker failed!");
    +    2524             : 
    +    2525           0 :     return false;
    +    2526             :   }
    +    2527             : }
    +    2528             : 
    +    2529             : //}
    +    2530             : 
    +    2531             : /* landSrv() //{ */
    +    2532             : 
    +    2533           5 : bool UavManager::landSrv(void) {
    +    2534             : 
    +    2535           5 :   ROS_INFO("[UavManager]: calling for landing");
    +    2536             : 
    +    2537          10 :   std_srvs::Trigger srv;
    +    2538             : 
    +    2539           5 :   bool res = sch_land_.call(srv);
    +    2540             : 
    +    2541           5 :   if (res) {
    +    2542             : 
    +    2543           5 :     if (!srv.response.success) {
    +    2544           0 :       ROS_WARN("[UavManager]: service call for landing returned: '%s'", srv.response.message.c_str());
    +    2545             :     }
    +    2546             : 
    +    2547           5 :     return srv.response.success;
    +    2548             : 
    +    2549             :   } else {
    +    2550             : 
    +    2551           0 :     ROS_ERROR("[UavManager]: service call for landing failed!");
    +    2552             : 
    +    2553           0 :     return false;
    +    2554             :   }
    +    2555             : }
    +    2556             : 
    +    2557             : //}
    +    2558             : 
    +    2559             : /* elandSrv() //{ */
    +    2560             : 
    +    2561           1 : bool UavManager::elandSrv(void) {
    +    2562             : 
    +    2563           1 :   ROS_INFO("[UavManager]: calling for eland");
    +    2564             : 
    +    2565           2 :   std_srvs::Trigger srv;
    +    2566             : 
    +    2567           1 :   bool res = sch_eland_.call(srv);
    +    2568             : 
    +    2569           1 :   if (res) {
    +    2570             : 
    +    2571           1 :     if (!srv.response.success) {
    +    2572           0 :       ROS_WARN("[UavManager]: service call for eland returned: '%s'", srv.response.message.c_str());
    +    2573             :     }
    +    2574             : 
    +    2575           1 :     return srv.response.success;
    +    2576             : 
    +    2577             :   } else {
    +    2578             : 
    +    2579           0 :     ROS_ERROR("[UavManager]: service call for eland failed!");
    +    2580             : 
    +    2581           0 :     return false;
    +    2582             :   }
    +    2583             : }
    +    2584             : 
    +    2585             : //}
    +    2586             : 
    +    2587             : /* ehoverSrv() //{ */
    +    2588             : 
    +    2589           2 : bool UavManager::ehoverSrv(void) {
    +    2590             : 
    +    2591           2 :   ROS_INFO("[UavManager]: calling for ehover");
    +    2592             : 
    +    2593           4 :   std_srvs::Trigger srv;
    +    2594             : 
    +    2595           2 :   bool res = sch_ehover_.call(srv);
    +    2596             : 
    +    2597           2 :   if (res) {
    +    2598             : 
    +    2599           2 :     if (!srv.response.success) {
    +    2600           0 :       ROS_WARN("[UavManager]: service call for ehover returned: '%s'", srv.response.message.c_str());
    +    2601             :     }
    +    2602             : 
    +    2603           2 :     return srv.response.success;
    +    2604             : 
    +    2605             :   } else {
    +    2606             : 
    +    2607           0 :     ROS_ERROR("[UavManager]: service call for ehover failed!");
    +    2608             : 
    +    2609           0 :     return false;
    +    2610             :   }
    +    2611             : }
    +    2612             : 
    +    2613             : //}
    +    2614             : 
    +    2615             : /* takeoffSrv() //{ */
    +    2616             : 
    +    2617          20 : bool UavManager::takeoffSrv(void) {
    +    2618             : 
    +    2619          20 :   ROS_INFO("[UavManager]: calling for takeoff to height '%.2f m'", _takeoff_height_);
    +    2620             : 
    +    2621          40 :   mrs_msgs::Vec1 srv;
    +    2622             : 
    +    2623          20 :   srv.request.goal = _takeoff_height_;
    +    2624             : 
    +    2625          20 :   bool res = sch_takeoff_.call(srv);
    +    2626             : 
    +    2627          20 :   if (res) {
    +    2628             : 
    +    2629          20 :     if (!srv.response.success) {
    +    2630           0 :       ROS_WARN("[UavManager]: service call for takeoff returned: '%s'", srv.response.message.c_str());
    +    2631             :     }
    +    2632             : 
    +    2633          20 :     return srv.response.success;
    +    2634             : 
    +    2635             :   } else {
    +    2636             : 
    +    2637           0 :     ROS_ERROR("[UavManager]: service call for takeoff failed!");
    +    2638             : 
    +    2639           0 :     return false;
    +    2640             :   }
    +    2641             : }
    +    2642             : 
    +    2643             : //}
    +    2644             : 
    +    2645             : /* emergencyReferenceSrv() //{ */
    +    2646             : 
    +    2647          94 : bool UavManager::emergencyReferenceSrv(const mrs_msgs::ReferenceStamped& goal) {
    +    2648             : 
    +    2649          94 :   ROS_INFO_THROTTLE(1.0, "[UavManager]: calling for emergency reference");
    +    2650             : 
    +    2651         188 :   mrs_msgs::ReferenceStampedSrv srv;
    +    2652             : 
    +    2653          94 :   srv.request.header    = goal.header;
    +    2654          94 :   srv.request.reference = goal.reference;
    +    2655             : 
    +    2656          94 :   bool res = sch_emergency_reference_.call(srv);
    +    2657             : 
    +    2658          94 :   if (res) {
    +    2659             : 
    +    2660          94 :     if (!srv.response.success) {
    +    2661           0 :       ROS_WARN_THROTTLE(1.0, "[UavManager]: service call for emergency reference returned: '%s'", srv.response.message.c_str());
    +    2662             :     }
    +    2663             : 
    +    2664          94 :     return srv.response.success;
    +    2665             : 
    +    2666             :   } else {
    +    2667             : 
    +    2668           0 :     ROS_ERROR_THROTTLE(1.0, "[UavManager]: service call for emergency reference failed!");
    +    2669             : 
    +    2670           0 :     return false;
    +    2671             :   }
    +    2672             : }
    +    2673             : 
    +    2674             : //}
    +    2675             : 
    +    2676             : }  // namespace uav_manager
    +    2677             : 
    +    2678             : }  // namespace mrs_uav_managers
    +    2679             : 
    +    2680             : #include <pluginlib/class_list_macros.h>
    +    2681          91 : PLUGINLIB_EXPORT_CLASS(mrs_uav_managers::uav_manager::UavManager, nodelet::Nodelet)
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_managers/src/uav_manager.cpp.gcov.overview.html b/mrs_uav_managers/src/uav_manager.cpp.gcov.overview.html new file mode 100644 index 0000000000..ce3c1f472f --- /dev/null +++ b/mrs_uav_managers/src/uav_manager.cpp.gcov.overview.html @@ -0,0 +1,691 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_managers/src/uav_manager.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_managers/src/uav_manager.cpp.gcov.png b/mrs_uav_managers/src/uav_manager.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..0a570c094a1f2336d12522f4f5043d13c200cf35 GIT binary patch literal 7294 zcmV-^9D(DBP)Ss~uQULn~a-G7y9%ufOdBrIRz)Vz0hO{)qdgwPMTT!-uRI{yB5 zv1-5gR;1S!$^<9?R(AbrqdA~O*W!jTTHwtv3IW9!iV<_%nh`^0ZQQ1HHC+?m1V&h7S2@P(HZM%Yp3(QE?uEgKcei0o z^6RM9W8|C2T%^Y6RlusF#}&=swt(vh*RcQT2)++Ua{mU5LlCd@B}a_J-dn$)848eW z9S{pz_E`Q4WL4LN_j-2j1=IA!G^8{=havHcgf+gN-6`CW28_roDl<-Sb4w}8@Lwv z*tUDfAeY}Lz&L2YvE%}Wam=?k4lo-*57kXTdW8O`!!>ryjBP}Kl~pJPyaK?nGDZYg zF}X6pQ3_ZcqiZ^1Y7AF&ZBGmWRBf?A%*KR<0hAgalp-ZpZ?}82La5033utkVZp15d*dY;(9=N*NyyD#~8&JTLYD} z7&dDH0!n~nROL|&ScmKaOu|m^o;KnLlwv?}yMpbm4p?hl9>4Q!n;INMK0t>9tx~AH zj5W*WVO3a!{w`kNR zsk>JQ(TQ1g#jIT$hvMSM6Af(GUWjq5EvB{k{A`zV?4%dv48MxRA+l0&v`xMR((KmYlQYgsQo=t`T5maa}SKfzi$YWB3+bcY^23BzF$j zQ{A)6l~5xF!Es#|vBlcVAi$a;y$Vng%bImb^DzF#=6Edu3>38bE&Xc)FHV*^AcP{0 z0sS_sa077Yu3-3PDX%0+#y;hDrKn*uXN12;gqlb|S{_9nBm=0Rvcy>Mkyhaw`e1tA zrQp=|fXK2;OK9_aW838xpm-PuSV59ulmhO=$5%6}-i3U0ZQ4ln?RP#Fs?9l|93yNs zz&?zNV*(2p2R^gCXJR&!6qj8?PO*Tq$H)k1*>w}pW8@?rjWH5K%w!+K8Sz+K?-Wjj z6i18)TGxge60d7sLv~JKCJ37`PT3bT2Gn6p^3{-VAc*xflK}aybz{VhQUfF)gj{NX zQx2sZWBUDR=Edh1BQ?m9otK+%8OkLbj7?5KZN4p2GtWK6YW)40Tf}Z?bj-*2On|q1<(WF!59Ky z>`KU{lLiD9cbz>Xpp+Pbk5hqnvByYKUDy>XrzC(YZW-V#1e_#YhYwxK{uk9WL%dL9 zUGDcE&>p}4z5f1rzW)FH^z`3&0Kj{-UGC31Km^>N%{u2gut6|0lN8Va+st*^Sn3jv zfQ4gJ5o53lcOBzCfL2roL2Cm}yNywCwy_e=?`nkIL-1$TDEs8)^6vWWKUq?nr%(Vm zsph(YF}clhwfBF!2Bu02KTj? zI~5Fz5Feo?paA83B#b*M2$)+^t1GI#&*}`!lZsoTTX(%APHr_qsI!qTee{AOJui#=bF{)GX4scy*YeGzr>$=F&VZVTH)fDIy3xUi1L{|yewzn>q%o`?Y zp5YkNte~_jMGOUq>Y5eo0UR%S?81n0#;KSpBmTn5!vClleyK!0G?MD1za^tF`#-WBu^Y-qX2s_Ru3ZH>Yh66+RFh$ZUPiKXD^|6{xI$N^MFEueiGNt z4=DEiZ62^KXTN~5MWa|Vlzr{wBhG|NEZ&M}YN(Y!oYjR$Tn|%@r2v#;baBc0RB99e zGlyQ?`9H5BZQ0alW+qn^Ym1{GMG2x^DWf(8g*vB38{U}yp zXV=cU583FEa`wkdE)=nUlIm<&PhyBA;4dx*_;?_^G$2LH{{VbuTJUvbLBnu|@j+mU z2-l{>_;6!u0*W!-$-zC4)Rll<#jjjR#fS=G*0s<~a%mbGr1q`ru9?L7_;Mw#a!QV zdoLfRv*UHCq1=Qdi?nqZYxU_oV64F;FiHZx@->t7jOK8T_Om9`bg@?UC3oh9io9Ng z+)=V86EnCf<9D@URyG>26C=rl?xj#W=C8p>CFHU+dLPC%;I3BRIOf#61+A}uIYVJq zVk9iX#C{gg_4@)WF-jtuDly~d@aevOevsqy6IKMn@EzO~Booi{5iHE@E-4MziIHSN z_flZj*M_CwCChu(8!@&4cU?0a$NQ%+L?&~*{TQo&(lukAjyK*jvzlRO*GKDO^5x3b zwOl*Ye4W(~HNfw!exN&67k$C>zC|pBPBtysAq34?fEzj*F;z~`3RB{8!M$@<&l4zL zpG^_TnIg7lzOKW>v~sE+GuO*nj2g3tusF3BW3g1asIDA2=_~LnF!F#s7^{GPdyBK$ zCZjzag0cR61 z7ey8j+%VE_H7|K1Z%r@&OjOOf9DA9&qRHNXkq1;@L=wp$*L!g-t-HaCD+Ol*#v=LO zh0#8&c<0pF1J_FRmtJxz@Drj6>&&2<^WM@TQOdp_V~Y1qd6K;gVW3X<3Mir-T?! z4=GZmF9pujS8-9$^wqau7(@ zbu1!<1?NOHseV^@JnGV$Zy$}rlA5l=7UzyvregR0AYf}DzITh`))Wr@9_;oft1uU# z!^tq$L84rAU?^9tZ;pJx=8DLOP~1TxaWL?KS_UY`7)O+y$K4RK&xs_RrEU)ia_8kx9hDhZ*JtSs~OE@naBp8h`P2Q5Xb&Qq+d^KyL3x9@l81{Y>dF`84Xq#QB zd~xs3Qe6DVWuL~6+03ph%u|T-#9aZ3pc;j8$P@x^_AXmJvO5P zly^-GeY$xg%`L}CN6ZbXhk(5-+00Z5XH<14DPrfvx2+_MZ9pl;y{+aXY$erF_N;i= z+(-`C3TO0WAnoEk?xxrwJ#fZ7?3=G<3u2JZRW24i#&{a2ek!Ol0a1A_qSpoR^H~L~ zJyN0Xnz>XK`XM@ul3M8%V1jw z8eybRsWFO|;SK9Ylgp=N2h>#dj-idh}-U1BDqS*>y3mFG&kD-ke=M=4dwc+gytX*fz5j#)lc+i+H)Ws+n6$(jj9 z)9TrSglDUbdpWH*KD_J8Y4{oOaNS=(xbfjllNv3`Y9@}g>|r&3+1(Fii~BqTJeqU1 zf9@kN>t!Jy&N<5(?)n&W4WIJ$F9VNON@}+{QbL4OcQvV`=OLyVz=|Cw;5vLB;Z zdIG-(BYw**R}k*CdLA4HDtNc~?q7gNHXe1KBvof0Z`{BSL8NNMXT4?-12%-hb=MM# z|L|}U^8g;n$Lvf4ruvWbk&()RkN!;+p6Zj23lXp&`4}aWqWW*~Q59+;Z2O|L$=?87 zXi{)VB0;R5cAGEU1SYltUUPX0f`4c$!BFGi!}kZbUg-a6Vul9J6+eB1bXpz zB2jZK7Tltwngx_%yoCDW7-;5}gfjj(C();CDq@{|qJ{;O60;sVA3P!J6J8umuK0TW zaXg+L9vMZ2*fC4!PPA93mQ)t?l`B^Rxy~DQ^5rYI5g*sj;o{PawV{s9ThDXWHS_#q zIYu{gHt&68r`MW*0*soj>C>JWp!FjM^5$O|537~$pli9#OwyHFt~8*o5|Cc5#2d7t zdaD1wxTe{E|6E+6t`D%d-2Z-k4e`p7F;t9<9&m((BSXm1rj5i2u87^*{TlC9Q6H4V z4E`3D(QjY$1{Ox2u51ag?2)84AAyR>nF5+dNfo7On{I%1x@Yvv8)L40@L$5Np~r49 zg_uD@urMgXrQQcn%ehAGyD9dTt26(T?Aipf>eGz_oFn_MfXP1ufYS0%u{_F7lkd49 zamOihjI#!?rKB=e$C*LJ5_+m@Hw+S8O93lrwaYarF`-ac@7KUN+VY~!o|iCIqXjWC z?7{`9^p^ybL<_V5Us(uQ)SOU^QGI)pAw3^`&Drzm*KM^ev%?h6?f%@TS1#G7S+TA^ zrqpeUnX_ylXQ`W0x*XsgCMsg!vr<}QoxT$5$0L@+(3J%Q#~*3@0Y1&X*->YDxm#ZxNUbT z%7ZqiQ*k;KIUhgLsdxgV@kceq=~Pq!`}kN(e%^CFuI0KVuTDNL$;6be>jrxc&&Ojp zxw%_FFNG#V1jHK3FS0EdJA8#&xq!Bw0u*|T)YUB`?i%(_Qk@Npe-RN=-~qF80UD4d zW`DrE)b(Xsc|ciVU#J-yH?o?w~u#in$tQHnIOVB^b@tuiSDSOryXnz7WfT3VDSuDzTP0M`!^KvrP& z#1#8AGlF6YfdHFy&CgCJMw_`df96PgOzYv}v#iQ5k7?2Sk^U%|@R*k9;MXq4w7xRq zv)^@uu?aWlv0L2aS@yt{deEi5v#aaGzW-97{eSADK z6*=Iajj*?B(v%q8-MnKubP10)4n24C3d7+rT@X*Wu~a8~d|E-x$5y0ScQ^M`QFZ{Z z$I1Ok|D-~sr{8WAo~F`wZ7u7!-bM1p)R62XDIdl`(M=i<3peDRj zn|9g6L>8P;*E8yhdN(8HtD>%9LlSKtXVeu=;o+jLCbjm}s4KiHUc3}OC+h0MtxHjB ze@0zbw8Hll__(Xq)3kST-yZ{T6C`dadrd0ANe^gU+zOUeU6Knt~EA^-O z$g+~=Bf-j(k4yEs|D2Cc=H$nh@$nd0Df)7Q?hBL7%MEN=7IZPV-=G$Bfj>D`(4`SN z?>Mkj4}9oyAK?!r6|B~_1d zMZh{$e^yCh9d*58rPcM8udhC^8Y5P5ILi+uUmc$P&Q~QWe0L=v4lKMa;cwF(L#4<% zZ|=@*?nZ7%HQ0A7UX{3ao?=6Oefa$Pj>;mH?OXw)-ClSP+bb9#a{}Uxrt23!?eMNO zWAa$U-Db@^;;Vz_nz3s5rGW}y&r1Unbuq45dTzo3AI;(tRysPx+tmnh(-!J9z=k(T{0=ucRf8Wd{MEd1r|a0* z8z(C`*+QP)is7EF^BLbR%TOxKBuYN3k$f{H+9cNrS|^-i|2&* zGLQtv26XZ$@hVgpMMi}K6kOIqFq}3j)Pmdgd~nyiLz4j4j}pKIjGO}$5tCtbvS^Bt zGji#rKp45*UE4TkA_G#VacvFA`(0*0;yS6y9V}Fx6nPq8k7A`g-j&Kz=LYXzgWw*! z5)YCZf{7uEbPi$+WoY`XLTPA*&`gR|&<|>dABV7Sd>IYG;XIB-mNaUf^&_{v`Y<<; zo*JOM>krM(1Qd_mT+)w^43F0&v>}H;w2sJd=KJ){wS8pxMwz%)7&Q-N&tZ)h#Y@B( z6IWrty*JcEK4%vI-}$yQrAUc>TwEBwIO=|N2q`l66;`BG_9zu8lQ2)+=z;~&g5%Nl zYFz8=UTVDB1Io3cA7yIqZmH}ar?L+(vR*+D!+%(pQC=ryAU(co!F%Z;A2h~y#z$HO z=r<&=v^Eg~7MIyo1i7*o1M<$)O3R!N|77%p+{6wsTcBa>!YlqF(^slQRhpjA)dAHQYj>b%F;0Y|z9reT zvPuFd#+beB!UAI3%->1n63WrCdi}M>30i636Pu6jc%h3{hU*61U-An<#41J1@O>k3 zHla9L0nGl^iyo>;1>nD!{P~I3Quz}KU=zjE9@8>Fj=l3fByUSz>1;C#C6jNO& zfCZY7y=I}g0>I1Fz`V9zuCGuE6meE?%jKFciT5wp8z&X%;iUDGJP3H8_4$zZ+Z&;gZ67`Pkj8O7->Tfyfj5c;{d>0i1)OKk;Z$(%}n?BtKL${ zV3QcBk~&fyshv?#D5;gv#JyZHE>@J3Q&dybG#_PCY(HI4sP)ZbY;MEOQd2AiY1j5Q zoEqv!_u&}&@e6C%kKxZ8$egjj_#x)ZBdyveh&?!S<}<<%q(*Vy{L1jdfADAG_M|>? zLS{6*hZ(Y(-rCb*oSK=lpeZUvq*`LWC#-lYtdCTfpJr+GG_8FFoRzlFk9%I&&gc?f z(xNGe5m_^eThk9@Q*PwOIvFL3OFkh(UaXHVa>z z+Kkd>@zTvxn>8>F#tu@h&8iYElb&)R*xc&2>=>P~u+2WiLn;!qu~cK9n_>^Fd+@c% zr|xNB+~Ed4q`;%f5f|#sb5)kj zmI%`JF@B&nJH5Ee>BX60gog%9>?!)tz?6TQ`m|X%g197uDhg?Lgq^jgdN9U2-J4y< z1Fr_}+7s1^TQGiz+RM}XDZziLy;^0#^Hh8FHu}pZohfIIkvcD|Zty&46)T}`bM>~i Yf49Dn>8Q{06951J07*qoM6N<$g5MO%!vFvP literal 0 HcmV?d00001 diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/garmin_agl.h.func-sort-c.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/garmin_agl.h.func-sort-c.html new file mode 100644 index 0000000000..c4d6273086 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/garmin_agl.h.func-sort-c.html @@ -0,0 +1,92 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/garmin_agl.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl - garmin_agl.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:44100.0 %
    Date:2024-04-18 23:11:36Functions:33100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::garmin_agl::GarminAgl::GarminAgl()70
    mrs_uav_state_estimators::garmin_agl::GarminAgl::~GarminAgl()70
    mrs_uav_state_estimators::garmin_agl::GarminAgl::~GarminAgl().270
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/garmin_agl.h.func.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/garmin_agl.h.func.html new file mode 100644 index 0000000000..cf6e5580a9 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/garmin_agl.h.func.html @@ -0,0 +1,92 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/garmin_agl.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl - garmin_agl.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:44100.0 %
    Date:2024-04-18 23:11:36Functions:33100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::garmin_agl::GarminAgl::GarminAgl()70
    mrs_uav_state_estimators::garmin_agl::GarminAgl::~GarminAgl()70
    mrs_uav_state_estimators::garmin_agl::GarminAgl::~GarminAgl().270
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/garmin_agl.h.gcov.frameset.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/garmin_agl.h.gcov.frameset.html new file mode 100644 index 0000000000..4e43b37ae4 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/garmin_agl.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/garmin_agl.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/garmin_agl.h.gcov.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/garmin_agl.h.gcov.html new file mode 100644 index 0000000000..50ce346893 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/garmin_agl.h.gcov.html @@ -0,0 +1,159 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/garmin_agl.h + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl - garmin_agl.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:44100.0 %
    Date:2024-04-18 23:11:36Functions:33100.0 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #ifndef ESTIMATORS_STATE_GARMIN_AGL_H
    +       2             : #define ESTIMATORS_STATE_GARMIN_AGL_H
    +       3             : 
    +       4             : /* includes //{ */
    +       5             : 
    +       6             : #include <ros/ros.h>
    +       7             : 
    +       8             : #include <mrs_msgs/Float64Stamped.h>
    +       9             : 
    +      10             : #include <mrs_lib/lkf.h>
    +      11             : #include <mrs_lib/profiler.h>
    +      12             : #include <mrs_lib/param_loader.h>
    +      13             : #include <mrs_lib/subscribe_handler.h>
    +      14             : #include <mrs_lib/publisher_handler.h>
    +      15             : #include <mrs_lib/attitude_converter.h>
    +      16             : #include <mrs_lib/transformer.h>
    +      17             : 
    +      18             : #include <mrs_uav_managers/agl_estimator.h>
    +      19             : 
    +      20             : #include <mrs_uav_state_estimators/estimators/altitude/alt_generic.h>
    +      21             : 
    +      22             : //}
    +      23             : 
    +      24             : namespace mrs_uav_state_estimators
    +      25             : {
    +      26             : 
    +      27             : namespace garmin_agl
    +      28             : {
    +      29             : const char name[]         = "garmin_agl";
    +      30             : const char frame_id[]     = "garmin_agl_origin";
    +      31             : const char package_name[] = "mrs_uav_state_estimators";
    +      32             : 
    +      33             : const bool is_core_plugin = true;
    +      34             : 
    +      35             : class GarminAgl : public mrs_uav_managers::AglEstimator {
    +      36             : 
    +      37             : private:
    +      38             :   std::unique_ptr<AltGeneric> est_agl_garmin_;
    +      39             :   const std::string           est_agl_name_ = "garmin_agl";
    +      40             : 
    +      41             :   const bool is_core_plugin_;
    +      42             : 
    +      43             :   ros::Timer timer_update_;
    +      44             :   int        _update_timer_rate_;
    +      45             :   void       timerUpdate(const ros::TimerEvent &event);
    +      46             : 
    +      47             :   ros::Timer timer_check_health_;
    +      48             :   int        _check_health_timer_rate_;
    +      49             :   void       timerCheckHealth(const ros::TimerEvent &event);
    +      50             : 
    +      51             :   bool isConverged();
    +      52             : 
    +      53             :   void waitForEstimationInitialization();
    +      54             : 
    +      55             : public:
    +      56          70 :   GarminAgl() : AglEstimator(garmin_agl::name, garmin_agl::frame_id, garmin_agl::package_name), is_core_plugin_(is_core_plugin) {
    +      57          70 :   }
    +      58             : 
    +      59         140 :   ~GarminAgl(void) {
    +      60         140 :   }
    +      61             : 
    +      62             :   void initialize(ros::NodeHandle &nh, const std::shared_ptr<CommonHandlers_t> &ch, const std::shared_ptr<PrivateHandlers_t> &ph) override;
    +      63             :   bool start(void) override;
    +      64             :   bool pause(void) override;
    +      65             :   bool reset(void) override;
    +      66             : 
    +      67             :   mrs_msgs::Float64Stamped getUavAglHeight() const override;
    +      68             :   std::vector<double>      getHeightCovariance() const override;
    +      69             : };
    +      70             : 
    +      71             : }  // namespace garmin_agl
    +      72             : 
    +      73             : }  // namespace mrs_uav_state_estimators
    +      74             : 
    +      75             : #endif  // ESTIMATORS_STATE_GARMIN_AGL_H
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/garmin_agl.h.gcov.overview.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/garmin_agl.h.gcov.overview.html new file mode 100644 index 0000000000..01180ec6c9 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/garmin_agl.h.gcov.overview.html @@ -0,0 +1,39 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/garmin_agl.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/garmin_agl.h.gcov.png b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/garmin_agl.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..1d069e474cef144181fc5cb4a7752617234f2348 GIT binary patch literal 380 zcmeAS@N?(olHy`uVBq!ia0vp^0YL1{!VDxu^<<9$DTx4|5ZC|z|E~gq{) z-+wzRyyepwr_aj9N0zi)yIA@DruK$xCbdH!RA#*~FEu*Kt+Mr|wp)bOzeHP(-D@^_ zujRkIGNJuOnSSTr%L_6h^0%b~7kbxKyUa3OW%x$$>|Ep5oPyiLY^#!;A~i6^vZ+X|Ua&y>FQExYwM!Ofs>mTmP>_Uf+f44=fmvnFp3 VG2vV8@g5jd44$rjF6*2Ung9 + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/aglHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:44100.0 %
    Date:2024-04-18 23:11:36Functions:33100.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    garmin_agl.h +
    100.0%
    +
    100.0 %4 / 4100.0 %3 / 3
    <unnamed>100.0 %4 / 4100.0 %3 / 3
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/index-detail-sort-l.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/index-detail-sort-l.html new file mode 100644 index 0000000000..2d855468f0 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/index-detail-sort-l.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/aglHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:44100.0 %
    Date:2024-04-18 23:11:36Functions:33100.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    garmin_agl.h +
    100.0%
    +
    100.0 %4 / 4100.0 %3 / 3
    <unnamed>100.0 %4 / 4100.0 %3 / 3
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/index-detail.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/index-detail.html new file mode 100644 index 0000000000..becad03c2d --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/index-detail.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/aglHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:44100.0 %
    Date:2024-04-18 23:11:36Functions:33100.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    garmin_agl.h +
    100.0%
    +
    100.0 %4 / 4100.0 %3 / 3
    <unnamed>100.0 %4 / 4100.0 %3 / 3
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/index-sort-f.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/index-sort-f.html new file mode 100644 index 0000000000..8b02daf3f9 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/index-sort-f.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/aglHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:44100.0 %
    Date:2024-04-18 23:11:36Functions:33100.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    garmin_agl.h +
    100.0%
    +
    100.0 %4 / 4100.0 %3 / 3
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/index-sort-l.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/index-sort-l.html new file mode 100644 index 0000000000..7b3af3e317 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/index-sort-l.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/aglHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:44100.0 %
    Date:2024-04-18 23:11:36Functions:33100.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    garmin_agl.h +
    100.0%
    +
    100.0 %4 / 4100.0 %3 / 3
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/index.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/index.html new file mode 100644 index 0000000000..a9004522e3 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl/index.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/agl + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/aglHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:44100.0 %
    Date:2024-04-18 23:11:36Functions:33100.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    garmin_agl.h +
    100.0%
    +
    100.0 %4 / 4100.0 %3 / 3
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/alt_generic.h.func-sort-c.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/alt_generic.h.func-sort-c.html new file mode 100644 index 0000000000..9f4a0d41cf --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/alt_generic.h.func-sort-c.html @@ -0,0 +1,92 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/alt_generic.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude - alt_generic.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:55100.0 %
    Date:2024-04-18 23:11:36Functions:33100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::AltGeneric::AltGeneric(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)167
    mrs_uav_state_estimators::AltGeneric::~AltGeneric()167
    mrs_uav_state_estimators::AltGeneric::~AltGeneric().2167
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/alt_generic.h.func.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/alt_generic.h.func.html new file mode 100644 index 0000000000..18a3e0f511 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/alt_generic.h.func.html @@ -0,0 +1,92 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/alt_generic.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude - alt_generic.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:55100.0 %
    Date:2024-04-18 23:11:36Functions:33100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::AltGeneric::AltGeneric(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)167
    mrs_uav_state_estimators::AltGeneric::~AltGeneric()167
    mrs_uav_state_estimators::AltGeneric::~AltGeneric().2167
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/alt_generic.h.gcov.frameset.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/alt_generic.h.gcov.frameset.html new file mode 100644 index 0000000000..ffdd0b59a3 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/alt_generic.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/alt_generic.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/alt_generic.h.gcov.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/alt_generic.h.gcov.html new file mode 100644 index 0000000000..36f3158c2f --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/alt_generic.h.gcov.html @@ -0,0 +1,245 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/alt_generic.h + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude - alt_generic.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:55100.0 %
    Date:2024-04-18 23:11:36Functions:33100.0 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #ifndef ESTIMATORS_ALTITUDE_ALT_GENERIC_H
    +       2             : #define ESTIMATORS_ALTITUDE_ALT_GENERIC_H
    +       3             : 
    +       4             : /* includes //{ */
    +       5             : 
    +       6             : #include <ros/ros.h>
    +       7             : 
    +       8             : #include <nav_msgs/Odometry.h>
    +       9             : #include <sensor_msgs/Range.h>
    +      10             : 
    +      11             : #include <mrs_lib/lkf.h>
    +      12             : #include <mrs_lib/repredictor.h>
    +      13             : #include <mrs_lib/profiler.h>
    +      14             : #include <mrs_lib/param_loader.h>
    +      15             : #include <mrs_lib/subscribe_handler.h>
    +      16             : 
    +      17             : #include <functional>
    +      18             : 
    +      19             : #include <mrs_uav_state_estimators/estimators/altitude/altitude_estimator.h>
    +      20             : #include <mrs_uav_state_estimators/estimators/correction.h>
    +      21             : 
    +      22             : #include <mrs_uav_state_estimators/AltitudeEstimatorConfig.h>
    +      23             : 
    +      24             : //}
    +      25             : 
    +      26             : namespace mrs_uav_state_estimators
    +      27             : {
    +      28             : 
    +      29             : namespace alt_generic
    +      30             : {
    +      31             : 
    +      32             : const int n_states       = 3;
    +      33             : const int n_inputs       = 1;
    +      34             : const int n_measurements = 1;
    +      35             : 
    +      36             : }  // namespace alt_generic
    +      37             : 
    +      38             : class AltGeneric : public AltitudeEstimator<alt_generic::n_states> {
    +      39             : 
    +      40             :   const std::string package_name_ = "mrs_uav_state_estimators";
    +      41             : 
    +      42             :   typedef mrs_lib::DynamicReconfigureMgr<AltitudeEstimatorConfig> drmgr_t;
    +      43             : 
    +      44             :   using lkf_t         = mrs_lib::LKF<alt_generic::n_states, alt_generic::n_inputs, alt_generic::n_measurements>;
    +      45             :   using varstep_lkf_t = mrs_lib::varstepLKF<alt_generic::n_states, alt_generic::n_inputs, alt_generic::n_measurements>;
    +      46             :   using A_t           = lkf_t::A_t;
    +      47             :   using B_t           = lkf_t::B_t;
    +      48             :   using H_t           = lkf_t::H_t;
    +      49             :   using Q_t           = lkf_t::Q_t;
    +      50             :   using x_t           = lkf_t::x_t;
    +      51             :   using P_t           = lkf_t::P_t;
    +      52             :   using u_t           = lkf_t::u_t;
    +      53             :   using z_t           = lkf_t::z_t;
    +      54             :   using R_t           = lkf_t::R_t;
    +      55             :   using statecov_t    = lkf_t::statecov_t;
    +      56             : 
    +      57             :   typedef mrs_lib::Repredictor<varstep_lkf_t> rep_lkf_t;
    +      58             : 
    +      59             :   using StateId_t = mrs_uav_managers::estimation_manager::StateId_t;
    +      60             : 
    +      61             : private:
    +      62             :   std::string parent_state_est_name_;
    +      63             : 
    +      64             :   double                                      dt_;
    +      65             :   double                                      input_coeff_, default_input_coeff_;
    +      66             :   A_t                                         A_;
    +      67             :   B_t                                         B_;
    +      68             :   H_t                                         H_;
    +      69             :   Q_t                                         Q_;
    +      70             :   std::shared_ptr<lkf_t>                      lkf_;
    +      71             :   std::unique_ptr<rep_lkf_t>                  lkf_rep_;
    +      72             :   std::vector<std::shared_ptr<varstep_lkf_t>> models_;
    +      73             :   mutable std::mutex                          mutex_lkf_;
    +      74             :   statecov_t                                  sc_;
    +      75             :   mutable std::mutex                          mutex_sc_;
    +      76             : 
    +      77             :   std::unique_ptr<drmgr_t> drmgr_;
    +      78             :   void                     callbackReconfigure(AltitudeEstimatorConfig &config, [[maybe_unused]] uint32_t level);
    +      79             : 
    +      80             :   z_t                innovation_;
    +      81             :   mutable std::mutex mtx_innovation_;
    +      82             : 
    +      83             :   bool          is_error_state_first_time_ = true;
    +      84             :   ros::Duration error_state_duration_;
    +      85             :   ros::Time     prev_time_in_error_state_;
    +      86             : 
    +      87             :   bool is_repredictor_enabled_;
    +      88             :   int  rep_buffer_size_ = 200;
    +      89             : 
    +      90             :   const bool is_core_plugin_;
    +      91             : 
    +      92             :   std::vector<std::string>                                              correction_names_;
    +      93             :   std::vector<std::shared_ptr<Correction<alt_generic::n_measurements>>> corrections_;
    +      94             : 
    +      95             :   mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput> sh_control_input_;
    +      96             :   void                                                timeoutCallback(const std::string &topic, const ros::Time &last_msg);
    +      97             :   std::atomic<bool>                                   is_input_ready_ = false;
    +      98             : 
    +      99             :   ros::Timer timer_update_;
    +     100             :   void       timerUpdate(const ros::TimerEvent &event);
    +     101             : 
    +     102             :   ros::Timer timer_check_health_;
    +     103             :   void       timerCheckHealth(const ros::TimerEvent &event);
    +     104             : 
    +     105             :   void doCorrection(const Correction<alt_generic::n_measurements>::MeasurementStamped &meas, const double R, const StateId_t &state_id);
    +     106             :   void doCorrection(const z_t &z, const double R, const StateId_t &H_idx, const ros::Time &meas_stamp);
    +     107             : 
    +     108             :   bool isConverged();
    +     109             : 
    +     110             :   Q_t                getQ();
    +     111             :   mutable std::mutex mtx_Q_;
    +     112             : 
    +     113             : public:
    +     114         167 :   AltGeneric(const std::string &name, const std::string &ns_frame_id, const std::string &parent_state_est_name, const bool is_core_plugin)
    +     115         167 :       : AltitudeEstimator<alt_generic::n_states>(name, ns_frame_id), parent_state_est_name_(parent_state_est_name), is_core_plugin_(is_core_plugin) {
    +     116         167 :   }
    +     117             : 
    +     118         334 :   ~AltGeneric(void) {
    +     119         334 :   }
    +     120             : 
    +     121             :   void initialize(ros::NodeHandle &nh, const std::shared_ptr<CommonHandlers_t> &ch, const std::shared_ptr<PrivateHandlers_t> &ph) override;
    +     122             :   bool start(void) override;
    +     123             :   bool pause(void) override;
    +     124             :   bool reset(void) override;
    +     125             : 
    +     126             :   double getState(const int &state_idx_in) const override;
    +     127             :   double getState(const int &state_id_in, const int &axis_in) const override;
    +     128             : 
    +     129             :   void setState(const double &state_in, const int &state_idx_in) override;
    +     130             :   void setState(const double &state_in, const int &state_id_in, const int &axis_in) override;
    +     131             : 
    +     132             :   states_t getStates(void) const override;
    +     133             :   void     setStates(const states_t &states_in) override;
    +     134             : 
    +     135             :   double getCovariance(const int &state_idx_in) const override;
    +     136             :   double getCovariance(const int &state_id_in, const int &axis_in) const override;
    +     137             : 
    +     138             :   covariance_t getCovarianceMatrix(void) const override;
    +     139             :   void         setCovarianceMatrix(const covariance_t &cov_in) override;
    +     140             : 
    +     141             :   double getInnovation(const int &state_idx) const override;
    +     142             :   double getInnovation(const int &state_id_in, const int &axis_in) const override;
    +     143             : 
    +     144             :   void setDt(const double &dt);
    +     145             :   void setInputCoeff(const double &input_coeff);
    +     146             : 
    +     147             :   void generateRepredictorModels(const double input_coeff);
    +     148             : 
    +     149             :   void generateA();
    +     150             :   void generateB();
    +     151             : 
    +     152             :   void timeoutOdom(const std::string &topic, const ros::Time &last_msg, const int n_pubs);
    +     153             :   void timeoutRange(const std::string &topic, const ros::Time &last_msg, const int n_pubs);
    +     154             : 
    +     155             :   std::string getNamespacedName() const;
    +     156             : 
    +     157             :   std::string getPrintName() const;
    +     158             : };
    +     159             : }  // namespace mrs_uav_state_estimators
    +     160             : 
    +     161             : #endif  // ESTIMATORS_ALTITUDE_ALT_GENERIC_H
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/alt_generic.h.gcov.overview.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/alt_generic.h.gcov.overview.html new file mode 100644 index 0000000000..85adff98de --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/alt_generic.h.gcov.overview.html @@ -0,0 +1,61 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/alt_generic.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/alt_generic.h.gcov.png b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/alt_generic.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..dcf0f4a027a6ab756dec1329ddcee71c4cae2957 GIT binary patch literal 688 zcmV;h0#E&kP)bm(Ppe}^qLnGb+F$2vKD02Gn zh($1dgra5Z8E?E&cRG}^Kx#yMfS#cr8p4)R${TUN=r@|=k$axQF7Ej(BA)90}BGAm^jcLl0&P&><5?5@?l)W15 z*ceT@60t-DKw?Uo)d&Z34^8KOsIJS88X1*Zxdf%Fo*cRt+v{ zz{VnN=>k`O353Z4;lz0bk%xtVdKj)gkW5@kI5QgK1#1)T1NCV5ExZAu!6Gf-yUk(o zI_q696*4h1pK!os(Q5%Z&B8@AX`^Yse#EiF#jklyiXJZuc49O|P?=mpMt2K+B4&}! zDxRsQYO{&!#ej+FIWojMZCbMd#E!FR5=8x3=)}zT{5YwaS~4UJFz(3@Jo&slhq@gc zRlV#zM0B&hYSzt`XtsK>y-#`N|2_WR`Tsn3+qUg*EH8d=+rF8^*);g*{x-0$lK(o|Y&0b=W0s!=7T&CEV>Oy!9ePcyge|x|(9`l-aMLnFyWzjy1 z9kVSV@LD0}Sxbt6RK_&i8dzK_FLFMex4`W9Oz}Zykn(SMU9|PPztmjnaL`kYvE`jB zAM+>D)!$NuGqnlj6xLY@*6Y0R)+;pj!HIF@(PL*ABk5r>>k*&qo>xvX(Os97EA9_V W6RZS^kluj+0000 + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/altitude_estimator.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude - altitude_estimator.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:44100.0 %
    Date:2024-04-18 23:11:36Functions:2366.7 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::AltitudeEstimator<3>::~AltitudeEstimator()0
    mrs_uav_state_estimators::AltitudeEstimator<3>::AltitudeEstimator(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)167
    mrs_uav_state_estimators::AltitudeEstimator<3>::~AltitudeEstimator().2167
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/altitude_estimator.h.func.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/altitude_estimator.h.func.html new file mode 100644 index 0000000000..22db878896 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/altitude_estimator.h.func.html @@ -0,0 +1,92 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/altitude_estimator.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude - altitude_estimator.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:44100.0 %
    Date:2024-04-18 23:11:36Functions:2366.7 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::AltitudeEstimator<3>::AltitudeEstimator(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)167
    mrs_uav_state_estimators::AltitudeEstimator<3>::~AltitudeEstimator()0
    mrs_uav_state_estimators::AltitudeEstimator<3>::~AltitudeEstimator().2167
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/altitude_estimator.h.gcov.frameset.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/altitude_estimator.h.gcov.frameset.html new file mode 100644 index 0000000000..c89e621d6c --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/altitude_estimator.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/altitude_estimator.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/altitude_estimator.h.gcov.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/altitude_estimator.h.gcov.html new file mode 100644 index 0000000000..21d75c5b2c --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/altitude_estimator.h.gcov.html @@ -0,0 +1,130 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/altitude_estimator.h + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude - altitude_estimator.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:44100.0 %
    Date:2024-04-18 23:11:36Functions:2366.7 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #pragma once
    +       2             : #ifndef ESTIMATORS_ALTITUDE_ALTITUDE_ESTIMATOR_H
    +       3             : #define ESTIMATORS_ALTITUDE_ALTITUDE_ESTIMATOR_H
    +       4             : 
    +       5             : /* includes //{ */
    +       6             : 
    +       7             : #include <mrs_uav_state_estimators/estimators/partial_estimator.h>
    +       8             : 
    +       9             : //}
    +      10             : 
    +      11             : namespace mrs_uav_state_estimators
    +      12             : {
    +      13             : 
    +      14             : namespace altitude
    +      15             : {
    +      16             : const char type[] = "ALTITUDE";
    +      17             : 
    +      18             : typedef enum
    +      19             : {
    +      20             :   ODOMETRY,
    +      21             :   RANGE
    +      22             : } MeasurementType_t;
    +      23             : 
    +      24             : }  // namespace altitude
    +      25             : 
    +      26             : template <int n_states>
    +      27             : class AltitudeEstimator : public PartialEstimator<n_states, 1> {
    +      28             : 
    +      29             : protected:
    +      30         167 :   AltitudeEstimator(const std::string& name, const std::string& frame_id) : PartialEstimator<n_states, 1>(altitude::type, name, frame_id) {
    +      31         167 :   }
    +      32             : 
    +      33         167 :   virtual ~AltitudeEstimator(void) {
    +      34         167 :   }
    +      35             : 
    +      36             : 
    +      37             : private:
    +      38             :   static const int _n_axes_   = 1;
    +      39             :   static const int _n_states_ = n_states;
    +      40             :   static const int _n_inputs_;
    +      41             :   static const int _n_measurements_;
    +      42             : };
    +      43             : 
    +      44             : }  // namespace mrs_uav_state_estimators
    +      45             : 
    +      46             : #endif  // ESTIMATORS_ALTITUDE_ALTITUDE_ESTIMATOR_H
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/altitude_estimator.h.gcov.overview.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/altitude_estimator.h.gcov.overview.html new file mode 100644 index 0000000000..90f903e2e9 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/altitude_estimator.h.gcov.overview.html @@ -0,0 +1,32 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/altitude_estimator.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/altitude_estimator.h.gcov.png b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/altitude_estimator.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..073c144eb9b7fd83c98f25c4b8ee68b76b771829 GIT binary patch literal 295 zcmeAS@N?(olHy`uVBq!ia0vp^0YI$B!VDyR#hdkklth3}i0l9V|5pLQ^7pZ^ul_SI ztOAOIsdL_&mjc_7hJ zpPIm+6jaE2@rX$-yY!@v4IF1DcGzC)G&r(S?f--q#;aZk+!wv66Ek(YMkDcSrxo*i_1-pY!}fjJhOH86XRDi kH_kk+@!`k+9d9o(CNo-GFMMqo0`vfbr>mdKI;Vst08ROJ-T(jq literal 0 HcmV?d00001 diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/index-detail-sort-f.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/index-detail-sort-f.html new file mode 100644 index 0000000000..424a897037 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/index-detail-sort-f.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitudeHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:99100.0 %
    Date:2024-04-18 23:11:36Functions:5683.3 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    altitude_estimator.h +
    100.0%
    +
    100.0 %4 / 466.7 %2 / 3
    <unnamed>100.0 %4 / 466.7 %2 / 3
    alt_generic.h +
    100.0%
    +
    100.0 %5 / 5100.0 %3 / 3
    <unnamed>100.0 %5 / 5100.0 %3 / 3
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/index-detail-sort-l.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/index-detail-sort-l.html new file mode 100644 index 0000000000..d4f2ca7033 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/index-detail-sort-l.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitudeHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:99100.0 %
    Date:2024-04-18 23:11:36Functions:5683.3 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    altitude_estimator.h +
    100.0%
    +
    100.0 %4 / 466.7 %2 / 3
    <unnamed>100.0 %4 / 466.7 %2 / 3
    alt_generic.h +
    100.0%
    +
    100.0 %5 / 5100.0 %3 / 3
    <unnamed>100.0 %5 / 5100.0 %3 / 3
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/index-detail.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/index-detail.html new file mode 100644 index 0000000000..b08d92aed5 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/index-detail.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitudeHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:99100.0 %
    Date:2024-04-18 23:11:36Functions:5683.3 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    alt_generic.h +
    100.0%
    +
    100.0 %5 / 5100.0 %3 / 3
    <unnamed>100.0 %5 / 5100.0 %3 / 3
    altitude_estimator.h +
    100.0%
    +
    100.0 %4 / 466.7 %2 / 3
    <unnamed>100.0 %4 / 466.7 %2 / 3
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/index-sort-f.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/index-sort-f.html new file mode 100644 index 0000000000..7665870efa --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/index-sort-f.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitudeHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:99100.0 %
    Date:2024-04-18 23:11:36Functions:5683.3 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    altitude_estimator.h +
    100.0%
    +
    100.0 %4 / 466.7 %2 / 3
    alt_generic.h +
    100.0%
    +
    100.0 %5 / 5100.0 %3 / 3
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/index-sort-l.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/index-sort-l.html new file mode 100644 index 0000000000..388be0b104 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/index-sort-l.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitudeHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:99100.0 %
    Date:2024-04-18 23:11:36Functions:5683.3 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    altitude_estimator.h +
    100.0%
    +
    100.0 %4 / 466.7 %2 / 3
    alt_generic.h +
    100.0%
    +
    100.0 %5 / 5100.0 %3 / 3
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/index.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/index.html new file mode 100644 index 0000000000..25cf2d3a99 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude/index.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitude + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/altitudeHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:99100.0 %
    Date:2024-04-18 23:11:36Functions:5683.3 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    alt_generic.h +
    100.0%
    +
    100.0 %5 / 5100.0 %3 / 3
    altitude_estimator.h +
    100.0%
    +
    100.0 %4 / 466.7 %2 / 3
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/correction.h.func-sort-c.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/correction.h.func-sort-c.html new file mode 100644 index 0000000000..a655caf14b --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/correction.h.func-sort-c.html @@ -0,0 +1,364 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/correction.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators - correction.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:37572551.7 %
    Date:2024-04-18 23:11:36Functions:477166.2 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::Correction<1>::callbackImu(boost::shared_ptr<sensor_msgs::Imu_<std::allocator<void> > const>)0
    mrs_uav_state_estimators::Correction<1>::callbackPoint(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>)0
    mrs_uav_state_estimators::Correction<1>::getVecInFrame(geometry_msgs::Vector3_<std::allocator<void> > const&, std_msgs::Header_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)0
    mrs_uav_state_estimators::Correction<1>::callbackOdometry(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>)0
    mrs_uav_state_estimators::Correction<1>::callbackPoseStamped(boost::shared_ptr<geometry_msgs::PoseStamped_<std::allocator<void> > const>)0
    mrs_uav_state_estimators::Correction<1>::callbackToggleRange(std_srvs::SetBoolRequest_<std::allocator<void> >&, std_srvs::SetBoolResponse_<std::allocator<void> >&)0
    mrs_uav_state_estimators::Correction<1>::getCorrectionFromImu(boost::shared_ptr<sensor_msgs::Imu_<std::allocator<void> > const>)0
    mrs_uav_state_estimators::Correction<1>::getCorrectionFromQuat(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>)0
    mrs_uav_state_estimators::Correction<1>::getCorrectionFromPoint(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>)0
    mrs_uav_state_estimators::Correction<1>::getCorrectionFromOdometry(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>)0
    mrs_uav_state_estimators::Correction<1>::getCorrectionFromPoseStamped(boost::shared_ptr<geometry_msgs::PoseStamped_<std::allocator<void> > const>)0
    mrs_uav_state_estimators::Correction<2>::callbackImu(boost::shared_ptr<sensor_msgs::Imu_<std::allocator<void> > const>)0
    mrs_uav_state_estimators::Correction<2>::callbackRange(boost::shared_ptr<sensor_msgs::Range_<std::allocator<void> > const>)0
    mrs_uav_state_estimators::Correction<2>::getAvgRtkInitZ(double)0
    mrs_uav_state_estimators::Correction<2>::getZVelUntilted(geometry_msgs::Vector3_<std::allocator<void> > const&, std_msgs::Header_<std::allocator<void> > const&)0
    mrs_uav_state_estimators::Correction<2>::resetProcessors()0
    mrs_uav_state_estimators::Correction<2>::callbackOdometry(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>)0
    mrs_uav_state_estimators::Correction<2>::callbackPoseStamped(boost::shared_ptr<geometry_msgs::PoseStamped_<std::allocator<void> > const>)0
    mrs_uav_state_estimators::Correction<2>::callbackToggleRange(std_srvs::SetBoolRequest_<std::allocator<void> >&, std_srvs::SetBoolResponse_<std::allocator<void> >&)0
    mrs_uav_state_estimators::Correction<2>::getCorrectionFromImu(boost::shared_ptr<sensor_msgs::Imu_<std::allocator<void> > const>)0
    mrs_uav_state_estimators::Correction<2>::getCorrectionFromQuat(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>)0
    mrs_uav_state_estimators::Correction<2>::getCorrectionFromRange(boost::shared_ptr<sensor_msgs::Range_<std::allocator<void> > const>)0
    mrs_uav_state_estimators::Correction<2>::getCorrectionFromOdometry(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>)0
    mrs_uav_state_estimators::Correction<2>::getCorrectionFromPoseStamped(boost::shared_ptr<geometry_msgs::PoseStamped_<std::allocator<void> > const>)0
    mrs_uav_state_estimators::Correction<1>::getAvgRtkInitZ(double)22
    mrs_uav_state_estimators::Correction<2>::createProcessorFromName(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::NodeHandle&)97
    mrs_uav_state_estimators::Correction<2>::Correction(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, mrs_uav_state_estimators::EstimatorType_t const&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&, std::function<double (int, int)>, std::function<void (mrs_uav_state_estimators::Correction<2>::MeasurementStamped, double, mrs_uav_managers::estimation_manager::StateId_t)>)101
    mrs_uav_state_estimators::Correction<2>::getName[abi:cxx11]() const202
    mrs_uav_state_estimators::Correction<2>::getPrintName[abi:cxx11]() const206
    mrs_uav_state_estimators::Correction<1>::createProcessorFromName(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::NodeHandle&)230
    mrs_uav_state_estimators::Correction<1>::Correction(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, mrs_uav_state_estimators::EstimatorType_t const&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&, std::function<double (int, int)>, std::function<void (mrs_uav_state_estimators::Correction<1>::MeasurementStamped, double, mrs_uav_managers::estimation_manager::StateId_t)>)245
    mrs_uav_state_estimators::Correction<2>::getNamespacedName[abi:cxx11]() const434
    mrs_uav_state_estimators::Correction<1>::getName[abi:cxx11]() const490
    mrs_uav_state_estimators::Correction<1>::getPrintName[abi:cxx11]() const552
    mrs_uav_state_estimators::Correction<1>::getNamespacedName[abi:cxx11]() const969
    mrs_uav_state_estimators::Correction<1>::callbackRtk(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>)2563
    mrs_uav_state_estimators::Correction<1>::getCorrectionFromRtk(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>)2586
    mrs_uav_state_estimators::Correction<1>::transformRtkToFcu(geometry_msgs::PoseStamped_<std::allocator<void> > const&) const2586
    mrs_uav_state_estimators::Correction<2>::callbackRtk(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>)5408
    mrs_uav_state_estimators::Correction<2>::getCorrectionFromRtk(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>)5477
    mrs_uav_state_estimators::Correction<2>::transformRtkToFcu(geometry_msgs::PoseStamped_<std::allocator<void> > const&) const5478
    mrs_uav_state_estimators::Correction<2>::getProcessedCorrection()6659
    mrs_uav_state_estimators::Correction<2>::getRawCorrection()6660
    mrs_uav_state_estimators::Correction<1>::getRawCorrection()8566
    mrs_uav_state_estimators::Correction<1>::getProcessedCorrection()8575
    mrs_uav_state_estimators::Correction<2>::callbackVector(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>)10718
    mrs_uav_state_estimators::Correction<2>::getCorrectionFromVector(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>)10742
    mrs_uav_state_estimators::Correction<2>::getVecInFrame(geometry_msgs::Vector3_<std::allocator<void> > const&, std_msgs::Header_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)10745
    mrs_uav_state_estimators::Correction<2>::callbackPoint(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>)180900
    mrs_uav_state_estimators::Correction<2>::getCorrectionFromPoint(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>)184629
    mrs_uav_state_estimators::Correction<1>::callbackVector(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>)188644
    mrs_uav_state_estimators::Correction<1>::getCorrectionFromVector(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>)188744
    mrs_uav_state_estimators::Correction<1>::getZVelUntilted(geometry_msgs::Vector3_<std::allocator<void> > const&, std_msgs::Header_<std::allocator<void> > const&)188760
    mrs_uav_state_estimators::Correction<2>::setR(double)193518
    mrs_uav_state_estimators::Correction<2>::getStateId() const193717
    mrs_uav_state_estimators::Correction<2>::applyCorrection(Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, ros::Time const&)197011
    mrs_uav_state_estimators::Correction<2>::isHealthy()197409
    mrs_uav_state_estimators::Correction<2>::isMsgComing()197414
    mrs_uav_state_estimators::Correction<2>::process(Eigen::Matrix<double, 2, 1, 0, 2, 1>&)200848
    mrs_uav_state_estimators::Correction<1>::callbackRange(boost::shared_ptr<sensor_msgs::Range_<std::allocator<void> > const>)258327
    mrs_uav_state_estimators::Correction<1>::getCorrectionFromRange(boost::shared_ptr<sensor_msgs::Range_<std::allocator<void> > const>)262328
    mrs_uav_state_estimators::Correction<2>::publishCorrection(mrs_uav_state_estimators::Correction<2>::MeasurementStamped const&, mrs_lib::PublisherHandler<mrs_msgs::EstimatorCorrection_<std::allocator<void> > >&)394213
    mrs_uav_state_estimators::Correction<1>::getStateId() const445254
    mrs_uav_state_estimators::Correction<1>::setR(double)445257
    mrs_uav_state_estimators::Correction<1>::applyCorrection(Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, ros::Time const&)448841
    mrs_uav_state_estimators::Correction<1>::process(Eigen::Matrix<double, 1, 1, 0, 1, 1>&)452773
    mrs_uav_state_estimators::Correction<1>::isHealthy()478150
    mrs_uav_state_estimators::Correction<1>::isMsgComing()478152
    mrs_uav_state_estimators::Correction<1>::publishCorrection(mrs_uav_state_estimators::Correction<1>::MeasurementStamped const&, mrs_lib::PublisherHandler<mrs_msgs::EstimatorCorrection_<std::allocator<void> > >&)897992
    mrs_uav_state_estimators::Correction<2>::getR()981639
    mrs_uav_state_estimators::Correction<1>::getR()1342912
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/correction.h.func.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/correction.h.func.html new file mode 100644 index 0000000000..ee699aad19 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/correction.h.func.html @@ -0,0 +1,364 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/correction.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators - correction.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:37572551.7 %
    Date:2024-04-18 23:11:36Functions:477166.2 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::Correction<1>::callbackImu(boost::shared_ptr<sensor_msgs::Imu_<std::allocator<void> > const>)0
    mrs_uav_state_estimators::Correction<1>::callbackRtk(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>)2563
    mrs_uav_state_estimators::Correction<1>::isMsgComing()478152
    mrs_uav_state_estimators::Correction<1>::callbackPoint(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>)0
    mrs_uav_state_estimators::Correction<1>::callbackRange(boost::shared_ptr<sensor_msgs::Range_<std::allocator<void> > const>)258327
    mrs_uav_state_estimators::Correction<1>::getVecInFrame(geometry_msgs::Vector3_<std::allocator<void> > const&, std_msgs::Header_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)0
    mrs_uav_state_estimators::Correction<1>::callbackVector(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>)188644
    mrs_uav_state_estimators::Correction<1>::getAvgRtkInitZ(double)22
    mrs_uav_state_estimators::Correction<1>::applyCorrection(Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, ros::Time const&)448841
    mrs_uav_state_estimators::Correction<1>::getZVelUntilted(geometry_msgs::Vector3_<std::allocator<void> > const&, std_msgs::Header_<std::allocator<void> > const&)188760
    mrs_uav_state_estimators::Correction<1>::callbackOdometry(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>)0
    mrs_uav_state_estimators::Correction<1>::getRawCorrection()8566
    mrs_uav_state_estimators::Correction<1>::publishCorrection(mrs_uav_state_estimators::Correction<1>::MeasurementStamped const&, mrs_lib::PublisherHandler<mrs_msgs::EstimatorCorrection_<std::allocator<void> > >&)897992
    mrs_uav_state_estimators::Correction<1>::callbackPoseStamped(boost::shared_ptr<geometry_msgs::PoseStamped_<std::allocator<void> > const>)0
    mrs_uav_state_estimators::Correction<1>::callbackToggleRange(std_srvs::SetBoolRequest_<std::allocator<void> >&, std_srvs::SetBoolResponse_<std::allocator<void> >&)0
    mrs_uav_state_estimators::Correction<1>::getCorrectionFromImu(boost::shared_ptr<sensor_msgs::Imu_<std::allocator<void> > const>)0
    mrs_uav_state_estimators::Correction<1>::getCorrectionFromRtk(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>)2586
    mrs_uav_state_estimators::Correction<1>::getCorrectionFromQuat(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>)0
    mrs_uav_state_estimators::Correction<1>::getCorrectionFromPoint(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>)0
    mrs_uav_state_estimators::Correction<1>::getCorrectionFromRange(boost::shared_ptr<sensor_msgs::Range_<std::allocator<void> > const>)262328
    mrs_uav_state_estimators::Correction<1>::getProcessedCorrection()8575
    mrs_uav_state_estimators::Correction<1>::createProcessorFromName(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::NodeHandle&)230
    mrs_uav_state_estimators::Correction<1>::getCorrectionFromVector(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>)188744
    mrs_uav_state_estimators::Correction<1>::getCorrectionFromOdometry(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>)0
    mrs_uav_state_estimators::Correction<1>::getCorrectionFromPoseStamped(boost::shared_ptr<geometry_msgs::PoseStamped_<std::allocator<void> > const>)0
    mrs_uav_state_estimators::Correction<1>::getR()1342912
    mrs_uav_state_estimators::Correction<1>::setR(double)445257
    mrs_uav_state_estimators::Correction<1>::process(Eigen::Matrix<double, 1, 1, 0, 1, 1>&)452773
    mrs_uav_state_estimators::Correction<1>::isHealthy()478150
    mrs_uav_state_estimators::Correction<1>::Correction(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, mrs_uav_state_estimators::EstimatorType_t const&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&, std::function<double (int, int)>, std::function<void (mrs_uav_state_estimators::Correction<1>::MeasurementStamped, double, mrs_uav_managers::estimation_manager::StateId_t)>)245
    mrs_uav_state_estimators::Correction<2>::callbackImu(boost::shared_ptr<sensor_msgs::Imu_<std::allocator<void> > const>)0
    mrs_uav_state_estimators::Correction<2>::callbackRtk(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>)5408
    mrs_uav_state_estimators::Correction<2>::isMsgComing()197414
    mrs_uav_state_estimators::Correction<2>::callbackPoint(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>)180900
    mrs_uav_state_estimators::Correction<2>::callbackRange(boost::shared_ptr<sensor_msgs::Range_<std::allocator<void> > const>)0
    mrs_uav_state_estimators::Correction<2>::getVecInFrame(geometry_msgs::Vector3_<std::allocator<void> > const&, std_msgs::Header_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)10745
    mrs_uav_state_estimators::Correction<2>::callbackVector(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>)10718
    mrs_uav_state_estimators::Correction<2>::getAvgRtkInitZ(double)0
    mrs_uav_state_estimators::Correction<2>::applyCorrection(Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, ros::Time const&)197011
    mrs_uav_state_estimators::Correction<2>::getZVelUntilted(geometry_msgs::Vector3_<std::allocator<void> > const&, std_msgs::Header_<std::allocator<void> > const&)0
    mrs_uav_state_estimators::Correction<2>::resetProcessors()0
    mrs_uav_state_estimators::Correction<2>::callbackOdometry(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>)0
    mrs_uav_state_estimators::Correction<2>::getRawCorrection()6660
    mrs_uav_state_estimators::Correction<2>::publishCorrection(mrs_uav_state_estimators::Correction<2>::MeasurementStamped const&, mrs_lib::PublisherHandler<mrs_msgs::EstimatorCorrection_<std::allocator<void> > >&)394213
    mrs_uav_state_estimators::Correction<2>::callbackPoseStamped(boost::shared_ptr<geometry_msgs::PoseStamped_<std::allocator<void> > const>)0
    mrs_uav_state_estimators::Correction<2>::callbackToggleRange(std_srvs::SetBoolRequest_<std::allocator<void> >&, std_srvs::SetBoolResponse_<std::allocator<void> >&)0
    mrs_uav_state_estimators::Correction<2>::getCorrectionFromImu(boost::shared_ptr<sensor_msgs::Imu_<std::allocator<void> > const>)0
    mrs_uav_state_estimators::Correction<2>::getCorrectionFromRtk(boost::shared_ptr<mrs_msgs::RtkGps_<std::allocator<void> > const>)5477
    mrs_uav_state_estimators::Correction<2>::getCorrectionFromQuat(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>)0
    mrs_uav_state_estimators::Correction<2>::getCorrectionFromPoint(boost::shared_ptr<geometry_msgs::PointStamped_<std::allocator<void> > const>)184629
    mrs_uav_state_estimators::Correction<2>::getCorrectionFromRange(boost::shared_ptr<sensor_msgs::Range_<std::allocator<void> > const>)0
    mrs_uav_state_estimators::Correction<2>::getProcessedCorrection()6659
    mrs_uav_state_estimators::Correction<2>::createProcessorFromName(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::NodeHandle&)97
    mrs_uav_state_estimators::Correction<2>::getCorrectionFromVector(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>)10742
    mrs_uav_state_estimators::Correction<2>::getCorrectionFromOdometry(boost::shared_ptr<nav_msgs::Odometry_<std::allocator<void> > const>)0
    mrs_uav_state_estimators::Correction<2>::getCorrectionFromPoseStamped(boost::shared_ptr<geometry_msgs::PoseStamped_<std::allocator<void> > const>)0
    mrs_uav_state_estimators::Correction<2>::getR()981639
    mrs_uav_state_estimators::Correction<2>::setR(double)193518
    mrs_uav_state_estimators::Correction<2>::process(Eigen::Matrix<double, 2, 1, 0, 2, 1>&)200848
    mrs_uav_state_estimators::Correction<2>::isHealthy()197409
    mrs_uav_state_estimators::Correction<2>::Correction(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, mrs_uav_state_estimators::EstimatorType_t const&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&, std::function<double (int, int)>, std::function<void (mrs_uav_state_estimators::Correction<2>::MeasurementStamped, double, mrs_uav_managers::estimation_manager::StateId_t)>)101
    mrs_uav_state_estimators::Correction<1>::getStateId() const445254
    mrs_uav_state_estimators::Correction<1>::getPrintName[abi:cxx11]() const552
    mrs_uav_state_estimators::Correction<1>::getNamespacedName[abi:cxx11]() const969
    mrs_uav_state_estimators::Correction<1>::transformRtkToFcu(geometry_msgs::PoseStamped_<std::allocator<void> > const&) const2586
    mrs_uav_state_estimators::Correction<1>::getName[abi:cxx11]() const490
    mrs_uav_state_estimators::Correction<2>::getStateId() const193717
    mrs_uav_state_estimators::Correction<2>::getPrintName[abi:cxx11]() const206
    mrs_uav_state_estimators::Correction<2>::getNamespacedName[abi:cxx11]() const434
    mrs_uav_state_estimators::Correction<2>::transformRtkToFcu(geometry_msgs::PoseStamped_<std::allocator<void> > const&) const5478
    mrs_uav_state_estimators::Correction<2>::getName[abi:cxx11]() const202
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/correction.h.gcov.frameset.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/correction.h.gcov.frameset.html new file mode 100644 index 0000000000..3b2b9aa9cc --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/correction.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/correction.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/correction.h.gcov.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/correction.h.gcov.html new file mode 100644 index 0000000000..e641f3f2c9 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/correction.h.gcov.html @@ -0,0 +1,1944 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/correction.h + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators - correction.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:37572551.7 %
    Date:2024-04-18 23:11:36Functions:477166.2 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #pragma once
    +       2             : #ifndef ESTIMATORS_CORRECTION_H
    +       3             : #define ESTIMATORS_CORRECTION_H
    +       4             : 
    +       5             : #include <Eigen/Dense>
    +       6             : 
    +       7             : #include <mrs_lib/subscribe_handler.h>
    +       8             : #include <mrs_lib/publisher_handler.h>
    +       9             : #include <mrs_lib/attitude_converter.h>
    +      10             : #include <mrs_lib/param_loader.h>
    +      11             : #include <mrs_lib/dynamic_reconfigure_mgr.h>
    +      12             : #include <mrs_lib/gps_conversions.h>
    +      13             : #include <mrs_lib/mutex.h>
    +      14             : #include <mrs_lib/geometry/cyclic.h>
    +      15             : 
    +      16             : #include <mrs_msgs/RtkGps.h>
    +      17             : #include <mrs_msgs/EstimatorCorrection.h>
    +      18             : #include <mrs_msgs/Float64Stamped.h>
    +      19             : 
    +      20             : #include <sensor_msgs/Range.h>
    +      21             : #include <sensor_msgs/Imu.h>
    +      22             : #include <nav_msgs/Odometry.h>
    +      23             : 
    +      24             : #include <std_srvs/SetBool.h>
    +      25             : 
    +      26             : #include <functional>
    +      27             : 
    +      28             : #include <mrs_uav_managers/estimation_manager/types.h>
    +      29             : #include <mrs_uav_managers/estimation_manager/support.h>
    +      30             : #include <mrs_uav_managers/estimation_manager/common_handlers.h>
    +      31             : #include <mrs_uav_managers/estimation_manager/private_handlers.h>
    +      32             : 
    +      33             : #include <mrs_uav_state_estimators/processors/processor.h>
    +      34             : #include <mrs_uav_state_estimators/processors/proc_median_filter.h>
    +      35             : #include <mrs_uav_state_estimators/processors/proc_saturate.h>
    +      36             : #include <mrs_uav_state_estimators/processors/proc_excessive_tilt.h>
    +      37             : #include <mrs_uav_state_estimators/processors/proc_tf_to_world.h>
    +      38             : 
    +      39             : #include <mrs_uav_state_estimators/CorrectionConfig.h>
    +      40             : 
    +      41             : 
    +      42             : namespace mrs_uav_state_estimators
    +      43             : {
    +      44             : 
    +      45             : typedef enum
    +      46             : {
    +      47             :   LATERAL,
    +      48             :   ALTITUDE,
    +      49             :   HEADING
    +      50             : } EstimatorType_t;
    +      51             : const int n_EstimatorType_t = 3;
    +      52             : 
    +      53             : typedef enum
    +      54             : {
    +      55             :   UNKNOWN,
    +      56             :   ODOMETRY,
    +      57             :   POSE,
    +      58             :   POSECOV,
    +      59             :   RANGE,
    +      60             :   IMU,
    +      61             :   RTK_GPS,
    +      62             :   POINT,
    +      63             :   VECTOR,
    +      64             :   QUAT,
    +      65             : } MessageType_t;
    +      66             : const int n_MessageType_t = 10;
    +      67             : 
    +      68             : const std::map<std::string, MessageType_t> map_msg_type{{"nav_msgs/Odometry", MessageType_t::ODOMETRY},
    +      69             :                                                         {"geometry_msgs/PoseStamped", MessageType_t::POSE},
    +      70             :                                                         {"geometry_msgs/PoseWithCovarianceStamped", MessageType_t::POSECOV},
    +      71             :                                                         {"sensor_msgs/Range", MessageType_t::RANGE},
    +      72             :                                                         {"sensor_msgs/Imu", MessageType_t::IMU},
    +      73             :                                                         {"mrs_msgs/RtkGps", MessageType_t::RTK_GPS},
    +      74             :                                                         {"geometry_msgs/PointStamped", MessageType_t::POINT},
    +      75             :                                                         {"geometry_msgs/Vector3Stamped", MessageType_t::VECTOR},
    +      76             :                                                         {"geometry_msgs/QuaternionStamped", MessageType_t::QUAT}};
    +      77             : 
    +      78             : template <int n_measurements>
    +      79             : class Correction {
    +      80             : 
    +      81             :   using CommonHandlers_t  = mrs_uav_managers::estimation_manager::CommonHandlers_t;
    +      82             :   using PrivateHandlers_t = mrs_uav_managers::estimation_manager::PrivateHandlers_t;
    +      83             :   using StateId_t         = mrs_uav_managers::estimation_manager::StateId_t;
    +      84             : 
    +      85             : public:
    +      86             :   typedef Eigen::Matrix<double, n_measurements, 1>         measurement_t;
    +      87             :   typedef mrs_lib::DynamicReconfigureMgr<CorrectionConfig> drmgr_t;
    +      88             : 
    +      89             :   struct MeasurementStamped
    +      90             :   {
    +      91             :     ros::Time     stamp;
    +      92             :     measurement_t value;
    +      93             :   };
    +      94             : 
    +      95             : public:
    +      96             :   Correction(ros::NodeHandle& nh, const std::string& est_name, const std::string& name, const std::string& frame_id, const EstimatorType_t& est_type,
    +      97             :              const std::shared_ptr<CommonHandlers_t>& ch, const std::shared_ptr<PrivateHandlers_t>& ph, std::function<double(int, int)> fun_get_state,
    +      98             :              std::function<void(MeasurementStamped, double, StateId_t)> fun_apply_correction);
    +      99             : 
    +     100             :   std::string getName() const;
    +     101             :   std::string getNamespacedName() const;
    +     102             :   std::string getPrintName() const;
    +     103             : 
    +     104             :   double    getR();
    +     105             :   void      setR(const double R);
    +     106             :   StateId_t getStateId() const;
    +     107             : 
    +     108             :   bool             isHealthy();
    +     109             :   ros::Time        healthy_time_;
    +     110             :   std::atomic_bool is_healthy_    = true;
    +     111             :   std::atomic_bool is_delay_ok_   = true;
    +     112             :   std::atomic_bool is_dt_ok_      = true;
    +     113             :   std::atomic_bool is_nan_free_   = true;
    +     114             :   std::atomic_bool got_first_msg_ = false;
    +     115             : 
    +     116             :   int counter_nan_ = 0;
    +     117             : 
    +     118             :   std::optional<MeasurementStamped> getRawCorrection();
    +     119             :   std::optional<MeasurementStamped> getProcessedCorrection();
    +     120             : 
    +     121             :   void resetProcessors();
    +     122             : 
    +     123             : private:
    +     124             :   std::atomic_bool is_initialized_ = false;
    +     125             : 
    +     126             :   mrs_lib::SubscribeHandler<nav_msgs::Odometry> sh_odom_;
    +     127             :   void                                          callbackOdometry(const nav_msgs::Odometry::ConstPtr msg);
    +     128             :   std::optional<measurement_t>                  getCorrectionFromOdometry(const nav_msgs::OdometryConstPtr msg);
    +     129             : 
    +     130             :   mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped> sh_pose_s_;
    +     131             :   void                                                  callbackPoseStamped(const geometry_msgs::PoseStamped::ConstPtr msg);
    +     132             :   std::optional<measurement_t>                          getCorrectionFromPoseStamped(const geometry_msgs::PoseStampedConstPtr msg);
    +     133             : 
    +     134             :   mrs_lib::SubscribeHandler<geometry_msgs::PoseWithCovarianceStamped> sh_pose_wcs_;
    +     135             : 
    +     136             :   mrs_lib::SubscribeHandler<mrs_msgs::RtkGps> sh_rtk_;
    +     137             :   void                                        callbackRtk(const mrs_msgs::RtkGps::ConstPtr msg);
    +     138             :   std::optional<measurement_t>                getCorrectionFromRtk(const mrs_msgs::RtkGpsConstPtr msg);
    +     139             :   void                                        getAvgRtkInitZ(const double rtk_z);
    +     140             :   bool                                        got_avg_init_rtk_z_ = false;
    +     141             :   double                                      rtk_init_z_avg_     = 0.0;
    +     142             :   int                                         got_rtk_counter_    = 0;
    +     143             : 
    +     144             :   mrs_lib::SubscribeHandler<geometry_msgs::PointStamped> sh_point_;
    +     145             :   void                                                   callbackPoint(const geometry_msgs::PointStamped::ConstPtr msg);
    +     146             :   std::optional<measurement_t>                           getCorrectionFromPoint(const geometry_msgs::PointStampedConstPtr msg);
    +     147             : 
    +     148             :   mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped> sh_vector_;
    +     149             :   std::optional<measurement_t>                             getCorrectionFromVector(const geometry_msgs::Vector3StampedConstPtr msg);
    +     150             :   void                                                     callbackVector(const geometry_msgs::Vector3Stamped::ConstPtr msg);
    +     151             : 
    +     152             :   mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped> sh_orientation_;  // for obtaining heading rate
    +     153             :   std::string                                                 orientation_topic_;
    +     154             : 
    +     155             :   mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped> sh_quat_;
    +     156             :   measurement_t                                               prev_hdg_measurement_;
    +     157             :   bool                                                        got_first_hdg_measurement_ = false;
    +     158             : 
    +     159             :   mrs_lib::SubscribeHandler<sensor_msgs::Imu> sh_imu_;
    +     160             :   std::optional<measurement_t>                             getCorrectionFromImu(const sensor_msgs::ImuConstPtr msg);
    +     161             :   void                                                     callbackImu(const sensor_msgs::Imu::ConstPtr msg);
    +     162             : 
    +     163             :   mrs_lib::SubscribeHandler<sensor_msgs::Range> sh_range_;
    +     164             :   std::optional<measurement_t>                  getCorrectionFromRange(const sensor_msgs::RangeConstPtr msg);
    +     165             :   void                                          callbackRange(const sensor_msgs::Range::ConstPtr msg);
    +     166             :   ros::ServiceServer                            ser_toggle_range_;
    +     167             :   bool                                          callbackToggleRange(std_srvs::SetBool::Request& req, std_srvs::SetBool::Response& res);
    +     168             :   bool                                          range_enabled_ = true;
    +     169             : 
    +     170             :   void applyCorrection(const measurement_t& meas, const ros::Time& stamp);
    +     171             : 
    +     172             :   mrs_lib::PublisherHandler<mrs_msgs::EstimatorCorrection> ph_correction_raw_;
    +     173             :   mrs_lib::PublisherHandler<mrs_msgs::EstimatorCorrection> ph_correction_proc_;
    +     174             :   mrs_lib::PublisherHandler<mrs_msgs::Float64Stamped>      ph_delay_;
    +     175             : 
    +     176             :   const std::string                  est_name_;
    +     177             :   const std::string                  name_;
    +     178             :   const std::string                  ns_frame_id_;
    +     179             :   const EstimatorType_t              est_type_;
    +     180             :   std::shared_ptr<CommonHandlers_t>  ch_;
    +     181             :   std::shared_ptr<PrivateHandlers_t> ph_;
    +     182             : 
    +     183             :   MessageType_t msg_type_;
    +     184             :   std::string   msg_topic_;
    +     185             :   double        msg_timeout_;
    +     186             : 
    +     187             :   double     R_;
    +     188             :   double     default_R_;
    +     189             :   double     R_coeff_;
    +     190             :   std::mutex mtx_R_;
    +     191             :   StateId_t  state_id_;
    +     192             :   bool       is_in_body_frame_ = true;
    +     193             :   double     gravity_norm_ = 9.8066;
    +     194             : 
    +     195             :   std::unique_ptr<drmgr_t> drmgr_;
    +     196             : 
    +     197             :   std::optional<measurement_t> getCorrectionFromQuat(const geometry_msgs::QuaternionStampedConstPtr msg);
    +     198             :   std::optional<measurement_t> getZVelUntilted(const geometry_msgs::Vector3& msg, const std_msgs::Header& header);
    +     199             :   std::optional<measurement_t> getVecInFrame(const geometry_msgs::Vector3& vec_in, const std_msgs::Header& source_header, const std::string target_frame);
    +     200             : 
    +     201             :   std::optional<geometry_msgs::Pose> transformRtkToFcu(const geometry_msgs::PoseStamped& pose_in) const;
    +     202             : 
    +     203             :   void   checkMsgDelay(const ros::Time& msg_time);
    +     204             :   double msg_delay_limit_;
    +     205             :   double msg_delay_warn_limit_;
    +     206             : 
    +     207             :   double time_since_last_msg_limit_;
    +     208             : 
    +     209             :   std::shared_ptr<Processor<n_measurements>> createProcessorFromName(const std::string& name, ros::NodeHandle& nh);
    +     210             :   bool                                       process(measurement_t& measurement);
    +     211             : 
    +     212             :   bool             isTimestampOk();
    +     213             :   bool             isMsgComing();
    +     214             :   std::atomic_bool first_timestamp_ = true;
    +     215             :   ros::Time        msg_time_;
    +     216             :   ros::Time        prev_msg_time_;
    +     217             :   std::mutex       mtx_msg_time_;
    +     218             : 
    +     219             :   std::vector<std::string>                                                    processor_names_;
    +     220             :   std::unordered_map<std::string, std::shared_ptr<Processor<n_measurements>>> processors_;
    +     221             : 
    +     222             :   std::function<double(int, int)>                            fun_get_state_;
    +     223             :   std::function<void(MeasurementStamped, double, StateId_t)> fun_apply_correction_;
    +     224             : 
    +     225             :   void publishCorrection(const MeasurementStamped& measurement_stamped, mrs_lib::PublisherHandler<mrs_msgs::EstimatorCorrection>& ph_corr);
    +     226             :   void publishDelay(const double delay);
    +     227             : };
    +     228             : 
    +     229             : /*//{ constructor */
    +     230             : template <int n_measurements>
    +     231         346 : Correction<n_measurements>::Correction(ros::NodeHandle& nh, const std::string& est_name, const std::string& name, const std::string& ns_frame_id,
    +     232             :                                        const EstimatorType_t& est_type, const std::shared_ptr<CommonHandlers_t>& ch,
    +     233             :                                        const std::shared_ptr<PrivateHandlers_t>& ph, std::function<double(int, int)> fun_get_state,
    +     234             :                                        std::function<void(MeasurementStamped, double, StateId_t)> fun_apply_correction)
    +     235             :     : est_name_(est_name),
    +     236             :       name_(name),
    +     237             :       ns_frame_id_(ns_frame_id),
    +     238             :       est_type_(est_type),
    +     239             :       ch_(ch),
    +     240             :       ph_(ph),
    +     241             :       fun_get_state_(fun_get_state),
    +     242         346 :       fun_apply_correction_(fun_apply_correction) {
    +     243             : 
    +     244             :   // | --------------------- load parameters -------------------- |
    +     245             : 
    +     246         692 :   std::string msg_type_string;
    +     247             : 
    +     248         346 :   ph->param_loader->setPrefix(ch_->package_name + "/" + Support::toSnakeCase(ch->nodelet_name) + "/" + getNamespacedName() + "/");
    +     249             : 
    +     250         346 :   ph->param_loader->loadParam("message/type", msg_type_string);
    +     251         346 :   if (map_msg_type.find(msg_type_string) == map_msg_type.end()) {
    +     252           0 :     ROS_ERROR("[%s]: wrong message type: %s of correction %s", getPrintName().c_str(), msg_type_string.c_str(), getName().c_str());
    +     253           0 :     ros::shutdown();
    +     254             :   }
    +     255         346 :   msg_type_ = map_msg_type.at(msg_type_string);
    +     256             : 
    +     257         346 :   ph->param_loader->loadParam("message/topic", msg_topic_);
    +     258         346 :   msg_topic_ = "/" + ch_->uav_name + "/" + msg_topic_;
    +     259         346 :   ph->param_loader->loadParam("message/limit/delay", msg_delay_limit_);
    +     260         346 :   msg_delay_warn_limit_ = msg_delay_limit_ / 2;  // maybe specify this as a param?
    +     261         346 :   ph->param_loader->loadParam("message/limit/time_since_last", time_since_last_msg_limit_);
    +     262             : 
    +     263             :   int state_id_tmp;
    +     264         346 :   ph->param_loader->loadParam("state_id", state_id_tmp);
    +     265         346 :   if (state_id_tmp < n_StateId_t) {
    +     266         346 :     state_id_ = static_cast<StateId_t>(state_id_tmp);
    +     267             :   } else {
    +     268           0 :     ROS_ERROR("[%s]: wrong state id: %d of correction %s", getPrintName().c_str(), state_id_tmp, getName().c_str());
    +     269           0 :     ros::shutdown();
    +     270             :   }
    +     271             : 
    +     272         346 :   if (state_id_ == StateId_t::VELOCITY) {
    +     273         101 :     ph->param_loader->loadParam("body_frame", is_in_body_frame_, true);
    +     274             :   }
    +     275             :   
    +     276         346 :   if (state_id_ == StateId_t::ACCELERATION) {
    +     277           0 :     ph->param_loader->loadParam("body_frame", is_in_body_frame_, true);
    +     278           0 :     ph->param_loader->loadParam("gravity_norm", gravity_norm_, 9.8066);
    +     279             :   }
    +     280             : 
    +     281         346 :   ph->param_loader->loadParam("noise", R_);
    +     282         346 :   ph->param_loader->loadParam("noise_unhealthy_coeff", R_coeff_);
    +     283         346 :   default_R_ = R_;
    +     284             : 
    +     285             :   // | --------------- processors initialization --------------- |
    +     286         346 :   ph->param_loader->loadParam("processors", processor_names_);
    +     287             : 
    +     288         673 :   for (auto proc_name : processor_names_) {
    +     289         327 :     processors_[proc_name] = createProcessorFromName(proc_name, nh);
    +     290             :   }
    +     291             : 
    +     292             :   // | ------------- initialize dynamic reconfigure ------------- |
    +     293         346 :   drmgr_               = std::make_unique<drmgr_t>(ros::NodeHandle("~/" + getNamespacedName()), getPrintName());
    +     294         346 :   drmgr_->config.noise = R_;
    +     295         346 :   drmgr_->update_config(drmgr_->config);
    +     296             : 
    +     297             :   // | -------------- initialize subscribe handlers ------------- |
    +     298         692 :   mrs_lib::SubscribeHandlerOptions shopts;
    +     299         346 :   shopts.nh                 = nh;
    +     300         346 :   shopts.node_name          = getPrintName();
    +     301         346 :   shopts.no_message_timeout = mrs_lib::no_timeout;
    +     302         346 :   shopts.threadsafe         = true;
    +     303         346 :   shopts.autostart          = true;
    +     304         346 :   shopts.queue_size         = 10;
    +     305         346 :   shopts.transport_hints    = ros::TransportHints().tcpNoDelay();
    +     306             : 
    +     307         346 :   switch (msg_type_) {
    +     308           0 :     case MessageType_t::ODOMETRY: {
    +     309           0 :       sh_odom_ = mrs_lib::SubscribeHandler<nav_msgs::Odometry>(shopts, msg_topic_, &Correction::callbackOdometry, this);
    +     310           0 :       break;
    +     311             :     }
    +     312           0 :     case MessageType_t::POSE: {
    +     313           0 :       sh_pose_s_ = mrs_lib::SubscribeHandler<geometry_msgs::PoseStamped>(shopts, msg_topic_, &Correction::callbackPoseStamped, this);
    +     314           0 :       break;
    +     315             :     }
    +     316           0 :     case MessageType_t::POSECOV: {
    +     317             :       // TODO implement
    +     318             :       /* sh_pose_wcs_ = mrs_lib::SubscribeHandler<geometry_msgs::PoseWithCovarianceStamped>(shopts, msg_topic_); */
    +     319           0 :       break;
    +     320             :     }
    +     321         146 :     case MessageType_t::RANGE: {
    +     322         146 :       sh_range_                   = mrs_lib::SubscribeHandler<sensor_msgs::Range>(shopts, msg_topic_, &Correction::callbackRange, this);
    +     323         146 :       const std::size_t found     = ros::this_node::getName().find_last_of("/");
    +     324         292 :       std::string       node_name = ros::this_node::getName().substr(found + 1);
    +     325         292 :       ser_toggle_range_ =
    +     326         146 :           nh.advertiseService(ros::this_node::getName() + "/" + getNamespacedName() + "/toggle_range_in", &Correction::callbackToggleRange, this);
    +     327         146 :       break;
    +     328             :     }
    +     329           0 :     case MessageType_t::IMU: {
    +     330           0 :       sh_imu_ = mrs_lib::SubscribeHandler<sensor_msgs::Imu>(shopts, msg_topic_, &Correction::callbackImu, this);
    +     331           0 :       break;
    +     332             :     }
    +     333           6 :     case MessageType_t::RTK_GPS: {
    +     334           6 :       sh_rtk_ = mrs_lib::SubscribeHandler<mrs_msgs::RtkGps>(shopts, msg_topic_, &Correction::callbackRtk, this);
    +     335           6 :       break;
    +     336             :     }
    +     337          93 :     case MessageType_t::POINT: {
    +     338          93 :       sh_point_ = mrs_lib::SubscribeHandler<geometry_msgs::PointStamped>(shopts, msg_topic_, &Correction::callbackPoint, this);
    +     339          93 :       break;
    +     340             :     }
    +     341         101 :     case MessageType_t::VECTOR: {
    +     342         101 :       sh_vector_ = mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped>(shopts, msg_topic_, &Correction::callbackVector, this);
    +     343         101 :       break;
    +     344             :     }
    +     345           0 :     case MessageType_t::QUAT: {
    +     346           0 :       sh_quat_ = mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped>(shopts, msg_topic_);
    +     347           0 :       break;
    +     348             :     }
    +     349           0 :     case MessageType_t::UNKNOWN: {
    +     350           0 :       ROS_ERROR("[%s]: UNKNOWN message type of correction", getPrintName().c_str());
    +     351           0 :       break;
    +     352             :     }
    +     353           0 :     default: {
    +     354           0 :       ROS_ERROR("[%s]: unhandled message type", getPrintName().c_str());
    +     355             :     }
    +     356             :   }
    +     357             : 
    +     358             :   // | ------ subscribe orientation for obtaingin hdg rate ------ |
    +     359         346 :   if (est_type_ == EstimatorType_t::HEADING && state_id_ == StateId_t::VELOCITY) {
    +     360           0 :     ph->param_loader->loadParam("message/orientation_topic", orientation_topic_);
    +     361           0 :     orientation_topic_ = "/" + ch_->uav_name + "/" + orientation_topic_;
    +     362           0 :     sh_orientation_    = mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped>(shopts, orientation_topic_);
    +     363             :   }
    +     364             : 
    +     365             : 
    +     366             :   // | --------------- initialize publish handlers -------------- |
    +     367         346 :   if (ch_->debug_topics.correction) {
    +     368         346 :     ph_correction_raw_  = mrs_lib::PublisherHandler<mrs_msgs::EstimatorCorrection>(nh, est_name_ + "/correction/" + getName() + "/raw", 10);
    +     369         346 :     ph_correction_proc_ = mrs_lib::PublisherHandler<mrs_msgs::EstimatorCorrection>(nh, est_name_ + "/correction/" + getName() + "/proc", 10);
    +     370             :   }
    +     371         346 :   if (ch_->debug_topics.corr_delay) {
    +     372           0 :     ph_delay_ = mrs_lib::PublisherHandler<mrs_msgs::Float64Stamped>(nh, est_name_ + "/correction/" + getName() + "/delay", 10);
    +     373             :   }
    +     374             : 
    +     375             :   // | --- check whether all parameters were loaded correctly --- |
    +     376         346 :   if (!ph->param_loader->loadedSuccessfully()) {
    +     377           0 :     ROS_ERROR("[%s]: Could not load all non-optional parameters. Shutting down.", getPrintName().c_str());
    +     378           0 :     ros::shutdown();
    +     379             :   }
    +     380             : 
    +     381         346 :   healthy_time_ = ros::Time(0);
    +     382             : 
    +     383         346 :   is_initialized_ = true;
    +     384         346 : }
    +     385             : /*//}*/
    +     386             : 
    +     387             : /*//{ getName() */
    +     388             : template <int n_measurements>
    +     389         692 : std::string Correction<n_measurements>::getName() const {
    +     390         692 :   return name_;
    +     391             : }
    +     392             : /*//}*/
    +     393             : 
    +     394             : /*//{ getNamespacedName() */
    +     395             : template <int n_measurements>
    +     396        1403 : std::string Correction<n_measurements>::getNamespacedName() const {
    +     397        1403 :   return est_name_ + "/" + name_;
    +     398             : }
    +     399             : /*//}*/
    +     400             : 
    +     401             : /*//{ getPrintName() */
    +     402             : template <int n_measurements>
    +     403         758 : std::string Correction<n_measurements>::getPrintName() const {
    +     404         758 :   return ch_->nodelet_name + "/" + est_name_ + "/" + name_;
    +     405             : }
    +     406             : /*//}*/
    +     407             : 
    +     408             : /*//{ getR() */
    +     409             : template <int n_measurements>
    +     410     2324551 : double Correction<n_measurements>::getR() {
    +     411     2324551 :   std::scoped_lock lock(mtx_R_);
    +     412     2323836 :   default_R_ = drmgr_->config.noise;
    +     413     4647148 :   return R_;
    +     414             : }
    +     415             : /*//}*/
    +     416             : 
    +     417             : /*//{ setR() */
    +     418             : template <int n_measurements>
    +     419      638775 : void Correction<n_measurements>::setR(const double R) {
    +     420      638775 :   std::scoped_lock lock(mtx_R_);
    +     421      638641 :   R_ = R;
    +     422      638665 : }
    +     423             : /*//}*/
    +     424             : 
    +     425             : /*//{ getStateId() */
    +     426             : template <int n_measurements>
    +     427      638971 : StateId_t Correction<n_measurements>::getStateId() const {
    +     428      638971 :   return state_id_;
    +     429             : }
    +     430             : /*//}*/
    +     431             : 
    +     432             : /*//{ isHealthy() */
    +     433             : template <int n_measurements>
    +     434      675559 : bool Correction<n_measurements>::isHealthy() {
    +     435             : 
    +     436      675559 :   if (!is_initialized_) {
    +     437           0 :     return false;
    +     438             :   }
    +     439             : 
    +     440      675340 :   is_dt_ok_ = isMsgComing();
    +     441             : 
    +     442      675549 :   if (!is_delay_ok_) {
    +     443           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: delay not ok", getPrintName().c_str());
    +     444             :   }
    +     445             : 
    +     446      675368 :   if (!is_healthy_) {
    +     447           0 :     if (is_dt_ok_ && is_delay_ok_) {
    +     448           0 :       if (healthy_time_ > ros::Time(10)) {
    +     449           0 :         is_healthy_ = true;
    +     450             :       }
    +     451             :     } else {
    +     452           0 :       healthy_time_ = ros::Time(0);
    +     453             :     }
    +     454             :   }
    +     455             : 
    +     456      675421 :   is_healthy_ = is_healthy_ && is_dt_ok_ && is_delay_ok_;
    +     457             : 
    +     458      675585 :   return is_healthy_;
    +     459             : }
    +     460             : /*//}*/
    +     461             : 
    +     462             : /*//{ getRawCorrection() */
    +     463             : template <int n_measurements>
    +     464       15226 : std::optional<typename Correction<n_measurements>::MeasurementStamped> Correction<n_measurements>::getRawCorrection() {
    +     465             : 
    +     466       15226 :   if (!is_initialized_) {
    +     467           0 :     return {};
    +     468             :   }
    +     469             : 
    +     470       15225 :   MeasurementStamped measurement_stamped;
    +     471             : 
    +     472       15201 :   switch (msg_type_) {
    +     473             : 
    +     474           0 :     case MessageType_t::ODOMETRY: {
    +     475             : 
    +     476           0 :       if (!sh_odom_.hasMsg()) {
    +     477           0 :         return {};
    +     478             :       }
    +     479             : 
    +     480           0 :       auto msg                  = sh_odom_.getMsg();
    +     481           0 :       measurement_stamped.stamp = msg->header.stamp;
    +     482             :       /* if (!isTimestampOk(measurement_stamped.stamp)) { */
    +     483             :       /*   return {}; */
    +     484             :       /* } */
    +     485             :       /* checkMsgDelay(measurement_stamped.stamp); */
    +     486             : 
    +     487             :       /* if (!is_delay_ok_) { */
    +     488             :       /*   return {}; */
    +     489             :       /* } */
    +     490           0 :       auto res = getCorrectionFromOdometry(msg);
    +     491           0 :       if (res) {
    +     492           0 :         measurement_stamped.value = res.value();
    +     493             :       } else {
    +     494           0 :         return {};
    +     495             :       }
    +     496           0 :       break;
    +     497             :     }
    +     498             : 
    +     499           0 :     case MessageType_t::POSE: {
    +     500             : 
    +     501           0 :       if (!sh_pose_s_.hasMsg()) {
    +     502           0 :         return {};
    +     503             :       }
    +     504             : 
    +     505           0 :       auto msg                  = sh_pose_s_.getMsg();
    +     506           0 :       measurement_stamped.stamp = msg->header.stamp;
    +     507             :       /* if (!isTimestampOk(measurement_stamped.stamp)) { */
    +     508             :       /*   return {}; */
    +     509             :       /* } */
    +     510             :       /* checkMsgDelay(measurement_stamped.stamp); */
    +     511             : 
    +     512             :       /* if (!is_delay_ok_) { */
    +     513             :       /*   return {}; */
    +     514             :       /* } */
    +     515           0 :       auto res = getCorrectionFromPoseStamped(msg);
    +     516           0 :       if (res) {
    +     517           0 :         measurement_stamped.value = res.value();
    +     518             :       } else {
    +     519           0 :         return {};
    +     520             :       }
    +     521           0 :       break;
    +     522             :     }
    +     523             : 
    +     524           0 :     case MessageType_t::POSECOV: {
    +     525             :       // TODO implement
    +     526             :       /* return getCorrectionFromPoseWCS(msg); */
    +     527           0 :       is_healthy_ = false;
    +     528           0 :       return {};
    +     529             :       break;
    +     530             :     }
    +     531             : 
    +     532        8122 :     case MessageType_t::RANGE: {
    +     533             : 
    +     534        8122 :       if (!range_enabled_) {
    +     535           0 :         ROS_INFO_THROTTLE(1.0, "[%s]: fusing range corrections is disabled", getPrintName().c_str());
    +     536        4292 :         return {};
    +     537             :       }
    +     538             : 
    +     539        8122 :       if (!sh_range_.hasMsg()) {
    +     540        3006 :         return {};
    +     541             :       }
    +     542             : 
    +     543        5118 :       auto msg                  = sh_range_.getMsg();
    +     544        5114 :       measurement_stamped.stamp = msg->header.stamp;
    +     545             :       /* checkMsgDelay(measurement_stamped.stamp); */
    +     546             : 
    +     547             :       /* if (!is_delay_ok_) { */
    +     548             :       /*   return {}; */
    +     549             :       /* } */
    +     550             : 
    +     551        5115 :       auto res = getCorrectionFromRange(msg);
    +     552        5117 :       if (res) {
    +     553        3835 :         measurement_stamped.value = res.value();
    +     554             :       } else {
    +     555        1283 :         return {};
    +     556             :       }
    +     557        3835 :       break;
    +     558             :     }
    +     559             : 
    +     560           0 :     case MessageType_t::IMU: {
    +     561             : 
    +     562           0 :       if (!sh_imu_.hasMsg()) {
    +     563           0 :         ROS_ERROR_THROTTLE(1.0, " no imu msgs so far");
    +     564           0 :         return {};
    +     565             :       }
    +     566             : 
    +     567           0 :       auto msg                  = sh_imu_.getMsg();
    +     568           0 :       measurement_stamped.stamp = msg->header.stamp;
    +     569             :       /* checkMsgDelay(measurement_stamped.stamp); */
    +     570             : 
    +     571             :       /* if (!is_delay_ok_) { */
    +     572             :       /*   ROS_ERROR("[%s]: rtk msg delay not ok", ros::this_node::getName().c_str()); */
    +     573             :       /*   return {}; */
    +     574             :       /* } */
    +     575             : 
    +     576           0 :       auto res = getCorrectionFromImu(msg);
    +     577           0 :       if (res) {
    +     578           0 :         measurement_stamped.value = res.value();
    +     579             :       } else {
    +     580           0 :         ROS_ERROR_THROTTLE(1.0, "[%s]: could not get rtk correction", ros::this_node::getName().c_str());
    +     581           0 :         return {};
    +     582             :       }
    +     583             : 
    +     584           0 :       break;
    +     585             :     }
    +     586             : 
    +     587          89 :     case MessageType_t::RTK_GPS: {
    +     588             : 
    +     589          89 :       if (!sh_rtk_.hasMsg()) {
    +     590           0 :         ROS_ERROR_THROTTLE(1.0, " no rtk msgs so far");
    +     591          14 :         return {};
    +     592             :       }
    +     593             : 
    +     594          89 :       auto msg                  = sh_rtk_.getMsg();
    +     595          89 :       measurement_stamped.stamp = msg->header.stamp;
    +     596             :       /* checkMsgDelay(measurement_stamped.stamp); */
    +     597             : 
    +     598             :       /* if (!is_delay_ok_) { */
    +     599             :       /*   ROS_ERROR("[%s]: rtk msg delay not ok", ros::this_node::getName().c_str()); */
    +     600             :       /*   return {}; */
    +     601             :       /* } */
    +     602             : 
    +     603          89 :       auto res = getCorrectionFromRtk(msg);
    +     604          89 :       if (res) {
    +     605          75 :         measurement_stamped.value = res.value();
    +     606             :       } else {
    +     607          14 :         ROS_ERROR_THROTTLE(1.0, "[%s]: could not get rtk correction", ros::this_node::getName().c_str());
    +     608          14 :         return {};
    +     609             :       }
    +     610             : 
    +     611          75 :       break;
    +     612             :     }
    +     613             : 
    +     614        6528 :     case MessageType_t::POINT: {
    +     615             : 
    +     616        6528 :       if (!sh_point_.hasMsg()) {
    +     617        2792 :         return {};
    +     618             :       }
    +     619             : 
    +     620        3736 :       auto msg                  = sh_point_.getMsg();
    +     621        3736 :       measurement_stamped.stamp = msg->header.stamp;
    +     622             :       /* checkMsgDelay(measurement_stamped.stamp); */
    +     623             : 
    +     624             :       /* if (!is_delay_ok_) { */
    +     625             :       /*   return {}; */
    +     626             :       /* } */
    +     627        3736 :       auto res = getCorrectionFromPoint(msg);
    +     628        3736 :       if (res) {
    +     629        3736 :         measurement_stamped.value = res.value();
    +     630             :       } else {
    +     631           0 :         return {};
    +     632             :       }
    +     633        3736 :       break;
    +     634             :     }
    +     635             : 
    +     636         491 :     case MessageType_t::VECTOR: {
    +     637             : 
    +     638         491 :       if (!sh_vector_.hasMsg()) {
    +     639         390 :         return {};
    +     640             :       }
    +     641             : 
    +     642         122 :       auto msg                  = sh_vector_.getMsg();
    +     643         122 :       measurement_stamped.stamp = msg->header.stamp;
    +     644             :       /* checkMsgDelay(measurement_stamped.stamp); */
    +     645             : 
    +     646             :       /* if (!is_delay_ok_) { */
    +     647             :       /*   return {}; */
    +     648             :       /* } */
    +     649         122 :       auto res = getCorrectionFromVector(msg);
    +     650         122 :       if (res) {
    +     651         101 :         measurement_stamped.value = res.value();
    +     652             :       } else {
    +     653          21 :         return {};
    +     654             :       }
    +     655         101 :       break;
    +     656             :     }
    +     657             : 
    +     658           0 :     case MessageType_t::QUAT: {
    +     659             : 
    +     660           0 :       if (!sh_quat_.newMsg()) {
    +     661           0 :         return {};
    +     662             :       }
    +     663             : 
    +     664           0 :       auto msg                  = sh_quat_.getMsg();
    +     665           0 :       measurement_stamped.stamp = msg->header.stamp;
    +     666             :       /* checkMsgDelay(measurement_stamped.stamp); */
    +     667             : 
    +     668             :       /* if (!is_delay_ok_) { */
    +     669             :       /*   return {}; */
    +     670             :       /* } */
    +     671           0 :       auto res = getCorrectionFromQuat(msg);
    +     672           0 :       if (res) {
    +     673           0 :         measurement_stamped.value = res.value();
    +     674             :       } else {
    +     675           0 :         return {};
    +     676             :       }
    +     677           0 :       break;
    +     678             :     }
    +     679             : 
    +     680           0 :     default: {
    +     681           0 :       ROS_ERROR_THROTTLE(1.0, "[%s]: this type of correction is not implemented in getCorrectionFromMessage()", getPrintName().c_str());
    +     682           0 :       is_healthy_ = false;
    +     683           0 :       return {};
    +     684             :     }
    +     685             :   }
    +     686             : 
    +     687             :   // check for nans
    +     688        7747 :   is_nan_free_ = true;
    +     689       19298 :   for (int i = 0; i < measurement_stamped.value.rows(); i++) {
    +     690       11552 :     if (!std::isfinite(measurement_stamped.value(i))) {
    +     691           2 :       ROS_ERROR_THROTTLE(1.0, "[%s]: NaN detected in correction. Total NaNs: %d", getPrintName().c_str(), ++counter_nan_);
    +     692           0 :       is_nan_free_ = false;
    +     693           0 :       return {};
    +     694             :     }
    +     695             :   }
    +     696             : 
    +     697        7746 :   got_first_msg_ = true;
    +     698        7747 :   publishCorrection(measurement_stamped, ph_correction_raw_);
    +     699             : 
    +     700        7747 :   return measurement_stamped;
    +     701             : }
    +     702             : /*//}*/
    +     703             : 
    +     704             : /*//{ getProcessedCorrection() */
    +     705             : template <int n_measurements>
    +     706       15234 : std::optional<typename Correction<n_measurements>::MeasurementStamped> Correction<n_measurements>::getProcessedCorrection() {
    +     707             : 
    +     708       15234 :   MeasurementStamped measurement_stamped;
    +     709       15221 :   auto               res = getRawCorrection();
    +     710       15224 :   if (res) {
    +     711        7746 :     MeasurementStamped measurement_stamped = res.value();
    +     712        7746 :     if (process(measurement_stamped.value)) {
    +     713         415 :       publishCorrection(measurement_stamped, ph_correction_proc_);
    +     714         415 :       return measurement_stamped;
    +     715             :     } else {
    +     716        7332 :       return {};  // invalid correction
    +     717             :     }
    +     718             :   } else {
    +     719        7484 :     return {};  // invalid correction
    +     720             :   }
    +     721             : }  // namespace mrs_uav_state_estimation
    +     722             : /*//}*/
    +     723             : 
    +     724             : /*//{ callbackOdometry() */
    +     725             : template <int n_measurements>
    +     726           0 : void Correction<n_measurements>::callbackOdometry(const nav_msgs::Odometry::ConstPtr msg) {
    +     727             : 
    +     728           0 :   if (!is_initialized_) {
    +     729           0 :     return;
    +     730             :   }
    +     731             : 
    +     732           0 :   auto res = getCorrectionFromOdometry(msg);
    +     733           0 :   if (res) {
    +     734           0 :     applyCorrection(res.value(), msg->header.stamp);
    +     735             :   }
    +     736             : }
    +     737             : /*//}*/
    +     738             : 
    +     739             : /*//{ getCorrectionFromOdometry() */
    +     740             : template <int n_measurements>
    +     741           0 : std::optional<typename Correction<n_measurements>::measurement_t> Correction<n_measurements>::getCorrectionFromOdometry(const nav_msgs::OdometryConstPtr msg) {
    +     742             : 
    +     743           0 :   switch (est_type_) {
    +     744             : 
    +     745             :     // handle lateral estimators
    +     746           0 :     case EstimatorType_t::LATERAL: {
    +     747             : 
    +     748           0 :       switch (state_id_) {
    +     749             : 
    +     750           0 :         case StateId_t::POSITION: {
    +     751           0 :           measurement_t measurement;
    +     752           0 :           measurement(0) = msg->pose.pose.position.x;
    +     753           0 :           measurement(1) = msg->pose.pose.position.y;
    +     754           0 :           return measurement;
    +     755             :           break;
    +     756             :         }
    +     757             : 
    +     758           0 :         case StateId_t::VELOCITY: {
    +     759           0 :           if (is_in_body_frame_) {
    +     760           0 :             std_msgs::Header header = msg->header;
    +     761           0 :             header.frame_id         = ch_->frames.ns_fcu;  // message in odometry is published in body frame
    +     762           0 :             auto res                = getVecInFrame(msg->twist.twist.linear, header, ns_frame_id_ + "_att_only");
    +     763           0 :             if (res) {
    +     764           0 :               measurement_t measurement;
    +     765           0 :               measurement = res.value();
    +     766           0 :               return measurement;
    +     767             :             } else {
    +     768           0 :               ROS_WARN_THROTTLE(1.0, "[%s]: could not transform vel from odom", ros::this_node::getName().c_str());
    +     769           0 :               return {};
    +     770             :             }
    +     771             :           } else {
    +     772           0 :             measurement_t measurement;
    +     773           0 :             measurement(0) = msg->twist.twist.linear.x;
    +     774           0 :             measurement(1) = msg->twist.twist.linear.y;
    +     775           0 :             return measurement;
    +     776             :           }
    +     777             :           break;
    +     778             :         }
    +     779             : 
    +     780           0 :         default: {
    +     781           0 :           ROS_ERROR_THROTTLE(1.0, "[%s]: unhandled case in getCorrectionFromOdometry() switch", getPrintName().c_str());
    +     782           0 :           return {};
    +     783             :         }
    +     784             :       }
    +     785             :       break;
    +     786             :     }
    +     787             : 
    +     788             :     // handle altitude estimators
    +     789           0 :     case EstimatorType_t::ALTITUDE: {
    +     790             : 
    +     791           0 :       switch (state_id_) {
    +     792             : 
    +     793           0 :         case StateId_t::POSITION: {
    +     794           0 :           measurement_t measurement;
    +     795           0 :           measurement(0) = msg->pose.pose.position.z;
    +     796           0 :           return measurement;
    +     797             :           break;
    +     798             :         }
    +     799             : 
    +     800           0 :         case StateId_t::VELOCITY: {
    +     801           0 :           if (is_in_body_frame_) {
    +     802           0 :             std_msgs::Header header = msg->header;
    +     803           0 :             header.frame_id         = ch_->frames.ns_fcu;
    +     804           0 :             auto res                = getZVelUntilted(msg->twist.twist.linear, header);
    +     805           0 :             if (res) {
    +     806           0 :               measurement_t measurement;
    +     807           0 :               measurement = res.value();
    +     808           0 :               return measurement;
    +     809             :             } else {
    +     810           0 :               return {};
    +     811             :             }
    +     812             :           } else {
    +     813           0 :             measurement_t measurement;
    +     814           0 :             measurement(0) = msg->twist.twist.linear.z;
    +     815           0 :             return measurement;
    +     816             :           }
    +     817             :           break;
    +     818             :         }
    +     819             : 
    +     820           0 :         default: {
    +     821           0 :           ROS_ERROR_THROTTLE(1.0, "[%s]: unhandled case in getCorrectionFromOdometry() switch", getPrintName().c_str());
    +     822           0 :           return {};
    +     823             :         }
    +     824             :       }
    +     825             :       break;
    +     826             :     }
    +     827             : 
    +     828             :     // handle heading estimators
    +     829           0 :     case EstimatorType_t::HEADING: {
    +     830             : 
    +     831           0 :       switch (state_id_) {
    +     832             : 
    +     833           0 :         case StateId_t::POSITION: {
    +     834           0 :           measurement_t measurement;
    +     835             :           try {
    +     836             :             // obtain heading from orientation
    +     837           0 :             measurement(StateId_t::POSITION) = mrs_lib::AttitudeConverter(msg->pose.pose.orientation).getHeading();
    +     838             :             // unwrap heading wrt previous measurement
    +     839           0 :             if (got_first_hdg_measurement_) {
    +     840           0 :               measurement(StateId_t::POSITION) = mrs_lib::geometry::radians::unwrap(measurement(POSITION), prev_hdg_measurement_(POSITION));
    +     841             :             } else {
    +     842           0 :               got_first_hdg_measurement_ = true;
    +     843             :             }
    +     844           0 :             prev_hdg_measurement_ = measurement;
    +     845           0 :             return measurement;
    +     846             :           }
    +     847           0 :           catch (...) {
    +     848           0 :             ROS_ERROR_THROTTLE(1.0, "[%s]: failed to obtain heading", getPrintName().c_str());
    +     849           0 :             return {};
    +     850             :           }
    +     851             :           break;
    +     852             :         }
    +     853             : 
    +     854             :           /* case StateId_t::VELOCITY: { */
    +     855             :           /*   try { */
    +     856             :           /*     measurement_t measurement; */
    +     857             :           /*     measurement(0) = mrs_lib::AttitudeConverter(msg->pose.pose.orientation).getHeadingRate(msg->twist.twist.angular); */
    +     858             :           /*     return measurement; */
    +     859             :           /*   } */
    +     860             :           /*   catch (...) { */
    +     861             :           /*     ROS_ERROR_THROTTLE(1.0, "[%s]: Exception caught during getting heading rate (getCorrectionFromOdometry())", getPrintName().c_str()); */
    +     862             :           /*     return {}; */
    +     863             :           /*   } */
    +     864             :           /*   break; */
    +     865             :           /* } */
    +     866             : 
    +     867           0 :         default: {
    +     868           0 :           ROS_ERROR_THROTTLE(1.0, "[%s]: unhandled case in getCorrectionFromOdometry() switch", getPrintName().c_str());
    +     869           0 :           return {};
    +     870             :         }
    +     871             :       }
    +     872             :       break;
    +     873             :     }
    +     874             :   }
    +     875             : 
    +     876           0 :   ROS_ERROR("[%s]: FIXME: should not be possible to get into this part of code", getPrintName().c_str());
    +     877           0 :   return {};
    +     878             : }
    +     879             : /*//}*/
    +     880             : 
    +     881             : /*//{ callbackPoseStamped() */
    +     882             : template <int n_measurements>
    +     883           0 : void Correction<n_measurements>::callbackPoseStamped(const geometry_msgs::PoseStamped::ConstPtr msg) {
    +     884             : 
    +     885           0 :   if (!is_initialized_) {
    +     886           0 :     return;
    +     887             :   }
    +     888             : 
    +     889           0 :   auto res = getCorrectionFromPoseStamped(msg);
    +     890           0 :   if (res) {
    +     891           0 :     applyCorrection(res.value(), msg->header.stamp);
    +     892             :   }
    +     893             : }
    +     894             : /*//}*/
    +     895             : 
    +     896             : /*//{ getCorrectionFromPoseStamped() */
    +     897             : template <int n_measurements>
    +     898           0 : std::optional<typename Correction<n_measurements>::measurement_t> Correction<n_measurements>::getCorrectionFromPoseStamped(
    +     899             :     const geometry_msgs::PoseStampedConstPtr msg) {
    +     900             : 
    +     901           0 :   switch (est_type_) {
    +     902             : 
    +     903             :     // handle lateral estimators
    +     904           0 :     case EstimatorType_t::LATERAL: {
    +     905             : 
    +     906           0 :       switch (state_id_) {
    +     907             : 
    +     908           0 :         case StateId_t::POSITION: {
    +     909           0 :           measurement_t measurement;
    +     910           0 :           measurement(0) = msg->pose.position.x;
    +     911           0 :           measurement(1) = msg->pose.position.y;
    +     912           0 :           return measurement;
    +     913             :           break;
    +     914             :         }
    +     915             : 
    +     916           0 :         default: {
    +     917           0 :           ROS_ERROR_THROTTLE(1.0, "[%s]: unhandled case in getCorrectionFromPoseStamped() switch", getPrintName().c_str());
    +     918           0 :           return {};
    +     919             :         }
    +     920             :       }
    +     921             :       break;
    +     922             :     }
    +     923             : 
    +     924             :     // handle altitude estimators
    +     925           0 :     case EstimatorType_t::ALTITUDE: {
    +     926             : 
    +     927           0 :       switch (state_id_) {
    +     928             : 
    +     929           0 :         case StateId_t::POSITION: {
    +     930           0 :           measurement_t measurement;
    +     931           0 :           measurement(0) = msg->pose.position.z;
    +     932           0 :           return measurement;
    +     933             :           break;
    +     934             :         }
    +     935             : 
    +     936           0 :         default: {
    +     937           0 :           ROS_ERROR_THROTTLE(1.0, "[%s]: unhandled case in getCorrectionFromPoseStamped() switch", getPrintName().c_str());
    +     938           0 :           return {};
    +     939             :         }
    +     940             :       }
    +     941             :       break;
    +     942             :     }
    +     943             : 
    +     944             :     // handle heading estimators
    +     945           0 :     case EstimatorType_t::HEADING: {
    +     946             : 
    +     947           0 :       switch (state_id_) {
    +     948             : 
    +     949           0 :         case StateId_t::POSITION: {
    +     950           0 :           measurement_t measurement;
    +     951             :           try {
    +     952             :             // obtain heading from orientation
    +     953           0 :             measurement(StateId_t::POSITION) = mrs_lib::AttitudeConverter(msg->pose.orientation).getHeading();
    +     954             :             // unwrap heading wrt previous measurement
    +     955           0 :             if (got_first_hdg_measurement_) {
    +     956           0 :               measurement(StateId_t::POSITION) = mrs_lib::geometry::radians::unwrap(measurement(POSITION), prev_hdg_measurement_(POSITION));
    +     957             :             } else {
    +     958           0 :               got_first_hdg_measurement_ = true;
    +     959             :             }
    +     960           0 :             prev_hdg_measurement_ = measurement;
    +     961           0 :             return measurement;
    +     962             :           }
    +     963           0 :           catch (...) {
    +     964           0 :             ROS_ERROR_THROTTLE(1.0, "[%s]: failed to obtain heading", getPrintName().c_str());
    +     965           0 :             return {};
    +     966             :           }
    +     967             :           break;
    +     968             :         }
    +     969             : 
    +     970           0 :         default: {
    +     971           0 :           ROS_ERROR_THROTTLE(1.0, "[%s]: unhandled case in getCorrectionFromPoseStamped() switch", getPrintName().c_str());
    +     972           0 :           return {};
    +     973             :         }
    +     974             :       }
    +     975             :       break;
    +     976             :     }
    +     977             :   }
    +     978             : 
    +     979           0 :   ROS_ERROR("[%s]: FIXME: should not be possible to get into this part of code", getPrintName().c_str());
    +     980           0 :   return {};
    +     981             : }
    +     982             : /*//}*/
    +     983             : 
    +     984             : /*//{ callbackRange() */
    +     985             : template <int n_measurements>
    +     986      258327 : void Correction<n_measurements>::callbackRange(const sensor_msgs::Range::ConstPtr msg) {
    +     987             : 
    +     988      258327 :   if (!is_initialized_) {
    +     989           0 :     return;
    +     990             :   }
    +     991             : 
    +     992      256792 :   auto res = getCorrectionFromRange(msg);
    +     993      258673 :   if (res) {
    +     994      257598 :     applyCorrection(res.value(), msg->header.stamp);
    +     995             :   }
    +     996             : }
    +     997             : /*//}*/
    +     998             : 
    +     999             : /*//{ getCorrectionFromRange() */
    +    1000             : template <int n_measurements>
    +    1001      262328 : std::optional<typename Correction<n_measurements>::measurement_t> Correction<n_measurements>::getCorrectionFromRange(const sensor_msgs::RangeConstPtr msg) {
    +    1002             : 
    +    1003      262328 :   if (!range_enabled_) {
    +    1004           0 :     ROS_INFO_THROTTLE(1.0, "[%s]: fusing range corrections is disabled", getPrintName().c_str());
    +    1005           0 :     return {};
    +    1006             :   }
    +    1007             : 
    +    1008      262328 :   if (!std::isfinite(msg->range)) {
    +    1009           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: received value: %f. Not using this correction.", getPrintName().c_str(), msg->range);
    +    1010           0 :     return {};
    +    1011             :   }
    +    1012             : 
    +    1013      523578 :   geometry_msgs::PoseStamped range_point;
    +    1014             : 
    +    1015      262010 :   range_point.header           = msg->header;
    +    1016      262448 :   range_point.pose.position.x  = msg->range;
    +    1017      260058 :   range_point.pose.position.y  = 0;
    +    1018      260058 :   range_point.pose.position.z  = 0;
    +    1019      260058 :   range_point.pose.orientation = mrs_lib::AttitudeConverter(0, 0, 0);
    +    1020             : 
    +    1021      525558 :   auto res = ch_->transformer->transformSingle(range_point, ch_->frames.ns_fcu_untilted);
    +    1022             : 
    +    1023      263803 :   Correction::measurement_t measurement;
    +    1024             : 
    +    1025      263803 :   if (res) {
    +    1026      261440 :     measurement(0) = -res.value().pose.position.z;
    +    1027      261430 :     return measurement;
    +    1028             :   } else {
    +    1029        2364 :     ROS_ERROR_THROTTLE(1.0, "[%s]: Could not transform range measurement to %s. Not using this correction.", getPrintName().c_str(),
    +    1030             :                        ch_->frames.ns_fcu_untilted.c_str());
    +    1031        2364 :     return {};
    +    1032             :   }
    +    1033             : }
    +    1034             : /*//}*/
    +    1035             : 
    +    1036             : /*//{ callbackImu() */
    +    1037             : template <int n_measurements>
    +    1038           0 : void Correction<n_measurements>::callbackImu(const sensor_msgs::Imu::ConstPtr msg) {
    +    1039             : 
    +    1040           0 :   if (!is_initialized_) {
    +    1041           0 :     return;
    +    1042             :   }
    +    1043             : 
    +    1044           0 :   auto res = getCorrectionFromImu(msg);
    +    1045           0 :   if (res) {
    +    1046           0 :     applyCorrection(res.value(), msg->header.stamp);
    +    1047             :   } else {
    +    1048           0 :     ROS_WARN_THROTTLE(1.0, "[%s]: Could not obtain correction from Imu msg", getPrintName().c_str());
    +    1049             :   }
    +    1050             : }
    +    1051             : /*//}*/
    +    1052             : 
    +    1053             : /*//{ getCorrectionFromImu() */
    +    1054             : template <int n_measurements>
    +    1055           0 : std::optional<typename Correction<n_measurements>::measurement_t> Correction<n_measurements>::getCorrectionFromImu(
    +    1056             :     const sensor_msgs::ImuConstPtr msg) {
    +    1057             : 
    +    1058           0 :   switch (est_type_) {
    +    1059             : 
    +    1060             :     // handle lateral estimators
    +    1061           0 :     case EstimatorType_t::LATERAL: {
    +    1062             : 
    +    1063           0 :       switch (state_id_) {
    +    1064             : 
    +    1065           0 :         case StateId_t::ACCELERATION: {
    +    1066           0 :           if (is_in_body_frame_) {
    +    1067           0 :             auto res = getVecInFrame(msg->linear_acceleration, msg->header, ns_frame_id_ + "_att_only");
    +    1068           0 :             if (res) {
    +    1069           0 :               measurement_t measurement;
    +    1070           0 :               measurement = res.value();
    +    1071           0 :               return measurement;
    +    1072             :             } else {
    +    1073           0 :               ROS_WARN_THROTTLE(1.0, "[%s]: Could not obtain IMU acceleration in frame: %s", getPrintName().c_str(), (ns_frame_id_+"_att_only").c_str());
    +    1074           0 :               return {};
    +    1075             :             }
    +    1076             :           } else {
    +    1077           0 :             measurement_t measurement;
    +    1078           0 :             measurement(0) = msg->linear_acceleration.x;
    +    1079           0 :             measurement(1) = msg->linear_acceleration.y;
    +    1080           0 :             return measurement;
    +    1081             :           }
    +    1082             :           break;
    +    1083             :         }
    +    1084             : 
    +    1085           0 :         default: {
    +    1086           0 :           ROS_ERROR_THROTTLE(1.0, "[%s]: unhandled case in getCorrectionFromImu() switch", getPrintName().c_str());
    +    1087           0 :           return {};
    +    1088             :         }
    +    1089             :       }
    +    1090             :       break;
    +    1091             :     }
    +    1092             : 
    +    1093             :     // handle altitude estimators
    +    1094           0 :     case EstimatorType_t::ALTITUDE: {
    +    1095             : 
    +    1096           0 :       switch (state_id_) {
    +    1097             : 
    +    1098           0 :         case StateId_t::ACCELERATION: {
    +    1099           0 :           if (is_in_body_frame_) {
    +    1100           0 :             auto res = getZVelUntilted(msg->linear_acceleration, msg->header);
    +    1101           0 :             if (res) {
    +    1102           0 :               measurement_t measurement;
    +    1103           0 :               measurement = res.value();
    +    1104           0 :               measurement(0) -= gravity_norm_;
    +    1105           0 :               return measurement;
    +    1106             :             } else {
    +    1107           0 :               ROS_WARN_THROTTLE(1.0, "[%s]: Could not obtain IMU Z acceleration", getPrintName().c_str());
    +    1108           0 :               return {};
    +    1109             :             }
    +    1110             :           } else {
    +    1111           0 :             measurement_t measurement;
    +    1112           0 :             measurement(0) = msg->linear_acceleration.z - gravity_norm_;
    +    1113           0 :             return measurement;
    +    1114             :           }
    +    1115             :           break;
    +    1116             :         }
    +    1117             : 
    +    1118           0 :         default: {
    +    1119           0 :           ROS_ERROR_THROTTLE(1.0, "[%s]: unhandled case in getCorrectionFromImu() switch", getPrintName().c_str());
    +    1120           0 :           return {};
    +    1121             :         }
    +    1122             :       }
    +    1123             :       break;
    +    1124             :     }
    +    1125             : 
    +    1126             :     // handle heading estimators
    +    1127           0 :     case EstimatorType_t::HEADING: {
    +    1128             : 
    +    1129           0 :       ROS_ERROR_THROTTLE(1.0, "[%s]: EstimatorType_t::HEADING in getCorrectionFromImu() not implemented", getPrintName().c_str());
    +    1130           0 :       return {};
    +    1131             :       break;
    +    1132             :     }
    +    1133             :   }
    +    1134             : 
    +    1135           0 :   ROS_ERROR("[%s]: FIXME: should not be possible to get into this part of code", getPrintName().c_str());
    +    1136           0 :   return {};
    +    1137             : }
    +    1138             : /*//}*/
    +    1139             : 
    +    1140             : /*//{ callbackRtk() */
    +    1141             : template <int n_measurements>
    +    1142        7971 : void Correction<n_measurements>::callbackRtk(const mrs_msgs::RtkGps::ConstPtr msg) {
    +    1143             : 
    +    1144        7971 :   if (!is_initialized_) {
    +    1145           0 :     return;
    +    1146             :   }
    +    1147             : 
    +    1148        7962 :   auto res = getCorrectionFromRtk(msg);
    +    1149        7977 :   if (res) {
    +    1150        7969 :     applyCorrection(res.value(), msg->header.stamp);
    +    1151             :   }
    +    1152             : }
    +    1153             : /*//}*/
    +    1154             : 
    +    1155             : /*//{ getCorrectionFromRtk() */
    +    1156             : template <int n_measurements>
    +    1157        8063 : std::optional<typename Correction<n_measurements>::measurement_t> Correction<n_measurements>::getCorrectionFromRtk(const mrs_msgs::RtkGpsConstPtr msg) {
    +    1158             : 
    +    1159       16129 :   geometry_msgs::PoseStamped rtk_pos;
    +    1160             : 
    +    1161        8051 :   if (!std::isfinite(msg->gps.latitude)) {
    +    1162           0 :     ROS_ERROR_THROTTLE(1.0, "[%s] NaN detected in RTK variable \"msg->latitude\"!!!", getPrintName().c_str());
    +    1163           0 :     return {};
    +    1164             :   }
    +    1165             : 
    +    1166        8047 :   if (!std::isfinite(msg->gps.longitude)) {
    +    1167           0 :     ROS_ERROR_THROTTLE(1.0, "[%s] NaN detected in RTK variable \"msg->longitude\"!!!", getPrintName().c_str());
    +    1168           0 :     return {};
    +    1169             :   }
    +    1170             : 
    +    1171        8054 :   if (!std::isfinite(msg->gps.altitude)) {
    +    1172           0 :     ROS_ERROR_THROTTLE(1.0, "[%s] NaN detected in RTK variable \"msg->altitude\"!!!", getPrintName().c_str());
    +    1173           0 :     return {};
    +    1174             :   }
    +    1175             : 
    +    1176        8049 :   if (msg->fix_type.fix_type != mrs_msgs::RtkFixType::RTK_FIX) {
    +    1177           0 :     ROS_INFO_THROTTLE(1.0, "[%s] %s RTK FIX", getPrintName().c_str(), Support::waiting_for_string.c_str());
    +    1178           0 :     return {};
    +    1179             :   }
    +    1180             : 
    +    1181        8058 :   rtk_pos.header = msg->header;
    +    1182        8051 :   mrs_lib::UTM(msg->gps.latitude, msg->gps.longitude, &rtk_pos.pose.position.x, &rtk_pos.pose.position.y);
    +    1183        8026 :   rtk_pos.pose.position.z  = msg->gps.altitude;
    +    1184        8029 :   rtk_pos.pose.orientation = mrs_lib::AttitudeConverter(0, 0, 0);
    +    1185             : 
    +    1186        8049 :   rtk_pos.pose.position.x -= ch_->world_origin.x;
    +    1187        8053 :   rtk_pos.pose.position.y -= ch_->world_origin.y;
    +    1188             : 
    +    1189        8054 :   Correction::measurement_t measurement;
    +    1190             : 
    +    1191             :   // transform the RTK position from antenna to FCU
    +    1192        8051 :   auto res = transformRtkToFcu(rtk_pos);
    +    1193        8066 :   if (res) {
    +    1194        8065 :     rtk_pos.pose = res.value();
    +    1195             :   } else {
    +    1196           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: transform to fcu failed", getPrintName().c_str());
    +    1197           0 :     return {};
    +    1198             :   }
    +    1199             : 
    +    1200        8065 :   switch (est_type_) {
    +    1201             : 
    +    1202             :     // handle lateral estimators
    +    1203        5480 :     case EstimatorType_t::LATERAL: {
    +    1204             : 
    +    1205        5480 :       switch (state_id_) {
    +    1206             : 
    +    1207        5479 :         case StateId_t::POSITION: {
    +    1208        5479 :           measurement(0) = rtk_pos.pose.position.x;
    +    1209        5480 :           measurement(1) = rtk_pos.pose.position.y;
    +    1210        5479 :           return measurement;
    +    1211             :           break;
    +    1212             :         }
    +    1213             : 
    +    1214           1 :         default: {
    +    1215           1 :           ROS_ERROR_THROTTLE(1.0, "[%s]: unhandled case in getCorrectionFromRtk() switch", getPrintName().c_str());
    +    1216           0 :           return {};
    +    1217             :         }
    +    1218             :       }
    +    1219             :       break;
    +    1220             :     }
    +    1221             : 
    +    1222             :     // handle altitude estimators
    +    1223        2586 :     case EstimatorType_t::ALTITUDE: {
    +    1224             : 
    +    1225        2586 :       switch (state_id_) {
    +    1226             : 
    +    1227        2586 :         case StateId_t::POSITION: {
    +    1228        2586 :           measurement(0) = rtk_pos.pose.position.z;
    +    1229        2586 :           if (!got_avg_init_rtk_z_) {
    +    1230          22 :             getAvgRtkInitZ(measurement(0));
    +    1231          22 :             return {};
    +    1232             :           }
    +    1233        2564 :           measurement(0) -= rtk_init_z_avg_;
    +    1234        2564 :           return measurement;
    +    1235             :           break;
    +    1236             :         }
    +    1237             : 
    +    1238           0 :         default: {
    +    1239           0 :           ROS_ERROR_THROTTLE(1.0, "[%s]: unhandled case in getCorrectionFromRtk() switch", getPrintName().c_str());
    +    1240           0 :           return {};
    +    1241             :         }
    +    1242             :       }
    +    1243             :       break;
    +    1244             :     }
    +    1245             : 
    +    1246           0 :     case EstimatorType_t::HEADING: {
    +    1247           0 :       ROS_ERROR_THROTTLE(1.0, "[%s]: should not be possible to get into this branch of getCorrectionFromRtk() switch", getPrintName().c_str());
    +    1248           0 :       return {};
    +    1249             :       break;
    +    1250             :     }
    +    1251             :   }
    +    1252             : 
    +    1253           0 :   ROS_ERROR("[%s]: FIXME: should not be possible to get into this part of code", getPrintName().c_str());
    +    1254           0 :   return {};
    +    1255             : }
    +    1256             : /*//}*/
    +    1257             : 
    +    1258             : /*//{ callbackPoint() */
    +    1259             : template <int n_measurements>
    +    1260      180900 : void Correction<n_measurements>::callbackPoint(const geometry_msgs::PointStamped::ConstPtr msg) {
    +    1261             : 
    +    1262      180900 :   if (!is_initialized_) {
    +    1263           0 :     return;
    +    1264             :   }
    +    1265             : 
    +    1266      180748 :   auto res = getCorrectionFromPoint(msg);
    +    1267      180642 :   if (res) {
    +    1268      180754 :     applyCorrection(res.value(), msg->header.stamp);
    +    1269             :   }
    +    1270             : }
    +    1271             : /*//}*/
    +    1272             : 
    +    1273             : /*//{ getCorrectionFromPoint() */
    +    1274             : template <int n_measurements>
    +    1275      184629 : std::optional<typename Correction<n_measurements>::measurement_t> Correction<n_measurements>::getCorrectionFromPoint(
    +    1276             :     const geometry_msgs::PointStampedConstPtr msg) {
    +    1277             : 
    +    1278      184629 :   switch (est_type_) {
    +    1279             : 
    +    1280             :     // handle lateral estimators
    +    1281      184624 :     case EstimatorType_t::LATERAL: {
    +    1282             : 
    +    1283      184624 :       switch (state_id_) {
    +    1284             : 
    +    1285      184582 :         case StateId_t::POSITION: {
    +    1286      184582 :           measurement_t measurement;
    +    1287      184547 :           measurement(0) = msg->point.x;
    +    1288      184415 :           measurement(1) = msg->point.y;
    +    1289      184437 :           return measurement;
    +    1290             :           break;
    +    1291             :         }
    +    1292             : 
    +    1293          42 :         default: {
    +    1294          42 :           ROS_ERROR_THROTTLE(1.0, "[%s]: unhandled case in getCorrectionFromOdometry() switch", getPrintName().c_str());
    +    1295           0 :           return {};
    +    1296             :         }
    +    1297             :       }
    +    1298             :       break;
    +    1299             :     }
    +    1300             : 
    +    1301             :     // handle altitude estimators
    +    1302           0 :     case EstimatorType_t::ALTITUDE: {
    +    1303             : 
    +    1304           0 :       switch (state_id_) {
    +    1305             : 
    +    1306           0 :         case StateId_t::POSITION: {
    +    1307           0 :           measurement_t measurement;
    +    1308           0 :           measurement(0) = msg->point.z;
    +    1309           0 :           return measurement;
    +    1310             :           break;
    +    1311             :         }
    +    1312             : 
    +    1313           0 :         default: {
    +    1314           0 :           ROS_ERROR_THROTTLE(1.0, "[%s]: unhandled case in getCorrectionFromOdometry() switch", getPrintName().c_str());
    +    1315           0 :           return {};
    +    1316             :         }
    +    1317             :       }
    +    1318             :       break;
    +    1319             :     }
    +    1320             : 
    +    1321           5 :     default: {
    +    1322           5 :       ROS_ERROR_THROTTLE(1.0, "[%s]: unhandled case in getCorrectionFromOdometry() switch", getPrintName().c_str());
    +    1323           0 :       return {};
    +    1324             :     }
    +    1325             :   }
    +    1326             : 
    +    1327             : 
    +    1328             :   ROS_ERROR("[%s]: FIXME: should not be possible to get into this part of code", getPrintName().c_str());
    +    1329             :   return {};
    +    1330             : }
    +    1331             : /*//}*/
    +    1332             : 
    +    1333             : /*//{ callbackVector() */
    +    1334             : template <int n_measurements>
    +    1335      199362 : void Correction<n_measurements>::callbackVector(const geometry_msgs::Vector3Stamped::ConstPtr msg) {
    +    1336             : 
    +    1337      199362 :   if (!is_initialized_) {
    +    1338           0 :     return;
    +    1339             :   }
    +    1340             : 
    +    1341      199225 :   auto res = getCorrectionFromVector(msg);
    +    1342      199422 :   if (res) {
    +    1343      199398 :     applyCorrection(res.value(), msg->header.stamp);
    +    1344             :   } else {
    +    1345          24 :     ROS_WARN_THROTTLE(1.0, "[%s]: Could not obtain correction from Vector3Stamped msg", getPrintName().c_str());
    +    1346             :   }
    +    1347             : }
    +    1348             : /*//}*/
    +    1349             : 
    +    1350             : /*//{ getCorrectionFromVector() */
    +    1351             : template <int n_measurements>
    +    1352      199486 : std::optional<typename Correction<n_measurements>::measurement_t> Correction<n_measurements>::getCorrectionFromVector(
    +    1353             :     const geometry_msgs::Vector3StampedConstPtr msg) {
    +    1354             : 
    +    1355      199486 :   switch (est_type_) {
    +    1356             : 
    +    1357             :     // handle lateral estimators
    +    1358       10740 :     case EstimatorType_t::LATERAL: {
    +    1359             : 
    +    1360       10740 :       switch (state_id_) {
    +    1361             : 
    +    1362       10741 :         case StateId_t::VELOCITY: {
    +    1363       10741 :           auto res = getVecInFrame(msg->vector, msg->header, ns_frame_id_ + "_att_only");
    +    1364       10745 :           if (res) {
    +    1365       10707 :             measurement_t measurement;
    +    1366       10706 :             measurement = res.value();
    +    1367       10707 :             return measurement;
    +    1368             :           } else {
    +    1369          38 :             return {};
    +    1370             :           }
    +    1371             :           break;
    +    1372             :         }
    +    1373             : 
    +    1374           0 :         default: {
    +    1375           0 :           ROS_ERROR_THROTTLE(1.0, "[%s]: unhandled case in getCorrectionFromVector() switch", getPrintName().c_str());
    +    1376           0 :           return {};
    +    1377             :         }
    +    1378             :       }
    +    1379             :       break;
    +    1380             :     }
    +    1381             : 
    +    1382             :     // handle altitude estimators
    +    1383      188682 :     case EstimatorType_t::ALTITUDE: {
    +    1384             : 
    +    1385      188682 :       switch (state_id_) {
    +    1386             : 
    +    1387      188530 :         case StateId_t::VELOCITY: {
    +    1388      188530 :           auto res = getZVelUntilted(msg->vector, msg->header);
    +    1389      188802 :           if (res) {
    +    1390      188793 :             measurement_t measurement;
    +    1391      188792 :             measurement = res.value();
    +    1392      188793 :             return measurement;
    +    1393             :           } else {
    +    1394           7 :             ROS_WARN_THROTTLE(1.0, "[%s]: Could not obtain untilted Z velocity", getPrintName().c_str());
    +    1395           7 :             return {};
    +    1396             :           }
    +    1397             :           break;
    +    1398             :         }
    +    1399             : 
    +    1400         152 :         default: {
    +    1401         152 :           ROS_ERROR_THROTTLE(1.0, "[%s]: unhandled case in getCorrectionFromVector() switch", getPrintName().c_str());
    +    1402           0 :           return {};
    +    1403             :         }
    +    1404             :       }
    +    1405             :       break;
    +    1406             :     }
    +    1407             : 
    +    1408             :     // handle heading estimators
    +    1409           0 :     case EstimatorType_t::HEADING: {
    +    1410             : 
    +    1411           0 :       switch (state_id_) {
    +    1412             : 
    +    1413           0 :         case StateId_t::VELOCITY: {
    +    1414             :           try {
    +    1415           0 :             if (!sh_orientation_.hasMsg()) {
    +    1416           0 :               ROS_INFO_THROTTLE(1.0, "[%s]: %s orientation on topic: %s", getPrintName().c_str(), Support::waiting_for_string.c_str(),
    +    1417             :                                 orientation_topic_.c_str());
    +    1418           0 :               return {};
    +    1419             :             }
    +    1420           0 :             measurement_t measurement;
    +    1421           0 :             measurement(0) = mrs_lib::AttitudeConverter(sh_orientation_.getMsg()->quaternion).getHeadingRate(msg->vector);
    +    1422           0 :             return measurement;
    +    1423             :           }
    +    1424           0 :           catch (...) {
    +    1425           0 :             ROS_ERROR_THROTTLE(1.0, "[%s]: Exception caught during getting heading rate (getCorrectionFromVector())", getPrintName().c_str());
    +    1426           0 :             return {};
    +    1427             :           }
    +    1428             :           break;
    +    1429             :         }
    +    1430             : 
    +    1431           0 :         default: {
    +    1432           0 :           ROS_ERROR_THROTTLE(1.0, "[%s]: unhandled case in getCorrectionFromVector() switch", getPrintName().c_str());
    +    1433           0 :           return {};
    +    1434             :         }
    +    1435             :       }
    +    1436             :       break;
    +    1437             :     }
    +    1438             :   }
    +    1439             : 
    +    1440          64 :   ROS_ERROR("[%s]: FIXME: should not be possible to get into this part of code", getPrintName().c_str());
    +    1441           0 :   return {};
    +    1442             : }
    +    1443             : /*//}*/
    +    1444             : 
    +    1445             : /*//{ getCorrectionFromQuat() */
    +    1446             : template <int n_measurements>
    +    1447           0 : std::optional<typename Correction<n_measurements>::measurement_t> Correction<n_measurements>::getCorrectionFromQuat([
    +    1448             :     [maybe_unused]] const geometry_msgs::QuaternionStampedConstPtr msg) {
    +    1449             : 
    +    1450           0 :   switch (est_type_) {
    +    1451             : 
    +    1452             :       // handle lateral estimators
    +    1453             :       /* case EstimatorType_t::LATERAL: { */
    +    1454             : 
    +    1455             :       /*   default: { */
    +    1456             :       /*     ROS_ERROR_THROTTLE(1.0, "[%s]: unhandled case in getCorrectionFromOdometry() switch", getPrintName().c_str()); */
    +    1457             :       /*     return {}; */
    +    1458             :       /*   } break; */
    +    1459             :       /* } */
    +    1460             : 
    +    1461             :       /* // handle altitude estimators */
    +    1462             :       /* case EstimatorType_t::ALTITUDE: { */
    +    1463             : 
    +    1464             :       /* default: { */
    +    1465             :       /*     ROS_ERROR_THROTTLE(1.0, "[%s]: unhandled case in getCorrectionFromOdometry() switch", getPrintName().c_str()); */
    +    1466             :       /*     return {}; */
    +    1467             :       /*   } break; */
    +    1468             :       /* } */
    +    1469             : 
    +    1470             :       /* // handle heading estimators */
    +    1471             :       /* case EstimatorType_t::HEADING: { */
    +    1472             : 
    +    1473             :       /*   switch (state_id_) { */
    +    1474             : 
    +    1475             :       /*     /1* default: { *1/ */
    +    1476             :       /*       ROS_ERROR_THROTTLE(1.0, "[%s]: unhandled case in getCorrectionFromOdometry() switch", getPrintName().c_str()); */
    +    1477             :       /*       return {}; */
    +    1478             :       /*     } */
    +    1479             :       /*   } */
    +    1480             :     default: {
    +    1481           0 :       ROS_ERROR_THROTTLE(1.0, "[%s]: unhandled case in getCorrectionFromOdometry() switch", getPrintName().c_str());
    +    1482           0 :       return {};
    +    1483             :     }
    +    1484             :   }
    +    1485             : 
    +    1486             :   ROS_ERROR("[%s]: FIXME: should not be possible to get into this part of code", getPrintName().c_str());
    +    1487             :   return {};
    +    1488             : }
    +    1489             : /*//}*/
    +    1490             : 
    +    1491             : /*//{ applyCorrection() */
    +    1492             : template <int n_measurements>
    +    1493      645852 : void Correction<n_measurements>::applyCorrection(const measurement_t& meas, const ros::Time& stamp) {
    +    1494             : 
    +    1495             :   {
    +    1496      645852 :     std::scoped_lock lock(mtx_msg_time_);
    +    1497      645657 :     if (first_timestamp_) {
    +    1498         342 :       prev_msg_time_   = stamp - ros::Duration(0.01);
    +    1499         343 :       msg_time_        = stamp;
    +    1500         343 :       healthy_time_    = ros::Time(0);
    +    1501         344 :       first_timestamp_ = false;
    +    1502             :     }
    +    1503             : 
    +    1504      645502 :     prev_msg_time_ = msg_time_;
    +    1505      645502 :     msg_time_      = stamp;
    +    1506      645502 :     healthy_time_ += msg_time_ - prev_msg_time_;
    +    1507             :   }
    +    1508             : 
    +    1509      645574 :   MeasurementStamped meas_stamped;
    +    1510      645573 :   meas_stamped.value = meas;
    +    1511      645715 :   meas_stamped.stamp = stamp;
    +    1512      645715 :   publishCorrection(meas_stamped, ph_correction_raw_);
    +    1513      645899 :   if (process(meas_stamped.value)) {
    +    1514      638280 :     publishCorrection(meas_stamped, ph_correction_proc_);
    +    1515      638392 :     fun_apply_correction_(meas_stamped, getR(), getStateId());
    +    1516             :   }
    +    1517      645065 : }
    +    1518             : /*//}*/
    +    1519             : 
    +    1520             : /* //{ callbackToggleRange() */
    +    1521             : template <int n_measurements>
    +    1522           0 : bool Correction<n_measurements>::callbackToggleRange(std_srvs::SetBool::Request& req, std_srvs::SetBool::Response& res) {
    +    1523             : 
    +    1524           0 :   if (!is_initialized_) {
    +    1525           0 :     return false;
    +    1526             :   }
    +    1527             : 
    +    1528           0 :   if (!range_enabled_ && req.data) {
    +    1529           0 :     processors_["saturate"]->toggle(true);
    +    1530             :   }
    +    1531             : 
    +    1532           0 :   range_enabled_ = req.data;
    +    1533             : 
    +    1534             :   // after enabling range we want to start correcting the altitude slowly
    +    1535             : 
    +    1536           0 :   res.success = true;
    +    1537           0 :   res.message = (range_enabled_ ? "Range enabled" : "Range disabled");
    +    1538             : 
    +    1539           0 :   if (range_enabled_) {
    +    1540             : 
    +    1541           0 :     ROS_INFO("[%s]: Range enabled.", getPrintName().c_str());
    +    1542             : 
    +    1543             :   } else {
    +    1544             : 
    +    1545           0 :     ROS_INFO("[%s]: Range disabled", getPrintName().c_str());
    +    1546             :   }
    +    1547             : 
    +    1548           0 :   return true;
    +    1549             : }
    +    1550             : 
    +    1551             : //}
    +    1552             : 
    +    1553             : /*//{ getZVelUntilted() */
    +    1554             : template <int n_measurements>
    +    1555      188760 : std::optional<typename Correction<n_measurements>::measurement_t> Correction<n_measurements>::getZVelUntilted(const geometry_msgs::Vector3& msg,
    +    1556             :                                                                                                               const std_msgs::Header&       header) {
    +    1557             : 
    +    1558             :   // untilt the desired vector
    +    1559      377562 :   geometry_msgs::PointStamped vel;
    +    1560      188629 :   vel.point.x = msg.x;
    +    1561      188629 :   vel.point.y = msg.y;
    +    1562      188629 :   vel.point.z = msg.z;
    +    1563      188629 :   vel.header  = header;
    +    1564             :   /* vel.header.frame_id = ch_->frames.ns_fcu; */
    +    1565      188734 :   vel.header.stamp = header.stamp;
    +    1566             : 
    +    1567      377533 :   auto res = ch_->transformer->transformSingle(vel, ch_->frames.ns_fcu_untilted);
    +    1568      188802 :   if (res) {
    +    1569      188795 :     measurement_t measurement;
    +    1570      188795 :     measurement(0) = res.value().point.z;
    +    1571      188795 :     return measurement;
    +    1572             :   } else {
    +    1573           7 :     ROS_WARN_THROTTLE(1.0, "[%s]: Transform from %s to %s failed", getPrintName().c_str(), vel.header.frame_id.c_str(), ch_->frames.ns_fcu_untilted.c_str());
    +    1574           7 :     return {};
    +    1575             :   }
    +    1576             : }
    +    1577             : /*//}*/
    +    1578             : 
    +    1579             : /*//{ getVecInFrame() */
    +    1580             : template <int n_measurements>
    +    1581       10745 : std::optional<typename Correction<n_measurements>::measurement_t> Correction<n_measurements>::getVecInFrame(const geometry_msgs::Vector3& vec_in,
    +    1582             :                                                                                                             const std_msgs::Header&       source_header,
    +    1583             :                                                                                                             const std::string             target_frame) {
    +    1584             : 
    +    1585       10745 :   measurement_t measurement;
    +    1586             : 
    +    1587       21478 :   geometry_msgs::Vector3Stamped vec;
    +    1588       10742 :   vec.header = source_header;
    +    1589       10738 :   vec.vector = vec_in;
    +    1590             : 
    +    1591       21482 :   geometry_msgs::Vector3Stamped transformed_vel;
    +    1592       21476 :   auto                          res = ch_->transformer->transformSingle(vec, target_frame);
    +    1593       10745 :   if (res) {
    +    1594       10707 :     transformed_vel = res.value();
    +    1595       10707 :     measurement(0)  = transformed_vel.vector.x;
    +    1596       10707 :     measurement(1)  = transformed_vel.vector.y;
    +    1597       10707 :     return measurement;
    +    1598             :   } else {
    +    1599          38 :     ROS_WARN_THROTTLE(1.0, "[%s]: Transform of velocity from %s to %s failed.", getPrintName().c_str(), vec.header.frame_id.c_str(), target_frame.c_str());
    +    1600          38 :     return {};
    +    1601             :   }
    +    1602             : }
    +    1603             : /*//}*/
    +    1604             : 
    +    1605             : /*//{ transformRtkToFcu() */
    +    1606             : template <int n_measurements>
    +    1607        8064 : std::optional<geometry_msgs::Pose> Correction<n_measurements>::transformRtkToFcu(const geometry_msgs::PoseStamped& pose_in) const {
    +    1608             : 
    +    1609       16130 :   geometry_msgs::PoseStamped pose_tmp = pose_in;
    +    1610             : 
    +    1611             :   // inject current orientation into rtk pose
    +    1612       16118 :   auto res1 = ch_->transformer->getTransform(ch_->frames.ns_fcu_untilted, ch_->frames.ns_fcu, ros::Time::now());
    +    1613        8066 :   if (res1) {
    +    1614        8066 :     pose_tmp.pose.orientation = res1.value().transform.rotation;
    +    1615             :   } else {
    +    1616           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: Could not obtain transform from %s to %s. Not using this correction.", getPrintName().c_str(),
    +    1617             :                        ch_->frames.ns_fcu_untilted.c_str(), ch_->frames.ns_fcu.c_str());
    +    1618           0 :     return {};
    +    1619             :   }
    +    1620             : 
    +    1621             :   // invert tf
    +    1622        8066 :   tf2::Transform             tf_utm_to_antenna = Support::tf2FromPose(pose_tmp.pose);
    +    1623       16132 :   geometry_msgs::PoseStamped utm_in_antenna;
    +    1624        8066 :   utm_in_antenna.pose            = Support::poseFromTf2(tf_utm_to_antenna.inverse());
    +    1625        8066 :   utm_in_antenna.header.stamp    = pose_in.header.stamp;
    +    1626        8066 :   utm_in_antenna.header.frame_id = ch_->frames.ns_rtk_antenna;
    +    1627             : 
    +    1628             :   // transform to fcu
    +    1629       16132 :   geometry_msgs::PoseStamped utm_in_fcu;
    +    1630        8066 :   utm_in_fcu.header.frame_id = ch_->frames.ns_fcu;
    +    1631        8066 :   utm_in_fcu.header.stamp    = pose_in.header.stamp;
    +    1632       16132 :   auto res2                  = ch_->transformer->transformSingle(utm_in_antenna, ch_->frames.ns_fcu);
    +    1633             : 
    +    1634        8066 :   if (res2) {
    +    1635        8066 :     utm_in_fcu = res2.value();
    +    1636             :   } else {
    +    1637           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: Could not transform pose to %s. Not using this correction.", getPrintName().c_str(), ch_->frames.ns_fcu.c_str());
    +    1638           0 :     return {};
    +    1639             :   }
    +    1640             : 
    +    1641             :   // invert tf
    +    1642        8066 :   tf2::Transform      tf_fcu_to_utm = Support::tf2FromPose(utm_in_fcu.pose);
    +    1643        8066 :   geometry_msgs::Pose fcu_in_utm    = Support::poseFromTf2(tf_fcu_to_utm.inverse());
    +    1644             : 
    +    1645        8066 :   return fcu_in_utm;
    +    1646             : }
    +    1647             : /*//}*/
    +    1648             : 
    +    1649             : /*//{ getAvgRtkInitZ() */
    +    1650             : template <int n_measurements>
    +    1651          22 : void Correction<n_measurements>::getAvgRtkInitZ(const double rtk_z) {
    +    1652             : 
    +    1653          22 :   if (!got_avg_init_rtk_z_) {
    +    1654             : 
    +    1655          22 :     double rtk_avg = rtk_init_z_avg_ / got_rtk_counter_;
    +    1656             : 
    +    1657          22 :     if (got_rtk_counter_ < 10 || (got_rtk_counter_ < 300 && std::fabs(rtk_z - rtk_avg) > 0.1)) {
    +    1658             : 
    +    1659          20 :       rtk_init_z_avg_ += rtk_z;
    +    1660          20 :       got_rtk_counter_++;
    +    1661          20 :       rtk_avg = rtk_init_z_avg_ / got_rtk_counter_;
    +    1662          20 :       ROS_INFO("[%s]: RTK ASL altitude sample #%d: %.2f; avg: %.2f", getPrintName().c_str(), got_rtk_counter_, rtk_z, rtk_avg);
    +    1663          20 :       return;
    +    1664             : 
    +    1665             :     } else {
    +    1666             : 
    +    1667           2 :       rtk_init_z_avg_     = rtk_avg;
    +    1668           2 :       got_avg_init_rtk_z_ = true;
    +    1669           2 :       ROS_INFO("[%s]: RTK ASL altitude avg: %f", getPrintName().c_str(), rtk_avg);
    +    1670             :     }
    +    1671             :   }
    +    1672             : }
    +    1673             : /*//}*/
    +    1674             : 
    +    1675             : /*//{ checkMsgDelay() */
    +    1676             : template <int n_measurements>
    +    1677             : void Correction<n_measurements>::checkMsgDelay(const ros::Time& msg_time) {
    +    1678             : 
    +    1679             :   const double delay = (ros::Time::now() - msg_time).toSec();
    +    1680             :   if (delay > msg_delay_warn_limit_) {
    +    1681             :     if (delay > msg_delay_limit_) {
    +    1682             :       ROS_ERROR_THROTTLE(1.0, "[%s]: message too delayed (%.4f s)", getPrintName().c_str(), delay);
    +    1683             :       is_delay_ok_ = false;
    +    1684             :     } else {
    +    1685             :       ROS_WARN_THROTTLE(5.0, "[%s]: message delayed (%.4f s)", getPrintName().c_str(), delay);
    +    1686             :       is_delay_ok_ = true;
    +    1687             :     }
    +    1688             :   } else {
    +    1689             :     is_delay_ok_ = true;
    +    1690             :   }
    +    1691             :   publishDelay(delay);
    +    1692             : }
    +    1693             : /*//}*/
    +    1694             : 
    +    1695             : /*//{ isTimestampOk() */
    +    1696             : template <int n_measurements>
    +    1697             : bool Correction<n_measurements>::isTimestampOk() {
    +    1698             : 
    +    1699             :   if (first_timestamp_) {
    +    1700             :     return true;
    +    1701             :   }
    +    1702             : 
    +    1703             :   ros::Time msg_time, prev_msg_time;
    +    1704             :   {
    +    1705             :     std::scoped_lock lock(mtx_msg_time_);
    +    1706             :     msg_time      = msg_time_;
    +    1707             :     prev_msg_time = prev_msg_time_;
    +    1708             :   }
    +    1709             :   const double delta = msg_time.toSec() - prev_msg_time.toSec();
    +    1710             : 
    +    1711             :   if (msg_time.toSec() <= 0.0) {
    +    1712             :     ROS_ERROR_THROTTLE(1.0, "[%s]: current timestamp non-positive: %f", getPrintName().c_str(), msg_time.toSec());
    +    1713             :     return false;
    +    1714             :   }
    +    1715             : 
    +    1716             :   if (delta <= 0.0) {
    +    1717             :     ROS_WARN_THROTTLE(1.0, "[%s]: time delta non-positive: %f", getPrintName().c_str(), delta);
    +    1718             :     return true;
    +    1719             :   }
    +    1720             : 
    +    1721             :   if (delta < 0.001) {
    +    1722             :     ROS_WARN_THROTTLE(1.0, "[%s]: time delta too small: %f", getPrintName().c_str(), delta);
    +    1723             :     return true;
    +    1724             :   }
    +    1725             : 
    +    1726             :   if (delta > time_since_last_msg_limit_) {
    +    1727             :     ROS_ERROR_THROTTLE(1.0, "[%s]: time since last msg too long %f > %f", getPrintName().c_str(), delta, time_since_last_msg_limit_);
    +    1728             :     return false;
    +    1729             :   }
    +    1730             : 
    +    1731             :   return true;
    +    1732             : }  // namespace mrs_uav_state_estimators
    +    1733             : /*//}*/
    +    1734             : 
    +    1735             : /*//{ isMsgComing() */
    +    1736             : template <int n_measurements>
    +    1737      675566 : bool Correction<n_measurements>::isMsgComing() {
    +    1738             : 
    +    1739      675566 :   const ros::Time msg_time = mrs_lib::get_mutexed(mtx_msg_time_, msg_time_);
    +    1740      675331 :   const double    delta    = ros::Time::now().toSec() - msg_time.toSec();
    +    1741             : 
    +    1742      675377 :   if (msg_time.toSec() <= 0.0) {
    +    1743           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: current timestamp non-positive: %f", getPrintName().c_str(), msg_time.toSec());
    +    1744           0 :     return false;
    +    1745             :   }
    +    1746             : 
    +    1747      675367 :   if (delta > time_since_last_msg_limit_) {
    +    1748           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: time since last msg too long %f > %f", getPrintName().c_str(), delta, time_since_last_msg_limit_);
    +    1749           0 :     return false;
    +    1750             :   }
    +    1751             : 
    +    1752      675367 :   return true;
    +    1753             : }  // namespace mrs_uav_state_estimators
    +    1754             : /*//}*/
    +    1755             : 
    +    1756             : /*//{ createProcessorFromName() */
    +    1757             : template <int n_measurements>
    +    1758         327 : std::shared_ptr<Processor<n_measurements>> Correction<n_measurements>::createProcessorFromName(const std::string& name, ros::NodeHandle& nh) {
    +    1759             : 
    +    1760         327 :   if (name == "median_filter") {
    +    1761          76 :     return std::make_shared<ProcMedianFilter<n_measurements>>(nh, getNamespacedName(), name, ch_, ph_);
    +    1762         251 :   } else if (name == "saturate") {
    +    1763          82 :     return std::make_shared<ProcSaturate<n_measurements>>(nh, getNamespacedName(), name, ch_, ph_, state_id_, fun_get_state_);
    +    1764         169 :   } else if (name == "excessive_tilt") {
    +    1765          76 :     return std::make_shared<ProcExcessiveTilt<n_measurements>>(nh, getNamespacedName(), name, ch_, ph_);
    +    1766          93 :   } else if (name == "tf_to_world") {
    +    1767          93 :     return std::make_shared<ProcTfToWorld<n_measurements>>(nh, getNamespacedName(), name, ch_, ph_);
    +    1768             :   } else {
    +    1769           0 :     ROS_ERROR("[%s]: requested invalid processor %s", getPrintName().c_str(), name.c_str());
    +    1770           0 :     ros::shutdown();
    +    1771             :   }
    +    1772           0 :   return std::shared_ptr<Processor<n_measurements>>(nullptr);
    +    1773             : }
    +    1774             : /*//}*/
    +    1775             : 
    +    1776             : /*//{ process() */
    +    1777             : template <int n_measurements>
    +    1778      653621 : bool Correction<n_measurements>::process(Correction<n_measurements>::measurement_t& measurement) {
    +    1779             : 
    +    1780      653621 :   bool ok_flag   = true;
    +    1781      653621 :   bool fuse_flag = true;
    +    1782             : 
    +    1783     1262527 :   for (auto proc_name :
    +    1784             :        processor_names_) {  // need to access the processors in the specific order from the config (e.g. median filter should go before saturation etc.)
    +    1785             :     /* bool is_ok, should_fuse; */
    +    1786      609058 :     auto [is_ok, should_fuse] = processors_[proc_name]->process(measurement);
    +    1787      608774 :     ok_flag &= is_ok;
    +    1788      608774 :     fuse_flag &= should_fuse;
    +    1789             :   }
    +    1790      653471 :   if (fuse_flag) {
    +    1791      638655 :     if (!ok_flag) {
    +    1792         312 :       setR(default_R_ * R_coeff_);
    +    1793         312 :       ROS_INFO_THROTTLE(1.0, "[%s]: set R to %.4f", getPrintName().c_str(), default_R_ * R_coeff_);
    +    1794         312 :       return true;
    +    1795             :     } else {
    +    1796      638343 :       setR(default_R_);
    +    1797      638288 :       return true;
    +    1798             :     }
    +    1799             :   }
    +    1800       14816 :   return false;
    +    1801             : }
    +    1802             : /*//}*/
    +    1803             : 
    +    1804             : /*//{ resetProcessors() */
    +    1805             : template <int n_measurements>
    +    1806           0 : void Correction<n_measurements>::resetProcessors() {
    +    1807             : 
    +    1808           0 :   for (auto proc_name :
    +    1809             :        processor_names_) {  // need to access the processors in the specific order from the config (e.g. median filter should go before saturation etc.)
    +    1810             :     /* bool is_ok, should_fuse; */
    +    1811           0 :     processors_[proc_name]->reset();
    +    1812             :   }
    +    1813           0 : }
    +    1814             : /*//}*/
    +    1815             : 
    +    1816             : /*//{ publishCorrection() */
    +    1817             : template <int n_measurements>
    +    1818     1292205 : void Correction<n_measurements>::publishCorrection(const MeasurementStamped&                                 measurement_stamped,
    +    1819             :                                                    mrs_lib::PublisherHandler<mrs_msgs::EstimatorCorrection>& ph_corr) {
    +    1820             : 
    +    1821     1292205 :   if (!ch_->debug_topics.correction) {
    +    1822           0 :     return;
    +    1823             :   }
    +    1824             : 
    +    1825     2584212 :   mrs_msgs::EstimatorCorrection msg;
    +    1826     1291549 :   msg.header.stamp    = measurement_stamped.stamp;
    +    1827     1291549 :   msg.header.frame_id = ns_frame_id_;
    +    1828     1292058 :   msg.name            = name_;
    +    1829     1292040 :   msg.estimator_name  = est_name_;
    +    1830     1292105 :   msg.state_id        = state_id_;
    +    1831     1292105 :   msg.covariance.resize(n_measurements * n_measurements);
    +    1832     2976927 :   for (int i = 0; i < measurement_stamped.value.rows(); i++) {
    +    1833     1685163 :     msg.state.push_back(measurement_stamped.value(i));
    +    1834     1685936 :     msg.covariance[n_measurements * i + i] = getR();
    +    1835             :   }
    +    1836             : 
    +    1837     1291433 :   ph_corr.publish(msg);
    +    1838             : }
    +    1839             : /*//}*/
    +    1840             : 
    +    1841             : /*//{ publishDelay() */
    +    1842             : template <int n_measurements>
    +    1843             : void Correction<n_measurements>::publishDelay(const double delay) {
    +    1844             : 
    +    1845             :   if (!ch_->debug_topics.corr_delay) {
    +    1846             :     return;
    +    1847             :   }
    +    1848             : 
    +    1849             :   mrs_msgs::Float64Stamped msg;
    +    1850             :   msg.header.stamp    = ros::Time::now();
    +    1851             :   msg.header.frame_id = ns_frame_id_;
    +    1852             :   msg.value           = delay;
    +    1853             : 
    +    1854             :   ph_delay_.publish(msg);
    +    1855             : }
    +    1856             : /*//}*/
    +    1857             : 
    +    1858             : }  // namespace mrs_uav_state_estimators
    +    1859             : 
    +    1860             : #endif  // ESTIMATORS_CORRECTION_H
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/correction.h.gcov.overview.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/correction.h.gcov.overview.html new file mode 100644 index 0000000000..80ee0bd932 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/correction.h.gcov.overview.html @@ -0,0 +1,485 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/correction.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/correction.h.gcov.png b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/correction.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..d3cbb2a8911ba2a525790868c24d87900c71fbe2 GIT binary patch literal 5392 zcmV+r74PbaP)Wam0000OP)t-s|NsB0 zs;a7|?_FK${{R500003000620&P%hU00009a7bBm000ie000ie0hKEb8vpYh` zwthdLxh-fqhiyNy9Ajwh0cp;2Kvq5kM!NSB(1MZcwhE)UVT@H>Ga@>gMgiScX7&b5QV)0lGc}gq4MZGm3D5y`cHDa3$?~Cf1UCfOTL4!!Sim|GD{K#; z<4&(SDBXLuXu{Un`@>zwxg>tO&WQIGW0lxd;LKecTh++Gf$5|CJO5t?)uJN}QxA1D z0+w(AtglqG^d&`?u+?b!x7d)Mqq%;UDvU|zdk=stjt+c9)Siy}U^9)_oe;W)eakz|ZDB--M&!-N zm|Ken*(#YUqj(z9NKaST@MrZy*zK1iVVM{j@!K6wV}|?Aij?ZZM7jpJtc(_s;I9Jt z2j}OWob|3CU&qKdlt-`u_5xt}mC{|Gp4F$+pYYHPFJFv0Uy3UyG6xS69Z>Nvu zJER#X0DHyyc|d@8A9Vnu#S(Zxl@|c0W3){SKWsY7E2?DQ_<0PNS;6+l1hC??$av(+ z$owV%cIa&$5X0?S6*}^D6~)wK5q1P2je1!3z@D9)Y}$Gz)=FZ0LH3UQn8eltN;C z9E%lV3cVkok4ZdHIv@`Y*6Sh3prkPH_P~Zz97j^%G@!8oW`Nt#G0YTN$kG^vK2ge@ zG2;QfL=>)}g=PUKkC8R@dDkl7WMyVWTCO5#x*FSx(P@pm+N{>>1^w0;3syZ3q( zmJgc9bwPTni;>4@GmsgL9EFKSk;p%x@%Obv;{$G`IJXSU8M-&L1MwIwlgqd)WJSR=0ZdLy?ebf!9W=BsqqyZ-W^Lr%V zw;x5LG@m&d1EFZ1*L8iw36ZV?6_xi;(!T!akP}C3rQB~Irt;u+NKg=AWYW8@sBPe7 z5|96Feu_GIz@Dp8j)ZF;YYnj+Ra*hKDcpJ)ECs+N0$TSoW*Xhd2rHM@_9I4S5qKAJ z2|?ybmwAD^RxBfV&}A_vGgR7_=jPm?3mRv3K9G*oY?)QL;K; zJcj!98u64-H8D`>!C9_LpIHD@!k<14 zXrq$www*oaWPiULrnO9G zV`luw6tPE2Db^)gRf;Dwh7{mzjWst`+-LK^xw+M3Dr{XpkpbXQzNZ1e#9Rj8T?|0( z9$p4O1~j+B>M8PCigNUyVDlj{?*Vl$&MwFHn}wRxxzXDjfR`&ce7T0dzy@~xefDp! zT|W#_y9Kau1PL*tiRVNbVaK3+z33Y5T|g?Zq>)L9Wf*JPS*F?Cyd1N-3#w$$iASx| z4oXo-oB}izejlJ_L-Q&UbE_$TGPTT!Q!wJi^%bf^W(x4FygkaNAUuU)Ny&X&V0$sj zs%cXZjRKx-jy zqU|PSfqpkvfjD3IF|NWpo0Ng_Dd;07XZsWp;lpJ!{h#ob4|AWXxaW8&2k(%sO~of} zDuxf(EBFPep$9O$%`6nl=WSgNSRZAKZ#N6`^ViobWJCkGzIN<1pt&8LcKNUJuIFyV zkIsG2BXi|GctCU8a=a+U3g#49pR;3wZBrU&9$0b*K8*K#EX#*tNY`sg#&IHUVZqhh z%;K867ukC4wp`;Q9iAHf-!z0Txwi2mMkesANu0cjfT~8?QiFss6o7A1!6xRx*H6!? zV3WoJ1NxW9L8AaIo*6#w1_E+rSt30PsXJW;^5A!QhQI^r`g1dSg$bi0m9G@9aN>*= ztT$uN6}Ox89XK8eqHdJpzJ1l_5AB(S6*RUAA2(s-9o%O)#%i$62ULC9>em7@y6;im zgY;ss+LZM@kOY)CUICZZb}qP{&2rS!@qP%wY+&|#7;x=2S>$=$)wnYz5iq&K zRE^^+0;(o0sF|u32$0*iW`Oc&-y#Ew)x|VMS^k7m>a)KZa7JAlFzWW%X@=Qrz4MfMRsS0T#04 z9_jN0eFI?@du?Dy-3DU*iP9oy%=2~x$%G$H_r1rncjy>EgMG{qN-4HyTWjVK&Pp__ zq%qi(Io^>6YF#Zh$-yhCm{{H-2ct2sV446j!ijyiDEziMeT1grv!nF+VgEKee)UQ8W*8Jt8C?So0GhWp2 zycwh1&!eN)lJ2%hlKhlvX5spClO!cESCS+cX8uu?t&=2KcFun%S0y_$S2jh%_(!3p z{ebTule!l6{q2h5wwzqooMAD3;heb^Bo^?BNlD_lVp9J_Oe*kvS=@ba=JuuG2PJN1 z-WMw6%&{GHGv_(s2iuX;jV0BY^m0IRDX^89!^01MP(B|{gKSbWaeQ!Kh`kysJZj{u zn_@Fv+eFmL8OZY_R>~<`0mr|NPl($UInL4H@-R4WN%-b5IfwE1{BZtFr+I*Vd<6t|IFgP z;N<#Ti#tQ1UWPQv@-n2b=W{*MVqD_y;kRgUjTlWMbLBo-wDxfdHur(=nEn3T2XkM_ zmHTKCRp1m0h9sA^F^=nQyW&R1jIkt*8u}su5h^NBWyR0g2?*1rMW4&emyFDq-vKw$ z%)9~@Gv@GgW<1qOwxYO$Z6aPRzaYRVndkyD#>l3cwx!t8)p=Ck6@Xj1Zj+Vrk3;L$ zKe3Li>kBJQrPvr6E7w9@DXi%$W=D}v>(i$~+vk#+_X_!QDmV)2uCunVQ-u*x$)@)Q z2U$*Q;;9mKfLca10;UsUgD zeBj1BYGkm~0ysd!<_9wqy#oR8o#(Zmgjd{bXR8T^l~SC&48v2DeqL9UOJU|6qFh&n zF9m3BSB0;F@x%(>Y~LF`&IZBG%(eT_Fjjj~!Zw_7x!M4}vpW-bxwa{L+ZWeU9CN@} z1iTIyvlzc-&e$vu^Ei~!@;n|jTY&SPKVxpukqK8v&9Q)=sgDPux`S8`!_vRFu04J2Tg&Lc>_KsVGWL z;HWMS154pqW#XXlth7&ofZWq3Ge9+Iw=~1tJ|Hq2CXPvYFDFiFZ@=;R#{5hfjeFq9 z_N4|O+VE^~pTMKwzs6Dop05ze-uA_3_mmKc;hHG-BRiu>5X&9D0CzvQ3lj=v5au5e zW2;jdu*1#A-C#T5@P$XX{Zc28oLm1v8Vy}v2Sg-{Z*TSvd;G0mRTt-CT~5cz?U^TE zJ@H{FUnT8p-Zo=?%uUK7?;n~F$946 z7%p9##>V=Tij^!K>}guo>&_RRmv+g<<6E*Rvhp~FcV$z;2kS<^BAa5C&oE>?F~JJ- z;C3lN1M-FIwQ3`WHvlg0EaFmAEaP%!2FOBhfzQ|iGU6?fCE6Qz>RRjP0|TWeqM7;i6MUg`CzrVhZ&O&6wcf0yDOLrxLbHOPg@G#&*wOxog!Tm|5c78mc{ zh8&8;Xl(qAyIE;TeZ`PiPYnTi4;%s>cR#KVsQL)1kE%uue|+J!w+#>4Kq>M{bcCg_ zHlsRjJ-sg&9}gJRTisNwfJ)cfX{7mI0MQ$o1=J)I!;ND&}|kt7Z( zg{{TQU&`BF81X=^NsJjFSM{CUjl=RB9L+crI4M>ae>~!dgpNTwK$%=fYHQ^somO#;s7&#N{ix2vfiM353a09z{l z@FgHoAPKNjqxklzfMplF{61clM|3SCG%I8!iS2p@Jhwymv2$jJ$xIlv$>y|6$9PNu zOCSFehTPsYm@l%}eRpcD;w=bK8^sER%&i$RSynUgP7?pGnr_j!Qim^i$ zil3sAZP-fUA6=zi#1E==!yyqxgsjp|IRLIFz;P%A?^rf%AV(<(LSM}rPP>Ho2Z$D) zQ4-?=Lr8X}%g`P1{+WPlASa%cI+2-m;PoM##-u!8`h z()iGbo7n)AmC{_-)&;rUTqE*3C*e41U5xGWOZ`?aY)<2BOWz$#<}!bwa5Q zdz5)p7BDVGoD-M6Emo%jjDuqA6GbLKG&EtX@FA8p4>XQbxv-*DfI96$3a9{_7Su#7 z-J$1@lm+Q6jJwU+!0YPCmk?E#95M);Cczn2lv-k ua#g&&!BLaoPD~A%qlM + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_generic.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading - hdg_generic.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:050.0 %
    Date:2024-04-18 23:11:36Functions:030.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::HdgGeneric::HdgGeneric(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)0
    mrs_uav_state_estimators::HdgGeneric::~HdgGeneric()0
    mrs_uav_state_estimators::HdgGeneric::~HdgGeneric().20
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_generic.h.func.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_generic.h.func.html new file mode 100644 index 0000000000..ba8c2f2e6e --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_generic.h.func.html @@ -0,0 +1,92 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_generic.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading - hdg_generic.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:050.0 %
    Date:2024-04-18 23:11:36Functions:030.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::HdgGeneric::HdgGeneric(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)0
    mrs_uav_state_estimators::HdgGeneric::~HdgGeneric()0
    mrs_uav_state_estimators::HdgGeneric::~HdgGeneric().20
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_generic.h.gcov.frameset.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_generic.h.gcov.frameset.html new file mode 100644 index 0000000000..d9b5d32060 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_generic.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_generic.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_generic.h.gcov.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_generic.h.gcov.html new file mode 100644 index 0000000000..92bbc20604 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_generic.h.gcov.html @@ -0,0 +1,243 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_generic.h + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading - hdg_generic.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:050.0 %
    Date:2024-04-18 23:11:36Functions:030.0 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #ifndef ESTIMATORS_HEADING_HDG_GENERIC_H
    +       2             : #define ESTIMATORS_HEADING_HDG_GENERIC_H
    +       3             : 
    +       4             : /* includes //{ */
    +       5             : 
    +       6             : #include <ros/ros.h>
    +       7             : 
    +       8             : #include <nav_msgs/Odometry.h>
    +       9             : 
    +      10             : #include <mrs_lib/lkf.h>
    +      11             : #include <mrs_lib/repredictor.h>
    +      12             : #include <mrs_lib/profiler.h>
    +      13             : #include <mrs_lib/param_loader.h>
    +      14             : #include <mrs_lib/subscribe_handler.h>
    +      15             : #include <mrs_lib/geometry/cyclic.h>
    +      16             : 
    +      17             : #include <mrs_uav_state_estimators/estimators/heading/heading_estimator.h>
    +      18             : #include <mrs_uav_state_estimators/estimators/correction.h>
    +      19             : 
    +      20             : #include <mrs_uav_state_estimators/HeadingEstimatorConfig.h>
    +      21             : 
    +      22             : //}
    +      23             : 
    +      24             : namespace mrs_uav_state_estimators
    +      25             : {
    +      26             : 
    +      27             : namespace hdg_generic
    +      28             : {
    +      29             : 
    +      30             : const int n_states       = 2;
    +      31             : const int n_inputs       = 1;
    +      32             : const int n_measurements = 1;
    +      33             : 
    +      34             : }  // namespace hdg_generic
    +      35             : 
    +      36             : class HdgGeneric : public HeadingEstimator<hdg_generic::n_states> {
    +      37             : 
    +      38             :   const std::string package_name_ = "mrs_uav_state_estimators";
    +      39             : 
    +      40             :   typedef mrs_lib::DynamicReconfigureMgr<HeadingEstimatorConfig> drmgr_t;
    +      41             : 
    +      42             :   using lkf_t         = mrs_lib::LKF<hdg_generic::n_states, hdg_generic::n_inputs, hdg_generic::n_measurements>;
    +      43             :   using varstep_lkf_t = mrs_lib::varstepLKF<hdg_generic::n_states, hdg_generic::n_inputs, hdg_generic::n_measurements>;
    +      44             :   using A_t           = lkf_t::A_t;
    +      45             :   using B_t           = lkf_t::B_t;
    +      46             :   using H_t           = lkf_t::H_t;
    +      47             :   using Q_t           = lkf_t::Q_t;
    +      48             :   using x_t           = lkf_t::x_t;
    +      49             :   using P_t           = lkf_t::P_t;
    +      50             :   using u_t           = lkf_t::u_t;
    +      51             :   using z_t           = lkf_t::z_t;
    +      52             :   using R_t           = lkf_t::R_t;
    +      53             :   using statecov_t    = lkf_t::statecov_t;
    +      54             : 
    +      55             :   typedef mrs_lib::Repredictor<varstep_lkf_t> rep_lkf_t;
    +      56             : 
    +      57             :   using StateId_t = mrs_uav_managers::estimation_manager::StateId_t;
    +      58             : 
    +      59             : private:
    +      60             :   std::string parent_state_est_name_;
    +      61             : 
    +      62             :   double                                      dt_;
    +      63             :   double                                      input_coeff_;
    +      64             :   double                                      default_input_coeff_;
    +      65             :   A_t                                         A_;
    +      66             :   B_t                                         B_;
    +      67             :   H_t                                         H_;
    +      68             :   Q_t                                         Q_;
    +      69             :   std::shared_ptr<lkf_t>                      lkf_;
    +      70             :   std::unique_ptr<rep_lkf_t>                  lkf_rep_;
    +      71             :   std::vector<std::shared_ptr<varstep_lkf_t>> models_;
    +      72             :   mutable std::mutex                          mutex_lkf_;
    +      73             :   statecov_t                                  sc_;
    +      74             :   mutable std::mutex                          mutex_sc_;
    +      75             : 
    +      76             :   std::unique_ptr<drmgr_t> drmgr_;
    +      77             :   void                     callbackReconfigure(HeadingEstimatorConfig &config, [[maybe_unused]] uint32_t level);
    +      78             : 
    +      79             :   z_t                innovation_;
    +      80             :   mutable std::mutex mtx_innovation_;
    +      81             : 
    +      82             :   bool is_repredictor_enabled_;
    +      83             :   int  rep_buffer_size_ = 200;
    +      84             : 
    +      85             :   const bool is_core_plugin_;
    +      86             : 
    +      87             :   std::vector<std::string>                                              correction_names_;
    +      88             :   std::vector<std::shared_ptr<Correction<hdg_generic::n_measurements>>> corrections_;
    +      89             : 
    +      90             :   mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput> sh_control_input_;
    +      91             :   void                                                timeoutCallback(const std::string &topic, const ros::Time &last_msg);
    +      92             :   std::atomic<bool>                                   is_input_ready_ = false;
    +      93             : 
    +      94             :   ros::Timer timer_update_;
    +      95             :   void       timerUpdate(const ros::TimerEvent &event);
    +      96             : 
    +      97             :   ros::Timer timer_check_health_;
    +      98             :   void       timerCheckHealth(const ros::TimerEvent &event);
    +      99             : 
    +     100             :   void doCorrection(const Correction<hdg_generic::n_measurements>::MeasurementStamped &meas, const double R, const StateId_t &state_id);
    +     101             :   void doCorrection(const z_t &z, const double R, const StateId_t &H_idx, const ros::Time &meas_stamp);
    +     102             : 
    +     103             :   bool isConverged();
    +     104             : 
    +     105             :   Q_t                getQ();
    +     106             :   mutable std::mutex mtx_Q_;
    +     107             : 
    +     108             :   mutable std::mutex mutex_last_valid_hdg_;
    +     109             :   double             last_valid_hdg_;
    +     110             : 
    +     111             : public:
    +     112           0 :   HdgGeneric(const std::string &name, const std::string &ns_frame_id, const std::string &parent_state_est_name, const bool is_core_plugin)
    +     113           0 :       : HeadingEstimator<hdg_generic::n_states>(name, ns_frame_id), parent_state_est_name_(parent_state_est_name), is_core_plugin_(is_core_plugin) {
    +     114           0 :   }
    +     115             : 
    +     116           0 :   ~HdgGeneric(void) {
    +     117           0 :   }
    +     118             : 
    +     119             :   void initialize(ros::NodeHandle &nh, const std::shared_ptr<CommonHandlers_t> &ch, const std::shared_ptr<PrivateHandlers_t> &ph) override;
    +     120             :   bool start(void) override;
    +     121             :   bool pause(void) override;
    +     122             :   bool reset(void) override;
    +     123             : 
    +     124             :   double getState(const int &state_idx_in) const override;
    +     125             :   double getState(const int &state_id_in, const int &axis_in) const override;
    +     126             : 
    +     127             :   void setState(const double &state_in, const int &state_idx_in) override;
    +     128             :   void setState(const double &state_in, const int &state_id_in, const int &axis_in) override;
    +     129             : 
    +     130             :   states_t getStates(void) const override;
    +     131             :   void     setStates(const states_t &states_in) override;
    +     132             : 
    +     133             :   double getCovariance(const int &state_idx_in) const override;
    +     134             :   double getCovariance(const int &state_id_in, const int &axis_in) const override;
    +     135             : 
    +     136             :   covariance_t getCovarianceMatrix(void) const override;
    +     137             :   void         setCovarianceMatrix(const covariance_t &cov_in) override;
    +     138             : 
    +     139             :   double getInnovation(const int &state_idx) const override;
    +     140             :   double getInnovation(const int &state_id_in, const int &axis_in) const override;
    +     141             : 
    +     142             :   double getLastValidHdg() const override;
    +     143             : 
    +     144             :   void setDt(const double &dt);
    +     145             :   void setInputCoeff(const double &input_coeff);
    +     146             : 
    +     147             :   void generateRepredictorModels(const double input_coeff);
    +     148             : 
    +     149             :   void generateA();
    +     150             :   void generateB();
    +     151             : 
    +     152             : 
    +     153             :   std::string getNamespacedName() const;
    +     154             : 
    +     155             :   std::string getPrintName() const;
    +     156             : };
    +     157             : }  // namespace mrs_uav_state_estimators
    +     158             : 
    +     159             : #endif  // ESTIMATORS_HEADING_HDG_GENERIC_H
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_generic.h.gcov.overview.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_generic.h.gcov.overview.html new file mode 100644 index 0000000000..f648f9d8d0 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_generic.h.gcov.overview.html @@ -0,0 +1,60 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_generic.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_generic.h.gcov.png b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_generic.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..c826730ad70614286d57a68cb29d1eed954df391 GIT binary patch literal 663 zcmV;I0%-k-P)4zK6(s~1FktrePxJa#)*WXO@}bs+5PYc2AyWg@7ASK1 zmo$>`V`ShNVzi=_j5E@Ga0&E!#xAr5cGX+pFeHTm>DC^BgH2eKUSeGGUW|YR z7&{Nn{v{A*73@1M0FWYBF}}EpfuKx5)^W|@6!sV!tj=T%G@_9|!6&8Y7|lqhO`wNH z;HZh3g-;(@)7!jR#8}J%xfo%I*N{%(K31_-x+M}G^;wH+^4D%7$DuvpqLY;~ z-0$njF*!iuxSFPdXk6j0=qfLdi_%n+A*+D#!T7|JPxr`>pUGyW&0YqINimidlfp*2 zo;|&|SkS7s)fC%t+fVx3t7C + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_passthrough.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading - hdg_passthrough.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:55100.0 %
    Date:2024-04-18 23:11:36Functions:33100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::HdgPassthrough::HdgPassthrough(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)97
    mrs_uav_state_estimators::HdgPassthrough::~HdgPassthrough()97
    mrs_uav_state_estimators::HdgPassthrough::~HdgPassthrough().297
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_passthrough.h.func.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_passthrough.h.func.html new file mode 100644 index 0000000000..4c61edcecb --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_passthrough.h.func.html @@ -0,0 +1,92 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_passthrough.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading - hdg_passthrough.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:55100.0 %
    Date:2024-04-18 23:11:36Functions:33100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::HdgPassthrough::HdgPassthrough(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)97
    mrs_uav_state_estimators::HdgPassthrough::~HdgPassthrough()97
    mrs_uav_state_estimators::HdgPassthrough::~HdgPassthrough().297
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_passthrough.h.gcov.frameset.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_passthrough.h.gcov.frameset.html new file mode 100644 index 0000000000..b8c92e1d37 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_passthrough.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_passthrough.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_passthrough.h.gcov.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_passthrough.h.gcov.html new file mode 100644 index 0000000000..ed1a79d903 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_passthrough.h.gcov.html @@ -0,0 +1,191 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_passthrough.h + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading - hdg_passthrough.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:55100.0 %
    Date:2024-04-18 23:11:36Functions:33100.0 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #ifndef ESTIMATORS_HEADING_HDG_PASSTHROUGH_H
    +       2             : #define ESTIMATORS_HEADING_HDG_PASSTHROUGH_H
    +       3             : 
    +       4             : /* includes //{ */
    +       5             : 
    +       6             : #include <ros/ros.h>
    +       7             : 
    +       8             : #include <nav_msgs/Odometry.h>
    +       9             : 
    +      10             : #include <mrs_lib/lkf.h>
    +      11             : #include <mrs_lib/profiler.h>
    +      12             : #include <mrs_lib/param_loader.h>
    +      13             : #include <mrs_lib/subscribe_handler.h>
    +      14             : #include <mrs_lib/geometry/cyclic.h>
    +      15             : 
    +      16             : #include <mrs_uav_state_estimators/estimators/heading/heading_estimator.h>
    +      17             : 
    +      18             : //}
    +      19             : 
    +      20             : namespace mrs_uav_state_estimators
    +      21             : {
    +      22             : 
    +      23             : namespace hdg_passthrough
    +      24             : {
    +      25             : const int n_states = 2;
    +      26             : }  // namespace hdg_passthrough
    +      27             : 
    +      28             : using namespace mrs_uav_managers::estimation_manager;
    +      29             : 
    +      30             : class HdgPassthrough : public HeadingEstimator<hdg_passthrough::n_states> {
    +      31             : 
    +      32             :   using CommonHandlers_t = mrs_uav_managers::estimation_manager::CommonHandlers_t;
    +      33             : 
    +      34             : private:
    +      35             :   const std::string package_name_ = "mrs_uav_state_estimators";
    +      36             : 
    +      37             :   std::string parent_state_est_name_;
    +      38             : 
    +      39             :   states_t           hdg_state_;
    +      40             :   mutable std::mutex mtx_hdg_state_;
    +      41             :   states_t           prev_hdg_state_;
    +      42             :   mutable std::mutex mtx_prev_hdg_state_;
    +      43             : 
    +      44             :   covariance_t       hdg_covariance_;
    +      45             :   mutable std::mutex mtx_hdg_covariance_;
    +      46             : 
    +      47             :   states_t           innovation_;
    +      48             :   mutable std::mutex mtx_innovation_;
    +      49             : 
    +      50             :   const bool is_core_plugin_;
    +      51             : 
    +      52             :   std::string                                                 orient_topic_;
    +      53             :   mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped> sh_orientation_;
    +      54             :   void                                                        callbackOrientation(const geometry_msgs::QuaternionStamped::ConstPtr msg);
    +      55             :   std::atomic<bool>                                           is_orient_ready_ = false;
    +      56             : 
    +      57             :   std::string                                              ang_vel_topic_;
    +      58             :   mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped> sh_ang_vel_;
    +      59             :   void                                                     callbackAngularVelocity(const geometry_msgs::Vector3Stamped::ConstPtr msg);
    +      60             :   std::atomic<bool>                                        is_ang_vel_ready_ = false;
    +      61             : 
    +      62             :   ros::Timer timer_update_;
    +      63             :   void       timerUpdate(const ros::TimerEvent &event);
    +      64             : 
    +      65             :   ros::Timer timer_check_health_;
    +      66             :   void       timerCheckHealth(const ros::TimerEvent &event);
    +      67             : 
    +      68             : public:
    +      69          97 :   HdgPassthrough(const std::string &name, const std::string &ns_frame_id, const std::string &parent_state_est_name, const bool is_core_plugin)
    +      70          97 :       : HeadingEstimator<hdg_passthrough::n_states>(name, ns_frame_id), parent_state_est_name_(parent_state_est_name), is_core_plugin_(is_core_plugin) {
    +      71          97 :   }
    +      72             : 
    +      73         194 :   ~HdgPassthrough(void) {
    +      74         194 :   }
    +      75             : 
    +      76             :   void initialize(ros::NodeHandle &nh, const std::shared_ptr<CommonHandlers_t> &ch, const std::shared_ptr<PrivateHandlers_t> &ph) override;
    +      77             :   bool start(void) override;
    +      78             :   bool pause(void) override;
    +      79             :   bool reset(void) override;
    +      80             : 
    +      81             :   double getState(const int &state_idx_in) const override;
    +      82             :   double getState(const int &state_id_in, const int &axis_in) const override;
    +      83             : 
    +      84             :   void setState(const double &state_in, const int &state_idx_in) override;
    +      85             :   void setState(const double &state_in, const int &state_id_in, const int &axis_in) override;
    +      86             : 
    +      87             :   states_t getStates(void) const override;
    +      88             :   void     setStates(const states_t &states_in) override;
    +      89             : 
    +      90             :   double getCovariance(const int &state_idx_in) const override;
    +      91             :   double getCovariance(const int &state_id_in, const int &axis_in) const override;
    +      92             : 
    +      93             :   covariance_t getCovarianceMatrix(void) const override;
    +      94             :   void         setCovarianceMatrix(const covariance_t &cov_in) override;
    +      95             : 
    +      96             :   double getInnovation(const int &state_idx) const override;
    +      97             :   double getInnovation(const int &state_id_in, const int &axis_in) const override;
    +      98             : 
    +      99             :   double getLastValidHdg() const override;
    +     100             : 
    +     101             :   std::string getNamespacedName() const;
    +     102             : 
    +     103             :   std::string getPrintName() const;
    +     104             : };
    +     105             : }  // namespace mrs_uav_state_estimators
    +     106             : 
    +     107             : #endif  // ESTIMATORS_HEADING_HDG_PASSTHROUGH_H
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_passthrough.h.gcov.overview.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_passthrough.h.gcov.overview.html new file mode 100644 index 0000000000..3a0362ef13 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_passthrough.h.gcov.overview.html @@ -0,0 +1,47 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_passthrough.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_passthrough.h.gcov.png b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/hdg_passthrough.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..59c70c2f6a8a81135bd8dca6f6b93ea23cdae157 GIT binary patch literal 506 zcmVD=e3=CiAy9U z<2PVAFPU){EoYpNMstpRXbtRU&;m`?%w{?<$Eftk`yA1d&vxZPT4gs&-<5UsI_S?J zpjq86U3cXgc_sr8i7)Osaz+En#GE0tqLVbH#FzVs)9o2Wax+>^NqDrTRgC={8^&cj zl-U1B#|8}88tDx~h#T3S90$A0<5nmnHaAlv0*87xQXh`=FKjYX%w^3>F{+xG;tZjg zAs|ef0mD!iWk9n7Mvob#Rhm+o?Ksra^UAiQ!%6W;*CT$;bdC2egm9dlIM|m9M=*u6 z!7dpF07*qoM6N<$g7Y-qe*gdg literal 0 HcmV?d00001 diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/heading_estimator.h.func-sort-c.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/heading_estimator.h.func-sort-c.html new file mode 100644 index 0000000000..d3f1acd49a --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/heading_estimator.h.func-sort-c.html @@ -0,0 +1,84 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/heading_estimator.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading - heading_estimator.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:22100.0 %
    Date:2024-04-18 23:11:36Functions:11100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::HeadingEstimator<2>::HeadingEstimator(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)97
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/heading_estimator.h.func.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/heading_estimator.h.func.html new file mode 100644 index 0000000000..534744dc68 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/heading_estimator.h.func.html @@ -0,0 +1,84 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/heading_estimator.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading - heading_estimator.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:22100.0 %
    Date:2024-04-18 23:11:36Functions:11100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::HeadingEstimator<2>::HeadingEstimator(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)97
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/heading_estimator.h.gcov.frameset.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/heading_estimator.h.gcov.frameset.html new file mode 100644 index 0000000000..efa10b4b9b --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/heading_estimator.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/heading_estimator.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/heading_estimator.h.gcov.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/heading_estimator.h.gcov.html new file mode 100644 index 0000000000..30d2756d54 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/heading_estimator.h.gcov.html @@ -0,0 +1,124 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/heading_estimator.h + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading - heading_estimator.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:22100.0 %
    Date:2024-04-18 23:11:36Functions:11100.0 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #ifndef ESTIMATORS_HEADING_HEADING_ESTIMATOR_H
    +       2             : #define ESTIMATORS_HEADING_HEADING_ESTIMATOR_H
    +       3             : 
    +       4             : /* includes //{ */
    +       5             : 
    +       6             : #include <mrs_uav_state_estimators/estimators/partial_estimator.h>
    +       7             : 
    +       8             : //}
    +       9             : 
    +      10             : namespace mrs_uav_state_estimators
    +      11             : {
    +      12             : 
    +      13             : namespace heading
    +      14             : {
    +      15             : const char type[] = "HEADING";
    +      16             : }
    +      17             : 
    +      18             : template <int n_states>
    +      19             : class HeadingEstimator : public PartialEstimator<n_states, 1> {
    +      20             : 
    +      21             : protected:
    +      22          97 :   HeadingEstimator(const std::string& name, const std::string& frame_id) : PartialEstimator<n_states, 1>(heading::type, name, frame_id) {
    +      23          97 :   }
    +      24             : 
    +      25             :   mutable std::mutex mutex_last_valid_hdg_;
    +      26             :   double             last_valid_hdg_;
    +      27             : 
    +      28             : private:
    +      29             :   static const int _n_axes_   = 1;
    +      30             :   static const int _n_states_ = n_states;
    +      31             :   static const int _n_inputs_;
    +      32             :   static const int _n_measurements_;
    +      33             : 
    +      34             : public:
    +      35             :   virtual double getLastValidHdg() const = 0;
    +      36             : };
    +      37             : 
    +      38             : }  // namespace mrs_uav_state_estimators
    +      39             : 
    +      40             : #endif  // ESTIMATORS_HEADING_HEADING_ESTIMATOR_H
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/heading_estimator.h.gcov.overview.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/heading_estimator.h.gcov.overview.html new file mode 100644 index 0000000000..4cc90f7128 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/heading_estimator.h.gcov.overview.html @@ -0,0 +1,30 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/heading_estimator.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/heading_estimator.h.gcov.png b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/heading_estimator.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..3fa1a030f3bdb9d4e5e4354fd133a23a3d84dca9 GIT binary patch literal 293 zcmeAS@N?(olHy`uVBq!ia0vp^0YI$5!VDy5`z06wDTx4|5ZC|z|E~gq#sJy z_!d=lu%pyiZdT`(8i5lD0#}Z_-Sjn9u0vVe{n2K}X{;w7Y_kv6QkQ>GW1X*;rZGj% iUS^U*{*!sPE144yXqeA-@c#>RK7*&LpUXO@geCwTJ$YaN literal 0 HcmV?d00001 diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/index-detail-sort-f.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/index-detail-sort-f.html new file mode 100644 index 0000000000..958bda0e64 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/index-detail-sort-f.html @@ -0,0 +1,138 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/headingHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:71258.3 %
    Date:2024-04-18 23:11:36Functions:4757.1 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    hdg_generic.h +
    0.0%
    +
    0.0 %0 / 50.0 %0 / 3
    heading_estimator.h +
    100.0%
    +
    100.0 %2 / 2100.0 %1 / 1
    <unnamed>100.0 %2 / 2100.0 %1 / 1
    hdg_passthrough.h +
    100.0%
    +
    100.0 %5 / 5100.0 %3 / 3
    <unnamed>100.0 %5 / 5100.0 %3 / 3
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/index-detail-sort-l.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/index-detail-sort-l.html new file mode 100644 index 0000000000..03d217bf1e --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/index-detail-sort-l.html @@ -0,0 +1,138 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/headingHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:71258.3 %
    Date:2024-04-18 23:11:36Functions:4757.1 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    hdg_generic.h +
    0.0%
    +
    0.0 %0 / 50.0 %0 / 3
    heading_estimator.h +
    100.0%
    +
    100.0 %2 / 2100.0 %1 / 1
    <unnamed>100.0 %2 / 2100.0 %1 / 1
    hdg_passthrough.h +
    100.0%
    +
    100.0 %5 / 5100.0 %3 / 3
    <unnamed>100.0 %5 / 5100.0 %3 / 3
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/index-detail.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/index-detail.html new file mode 100644 index 0000000000..bd7b88d98b --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/index-detail.html @@ -0,0 +1,138 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/headingHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:71258.3 %
    Date:2024-04-18 23:11:36Functions:4757.1 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    hdg_generic.h +
    0.0%
    +
    0.0 %0 / 50.0 %0 / 3
    hdg_passthrough.h +
    100.0%
    +
    100.0 %5 / 5100.0 %3 / 3
    <unnamed>100.0 %5 / 5100.0 %3 / 3
    heading_estimator.h +
    100.0%
    +
    100.0 %2 / 2100.0 %1 / 1
    <unnamed>100.0 %2 / 2100.0 %1 / 1
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/index-sort-f.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/index-sort-f.html new file mode 100644 index 0000000000..60b56f5078 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/index-sort-f.html @@ -0,0 +1,122 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/headingHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:71258.3 %
    Date:2024-04-18 23:11:36Functions:4757.1 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    hdg_generic.h +
    0.0%
    +
    0.0 %0 / 50.0 %0 / 3
    heading_estimator.h +
    100.0%
    +
    100.0 %2 / 2100.0 %1 / 1
    hdg_passthrough.h +
    100.0%
    +
    100.0 %5 / 5100.0 %3 / 3
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/index-sort-l.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/index-sort-l.html new file mode 100644 index 0000000000..173cb1b68f --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/index-sort-l.html @@ -0,0 +1,122 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/headingHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:71258.3 %
    Date:2024-04-18 23:11:36Functions:4757.1 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    hdg_generic.h +
    0.0%
    +
    0.0 %0 / 50.0 %0 / 3
    heading_estimator.h +
    100.0%
    +
    100.0 %2 / 2100.0 %1 / 1
    hdg_passthrough.h +
    100.0%
    +
    100.0 %5 / 5100.0 %3 / 3
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/index.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/index.html new file mode 100644 index 0000000000..4c270edd2f --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading/index.html @@ -0,0 +1,122 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/heading + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/headingHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:71258.3 %
    Date:2024-04-18 23:11:36Functions:4757.1 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    hdg_generic.h +
    0.0%
    +
    0.0 %0 / 50.0 %0 / 3
    hdg_passthrough.h +
    100.0%
    +
    100.0 %5 / 5100.0 %3 / 3
    heading_estimator.h +
    100.0%
    +
    100.0 %2 / 2100.0 %1 / 1
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/index-detail-sort-f.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/index-detail-sort-f.html new file mode 100644 index 0000000000..94beb8497e --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/index-detail-sort-f.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimatorsHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:40976153.7 %
    Date:2024-04-18 23:11:36Functions:669569.5 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    correction.h +
    51.7%51.7%
    +
    51.7 %375 / 72566.2 %47 / 71
    <unnamed>51.7 %375 / 72566.2 %47 / 71
    partial_estimator.h +
    94.4%94.4%
    +
    94.4 %34 / 3679.2 %19 / 24
    <unnamed>94.4 %34 / 3679.2 %19 / 24
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/index-detail-sort-l.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/index-detail-sort-l.html new file mode 100644 index 0000000000..ed3b827ef7 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/index-detail-sort-l.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimatorsHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:40976153.7 %
    Date:2024-04-18 23:11:36Functions:669569.5 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    correction.h +
    51.7%51.7%
    +
    51.7 %375 / 72566.2 %47 / 71
    <unnamed>51.7 %375 / 72566.2 %47 / 71
    partial_estimator.h +
    94.4%94.4%
    +
    94.4 %34 / 3679.2 %19 / 24
    <unnamed>94.4 %34 / 3679.2 %19 / 24
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/index-detail.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/index-detail.html new file mode 100644 index 0000000000..bdf11bbe70 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/index-detail.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimatorsHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:40976153.7 %
    Date:2024-04-18 23:11:36Functions:669569.5 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    correction.h +
    51.7%51.7%
    +
    51.7 %375 / 72566.2 %47 / 71
    <unnamed>51.7 %375 / 72566.2 %47 / 71
    partial_estimator.h +
    94.4%94.4%
    +
    94.4 %34 / 3679.2 %19 / 24
    <unnamed>94.4 %34 / 3679.2 %19 / 24
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/index-sort-f.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/index-sort-f.html new file mode 100644 index 0000000000..b140a453eb --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/index-sort-f.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimatorsHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:40976153.7 %
    Date:2024-04-18 23:11:36Functions:669569.5 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    correction.h +
    51.7%51.7%
    +
    51.7 %375 / 72566.2 %47 / 71
    partial_estimator.h +
    94.4%94.4%
    +
    94.4 %34 / 3679.2 %19 / 24
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/index-sort-l.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/index-sort-l.html new file mode 100644 index 0000000000..d88263710b --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/index-sort-l.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimatorsHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:40976153.7 %
    Date:2024-04-18 23:11:36Functions:669569.5 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    correction.h +
    51.7%51.7%
    +
    51.7 %375 / 72566.2 %47 / 71
    partial_estimator.h +
    94.4%94.4%
    +
    94.4 %34 / 3679.2 %19 / 24
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/index.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/index.html new file mode 100644 index 0000000000..9c41b2425b --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/index.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimatorsHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:40976153.7 %
    Date:2024-04-18 23:11:36Functions:669569.5 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    correction.h +
    51.7%51.7%
    +
    51.7 %375 / 72566.2 %47 / 71
    partial_estimator.h +
    94.4%94.4%
    +
    94.4 %34 / 3679.2 %19 / 24
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/index-detail-sort-f.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/index-detail-sort-f.html new file mode 100644 index 0000000000..d21f82e4f9 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/index-detail-sort-f.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateralHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:1010100.0 %
    Date:2024-04-18 23:11:36Functions:5683.3 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    lateral_estimator.h +
    100.0%
    +
    100.0 %4 / 466.7 %2 / 3
    <unnamed>100.0 %4 / 466.7 %2 / 3
    lat_generic.h +
    100.0%
    +
    100.0 %6 / 6100.0 %3 / 3
    <unnamed>100.0 %6 / 6100.0 %3 / 3
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/index-detail-sort-l.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/index-detail-sort-l.html new file mode 100644 index 0000000000..3994c853b1 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/index-detail-sort-l.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateralHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:1010100.0 %
    Date:2024-04-18 23:11:36Functions:5683.3 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    lateral_estimator.h +
    100.0%
    +
    100.0 %4 / 466.7 %2 / 3
    <unnamed>100.0 %4 / 466.7 %2 / 3
    lat_generic.h +
    100.0%
    +
    100.0 %6 / 6100.0 %3 / 3
    <unnamed>100.0 %6 / 6100.0 %3 / 3
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/index-detail.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/index-detail.html new file mode 100644 index 0000000000..6b4f2d111f --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/index-detail.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateralHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:1010100.0 %
    Date:2024-04-18 23:11:36Functions:5683.3 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    lat_generic.h +
    100.0%
    +
    100.0 %6 / 6100.0 %3 / 3
    <unnamed>100.0 %6 / 6100.0 %3 / 3
    lateral_estimator.h +
    100.0%
    +
    100.0 %4 / 466.7 %2 / 3
    <unnamed>100.0 %4 / 466.7 %2 / 3
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/index-sort-f.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/index-sort-f.html new file mode 100644 index 0000000000..083231e034 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/index-sort-f.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateralHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:1010100.0 %
    Date:2024-04-18 23:11:36Functions:5683.3 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    lateral_estimator.h +
    100.0%
    +
    100.0 %4 / 466.7 %2 / 3
    lat_generic.h +
    100.0%
    +
    100.0 %6 / 6100.0 %3 / 3
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/index-sort-l.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/index-sort-l.html new file mode 100644 index 0000000000..2e833b7c4a --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/index-sort-l.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateralHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:1010100.0 %
    Date:2024-04-18 23:11:36Functions:5683.3 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    lateral_estimator.h +
    100.0%
    +
    100.0 %4 / 466.7 %2 / 3
    lat_generic.h +
    100.0%
    +
    100.0 %6 / 6100.0 %3 / 3
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/index.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/index.html new file mode 100644 index 0000000000..4338fbefb3 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/index.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateralHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:1010100.0 %
    Date:2024-04-18 23:11:36Functions:5683.3 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    lat_generic.h +
    100.0%
    +
    100.0 %6 / 6100.0 %3 / 3
    lateral_estimator.h +
    100.0%
    +
    100.0 %4 / 466.7 %2 / 3
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lat_generic.h.func-sort-c.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lat_generic.h.func-sort-c.html new file mode 100644 index 0000000000..4a93b5dff7 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lat_generic.h.func-sort-c.html @@ -0,0 +1,92 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lat_generic.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral - lat_generic.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:66100.0 %
    Date:2024-04-18 23:11:36Functions:33100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::LatGeneric::LatGeneric(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool, std::function<std::optional<double> ()>)97
    mrs_uav_state_estimators::LatGeneric::~LatGeneric()97
    mrs_uav_state_estimators::LatGeneric::~LatGeneric().297
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lat_generic.h.func.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lat_generic.h.func.html new file mode 100644 index 0000000000..232d3cf8f5 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lat_generic.h.func.html @@ -0,0 +1,92 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lat_generic.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral - lat_generic.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:66100.0 %
    Date:2024-04-18 23:11:36Functions:33100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::LatGeneric::LatGeneric(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool, std::function<std::optional<double> ()>)97
    mrs_uav_state_estimators::LatGeneric::~LatGeneric()97
    mrs_uav_state_estimators::LatGeneric::~LatGeneric().297
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lat_generic.h.gcov.frameset.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lat_generic.h.gcov.frameset.html new file mode 100644 index 0000000000..7be2806e41 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lat_generic.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lat_generic.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lat_generic.h.gcov.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lat_generic.h.gcov.html new file mode 100644 index 0000000000..15e635bb7d --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lat_generic.h.gcov.html @@ -0,0 +1,250 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lat_generic.h + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral - lat_generic.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:66100.0 %
    Date:2024-04-18 23:11:36Functions:33100.0 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #ifndef ESTIMATORS_LATERAL_LAT_GENERIC_H
    +       2             : #define ESTIMATORS_LATERAL_LAT_GENERIC_H
    +       3             : 
    +       4             : /* includes //{ */
    +       5             : 
    +       6             : #include <ros/ros.h>
    +       7             : 
    +       8             : #include <nav_msgs/Odometry.h>
    +       9             : 
    +      10             : #include <sensor_msgs/Imu.h>
    +      11             : 
    +      12             : #include <mrs_lib/lkf.h>
    +      13             : #include <mrs_lib/repredictor.h>
    +      14             : #include <mrs_lib/profiler.h>
    +      15             : #include <mrs_lib/param_loader.h>
    +      16             : #include <mrs_lib/subscribe_handler.h>
    +      17             : 
    +      18             : #include <mrs_uav_state_estimators/estimators/lateral/lateral_estimator.h>
    +      19             : #include <mrs_uav_state_estimators/estimators/correction.h>
    +      20             : 
    +      21             : #include <mrs_uav_state_estimators/LateralEstimatorConfig.h>
    +      22             : 
    +      23             : //}
    +      24             : 
    +      25             : namespace mrs_uav_state_estimators
    +      26             : {
    +      27             : 
    +      28             : namespace lat_generic
    +      29             : {
    +      30             : 
    +      31             : const int n_states       = 6;
    +      32             : const int n_inputs       = 2;
    +      33             : const int n_measurements = 2;
    +      34             : 
    +      35             : }  // namespace lat_generic
    +      36             : 
    +      37             : class LatGeneric : public LateralEstimator<lat_generic::n_states> {
    +      38             : 
    +      39             :   typedef mrs_lib::DynamicReconfigureMgr<LateralEstimatorConfig> drmgr_t;
    +      40             : 
    +      41             :   using lkf_t         = mrs_lib::LKF<lat_generic::n_states, lat_generic::n_inputs, lat_generic::n_measurements>;
    +      42             :   using varstep_lkf_t = mrs_lib::varstepLKF<lat_generic::n_states, lat_generic::n_inputs, lat_generic::n_measurements>;
    +      43             :   using A_t           = lkf_t::A_t;
    +      44             :   using B_t           = lkf_t::B_t;
    +      45             :   using H_t           = lkf_t::H_t;
    +      46             :   using Q_t           = lkf_t::Q_t;
    +      47             :   using x_t           = lkf_t::x_t;
    +      48             :   using P_t           = lkf_t::P_t;
    +      49             :   using u_t           = lkf_t::u_t;
    +      50             :   using z_t           = lkf_t::z_t;
    +      51             :   using R_t           = lkf_t::R_t;
    +      52             :   using statecov_t    = lkf_t::statecov_t;
    +      53             : 
    +      54             :   typedef mrs_lib::Repredictor<varstep_lkf_t> rep_lkf_t;
    +      55             : 
    +      56             : private:
    +      57             :   const std::string package_name_ = "mrs_uav_state_estimators";
    +      58             : 
    +      59             :   std::string parent_state_est_name_;
    +      60             : 
    +      61             :   double                                      dt_;
    +      62             :   double                                      input_coeff_, default_input_coeff_;
    +      63             :   A_t                                         A_;
    +      64             :   B_t                                         B_;
    +      65             :   H_t                                         H_;
    +      66             :   Q_t                                         Q_;
    +      67             :   std::shared_ptr<lkf_t>                      lkf_;
    +      68             :   std::unique_ptr<rep_lkf_t>                  lkf_rep_;
    +      69             :   std::vector<std::shared_ptr<varstep_lkf_t>> models_;
    +      70             :   mutable std::mutex                          mutex_lkf_;
    +      71             :   statecov_t                                  sc_;
    +      72             :   mutable std::mutex                          mutex_sc_;
    +      73             : 
    +      74             :   std::unique_ptr<drmgr_t> drmgr_;
    +      75             :   void                     callbackReconfigure(LateralEstimatorConfig &config, [[maybe_unused]] uint32_t level);
    +      76             : 
    +      77             :   z_t                innovation_;
    +      78             :   mutable std::mutex mtx_innovation_;
    +      79             : 
    +      80             :   bool          is_error_state_first_time_ = true;
    +      81             :   ros::Duration error_state_duration_;
    +      82             :   ros::Time     prev_time_in_error_state_;
    +      83             : 
    +      84             :   bool is_repredictor_enabled_;
    +      85             :   int  rep_buffer_size_ = 200;
    +      86             : 
    +      87             :   const bool is_core_plugin_;
    +      88             : 
    +      89             :   std::vector<std::string>                                              correction_names_;
    +      90             :   std::vector<std::shared_ptr<Correction<lat_generic::n_measurements>>> corrections_;
    +      91             : 
    +      92             :   mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput> sh_control_input_;
    +      93             :   void                                                timeoutCallback(const std::string &topic, const ros::Time &last_msg);
    +      94             :   std::atomic<bool>                                   is_input_ready_ = false;
    +      95             : 
    +      96             : 
    +      97             :   std::function<std::optional<double>()>               fun_get_hdg_;
    +      98             :   std::string                                          hdg_source_topic_;
    +      99             :   mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput> sh_hdg_state_;
    +     100             :   std::atomic<bool>                                    is_hdg_state_ready_ = false;
    +     101             : 
    +     102             :   ros::Timer timer_update_;
    +     103             :   void       timerUpdate(const ros::TimerEvent &event);
    +     104             : 
    +     105             :   ros::Timer timer_check_health_;
    +     106             :   void       timerCheckHealth(const ros::TimerEvent &event);
    +     107             : 
    +     108             : 
    +     109             :   void doCorrection(const Correction<lat_generic::n_measurements>::MeasurementStamped &meas, const double R, const StateId_t &state_id);
    +     110             :   void doCorrection(const z_t &z, const double R, const StateId_t &H_idx, const ros::Time &meas_stamp);
    +     111             : 
    +     112             :   bool isConverged();
    +     113             : 
    +     114             :   Q_t                getQ();
    +     115             :   mutable std::mutex mtx_Q_;
    +     116             : 
    +     117             : public:
    +     118          97 :   LatGeneric(const std::string &name, const std::string &ns_frame_id, const std::string &parent_state_est_name, const bool is_core_plugin,
    +     119             :              std::function<std::optional<double>()> fun_get_hdg)
    +     120          97 :       : LateralEstimator<lat_generic::n_states>(name, ns_frame_id),
    +     121             :         parent_state_est_name_(parent_state_est_name),
    +     122             :         is_core_plugin_(is_core_plugin),
    +     123          97 :         fun_get_hdg_(fun_get_hdg) {
    +     124          97 :   }
    +     125             : 
    +     126         194 :   ~LatGeneric(void) {
    +     127         194 :   }
    +     128             : 
    +     129             :   void initialize(ros::NodeHandle &nh, const std::shared_ptr<CommonHandlers_t> &ch, const std::shared_ptr<PrivateHandlers_t> &ph) override;
    +     130             :   bool start(void) override;
    +     131             :   bool pause(void) override;
    +     132             :   bool reset(void) override;
    +     133             : 
    +     134             :   double getState(const int &state_idx_in) const override;
    +     135             :   double getState(const int &state_id_in, const int &axis_in) const override;
    +     136             : 
    +     137             :   void setState(const double &state_in, const int &state_idx_in) override;
    +     138             :   void setState(const double &state_in, const int &state_id_in, const int &axis_in) override;
    +     139             : 
    +     140             :   states_t getStates(void) const override;
    +     141             :   void     setStates(const states_t &states_in) override;
    +     142             : 
    +     143             :   double getCovariance(const int &state_idx_in) const override;
    +     144             :   double getCovariance(const int &state_id_in, const int &axis_in) const override;
    +     145             : 
    +     146             :   covariance_t getCovarianceMatrix(void) const override;
    +     147             :   void         setCovarianceMatrix(const covariance_t &cov_in) override;
    +     148             : 
    +     149             :   double getInnovation(const int &state_idx) const override;
    +     150             :   double getInnovation(const int &state_id_in, const int &axis_in) const override;
    +     151             : 
    +     152             :   void setDt(const double &dt);
    +     153             :   void setInputCoeff(const double &input_coeff);
    +     154             : 
    +     155             :   void generateRepredictorModels(const double input_coeff);
    +     156             : 
    +     157             :   void generateA();
    +     158             :   void generateB();
    +     159             : 
    +     160             :   std::string getNamespacedName() const;
    +     161             : 
    +     162             :   std::string getPrintName() const;
    +     163             : };
    +     164             : }  // namespace mrs_uav_state_estimators
    +     165             : 
    +     166             : #endif  // ESTIMATORS_LATERAL_LAT_GENERIC_H
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lat_generic.h.gcov.overview.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lat_generic.h.gcov.overview.html new file mode 100644 index 0000000000..f10b1f5fd4 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lat_generic.h.gcov.overview.html @@ -0,0 +1,62 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lat_generic.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lat_generic.h.gcov.png b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lat_generic.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..6fa70431bbed0c82bdfc8693d0379281e7228df2 GIT binary patch literal 708 zcmV;#0z3VQP)00{{R3zw{NF0000OP)t-s|NsB0 zs;a7|?_FK${{R500003000620&P%hU00009a7bBm000ie000ie0hKEb8vpKi;y_O zOB%{}8Z7WkVq8Vb85a;TMu+qO%z?qqs6t!d`_Ki(-X4L2*k+}t7^nPr@-bN4TCPl_ zAGp6E9d7CK7+_eqUf?z7BcRy=1apRLR>%N^9({@URod!l4E(Mq!gNnhOh#%nr`xJF z0&gcCa`_Kj2fR~XXGX)?Of0kTg4lj1u0XNaX4Yj}%I_Dq9E>oi0UM9B2aPcLmq6+; z8SRj4#@J{W09l#!j6(GZlPQ;|JTn?&hqW1v0Y)_RlK8rk90QMZNdi37H%47_7c7NB zOri%l;k@Xz1ZB76BAWEk^e%km5%UsOeFKDr$-Ws)8B`WmUuTojJrVIpXJz-)Q?=Qo z_U~}{q)@~Zrvmbe*OZrB)>9@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lateral_estimator.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral - lateral_estimator.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:44100.0 %
    Date:2024-04-18 23:11:36Functions:2366.7 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::LateralEstimator<6>::~LateralEstimator()0
    mrs_uav_state_estimators::LateralEstimator<6>::LateralEstimator(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)97
    mrs_uav_state_estimators::LateralEstimator<6>::~LateralEstimator().297
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lateral_estimator.h.func.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lateral_estimator.h.func.html new file mode 100644 index 0000000000..94b33f4a69 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lateral_estimator.h.func.html @@ -0,0 +1,92 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lateral_estimator.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral - lateral_estimator.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:44100.0 %
    Date:2024-04-18 23:11:36Functions:2366.7 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::LateralEstimator<6>::LateralEstimator(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)97
    mrs_uav_state_estimators::LateralEstimator<6>::~LateralEstimator()0
    mrs_uav_state_estimators::LateralEstimator<6>::~LateralEstimator().297
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lateral_estimator.h.gcov.frameset.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lateral_estimator.h.gcov.frameset.html new file mode 100644 index 0000000000..421acedc4b --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lateral_estimator.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lateral_estimator.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lateral_estimator.h.gcov.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lateral_estimator.h.gcov.html new file mode 100644 index 0000000000..58439dc9a9 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lateral_estimator.h.gcov.html @@ -0,0 +1,122 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lateral_estimator.h + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral - lateral_estimator.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:44100.0 %
    Date:2024-04-18 23:11:36Functions:2366.7 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #ifndef ESTIMATORS_LATERAL_LATERAL_ESTIMATOR_H
    +       2             : #define ESTIMATORS_LATERAL_LATERAL_ESTIMATOR_H
    +       3             : 
    +       4             : /* includes //{ */
    +       5             : 
    +       6             : #include <mrs_uav_state_estimators/estimators/partial_estimator.h>
    +       7             : 
    +       8             : //}
    +       9             : 
    +      10             : namespace mrs_uav_state_estimators
    +      11             : {
    +      12             : 
    +      13             : namespace lateral
    +      14             : {
    +      15             : const char type[] = "LATERAL";
    +      16             : const int  n_axes = 2;
    +      17             : }  // namespace lateral
    +      18             : 
    +      19             : template <int n_states>
    +      20             : class LateralEstimator : public PartialEstimator<n_states, lateral::n_axes> {
    +      21             : 
    +      22             : protected:
    +      23          97 :   LateralEstimator(const std::string& name, const std::string& frame_id) : PartialEstimator<n_states, lateral::n_axes>(lateral::type, name, frame_id) {
    +      24          97 :   }
    +      25             : 
    +      26          97 :   ~LateralEstimator(void) {
    +      27          97 :   }
    +      28             : 
    +      29             : private:
    +      30             :   static const int _n_axes_   = lateral::n_axes;
    +      31             :   static const int _n_states_ = n_states;
    +      32             :   static const int _n_inputs_;
    +      33             :   static const int _n_measurements_;
    +      34             : };
    +      35             : 
    +      36             : }  // namespace mrs_uav_state_estimation
    +      37             : 
    +      38             : #endif  // ESTIMATORS_LATERAL_LATERAL_ESTIMATOR_H
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lateral_estimator.h.gcov.overview.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lateral_estimator.h.gcov.overview.html new file mode 100644 index 0000000000..e5433d137d --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lateral_estimator.h.gcov.overview.html @@ -0,0 +1,30 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lateral_estimator.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lateral_estimator.h.gcov.png b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/lateral/lateral_estimator.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..463fd4e692090c58e2404f8d94bb0a27bf35e9a1 GIT binary patch literal 284 zcmeAS@N?(olHy`uVBq!ia0vp^0YI$A!VDxAx-dEcDTx4|5ZC|z|E~gqo(Lf);IkB zKih&OP$28bu>u3%=xv5Up%7}X91nEC!(6qssq(S1+&l+1@+JxwXI-pyIterm(k zm#tmhJg2gI`;Ii4a?1#x-QnJ|iaF^W_vhMMmm^Nj4*76q=hq`i%l+g3ZEcx6r(A$z z@!KPZZk1oD-*7BGC5Pd7uj5YR+DC>{-?qhe>=g-rWL$nv%v)pLp`KFjGVv_k6V;t& ZA77ZC+PdV^7oe*dJYD@<);T3K0RRatb^`za literal 0 HcmV?d00001 diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/partial_estimator.h.func-sort-c.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/partial_estimator.h.func-sort-c.html new file mode 100644 index 0000000000..1dcc49c832 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/partial_estimator.h.func-sort-c.html @@ -0,0 +1,176 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/partial_estimator.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators - partial_estimator.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:343694.4 %
    Date:2024-04-18 23:11:36Functions:192479.2 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::PartialEstimator<2, 1>::~PartialEstimator()0
    mrs_uav_state_estimators::PartialEstimator<3, 1>::~PartialEstimator()0
    mrs_uav_state_estimators::PartialEstimator<6, 2>::~PartialEstimator()0
    void mrs_uav_state_estimators::PartialEstimator<2, 1>::publishInput<Eigen::Matrix<double, 1, 1, 0, 1, 1> >(Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, ros::Time const&) const0
    mrs_uav_state_estimators::PartialEstimator<2, 1>::stateIdToIndex(int const&, int const&) const0
    mrs_uav_state_estimators::PartialEstimator<2, 1>::PartialEstimator(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)97
    mrs_uav_state_estimators::PartialEstimator<2, 1>::~PartialEstimator().297
    mrs_uav_state_estimators::PartialEstimator<6, 2>::PartialEstimator(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)97
    mrs_uav_state_estimators::PartialEstimator<6, 2>::~PartialEstimator().297
    mrs_uav_state_estimators::PartialEstimator<3, 1>::PartialEstimator(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)167
    mrs_uav_state_estimators::PartialEstimator<3, 1>::~PartialEstimator().2167
    mrs_uav_state_estimators::PartialEstimator<3, 1>::stateIdToIndex(int const&, int const&) const141354
    mrs_uav_state_estimators::PartialEstimator<6, 2>::getCovarianceAsVector() const171841
    void mrs_uav_state_estimators::PartialEstimator<6, 2>::publishInput<Eigen::Matrix<double, 2, 1, 0, 2, 1> >(Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, ros::Time const&) const171843
    mrs_uav_state_estimators::PartialEstimator<6, 2>::getStatesAsVector() const171859
    mrs_uav_state_estimators::PartialEstimator<6, 2>::publishOutput() const171860
    mrs_uav_state_estimators::PartialEstimator<2, 1>::getCovarianceAsVector() const189996
    mrs_uav_state_estimators::PartialEstimator<2, 1>::getStatesAsVector() const190009
    mrs_uav_state_estimators::PartialEstimator<2, 1>::publishOutput() const190010
    mrs_uav_state_estimators::PartialEstimator<3, 1>::publishOutput() const293529
    mrs_uav_state_estimators::PartialEstimator<3, 1>::getCovarianceAsVector() const293540
    void mrs_uav_state_estimators::PartialEstimator<3, 1>::publishInput<Eigen::Matrix<double, 1, 1, 0, 1, 1> >(Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, ros::Time const&) const293550
    mrs_uav_state_estimators::PartialEstimator<3, 1>::getStatesAsVector() const293728
    mrs_uav_state_estimators::PartialEstimator<6, 2>::stateIdToIndex(int const&, int const&) const2570872
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/partial_estimator.h.func.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/partial_estimator.h.func.html new file mode 100644 index 0000000000..d2f0c09f81 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/partial_estimator.h.func.html @@ -0,0 +1,176 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/partial_estimator.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators - partial_estimator.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:343694.4 %
    Date:2024-04-18 23:11:36Functions:192479.2 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::PartialEstimator<2, 1>::PartialEstimator(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)97
    mrs_uav_state_estimators::PartialEstimator<2, 1>::~PartialEstimator()0
    mrs_uav_state_estimators::PartialEstimator<2, 1>::~PartialEstimator().297
    mrs_uav_state_estimators::PartialEstimator<3, 1>::PartialEstimator(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)167
    mrs_uav_state_estimators::PartialEstimator<3, 1>::~PartialEstimator()0
    mrs_uav_state_estimators::PartialEstimator<3, 1>::~PartialEstimator().2167
    mrs_uav_state_estimators::PartialEstimator<6, 2>::PartialEstimator(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)97
    mrs_uav_state_estimators::PartialEstimator<6, 2>::~PartialEstimator()0
    mrs_uav_state_estimators::PartialEstimator<6, 2>::~PartialEstimator().297
    void mrs_uav_state_estimators::PartialEstimator<2, 1>::publishInput<Eigen::Matrix<double, 1, 1, 0, 1, 1> >(Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, ros::Time const&) const0
    mrs_uav_state_estimators::PartialEstimator<2, 1>::publishOutput() const190010
    mrs_uav_state_estimators::PartialEstimator<2, 1>::stateIdToIndex(int const&, int const&) const0
    mrs_uav_state_estimators::PartialEstimator<2, 1>::getStatesAsVector() const190009
    mrs_uav_state_estimators::PartialEstimator<2, 1>::getCovarianceAsVector() const189996
    void mrs_uav_state_estimators::PartialEstimator<3, 1>::publishInput<Eigen::Matrix<double, 1, 1, 0, 1, 1> >(Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, ros::Time const&) const293550
    mrs_uav_state_estimators::PartialEstimator<3, 1>::publishOutput() const293529
    mrs_uav_state_estimators::PartialEstimator<3, 1>::stateIdToIndex(int const&, int const&) const141354
    mrs_uav_state_estimators::PartialEstimator<3, 1>::getStatesAsVector() const293728
    mrs_uav_state_estimators::PartialEstimator<3, 1>::getCovarianceAsVector() const293540
    void mrs_uav_state_estimators::PartialEstimator<6, 2>::publishInput<Eigen::Matrix<double, 2, 1, 0, 2, 1> >(Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, ros::Time const&) const171843
    mrs_uav_state_estimators::PartialEstimator<6, 2>::publishOutput() const171860
    mrs_uav_state_estimators::PartialEstimator<6, 2>::stateIdToIndex(int const&, int const&) const2570872
    mrs_uav_state_estimators::PartialEstimator<6, 2>::getStatesAsVector() const171859
    mrs_uav_state_estimators::PartialEstimator<6, 2>::getCovarianceAsVector() const171841
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/partial_estimator.h.gcov.frameset.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/partial_estimator.h.gcov.frameset.html new file mode 100644 index 0000000000..c351510cb2 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/partial_estimator.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/partial_estimator.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/partial_estimator.h.gcov.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/partial_estimator.h.gcov.html new file mode 100644 index 0000000000..91eb974123 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/partial_estimator.h.gcov.html @@ -0,0 +1,264 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/partial_estimator.h + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators - partial_estimator.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:343694.4 %
    Date:2024-04-18 23:11:36Functions:192479.2 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #ifndef ESTIMATORS_PARTIAL_ESTIMATOR_H
    +       2             : #define ESTIMATORS_PARTIAL_ESTIMATOR_H
    +       3             : 
    +       4             : /* includes //{ */
    +       5             : 
    +       6             : #include <ros/ros.h>
    +       7             : 
    +       8             : #include <Eigen/Dense>
    +       9             : 
    +      10             : #include <mrs_msgs/Float64Stamped.h>
    +      11             : #include <mrs_msgs/Float64ArrayStamped.h>
    +      12             : 
    +      13             : #include <mrs_msgs/EstimatorOutput.h>
    +      14             : 
    +      15             : #include <mrs_uav_managers/estimation_manager/estimator.h>
    +      16             : 
    +      17             : //}
    +      18             : 
    +      19             : namespace mrs_uav_state_estimators
    +      20             : {
    +      21             : 
    +      22             : typedef enum
    +      23             : {
    +      24             :   ELAND,
    +      25             :   SWITCH,
    +      26             :   MITIGATE,
    +      27             :   NONE
    +      28             : } ExcInnoAction_t;
    +      29             : const int n_ExcInnoAction = 4;
    +      30             : 
    +      31             : const std::map<std::string, ExcInnoAction_t> map_exc_inno_action{{"eland", ExcInnoAction_t::ELAND},
    +      32             :                                                         {"switch", ExcInnoAction_t::SWITCH},
    +      33             :                                                         {"mitigate", ExcInnoAction_t::MITIGATE},
    +      34             : {"none", ExcInnoAction_t::NONE}};
    +      35             : 
    +      36             : template <int n_states, int n_axes>
    +      37             : class PartialEstimator : public mrs_uav_managers::Estimator {
    +      38             : 
    +      39             : public:
    +      40             :   typedef Eigen::Matrix<double, n_states, 1>        states_t;
    +      41             :   typedef Eigen::Matrix<double, n_states, n_states> covariance_t;
    +      42             : 
    +      43             : protected:
    +      44             :   mutable mrs_lib::PublisherHandler<mrs_msgs::EstimatorOutput>     ph_output_;
    +      45             :   mutable mrs_lib::PublisherHandler<mrs_msgs::Float64ArrayStamped> ph_input_;
    +      46             : 
    +      47             :   bool first_iter_ = true;
    +      48             : 
    +      49             :   double pos_innovation_limit_;
    +      50             :   ExcInnoAction_t exc_innovation_action_;
    +      51             :   std::string exc_innovation_action_name_;
    +      52             :   bool innovation_ok_ = true;
    +      53             : 
    +      54             : private:
    +      55             :   static const int _n_axes_   = n_axes;
    +      56             :   static const int _n_states_ = n_states;
    +      57             :   static const int _n_inputs_;
    +      58             :   static const int _n_measurements_;
    +      59             : 
    +      60             : public:
    +      61         361 :   PartialEstimator(const std::string &type, const std::string &name, const std::string &frame_id) : Estimator(type, name, frame_id) {
    +      62         361 :   }
    +      63             : 
    +      64         361 :   ~PartialEstimator(void) {
    +      65         361 :   }
    +      66             : 
    +      67             :   //  methods
    +      68             :   virtual double getState(const int &state_idx_in) const                    = 0;
    +      69             :   virtual double getState(const int &state_id_in, const int &axis_in) const = 0;
    +      70             : 
    +      71             :   virtual void setState(const double &state_in, const int &state_idx_in)                    = 0;
    +      72             :   virtual void setState(const double &state_in, const int &state_id_in, const int &axis_in) = 0;
    +      73             : 
    +      74             :   virtual states_t getStates(void) const                = 0;
    +      75             :   virtual void     setStates(const states_t &states_in) = 0;
    +      76             : 
    +      77             :   virtual double getCovariance(const int &state_idx_in) const                    = 0;
    +      78             :   virtual double getCovariance(const int &state_id_in, const int &axis_in) const = 0;
    +      79             : 
    +      80             :   virtual covariance_t getCovarianceMatrix(void) const                 = 0;
    +      81             :   virtual void         setCovarianceMatrix(const covariance_t &cov_in) = 0;
    +      82             : 
    +      83             :   virtual double getInnovation(const int &state_idx) const                       = 0;
    +      84             :   virtual double getInnovation(const int &state_id_in, const int &axis_in) const = 0;
    +      85             : 
    +      86             :   // implemented methods
    +      87             :   // access methods
    +      88             :   std::vector<double> getStatesAsVector(void) const;
    +      89             :   std::vector<double> getCovarianceAsVector(void) const;
    +      90             : 
    +      91             :   int stateIdToIndex(const int &state_id_in, const int &axis_in) const;
    +      92             : 
    +      93             :   template <typename u_t>
    +      94             :   void publishInput(const u_t &u, const ros::Time& stamp) const;
    +      95             :   void publishOutput() const;
    +      96             : };
    +      97             : 
    +      98             : /*//{ method implementations */
    +      99             : 
    +     100             : /*//{ getStatesAsvector() */
    +     101             : template <int n_states, int n_axes>
    +     102      655596 : std::vector<double> PartialEstimator<n_states, n_axes>::getStatesAsVector(void) const {
    +     103      655596 :   const states_t      states = getStates();
    +     104      655264 :   std::vector<double> states_vec;
    +     105             :   /* for (auto st : Eigen::MatrixXd::Map(states, states.size(), 1).rowwise()) { */
    +     106             :   /*   states_vec.push_back(*st); */
    +     107             :   /* } */
    +     108     2946296 :   for (int i = 0; i < states.size(); i++) {
    +     109     2290147 :     states_vec.push_back(states(i));
    +     110             :   }
    +     111     1310100 :   return states_vec;
    +     112             : }
    +     113             : /*//}*/
    +     114             : 
    +     115             : /*//{ getCovarianceAsvector() */
    +     116             : template <int n_states, int n_axes>
    +     117      655377 : std::vector<double> PartialEstimator<n_states, n_axes>::getCovarianceAsVector(void) const {
    +     118      655377 :   const covariance_t  covariance = getCovarianceMatrix();
    +     119      655198 :   std::vector<double> covariance_vec;
    +     120             :   /* for (auto cov : covariance.reshaped<Eigen::RowMajor>(covariance.size())) { */
    +     121             :   /*   covariance_vec.push_back(*cov); */
    +     122             :   /* } */
    +     123     2944602 :   for (int i = 0; i < covariance.rows(); i++) {
    +     124    11874745 :     for (int j = 0; j < covariance.cols(); j++) {
    +     125     9583424 :       covariance_vec.push_back(covariance(i, j));
    +     126             :     }
    +     127             :   }
    +     128     1310108 :   return covariance_vec;
    +     129             : }
    +     130             : /*//}*/
    +     131             : 
    +     132             : /*//{ stateIdToIndex() */
    +     133             : template <int n_states, int n_axes>
    +     134     2712226 : int PartialEstimator<n_states, n_axes>::stateIdToIndex(const int &state_id_in, const int &axis_in) const {
    +     135     2712226 :   return state_id_in * _n_axes_ + axis_in;
    +     136             : }
    +     137             : /*//}*/
    +     138             : 
    +     139             : /*//{ publishOutput() */
    +     140             : template <int n_states, int n_axes>
    +     141      655399 : void PartialEstimator<n_states, n_axes>::publishOutput() const {
    +     142             : 
    +     143      655399 :   if (!ch_->debug_topics.output) {
    +     144           0 :     return;
    +     145             :   }
    +     146             : 
    +     147     1310656 :   mrs_msgs::EstimatorOutput msg;
    +     148      654910 :   msg.header.stamp    = ros::Time::now();
    +     149      655666 :   msg.header.frame_id = getFrameId();
    +     150      655592 :   msg.state           = getStatesAsVector();
    +     151      654523 :   msg.covariance      = getCovarianceAsVector();
    +     152             : 
    +     153      654890 :   ph_output_.publish(msg);
    +     154             : }
    +     155             : /*//}*/
    +     156             : 
    +     157             : /*//{ publishInput() */
    +     158             : template <int n_states, int n_axes>
    +     159             : template <typename u_t>
    +     160      465393 : void PartialEstimator<n_states, n_axes>::publishInput(const u_t &u, const ros::Time& stamp) const {
    +     161             : 
    +     162      465393 :   if (!ch_->debug_topics.input) {
    +     163           0 :     return;
    +     164             :   }
    +     165             : 
    +     166      927578 :   mrs_msgs::Float64ArrayStamped msg;
    +     167      461816 :   msg.header.stamp = stamp;
    +     168     1097487 :   for (int i = 0; i < u.rows(); i++) {
    +     169      632385 :     msg.values.push_back(u(i));
    +     170             :   }
    +     171             : 
    +     172      462068 :   ph_input_.publish(msg);
    +     173             : }
    +     174             : /*//}*/
    +     175             : 
    +     176             : /*//}*/
    +     177             : 
    +     178             : }  // namespace mrs_uav_state_estimators
    +     179             : 
    +     180             : #endif  // ESTIMATORS_PARTIAL_ESTIMATOR_H
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/partial_estimator.h.gcov.overview.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/partial_estimator.h.gcov.overview.html new file mode 100644 index 0000000000..53598245fe --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/partial_estimator.h.gcov.overview.html @@ -0,0 +1,65 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/partial_estimator.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/partial_estimator.h.gcov.png b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/partial_estimator.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..93d0059d99c5276a3d7504dec305b703e9c2544a GIT binary patch literal 820 zcmV-41Izr0P)#@C3`iKnVY{!^>+5Ti^XbD$B2m^_W4WoO!9duo z-Z{-(9>Tbpej>C6<5QG`Q7+>dxK-<6*Z26^G2WBM?U2rlwQ_sF$2}iC0|0T?a9!ck zg>`^>HmCq%_a91pWDKyA&VN=4)q}|BGh<*HIJKkuYKn{|reXw2nyRkHw7C)p9=|=8 zJf37-gC?-NI3Fb>v4-o~l*%hZ1|H`-6=~9h9*J&(k;+U6hE`fcpJ2VZX3tx*J~F4_ z6Fjok@yeitW}v`5P9f_8l%n83IAW0yE8emebLqF=f7bZh?LTVq3uFp|1t4+l1@=F1 ztt?uhL$*njS;MT?!ZhjtP5#@=E}-~KCQPG&Mu7rNnwV3r%M>8lavpo!J_zved3D+H zI$F{d)j;S2ODoMy#2h={=7dCRL$fY(AX4Y&-flD0o}gsJa?UZ`?RXU(XhtvXO0enC9pfUx%Sy + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/stateHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:99100.0 %
    Date:2024-04-18 23:11:36Functions:5683.3 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    state_generic.h +
    100.0%
    +
    100.0 %5 / 566.7 %2 / 3
    <unnamed>100.0 %5 / 566.7 %2 / 3
    passthrough.h +
    100.0%
    +
    100.0 %4 / 4100.0 %3 / 3
    <unnamed>100.0 %4 / 4100.0 %3 / 3
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/index-detail-sort-l.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/index-detail-sort-l.html new file mode 100644 index 0000000000..d0e9ecb461 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/index-detail-sort-l.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/stateHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:99100.0 %
    Date:2024-04-18 23:11:36Functions:5683.3 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    passthrough.h +
    100.0%
    +
    100.0 %4 / 4100.0 %3 / 3
    <unnamed>100.0 %4 / 4100.0 %3 / 3
    state_generic.h +
    100.0%
    +
    100.0 %5 / 566.7 %2 / 3
    <unnamed>100.0 %5 / 566.7 %2 / 3
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/index-detail.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/index-detail.html new file mode 100644 index 0000000000..85f57aea59 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/index-detail.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/stateHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:99100.0 %
    Date:2024-04-18 23:11:36Functions:5683.3 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    passthrough.h +
    100.0%
    +
    100.0 %4 / 4100.0 %3 / 3
    <unnamed>100.0 %4 / 4100.0 %3 / 3
    state_generic.h +
    100.0%
    +
    100.0 %5 / 566.7 %2 / 3
    <unnamed>100.0 %5 / 566.7 %2 / 3
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/index-sort-f.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/index-sort-f.html new file mode 100644 index 0000000000..30c4e994ce --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/index-sort-f.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/stateHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:99100.0 %
    Date:2024-04-18 23:11:36Functions:5683.3 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    state_generic.h +
    100.0%
    +
    100.0 %5 / 566.7 %2 / 3
    passthrough.h +
    100.0%
    +
    100.0 %4 / 4100.0 %3 / 3
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/index-sort-l.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/index-sort-l.html new file mode 100644 index 0000000000..87fbffa621 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/index-sort-l.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/stateHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:99100.0 %
    Date:2024-04-18 23:11:36Functions:5683.3 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    passthrough.h +
    100.0%
    +
    100.0 %4 / 4100.0 %3 / 3
    state_generic.h +
    100.0%
    +
    100.0 %5 / 566.7 %2 / 3
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/index.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/index.html new file mode 100644 index 0000000000..e4b8969a68 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/index.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/stateHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:99100.0 %
    Date:2024-04-18 23:11:36Functions:5683.3 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    passthrough.h +
    100.0%
    +
    100.0 %4 / 4100.0 %3 / 3
    state_generic.h +
    100.0%
    +
    100.0 %5 / 566.7 %2 / 3
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/passthrough.h.func-sort-c.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/passthrough.h.func-sort-c.html new file mode 100644 index 0000000000..e49ff72864 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/passthrough.h.func-sort-c.html @@ -0,0 +1,92 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/passthrough.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state - passthrough.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:44100.0 %
    Date:2024-04-18 23:11:36Functions:33100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::passthrough::Passthrough::Passthrough()1
    mrs_uav_state_estimators::passthrough::Passthrough::~Passthrough()1
    mrs_uav_state_estimators::passthrough::Passthrough::~Passthrough().21
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/passthrough.h.func.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/passthrough.h.func.html new file mode 100644 index 0000000000..3ae48d9f2a --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/passthrough.h.func.html @@ -0,0 +1,92 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/passthrough.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state - passthrough.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:44100.0 %
    Date:2024-04-18 23:11:36Functions:33100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::passthrough::Passthrough::Passthrough()1
    mrs_uav_state_estimators::passthrough::Passthrough::~Passthrough()1
    mrs_uav_state_estimators::passthrough::Passthrough::~Passthrough().21
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/passthrough.h.gcov.frameset.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/passthrough.h.gcov.frameset.html new file mode 100644 index 0000000000..bf04eeb1cb --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/passthrough.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/passthrough.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/passthrough.h.gcov.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/passthrough.h.gcov.html new file mode 100644 index 0000000000..3c6b842678 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/passthrough.h.gcov.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/passthrough.h + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state - passthrough.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:44100.0 %
    Date:2024-04-18 23:11:36Functions:33100.0 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #ifndef ESTIMATORS_STATE_PASSTHROUGH_H
    +       2             : #define ESTIMATORS_STATE_PASSTHROUGH_H
    +       3             : 
    +       4             : /* includes //{ */
    +       5             : 
    +       6             : #include <ros/ros.h>
    +       7             : 
    +       8             : #include <nav_msgs/Odometry.h>
    +       9             : 
    +      10             : #include <mrs_lib/lkf.h>
    +      11             : #include <mrs_lib/profiler.h>
    +      12             : #include <mrs_lib/param_loader.h>
    +      13             : #include <mrs_lib/subscribe_handler.h>
    +      14             : #include <mrs_lib/publisher_handler.h>
    +      15             : #include <mrs_lib/attitude_converter.h>
    +      16             : #include <mrs_lib/transformer.h>
    +      17             : 
    +      18             : #include <mrs_uav_managers/state_estimator.h>
    +      19             : 
    +      20             : //}
    +      21             : 
    +      22             : namespace mrs_uav_state_estimators
    +      23             : {
    +      24             : 
    +      25             : namespace passthrough
    +      26             : {
    +      27             : const char name[]         = "passthrough";
    +      28             : const char frame_id[]     = "passthrough_origin";
    +      29             : const char package_name[] = "mrs_uav_state_estimators";
    +      30             : 
    +      31             : const bool is_core_plugin = true;
    +      32             : 
    +      33             : using namespace mrs_uav_managers::estimation_manager;
    +      34             : 
    +      35             : class Passthrough : public mrs_uav_managers::StateEstimator {
    +      36             : 
    +      37             :   using CommonHandlers_t = mrs_uav_managers::estimation_manager::CommonHandlers_t;
    +      38             : 
    +      39             : private:
    +      40             :   const std::string package_name_ = "mrs_uav_state_estimators";
    +      41             : 
    +      42             :   const std::string est_lat_name_ = "lat_passthrough";
    +      43             : 
    +      44             :   const std::string est_alt_name_ = "alt_passthrough";
    +      45             : 
    +      46             :   const std::string est_hdg_name_ = "hdg_passthrough";
    +      47             : 
    +      48             :   const bool is_core_plugin_;
    +      49             : 
    +      50             :   mrs_lib::SubscribeHandler<nav_msgs::Odometry> sh_passthrough_odom_;
    +      51             :   double                                        _critical_timeout_passthrough_odom_;
    +      52             :   std::string                                   msg_topic_;
    +      53             : 
    +      54             :   ros::Timer                 timer_update_;
    +      55             :   void                       timerUpdate(const ros::TimerEvent &event);
    +      56             :   nav_msgs::OdometryConstPtr prev_msg_;
    +      57             :   bool                       first_iter_ = true;
    +      58             :   ros::Timer                 timer_check_health_;
    +      59             :   void                       timerCheckHealth(const ros::TimerEvent &event);
    +      60             : 
    +      61             :   bool isConverged();
    +      62             : 
    +      63             :   void waitForEstimationInitialization();
    +      64             : 
    +      65             : public:
    +      66           1 :   Passthrough() : StateEstimator(passthrough::name, passthrough::frame_id, passthrough::package_name), is_core_plugin_(is_core_plugin) {
    +      67           1 :   }
    +      68             : 
    +      69           2 :   ~Passthrough(void) {
    +      70           2 :   }
    +      71             : 
    +      72             :   void initialize(ros::NodeHandle &nh, const std::shared_ptr<CommonHandlers_t> &ch, const std::shared_ptr<PrivateHandlers_t> &ph) override;
    +      73             :   bool start(void) override;
    +      74             :   bool pause(void) override;
    +      75             :   bool reset(void) override;
    +      76             : 
    +      77             :   /* mrs_msgs::UavState  getUavState() override; */
    +      78             :   /* nav_msgs::Odometry  getInnovation() const override; */
    +      79             :   /* std::vector<double> getPoseCovariance() const override; */
    +      80             :   /* std::vector<double> getTwistCovariance() const override; */
    +      81             : 
    +      82             :   bool setUavState(const mrs_msgs::UavState &uav_state) override;
    +      83             : };
    +      84             : 
    +      85             : }  // namespace passthrough
    +      86             : 
    +      87             : }  // namespace mrs_uav_state_estimators
    +      88             : 
    +      89             : #endif  // ESTIMATORS_STATE_PASSTHROUGH_H
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/passthrough.h.gcov.overview.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/passthrough.h.gcov.overview.html new file mode 100644 index 0000000000..88d95237e0 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/passthrough.h.gcov.overview.html @@ -0,0 +1,43 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/passthrough.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/passthrough.h.gcov.png b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/passthrough.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..e44c5c845709562b6df9a8255e423f99ae0ac942 GIT binary patch literal 431 zcmV;g0Z{&lP)0000OP)t-s|NsB0 zs;a7|?_FK${{R500003000620&P%hU00009a7bBm000ie000ie0hKEb8vpfO*y3~prpJEFVmUx_krB1ErfufwoNp%&};z`6IVHe zcp7+wCJ?=_l=#9mnq$p<=SVIGyJdG{!>EreX941!LoLd-1=^Nd$^p8)B+kWgO+ibE+Soi~>yX!XLzaeKefFguZm-q|K zRsu&L69)Xr&V>2cwV0%$x?)mMi23O}bC|&P2;J)0x8LW + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/state_generic.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state - state_generic.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:55100.0 %
    Date:2024-04-18 23:11:36Functions:2366.7 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::StateGeneric::~StateGeneric()0
    mrs_uav_state_estimators::StateGeneric::StateGeneric(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)97
    mrs_uav_state_estimators::StateGeneric::~StateGeneric().297
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/state_generic.h.func.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/state_generic.h.func.html new file mode 100644 index 0000000000..e5b06cb498 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/state_generic.h.func.html @@ -0,0 +1,92 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/state_generic.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state - state_generic.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:55100.0 %
    Date:2024-04-18 23:11:36Functions:2366.7 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::StateGeneric::StateGeneric(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)97
    mrs_uav_state_estimators::StateGeneric::~StateGeneric()0
    mrs_uav_state_estimators::StateGeneric::~StateGeneric().297
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/state_generic.h.gcov.frameset.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/state_generic.h.gcov.frameset.html new file mode 100644 index 0000000000..fa3e046124 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/state_generic.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/state_generic.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/state_generic.h.gcov.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/state_generic.h.gcov.html new file mode 100644 index 0000000000..e9f1b9ce13 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/state_generic.h.gcov.html @@ -0,0 +1,183 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/state_generic.h + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state - state_generic.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:55100.0 %
    Date:2024-04-18 23:11:36Functions:2366.7 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #ifndef ESTIMATORS_STATE_STATE_GENERIC_H
    +       2             : #define ESTIMATORS_STATE_STATE_GENERIC_H
    +       3             : 
    +       4             : /* includes //{ */
    +       5             : 
    +       6             : #include <ros/ros.h>
    +       7             : 
    +       8             : #include <nav_msgs/Odometry.h>
    +       9             : 
    +      10             : #include <mrs_lib/lkf.h>
    +      11             : #include <mrs_lib/profiler.h>
    +      12             : #include <mrs_lib/param_loader.h>
    +      13             : #include <mrs_lib/subscribe_handler.h>
    +      14             : #include <mrs_lib/publisher_handler.h>
    +      15             : #include <mrs_lib/attitude_converter.h>
    +      16             : #include <mrs_lib/transformer.h>
    +      17             : 
    +      18             : #include <mrs_uav_managers/state_estimator.h>
    +      19             : 
    +      20             : #include <mrs_uav_state_estimators/estimators/lateral/lat_generic.h>
    +      21             : #include <mrs_uav_state_estimators/estimators/altitude/alt_generic.h>
    +      22             : #include <mrs_uav_state_estimators/estimators/heading/heading_estimator.h>
    +      23             : #include <mrs_uav_state_estimators/estimators/heading/hdg_generic.h>
    +      24             : #include <mrs_uav_state_estimators/estimators/heading/hdg_passthrough.h>
    +      25             : 
    +      26             : //}
    +      27             : 
    +      28             : namespace mrs_uav_state_estimators
    +      29             : {
    +      30             : 
    +      31             : namespace hdg_estimator
    +      32             : {
    +      33             : const int n_states = 2;
    +      34             : }  // namespace hdg_estimator
    +      35             : 
    +      36             : namespace state_generic
    +      37             : {
    +      38             : const char package_name[] = "mrs_uav_state_estimators";
    +      39             : }
    +      40             : 
    +      41             : class StateGeneric : public mrs_uav_managers::StateEstimator {
    +      42             : 
    +      43             : private:
    +      44             :   std::unique_ptr<LatGeneric> est_lat_;
    +      45             :   std::string                 est_lat_name_;
    +      46             : 
    +      47             :   std::unique_ptr<AltGeneric> est_alt_;
    +      48             :   std::string                 est_alt_name_;
    +      49             : 
    +      50             :   bool                                                       is_hdg_passthrough_;
    +      51             :   std::unique_ptr<HeadingEstimator<hdg_estimator::n_states>> est_hdg_;
    +      52             :   std::string                                                est_hdg_name_;
    +      53             : 
    +      54             :   bool is_override_frame_id_;
    +      55             : 
    +      56             :   const bool is_core_plugin_;
    +      57             : 
    +      58             :   std::string                                                 topic_orientation_;
    +      59             :   mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped> sh_hw_api_orient_;
    +      60             : 
    +      61             :   std::string                                              topic_angular_velocity_;
    +      62             :   mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped> sh_hw_api_ang_vel_;
    +      63             : 
    +      64             :   ros::Timer timer_update_;
    +      65             :   void       timerUpdate(const ros::TimerEvent &event);
    +      66             : 
    +      67             :   ros::Timer timer_check_health_;
    +      68             :   void       timerCheckHealth(const ros::TimerEvent &event);
    +      69             : 
    +      70             :   ros::Timer timer_pub_attitude_;
    +      71             :   void       timerPubAttitude(const ros::TimerEvent &event);
    +      72             : 
    +      73             :   bool isConverged();
    +      74             : 
    +      75             :   void waitForEstimationInitialization();
    +      76             : 
    +      77             : public:
    +      78          97 :   StateGeneric(const std::string &name, const bool is_core_plugin)
    +      79          97 :       : StateEstimator(name, name + "_origin", state_generic::package_name), is_core_plugin_(is_core_plugin) {
    +      80          97 :   }
    +      81             : 
    +      82          97 :   ~StateGeneric(void) {
    +      83          97 :   }
    +      84             : 
    +      85             :   void initialize(ros::NodeHandle &parent_nh, const std::shared_ptr<CommonHandlers_t> &ch, const std::shared_ptr<PrivateHandlers_t> &ph) override;
    +      86             :   bool start(void) override;
    +      87             :   bool pause(void) override;
    +      88             :   bool reset(void) override;
    +      89             : 
    +      90             :   bool setUavState(const mrs_msgs::UavState &uav_state) override;
    +      91             : 
    +      92             :   std::optional<double> getHeading() const;
    +      93             : 
    +      94             :   void updateUavState();
    +      95             : };
    +      96             : 
    +      97             : }  // namespace mrs_uav_state_estimators
    +      98             : 
    +      99             : #endif  // ESTIMATORS_STATE_STATE_GENERIC_H
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/state_generic.h.gcov.overview.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/state_generic.h.gcov.overview.html new file mode 100644 index 0000000000..e38bed99a7 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/state_generic.h.gcov.overview.html @@ -0,0 +1,45 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/state_generic.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/state_generic.h.gcov.png b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/estimators/state/state_generic.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..ce4b3647eeeb837a14b19ec628cfa1df6eb92a02 GIT binary patch literal 438 zcmV;n0ZIOeP)Vz^Tt*~F@W@P<*6F01U09LCdGFD)a8j6o=J2p{;vfxW zTmvR#CNa*UrHl>IXwIO>SPp5cm|>sc#=+(ZuNG^GMUk{ zQBea#8B8mCE@mK|!s=en1Db;rbN#@)cC_5>SiyMbUa9H0Ar&dg*Fr-I gkFgQlPPSmrA6JucjdQ-?RR91007*qoM6N<$f^ZwfOaK4? literal 0 HcmV?d00001 diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/index-detail-sort-f.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/index-detail-sort-f.html new file mode 100644 index 0000000000..dba94fb2ce --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/index-detail-sort-f.html @@ -0,0 +1,182 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processorsHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:13218471.7 %
    Date:2024-04-18 23:11:36Functions:173450.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    proc_excessive_tilt.h +
    68.3%68.3%
    +
    68.3 %28 / 4133.3 %2 / 6
    <unnamed>68.3 %28 / 4133.3 %2 / 6
    proc_median_filter.h +
    63.9%63.9%
    +
    63.9 %23 / 3633.3 %2 / 6
    <unnamed>63.9 %23 / 3633.3 %2 / 6
    proc_tf_to_world.h +
    78.9%78.9%
    +
    78.9 %45 / 5737.5 %3 / 8
    <unnamed>78.9 %45 / 5737.5 %3 / 8
    proc_saturate.h +
    72.5%72.5%
    +
    72.5 %29 / 4066.7 %4 / 6
    <unnamed>72.5 %29 / 4066.7 %4 / 6
    processor.h +
    70.0%70.0%
    +
    70.0 %7 / 1075.0 %6 / 8
    <unnamed>70.0 %7 / 1075.0 %6 / 8
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/index-detail-sort-l.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/index-detail-sort-l.html new file mode 100644 index 0000000000..16b80fe196 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/index-detail-sort-l.html @@ -0,0 +1,182 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processorsHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:13218471.7 %
    Date:2024-04-18 23:11:36Functions:173450.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    proc_median_filter.h +
    63.9%63.9%
    +
    63.9 %23 / 3633.3 %2 / 6
    <unnamed>63.9 %23 / 3633.3 %2 / 6
    proc_excessive_tilt.h +
    68.3%68.3%
    +
    68.3 %28 / 4133.3 %2 / 6
    <unnamed>68.3 %28 / 4133.3 %2 / 6
    processor.h +
    70.0%70.0%
    +
    70.0 %7 / 1075.0 %6 / 8
    <unnamed>70.0 %7 / 1075.0 %6 / 8
    proc_saturate.h +
    72.5%72.5%
    +
    72.5 %29 / 4066.7 %4 / 6
    <unnamed>72.5 %29 / 4066.7 %4 / 6
    proc_tf_to_world.h +
    78.9%78.9%
    +
    78.9 %45 / 5737.5 %3 / 8
    <unnamed>78.9 %45 / 5737.5 %3 / 8
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/index-detail.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/index-detail.html new file mode 100644 index 0000000000..0f3c56fe41 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/index-detail.html @@ -0,0 +1,182 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processorsHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:13218471.7 %
    Date:2024-04-18 23:11:36Functions:173450.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    proc_excessive_tilt.h +
    68.3%68.3%
    +
    68.3 %28 / 4133.3 %2 / 6
    <unnamed>68.3 %28 / 4133.3 %2 / 6
    proc_median_filter.h +
    63.9%63.9%
    +
    63.9 %23 / 3633.3 %2 / 6
    <unnamed>63.9 %23 / 3633.3 %2 / 6
    proc_saturate.h +
    72.5%72.5%
    +
    72.5 %29 / 4066.7 %4 / 6
    <unnamed>72.5 %29 / 4066.7 %4 / 6
    proc_tf_to_world.h +
    78.9%78.9%
    +
    78.9 %45 / 5737.5 %3 / 8
    <unnamed>78.9 %45 / 5737.5 %3 / 8
    processor.h +
    70.0%70.0%
    +
    70.0 %7 / 1075.0 %6 / 8
    <unnamed>70.0 %7 / 1075.0 %6 / 8
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/index-sort-f.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/index-sort-f.html new file mode 100644 index 0000000000..ccb831b627 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/index-sort-f.html @@ -0,0 +1,142 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processorsHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:13218471.7 %
    Date:2024-04-18 23:11:36Functions:173450.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    proc_excessive_tilt.h +
    68.3%68.3%
    +
    68.3 %28 / 4133.3 %2 / 6
    proc_median_filter.h +
    63.9%63.9%
    +
    63.9 %23 / 3633.3 %2 / 6
    proc_tf_to_world.h +
    78.9%78.9%
    +
    78.9 %45 / 5737.5 %3 / 8
    proc_saturate.h +
    72.5%72.5%
    +
    72.5 %29 / 4066.7 %4 / 6
    processor.h +
    70.0%70.0%
    +
    70.0 %7 / 1075.0 %6 / 8
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/index-sort-l.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/index-sort-l.html new file mode 100644 index 0000000000..f5bcd9b1c2 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/index-sort-l.html @@ -0,0 +1,142 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processorsHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:13218471.7 %
    Date:2024-04-18 23:11:36Functions:173450.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    proc_median_filter.h +
    63.9%63.9%
    +
    63.9 %23 / 3633.3 %2 / 6
    proc_excessive_tilt.h +
    68.3%68.3%
    +
    68.3 %28 / 4133.3 %2 / 6
    processor.h +
    70.0%70.0%
    +
    70.0 %7 / 1075.0 %6 / 8
    proc_saturate.h +
    72.5%72.5%
    +
    72.5 %29 / 4066.7 %4 / 6
    proc_tf_to_world.h +
    78.9%78.9%
    +
    78.9 %45 / 5737.5 %3 / 8
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/index.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/index.html new file mode 100644 index 0000000000..fa6acfc03d --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/index.html @@ -0,0 +1,142 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processorsHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:13218471.7 %
    Date:2024-04-18 23:11:36Functions:173450.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    proc_excessive_tilt.h +
    68.3%68.3%
    +
    68.3 %28 / 4133.3 %2 / 6
    proc_median_filter.h +
    63.9%63.9%
    +
    63.9 %23 / 3633.3 %2 / 6
    proc_saturate.h +
    72.5%72.5%
    +
    72.5 %29 / 4066.7 %4 / 6
    proc_tf_to_world.h +
    78.9%78.9%
    +
    78.9 %45 / 5737.5 %3 / 8
    processor.h +
    70.0%70.0%
    +
    70.0 %7 / 1075.0 %6 / 8
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_excessive_tilt.h.func-sort-c.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_excessive_tilt.h.func-sort-c.html new file mode 100644 index 0000000000..195e79c815 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_excessive_tilt.h.func-sort-c.html @@ -0,0 +1,104 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_excessive_tilt.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors - proc_excessive_tilt.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:284168.3 %
    Date:2024-04-18 23:11:36Functions:2633.3 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::ProcExcessiveTilt<1>::reset()0
    mrs_uav_state_estimators::ProcExcessiveTilt<2>::reset()0
    mrs_uav_state_estimators::ProcExcessiveTilt<2>::process(Eigen::Matrix<double, 2, 1, 0, 2, 1>&)0
    mrs_uav_state_estimators::ProcExcessiveTilt<2>::ProcExcessiveTilt(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)0
    mrs_uav_state_estimators::ProcExcessiveTilt<1>::ProcExcessiveTilt(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)76
    mrs_uav_state_estimators::ProcExcessiveTilt<1>::process(Eigen::Matrix<double, 1, 1, 0, 1, 1>&)138796
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_excessive_tilt.h.func.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_excessive_tilt.h.func.html new file mode 100644 index 0000000000..991bea9634 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_excessive_tilt.h.func.html @@ -0,0 +1,104 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_excessive_tilt.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors - proc_excessive_tilt.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:284168.3 %
    Date:2024-04-18 23:11:36Functions:2633.3 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::ProcExcessiveTilt<1>::reset()0
    mrs_uav_state_estimators::ProcExcessiveTilt<1>::process(Eigen::Matrix<double, 1, 1, 0, 1, 1>&)138796
    mrs_uav_state_estimators::ProcExcessiveTilt<1>::ProcExcessiveTilt(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)76
    mrs_uav_state_estimators::ProcExcessiveTilt<2>::reset()0
    mrs_uav_state_estimators::ProcExcessiveTilt<2>::process(Eigen::Matrix<double, 2, 1, 0, 2, 1>&)0
    mrs_uav_state_estimators::ProcExcessiveTilt<2>::ProcExcessiveTilt(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)0
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_excessive_tilt.h.gcov.frameset.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_excessive_tilt.h.gcov.frameset.html new file mode 100644 index 0000000000..73cb0ae2b8 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_excessive_tilt.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_excessive_tilt.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_excessive_tilt.h.gcov.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_excessive_tilt.h.gcov.html new file mode 100644 index 0000000000..34de54be2b --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_excessive_tilt.h.gcov.html @@ -0,0 +1,206 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_excessive_tilt.h + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors - proc_excessive_tilt.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:284168.3 %
    Date:2024-04-18 23:11:36Functions:2633.3 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #pragma once
    +       2             : #ifndef PROCESSORS_PROC_EXCESSIVE_TILT_H
    +       3             : #define PROCESSORS_PROC_EXCESSIVE_TILT_H
    +       4             : 
    +       5             : #include <mrs_uav_state_estimators/processors/processor.h>
    +       6             : 
    +       7             : #include <mrs_lib/param_loader.h>
    +       8             : #include <mrs_lib/subscribe_handler.h>
    +       9             : #include <mrs_lib/attitude_converter.h>
    +      10             : 
    +      11             : #include <Eigen/Dense>
    +      12             : 
    +      13             : #include <limits>
    +      14             : 
    +      15             : namespace mrs_uav_state_estimators
    +      16             : {
    +      17             : 
    +      18             : using namespace mrs_uav_managers::estimation_manager;
    +      19             : 
    +      20             : template <int n_measurements>
    +      21             : class ProcExcessiveTilt : public Processor<n_measurements> {
    +      22             : 
    +      23             : public:
    +      24             :   typedef Eigen::Matrix<double, n_measurements, 1> measurement_t;
    +      25             : 
    +      26             : public:
    +      27             :   ProcExcessiveTilt(ros::NodeHandle& nh, const std::string& correction_name, const std::string& name, const std::shared_ptr<CommonHandlers_t>& ch,
    +      28             :                     const std::shared_ptr<PrivateHandlers_t>& ph);
    +      29             : 
    +      30             :   std::tuple<bool, bool> process(measurement_t& measurement) override;
    +      31             :   void                   reset();
    +      32             : 
    +      33             : private:
    +      34             :   double max_tilt_sq_;
    +      35             : 
    +      36             :   std::string                                                 orientation_topic_;
    +      37             :   mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped> sh_orientation_;
    +      38             : };
    +      39             : 
    +      40             : /*//{ constructor */
    +      41             : template <int n_measurements>
    +      42          76 : ProcExcessiveTilt<n_measurements>::ProcExcessiveTilt(ros::NodeHandle& nh, const std::string& correction_name, const std::string& name,
    +      43             :                                                      const std::shared_ptr<CommonHandlers_t>& ch, const std::shared_ptr<PrivateHandlers_t>& ph)
    +      44          76 :     : Processor<n_measurements>(nh, correction_name, name, ch, ph) {
    +      45             : 
    +      46             :   // | --------------------- load parameters -------------------- |
    +      47          76 :   ph->param_loader->setPrefix(ch->package_name + "/" + Support::toSnakeCase(ch->nodelet_name) + "/" + Processor<n_measurements>::getNamespacedName() + "/");
    +      48             : 
    +      49          76 :   ph->param_loader->loadParam("orientation_topic", orientation_topic_);
    +      50             :   double max_tilt;
    +      51          76 :   ph->param_loader->loadParam("max_tilt", max_tilt);
    +      52             : 
    +      53          76 :   max_tilt = M_PI * (max_tilt / 180.0);
    +      54             : 
    +      55          76 :   max_tilt_sq_ = std::pow(max_tilt, 2);
    +      56             : 
    +      57          76 :   if (!ph->param_loader->loadedSuccessfully()) {
    +      58           0 :     ROS_ERROR("[%s]: Could not load all non-optional parameters. Shutting down.", Processor<n_measurements>::getPrintName().c_str());
    +      59           0 :     ros::shutdown();
    +      60             :   }
    +      61             : 
    +      62             :   // | -------------- initialize subscribe handlers ------------- |
    +      63          76 :   mrs_lib::SubscribeHandlerOptions shopts;
    +      64          76 :   shopts.nh                 = nh;
    +      65          76 :   shopts.node_name          = Processor<n_measurements>::getPrintName();
    +      66          76 :   shopts.no_message_timeout = ros::Duration(1.0);
    +      67          76 :   shopts.threadsafe         = true;
    +      68          76 :   shopts.autostart          = true;
    +      69          76 :   shopts.queue_size         = 10;
    +      70          76 :   shopts.transport_hints    = ros::TransportHints().tcpNoDelay();
    +      71             : 
    +      72          76 :   sh_orientation_ = mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped>(shopts, "/" + ch->uav_name + "/" + orientation_topic_);
    +      73          76 : }
    +      74             : /*//}*/
    +      75             : 
    +      76             : /*//{ process() */
    +      77             : template <int n_measurements>
    +      78      138796 : std::tuple<bool, bool> ProcExcessiveTilt<n_measurements>::process([[maybe_unused]] measurement_t& measurement) {
    +      79             : 
    +      80      138796 :   if (!Processor<n_measurements>::enabled_) {
    +      81           0 :     return {true, true};
    +      82             :   }
    +      83             : 
    +      84      138796 :   if (!sh_orientation_.hasMsg()) {
    +      85           0 :     return {false, false};
    +      86             :   }
    +      87             : 
    +      88      138795 :   bool ok_flag     = true;
    +      89      138795 :   bool should_fuse = true;
    +      90             : 
    +      91             :   try {
    +      92      138795 :     Eigen::Matrix3d orientation_R = mrs_lib::AttitudeConverter(sh_orientation_.getMsg()->quaternion);
    +      93             : 
    +      94      138793 :     const double tilt = mrs_lib::geometry::angleBetween(Eigen::Vector3d(0, 0, 1), orientation_R.col(2));
    +      95             : 
    +      96      138778 :     const bool is_excessive_tilt = std::pow(tilt, 2) > max_tilt_sq_;
    +      97             : 
    +      98      138784 :     if (is_excessive_tilt) {
    +      99           0 :       ROS_WARN_THROTTLE(1.0, "[%s]: excessive tilt of %.2f deg. Not fusing correction.", Processor<n_measurements>::getPrintName().c_str(), tilt / M_PI * 180);
    +     100           0 :       ok_flag     = false;
    +     101           0 :       should_fuse = false;
    +     102             :     }
    +     103             :   }
    +     104           0 :   catch (...) {
    +     105           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: failed obtaining tilt value", Processor<n_measurements>::getPrintName().c_str());
    +     106           0 :     ok_flag     = false;
    +     107           0 :     should_fuse = false;
    +     108             :   }
    +     109      138798 :   return {ok_flag, should_fuse};
    +     110             : }
    +     111             : /*//}*/
    +     112             : 
    +     113             : /*//{ reset() */
    +     114             : template <int n_measurements>
    +     115           0 : void ProcExcessiveTilt<n_measurements>::reset() {
    +     116             :   // no need to do anything
    +     117           0 : }
    +     118             : /*//}*/
    +     119             : 
    +     120             : }  // namespace mrs_uav_state_estimators
    +     121             : 
    +     122             : #endif  // PROCESSORS_PROC_EXCESSIVE_TILT_H
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_excessive_tilt.h.gcov.overview.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_excessive_tilt.h.gcov.overview.html new file mode 100644 index 0000000000..8e05401d3b --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_excessive_tilt.h.gcov.overview.html @@ -0,0 +1,51 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_excessive_tilt.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_excessive_tilt.h.gcov.png b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_excessive_tilt.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..b64a252cab730e64e7e46966d4a4e6187ae9facd GIT binary patch literal 656 zcmV;B0&o3^P)2i$Eh$_a1ffbCT**)NUE|Y6jd4E=SUmi7Q$-F96_Fewyni(}s z8H0^6tmnSunwqp;B?-iQBu~`s;jK0u*OC-l;Z5Ys$lp==NYoYb-EkG;j$#=aohb^A zxVIw9f>6Q96v!N|V`^ZI1H|4neH=Q$4G>C#U=C;w|JZ<$n#o3HGK^`ZTPo(aw=>Y% zzB1#x?l9&V0|MQ>Ul@IbO5jqACP8pC?h0+-6628-4W2XVGHK_b0-on5*kxbW=QcA2t_n<dA`)n{kiFQy@)L%bU+m{=J%6!JwI^2f)b#rDD!qJ%x^-mM`xIlI q49GSm>wgvaPj~7ls(-H<<@^E?wHgS_z&(2a0000 + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_median_filter.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors - proc_median_filter.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:233663.9 %
    Date:2024-04-18 23:11:36Functions:2633.3 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::ProcMedianFilter<1>::reset()0
    mrs_uav_state_estimators::ProcMedianFilter<2>::reset()0
    mrs_uav_state_estimators::ProcMedianFilter<2>::process(Eigen::Matrix<double, 2, 1, 0, 2, 1>&)0
    mrs_uav_state_estimators::ProcMedianFilter<2>::ProcMedianFilter(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)0
    mrs_uav_state_estimators::ProcMedianFilter<1>::ProcMedianFilter(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)76
    mrs_uav_state_estimators::ProcMedianFilter<1>::process(Eigen::Matrix<double, 1, 1, 0, 1, 1>&)138795
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_median_filter.h.func.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_median_filter.h.func.html new file mode 100644 index 0000000000..1054db4322 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_median_filter.h.func.html @@ -0,0 +1,104 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_median_filter.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors - proc_median_filter.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:233663.9 %
    Date:2024-04-18 23:11:36Functions:2633.3 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::ProcMedianFilter<1>::reset()0
    mrs_uav_state_estimators::ProcMedianFilter<1>::process(Eigen::Matrix<double, 1, 1, 0, 1, 1>&)138795
    mrs_uav_state_estimators::ProcMedianFilter<1>::ProcMedianFilter(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)76
    mrs_uav_state_estimators::ProcMedianFilter<2>::reset()0
    mrs_uav_state_estimators::ProcMedianFilter<2>::process(Eigen::Matrix<double, 2, 1, 0, 2, 1>&)0
    mrs_uav_state_estimators::ProcMedianFilter<2>::ProcMedianFilter(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)0
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_median_filter.h.gcov.frameset.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_median_filter.h.gcov.frameset.html new file mode 100644 index 0000000000..6b6962ed34 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_median_filter.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_median_filter.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_median_filter.h.gcov.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_median_filter.h.gcov.html new file mode 100644 index 0000000000..cfe10295d5 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_median_filter.h.gcov.html @@ -0,0 +1,192 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_median_filter.h + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors - proc_median_filter.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:233663.9 %
    Date:2024-04-18 23:11:36Functions:2633.3 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #pragma once
    +       2             : #ifndef PROCESSORS_PROC_MEDIAN_FILTER_H
    +       3             : #define PROCESSORS_PROC_MEDIAN_FILTER_H
    +       4             : 
    +       5             : #include <mrs_uav_state_estimators/processors/processor.h>
    +       6             : 
    +       7             : #include <mrs_lib/median_filter.h>
    +       8             : #include <mrs_lib/param_loader.h>
    +       9             : 
    +      10             : #include <limits>
    +      11             : 
    +      12             : namespace mrs_uav_state_estimators
    +      13             : {
    +      14             : 
    +      15             : using namespace mrs_uav_managers::estimation_manager;
    +      16             : 
    +      17             : template <int n_measurements>
    +      18             : class ProcMedianFilter : public Processor<n_measurements> {
    +      19             : 
    +      20             : public:
    +      21             :   typedef Eigen::Matrix<double, n_measurements, 1> measurement_t;
    +      22             : 
    +      23             : public:
    +      24             :   ProcMedianFilter(ros::NodeHandle& nh, const std::string& correction_name, const std::string& name, const std::shared_ptr<CommonHandlers_t>& ch,
    +      25             :                    const std::shared_ptr<PrivateHandlers_t>& ph);
    +      26             : 
    +      27             :   std::tuple<bool, bool> process(measurement_t& measurement) override;
    +      28             :   void                   reset();
    +      29             : 
    +      30             : private:
    +      31             :   std::vector<mrs_lib::MedianFilter> vec_mf_;
    +      32             :   int                                buffer_size_;
    +      33             :   double                             max_diff_;
    +      34             : };
    +      35             : 
    +      36             : /*//{ constructor */
    +      37             : template <int n_measurements>
    +      38          76 : ProcMedianFilter<n_measurements>::ProcMedianFilter(ros::NodeHandle& nh, const std::string& correction_name, const std::string& name,
    +      39             :                                                    const std::shared_ptr<CommonHandlers_t>& ch, const std::shared_ptr<PrivateHandlers_t>& ph)
    +      40          76 :     : Processor<n_measurements>(nh, correction_name, name, ch, ph) {
    +      41             : 
    +      42             :   // | --------------------- load parameters -------------------- |
    +      43          76 :   ph->param_loader->setPrefix(ch->package_name + "/" + Support::toSnakeCase(ch->nodelet_name) + "/" + Processor<n_measurements>::getNamespacedName() + "/");
    +      44             : 
    +      45          76 :   ph->param_loader->loadParam("buffer_size", buffer_size_);
    +      46          76 :   ph->param_loader->loadParam("max_diff", max_diff_);
    +      47             : 
    +      48          76 :   if (!ph->param_loader->loadedSuccessfully()) {
    +      49           0 :     ROS_ERROR("[%s]: Could not load all non-optional parameters. Shutting down.", Processor<n_measurements>::getPrintName().c_str());
    +      50           0 :     ros::shutdown();
    +      51             :   }
    +      52             : 
    +      53             :   // min and max values are not checked by median filter, so set them to limits of double
    +      54          76 :   const double min_valid = std::numeric_limits<double>::lowest();
    +      55          76 :   const double max_valid = std::numeric_limits<double>::max();
    +      56             : 
    +      57             :   // initialize median filter
    +      58         152 :   for (int i = 0; i < n_measurements; i++) {
    +      59          76 :     vec_mf_.push_back(mrs_lib::MedianFilter(buffer_size_, min_valid, max_valid, max_diff_));
    +      60             :   }
    +      61          76 : }
    +      62             : /*//}*/
    +      63             : 
    +      64             : /*//{ process() */
    +      65             : template <int n_measurements>
    +      66      138795 : std::tuple<bool, bool> ProcMedianFilter<n_measurements>::process(measurement_t& measurement) {
    +      67             : 
    +      68      138795 :   if (!Processor<n_measurements>::enabled_) {
    +      69           0 :     return {true, true};
    +      70             :   }
    +      71             : 
    +      72      138795 :   bool ok_flag     = true;
    +      73      138795 :   bool should_fuse = true;
    +      74      277581 :   for (int i = 0; i < measurement.rows(); i++) {
    +      75      138780 :     vec_mf_[i].add(measurement(i));
    +      76      138783 :     if (vec_mf_[i].full()) {
    +      77      131258 :       if (!vec_mf_[i].check(measurement(i))) {
    +      78           0 :         std::stringstream ss_measurement_string;
    +      79           0 :         ss_measurement_string << measurement(i);
    +      80           0 :         ss_measurement_string << " ";
    +      81           0 :         ROS_WARN_THROTTLE(1.0, "[%s]: measurement[%d]: %s declined by median filter (median: %.2f, max_diff: %.2f).",
    +      82             :                           Processor<n_measurements>::getPrintName().c_str(), i, ss_measurement_string.str().c_str(), vec_mf_[i].median(), max_diff_);
    +      83           0 :         ok_flag     = false;
    +      84           0 :         should_fuse = false;
    +      85             :       }
    +      86             :     } else {
    +      87        7523 :       ROS_WARN_THROTTLE(1.0, "[%s]: median filter not full yet", Processor<n_measurements>::getPrintName().c_str());
    +      88        7523 :       ok_flag     = false;
    +      89        7523 :       should_fuse = false;
    +      90             :     }
    +      91             :   }
    +      92             : 
    +      93      138780 :   return {ok_flag, should_fuse};
    +      94             : }
    +      95             : /*//}*/
    +      96             : 
    +      97             : /*//{ reset() */
    +      98             : template <int n_measurements>
    +      99           0 : void ProcMedianFilter<n_measurements>::reset() {
    +     100           0 :   for (auto mf : vec_mf_) {
    +     101           0 :     mf.clear();
    +     102             :   }
    +     103           0 : }
    +     104             : /*//}*/
    +     105             : 
    +     106             : }  // namespace mrs_uav_state_estimators
    +     107             : 
    +     108             : #endif  // PROCESSORS_PROC_MEDIAN_FILTER_H
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_median_filter.h.gcov.overview.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_median_filter.h.gcov.overview.html new file mode 100644 index 0000000000..99218c587d --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_median_filter.h.gcov.overview.html @@ -0,0 +1,47 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_median_filter.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_median_filter.h.gcov.png b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_median_filter.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..6923330e664ef60437c8a503a26089bc19866de0 GIT binary patch literal 635 zcmV->0)+jEP)|!_b`VE3^Lar_duazn?*P542Yg*&@;(Y2Dc4#e6hU;_|6R+NifR9fC38Z1>2d zrafk7b^)|k)UBv>lh(@J0r&mP=ECXD!yoWFU&8|g+@~h?V-6_58_JdWh~r7YY=j$` ze}+6-$gm+2U~77&zy}EzNm43lYtl11FdJj61!-HNE|Hp)4-!Y*xE0#=tI0hwaawf3 z8%E8pAiUVuz?-w@GC{gbz3ds=CnB|iOMUU5TS2F2{opi6rerWVnll+N zkR>#)AKzG#BeSO1rcBHDK1Uswfi}Iir!vbP?Hb4%Q-ARJp<$-x@P^dvLHfzR)yCkh z#{e=1=~=p@RcbG@ApOuPQIbOo~h_YFnh{sDB+ V&znIPT!#Pv002ovPDHLkV1lH}D0lz> literal 0 HcmV?d00001 diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_saturate.h.func-sort-c.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_saturate.h.func-sort-c.html new file mode 100644 index 0000000000..2d3e289d24 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_saturate.h.func-sort-c.html @@ -0,0 +1,104 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_saturate.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors - proc_saturate.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:294072.5 %
    Date:2024-04-18 23:11:36Functions:4666.7 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::ProcSaturate<1>::reset()0
    mrs_uav_state_estimators::ProcSaturate<2>::reset()0
    mrs_uav_state_estimators::ProcSaturate<2>::ProcSaturate(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&, mrs_uav_managers::estimation_manager::StateId_t, std::function<double (int, int)>)4
    mrs_uav_state_estimators::ProcSaturate<1>::ProcSaturate(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&, mrs_uav_managers::estimation_manager::StateId_t, std::function<double (int, int)>)78
    mrs_uav_state_estimators::ProcSaturate<2>::process(Eigen::Matrix<double, 2, 1, 0, 2, 1>&)5479
    mrs_uav_state_estimators::ProcSaturate<1>::process(Eigen::Matrix<double, 1, 1, 0, 1, 1>&)141359
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_saturate.h.func.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_saturate.h.func.html new file mode 100644 index 0000000000..deb9f88bce --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_saturate.h.func.html @@ -0,0 +1,104 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_saturate.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors - proc_saturate.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:294072.5 %
    Date:2024-04-18 23:11:36Functions:4666.7 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::ProcSaturate<1>::reset()0
    mrs_uav_state_estimators::ProcSaturate<1>::process(Eigen::Matrix<double, 1, 1, 0, 1, 1>&)141359
    mrs_uav_state_estimators::ProcSaturate<1>::ProcSaturate(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&, mrs_uav_managers::estimation_manager::StateId_t, std::function<double (int, int)>)78
    mrs_uav_state_estimators::ProcSaturate<2>::reset()0
    mrs_uav_state_estimators::ProcSaturate<2>::process(Eigen::Matrix<double, 2, 1, 0, 2, 1>&)5479
    mrs_uav_state_estimators::ProcSaturate<2>::ProcSaturate(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&, mrs_uav_managers::estimation_manager::StateId_t, std::function<double (int, int)>)4
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_saturate.h.gcov.frameset.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_saturate.h.gcov.frameset.html new file mode 100644 index 0000000000..5f4af983f1 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_saturate.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_saturate.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_saturate.h.gcov.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_saturate.h.gcov.html new file mode 100644 index 0000000000..12efbc4ce7 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_saturate.h.gcov.html @@ -0,0 +1,202 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_saturate.h + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors - proc_saturate.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:294072.5 %
    Date:2024-04-18 23:11:36Functions:4666.7 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #pragma once
    +       2             : #ifndef PROCESSORS_PROC_SATURATE_H
    +       3             : #define PROCESSORS_PROC_SATURATE_H
    +       4             : 
    +       5             : #include <mrs_uav_state_estimators/processors/processor.h>
    +       6             : 
    +       7             : #include <mrs_lib/param_loader.h>
    +       8             : 
    +       9             : #include <limits>
    +      10             : #include <functional>
    +      11             : 
    +      12             : namespace mrs_uav_state_estimators
    +      13             : {
    +      14             : 
    +      15             : using namespace mrs_uav_managers::estimation_manager;
    +      16             : 
    +      17             : template <int n_measurements>
    +      18             : class ProcSaturate : public Processor<n_measurements> {
    +      19             : 
    +      20             : public:
    +      21             :   typedef Eigen::Matrix<double, n_measurements, 1> measurement_t;
    +      22             : 
    +      23             : public:
    +      24             :   ProcSaturate(ros::NodeHandle& nh, const std::string& correction_name, const std::string& name, const std::shared_ptr<CommonHandlers_t>& ch,
    +      25             :                const std::shared_ptr<PrivateHandlers_t>& ph, StateId_t state_id, std::function<double(int, int)> fun_get_state);
    +      26             : 
    +      27             :   std::tuple<bool, bool> process(measurement_t& measurement) override;
    +      28             :   void                   reset();
    +      29             : 
    +      30             : private:
    +      31             :   const StateId_t                 state_id_;
    +      32             :   std::function<double(int, int)> fun_get_state_;
    +      33             : 
    +      34             :   bool   keep_enabled_;
    +      35             :   double saturate_min_;
    +      36             :   double saturate_max_;
    +      37             :   double innovation_limit_;
    +      38             : };
    +      39             : 
    +      40             : /*//{ constructor */
    +      41             : template <int n_measurements>
    +      42          82 : ProcSaturate<n_measurements>::ProcSaturate(ros::NodeHandle& nh, const std::string& correction_name, const std::string& name,
    +      43             :                                            const std::shared_ptr<CommonHandlers_t>& ch, const std::shared_ptr<PrivateHandlers_t>& ph, const StateId_t state_id,
    +      44             :                                            std::function<double(int, int)> fun_get_state)
    +      45          82 :     : Processor<n_measurements>(nh, correction_name, name, ch, ph), state_id_(state_id), fun_get_state_(fun_get_state) {
    +      46             : 
    +      47             :   // | --------------------- load parameters -------------------- |
    +      48          82 :   ph->param_loader->setPrefix(ch->package_name + "/" + Support::toSnakeCase(ch->nodelet_name) + "/" + Processor<n_measurements>::getNamespacedName() + "/");
    +      49             : 
    +      50          82 :   ph->param_loader->loadParam("start_enabled", this->start_enabled_);
    +      51          82 :   this->enabled_ = this->start_enabled_;
    +      52          82 :   ph->param_loader->loadParam("keep_enabled", keep_enabled_);
    +      53          82 :   ph->param_loader->loadParam("min", saturate_min_);
    +      54          82 :   ph->param_loader->loadParam("max", saturate_max_);
    +      55          82 :   ph->param_loader->loadParam("limit", innovation_limit_);
    +      56             : 
    +      57          82 :   if (!ph->param_loader->loadedSuccessfully()) {
    +      58           0 :     ROS_ERROR("[%s]: Could not load all non-optional parameters. Shutting down.", Processor<n_measurements>::getPrintName().c_str());
    +      59           0 :     ros::shutdown();
    +      60             :   }
    +      61          82 : }
    +      62             : /*//}*/
    +      63             : 
    +      64             : /*//{ process() */
    +      65             : template <int n_measurements>
    +      66      146838 : std::tuple<bool, bool> ProcSaturate<n_measurements>::process(measurement_t& measurement) {
    +      67             : 
    +      68             :   // if no saturation is required, processing is successful
    +      69      146838 :   if (!this->enabled_) {
    +      70           0 :     return {true, true};
    +      71             :   }
    +      72             : 
    +      73      146838 :   bool ok_flag     = true;
    +      74      146838 :   bool should_fuse = true;
    +      75      293987 :   for (int i = 0; i < measurement.rows(); i++) {
    +      76      152298 :     const double state = fun_get_state_(state_id_, i);
    +      77      152305 :     ROS_INFO_ONCE("[%s]: first state[%d][%d]: %.2f", Processor<n_measurements>::getNamespacedName().c_str(), state_id_, i, state);
    +      78             : 
    +      79      152305 :     if (measurement(i) > state + innovation_limit_ || measurement(i) < state - innovation_limit_) {
    +      80        5146 :       return {true, true};  // do not even try to saturate, trigger innovation-based switch to other estimator
    +      81             :     }
    +      82             : 
    +      83      147144 :     if (measurement(i) > state + saturate_max_) {
    +      84        1032 :       const double saturated = state + saturate_max_;
    +      85        1032 :       ROS_WARN_THROTTLE(1.0, "[%s]: state[%d][%d]: %.2f, measurement[%d]: %.2f saturated to: %.2f.", Processor<n_measurements>::getPrintName().c_str(),
    +      86             :                         state_id_, i, state, i, measurement(i), saturated);
    +      87        1032 :       measurement(i) = saturated;
    +      88        1032 :       ok_flag        = false;
    +      89        1032 :       should_fuse    = true;
    +      90      146119 :     } else if (measurement(i) < state + saturate_min_) {
    +      91           0 :       const double saturated = state + saturate_min_;
    +      92           0 :       ROS_WARN_THROTTLE(1.0, "[%s]: state[%d][%d]: %.2f, measurement[%d]: %.2f saturated to: %.2f.", Processor<n_measurements>::getPrintName().c_str(),
    +      93             :                         state_id_, i, state, i, measurement(i), saturated);
    +      94           0 :       measurement(i) = saturated;
    +      95           0 :       ok_flag        = false;
    +      96           0 :       should_fuse    = true;
    +      97             :     }
    +      98             :   }
    +      99             : 
    +     100             :   // measurements are close to the state, no need to saturate until triggered externally again
    +     101      141678 :   if (!this->keep_enabled_ && ok_flag) {
    +     102           0 :     this->enabled_ = false;
    +     103             :   }
    +     104             : 
    +     105      141678 :   return {ok_flag, should_fuse};  // saturated measurement is valid
    +     106             : }
    +     107             : /*//}*/
    +     108             : 
    +     109             : /*//{ reset() */
    +     110             : template <int n_measurements>
    +     111           0 : void ProcSaturate<n_measurements>::reset() {
    +     112             :   // no need to reset anything
    +     113           0 : }
    +     114             : /*//}*/
    +     115             : 
    +     116             : }  // namespace mrs_uav_state_estimators
    +     117             : 
    +     118             : #endif  // PROCESSORS_PROC_MEDIAN_FILTER_H
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_saturate.h.gcov.overview.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_saturate.h.gcov.overview.html new file mode 100644 index 0000000000..174df6dcc3 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_saturate.h.gcov.overview.html @@ -0,0 +1,50 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_saturate.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_saturate.h.gcov.png b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_saturate.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..9849f98e369e50987231e01d23a49867fcf9bec5 GIT binary patch literal 711 zcmV;&0yzDNP)PuAm$E_Fv^0!cQUyv9+o8t9s_bg#@ixmc=cLnHvF_eGOC_ zIC=d+pc#F7gezUL=r-izK6S^=VOz^- zoTyaRs(gREA>hUbqo%&|$VMlDoalkatPzZW+4a<;8psABfO>hZ^Mt%Mz-{|Ww&S+{ z9p@(>r*AyLfZNc_c8mc92))RAgAwwNfKTgsTGr3&x>KQIGCeA;wB$OrpygAHn&rC5 zukaXCxKlpgNuk<2$#QnE&@aCnqtE)yfqy{9M(&-32O^%(+KM|qYtXE zrX~pb0OB-yBpN*L@iN4g3^{_@nsrt4AT#|K;mSiX7BvL61LR6V{h6t7ctXc2OVI|h zbLNpK?=(n2yo|tmsftIKOh{TZYe+yl#Ug+kR@agH=DyR8CX0!H#Zozz2Apm=e;R%l z0gn8YFyx$hB+9$$O+dVi!22RE9*+ndG=NRnDt_{Imfkbz0XIJNyV$HPd+0q|yjTk< zmEAsRgp7l6{iZ*rx}q>WKf;*PT-Gm|ue_N^y`!S@HB-N6)(Oumq9=Hq_P8IzClI4d t%w`5<@?i>{ZT~FL-+iN_Y2I%;xPLjP^YBqA0G9v&002ovPDHLkV1gH|QM>>E literal 0 HcmV?d00001 diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_tf_to_world.h.func-sort-c.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_tf_to_world.h.func-sort-c.html new file mode 100644 index 0000000000..ecadcefd15 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_tf_to_world.h.func-sort-c.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_tf_to_world.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors - proc_tf_to_world.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:455778.9 %
    Date:2024-04-18 23:11:36Functions:3837.5 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::ProcTfToWorld<1>::callbackGnss(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>)0
    mrs_uav_state_estimators::ProcTfToWorld<1>::reset()0
    mrs_uav_state_estimators::ProcTfToWorld<1>::process(Eigen::Matrix<double, 1, 1, 0, 1, 1>&)0
    mrs_uav_state_estimators::ProcTfToWorld<1>::ProcTfToWorld(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)0
    mrs_uav_state_estimators::ProcTfToWorld<2>::reset()0
    mrs_uav_state_estimators::ProcTfToWorld<2>::ProcTfToWorld(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)93
    mrs_uav_state_estimators::ProcTfToWorld<2>::callbackGnss(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>)88991
    mrs_uav_state_estimators::ProcTfToWorld<2>::process(Eigen::Matrix<double, 2, 1, 0, 2, 1>&)184637
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_tf_to_world.h.func.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_tf_to_world.h.func.html new file mode 100644 index 0000000000..9beca81d39 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_tf_to_world.h.func.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_tf_to_world.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors - proc_tf_to_world.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:455778.9 %
    Date:2024-04-18 23:11:36Functions:3837.5 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::ProcTfToWorld<1>::callbackGnss(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>)0
    mrs_uav_state_estimators::ProcTfToWorld<1>::reset()0
    mrs_uav_state_estimators::ProcTfToWorld<1>::process(Eigen::Matrix<double, 1, 1, 0, 1, 1>&)0
    mrs_uav_state_estimators::ProcTfToWorld<1>::ProcTfToWorld(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)0
    mrs_uav_state_estimators::ProcTfToWorld<2>::callbackGnss(boost::shared_ptr<sensor_msgs::NavSatFix_<std::allocator<void> > const>)88991
    mrs_uav_state_estimators::ProcTfToWorld<2>::reset()0
    mrs_uav_state_estimators::ProcTfToWorld<2>::process(Eigen::Matrix<double, 2, 1, 0, 2, 1>&)184637
    mrs_uav_state_estimators::ProcTfToWorld<2>::ProcTfToWorld(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)93
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_tf_to_world.h.gcov.frameset.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_tf_to_world.h.gcov.frameset.html new file mode 100644 index 0000000000..6aab5842a6 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_tf_to_world.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_tf_to_world.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_tf_to_world.h.gcov.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_tf_to_world.h.gcov.html new file mode 100644 index 0000000000..84b228bd80 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_tf_to_world.h.gcov.html @@ -0,0 +1,241 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_tf_to_world.h + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors - proc_tf_to_world.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:455778.9 %
    Date:2024-04-18 23:11:36Functions:3837.5 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #pragma once
    +       2             : #ifndef PROCESSORS_PROC_TF_TO_WORLD_H
    +       3             : #define PROCESSORS_PROC_TF_TO_WORLD_H
    +       4             : 
    +       5             : #include <mrs_uav_state_estimators/processors/processor.h>
    +       6             : 
    +       7             : #include <sensor_msgs/NavSatFix.h>
    +       8             : 
    +       9             : #include <mrs_lib/gps_conversions.h>
    +      10             : #include <mrs_lib/subscribe_handler.h>
    +      11             : #include <mrs_lib/param_loader.h>
    +      12             : 
    +      13             : namespace mrs_uav_state_estimators
    +      14             : {
    +      15             : 
    +      16             : using namespace mrs_uav_managers::estimation_manager;
    +      17             : 
    +      18             : template <int n_measurements>
    +      19             : class ProcTfToWorld : public Processor<n_measurements> {
    +      20             : 
    +      21             : public:
    +      22             :   typedef Eigen::Matrix<double, n_measurements, 1> measurement_t;
    +      23             : 
    +      24             : public:
    +      25             :   ProcTfToWorld(ros::NodeHandle& nh, const std::string& correction_name, const std::string& name, const std::shared_ptr<CommonHandlers_t>& ch,
    +      26             :                 const std::shared_ptr<PrivateHandlers_t>& ph);
    +      27             : 
    +      28             :   std::tuple<bool, bool> process(measurement_t& measurement) override;
    +      29             :   void                   reset();
    +      30             : 
    +      31             : private:
    +      32             :   bool is_initialized_ = false;
    +      33             : 
    +      34             :   std::string gnss_topic_;
    +      35             : 
    +      36             :   std::mutex       mtx_gnss_;
    +      37             :   std::atomic_bool got_gnss_                  = false;
    +      38             :   std::atomic_bool is_gnss_offset_calculated_ = false;
    +      39             :   double           gnss_x_;
    +      40             :   double           gnss_y_;
    +      41             : 
    +      42             :   mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix> sh_gnss_;
    +      43             :   void                                              callbackGnss(const sensor_msgs::NavSatFix::ConstPtr msg);
    +      44             : };
    +      45             : 
    +      46             : /*//{ constructor */
    +      47             : template <int n_measurements>
    +      48          93 : ProcTfToWorld<n_measurements>::ProcTfToWorld(ros::NodeHandle& nh, const std::string& correction_name, const std::string& name,
    +      49             :                                              const std::shared_ptr<CommonHandlers_t>& ch, const std::shared_ptr<PrivateHandlers_t>& ph)
    +      50          93 :     : Processor<n_measurements>(nh, correction_name, name, ch, ph) {
    +      51             : 
    +      52          93 :   ph->param_loader->setPrefix(ch->package_name + "/" + Support::toSnakeCase(ch->nodelet_name) + "/" + Processor<n_measurements>::getNamespacedName() + "/");
    +      53             : 
    +      54          93 :   ph->param_loader->loadParam("gnss_topic", gnss_topic_);
    +      55             : 
    +      56          93 :   gnss_topic_ = "/" + ch->uav_name + "/" + gnss_topic_;
    +      57             : 
    +      58          93 :   if (!ph->param_loader->loadedSuccessfully()) {
    +      59           0 :     ROS_ERROR("[%s]: Could not load all non-optional parameters. Shutting down.", Processor<n_measurements>::getPrintName().c_str());
    +      60           0 :     ros::shutdown();
    +      61             :   }
    +      62             : 
    +      63             :   // | -------------- initialize subscribe handlers ------------- |
    +      64          93 :   mrs_lib::SubscribeHandlerOptions shopts;
    +      65          93 :   shopts.nh                 = nh;
    +      66          93 :   shopts.node_name          = Processor<n_measurements>::getPrintName();
    +      67          93 :   shopts.no_message_timeout = mrs_lib::no_timeout;
    +      68          93 :   shopts.threadsafe         = true;
    +      69          93 :   shopts.autostart          = true;
    +      70          93 :   shopts.queue_size         = 10;
    +      71          93 :   shopts.transport_hints    = ros::TransportHints().tcpNoDelay();
    +      72             : 
    +      73          93 :   sh_gnss_ = mrs_lib::SubscribeHandler<sensor_msgs::NavSatFix>(shopts, gnss_topic_, &ProcTfToWorld::callbackGnss, this);
    +      74             : 
    +      75          93 :   is_initialized_ = true;
    +      76          93 : }
    +      77             : /*//}*/
    +      78             : 
    +      79             : /*//{ callbackGnss() */
    +      80             : template <int n_measurements>
    +      81       88991 : void ProcTfToWorld<n_measurements>::callbackGnss(const sensor_msgs::NavSatFix::ConstPtr msg) {
    +      82             : 
    +      83       88991 :   if (!is_initialized_) {
    +      84       88809 :     return;
    +      85             :   }
    +      86             : 
    +      87       88991 :   if (got_gnss_) {
    +      88       88809 :     return;
    +      89             :   }
    +      90             : 
    +      91          93 :   if (!std::isfinite(msg->latitude)) {
    +      92           0 :     ROS_ERROR_THROTTLE(1.0, "[%s] NaN detected in GNSS variable \"msg->latitude\"!!!", Processor<n_measurements>::getPrintName().c_str());
    +      93           0 :     return;
    +      94             :   }
    +      95             : 
    +      96          93 :   if (!std::isfinite(msg->longitude)) {
    +      97           0 :     ROS_ERROR_THROTTLE(1.0, "[%s] NaN detected in GNSS variable \"msg->longitude\"!!!", Processor<n_measurements>::getPrintName().c_str());
    +      98           0 :     return;
    +      99             :   }
    +     100             : 
    +     101         186 :   std::scoped_lock lock(mtx_gnss_);
    +     102          93 :   mrs_lib::UTM(msg->latitude, msg->longitude, &gnss_x_, &gnss_y_);
    +     103          93 :   ROS_INFO("[%s]: First GNSS obtained: %.2f %.2f", Processor<n_measurements>::getPrintName().c_str(), gnss_x_, gnss_y_);
    +     104          93 :   got_gnss_ = true;
    +     105             : }
    +     106             : /*//}*/
    +     107             : 
    +     108             : /*//{ process() */
    +     109             : template <int n_measurements>
    +     110      184637 : std::tuple<bool, bool> ProcTfToWorld<n_measurements>::process(measurement_t& measurement) {
    +     111             : 
    +     112      184637 :   if (!Processor<n_measurements>::enabled_) {
    +     113           0 :     return {true, true};
    +     114             :   }
    +     115             : 
    +     116      369259 :   std::scoped_lock lock(mtx_gnss_);
    +     117             : 
    +     118      184612 :   if (!got_gnss_) {
    +     119        7292 :     ROS_WARN_THROTTLE(1.0, "[%s]: Missing GNSS data on topic: %s", Processor<n_measurements>::getPrintName().c_str(), gnss_topic_.c_str());
    +     120        7292 :     return {false, false};
    +     121             :   }
    +     122             : 
    +     123      177312 :   if (!is_gnss_offset_calculated_) {
    +     124             : 
    +     125          93 :     ROS_INFO_THROTTLE(1.0, "[%s]: debug: gnss_x_: %.2f, measurement(0): %.2f, world_origin.x: %.2f", Processor<n_measurements>::getPrintName().c_str(), gnss_x_,
    +     126             :                       measurement(0), Processor<n_measurements>::ch_->world_origin.x);
    +     127          93 :     ROS_INFO_THROTTLE(1.0, "[%s]: debug: gnss_y_: %.2f, measurement(1): %.2f, world_origin.y: %.2f", Processor<n_measurements>::getPrintName().c_str(), gnss_y_,
    +     128             :                       measurement(1), Processor<n_measurements>::ch_->world_origin.y);
    +     129          93 :     gnss_x_                    = (gnss_x_ - measurement(0)) - Processor<n_measurements>::ch_->world_origin.x;
    +     130          93 :     gnss_y_                    = (gnss_y_ - measurement(1)) - Processor<n_measurements>::ch_->world_origin.y;
    +     131          93 :     is_gnss_offset_calculated_ = true;
    +     132          93 :     ROS_INFO_THROTTLE(1.0, "[%s]: GNSS world offset calculated as: [%.2f %.2f]", Processor<n_measurements>::getPrintName().c_str(), gnss_x_, gnss_y_);
    +     133             :   }
    +     134             : 
    +     135      177316 :   measurement(0) += gnss_x_;
    +     136      177261 :   measurement(1) += gnss_y_;
    +     137             : 
    +     138      177328 :   if (measurement(0) > 10000 || measurement(0) < -10000 || measurement(1) > 10000 || measurement(1) < -10000) {
    +     139           0 :     ROS_WARN_THROTTLE(
    +     140             :         1.0,
    +     141             :         "[%s]: debug: Not expected to fly further than 10 km. This is most likely a bug. measurement(0): %.2f measurement(1): %.2f gnss_x_: %.2f gnss_y_: %.2f",
    +     142             :         Processor<n_measurements>::getPrintName().c_str(), measurement(0), measurement(1), gnss_x_, gnss_y_);
    +     143             :   }
    +     144      177350 :   return {true, true};
    +     145             : }
    +     146             : /*//}*/
    +     147             : 
    +     148             : /*//{ reset() */
    +     149             : template <int n_measurements>
    +     150           0 : void ProcTfToWorld<n_measurements>::reset() {
    +     151           0 :   got_gnss_                  = false;
    +     152           0 :   is_gnss_offset_calculated_ = false;
    +     153           0 : }
    +     154             : /*//}*/
    +     155             : }  // namespace mrs_uav_state_estimators
    +     156             : 
    +     157             : #endif  // PROCESSORS_PROC_TF_TO_WORLD_H
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_tf_to_world.h.gcov.overview.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_tf_to_world.h.gcov.overview.html new file mode 100644 index 0000000000..c44e2f6583 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_tf_to_world.h.gcov.overview.html @@ -0,0 +1,60 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_tf_to_world.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_tf_to_world.h.gcov.png b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/proc_tf_to_world.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..a324c1257ee9037e3fabf82919209845d495e4b0 GIT binary patch literal 777 zcmV+k1NQuhP)YeKPLfI%d(hdQDZ?M6>}3P z7RRBNhCIV~)54mKVqgP#1>TJ!GMcesrS7XLRhvTlJ-0ACX3Ubb8gmW3ep|KBYVL9} zHd-<7`;=p5I<1j5^pje73r1fJMaKwP|cqki8fe9uJfx;%Wbp_7N?c1i- zs@QF_{E-s~SCSwed~Wz?gRvB~){V2)?OgR8#$YEf;2a}>+b`Au2g(_3%}QGU_x&fx z;r8R_b#C!I{JIMSxOYYEuRb6FCn{HKGMaFJ=!Hy?0as+k1)&-66k6a>E;AEZ;L4wF zan%6)Zj})NV?%eTdI$umGoG|`1`<#x$Y`sjMpN*{;DWZp2<+Wtz^zY|f%0-py;1ik zkBLUwjN#i&Dm@6@IIgQKKx!36Tpq`0W6_nq&_R}6o3E|AfdR&8jjrC4u{Ct0GH1mn@RJ^unROSIn z8T0jue2Ov0(yxHhqK~ZpCV|9C+el>18JoPqcO>uJM{*ssdR4s?ih)8QW#%Gdft*0R z<-$p4uEB(~JE*Wz;QNNbE~)Wo;y-Qt-3Y9U&PVx|$~D((KRkav&y1%T`8*R}J(;}9 z#;$y-)Ai$Mtwhw$s5(I5?6E7^s^ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/processor.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors - processor.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:71070.0 %
    Date:2024-04-18 23:11:36Functions:6875.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::Processor<1>::toggle(bool)0
    mrs_uav_state_estimators::Processor<2>::toggle(bool)0
    mrs_uav_state_estimators::Processor<2>::Processor(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)97
    mrs_uav_state_estimators::Processor<2>::getNamespacedName[abi:cxx11]() const100
    mrs_uav_state_estimators::Processor<1>::getPrintName[abi:cxx11]() const164
    mrs_uav_state_estimators::Processor<1>::Processor(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)230
    mrs_uav_state_estimators::Processor<1>::getNamespacedName[abi:cxx11]() const306
    mrs_uav_state_estimators::Processor<2>::getPrintName[abi:cxx11]() const490
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/processor.h.func.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/processor.h.func.html new file mode 100644 index 0000000000..3b432bc34b --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/processor.h.func.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/processor.h - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors - processor.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:71070.0 %
    Date:2024-04-18 23:11:36Functions:6875.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::Processor<1>::toggle(bool)0
    mrs_uav_state_estimators::Processor<1>::Processor(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)230
    mrs_uav_state_estimators::Processor<2>::toggle(bool)0
    mrs_uav_state_estimators::Processor<2>::Processor(ros::NodeHandle&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)97
    mrs_uav_state_estimators::Processor<1>::getPrintName[abi:cxx11]() const164
    mrs_uav_state_estimators::Processor<1>::getNamespacedName[abi:cxx11]() const306
    mrs_uav_state_estimators::Processor<2>::getPrintName[abi:cxx11]() const490
    mrs_uav_state_estimators::Processor<2>::getNamespacedName[abi:cxx11]() const100
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/processor.h.gcov.frameset.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/processor.h.gcov.frameset.html new file mode 100644 index 0000000000..7ea1b3521d --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/processor.h.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/processor.h + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/processor.h.gcov.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/processor.h.gcov.html new file mode 100644 index 0000000000..5b9e493f68 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/processor.h.gcov.html @@ -0,0 +1,156 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/processor.h + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors - processor.h (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:71070.0 %
    Date:2024-04-18 23:11:36Functions:6875.0 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #pragma once
    +       2             : #ifndef PROCESSORS_PROCESSOR_H
    +       3             : #define PROCESSORS_PROCESSOR_H
    +       4             : 
    +       5             : namespace mrs_uav_state_estimators
    +       6             : {
    +       7             : 
    +       8             : using namespace mrs_uav_managers::estimation_manager;
    +       9             : 
    +      10             : template <int n_measurements>
    +      11             : class Processor {
    +      12             : 
    +      13             : public:
    +      14             :   typedef Eigen::Matrix<double, n_measurements, 1> measurement_t;
    +      15             : 
    +      16             : public:
    +      17             :   std::string getName() const;
    +      18             :   std::string getNamespacedName() const;
    +      19             :   std::string getPrintName() const;
    +      20             : 
    +      21             :   void toggle(bool enable);
    +      22             : 
    +      23             :   virtual std::tuple<bool, bool> process(measurement_t& measurement) = 0;
    +      24             :   virtual void                   reset()                             = 0;
    +      25             : 
    +      26             : protected:
    +      27         327 :   Processor([[maybe_unused]] ros::NodeHandle& nh, const std::string& correction_name, const std::string& name, const std::shared_ptr<CommonHandlers_t>& ch,
    +      28             :             const std::shared_ptr<PrivateHandlers_t>& ph)
    +      29         327 :       : correction_name_(correction_name), name_(name), ch_(ch), ph_(ph) {
    +      30         327 :   }  // protected constructor to prevent instantiation
    +      31             : 
    +      32             :   const std::string correction_name_;
    +      33             :   const std::string name_;
    +      34             : 
    +      35             :   const std::shared_ptr<CommonHandlers_t>  ch_;
    +      36             :   const std::shared_ptr<PrivateHandlers_t> ph_;
    +      37             : 
    +      38             :   bool enabled_       = true;
    +      39             :   bool start_enabled_ = true;
    +      40             : };
    +      41             : 
    +      42             : /*//{ getName() */
    +      43             : template <int n_measurements>
    +      44             : std::string Processor<n_measurements>::getName() const {
    +      45             :   return name_;
    +      46             : }
    +      47             : /*//}*/
    +      48             : 
    +      49             : /*//{ getNamespacedName() */
    +      50             : template <int n_measurements>
    +      51         406 : std::string Processor<n_measurements>::getNamespacedName() const {
    +      52         406 :   return correction_name_ + "/" + name_;
    +      53             : }
    +      54             : /*//}*/
    +      55             : 
    +      56             : /*//{ getPrintName() */
    +      57             : template <int n_measurements>
    +      58         654 : std::string Processor<n_measurements>::getPrintName() const {
    +      59         654 :   return ch_->nodelet_name + "/" + correction_name_ + "/" + name_;
    +      60             : }
    +      61             : /*//}*/
    +      62             : 
    +      63             : /*//{ toggle() */
    +      64             : template <int n_measurements>
    +      65           0 : void Processor<n_measurements>::toggle(bool enable) {
    +      66           0 :   enabled_ = enable;
    +      67           0 : }
    +      68             : /*//}*/
    +      69             : 
    +      70             : }  // namespace mrs_uav_state_estimators
    +      71             : 
    +      72             : #endif  // PROCESSORS_PROCESSOR_H
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/processor.h.gcov.overview.html b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/processor.h.gcov.overview.html new file mode 100644 index 0000000000..804fb09cf2 --- /dev/null +++ b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/processor.h.gcov.overview.html @@ -0,0 +1,38 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/processor.h + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/processor.h.gcov.png b/mrs_uav_state_estimators/include/mrs_uav_state_estimators/processors/processor.h.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..4a4f97a2d3dc93342019c73afac4a3056273be23 GIT binary patch literal 436 zcmV;l0ZaagP)h`Wz7!Rbg$du*y>R3?p)aIa0!P*vNNhPKFvCxC5v{Rl z)_t110j;ZuETrnnuHU&viBrZ79BzXdKV9)a-f^E-ve$EC5zK@+k?0DgW0000 + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/agl/garmin_agl.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/agl - garmin_agl.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:7510472.1 %
    Date:2024-04-18 23:11:36Functions:61060.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::garmin_agl::GarminAgl::isConverged()0
    mrs_uav_state_estimators::garmin_agl::GarminAgl::pause()0
    mrs_uav_state_estimators::garmin_agl::GarminAgl::reset()0
    mrs_uav_state_estimators::garmin_agl::GarminAgl::getHeightCovariance() const0
    (anonymous namespace)::ProxyExec0::ProxyExec0()70
    mrs_uav_state_estimators::garmin_agl::GarminAgl::initialize(ros::NodeHandle&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)70
    mrs_uav_state_estimators::garmin_agl::GarminAgl::start()70
    mrs_uav_state_estimators::garmin_agl::GarminAgl::timerCheckHealth(ros::TimerEvent const&)1370
    mrs_uav_state_estimators::garmin_agl::GarminAgl::timerUpdate(ros::TimerEvent const&)132616
    mrs_uav_state_estimators::garmin_agl::GarminAgl::getUavAglHeight() const138784
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/agl/garmin_agl.cpp.func.html b/mrs_uav_state_estimators/src/estimators/agl/garmin_agl.cpp.func.html new file mode 100644 index 0000000000..37d2f53a3c --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/agl/garmin_agl.cpp.func.html @@ -0,0 +1,120 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/agl/garmin_agl.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/agl - garmin_agl.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:7510472.1 %
    Date:2024-04-18 23:11:36Functions:61060.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    (anonymous namespace)::ProxyExec0::ProxyExec0()70
    mrs_uav_state_estimators::garmin_agl::GarminAgl::initialize(ros::NodeHandle&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)70
    mrs_uav_state_estimators::garmin_agl::GarminAgl::isConverged()0
    mrs_uav_state_estimators::garmin_agl::GarminAgl::timerUpdate(ros::TimerEvent const&)132616
    mrs_uav_state_estimators::garmin_agl::GarminAgl::timerCheckHealth(ros::TimerEvent const&)1370
    mrs_uav_state_estimators::garmin_agl::GarminAgl::pause()0
    mrs_uav_state_estimators::garmin_agl::GarminAgl::reset()0
    mrs_uav_state_estimators::garmin_agl::GarminAgl::start()70
    mrs_uav_state_estimators::garmin_agl::GarminAgl::getUavAglHeight() const138784
    mrs_uav_state_estimators::garmin_agl::GarminAgl::getHeightCovariance() const0
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/agl/garmin_agl.cpp.gcov.frameset.html b/mrs_uav_state_estimators/src/estimators/agl/garmin_agl.cpp.gcov.frameset.html new file mode 100644 index 0000000000..bd433a3da0 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/agl/garmin_agl.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/agl/garmin_agl.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_state_estimators/src/estimators/agl/garmin_agl.cpp.gcov.html b/mrs_uav_state_estimators/src/estimators/agl/garmin_agl.cpp.gcov.html new file mode 100644 index 0000000000..e0b4266282 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/agl/garmin_agl.cpp.gcov.html @@ -0,0 +1,318 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/agl/garmin_agl.cpp + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/agl - garmin_agl.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:7510472.1 %
    Date:2024-04-18 23:11:36Functions:61060.0 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : /* includes //{ */
    +       2             : 
    +       3             : #include <mrs_uav_state_estimators/estimators/agl/garmin_agl.h>
    +       4             : 
    +       5             : //}
    +       6             : 
    +       7             : namespace mrs_uav_state_estimators
    +       8             : {
    +       9             : 
    +      10             : namespace garmin_agl
    +      11             : {
    +      12             : 
    +      13             : /* initialize() //{*/
    +      14          70 : void GarminAgl::initialize(ros::NodeHandle &nh, const std::shared_ptr<CommonHandlers_t> &ch, const std::shared_ptr<PrivateHandlers_t> &ph) {
    +      15             : 
    +      16          70 :   ch_ = ch;
    +      17          70 :   ph_ = ph;
    +      18          70 :   nh_ = nh;
    +      19             : 
    +      20          70 :   ns_frame_id_ = ch_->uav_name + "/" + frame_id_;
    +      21             : 
    +      22             :   // | --------------------- load parameters -------------------- |
    +      23             : 
    +      24          70 :   ph->param_loader->setPrefix(ch_->package_name + "/" + Support::toSnakeCase(ch_->nodelet_name) + "/" + getName() + "/");
    +      25             : 
    +      26          70 :   if (is_core_plugin_) {
    +      27             : 
    +      28          70 :     ph->param_loader->addYamlFile(ros::package::getPath(package_name_) + "/config/private/" + getName() + "/" + getName() + ".yaml");
    +      29          70 :     ph->param_loader->addYamlFile(ros::package::getPath(package_name_) + "/config/public/" + getName() + "/" + getName() + ".yaml");
    +      30             :   }
    +      31             : 
    +      32          70 :   if (!ph->param_loader->loadedSuccessfully()) {
    +      33           0 :     ROS_ERROR("[%s]: Could not load all non-optional parameters. Shutting down.", getPrintName().c_str());
    +      34           0 :     ros::shutdown();
    +      35             :   }
    +      36             : 
    +      37             :   // | ------------------ timers initialization ----------------- |
    +      38          70 :   _update_timer_rate_       = 100;                                                                                          // TODO: parametrize
    +      39          70 :   timer_update_             = nh.createTimer(ros::Rate(_update_timer_rate_), &GarminAgl::timerUpdate, this, false, false);  // not running after init
    +      40          70 :   _check_health_timer_rate_ = 1;                                                                                            // TODO: parametrize
    +      41          70 :   timer_check_health_       = nh.createTimer(ros::Rate(_check_health_timer_rate_), &GarminAgl::timerCheckHealth, this);
    +      42             : 
    +      43             :   // | --------------- subscribers initialization --------------- |
    +      44         140 :   mrs_lib::SubscribeHandlerOptions shopts;
    +      45          70 :   shopts.nh                 = nh;
    +      46          70 :   shopts.node_name          = getPrintName();
    +      47          70 :   shopts.no_message_timeout = ros::Duration(0.5);
    +      48          70 :   shopts.threadsafe         = true;
    +      49          70 :   shopts.autostart          = true;
    +      50          70 :   shopts.queue_size         = 10;
    +      51          70 :   shopts.transport_hints    = ros::TransportHints().tcpNoDelay();
    +      52             : 
    +      53             :   // | ---------------- publishers initialization --------------- |
    +      54          70 :   ph_agl_height_ = mrs_lib::PublisherHandler<mrs_msgs::Float64Stamped>(nh, Support::toSnakeCase(getName()) + "/agl_height", 10);
    +      55          70 :   if (ch_->debug_topics.covariance) {
    +      56           0 :     ph_agl_height_cov_ = mrs_lib::PublisherHandler<mrs_msgs::Float64ArrayStamped>(nh, Support::toSnakeCase(getName()) + "/agl_height_cov", 10);
    +      57             :   }
    +      58          70 :   if (ch_->debug_topics.diag) {
    +      59           0 :     ph_diagnostics_ = mrs_lib::PublisherHandler<mrs_msgs::EstimatorDiagnostics>(nh, Support::toSnakeCase(getName()) + "/diagnostics", 10);
    +      60             :   }
    +      61             : 
    +      62             :   // | ---------------- estimators initialization --------------- |
    +      63             : 
    +      64          70 :   est_agl_garmin_ = std::make_unique<AltGeneric>(est_agl_name_, frame_id_, getName(), is_core_plugin_);
    +      65          70 :   est_agl_garmin_->initialize(nh, ch_, ph_);
    +      66             : 
    +      67          70 :   max_flight_z_ = est_agl_garmin_->getMaxFlightZ();
    +      68             : 
    +      69             :   // | ------------------ initialize published messages ------------------ |
    +      70          70 :   agl_height_init_.header.frame_id     = ns_frame_id_;
    +      71          70 :   agl_height_cov_init_.header.frame_id = ns_frame_id_;
    +      72             : 
    +      73             :   // | ------------------ finish initialization ----------------- |
    +      74             : 
    +      75          70 :   if (changeState(INITIALIZED_STATE)) {
    +      76          70 :     ROS_INFO("[%s]: Estimator initialized", getPrintName().c_str());
    +      77             :   } else {
    +      78           0 :     ROS_INFO("[%s]: Estimator could not be initialized", getPrintName().c_str());
    +      79             :   }
    +      80          70 : }
    +      81             : /*//}*/
    +      82             : 
    +      83             : /*//{ start() */
    +      84          70 : bool GarminAgl::start(void) {
    +      85             : 
    +      86             : 
    +      87          70 :   if (isInState(READY_STATE)) {
    +      88             : 
    +      89             :     bool est_agl_garmin_start_successful;
    +      90             : 
    +      91          70 :     if (est_agl_garmin_->isStarted() || est_agl_garmin_->isRunning()) {
    +      92           0 :       est_agl_garmin_start_successful = true;
    +      93             :     } else {
    +      94          70 :       est_agl_garmin_start_successful = est_agl_garmin_->start();
    +      95             :     }
    +      96             : 
    +      97          70 :     if (est_agl_garmin_start_successful) {
    +      98          70 :       timer_update_.start();
    +      99          70 :       changeState(STARTED_STATE);
    +     100          70 :       return true;
    +     101             :     }
    +     102             : 
    +     103             :   } else {
    +     104           0 :     ROS_WARN("[%s]: Estimator must be in READY_STATE to start it", getPrintName().c_str());
    +     105           0 :     ros::Duration(1.0).sleep();
    +     106             :   }
    +     107           0 :   return false;
    +     108             : 
    +     109             :   ROS_ERROR("[%s]: Failed to start", getPrintName().c_str());
    +     110             :   return false;
    +     111             : }
    +     112             : /*//}*/
    +     113             : 
    +     114             : /*//{ pause() */
    +     115           0 : bool GarminAgl::pause(void) {
    +     116             : 
    +     117           0 :   if (isInState(RUNNING_STATE)) {
    +     118           0 :     est_agl_garmin_->pause();
    +     119           0 :     changeState(STOPPED_STATE);
    +     120           0 :     return true;
    +     121             : 
    +     122             :   } else {
    +     123           0 :     return false;
    +     124             :   }
    +     125             : }
    +     126             : /*//}*/
    +     127             : 
    +     128             : /*//{ reset() */
    +     129           0 : bool GarminAgl::reset(void) {
    +     130             : 
    +     131           0 :   if (!isInitialized()) {
    +     132           0 :     ROS_ERROR("[%s]: Cannot reset uninitialized estimator", getPrintName().c_str());
    +     133           0 :     return false;
    +     134             :   }
    +     135             : 
    +     136           0 :   est_agl_garmin_->pause();
    +     137           0 :   changeState(STOPPED_STATE);
    +     138             : 
    +     139           0 :   ROS_INFO("[%s]: Estimator reset", getPrintName().c_str());
    +     140             : 
    +     141           0 :   return true;
    +     142             : }
    +     143             : /*//}*/
    +     144             : 
    +     145             : /* timerUpdate() //{*/
    +     146      132616 : void GarminAgl::timerUpdate([[maybe_unused]] const ros::TimerEvent &event) {
    +     147             : 
    +     148      132616 :   if (!isInitialized()) {
    +     149           0 :     return;
    +     150             :   }
    +     151             : 
    +     152      132616 :   const ros::Time time_now = ros::Time::now();
    +     153             : 
    +     154      265232 :   mrs_msgs::Float64Stamped agl_height = agl_height_init_;
    +     155      132616 :   agl_height.header.stamp             = time_now;
    +     156      132616 :   agl_height.value                    = est_agl_garmin_->getState(POSITION);
    +     157             : 
    +     158      265232 :   mrs_msgs::Float64ArrayStamped agl_height_cov;
    +     159      132616 :   agl_height_cov.header.stamp = time_now;
    +     160             : 
    +     161      132616 :   const int n_states = 2;  // TODO this should be defined somewhere else
    +     162      132616 :   agl_height_cov.values.resize(n_states * n_states);
    +     163      132616 :   agl_height_cov.values.at(n_states * POSITION + POSITION) = est_agl_garmin_->getCovariance(POSITION);
    +     164      132616 :   agl_height_cov.values.at(n_states * VELOCITY + VELOCITY) = est_agl_garmin_->getCovariance(VELOCITY);
    +     165             : 
    +     166      132616 :   mrs_lib::set_mutexed(mtx_agl_height_, agl_height, agl_height_);
    +     167      132616 :   mrs_lib::set_mutexed(mtx_agl_height_cov_, agl_height_cov, agl_height_cov_);
    +     168             : 
    +     169      132616 :   publishAglHeight();
    +     170      132616 :   publishCovariance();
    +     171      132616 :   publishDiagnostics();
    +     172             : }
    +     173             : /*//}*/
    +     174             : 
    +     175             : /*//{ timerCheckHealth() */
    +     176        1370 : void GarminAgl::timerCheckHealth([[maybe_unused]] const ros::TimerEvent &event) {
    +     177             : 
    +     178        1370 :   if (!isInitialized()) {
    +     179           0 :     return;
    +     180             :   }
    +     181             : 
    +     182        1370 :   if (isInState(INITIALIZED_STATE)) {
    +     183             : 
    +     184          78 :     if (est_agl_garmin_->isReady()) {
    +     185          70 :       changeState(READY_STATE);
    +     186          70 :       ROS_INFO("[%s]: Estimator is ready to start", getPrintName().c_str());
    +     187             :     } else {
    +     188           8 :       ROS_INFO("[%s]: %s subestimators to be ready", getPrintName().c_str(), Support::waiting_for_string.c_str());
    +     189           8 :       return;
    +     190             :     }
    +     191             :   }
    +     192             : 
    +     193             : 
    +     194        1362 :   if (isInState(STARTED_STATE)) {
    +     195          71 :     ROS_INFO("[%s]: %s for convergence of LKF", getPrintName().c_str(), Support::waiting_for_string.c_str());
    +     196             : 
    +     197          71 :     if (est_agl_garmin_->isRunning()) {
    +     198          70 :       ROS_INFO("[%s]: Subestimators converged", getPrintName().c_str());
    +     199          70 :       changeState(RUNNING_STATE);
    +     200             :     } else {
    +     201           1 :       return;
    +     202             :     }
    +     203             :   }
    +     204             : }
    +     205             : /*//}*/
    +     206             : 
    +     207             : /*//{ isConverged() */
    +     208           0 : bool GarminAgl::isConverged() {
    +     209             : 
    +     210             :   // TODO: check convergence by rate of change of determinant
    +     211             :   // most likely not used in top-level estimator
    +     212             : 
    +     213           0 :   return true;
    +     214             : }
    +     215             : /*//}*/
    +     216             : 
    +     217             : /*//{ getUavAglHeight() */
    +     218      138784 : mrs_msgs::Float64Stamped GarminAgl::getUavAglHeight() const {
    +     219      138784 :   return mrs_lib::get_mutexed(mtx_agl_height_, agl_height_);
    +     220             : }
    +     221             : /*//}*/
    +     222             : 
    +     223             : /*//{ getHeightCovariance() */
    +     224           0 : std::vector<double> GarminAgl::getHeightCovariance() const {
    +     225           0 :   return mrs_lib::get_mutexed(mtx_agl_height_cov_, agl_height_cov_.values);
    +     226             : }
    +     227             : /*//}*/
    +     228             : 
    +     229             : }  // namespace garmin_agl
    +     230             : 
    +     231             : }  // namespace mrs_uav_state_estimators
    +     232             : 
    +     233             : #include <pluginlib/class_list_macros.h>
    +     234          70 : PLUGINLIB_EXPORT_CLASS(mrs_uav_state_estimators::garmin_agl::GarminAgl, mrs_uav_managers::AglEstimator)
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/agl/garmin_agl.cpp.gcov.overview.html b/mrs_uav_state_estimators/src/estimators/agl/garmin_agl.cpp.gcov.overview.html new file mode 100644 index 0000000000..a5ae0c148f --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/agl/garmin_agl.cpp.gcov.overview.html @@ -0,0 +1,79 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/agl/garmin_agl.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_state_estimators/src/estimators/agl/garmin_agl.cpp.gcov.png b/mrs_uav_state_estimators/src/estimators/agl/garmin_agl.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..60a6dabc6a79013ab0baab9a996cb41e797fba75 GIT binary patch literal 1043 zcmV+u1nm2XP)mlAH zm%c|SA#y_F#Ao_rlyFoO@a>j?=??G%rd?QMHwe~hTZp#C-cKMxF-0hAj5Xf@GUd|f z=BeXv_cAxa*LZmxWWwU(o^HwE7^^Za&k)W1oQzD2wQd918i_$dE@?MLE|3xD$Mk?7 zD-5rAKy2ITWxt>Md0db1-e2z<0Jt?pY)2aqfqVfplZjxmpjqs?pUYX+-WR;e~rF0Zl;TH4?T<(_Nt9PUcZs zM#e-SQ($ByD>Ay8j44`Wx|;fQKo*|+e$v9vLTs9_i%cI!!|;gdnF7#uI9pVlZ#5pk{T9h^BSm>=?-!J`ln@tLo%U%dknI z#T&f6@=7Tio0=N?AdU|d@5?mlnZ#>-#InB*lFVG0+u))(O#K#J%_R}HcaP}p%?ZC zSgpo6@ZGZ((iPOM6qRBRgATnKxR%`YVp(wp!R+yv zz8kszemOfU8kuDemGpylC*O}7S|n(l87Z2kx$N<*=#P;pgQ>tEB%k4bo;?kHh!nfu zq@+r8f<62PBEuFY!8gGq_>doQWj@idW>zC3w>H6a{(;?!M&NGfUq$|_fpcm$|-hwjOlDt1StcW>i8UR zz_bb8Hrn_$yxTg5NYus%9NC^sfVp6TPRsys(vQiP;n3Lt0=LH-Qz2~cb)jiCu&I)N zcKy^c>?>MJcfFcf_?6GYxc{x1G24p#S?4Mn8WF6aF>B9gnEi>WLNVJjNMrb}%e{g_ z*VY63^c^@rzW+ N002ovPDHLkV1gh<_Cx>x literal 0 HcmV?d00001 diff --git a/mrs_uav_state_estimators/src/estimators/agl/index-detail-sort-f.html b/mrs_uav_state_estimators/src/estimators/agl/index-detail-sort-f.html new file mode 100644 index 0000000000..873bd67624 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/agl/index-detail-sort-f.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/agl + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/aglHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:7510472.1 %
    Date:2024-04-18 23:11:36Functions:61060.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    garmin_agl.cpp +
    72.1%72.1%
    +
    72.1 %75 / 10460.0 %6 / 10
    <unnamed>72.1 %75 / 10460.0 %6 / 10
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/agl/index-detail-sort-l.html b/mrs_uav_state_estimators/src/estimators/agl/index-detail-sort-l.html new file mode 100644 index 0000000000..16cc68da09 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/agl/index-detail-sort-l.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/agl + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/aglHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:7510472.1 %
    Date:2024-04-18 23:11:36Functions:61060.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    garmin_agl.cpp +
    72.1%72.1%
    +
    72.1 %75 / 10460.0 %6 / 10
    <unnamed>72.1 %75 / 10460.0 %6 / 10
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/agl/index-detail.html b/mrs_uav_state_estimators/src/estimators/agl/index-detail.html new file mode 100644 index 0000000000..82c033535b --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/agl/index-detail.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/agl + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/aglHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:7510472.1 %
    Date:2024-04-18 23:11:36Functions:61060.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    garmin_agl.cpp +
    72.1%72.1%
    +
    72.1 %75 / 10460.0 %6 / 10
    <unnamed>72.1 %75 / 10460.0 %6 / 10
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/agl/index-sort-f.html b/mrs_uav_state_estimators/src/estimators/agl/index-sort-f.html new file mode 100644 index 0000000000..2080be8355 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/agl/index-sort-f.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/agl + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/aglHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:7510472.1 %
    Date:2024-04-18 23:11:36Functions:61060.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    garmin_agl.cpp +
    72.1%72.1%
    +
    72.1 %75 / 10460.0 %6 / 10
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/agl/index-sort-l.html b/mrs_uav_state_estimators/src/estimators/agl/index-sort-l.html new file mode 100644 index 0000000000..4699be529c --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/agl/index-sort-l.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/agl + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/aglHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:7510472.1 %
    Date:2024-04-18 23:11:36Functions:61060.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    garmin_agl.cpp +
    72.1%72.1%
    +
    72.1 %75 / 10460.0 %6 / 10
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/agl/index.html b/mrs_uav_state_estimators/src/estimators/agl/index.html new file mode 100644 index 0000000000..89d8c83748 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/agl/index.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/agl + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/aglHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:7510472.1 %
    Date:2024-04-18 23:11:36Functions:61060.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    garmin_agl.cpp +
    72.1%72.1%
    +
    72.1 %75 / 10460.0 %6 / 10
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/altitude/alt_generic.cpp.func-sort-c.html b/mrs_uav_state_estimators/src/estimators/altitude/alt_generic.cpp.func-sort-c.html new file mode 100644 index 0000000000..346aa26eb9 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/altitude/alt_generic.cpp.func-sort-c.html @@ -0,0 +1,212 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/altitude/alt_generic.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/altitude - alt_generic.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:21339553.9 %
    Date:2024-04-18 23:11:36Functions:223366.7 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::AltGeneric::timerCheckHealth(ros::TimerEvent const&)0
    mrs_uav_state_estimators::AltGeneric::setCovarianceMatrix(Eigen::Matrix<double, 3, 3, 0, 3, 3> const&)0
    mrs_uav_state_estimators::AltGeneric::generateRepredictorModels(double)0
    mrs_uav_state_estimators::AltGeneric::pause()0
    mrs_uav_state_estimators::AltGeneric::reset()0
    mrs_uav_state_estimators::AltGeneric::setState(double const&, int const&, int const&)0
    mrs_uav_state_estimators::AltGeneric::setStates(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&)0
    mrs_uav_state_estimators::AltGeneric::getCovariance(int const&, int const&) const0
    mrs_uav_state_estimators::AltGeneric::getInnovation(int const&, int const&) const0
    mrs_uav_state_estimators::AltGeneric::generateRepredictorModels(double)::{lambda(double)#2}::operator()(double) const0
    mrs_uav_state_estimators::AltGeneric::generateRepredictorModels(double)::{lambda(double)#1}::operator()(double) const0
    mrs_uav_state_estimators::AltGeneric::initialize(ros::NodeHandle&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)167
    mrs_uav_state_estimators::AltGeneric::isConverged()167
    mrs_uav_state_estimators::AltGeneric::callbackReconfigure(mrs_uav_state_estimators::AltitudeEstimatorConfig&, unsigned int)167
    mrs_uav_state_estimators::AltGeneric::setState(double const&, int const&)252
    mrs_uav_state_estimators::AltGeneric::setInputCoeff(double const&)325
    mrs_uav_state_estimators::AltGeneric::getNamespacedName[abi:cxx11]() const1080
    mrs_uav_state_estimators::AltGeneric::getPrintName[abi:cxx11]() const1302
    mrs_uav_state_estimators::AltGeneric::start()4136
    mrs_uav_state_estimators::AltGeneric::getState(int const&, int const&) const141360
    mrs_uav_state_estimators::AltGeneric::initialize(ros::NodeHandle&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)::{lambda(int, int)#1}::operator()(int, int) const141362
    mrs_uav_state_estimators::AltGeneric::getInnovation(int const&) const182851
    mrs_uav_state_estimators::AltGeneric::getCovarianceMatrix() const293554
    mrs_uav_state_estimators::AltGeneric::getStates() const293722
    mrs_uav_state_estimators::AltGeneric::setDt(double const&)293729
    mrs_uav_state_estimators::AltGeneric::generateB()294209
    mrs_uav_state_estimators::AltGeneric::generateA()294239
    mrs_uav_state_estimators::AltGeneric::timerUpdate(ros::TimerEvent const&)335862
    mrs_uav_state_estimators::AltGeneric::initialize(ros::NodeHandle&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)::{lambda(mrs_uav_state_estimators::Correction<1>::MeasurementStamped const&, double, mrs_uav_managers::estimation_manager::StateId_t)#2}::operator()(mrs_uav_state_estimators::Correction<1>::MeasurementStamped const&, double, mrs_uav_managers::estimation_manager::StateId_t) const444921
    mrs_uav_state_estimators::AltGeneric::doCorrection(Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, double, mrs_uav_managers::estimation_manager::StateId_t const&, ros::Time const&)444968
    mrs_uav_state_estimators::AltGeneric::doCorrection(mrs_uav_state_estimators::Correction<1>::MeasurementStamped const&, double, mrs_uav_managers::estimation_manager::StateId_t const&)444987
    mrs_uav_state_estimators::AltGeneric::getCovariance(int const&) const630917
    mrs_uav_state_estimators::AltGeneric::getState(int const&) const1078614
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/altitude/alt_generic.cpp.func.html b/mrs_uav_state_estimators/src/estimators/altitude/alt_generic.cpp.func.html new file mode 100644 index 0000000000..23a30f00f2 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/altitude/alt_generic.cpp.func.html @@ -0,0 +1,212 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/altitude/alt_generic.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/altitude - alt_generic.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:21339553.9 %
    Date:2024-04-18 23:11:36Functions:223366.7 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::AltGeneric::initialize(ros::NodeHandle&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)167
    mrs_uav_state_estimators::AltGeneric::isConverged()167
    mrs_uav_state_estimators::AltGeneric::timerUpdate(ros::TimerEvent const&)335862
    mrs_uav_state_estimators::AltGeneric::doCorrection(Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, double, mrs_uav_managers::estimation_manager::StateId_t const&, ros::Time const&)444968
    mrs_uav_state_estimators::AltGeneric::doCorrection(mrs_uav_state_estimators::Correction<1>::MeasurementStamped const&, double, mrs_uav_managers::estimation_manager::StateId_t const&)444987
    mrs_uav_state_estimators::AltGeneric::setInputCoeff(double const&)325
    mrs_uav_state_estimators::AltGeneric::timerCheckHealth(ros::TimerEvent const&)0
    mrs_uav_state_estimators::AltGeneric::callbackReconfigure(mrs_uav_state_estimators::AltitudeEstimatorConfig&, unsigned int)167
    mrs_uav_state_estimators::AltGeneric::setCovarianceMatrix(Eigen::Matrix<double, 3, 3, 0, 3, 3> const&)0
    mrs_uav_state_estimators::AltGeneric::generateRepredictorModels(double)0
    mrs_uav_state_estimators::AltGeneric::pause()0
    mrs_uav_state_estimators::AltGeneric::reset()0
    mrs_uav_state_estimators::AltGeneric::setDt(double const&)293729
    mrs_uav_state_estimators::AltGeneric::start()4136
    mrs_uav_state_estimators::AltGeneric::setState(double const&, int const&)252
    mrs_uav_state_estimators::AltGeneric::setState(double const&, int const&, int const&)0
    mrs_uav_state_estimators::AltGeneric::generateA()294239
    mrs_uav_state_estimators::AltGeneric::generateB()294209
    mrs_uav_state_estimators::AltGeneric::setStates(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&)0
    mrs_uav_state_estimators::AltGeneric::getPrintName[abi:cxx11]() const1302
    mrs_uav_state_estimators::AltGeneric::getCovariance(int const&) const630917
    mrs_uav_state_estimators::AltGeneric::getCovariance(int const&, int const&) const0
    mrs_uav_state_estimators::AltGeneric::getInnovation(int const&) const182851
    mrs_uav_state_estimators::AltGeneric::getInnovation(int const&, int const&) const0
    mrs_uav_state_estimators::AltGeneric::getNamespacedName[abi:cxx11]() const1080
    mrs_uav_state_estimators::AltGeneric::getCovarianceMatrix() const293554
    mrs_uav_state_estimators::AltGeneric::getState(int const&) const1078614
    mrs_uav_state_estimators::AltGeneric::getState(int const&, int const&) const141360
    mrs_uav_state_estimators::AltGeneric::getStates() const293722
    mrs_uav_state_estimators::AltGeneric::initialize(ros::NodeHandle&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)::{lambda(mrs_uav_state_estimators::Correction<1>::MeasurementStamped const&, double, mrs_uav_managers::estimation_manager::StateId_t)#2}::operator()(mrs_uav_state_estimators::Correction<1>::MeasurementStamped const&, double, mrs_uav_managers::estimation_manager::StateId_t) const444921
    mrs_uav_state_estimators::AltGeneric::initialize(ros::NodeHandle&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)::{lambda(int, int)#1}::operator()(int, int) const141362
    mrs_uav_state_estimators::AltGeneric::generateRepredictorModels(double)::{lambda(double)#2}::operator()(double) const0
    mrs_uav_state_estimators::AltGeneric::generateRepredictorModels(double)::{lambda(double)#1}::operator()(double) const0
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/altitude/alt_generic.cpp.gcov.frameset.html b/mrs_uav_state_estimators/src/estimators/altitude/alt_generic.cpp.gcov.frameset.html new file mode 100644 index 0000000000..be84a0e587 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/altitude/alt_generic.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/altitude/alt_generic.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_state_estimators/src/estimators/altitude/alt_generic.cpp.gcov.html b/mrs_uav_state_estimators/src/estimators/altitude/alt_generic.cpp.gcov.html new file mode 100644 index 0000000000..ec99a42464 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/altitude/alt_generic.cpp.gcov.html @@ -0,0 +1,839 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/altitude/alt_generic.cpp + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/altitude - alt_generic.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:21339553.9 %
    Date:2024-04-18 23:11:36Functions:223366.7 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #define VERSION "0.0.6.0"
    +       2             : 
    +       3             : /* includes //{ */
    +       4             : 
    +       5             : #include <mrs_uav_state_estimators/estimators/altitude/alt_generic.h>
    +       6             : 
    +       7             : //}
    +       8             : 
    +       9             : namespace mrs_uav_state_estimators
    +      10             : 
    +      11             : {
    +      12             : 
    +      13             : /* initialize() //{*/
    +      14         167 : void AltGeneric::initialize(ros::NodeHandle &nh, const std::shared_ptr<CommonHandlers_t> &ch, const std::shared_ptr<PrivateHandlers_t> &ph) {
    +      15             : 
    +      16         167 :   ch_ = ch;
    +      17         167 :   ph_ = ph;
    +      18             : 
    +      19         167 :   ns_frame_id_ = ch_->uav_name + "/" + frame_id_;
    +      20             : 
    +      21             :   // clang-format off
    +      22         167 :   dt_ = 0.01;
    +      23         167 :   input_coeff_ = 10;
    +      24         167 :   default_input_coeff_ = 10;
    +      25             : 
    +      26         167 :   generateA();
    +      27         167 :   generateB();
    +      28             : 
    +      29         167 :   H_ <<
    +      30         167 :     1, 0, 0;
    +      31             : 
    +      32         167 :   innovation_ << 
    +      33             :     0;
    +      34             : 
    +      35             :   // clang-format on
    +      36             : 
    +      37             :   // | --------------- initialize parameter loader -------------- |
    +      38             : 
    +      39         167 :   if (is_core_plugin_) {
    +      40             : 
    +      41         167 :     ph->param_loader->addYamlFile(ros::package::getPath(package_name_) + "/config/private/" + parent_state_est_name_ + "/" + getName() + ".yaml");
    +      42         167 :     ph->param_loader->addYamlFile(ros::package::getPath(package_name_) + "/config/public/" + parent_state_est_name_ + "/" + getName() + ".yaml");
    +      43             :   }
    +      44             : 
    +      45         167 :   ph->param_loader->setPrefix(ch_->package_name + "/" + Support::toSnakeCase(ch_->nodelet_name) + "/" + getNamespacedName() + "/");
    +      46             : 
    +      47             :   // | --------------------- load parameters -------------------- |
    +      48             : 
    +      49         167 :   ph->param_loader->loadParam("max_flight_z", max_flight_z_);
    +      50         167 :   ph->param_loader->loadParam("innovation/limit", pos_innovation_limit_);
    +      51         167 :   ph->param_loader->loadParam("innovation/action", exc_innovation_action_name_);
    +      52         167 :   exc_innovation_action_ = map_exc_inno_action.at(exc_innovation_action_name_);
    +      53         167 :   ph->param_loader->loadParam("repredictor/enabled", is_repredictor_enabled_);
    +      54         167 :   if (is_repredictor_enabled_) {
    +      55           0 :     ph->param_loader->loadParam("repredictor/buffer_size", rep_buffer_size_);
    +      56             :   }
    +      57             : 
    +      58             :   // | --------------- corrections initialization --------------- |
    +      59         167 :   ph->param_loader->loadParam("corrections", correction_names_);
    +      60             : 
    +      61         412 :   for (auto corr_name : correction_names_) {
    +      62         245 :     corrections_.push_back(std::make_shared<Correction<alt_generic::n_measurements>>(
    +      63      141852 :         nh, getNamespacedName(), corr_name, ns_frame_id_, EstimatorType_t::ALTITUDE, ch_, ph_, [this](int a, int b) { return this->getState(a, b); },
    +      64      444921 :         [this](const Correction<alt_generic::n_measurements>::MeasurementStamped &meas, const double R, const StateId_t state) {
    +      65      444921 :           return this->doCorrection(meas, R, state);
    +      66             :         }));
    +      67             :   }
    +      68             : 
    +      69         167 :   ph->param_loader->setPrefix(ch_->package_name + "/" + Support::toSnakeCase(ch_->nodelet_name) + "/" + getNamespacedName() + "/");
    +      70             : 
    +      71             :   // | ----------- initialize process noise covariance ---------- |
    +      72         167 :   Q_ = Q_t::Zero();
    +      73             :   double tmp_noise;
    +      74         167 :   ph->param_loader->loadParam("process_noise/pos", tmp_noise);
    +      75         167 :   Q_(POSITION, POSITION) = tmp_noise;
    +      76         167 :   ph->param_loader->loadParam("process_noise/vel", tmp_noise);
    +      77         167 :   Q_(VELOCITY, VELOCITY) = tmp_noise;
    +      78         167 :   ph->param_loader->loadParam("process_noise/acc", tmp_noise);
    +      79         167 :   Q_(ACCELERATION, ACCELERATION) = tmp_noise;
    +      80             : 
    +      81             :   // | ------- check if all parameters loaded successfully ------ |
    +      82         167 :   if (!ph->param_loader->loadedSuccessfully()) {
    +      83           0 :     ROS_ERROR("[%s]: Could not load all non-optional parameters. Shutting down.", getPrintName().c_str());
    +      84           0 :     ros::shutdown();
    +      85             :   }
    +      86             : 
    +      87             :   // | ------------- initialize dynamic reconfigure ------------- |
    +      88             :   drmgr_ =
    +      89         167 :       std::make_unique<drmgr_t>(ros::NodeHandle("~/" + getNamespacedName()), true, getPrintName(), boost::bind(&AltGeneric::callbackReconfigure, this, _1, _2));
    +      90         167 :   drmgr_->config.pos = Q_(POSITION, POSITION);
    +      91         167 :   drmgr_->config.vel = Q_(VELOCITY, VELOCITY);
    +      92         167 :   drmgr_->config.acc = Q_(ACCELERATION, ACCELERATION);
    +      93         167 :   drmgr_->update_config(drmgr_->config);
    +      94             : 
    +      95             :   // | --------------- Kalman filter intialization -------------- |
    +      96         167 :   const x_t        x0 = x_t::Zero();
    +      97         167 :   const P_t        P0 = 1e3 * P_t::Identity();
    +      98         167 :   const statecov_t sc0({x0, P0});
    +      99         167 :   sc_ = sc0;
    +     100             : 
    +     101         167 :   lkf_ = std::make_shared<lkf_t>(A_, B_, H_);
    +     102         167 :   if (is_repredictor_enabled_) {
    +     103             : 
    +     104           0 :     generateRepredictorModels(input_coeff_);
    +     105             : 
    +     106           0 :     const u_t       u0 = u_t::Zero();
    +     107           0 :     const ros::Time t0 = ros::Time::now();
    +     108           0 :     lkf_rep_           = std::make_unique<mrs_lib::Repredictor<varstep_lkf_t>>(x0, P0, u0, Q_, t0, models_.at(0), rep_buffer_size_);
    +     109             : 
    +     110           0 :     setDt(1.0 / ch_->desired_uav_state_rate);
    +     111             :   }
    +     112             : 
    +     113             :   // | ------------------ timers initialization ----------------- |
    +     114         167 :   timer_update_ = nh.createTimer(ros::Rate(ch_->desired_uav_state_rate), &AltGeneric::timerUpdate, this);  // not running after init
    +     115             :   /* timer_check_health_       = nh.createTimer(ros::Rate(ch_->desired_uav_state_rate), &AltGeneric::timerCheckHealth, this); */
    +     116             : 
    +     117             :   // | --------------- subscribers initialization --------------- |
    +     118             :   // subscriber to odometry
    +     119         334 :   mrs_lib::SubscribeHandlerOptions shopts;
    +     120         167 :   shopts.nh                 = nh;
    +     121         167 :   shopts.node_name          = getPrintName();
    +     122         167 :   shopts.no_message_timeout = mrs_lib::no_timeout;
    +     123         167 :   shopts.threadsafe         = true;
    +     124         167 :   shopts.autostart          = true;
    +     125         167 :   shopts.queue_size         = 10;
    +     126         167 :   shopts.transport_hints    = ros::TransportHints().tcpNoDelay();
    +     127             : 
    +     128         167 :   sh_control_input_ = mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput>(shopts, "control_input_in");
    +     129             : 
    +     130             :   // | ---------------- publishers initialization --------------- |
    +     131         167 :   if (ch_->debug_topics.input) {
    +     132         167 :     ph_input_ = mrs_lib::PublisherHandler<mrs_msgs::Float64ArrayStamped>(nh, getNamespacedName() + "/input", 10);
    +     133             :   }
    +     134         167 :   if (ch_->debug_topics.output) {
    +     135         167 :     ph_output_ = mrs_lib::PublisherHandler<mrs_msgs::EstimatorOutput>(nh, getNamespacedName() + "/output", 10);
    +     136             :   }
    +     137         167 :   if (ch_->debug_topics.diag) {
    +     138           0 :     ph_diagnostics_ = mrs_lib::PublisherHandler<mrs_msgs::EstimatorDiagnostics>(nh, getNamespacedName() + "/diagnostics", 10);
    +     139             :   }
    +     140             : 
    +     141             :   // | ------------------ finish initialization ----------------- |
    +     142             : 
    +     143         167 :   if (changeState(INITIALIZED_STATE)) {
    +     144         167 :     ROS_INFO("[%s]: Estimator initialized, version %s", getPrintName().c_str(), VERSION);
    +     145             :   } else {
    +     146           0 :     ROS_INFO("[%s]: Estimator could not be initialized", getPrintName().c_str());
    +     147             :   }
    +     148         167 : }
    +     149             : /*//}*/
    +     150             : 
    +     151             : /*//{ start() */
    +     152        4136 : bool AltGeneric::start(void) {
    +     153             : 
    +     154        4136 :   if (isInState(READY_STATE)) {
    +     155             :     /* timer_update_.start(); */
    +     156         167 :     changeState(STARTED_STATE);
    +     157         167 :     return true;
    +     158             : 
    +     159             :   } else {
    +     160        3969 :     ROS_WARN_THROTTLE(1.0, "[%s]: Estimator must be in READY_STATE to start it", getPrintName().c_str());
    +     161        3969 :     return false;
    +     162             :   }
    +     163             : }
    +     164             : /*//}*/
    +     165             : 
    +     166             : /*//{ pause() */
    +     167           0 : bool AltGeneric::pause(void) {
    +     168             : 
    +     169           0 :   if (isInState(RUNNING_STATE)) {
    +     170           0 :     changeState(STOPPED_STATE);
    +     171           0 :     return true;
    +     172             : 
    +     173             :   } else {
    +     174           0 :     return false;
    +     175             :   }
    +     176             : }
    +     177             : /*//}*/
    +     178             : 
    +     179             : /*//{ reset() */
    +     180           0 : bool AltGeneric::reset(void) {
    +     181             : 
    +     182           0 :   if (!isInitialized()) {
    +     183           0 :     ROS_ERROR("[%s]: Cannot reset uninitialized estimator", getPrintName().c_str());
    +     184           0 :     return false;
    +     185             :   }
    +     186             : 
    +     187           0 :   changeState(STOPPED_STATE);
    +     188             : 
    +     189             :   // Initialize LKF state and covariance
    +     190           0 :   const x_t        x0 = x_t::Zero();
    +     191           0 :   const P_t        P0 = 1e6 * P_t::Identity();
    +     192           0 :   const statecov_t sc0({x0, P0});
    +     193           0 :   sc_ = sc0;
    +     194             : 
    +     195             :   // Instantiate the LKF itself
    +     196           0 :   lkf_ = std::make_shared<lkf_t>(A_, B_, H_);
    +     197           0 :   if (is_repredictor_enabled_) {
    +     198             : 
    +     199           0 :     const u_t       u0 = u_t::Zero();
    +     200           0 :     const ros::Time t0 = ros::Time(0);
    +     201           0 :     lkf_rep_           = std::make_unique<mrs_lib::Repredictor<varstep_lkf_t>>(x0, P0, u0, Q_, t0, models_.at(0), rep_buffer_size_);
    +     202             :   }
    +     203             : 
    +     204           0 :   ROS_INFO("[%s]: Estimator reset", getPrintName().c_str());
    +     205             : 
    +     206           0 :   return true;
    +     207             : }
    +     208             : /*//}*/
    +     209             : 
    +     210             : /* timerUpdate() //{*/
    +     211      335862 : void AltGeneric::timerUpdate(const ros::TimerEvent &event) {
    +     212             : 
    +     213             : 
    +     214      335862 :   if (!isInitialized()) {
    +     215       42057 :     return;
    +     216             :   }
    +     217             : 
    +     218      335730 :   switch (getCurrentSmState()) {
    +     219             : 
    +     220           0 :     case UNINITIALIZED_STATE: {
    +     221           0 :       ROS_INFO_THROTTLE(1.0, "[%s]: %s initialization", getPrintName().c_str(), Support::waiting_for_string.c_str());
    +     222           0 :       break;
    +     223             :     }
    +     224             : 
    +     225        5813 :     case READY_STATE: {
    +     226        5813 :       ROS_INFO_THROTTLE(1.0, "[%s]: %s estimator start", getPrintName().c_str(), Support::waiting_for_string.c_str());
    +     227        5813 :       break;
    +     228             :     }
    +     229             : 
    +     230        8488 :     case INITIALIZED_STATE: {
    +     231             :       // initialize the estimator with current corrections
    +     232        8745 :       for (auto correction : corrections_) {
    +     233        8564 :         auto res = correction->getProcessedCorrection();
    +     234        8563 :         if (res) {
    +     235         252 :           auto measurement_stamped = res.value();
    +     236         252 :           setState(measurement_stamped.value(0), correction->getStateId());
    +     237         252 :           ROS_INFO("[%s]: Setting initial state to: %.2f", getPrintName().c_str(), measurement_stamped.value(0));
    +     238             :         } else {
    +     239        8310 :           ROS_INFO_THROTTLE(1.0, "[%s]: %s correction %s", getPrintName().c_str(), Support::waiting_for_string.c_str(),
    +     240             :                             correction->getNamespacedName().c_str());
    +     241        8318 :           return;
    +     242             :         }
    +     243             :       }
    +     244         167 :       changeState(READY_STATE);
    +     245         167 :       ROS_INFO_THROTTLE(1.0, "[%s]: Ready to start", getPrintName().c_str());
    +     246         167 :       break;
    +     247             :     }
    +     248             : 
    +     249         167 :     case STARTED_STATE: {
    +     250         167 :       ROS_INFO_THROTTLE(1.0, "[%s]: %s for convergence of LKF", getPrintName().c_str(), Support::waiting_for_string.c_str());
    +     251             : 
    +     252         167 :       if (isConverged()) {
    +     253         167 :         ROS_INFO_THROTTLE(1.0, "[%s]: LKF converged", getPrintName().c_str());
    +     254         167 :         changeState(RUNNING_STATE);
    +     255             :       }
    +     256         167 :       break;
    +     257             :     }
    +     258             : 
    +     259      321380 :     case RUNNING_STATE: {
    +     260      799460 :       for (auto correction : corrections_) {
    +     261      477895 :         if (!correction->isHealthy()) {
    +     262           0 :           ROS_ERROR_THROTTLE(1.0, "[%s]: Correction %s is not healthy!", getPrintName().c_str(), correction->getNamespacedName().c_str());
    +     263           0 :           changeState(ERROR_STATE);
    +     264             :         }
    +     265             :       }
    +     266      321399 :       break;
    +     267             :     }
    +     268             : 
    +     269           0 :     case STOPPED_STATE: {
    +     270           0 :       ROS_INFO_THROTTLE(1.0, "[%s]: Estimator is stopped", getPrintName().c_str());
    +     271           0 :       break;
    +     272             :     }
    +     273             : 
    +     274           0 :     case ERROR_STATE: {
    +     275           0 :       ROS_INFO_THROTTLE(1.0, "[%s]: Estimator is in ERROR state", getPrintName().c_str());
    +     276           0 :       ros::Time t_now = ros::Time::now();
    +     277           0 :       if (is_error_state_first_time_) {
    +     278           0 :         prev_time_in_error_state_  = t_now;
    +     279           0 :         is_error_state_first_time_ = false;
    +     280           0 :         error_state_duration_      = ros::Duration(0.0);
    +     281             :       }
    +     282           0 :       error_state_duration_ += t_now - prev_time_in_error_state_;
    +     283             : 
    +     284             : 
    +     285             :       // check if all corrections are healthy now
    +     286           0 :       bool all_corrections_healthy = true;
    +     287           0 :       for (auto correction : corrections_) {
    +     288           0 :         if (!correction->isHealthy()) {
    +     289           0 :           ROS_ERROR_THROTTLE(1.0, "[%s]: Correction %s is not healthy!", getPrintName().c_str(), correction->getNamespacedName().c_str());
    +     290           0 :           all_corrections_healthy = false;
    +     291             :         }
    +     292             :       }
    +     293             : 
    +     294           0 :       if (all_corrections_healthy && innovation_ok_) {
    +     295             :         // initialize the estimator again if corrections become healthy
    +     296           0 :         if (error_state_duration_.toSec() > 5.0) {
    +     297           0 :           ROS_INFO("[%s]: corrections healthy for %.2f s", getPrintName().c_str(), error_state_duration_.toSec());
    +     298           0 :           changeState(INITIALIZED_STATE);
    +     299           0 :           is_error_state_first_time_ = true;
    +     300           0 :         }
    +     301             :       } else {
    +     302           0 :         is_error_state_first_time_ = true;
    +     303             :       }
    +     304             : 
    +     305           0 :       prev_time_in_error_state_ = t_now;
    +     306             : 
    +     307           0 :       break;
    +     308             :     }
    +     309             :   }
    +     310             : 
    +     311      327551 :   if (sh_control_input_.newMsg()) {
    +     312      154212 :     is_input_ready_ = true;
    +     313             :   }
    +     314             : 
    +     315             :   // check age of input
    +     316      327494 :   if (is_input_ready_ && (ros::Time::now() - sh_control_input_.lastMsgTime()).toSec() > 0.1) {
    +     317          27 :     ROS_WARN_THROTTLE(1.0, "[%s]: input too old (%.4f), using zero input instead", getPrintName().c_str(),
    +     318             :                       (ros::Time::now() - sh_control_input_.lastMsgTime()).toSec());
    +     319          27 :     is_input_ready_ = false;
    +     320             :   }
    +     321             : 
    +     322      327245 :   if (!isRunning() && !isStarted()) {
    +     323        5972 :     return;
    +     324             :   }
    +     325             : 
    +     326      321278 :   if (first_iter_) {
    +     327         167 :     first_iter_ = false;
    +     328         167 :     return;
    +     329             :   }
    +     330             : 
    +     331      321111 :   double dt = (event.current_real - event.last_real).toSec();
    +     332      321205 :   if (dt <= 0.0) {
    +     333       27577 :     return;
    +     334             :   }
    +     335             : 
    +     336      293628 :   if (!is_repredictor_enabled_) {  // repredictor calculates dt on its own
    +     337      293131 :     setDt(dt);
    +     338             :   }
    +     339             : 
    +     340             :   // prediction step
    +     341      293803 :   u_t       u;
    +     342      293091 :   ros::Time input_stamp;
    +     343      293247 :   if (is_input_ready_) {
    +     344      174313 :     mrs_msgs::EstimatorInputConstPtr msg            = sh_control_input_.getMsg();
    +     345      174380 :     const tf2::Vector3               des_acc_global = getAccGlobal(msg, 0);  // we don't care about heading
    +     346      174743 :     input_stamp                                     = msg->header.stamp;
    +     347      174136 :     if (input_coeff_ != default_input_coeff_){
    +     348         131 :       setInputCoeff(default_input_coeff_);
    +     349             :     }
    +     350      174135 :     u(0) = des_acc_global.getZ();
    +     351             :   } else {
    +     352      118463 :     ROS_DEBUG_THROTTLE(1.0, "[%s]: not receiving control input, estimation suboptimal, potentially unstable", getPrintName().c_str());
    +     353      118889 :     input_stamp = ros::Time::now();
    +     354      118985 :     if (input_coeff_ != 0){
    +     355         194 :       setInputCoeff(0);
    +     356             :     }
    +     357      118985 :     u = u_t::Zero();
    +     358             :   }
    +     359             : 
    +     360             :   // go through available corrections and apply them
    +     361             :   /* for (auto correction : corrections_) { */
    +     362             :   /*   auto res = correction->getProcessedCorrection(); */
    +     363             :   /*   if (res) { */
    +     364             :   /*     auto measurement_stamped = res.value(); */
    +     365             :   /*     doCorrection(measurement_stamped.value, correction->getR(), correction->getStateId(), measurement_stamped.stamp); */
    +     366             :   /*   } */
    +     367             :   /* } */
    +     368             : 
    +     369      292022 :   statecov_t sc = mrs_lib::get_mutexed(mutex_sc_, sc_);
    +     370      293097 :   Q_t        Q  = mrs_lib::get_mutexed(mtx_Q_, Q_);
    +     371             : 
    +     372             :   try {
    +     373             :     // Apply the prediction step
    +     374      585344 :     std::scoped_lock lock(mutex_lkf_);
    +     375      292501 :     if (is_repredictor_enabled_) {
    +     376           0 :       lkf_rep_->addInputChangeWithNoise(u, Q, input_stamp, models_[0]);
    +     377           0 :       sc = lkf_rep_->predictTo(ros::Time::now());
    +     378             :     } else {
    +     379      292501 :       sc = lkf_->predict(sc, u, Q, dt_);
    +     380             :     }
    +     381             :   }
    +     382           0 :   catch (const std::exception &e) {
    +     383             :     // In case of error, alert the user
    +     384           0 :     ROS_ERROR("[%s]: LKF prediction failed: %s", getPrintName().c_str(), e.what());
    +     385             :   }
    +     386             : 
    +     387      290980 :   mrs_lib::set_mutexed(mutex_sc_, sc, sc_);
    +     388             : 
    +     389             :   // publishing
    +     390      292182 :   publishInput(u, input_stamp);
    +     391      293733 :   publishOutput();
    +     392      293788 :   publishDiagnostics();
    +     393             : }
    +     394             : /*//}*/
    +     395             : 
    +     396             : /*//{ timerCheckHealth() */
    +     397           0 : void AltGeneric::timerCheckHealth([[maybe_unused]] const ros::TimerEvent &event) {
    +     398             : 
    +     399           0 :   if (!isInitialized()) {
    +     400           0 :     return;
    +     401             :   }
    +     402             : 
    +     403           0 :   switch (getCurrentSmState()) {
    +     404             : 
    +     405           0 :     case UNINITIALIZED_STATE: {
    +     406           0 :       ROS_INFO_THROTTLE(1.0, "[%s]: %s initialization", getPrintName().c_str(), Support::waiting_for_string.c_str());
    +     407           0 :       break;
    +     408             :     }
    +     409             : 
    +     410           0 :     case READY_STATE: {
    +     411           0 :       ROS_INFO_THROTTLE(1.0, "[%s]: %s estimator start", getPrintName().c_str(), Support::waiting_for_string.c_str());
    +     412           0 :       break;
    +     413             :     }
    +     414             : 
    +     415           0 :     case INITIALIZED_STATE: {
    +     416             : 
    +     417             :       // initialize the estimator with current corrections
    +     418           0 :       for (auto correction : corrections_) {
    +     419           0 :         auto res = correction->getProcessedCorrection();
    +     420           0 :         if (res) {
    +     421           0 :           auto measurement_stamped = res.value();
    +     422           0 :           setState(measurement_stamped.value(0), correction->getStateId());
    +     423           0 :           ROS_INFO_THROTTLE(1.0, "[%s]: Setting initial state to: %.2f", getPrintName().c_str(), measurement_stamped.value(0));
    +     424             :         } else {
    +     425           0 :           ROS_INFO_THROTTLE(1.0, "[%s]: %s correction %s", getPrintName().c_str(), Support::waiting_for_string.c_str(),
    +     426             :                             correction->getNamespacedName().c_str());
    +     427           0 :           return;
    +     428             :         }
    +     429             :       }
    +     430           0 :       changeState(READY_STATE);
    +     431           0 :       ROS_INFO_THROTTLE(1.0, "[%s]: Ready to start", getPrintName().c_str());
    +     432           0 :       break;
    +     433             :     }
    +     434             : 
    +     435           0 :     case STARTED_STATE: {
    +     436           0 :       ROS_INFO_THROTTLE(1.0, "[%s]: %s for convergence of LKF", getPrintName().c_str(), Support::waiting_for_string.c_str());
    +     437             : 
    +     438           0 :       if (isConverged()) {
    +     439           0 :         ROS_INFO_THROTTLE(1.0, "[%s]: LKF converged", getPrintName().c_str());
    +     440           0 :         changeState(RUNNING_STATE);
    +     441             :       }
    +     442           0 :       break;
    +     443             :     }
    +     444             : 
    +     445           0 :     case RUNNING_STATE: {
    +     446           0 :       for (auto correction : corrections_) {
    +     447           0 :         if (!correction->isHealthy()) {
    +     448           0 :           ROS_ERROR_THROTTLE(1.0, "[%s]: Correction %s is not healthy!", getPrintName().c_str(), correction->getNamespacedName().c_str());
    +     449           0 :           changeState(ERROR_STATE);
    +     450             :         }
    +     451             :       }
    +     452           0 :       break;
    +     453             :     }
    +     454             : 
    +     455           0 :     case STOPPED_STATE: {
    +     456           0 :       ROS_INFO_THROTTLE(1.0, "[%s]: Estimator is stopped", getPrintName().c_str());
    +     457           0 :       break;
    +     458             :     }
    +     459             : 
    +     460           0 :     case ERROR_STATE: {
    +     461           0 :       ROS_INFO_THROTTLE(1.0, "[%s]: Estimator is in ERROR state", getPrintName().c_str());
    +     462           0 :       bool all_corrections_healthy = true;
    +     463           0 :       for (auto correction : corrections_) {
    +     464           0 :         if (!correction->isHealthy()) {
    +     465           0 :           ROS_ERROR_THROTTLE(1.0, "[%s]: Correction %s is not healthy!", getPrintName().c_str(), correction->getNamespacedName().c_str());
    +     466           0 :           all_corrections_healthy = false;
    +     467             :         }
    +     468             :       }
    +     469             :       // initialize the estimator again if corrections become healthy
    +     470           0 :       if (all_corrections_healthy) {
    +     471           0 :         changeState(INITIALIZED_STATE);
    +     472             :       }
    +     473           0 :       break;
    +     474             :     }
    +     475             :   }
    +     476             : 
    +     477           0 :   if (sh_control_input_.newMsg()) {
    +     478           0 :     is_input_ready_ = true;
    +     479             :   }
    +     480             : 
    +     481             :   // check age of input
    +     482           0 :   if (is_input_ready_ && (ros::Time::now() - sh_control_input_.lastMsgTime()).toSec() > 0.1) {
    +     483           0 :     ROS_WARN_THROTTLE(1.0, "[%s]: input too old (%.4f), using zero input instead", getPrintName().c_str(),
    +     484             :                       (ros::Time::now() - sh_control_input_.lastMsgTime()).toSec());
    +     485           0 :     is_input_ready_ = false;
    +     486             :   }
    +     487             : }
    +     488             : /*//}*/
    +     489             : 
    +     490             : /*//{ doCorrection() */
    +     491      444987 : void AltGeneric::doCorrection(const Correction<alt_generic::n_measurements>::MeasurementStamped &meas, const double R, const StateId_t &state_id) {
    +     492      444987 :   doCorrection(meas.value, R, state_id, meas.stamp);
    +     493      444698 : }
    +     494             : /*//}*/
    +     495             : 
    +     496             : /*//{ doCorrection() */
    +     497      444968 : void AltGeneric::doCorrection(const z_t &z, const double R, const StateId_t &H_idx, const ros::Time &meas_stamp) {
    +     498             : 
    +     499      444968 :   if (!isInitialized()) {
    +     500        4222 :     return;
    +     501             :   }
    +     502             : 
    +     503             :   // we do not want to perform corrections until the estimator is initialized
    +     504      444853 :   if (!(isInState(SMStates_t::READY_STATE) || isInState(SMStates_t::RUNNING_STATE) || isInState(SMStates_t::STARTED_STATE))) {
    +     505        4220 :     return;
    +     506             :   }
    +     507             : 
    +     508             :   // for position state check the innovation
    +     509      440450 :   if (H_idx == POSITION) {
    +     510      255983 :     std::scoped_lock lock(mtx_innovation_);
    +     511             : 
    +     512      256052 :     is_mitigating_jump_ = false;
    +     513      256148 :     innovation_(0)      = z(0) - getState(POSITION);
    +     514             : 
    +     515      256084 :     if (fabs(innovation_(0)) > pos_innovation_limit_) {
    +     516           0 :       ROS_WARN_THROTTLE(1.0, "[%s]: innovation too large - [%.2f] lim: %.2f", getPrintName().c_str(), innovation_(0), pos_innovation_limit_);
    +     517           0 :       innovation_ok_ = false;
    +     518           0 :       switch (exc_innovation_action_) {
    +     519           0 :         case ExcInnoAction_t::ELAND: {
    +     520           0 :           ROS_WARN_THROTTLE(1.0, "[%s]: large innovation should trigger eland in control manager", getPrintName().c_str());
    +     521           0 :           changeState(ERROR_STATE);
    +     522           0 :           break;
    +     523             :         }
    +     524           0 :         case ExcInnoAction_t::SWITCH: {
    +     525           0 :           ROS_WARN_THROTTLE(1.0, "[%s]: innovation should trigger estimator switch but no eland", getPrintName().c_str());
    +     526           0 :           innovation_(0) = 0.0;  // this is quite hacky but is there other way to switch estimators and not trigger eland by the large innovation?
    +     527           0 :           changeState(ERROR_STATE);
    +     528           0 :           break;
    +     529             :         }
    +     530           0 :         case ExcInnoAction_t::MITIGATE: {
    +     531           0 :           ROS_WARN_THROTTLE(1.0, "[%s]: large innovation should trigger estimate jump mitigation", getPrintName().c_str());
    +     532           0 :           innovation_(0)      = 0.0;  // this is quite hacky but is there other way to switch estimators and not trigger eland by the large innovation?
    +     533           0 :           is_mitigating_jump_ = true;
    +     534           0 :           setState(z(0), POSITION);
    +     535           0 :           break;
    +     536             :         }
    +     537           0 :         case ExcInnoAction_t::NONE: {
    +     538           0 :           ROS_WARN_THROTTLE(1.0, "[%s]: large innovation ignored", getPrintName().c_str());
    +     539           0 :           break;
    +     540             :         }
    +     541             :       }
    +     542             :     }
    +     543      256100 :     innovation_ok_ = true;
    +     544             :   }
    +     545             : 
    +     546      440567 :   statecov_t sc = mrs_lib::get_mutexed(mutex_sc_, sc_);
    +     547             :   try {
    +     548             :     // Apply the correction step
    +     549             :     {
    +     550      879638 :       std::scoped_lock lock(mutex_lkf_);
    +     551      440697 :       H_        = H_t::Zero();
    +     552      440609 :       H_(H_idx) = 1;
    +     553      440129 :       lkf_->H   = H_;
    +     554      439066 :       if (is_repredictor_enabled_) {
    +     555             : 
    +     556           0 :         lkf_rep_->addMeasurement(z, R_t::Ones() * R, meas_stamp, models_[H_idx]);
    +     557             :       } else {
    +     558      439066 :         sc = lkf_->correct(sc, z, R_t::Ones() * R);
    +     559             :       }
    +     560             :     }
    +     561             :   }
    +     562           0 :   catch (const std::exception &e) {
    +     563             :     // In case of error, alert the user
    +     564           0 :     ROS_ERROR("[%s]: LKF correction failed: %s", getPrintName().c_str(), e.what());
    +     565             :   }
    +     566             : 
    +     567      436883 :   mrs_lib::set_mutexed(mutex_sc_, sc, sc_);
    +     568             : }  // namespace mrs_uav_state_estimators
    +     569             : /*//}*/
    +     570             : 
    +     571             : /*//{ isConverged() */
    +     572         167 : bool AltGeneric::isConverged() {
    +     573             : 
    +     574             :   // TODO: check convergence by rate of change of determinant
    +     575             : 
    +     576         167 :   return true;
    +     577             : }
    +     578             : /*//}*/
    +     579             : 
    +     580             : /*//{ getState() */
    +     581      141360 : double AltGeneric::getState(const int &state_id_in, const int &axis_in) const {
    +     582      141360 :   return getState(stateIdToIndex(state_id_in, axis_in));
    +     583             : }
    +     584             : 
    +     585     1078614 : double AltGeneric::getState(const int &state_idx_in) const {
    +     586     1078614 :   return mrs_lib::get_mutexed(mutex_sc_, sc_).x(state_idx_in);
    +     587             : }
    +     588             : /*//}*/
    +     589             : 
    +     590             : /*//{ setState() */
    +     591           0 : void AltGeneric::setState(const double &state_in, const int &state_id_in, const int &axis_in) {
    +     592           0 :   setState(state_in, stateIdToIndex(state_id_in, axis_in));
    +     593           0 : }
    +     594             : 
    +     595         252 : void AltGeneric::setState(const double &state_in, const int &state_idx_in) {
    +     596         252 :   mrs_lib::set_mutexed(mutex_sc_, state_in, sc_.x(state_idx_in));
    +     597         252 : }
    +     598             : /*//}*/
    +     599             : 
    +     600             : /*//{ getStates() */
    +     601      293722 : AltGeneric::states_t AltGeneric::getStates(void) const {
    +     602      586960 :   return mrs_lib::get_mutexed(mutex_sc_, sc_).x;
    +     603             : }
    +     604             : /*//}*/
    +     605             : 
    +     606             : /*//{ setStates() */
    +     607           0 : void AltGeneric::setStates(const states_t &states_in) {
    +     608           0 :   mrs_lib::set_mutexed(mutex_sc_, states_in, sc_.x);
    +     609           0 : }
    +     610             : /*//}*/
    +     611             : 
    +     612             : /*//{ getCovariance() */
    +     613           0 : double AltGeneric::getCovariance(const int &state_id_in, const int &axis_in) const {
    +     614           0 :   return getCovariance(stateIdToIndex(state_id_in, axis_in));
    +     615             : }
    +     616             : 
    +     617      630917 : double AltGeneric::getCovariance(const int &state_idx_in) const {
    +     618      630917 :   return mrs_lib::get_mutexed(mutex_sc_, sc_).P(state_idx_in, state_idx_in);
    +     619             : }
    +     620             : /*//}*/
    +     621             : 
    +     622             : /*//{ getCovarianceMatrix() */
    +     623      293554 : AltGeneric::covariance_t AltGeneric::getCovarianceMatrix(void) const {
    +     624      586662 :   return mrs_lib::get_mutexed(mutex_sc_, sc_).P;
    +     625             : }
    +     626             : /*//}*/
    +     627             : 
    +     628             : /*//{ setCovarianceMatrix() */
    +     629           0 : void AltGeneric::setCovarianceMatrix(const covariance_t &cov_in) {
    +     630           0 :   mrs_lib::set_mutexed(mutex_sc_, cov_in, sc_.P);
    +     631           0 : }
    +     632             : /*//}*/
    +     633             : 
    +     634             : /*//{ getInnovation() */
    +     635      182851 : double AltGeneric::getInnovation(const int &state_idx) const {
    +     636      182851 :   return mrs_lib::get_mutexed(mtx_innovation_, innovation_)(state_idx);
    +     637             : }
    +     638             : 
    +     639           0 : double AltGeneric::getInnovation(const int &state_id_in, const int &axis_in) const {
    +     640           0 :   return getInnovation(stateIdToIndex(state_id_in, axis_in));
    +     641             : }
    +     642             : /*//}*/
    +     643             : 
    +     644             : /*//{ setDt() */
    +     645      293729 : void AltGeneric::setDt(const double &dt) {
    +     646      293729 :   dt_ = dt;
    +     647      293729 :   generateA();
    +     648      293521 :   generateB();
    +     649      586850 :   std::scoped_lock lock(mutex_lkf_);
    +     650      293280 :   lkf_->A = A_;
    +     651      293393 :   lkf_->B = B_;
    +     652      293056 : }
    +     653             : /*//}*/
    +     654             : 
    +     655             : /*//{ setInputCoeff() */
    +     656         325 : void AltGeneric::setInputCoeff(const double &input_coeff) {
    +     657         325 :   input_coeff_ = input_coeff;
    +     658         325 :   generateA();
    +     659         321 :   generateB();
    +     660         644 :   std::scoped_lock lock(mutex_lkf_);
    +     661         322 :   lkf_->A = A_;
    +     662         323 :   lkf_->B = B_;
    +     663             : 
    +     664         321 :   if (is_repredictor_enabled_) {
    +     665           0 :     models_.clear();
    +     666           0 :     generateRepredictorModels(input_coeff_);
    +     667             :   }
    +     668         324 : }
    +     669             : /*//}*/
    +     670             : 
    +     671             : /*//{ generateRepredictorModels() */
    +     672           0 : void AltGeneric::generateRepredictorModels(const double input_coeff) {
    +     673             : 
    +     674           0 :     for (int i = 0; i < alt_generic::n_states; i++) {
    +     675             : 
    +     676           0 :       auto lambda_generateA = [input_coeff](const double dt) {
    +     677           0 :         A_t A;
    +     678             :         // clang-format off
    +     679           0 :         A <<
    +     680           0 :           1, dt, 0.5 * dt * dt,
    +     681           0 :           0, 1, dt,
    +     682           0 :           0, 0, 1-(input_coeff * dt);
    +     683             :         // clang-format on
    +     684           0 :         return A;
    +     685           0 :       };
    +     686             : 
    +     687           0 :       auto lambda_generateB = [input_coeff]([[maybe_unused]] const double dt) {
    +     688           0 :         B_t B = B.Zero();
    +     689             :         // clang-format off
    +     690           0 :         B <<
    +     691             :           0,
    +     692           0 :           0,
    +     693           0 :           (input_coeff * dt);
    +     694             :         // clang-format on
    +     695           0 :         return B;
    +     696           0 :       };
    +     697             : 
    +     698           0 :       H_t H = H_t::Zero();
    +     699           0 :       H(i)  = 1;
    +     700           0 :       models_.push_back(std::make_shared<varstep_lkf_t>(lambda_generateA, lambda_generateB, H));
    +     701             :     }
    +     702           0 : }
    +     703             : /*//}*/
    +     704             : 
    +     705             : /*//{ generateA() */
    +     706      294239 : void AltGeneric::generateA() {
    +     707             : 
    +     708             :   // clang-format off
    +     709      294239 :     A_ <<
    +     710      293605 :       1, dt_, 0.5 * dt_ * dt_,
    +     711      293760 :       0, 1, dt_,
    +     712      293878 :       0, 0, 1-(input_coeff_ * dt_);
    +     713             :   // clang-format on
    +     714      293693 : }
    +     715             : /*//}*/
    +     716             : 
    +     717             : /*//{ generateB() */
    +     718      294209 : void AltGeneric::generateB() {
    +     719             : 
    +     720             :   // clang-format off
    +     721      294209 :     B_ <<
    +     722             :       0,
    +     723      293426 :       0,
    +     724      293510 :       (input_coeff_ * dt_);
    +     725             :   // clang-format on
    +     726      293417 : }
    +     727             : /*//}*/
    +     728             : 
    +     729             : /*//{ callbackReconfigure() */
    +     730         167 : void AltGeneric::callbackReconfigure(AltitudeEstimatorConfig &config, [[maybe_unused]] uint32_t level) {
    +     731             : 
    +     732         167 :   if (!isInitialized()) {
    +     733         167 :     return;
    +     734             :   }
    +     735             : 
    +     736           0 :   Q_t Q;
    +     737           0 :   Q(POSITION, POSITION)         = config.pos;
    +     738           0 :   Q(VELOCITY, VELOCITY)         = config.vel;
    +     739           0 :   Q(ACCELERATION, ACCELERATION) = config.acc;
    +     740           0 :   mrs_lib::set_mutexed(mtx_Q_, Q, Q_);
    +     741             : }
    +     742             : /*//}*/
    +     743             : 
    +     744             : /*//{ getNamespacedName() */
    +     745        1080 : std::string AltGeneric::getNamespacedName() const {
    +     746        2160 :   return parent_state_est_name_ + "/" + getName();
    +     747             : }
    +     748             : /*//}*/
    +     749             : 
    +     750             : /*//{ getPrintName() */
    +     751        1302 : std::string AltGeneric::getPrintName() const {
    +     752        2604 :   return ch_->nodelet_name + "/" + parent_state_est_name_ + "/" + getName();
    +     753             : }
    +     754             : /*//}*/
    +     755             : };  // namespace mrs_uav_state_estimators
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/altitude/alt_generic.cpp.gcov.overview.html b/mrs_uav_state_estimators/src/estimators/altitude/alt_generic.cpp.gcov.overview.html new file mode 100644 index 0000000000..e22283543d --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/altitude/alt_generic.cpp.gcov.overview.html @@ -0,0 +1,209 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/altitude/alt_generic.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_state_estimators/src/estimators/altitude/alt_generic.cpp.gcov.png b/mrs_uav_state_estimators/src/estimators/altitude/alt_generic.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..a245dc5de33175ed9ba05e949e66467ab8dabd3b GIT binary patch literal 2916 zcmV-q3!C(bP)7#*!!f{)a0oWA3(ZC}!{Y0or(m-fx3MGDN9)Q@A~jiK&zJOLjHfTLb4={3{Cd5{S2m1&H~K|4fTJ5; z#=Oj_fcVsQjAQtDyi6y-F%lyye6+*>)UY*TfK}jT_M8cbPdx%VZ82_;^_iQguH)RN z#xTC2h7EsH!|2W9BiNyyjAq|#N(R#NvBDl~?0l>ZtCkIbknFVVj570XkPLsL$x^U` z>)}oadh4B?5trzHGKMS6Gv8<20@MnEi`o>ZWCa zMgzwaX_D`3$@a|q|MR+R|1ra}f8XC=fEC+wrIF$SNmh!^nH>bu8P%q6(?9Z4!Ap9) z$AVC_0+Ma2ia#Dga_&s)y`6-(n#kgtc_HvzP=N1$It@6%uL37<2?P~%QM%x;QlPo=CGLay06724DskQ@*N&>y9XPR<6nqXCF% zrF#4Rut|Ut!;^T>W{0FTMqsMs{!Wmq17bn$WrFJ+sWoy;-(t@SS>~w&X_>Atdz4u! z17<1sk^N*ISc8{>4(4&`j@jTnDX40HNzsmHBnxWh z2rj5y4eS{_dx|?aBnjWqS8-gBM8g3Bd>p{deutPcJ$8+*wiP_)B4f0Z zOCfs>IM#zmUpXUuN~I{2*wPW_8WKQ5Uk48uv;{=s+-zzR3zK7{AuQIB6)@K0nE{iZ zT`n-woGh#q7v|BK$rQm1H&KO}X%;pxiZR74tY8dhPz5lX+XU$hBLggCG(kpw&CcMq z2gocQ4iZ0koCCcdObc_UGeFJ1wt&cy)T)I5!_VItcCgpNz3gCL!|Bev<4+#!L`;#E z0x?VMZF|6lr-mie7BG$x=r#z3?Lun(6eNIhERutE?P*9qmFnotACDvm0)Mswc!lo?*q^v2Ia=Hz_ zpo1+AJ2c0F)w#-z=NAOxhb`N!StV6M#26w=h^wR`iE%EZ;r9`^>q;ET@Ntax*T2f1 zK=tVREw$#kPv%l|FEn3cm5ZMyX6H4DK`aqbr}Sty1&G)`zcZeekq1)a5z`H{GoM&v zC>PX9IfG>)dgY|pUl#!3`wFQ|@V97Udtm|NnL|t$HsQ7HLQsW#GQ#MmPAq^-m)v?O z69Yy_L(<`=_oblS5782j^b*e&hEB%FQk3S7*;72Zn31on5oS-hiIV`Y&>6aZ`DE3$ zOoxtYl*h|?3lNJ`FJF+?9};R%k076 z;NcptGWQ^Lmzbfgu@j2o>pry((fvU_52tqscbbeLtv?4ad(@02tQ%oOd#LHv42IW;{zjM7cs zeBZUs&8W$)m|-u9s{~jx_HgsuRShhfO=M$DGX+c%=13^O(b&KOh}uQveMa|5-4B1J zK>L$CZpcT+4X1Y?rc6&$GL>~9Syg*5M}kk?lKR}uvY?DP;9Nhvd?t?YDLpx2ZqIKa zNuvNbhXcfS8Z%3QoUbxQe==qH$1sG&IOOk+Z=uC4} z%BPO!g;}(=)Tf*Q&jGW!v*yQ*e|cuOP*`lK&p?15-I<$|U4F5WJAKK{Byzj{BbD6$ z>xG4p`V>9gH0&ut$cR>qWN!8pJ^ZNIJH0A}bph~bcqz1UPnSd=a8-(kp&&u>5j)YP zSjac?(HuX9BO%u@s@2R^_I&(0M>Q4}`kIxCm~ld5mT12?6j|s5ZU}EcD}< zwnwYoze(GsxgYicNEE$Mj`QJC-^x=t##}N!OpJTRVdY}Xz}u*cYs~YwKTO%N`b@D% zOMt`C5}ZG;=#8m)KR%}@&ah9SJ9ES|^XyIOvNAxWEiBkafBmX*B!wIRn_k5z+IzO* z#jg?f!;z!CscmP1sa9A{{^OGPW*f^FpYx_$&PVe5UR29ugIkzTJ=wI%WS{mE$aNe@ zFzP-{%*PM2M{&+->TTeXcYo<@I)6nSif&|Kl*EwMxeXp*D=}^~sv>kJdCz6dx2M z{KCMe)==@nYVoZF+DGuKd*@M;TirasCu7{A?po~-c_kb-p+LE5n=AZAHwZVS>Kg7+nrM^aUImgHW{JX6 zv~G~6s5X6x!j(y5K_0U;-asC!R7>LJy@gnM)_9P=oJbEWkE z!|QoXTRBuU#HogdC}qASm!%de_K_YWdIx!|ZjMYuu8d!$g;lCWA)86hyoWAoVYr*c z#q1ljupr@)(N(;ZzW5cJMI4g8EV67AQ07O=a1Kz-$ z0hCLyj>1K(~+c}p4P7hd|HU@P3Q?g+R zF*S@kCZtgkp!tj~WGA*w4Z1BnAZiU&mu%trfaUEAfZwo%OZl;i1h@h$PrGNuvCoIM z7Tv(T1`--)Ke-tH7&!2Q&Rp%o_)n&(00N%^5dfW|Q@DQVpAuIq + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/altitude + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/altitudeHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:21339553.9 %
    Date:2024-04-18 23:11:36Functions:223366.7 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    alt_generic.cpp +
    53.9%53.9%
    +
    53.9 %213 / 39566.7 %22 / 33
    <unnamed>53.9 %213 / 39566.7 %22 / 33
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/altitude/index-detail-sort-l.html b/mrs_uav_state_estimators/src/estimators/altitude/index-detail-sort-l.html new file mode 100644 index 0000000000..db9a4e8d25 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/altitude/index-detail-sort-l.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/altitude + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/altitudeHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:21339553.9 %
    Date:2024-04-18 23:11:36Functions:223366.7 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    alt_generic.cpp +
    53.9%53.9%
    +
    53.9 %213 / 39566.7 %22 / 33
    <unnamed>53.9 %213 / 39566.7 %22 / 33
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/altitude/index-detail.html b/mrs_uav_state_estimators/src/estimators/altitude/index-detail.html new file mode 100644 index 0000000000..2e4f1cd74a --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/altitude/index-detail.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/altitude + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/altitudeHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:21339553.9 %
    Date:2024-04-18 23:11:36Functions:223366.7 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    alt_generic.cpp +
    53.9%53.9%
    +
    53.9 %213 / 39566.7 %22 / 33
    <unnamed>53.9 %213 / 39566.7 %22 / 33
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/altitude/index-sort-f.html b/mrs_uav_state_estimators/src/estimators/altitude/index-sort-f.html new file mode 100644 index 0000000000..d12eb9dbf0 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/altitude/index-sort-f.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/altitude + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/altitudeHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:21339553.9 %
    Date:2024-04-18 23:11:36Functions:223366.7 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    alt_generic.cpp +
    53.9%53.9%
    +
    53.9 %213 / 39566.7 %22 / 33
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/altitude/index-sort-l.html b/mrs_uav_state_estimators/src/estimators/altitude/index-sort-l.html new file mode 100644 index 0000000000..3602cecce6 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/altitude/index-sort-l.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/altitude + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/altitudeHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:21339553.9 %
    Date:2024-04-18 23:11:36Functions:223366.7 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    alt_generic.cpp +
    53.9%53.9%
    +
    53.9 %213 / 39566.7 %22 / 33
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/altitude/index.html b/mrs_uav_state_estimators/src/estimators/altitude/index.html new file mode 100644 index 0000000000..d3c2074d53 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/altitude/index.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/altitude + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/altitudeHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:21339553.9 %
    Date:2024-04-18 23:11:36Functions:223366.7 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    alt_generic.cpp +
    53.9%53.9%
    +
    53.9 %213 / 39566.7 %22 / 33
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/heading/hdg_generic.cpp.func-sort-c.html b/mrs_uav_state_estimators/src/estimators/heading/hdg_generic.cpp.func-sort-c.html new file mode 100644 index 0000000000..90c7570053 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/heading/hdg_generic.cpp.func-sort-c.html @@ -0,0 +1,216 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/heading/hdg_generic.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/heading - hdg_generic.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:03570.0 %
    Date:2024-04-18 23:11:36Functions:0340.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::HdgGeneric::initialize(ros::NodeHandle&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)0
    mrs_uav_state_estimators::HdgGeneric::isConverged()0
    mrs_uav_state_estimators::HdgGeneric::timerUpdate(ros::TimerEvent const&)0
    mrs_uav_state_estimators::HdgGeneric::doCorrection(Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, double, mrs_uav_managers::estimation_manager::StateId_t const&, ros::Time const&)0
    mrs_uav_state_estimators::HdgGeneric::doCorrection(mrs_uav_state_estimators::Correction<1>::MeasurementStamped const&, double, mrs_uav_managers::estimation_manager::StateId_t const&)0
    mrs_uav_state_estimators::HdgGeneric::setInputCoeff(double const&)0
    mrs_uav_state_estimators::HdgGeneric::timerCheckHealth(ros::TimerEvent const&)0
    mrs_uav_state_estimators::HdgGeneric::callbackReconfigure(mrs_uav_state_estimators::HeadingEstimatorConfig&, unsigned int)0
    mrs_uav_state_estimators::HdgGeneric::setCovarianceMatrix(Eigen::Matrix<double, 2, 2, 0, 2, 2> const&)0
    mrs_uav_state_estimators::HdgGeneric::generateRepredictorModels(double)0
    mrs_uav_state_estimators::HdgGeneric::pause()0
    mrs_uav_state_estimators::HdgGeneric::reset()0
    mrs_uav_state_estimators::HdgGeneric::setDt(double const&)0
    mrs_uav_state_estimators::HdgGeneric::start()0
    mrs_uav_state_estimators::HdgGeneric::setState(double const&, int const&)0
    mrs_uav_state_estimators::HdgGeneric::setState(double const&, int const&, int const&)0
    mrs_uav_state_estimators::HdgGeneric::generateA()0
    mrs_uav_state_estimators::HdgGeneric::generateB()0
    mrs_uav_state_estimators::HdgGeneric::setStates(Eigen::Matrix<double, 2, 1, 0, 2, 1> const&)0
    mrs_uav_state_estimators::HdgGeneric::getPrintName[abi:cxx11]() const0
    mrs_uav_state_estimators::HdgGeneric::getCovariance(int const&) const0
    mrs_uav_state_estimators::HdgGeneric::getCovariance(int const&, int const&) const0
    mrs_uav_state_estimators::HdgGeneric::getInnovation(int const&) const0
    mrs_uav_state_estimators::HdgGeneric::getInnovation(int const&, int const&) const0
    mrs_uav_state_estimators::HdgGeneric::getLastValidHdg() const0
    mrs_uav_state_estimators::HdgGeneric::getNamespacedName[abi:cxx11]() const0
    mrs_uav_state_estimators::HdgGeneric::getCovarianceMatrix() const0
    mrs_uav_state_estimators::HdgGeneric::getState(int const&) const0
    mrs_uav_state_estimators::HdgGeneric::getState(int const&, int const&) const0
    mrs_uav_state_estimators::HdgGeneric::getStates() const0
    mrs_uav_state_estimators::HdgGeneric::initialize(ros::NodeHandle&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)::{lambda(mrs_uav_state_estimators::Correction<1>::MeasurementStamped const&, double, mrs_uav_managers::estimation_manager::StateId_t)#2}::operator()(mrs_uav_state_estimators::Correction<1>::MeasurementStamped const&, double, mrs_uav_managers::estimation_manager::StateId_t) const0
    mrs_uav_state_estimators::HdgGeneric::initialize(ros::NodeHandle&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)::{lambda(int, int)#1}::operator()(int, int) const0
    mrs_uav_state_estimators::HdgGeneric::generateRepredictorModels(double)::{lambda(double)#2}::operator()(double) const0
    mrs_uav_state_estimators::HdgGeneric::generateRepredictorModels(double)::{lambda(double)#1}::operator()(double) const0
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/heading/hdg_generic.cpp.func.html b/mrs_uav_state_estimators/src/estimators/heading/hdg_generic.cpp.func.html new file mode 100644 index 0000000000..72398b7a80 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/heading/hdg_generic.cpp.func.html @@ -0,0 +1,216 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/heading/hdg_generic.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/heading - hdg_generic.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:03570.0 %
    Date:2024-04-18 23:11:36Functions:0340.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::HdgGeneric::initialize(ros::NodeHandle&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)0
    mrs_uav_state_estimators::HdgGeneric::isConverged()0
    mrs_uav_state_estimators::HdgGeneric::timerUpdate(ros::TimerEvent const&)0
    mrs_uav_state_estimators::HdgGeneric::doCorrection(Eigen::Matrix<double, 1, 1, 0, 1, 1> const&, double, mrs_uav_managers::estimation_manager::StateId_t const&, ros::Time const&)0
    mrs_uav_state_estimators::HdgGeneric::doCorrection(mrs_uav_state_estimators::Correction<1>::MeasurementStamped const&, double, mrs_uav_managers::estimation_manager::StateId_t const&)0
    mrs_uav_state_estimators::HdgGeneric::setInputCoeff(double const&)0
    mrs_uav_state_estimators::HdgGeneric::timerCheckHealth(ros::TimerEvent const&)0
    mrs_uav_state_estimators::HdgGeneric::callbackReconfigure(mrs_uav_state_estimators::HeadingEstimatorConfig&, unsigned int)0
    mrs_uav_state_estimators::HdgGeneric::setCovarianceMatrix(Eigen::Matrix<double, 2, 2, 0, 2, 2> const&)0
    mrs_uav_state_estimators::HdgGeneric::generateRepredictorModels(double)0
    mrs_uav_state_estimators::HdgGeneric::pause()0
    mrs_uav_state_estimators::HdgGeneric::reset()0
    mrs_uav_state_estimators::HdgGeneric::setDt(double const&)0
    mrs_uav_state_estimators::HdgGeneric::start()0
    mrs_uav_state_estimators::HdgGeneric::setState(double const&, int const&)0
    mrs_uav_state_estimators::HdgGeneric::setState(double const&, int const&, int const&)0
    mrs_uav_state_estimators::HdgGeneric::generateA()0
    mrs_uav_state_estimators::HdgGeneric::generateB()0
    mrs_uav_state_estimators::HdgGeneric::setStates(Eigen::Matrix<double, 2, 1, 0, 2, 1> const&)0
    mrs_uav_state_estimators::HdgGeneric::getPrintName[abi:cxx11]() const0
    mrs_uav_state_estimators::HdgGeneric::getCovariance(int const&) const0
    mrs_uav_state_estimators::HdgGeneric::getCovariance(int const&, int const&) const0
    mrs_uav_state_estimators::HdgGeneric::getInnovation(int const&) const0
    mrs_uav_state_estimators::HdgGeneric::getInnovation(int const&, int const&) const0
    mrs_uav_state_estimators::HdgGeneric::getLastValidHdg() const0
    mrs_uav_state_estimators::HdgGeneric::getNamespacedName[abi:cxx11]() const0
    mrs_uav_state_estimators::HdgGeneric::getCovarianceMatrix() const0
    mrs_uav_state_estimators::HdgGeneric::getState(int const&) const0
    mrs_uav_state_estimators::HdgGeneric::getState(int const&, int const&) const0
    mrs_uav_state_estimators::HdgGeneric::getStates() const0
    mrs_uav_state_estimators::HdgGeneric::initialize(ros::NodeHandle&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)::{lambda(mrs_uav_state_estimators::Correction<1>::MeasurementStamped const&, double, mrs_uav_managers::estimation_manager::StateId_t)#2}::operator()(mrs_uav_state_estimators::Correction<1>::MeasurementStamped const&, double, mrs_uav_managers::estimation_manager::StateId_t) const0
    mrs_uav_state_estimators::HdgGeneric::initialize(ros::NodeHandle&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)::{lambda(int, int)#1}::operator()(int, int) const0
    mrs_uav_state_estimators::HdgGeneric::generateRepredictorModels(double)::{lambda(double)#2}::operator()(double) const0
    mrs_uav_state_estimators::HdgGeneric::generateRepredictorModels(double)::{lambda(double)#1}::operator()(double) const0
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/heading/hdg_generic.cpp.gcov.frameset.html b/mrs_uav_state_estimators/src/estimators/heading/hdg_generic.cpp.gcov.frameset.html new file mode 100644 index 0000000000..3cdb79f846 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/heading/hdg_generic.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/heading/hdg_generic.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_state_estimators/src/estimators/heading/hdg_generic.cpp.gcov.html b/mrs_uav_state_estimators/src/estimators/heading/hdg_generic.cpp.gcov.html new file mode 100644 index 0000000000..a1a3f7f213 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/heading/hdg_generic.cpp.gcov.html @@ -0,0 +1,795 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/heading/hdg_generic.cpp + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/heading - hdg_generic.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:03570.0 %
    Date:2024-04-18 23:11:36Functions:0340.0 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #define VERSION "0.0.6.0"
    +       2             : 
    +       3             : /* includes //{ */
    +       4             : 
    +       5             : #include <mrs_uav_state_estimators/estimators/heading/hdg_generic.h>
    +       6             : 
    +       7             : //}
    +       8             : 
    +       9             : namespace mrs_uav_state_estimators
    +      10             : 
    +      11             : {
    +      12             : 
    +      13             : /* initialize() //{*/
    +      14           0 : void HdgGeneric::initialize(ros::NodeHandle &nh, const std::shared_ptr<CommonHandlers_t> &ch, const std::shared_ptr<PrivateHandlers_t> &ph) {
    +      15             : 
    +      16           0 :   ch_ = ch;
    +      17           0 :   ph_ = ph;
    +      18             : 
    +      19           0 :   ns_frame_id_ = ch_->uav_name + "/" + frame_id_;
    +      20             : 
    +      21             :   // clang-format off
    +      22           0 :   dt_ = 0.01;
    +      23           0 :   input_coeff_ = 20;
    +      24           0 :   default_input_coeff_ = 20;
    +      25             : 
    +      26           0 :   generateA();
    +      27           0 :   generateB();
    +      28             : 
    +      29           0 :   H_ <<
    +      30           0 :     1, 0;
    +      31             : 
    +      32           0 :   innovation_ << 
    +      33             :     0;
    +      34             : 
    +      35             : 
    +      36             :   // clang-format on
    +      37             : 
    +      38             :   // | --------------- initialize parameter loader -------------- |
    +      39             : 
    +      40           0 :   if (is_core_plugin_) {
    +      41             : 
    +      42           0 :     ph->param_loader->addYamlFile(ros::package::getPath(package_name_) + "/config/private/" + parent_state_est_name_ + "/" + getName() + ".yaml");
    +      43           0 :     ph->param_loader->addYamlFile(ros::package::getPath(package_name_) + "/config/public/" + parent_state_est_name_ + "/" + getName() + ".yaml");
    +      44             :   }
    +      45             : 
    +      46           0 :   ph->param_loader->setPrefix(ch_->package_name + "/" + Support::toSnakeCase(ch_->nodelet_name) + "/" + getNamespacedName() + "/");
    +      47             : 
    +      48             :   // | --------------------- load parameters -------------------- |
    +      49           0 :   ph->param_loader->loadParam("max_flight_z", max_flight_z_);
    +      50           0 :   ph->param_loader->loadParam("position_innovation_limit", pos_innovation_limit_);
    +      51           0 :   ph->param_loader->loadParam("repredictor/enabled", is_repredictor_enabled_);
    +      52           0 :   if (is_repredictor_enabled_) {
    +      53           0 :     ph->param_loader->loadParam("repredictor/buffer_size", rep_buffer_size_);
    +      54             :   }
    +      55             : 
    +      56             :   // | --------------- corrections initialization --------------- |
    +      57           0 :   ph->param_loader->loadParam("corrections", correction_names_);
    +      58             : 
    +      59           0 :   for (auto corr_name : correction_names_) {
    +      60           0 :     corrections_.push_back(std::make_shared<Correction<hdg_generic::n_measurements>>(
    +      61           0 :         nh, getNamespacedName(), corr_name, ns_frame_id_, EstimatorType_t::HEADING, ch_, ph_, [this](int a, int b) { return this->getState(a, b); },
    +      62           0 :         [this](const Correction<hdg_generic::n_measurements>::MeasurementStamped &meas, const double R, const StateId_t state) {
    +      63           0 :           return this->doCorrection(meas, R, state);
    +      64             :         }));
    +      65             :   }
    +      66             : 
    +      67           0 :   ph->param_loader->setPrefix(ch_->package_name + "/" + Support::toSnakeCase(ch_->nodelet_name) + "/" + getNamespacedName() + "/");
    +      68             : 
    +      69             :   // | ----------- initialize process noise covariance ---------- |
    +      70           0 :   Q_ = Q_t::Zero();
    +      71             :   double tmp_noise;
    +      72           0 :   ph->param_loader->loadParam("process_noise/pos", tmp_noise);
    +      73           0 :   Q_(POSITION, POSITION) = tmp_noise;
    +      74           0 :   ph->param_loader->loadParam("process_noise/vel", tmp_noise);
    +      75           0 :   Q_(VELOCITY, VELOCITY) = tmp_noise;
    +      76             : 
    +      77             :   // | ------- check if all parameters loaded successfully ------ |
    +      78           0 :   if (!ph->param_loader->loadedSuccessfully()) {
    +      79           0 :     ROS_ERROR("[%s]: Could not load all non-optional parameters. Shutting down.", getPrintName().c_str());
    +      80           0 :     ros::shutdown();
    +      81             :   }
    +      82             : 
    +      83             :   // | ------------- initialize dynamic reconfigure ------------- |
    +      84             :   drmgr_ =
    +      85           0 :       std::make_unique<drmgr_t>(ros::NodeHandle("~/" + getNamespacedName()), true, getPrintName(), boost::bind(&HdgGeneric::callbackReconfigure, this, _1, _2));
    +      86           0 :   drmgr_->config.pos = Q_(POSITION, POSITION);
    +      87           0 :   drmgr_->config.vel = Q_(VELOCITY, VELOCITY);
    +      88           0 :   drmgr_->update_config(drmgr_->config);
    +      89             : 
    +      90             :   // | --------------- Kalman filter intialization -------------- |
    +      91           0 :   const x_t        x0 = x_t::Zero();
    +      92           0 :   const P_t        P0 = 1e3 * P_t::Identity();
    +      93           0 :   const statecov_t sc0({x0, P0});
    +      94           0 :   sc_ = sc0;
    +      95             : 
    +      96           0 :   lkf_ = std::make_shared<lkf_t>(A_, B_, H_);
    +      97           0 :   if (is_repredictor_enabled_) {
    +      98             : 
    +      99           0 :     generateRepredictorModels(input_coeff_);
    +     100             : 
    +     101           0 :     const u_t       u0 = u_t::Zero();
    +     102           0 :     const ros::Time t0 = ros::Time::now();
    +     103           0 :     lkf_rep_           = std::make_unique<mrs_lib::Repredictor<varstep_lkf_t>>(x0, P0, u0, Q_, t0, models_.at(0), rep_buffer_size_);
    +     104             : 
    +     105           0 :     setDt(1.0 / ch_->desired_uav_state_rate);
    +     106             :   }
    +     107             : 
    +     108             :   // | ------------------ timers initialization ----------------- |
    +     109           0 :   timer_update_ = nh.createTimer(ros::Rate(ch_->desired_uav_state_rate), &HdgGeneric::timerUpdate, this);  // not running after init
    +     110             :   /* timer_check_health_ = nh.createTimer(ros::Rate(ch_->desired_uav_state_rate), &HdgGeneric::timerCheckHealth, this); */
    +     111             : 
    +     112             :   // | --------------- subscribers initialization --------------- |
    +     113             :   // subscriber to odometry
    +     114           0 :   mrs_lib::SubscribeHandlerOptions shopts;
    +     115           0 :   shopts.nh                 = nh;
    +     116           0 :   shopts.node_name          = getPrintName();
    +     117           0 :   shopts.no_message_timeout = mrs_lib::no_timeout;
    +     118           0 :   shopts.threadsafe         = true;
    +     119           0 :   shopts.autostart          = true;
    +     120           0 :   shopts.queue_size         = 10;
    +     121           0 :   shopts.transport_hints    = ros::TransportHints().tcpNoDelay();
    +     122             : 
    +     123           0 :   sh_control_input_ = mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput>(shopts, "control_input_in");
    +     124             : 
    +     125             :   // | ---------------- publishers initialization --------------- |
    +     126           0 :   if (ch_->debug_topics.input) {
    +     127           0 :     ph_input_ = mrs_lib::PublisherHandler<mrs_msgs::Float64ArrayStamped>(nh, getNamespacedName() + "/input", 10);
    +     128             :   }
    +     129           0 :   if (ch_->debug_topics.output) {
    +     130           0 :     ph_output_ = mrs_lib::PublisherHandler<mrs_msgs::EstimatorOutput>(nh, getNamespacedName() + "/output", 10);
    +     131             :   }
    +     132           0 :   if (ch_->debug_topics.diag) {
    +     133           0 :     ph_diagnostics_ = mrs_lib::PublisherHandler<mrs_msgs::EstimatorDiagnostics>(nh, getNamespacedName() + "/diagnostics", 10);
    +     134             :   }
    +     135             : 
    +     136             :   // | ------------------ finish initialization ----------------- |
    +     137             : 
    +     138           0 :   if (changeState(INITIALIZED_STATE)) {
    +     139           0 :     ROS_INFO("[%s]: Estimator initialized, version %s", getPrintName().c_str(), VERSION);
    +     140             :   } else {
    +     141           0 :     ROS_INFO("[%s]: Estimator could not be initialized", getPrintName().c_str());
    +     142             :   }
    +     143           0 : }
    +     144             : /*//}*/
    +     145             : 
    +     146             : /*//{ start() */
    +     147           0 : bool HdgGeneric::start(void) {
    +     148             : 
    +     149           0 :   if (isInState(READY_STATE)) {
    +     150             :     /* timer_update_.start(); */
    +     151           0 :     changeState(STARTED_STATE);
    +     152           0 :     return true;
    +     153             : 
    +     154             :   } else {
    +     155           0 :     ROS_WARN_THROTTLE(1.0, "[%s]: Estimator must be in READY_STATE to start it", getPrintName().c_str());
    +     156           0 :     return false;
    +     157             :   }
    +     158             : }
    +     159             : /*//}*/
    +     160             : 
    +     161             : /*//{ pause() */
    +     162           0 : bool HdgGeneric::pause(void) {
    +     163             : 
    +     164           0 :   if (isInState(RUNNING_STATE)) {
    +     165           0 :     changeState(STOPPED_STATE);
    +     166           0 :     return true;
    +     167             : 
    +     168             :   } else {
    +     169           0 :     return false;
    +     170             :   }
    +     171             : }
    +     172             : /*//}*/
    +     173             : 
    +     174             : /*//{ reset() */
    +     175           0 : bool HdgGeneric::reset(void) {
    +     176             : 
    +     177           0 :   if (!isInitialized()) {
    +     178           0 :     ROS_ERROR("[%s]: Cannot reset uninitialized estimator", getPrintName().c_str());
    +     179           0 :     return false;
    +     180             :   }
    +     181             : 
    +     182           0 :   changeState(STOPPED_STATE);
    +     183             : 
    +     184             :   // Initialize LKF state and covariance
    +     185           0 :   const x_t        x0 = x_t::Zero();
    +     186           0 :   const P_t        P0 = 1e6 * P_t::Identity();
    +     187           0 :   const statecov_t sc0({x0, P0});
    +     188           0 :   sc_ = sc0;
    +     189             : 
    +     190             :   // Instantiate the LKF itself
    +     191           0 :   lkf_ = std::make_shared<lkf_t>(A_, B_, H_);
    +     192           0 :   if (is_repredictor_enabled_) {
    +     193             : 
    +     194           0 :     const u_t       u0 = u_t::Zero();
    +     195           0 :     const ros::Time t0 = ros::Time(0);
    +     196           0 :     lkf_rep_           = std::make_unique<mrs_lib::Repredictor<varstep_lkf_t>>(x0, P0, u0, Q_, t0, models_.at(0), rep_buffer_size_);
    +     197             :   }
    +     198             : 
    +     199           0 :   ROS_INFO("[%s]: Estimator reset", getPrintName().c_str());
    +     200             : 
    +     201           0 :   return true;
    +     202             : }
    +     203             : /*//}*/
    +     204             : 
    +     205             : /* timerUpdate() //{*/
    +     206           0 : void HdgGeneric::timerUpdate(const ros::TimerEvent &event) {
    +     207             : 
    +     208           0 :   if (!isInitialized()) {
    +     209           0 :     return;
    +     210             :   }
    +     211             : 
    +     212           0 :   switch (getCurrentSmState()) {
    +     213             : 
    +     214           0 :     case UNINITIALIZED_STATE: {
    +     215           0 :       ROS_INFO_THROTTLE(1.0, "[%s]: %s initialization", getPrintName().c_str(), Support::waiting_for_string.c_str());
    +     216           0 :       break;
    +     217             :     }
    +     218             : 
    +     219           0 :     case READY_STATE: {
    +     220           0 :       ROS_INFO_THROTTLE(1.0, "[%s]: %s estimator start", getPrintName().c_str(), Support::waiting_for_string.c_str());
    +     221           0 :       break;
    +     222             :     }
    +     223             : 
    +     224           0 :     case INITIALIZED_STATE: {
    +     225             :       // initialize the estimator with current corrections
    +     226           0 :       for (auto correction : corrections_) {
    +     227           0 :         auto res = correction->getProcessedCorrection();
    +     228           0 :         if (res) {
    +     229           0 :           auto measurement_stamped = res.value();
    +     230           0 :           setState(measurement_stamped.value(AXIS_X), correction->getStateId(), AXIS_X);
    +     231           0 :           ROS_INFO_THROTTLE(1.0, "[%s]: Setting initial state to: %.2f", getPrintName().c_str(), measurement_stamped.value(AXIS_X));
    +     232             :         } else {
    +     233           0 :           ROS_INFO_THROTTLE(1.0, "[%s]: %s correction %s", getPrintName().c_str(), Support::waiting_for_string.c_str(),
    +     234             :                             correction->getNamespacedName().c_str());
    +     235           0 :           return;
    +     236             :         }
    +     237             :       }
    +     238           0 :       ROS_INFO_THROTTLE(1.0, "[%s]: Ready to start", getPrintName().c_str());
    +     239           0 :       changeState(READY_STATE);
    +     240           0 :       break;
    +     241             :     }
    +     242             : 
    +     243           0 :     case STARTED_STATE: {
    +     244           0 :       ROS_INFO_THROTTLE(1.0, "[%s]: %s convergence of LKF", getPrintName().c_str(), Support::waiting_for_string.c_str());
    +     245           0 :       if (isConverged()) {
    +     246           0 :         ROS_INFO_THROTTLE(1.0, "[%s]: LKF converged", getPrintName().c_str());
    +     247           0 :         changeState(RUNNING_STATE);
    +     248             :       }
    +     249           0 :       break;
    +     250             :     }
    +     251             : 
    +     252           0 :     case RUNNING_STATE: {
    +     253           0 :       for (auto correction : corrections_) {
    +     254           0 :         if (!correction->isHealthy()) {
    +     255           0 :           ROS_ERROR_THROTTLE(1.0, "[%s]: Correction %s is not healthy!", getPrintName().c_str(), correction->getNamespacedName().c_str());
    +     256           0 :           changeState(ERROR_STATE);
    +     257             :         }
    +     258             :       }
    +     259           0 :       break;
    +     260             :     }
    +     261             : 
    +     262           0 :     case STOPPED_STATE: {
    +     263           0 :       ROS_INFO_THROTTLE(1.0, "[%s]: Estimator is stopped", getPrintName().c_str());
    +     264           0 :       break;
    +     265             :     }
    +     266             : 
    +     267           0 :     case ERROR_STATE: {
    +     268           0 :       ROS_INFO_THROTTLE(1.0, "[%s]: Estimator is in ERROR state", getPrintName().c_str());
    +     269           0 :       bool all_corrections_healthy = true;
    +     270           0 :       for (auto correction : corrections_) {
    +     271           0 :         if (!correction->isHealthy()) {
    +     272           0 :           ROS_ERROR_THROTTLE(1.0, "[%s]: Correction %s is not healthy!", getPrintName().c_str(), correction->getNamespacedName().c_str());
    +     273           0 :           all_corrections_healthy = false;
    +     274             :         }
    +     275             :       }
    +     276             :       // initialize the estimator again if corrections become healthy
    +     277           0 :       if (all_corrections_healthy && innovation_ok_) {
    +     278           0 :         changeState(INITIALIZED_STATE);
    +     279             :       }
    +     280           0 :       break;
    +     281             :     }
    +     282             :   }
    +     283             : 
    +     284           0 :   if (sh_control_input_.newMsg()) {
    +     285           0 :     is_input_ready_ = true;
    +     286             :   }
    +     287             : 
    +     288             :   // check age of input
    +     289           0 :   if (is_input_ready_ && (ros::Time::now() - sh_control_input_.lastMsgTime()).toSec() > 0.1) {
    +     290           0 :     ROS_WARN_THROTTLE(1.0, "[%s]: input too old (%.4f), using zero input instead", getPrintName().c_str(),
    +     291             :                       (ros::Time::now() - sh_control_input_.lastMsgTime()).toSec());
    +     292           0 :     is_input_ready_ = false;
    +     293             :   }
    +     294             : 
    +     295           0 :   if (!isRunning() && !isStarted()) {
    +     296           0 :     return;
    +     297             :   }
    +     298             : 
    +     299           0 :   if (first_iter_) {
    +     300           0 :     first_iter_ = false;
    +     301           0 :     return;
    +     302             :   }
    +     303             : 
    +     304           0 :   double dt = (event.current_real - event.last_real).toSec();
    +     305           0 :   if (dt <= 0.0) {
    +     306           0 :     return;
    +     307             :   }
    +     308             : 
    +     309           0 :   if (!is_repredictor_enabled_) {  // repredictor calculates dt on its own
    +     310           0 :     setDt(dt);
    +     311             :   }
    +     312             : 
    +     313             :   // go through available corrections and apply them
    +     314             :   /* for (auto correction : corrections_) { */
    +     315             :   /*   auto res = correction->getProcessedCorrection(); */
    +     316             :   /*   if (res) { */
    +     317             :   /*     auto measurement_stamped = res.value(); */
    +     318             :   /*     doCorrection(measurement_stamped.value, correction->getR(), correction->getStateId(), measurement_stamped.stamp); */
    +     319             :   /*   } */
    +     320             :   /* } */
    +     321             : 
    +     322             :   // prediction step
    +     323           0 :   u_t       u;
    +     324           0 :   ros::Time input_stamp;
    +     325           0 :   if (is_input_ready_) {
    +     326           0 :     input_stamp = sh_control_input_.getMsg()->header.stamp;
    +     327           0 :     if (input_coeff_ != default_input_coeff_){
    +     328           0 :       setInputCoeff(default_input_coeff_);
    +     329             :     }
    +     330           0 :     u(0) = sh_control_input_.getMsg()->control_hdg_rate;
    +     331             :   } else {
    +     332           0 :     input_stamp = ros::Time::now();
    +     333           0 :     if (input_coeff_ != 0){
    +     334           0 :       setInputCoeff(0);
    +     335             :     }
    +     336           0 :     u = u_t::Zero();
    +     337             :   }
    +     338             : 
    +     339           0 :   statecov_t sc = mrs_lib::get_mutexed(mutex_sc_, sc_);
    +     340           0 :   Q_t        Q  = mrs_lib::get_mutexed(mtx_Q_, Q_);
    +     341             :   try {
    +     342             :     // Apply the prediction step
    +     343           0 :     std::scoped_lock lock(mutex_lkf_);
    +     344           0 :     if (is_repredictor_enabled_) {
    +     345           0 :       lkf_rep_->addInputChangeWithNoise(u, Q, input_stamp, models_[0]);
    +     346           0 :       sc = lkf_rep_->predictTo(ros::Time::now());
    +     347             :     } else {
    +     348           0 :       sc = lkf_->predict(sc, u, Q, dt_);
    +     349             :     }
    +     350             :   }
    +     351           0 :   catch (const std::exception &e) {
    +     352             :     // In case of error, alert the user
    +     353           0 :     ROS_ERROR("[%s]: LKF prediction failed: %s", getPrintName().c_str(), e.what());
    +     354             :   }
    +     355             : 
    +     356           0 :   mrs_lib::set_mutexed(mutex_sc_, sc, sc_);
    +     357             : 
    +     358           0 :   if (!isError()) {
    +     359           0 :     mrs_lib::set_mutexed(mutex_last_valid_hdg_, sc.x(POSITION), last_valid_hdg_);
    +     360             :   }
    +     361             : 
    +     362             :   // publishing
    +     363           0 :   publishInput(u, input_stamp);
    +     364           0 :   publishOutput();
    +     365           0 :   publishDiagnostics();
    +     366             : }
    +     367             : /*//}*/
    +     368             : 
    +     369             : /*//{ timerCheckHealth() */
    +     370           0 : void HdgGeneric::timerCheckHealth([[maybe_unused]] const ros::TimerEvent &event) {
    +     371             : 
    +     372           0 :   if (!isInitialized()) {
    +     373           0 :     return;
    +     374             :   }
    +     375             : 
    +     376           0 :   switch (getCurrentSmState()) {
    +     377             : 
    +     378           0 :     case UNINITIALIZED_STATE: {
    +     379           0 :       ROS_INFO_THROTTLE(1.0, "[%s]: %s initialization", getPrintName().c_str(), Support::waiting_for_string.c_str());
    +     380           0 :       break;
    +     381             :     }
    +     382             : 
    +     383           0 :     case READY_STATE: {
    +     384           0 :       ROS_INFO_THROTTLE(1.0, "[%s]: %s estimator start", getPrintName().c_str(), Support::waiting_for_string.c_str());
    +     385           0 :       break;
    +     386             :     }
    +     387             : 
    +     388           0 :     case INITIALIZED_STATE: {
    +     389             :       // initialize the estimator with current corrections
    +     390           0 :       for (auto correction : corrections_) {
    +     391           0 :         auto res = correction->getProcessedCorrection();
    +     392           0 :         if (res) {
    +     393           0 :           auto measurement_stamped = res.value();
    +     394           0 :           setState(measurement_stamped.value(AXIS_X), correction->getStateId(), AXIS_X);
    +     395           0 :           ROS_INFO_THROTTLE(1.0, "[%s]: Setting initial state to: %.2f", getPrintName().c_str(), measurement_stamped.value(AXIS_X));
    +     396             :         } else {
    +     397           0 :           ROS_INFO_THROTTLE(1.0, "[%s]: %s correction %s", getPrintName().c_str(), Support::waiting_for_string.c_str(),
    +     398             :                             correction->getNamespacedName().c_str());
    +     399           0 :           return;
    +     400             :         }
    +     401             :       }
    +     402           0 :       ROS_INFO_THROTTLE(1.0, "[%s]: Ready to start", getPrintName().c_str());
    +     403           0 :       changeState(READY_STATE);
    +     404           0 :       break;
    +     405             :     }
    +     406             : 
    +     407           0 :     case STARTED_STATE: {
    +     408           0 :       ROS_INFO_THROTTLE(1.0, "[%s]: %s convergence of LKF", getPrintName().c_str(), Support::waiting_for_string.c_str());
    +     409           0 :       if (isConverged()) {
    +     410           0 :         ROS_INFO_THROTTLE(1.0, "[%s]: LKF converged", getPrintName().c_str());
    +     411           0 :         changeState(RUNNING_STATE);
    +     412             :       }
    +     413           0 :       break;
    +     414             :     }
    +     415             : 
    +     416           0 :     case RUNNING_STATE: {
    +     417           0 :       for (auto correction : corrections_) {
    +     418           0 :         if (!correction->isHealthy()) {
    +     419           0 :           ROS_ERROR_THROTTLE(1.0, "[%s]: Correction %s is not healthy!", getPrintName().c_str(), correction->getNamespacedName().c_str());
    +     420           0 :           changeState(ERROR_STATE);
    +     421             :         }
    +     422             :       }
    +     423           0 :       break;
    +     424             :     }
    +     425             : 
    +     426           0 :     case STOPPED_STATE: {
    +     427           0 :       ROS_INFO_THROTTLE(1.0, "[%s]: Estimator is stopped", getPrintName().c_str());
    +     428           0 :       break;
    +     429             :     }
    +     430             : 
    +     431           0 :     case ERROR_STATE: {
    +     432           0 :       ROS_INFO_THROTTLE(1.0, "[%s]: Estimator is in ERROR state", getPrintName().c_str());
    +     433           0 :       bool all_corrections_healthy = true;
    +     434           0 :       for (auto correction : corrections_) {
    +     435           0 :         if (!correction->isHealthy()) {
    +     436           0 :           ROS_ERROR_THROTTLE(1.0, "[%s]: Correction %s is not healthy!", getPrintName().c_str(), correction->getNamespacedName().c_str());
    +     437           0 :           all_corrections_healthy = false;
    +     438             :         }
    +     439             :       }
    +     440             :       // initialize the estimator again if corrections become healthy
    +     441           0 :       if (all_corrections_healthy) {
    +     442           0 :         changeState(INITIALIZED_STATE);
    +     443             :       }
    +     444           0 :       break;
    +     445             :     }
    +     446             :   }
    +     447             : 
    +     448           0 :   if (sh_control_input_.newMsg()) {
    +     449           0 :     is_input_ready_ = true;
    +     450             :   }
    +     451             : 
    +     452             :   // check age of input
    +     453           0 :   if (is_input_ready_ && (ros::Time::now() - sh_control_input_.lastMsgTime()).toSec() > 0.1) {
    +     454           0 :     ROS_WARN_THROTTLE(1.0, "[%s]: input too old (%.4f), using zero input instead", getPrintName().c_str(),
    +     455             :                       (ros::Time::now() - sh_control_input_.lastMsgTime()).toSec());
    +     456           0 :     is_input_ready_ = false;
    +     457             :   }
    +     458             : }
    +     459             : /*//}*/
    +     460             : 
    +     461             : /*//{ doCorrection() */
    +     462           0 : void HdgGeneric::doCorrection(const Correction<hdg_generic::n_measurements>::MeasurementStamped &meas, const double R, const StateId_t &state_id) {
    +     463           0 :   doCorrection(meas.value, R, state_id, meas.stamp);
    +     464           0 : }
    +     465             : /*//}*/
    +     466             : 
    +     467             : /*//{ doCorrection() */
    +     468           0 : void HdgGeneric::doCorrection(const z_t &z, const double R, const StateId_t &H_idx, const ros::Time &meas_stamp) {
    +     469             : 
    +     470           0 :   if (!isInitialized()) {
    +     471           0 :     return;
    +     472             :   }
    +     473             : 
    +     474             :   // copy measurement as we might need to modify it (unwrap)
    +     475           0 :   z_t meas = z;
    +     476             : 
    +     477             :   // we do not want to perform corrections until the estimator is initialized
    +     478           0 :   if (!(isInState(SMStates_t::READY_STATE) || isInState(SMStates_t::RUNNING_STATE) || isInState(SMStates_t::STARTED_STATE))) {
    +     479           0 :     return;
    +     480             :   }
    +     481             : 
    +     482           0 :   statecov_t sc = mrs_lib::get_mutexed(mutex_sc_, sc_);
    +     483             : 
    +     484             :   // for position state check the innovation
    +     485           0 :   if (H_idx == POSITION) {
    +     486             : 
    +     487             :     // unwrap the hdg measurement wrt current state
    +     488           0 :     meas(POSITION) = mrs_lib::geometry::radians::unwrap(meas(POSITION), sc.x(POSITION));
    +     489             : 
    +     490           0 :     std::scoped_lock lock(mtx_innovation_);
    +     491             : 
    +     492           0 :     innovation_(0) = mrs_lib::geometry::radians::dist(mrs_lib::geometry::radians(meas(0)), mrs_lib::geometry::radians(sc.x(POSITION)));
    +     493             : 
    +     494           0 :     if (fabs(innovation_(0)) > pos_innovation_limit_) {
    +     495           0 :       ROS_WARN_THROTTLE(1.0, "[%s]: innovation too large - hdg: %.2f", getPrintName().c_str(), innovation_(0));
    +     496           0 :       innovation_ok_ = false;
    +     497           0 :       changeState(ERROR_STATE);
    +     498             :     }
    +     499             :   }
    +     500             : 
    +     501             :   try {
    +     502             :     // Apply the correction step
    +     503             :     {
    +     504           0 :       std::scoped_lock lock(mutex_lkf_);
    +     505           0 :       H_        = H_t::Zero();
    +     506           0 :       H_(H_idx) = 1;
    +     507           0 :       lkf_->H   = H_;
    +     508           0 :       if (is_repredictor_enabled_) {
    +     509           0 :         lkf_rep_->addMeasurement(meas, R_t::Ones() * R, meas_stamp, models_[H_idx]);
    +     510             :       } else {
    +     511           0 :         sc = lkf_->correct(sc, meas, R_t::Ones() * R);
    +     512             :       }
    +     513             :     }
    +     514           0 :     innovation_ok_ = true;
    +     515             :   }
    +     516           0 :   catch (const std::exception &e) {
    +     517             :     // In case of error, alert the user
    +     518           0 :     ROS_ERROR("[%s]: LKF correction failed: %s", getPrintName().c_str(), e.what());
    +     519             :   }
    +     520             : 
    +     521           0 :   mrs_lib::set_mutexed(mutex_sc_, sc, sc_);
    +     522             : }
    +     523             : /*//}*/
    +     524             : 
    +     525             : /*//{ isConverged() */
    +     526           0 : bool HdgGeneric::isConverged() {
    +     527             : 
    +     528             :   // TODO: check convergence by rate of change of determinant
    +     529             : 
    +     530           0 :   return true;
    +     531             : }
    +     532             : /*//}*/
    +     533             : 
    +     534             : /*//{ getState() */
    +     535           0 : double HdgGeneric::getState(const int &state_id_in, const int &axis_in) const {
    +     536           0 :   return getState(stateIdToIndex(state_id_in, axis_in));
    +     537             : }
    +     538             : 
    +     539           0 : double HdgGeneric::getState(const int &state_idx_in) const {
    +     540           0 :   return mrs_lib::get_mutexed(mutex_sc_, sc_).x(state_idx_in);
    +     541             : }
    +     542             : /*//}*/
    +     543             : 
    +     544             : /*//{ setState() */
    +     545           0 : void HdgGeneric::setState(const double &state_in, const int &state_id_in, const int &axis_in) {
    +     546           0 :   setState(state_in, stateIdToIndex(state_id_in, axis_in));
    +     547           0 : }
    +     548             : 
    +     549           0 : void HdgGeneric::setState(const double &state_in, const int &state_idx_in) {
    +     550           0 :   mrs_lib::set_mutexed(mutex_sc_, state_in, sc_.x(state_idx_in));
    +     551           0 : }
    +     552             : /*//}*/
    +     553             : 
    +     554             : /*//{ getStates() */
    +     555           0 : HdgGeneric::states_t HdgGeneric::getStates(void) const {
    +     556           0 :   return mrs_lib::get_mutexed(mutex_sc_, sc_).x;
    +     557             : }
    +     558             : /*//}*/
    +     559             : 
    +     560             : /*//{ setStates() */
    +     561           0 : void HdgGeneric::setStates(const states_t &states_in) {
    +     562           0 :   mrs_lib::set_mutexed(mutex_sc_, states_in, sc_.x);
    +     563           0 : }
    +     564             : /*//}*/
    +     565             : 
    +     566             : /*//{ getCovariance() */
    +     567           0 : double HdgGeneric::getCovariance(const int &state_id_in, const int &axis_in) const {
    +     568           0 :   return getCovariance(stateIdToIndex(state_id_in, axis_in));
    +     569             : }
    +     570             : 
    +     571           0 : double HdgGeneric::getCovariance(const int &state_idx_in) const {
    +     572           0 :   return mrs_lib::get_mutexed(mutex_sc_, sc_).P(state_idx_in, state_idx_in);
    +     573             : }
    +     574             : /*//}*/
    +     575             : 
    +     576             : /*//{ getCovarianceMatrix() */
    +     577           0 : HdgGeneric::covariance_t HdgGeneric::getCovarianceMatrix(void) const {
    +     578           0 :   return mrs_lib::get_mutexed(mutex_sc_, sc_).P;
    +     579             : }
    +     580             : /*//}*/
    +     581             : 
    +     582             : /*//{ setCovarianceMatrix() */
    +     583           0 : void HdgGeneric::setCovarianceMatrix(const covariance_t &cov_in) {
    +     584           0 :   mrs_lib::set_mutexed(mutex_sc_, cov_in, sc_.P);
    +     585           0 : }
    +     586             : /*//}*/
    +     587             : 
    +     588             : /*//{ getInnovation() */
    +     589           0 : double HdgGeneric::getInnovation(const int &state_idx) const {
    +     590           0 :   return mrs_lib::get_mutexed(mtx_innovation_, innovation_)(state_idx);
    +     591             : }
    +     592             : 
    +     593           0 : double HdgGeneric::getInnovation(const int &state_id_in, const int &axis_in) const {
    +     594           0 :   return getInnovation(stateIdToIndex(state_id_in, axis_in));
    +     595             : }
    +     596             : /*//}*/
    +     597             : 
    +     598             : /*//{ setDt() */
    +     599           0 : void HdgGeneric::setDt(const double &dt) {
    +     600           0 :   dt_ = dt;
    +     601           0 :   generateA();
    +     602           0 :   generateB();
    +     603           0 :   std::scoped_lock lock(mutex_lkf_);
    +     604           0 :   lkf_->A = A_;
    +     605           0 :   lkf_->B = B_;
    +     606           0 : }
    +     607             : /*//}*/
    +     608             : 
    +     609             : /*//{ setInputCoeff() */
    +     610           0 : void HdgGeneric::setInputCoeff(const double &input_coeff) {
    +     611           0 :   input_coeff_ = input_coeff;
    +     612           0 :   generateA();
    +     613           0 :   generateB();
    +     614           0 :   std::scoped_lock lock(mutex_lkf_);
    +     615           0 :   lkf_->A = A_;
    +     616           0 :   lkf_->B = B_;
    +     617             : 
    +     618           0 :   if (is_repredictor_enabled_) {
    +     619           0 :     models_.clear();
    +     620           0 :     generateRepredictorModels(input_coeff_);
    +     621             :   }
    +     622           0 : }
    +     623             : /*//}*/
    +     624             : 
    +     625             : /*//{ generateRepredictorModels() */
    +     626           0 : void HdgGeneric::generateRepredictorModels(const double input_coeff) {
    +     627             : 
    +     628           0 :     for (int i = 0; i < hdg_generic::n_states; i++) {
    +     629             : 
    +     630           0 :       auto lambda_generateA = [input_coeff](const double dt) {
    +     631           0 :         A_t A;
    +     632             :         // clang-format off
    +     633           0 :         A <<
    +     634           0 :           1, dt,
    +     635           0 :           0, 1-(input_coeff * dt);
    +     636             :         // clang-format on
    +     637           0 :         return A;
    +     638           0 :       };
    +     639             : 
    +     640           0 :       auto lambda_generateB = [input_coeff]([[maybe_unused]] const double dt) {
    +     641           0 :         B_t B = B.Zero();
    +     642             :         // clang-format off
    +     643           0 :         B <<
    +     644             :           0,
    +     645           0 :           (input_coeff * dt);
    +     646             :         // clang-format on
    +     647           0 :         return B;
    +     648           0 :       };
    +     649             : 
    +     650           0 :       H_t H = H_t::Zero();
    +     651           0 :       H(i)  = 1;
    +     652           0 :       models_.push_back(std::make_shared<varstep_lkf_t>(lambda_generateA, lambda_generateB, H));
    +     653             :     }
    +     654           0 : }
    +     655             : /*//}*/
    +     656             : 
    +     657             : /*//{ generateA() */
    +     658           0 : void HdgGeneric::generateA() {
    +     659             : 
    +     660             :   // clang-format off
    +     661           0 :     A_ <<
    +     662           0 :       1, dt_,
    +     663           0 :       0, 1-(input_coeff_ * dt_);
    +     664             :   // clang-format on
    +     665           0 : }
    +     666             : /*//}*/
    +     667             : 
    +     668             : /*//{ generateB() */
    +     669           0 : void HdgGeneric::generateB() {
    +     670             : 
    +     671             :   // clang-format off
    +     672           0 :     B_ <<
    +     673             :       0,
    +     674           0 :       (input_coeff_ * dt_);
    +     675             :   // clang-format on
    +     676           0 : }
    +     677             : /*//}*/
    +     678             : 
    +     679             : /*//{ getLastValidHdg() */
    +     680           0 : double HdgGeneric::getLastValidHdg() const {
    +     681           0 :   return mrs_lib::get_mutexed(mutex_last_valid_hdg_, last_valid_hdg_);
    +     682             : }
    +     683             : /*//}*/
    +     684             : 
    +     685             : /*//{ callbackReconfigure() */
    +     686           0 : void HdgGeneric::callbackReconfigure(HeadingEstimatorConfig &config, [[maybe_unused]] uint32_t level) {
    +     687             : 
    +     688           0 :   if (!isInitialized()) {
    +     689           0 :     return;
    +     690             :   }
    +     691             : 
    +     692           0 :   Q_t Q;
    +     693           0 :   Q(POSITION, POSITION) = config.pos;
    +     694           0 :   Q(VELOCITY, VELOCITY) = config.vel;
    +     695           0 :   mrs_lib::set_mutexed(mtx_Q_, Q, Q_);
    +     696             : }
    +     697             : /*//}*/
    +     698             : 
    +     699             : /*//{ getNamespacedName() */
    +     700           0 : std::string HdgGeneric::getNamespacedName() const {
    +     701           0 :   return parent_state_est_name_ + "/" + getName();
    +     702             : }
    +     703             : /*//}*/
    +     704             : 
    +     705             : /*//{ getPrintName() */
    +     706           0 : std::string HdgGeneric::getPrintName() const {
    +     707           0 :   return ch_->nodelet_name + "/" + parent_state_est_name_ + "/" + getName();
    +     708             : }
    +     709             : /*//}*/
    +     710             : 
    +     711             : };  // namespace mrs_uav_state_estimators
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/heading/hdg_generic.cpp.gcov.overview.html b/mrs_uav_state_estimators/src/estimators/heading/hdg_generic.cpp.gcov.overview.html new file mode 100644 index 0000000000..74cfc37a09 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/heading/hdg_generic.cpp.gcov.overview.html @@ -0,0 +1,198 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/heading/hdg_generic.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_state_estimators/src/estimators/heading/hdg_generic.cpp.gcov.png b/mrs_uav_state_estimators/src/estimators/heading/hdg_generic.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..609fc109848caebf2d99ac05317361c2b7aea3a5 GIT binary patch literal 2308 zcmV+f3H$bmP)%-Vg0000OP)t-s|NsB0 zs;a7|?_FK${{R500003000620&P%hU00009a7bBm000ie000ie0hKEb8vpRGaN<3|zBMI@TE#PU-5u=>d+Ns*?Q)3)Y7#U^< za!hgbl>^pVqU$;xb4&>cRCc7tofuiptm2xK!Z6lUHdm!sd93MpiVd&RA!d@Fl~ zpE}K2G?iqGhM_VdR6pyU`r7~WGZ$ta&Ya+x7U3D$m>r9PL>W*CSM(xN-$V^S7|4Gb#!04zp`=4&Bg1sW+nIVP3r^J-9 zY3?Kt!o>(+iQOy>%?X#h2|gh#gSR6%nutr1i8iM&yHvY(Y+A{a-N%0RLQcG zo3%nVF!3o@G0Mn3AIUh*dzKW%e3fPtq&Uf0&s2_(5ARDI!uyo9Cv2@L61vDyn7f}^ zC3L7Vo@wuKmkGf^rXJzv!$ZY71jS@#uL$UOE_4+(Q#;wkcFrWR)=5m)uh zb+HE?eQw5UPPEQ{gdkw6!-rdT^bZgJB1abwA6tDQ!R-jrnPo%DaAw9cDHBu)Yu#i+ zP1Vg{;1Wu?+STS1%2Kd;E;SLPRyb>>W-K7G2}3rVzq5>*!*Q6wi%i*5KNz=xnI4+& zkDdnvytAkteH^I_bVGrtGp8^V6KOD#i zPQ5ErI1UrdE;&p8uQ@AtLTGBtJ`?82$_zayD`U6zm~sbY#`<^}W8Wwz%vq0?FmKcO zvINi3PtL`>p3v%N!_<}PYGV8ijegb!WdUZ~aUp&MQ^Y2+fsU^{$JCIk+NsrGWvw~t zd5^*Hv*QAbxSVlZhi}&|g<)oYhozu}W+6yfw>24Q3HKvpkiKhS*(JEXb#4rlYwm>T zm6-1^I37}f!)CV%(>mT=nM|M8H3Hq!78k(rUQ1!C_Bpx~E>~uLzfOp#a^pZ)9f&?8oe(YiuqUj;OT*p?7g*}dNP=(OR~U$UPG7+v z*VVhgMVaDdF7@Nevo3CjE+t6?;bBxDmpMvn;5_qWt!*k>4T=Sq9rxtG)XS(^@oHsu zTNfDAh^VeLTJIF#P;tFyk}j4eg}z_m?`|j0Tp{D)*M7MHoNJa{X(iP3;zhaCb>s># z?`6NYy5`7w;uzb;x2_iM7XDO1B*kJ|)= z@T6L^?Lg7yED^Z2y$sXU_k9Bblrg3$+RCY#O#?eEZMrT2ga>W{J1I|vWSGGtQ@p|e z*>DW)ZGrIU9M_POiO=6gOTk5hq^r9UVfIWamo+7`m=>P?l!gwAJ<@tHwJ?L)UXoTfkBI)7@X8(%$tQ+8eAh!FXr=9>r-!7-`1FvT9umXx=^;Hm zq)x`|`laynkT}Aphcq_$(?fcCNIl1!0QVbuNK%k|dPqa~K0Txgy<%F_Ub76^t~!&5I|yIpB-k9+Y~ zj*s#Ub{9PZPR*3!e_M6cWlZS7Inp8*6}0m;nZV|B&TmAvWMG7F=cd$BsBs5`mn9zy z{#Ys4pMixm417d8?jN+SSmNlkcYQ@dH+blq5Pq7v#$rKrA;6;t>J7!Sf+gG%!>uDk zw_(^b1mHs%(a`+=Y&PAY_o3aq*dTn*?uGdpiO&p3lJb$BU-7_Fdhde9cWW%3UxSn@ z&Hj^X`!kt*AD?Lr4^hUZKF`WX{{3y9X_U@2m)c466->S6^zIC-HArV58FvpcK`Mi1 zqhj9SxToF@W5Ly-ae&88#v9-f(7K0LOeWgfIE=3uz3<>_Rd3dVsivAg$2X?2r-Wu1 z{)6~PWpu|Zzh%c-cglQ+*1WFCe<=X5tI%!zLi+YqSOr~a71oX6 zDXrl#kn!wDaTXru-}4a;J)Dda?_u}jctYi19|;jDal-FdTugLio<3>bXFn=6{UsNw z!WEA2*>$W0Lr4clh*lMDfky?ELUbgkOdC6@jENlx>#8EVZ3{m$97!{tK0V~w+KO;lCgB|;PcuV63@p1AXe#EQQ@Lwx4@#|2eS~*9UAwGCf zBm!^qxbRRHLQ|Wx3e}51U*tm7i(8kbwB^67^&p`k!SMRy-lydU8fxRu|JF?xD1$Tk znBvl65CxtkERd11v%8>YxM+&fHELSNw`-=nfAW@EtGB~Ct=UjfYi(_FJ*1f6Qmx}g eLmztQruYv!>Z}Ez%7c&q0000 + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/heading/hdg_passthrough.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/heading - hdg_passthrough.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:9113368.4 %
    Date:2024-04-18 23:11:36Functions:122352.2 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::HdgPassthrough::setCovarianceMatrix(Eigen::Matrix<double, 2, 2, 0, 2, 2> const&)0
    mrs_uav_state_estimators::HdgPassthrough::pause()0
    mrs_uav_state_estimators::HdgPassthrough::reset()0
    mrs_uav_state_estimators::HdgPassthrough::setState(double const&, int const&, int const&)0
    mrs_uav_state_estimators::HdgPassthrough::setStates(Eigen::Matrix<double, 2, 1, 0, 2, 1> const&)0
    mrs_uav_state_estimators::HdgPassthrough::getCovariance(int const&) const0
    mrs_uav_state_estimators::HdgPassthrough::getCovariance(int const&, int const&) const0
    mrs_uav_state_estimators::HdgPassthrough::getInnovation(int const&) const0
    mrs_uav_state_estimators::HdgPassthrough::getInnovation(int const&, int const&) const0
    mrs_uav_state_estimators::HdgPassthrough::getLastValidHdg() const0
    mrs_uav_state_estimators::HdgPassthrough::getState(int const&, int const&) const0
    mrs_uav_state_estimators::HdgPassthrough::initialize(ros::NodeHandle&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)97
    mrs_uav_state_estimators::HdgPassthrough::start()170
    mrs_uav_state_estimators::HdgPassthrough::getNamespacedName[abi:cxx11]() const194
    mrs_uav_state_estimators::HdgPassthrough::getPrintName[abi:cxx11]() const570
    mrs_uav_state_estimators::HdgPassthrough::callbackAngularVelocity(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>)187522
    mrs_uav_state_estimators::HdgPassthrough::getCovarianceMatrix() const189991
    mrs_uav_state_estimators::HdgPassthrough::timerUpdate(ros::TimerEvent const&)190009
    mrs_uav_state_estimators::HdgPassthrough::getStates() const190009
    mrs_uav_state_estimators::HdgPassthrough::callbackOrientation(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>)191805
    mrs_uav_state_estimators::HdgPassthrough::timerCheckHealth(ros::TimerEvent const&)193140
    mrs_uav_state_estimators::HdgPassthrough::setState(double const&, int const&)379309
    mrs_uav_state_estimators::HdgPassthrough::getState(int const&) const662907
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/heading/hdg_passthrough.cpp.func.html b/mrs_uav_state_estimators/src/estimators/heading/hdg_passthrough.cpp.func.html new file mode 100644 index 0000000000..76db91e71f --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/heading/hdg_passthrough.cpp.func.html @@ -0,0 +1,172 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/heading/hdg_passthrough.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/heading - hdg_passthrough.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:9113368.4 %
    Date:2024-04-18 23:11:36Functions:122352.2 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::HdgPassthrough::initialize(ros::NodeHandle&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)97
    mrs_uav_state_estimators::HdgPassthrough::timerUpdate(ros::TimerEvent const&)190009
    mrs_uav_state_estimators::HdgPassthrough::timerCheckHealth(ros::TimerEvent const&)193140
    mrs_uav_state_estimators::HdgPassthrough::callbackOrientation(boost::shared_ptr<geometry_msgs::QuaternionStamped_<std::allocator<void> > const>)191805
    mrs_uav_state_estimators::HdgPassthrough::setCovarianceMatrix(Eigen::Matrix<double, 2, 2, 0, 2, 2> const&)0
    mrs_uav_state_estimators::HdgPassthrough::callbackAngularVelocity(boost::shared_ptr<geometry_msgs::Vector3Stamped_<std::allocator<void> > const>)187522
    mrs_uav_state_estimators::HdgPassthrough::pause()0
    mrs_uav_state_estimators::HdgPassthrough::reset()0
    mrs_uav_state_estimators::HdgPassthrough::start()170
    mrs_uav_state_estimators::HdgPassthrough::setState(double const&, int const&)379309
    mrs_uav_state_estimators::HdgPassthrough::setState(double const&, int const&, int const&)0
    mrs_uav_state_estimators::HdgPassthrough::setStates(Eigen::Matrix<double, 2, 1, 0, 2, 1> const&)0
    mrs_uav_state_estimators::HdgPassthrough::getPrintName[abi:cxx11]() const570
    mrs_uav_state_estimators::HdgPassthrough::getCovariance(int const&) const0
    mrs_uav_state_estimators::HdgPassthrough::getCovariance(int const&, int const&) const0
    mrs_uav_state_estimators::HdgPassthrough::getInnovation(int const&) const0
    mrs_uav_state_estimators::HdgPassthrough::getInnovation(int const&, int const&) const0
    mrs_uav_state_estimators::HdgPassthrough::getLastValidHdg() const0
    mrs_uav_state_estimators::HdgPassthrough::getNamespacedName[abi:cxx11]() const194
    mrs_uav_state_estimators::HdgPassthrough::getCovarianceMatrix() const189991
    mrs_uav_state_estimators::HdgPassthrough::getState(int const&) const662907
    mrs_uav_state_estimators::HdgPassthrough::getState(int const&, int const&) const0
    mrs_uav_state_estimators::HdgPassthrough::getStates() const190009
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/heading/hdg_passthrough.cpp.gcov.frameset.html b/mrs_uav_state_estimators/src/estimators/heading/hdg_passthrough.cpp.gcov.frameset.html new file mode 100644 index 0000000000..e033217e8c --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/heading/hdg_passthrough.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/heading/hdg_passthrough.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_state_estimators/src/estimators/heading/hdg_passthrough.cpp.gcov.html b/mrs_uav_state_estimators/src/estimators/heading/hdg_passthrough.cpp.gcov.html new file mode 100644 index 0000000000..137f68fe90 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/heading/hdg_passthrough.cpp.gcov.html @@ -0,0 +1,391 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/heading/hdg_passthrough.cpp + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/heading - hdg_passthrough.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:9113368.4 %
    Date:2024-04-18 23:11:36Functions:122352.2 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #define VERSION "0.0.6.0"
    +       2             : 
    +       3             : /* includes //{ */
    +       4             : 
    +       5             : #include <mrs_uav_state_estimators/estimators/heading/hdg_passthrough.h>
    +       6             : 
    +       7             : //}
    +       8             : 
    +       9             : namespace mrs_uav_state_estimators
    +      10             : 
    +      11             : {
    +      12             : 
    +      13             : /* initialize() //{*/
    +      14          97 : void HdgPassthrough::initialize(ros::NodeHandle &nh, const std::shared_ptr<CommonHandlers_t> &ch, const std::shared_ptr<PrivateHandlers_t> &ph) {
    +      15             : 
    +      16          97 :   ch_ = ch;
    +      17          97 :   ph_ = ph;
    +      18             : 
    +      19          97 :   ns_frame_id_ = ch_->uav_name + "/" + frame_id_;
    +      20             : 
    +      21          97 :   hdg_state_      = states_t::Zero();
    +      22          97 :   hdg_covariance_ = covariance_t::Zero();
    +      23             : 
    +      24          97 :   innovation_ << 
    +      25          97 :     0, 0;
    +      26             : 
    +      27             : 
    +      28             :   // | --------------- param loader initialization --------------- |
    +      29             : 
    +      30          97 :   if (is_core_plugin_) {
    +      31             : 
    +      32          97 :     ph->param_loader->addYamlFile(ros::package::getPath(package_name_) + "/config/private/" + parent_state_est_name_ + "/" + getName() + ".yaml");
    +      33          97 :     ph->param_loader->addYamlFile(ros::package::getPath(package_name_) + "/config/public/" + parent_state_est_name_ + "/" + getName() + ".yaml");
    +      34             :   }
    +      35             : 
    +      36          97 :   ph->param_loader->setPrefix(ch_->package_name + "/" + Support::toSnakeCase(ch_->nodelet_name) + "/" + getNamespacedName() + "/");
    +      37             : 
    +      38             :   // | --------------------- load parameters -------------------- |
    +      39          97 :   ph->param_loader->loadParam("max_flight_z", max_flight_z_);
    +      40             : 
    +      41          97 :   ph->param_loader->loadParam("topics/orientation", orient_topic_);
    +      42          97 :   ph->param_loader->loadParam("topics/angular_velocity", ang_vel_topic_);
    +      43             : 
    +      44          97 :   if (!ph->param_loader->loadedSuccessfully()) {
    +      45           0 :     ROS_ERROR("[%s]: Could not load all non-optional parameters. Shutting down.", getPrintName().c_str());
    +      46           0 :     ros::shutdown();
    +      47             :   }
    +      48             : 
    +      49             :   // | ------------------ timers initialization ----------------- |
    +      50          97 :   timer_update_       = nh.createTimer(ros::Rate(ch_->desired_uav_state_rate), &HdgPassthrough::timerUpdate, this, false, false);  // not running after init
    +      51          97 :   timer_check_health_ = nh.createTimer(ros::Rate(ch_->desired_uav_state_rate), &HdgPassthrough::timerCheckHealth, this);
    +      52             : 
    +      53             :   // | --------------- subscribers initialization --------------- |
    +      54             :   // subscriber to odometry
    +      55         194 :   mrs_lib::SubscribeHandlerOptions shopts;
    +      56          97 :   shopts.nh                 = nh;
    +      57          97 :   shopts.node_name          = getPrintName();
    +      58          97 :   shopts.no_message_timeout = mrs_lib::no_timeout;
    +      59          97 :   shopts.threadsafe         = true;
    +      60          97 :   shopts.autostart          = true;
    +      61          97 :   shopts.queue_size         = 10;
    +      62          97 :   shopts.transport_hints    = ros::TransportHints().tcpNoDelay();
    +      63             : 
    +      64         194 :   sh_orientation_ = mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped>(shopts, "/" + ch_->uav_name + "/" + orient_topic_,
    +      65          97 :                                                                                 &HdgPassthrough::callbackOrientation, this);
    +      66         194 :   sh_ang_vel_     = mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped>(shopts, "/" + ch_->uav_name + "/" + ang_vel_topic_,
    +      67          97 :                                                                          &HdgPassthrough::callbackAngularVelocity, this);
    +      68             : 
    +      69             :   // | ---------------- publishers initialization --------------- |
    +      70          97 :   if (ch_->debug_topics.output) {
    +      71          97 :     ph_output_ = mrs_lib::PublisherHandler<mrs_msgs::EstimatorOutput>(nh, getNamespacedName() + "/output", 10);
    +      72             :   }
    +      73          97 :   if (ch_->debug_topics.diag) {
    +      74           0 :     ph_diagnostics_ = mrs_lib::PublisherHandler<mrs_msgs::EstimatorDiagnostics>(nh, getNamespacedName() + "/diagnostics", 10);
    +      75             :   }
    +      76             : 
    +      77             :   // | ------------------ finish initialization ----------------- |
    +      78             : 
    +      79          97 :   if (changeState(INITIALIZED_STATE)) {
    +      80          97 :     ROS_INFO("[%s]: Estimator initialized, version %s", getPrintName().c_str(), VERSION);
    +      81             :   } else {
    +      82           0 :     ROS_INFO("[%s]: Estimator could not be initialized", getPrintName().c_str());
    +      83             :   }
    +      84          97 : }
    +      85             : /*//}*/
    +      86             : 
    +      87             : /*//{ start() */
    +      88         170 : bool HdgPassthrough::start(void) {
    +      89             : 
    +      90         170 :   if (isInState(READY_STATE)) {
    +      91          97 :     timer_update_.start();
    +      92          97 :     changeState(STARTED_STATE);
    +      93          97 :     return true;
    +      94             : 
    +      95             :   } else {
    +      96          73 :     ROS_WARN_THROTTLE(1.0, "[%s]: Estimator must be in READY_STATE to start it", getPrintName().c_str());
    +      97          73 :     return false;
    +      98             :   }
    +      99             : }
    +     100             : /*//}*/
    +     101             : 
    +     102             : /*//{ pause() */
    +     103           0 : bool HdgPassthrough::pause(void) {
    +     104             : 
    +     105           0 :   if (isInState(RUNNING_STATE)) {
    +     106           0 :     changeState(STOPPED_STATE);
    +     107           0 :     return true;
    +     108             : 
    +     109             :   } else {
    +     110           0 :     return false;
    +     111             :   }
    +     112             : }
    +     113             : /*//}*/
    +     114             : 
    +     115             : /*//{ reset() */
    +     116           0 : bool HdgPassthrough::reset(void) {
    +     117             : 
    +     118           0 :   if (!isInitialized()) {
    +     119           0 :     ROS_ERROR("[%s]: Cannot reset uninitialized estimator", getPrintName().c_str());
    +     120           0 :     return false;
    +     121             :   }
    +     122             : 
    +     123           0 :   changeState(STOPPED_STATE);
    +     124             : 
    +     125           0 :   ROS_INFO("[%s]: Estimator reset", getPrintName().c_str());
    +     126             : 
    +     127           0 :   return true;
    +     128             : }
    +     129             : /*//}*/
    +     130             : 
    +     131             : /*//{ callbackOrientation() */
    +     132      191805 : void HdgPassthrough::callbackOrientation(const geometry_msgs::QuaternionStamped::ConstPtr msg) {
    +     133             : 
    +     134      191805 :   if (!isInitialized()) {
    +     135          11 :     return;
    +     136             :   }
    +     137             : 
    +     138             :   double hdg;
    +     139             :   try {
    +     140      191785 :     hdg = mrs_lib::AttitudeConverter(msg->quaternion).getHeading();
    +     141             :   }
    +     142           0 :   catch (...) {
    +     143           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: failed getting heading", getPrintName().c_str());
    +     144             :   }
    +     145             : 
    +     146      191780 :   setState(hdg, POSITION);
    +     147             : 
    +     148      191741 :   if (!isError()) {
    +     149      191706 :     mrs_lib::set_mutexed(mutex_last_valid_hdg_, hdg, last_valid_hdg_);
    +     150             :   }
    +     151             : }
    +     152             : /*//}*/
    +     153             : 
    +     154             : /*//{ callbackAngularVelocity() */
    +     155      187522 : void HdgPassthrough::callbackAngularVelocity(const geometry_msgs::Vector3Stamped::ConstPtr msg) {
    +     156             : 
    +     157      187522 :   if (!isInitialized() || !sh_orientation_.hasMsg()) {
    +     158           1 :     return;
    +     159             :   }
    +     160             : 
    +     161             :   double hdg_rate;
    +     162             :   try {
    +     163      187510 :     hdg_rate = mrs_lib::AttitudeConverter(sh_orientation_.getMsg()->quaternion).getHeadingRate(msg->vector);
    +     164             :   }
    +     165           0 :   catch (...) {
    +     166           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: failed getting heading", getPrintName().c_str());
    +     167             :   }
    +     168             : 
    +     169      187294 :   setState(hdg_rate, VELOCITY);
    +     170             : }
    +     171             : /*//}*/
    +     172             : 
    +     173             : /* timerUpdate() //{*/
    +     174      190009 : void HdgPassthrough::timerUpdate([[maybe_unused]] const ros::TimerEvent &event) {
    +     175             : 
    +     176             : 
    +     177      190009 :   if (!isInitialized()) {
    +     178           0 :     return;
    +     179             :   }
    +     180             : 
    +     181      190004 :   publishOutput();
    +     182      190013 :   publishDiagnostics();
    +     183             : }
    +     184             : /*//}*/
    +     185             : 
    +     186             : /*//{ timerCheckHealth() */
    +     187      193140 : void HdgPassthrough::timerCheckHealth([[maybe_unused]] const ros::TimerEvent &event) {
    +     188             : 
    +     189      193140 :   if (!isInitialized()) {
    +     190          17 :     return;
    +     191             :   }
    +     192             : 
    +     193      193124 :   if (isInState(INITIALIZED_STATE) && is_orient_ready_ && is_ang_vel_ready_) {
    +     194             : 
    +     195          97 :     changeState(READY_STATE);
    +     196          97 :     ROS_INFO_THROTTLE(1.0, "[%s]: Ready to start", getPrintName().c_str());
    +     197             :   }
    +     198             : 
    +     199      193117 :   if (isInState(STARTED_STATE)) {
    +     200             : 
    +     201          97 :     ROS_INFO_THROTTLE(1.0, "[%s]: Estimator Running", getPrintName().c_str());
    +     202          97 :     changeState(RUNNING_STATE);
    +     203             :   }
    +     204             : 
    +     205      193113 :   if (sh_orientation_.hasMsg()) {
    +     206      191692 :     is_orient_ready_ = true;
    +     207             :   } else {
    +     208        1442 :     ROS_WARN_THROTTLE(1.0, "[%s]: has not received orientation yet", getPrintName().c_str());
    +     209             :   }
    +     210             : 
    +     211      193152 :   if (sh_ang_vel_.hasMsg()) {
    +     212      190188 :     is_ang_vel_ready_ = true;
    +     213             :   } else {
    +     214        2896 :     ROS_WARN_THROTTLE(1.0, "[%s]: has not received angular velocity yet", getPrintName().c_str());
    +     215             :   }
    +     216             : }
    +     217             : /*//}*/
    +     218             : 
    +     219             : /*//{ getState() */
    +     220           0 : double HdgPassthrough::getState(const int &state_id_in, const int &axis_in) const {
    +     221           0 :   return getState(stateIdToIndex(state_id_in, axis_in));
    +     222             : }
    +     223             : 
    +     224      662907 : double HdgPassthrough::getState(const int &state_idx_in) const {
    +     225      662907 :   return mrs_lib::get_mutexed(mtx_hdg_state_, hdg_state_(state_idx_in));
    +     226             : }
    +     227             : /*//}*/
    +     228             : 
    +     229             : /*//{ setState() */
    +     230           0 : void HdgPassthrough::setState(const double &state_in, const int &state_id_in, const int &axis_in) {
    +     231           0 :   setState(state_in, stateIdToIndex(state_id_in, axis_in));
    +     232           0 : }
    +     233             : 
    +     234      379309 : void HdgPassthrough::setState(const double &state_in, const int &state_idx_in) {
    +     235             : 
    +     236      379309 :   const double prev_hdg_state   = mrs_lib::get_mutexed(mtx_hdg_state_, hdg_state_(state_idx_in));
    +     237      379133 :   prev_hdg_state_(state_idx_in) = prev_hdg_state;
    +     238      379111 :   mrs_lib::set_mutexed(mtx_hdg_state_, state_in, hdg_state_(state_idx_in));
    +     239             : 
    +     240      379056 :   const double innovation = mrs_lib::geometry::radians::dist(mrs_lib::geometry::radians(state_in), mrs_lib::geometry::radians(prev_hdg_state));
    +     241      379000 :   mrs_lib::set_mutexed(mtx_innovation_, innovation, innovation_(state_idx_in));
    +     242      379099 : }
    +     243             : /*//}*/
    +     244             : 
    +     245             : /*//{ getStates() */
    +     246      190009 : HdgPassthrough::states_t HdgPassthrough::getStates(void) const {
    +     247      190009 :   return mrs_lib::get_mutexed(mtx_hdg_state_, hdg_state_);
    +     248             : }
    +     249             : /*//}*/
    +     250             : 
    +     251             : /*//{ setStates() */
    +     252           0 : void HdgPassthrough::setStates(const states_t &states_in) {
    +     253           0 :   mrs_lib::set_mutexed(mtx_hdg_state_, states_in, hdg_state_);
    +     254           0 : }
    +     255             : /*//}*/
    +     256             : 
    +     257             : /*//{ getCovariance() */
    +     258           0 : double HdgPassthrough::getCovariance(const int &state_id_in, const int &axis_in) const {
    +     259           0 :   return getCovariance(stateIdToIndex(state_id_in, axis_in));
    +     260             : }
    +     261             : 
    +     262           0 : double HdgPassthrough::getCovariance(const int &state_idx_in) const {
    +     263           0 :   return mrs_lib::get_mutexed(mtx_hdg_covariance_, hdg_covariance_(state_idx_in, state_idx_in));
    +     264             : }
    +     265             : /*//}*/
    +     266             : 
    +     267             : /*//{ getCovarianceMatrix() */
    +     268      189991 : HdgPassthrough::covariance_t HdgPassthrough::getCovarianceMatrix(void) const {
    +     269      189991 :   return mrs_lib::get_mutexed(mtx_hdg_covariance_, hdg_covariance_);
    +     270             : }
    +     271             : /*//}*/
    +     272             : 
    +     273             : /*//{ setCovarianceMatrix() */
    +     274           0 : void HdgPassthrough::setCovarianceMatrix(const covariance_t &cov_in) {
    +     275           0 :   mrs_lib::set_mutexed(mtx_hdg_covariance_, cov_in, hdg_covariance_);
    +     276           0 : }
    +     277             : /*//}*/
    +     278             : 
    +     279             : /*//{ getInnovation() */
    +     280           0 : double HdgPassthrough::getInnovation(const int &state_idx) const {
    +     281           0 :   return mrs_lib::get_mutexed(mtx_innovation_, innovation_(state_idx));
    +     282             : }
    +     283             : 
    +     284           0 : double HdgPassthrough::getInnovation(const int &state_id_in, const int &axis_in) const {
    +     285           0 :   return getInnovation(stateIdToIndex(state_id_in, axis_in));
    +     286             : }
    +     287             : /*//}*/
    +     288             : 
    +     289             : /*//{ getLastValidHdg() */
    +     290           0 : double HdgPassthrough::getLastValidHdg() const {
    +     291           0 :   return mrs_lib::get_mutexed(mutex_last_valid_hdg_, last_valid_hdg_);
    +     292             : }
    +     293             : /*//}*/
    +     294             : 
    +     295             : /*//{ getNamespacedName() */
    +     296         194 : std::string HdgPassthrough::getNamespacedName() const {
    +     297         388 :   return parent_state_est_name_ + "/" + getName();
    +     298             : }
    +     299             : /*//}*/
    +     300             : 
    +     301             : /*//{ getPrintName() */
    +     302         570 : std::string HdgPassthrough::getPrintName() const {
    +     303        1140 :   return ch_->nodelet_name + "/" + parent_state_est_name_ + "/" + getName();
    +     304             : }
    +     305             : /*//}*/
    +     306             : 
    +     307             : };  // namespace mrs_uav_state_estimators
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/heading/hdg_passthrough.cpp.gcov.overview.html b/mrs_uav_state_estimators/src/estimators/heading/hdg_passthrough.cpp.gcov.overview.html new file mode 100644 index 0000000000..519a26d886 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/heading/hdg_passthrough.cpp.gcov.overview.html @@ -0,0 +1,97 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/heading/hdg_passthrough.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_state_estimators/src/estimators/heading/hdg_passthrough.cpp.gcov.png b/mrs_uav_state_estimators/src/estimators/heading/hdg_passthrough.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..6c564f7e1e2332a7d663888dab973ff6736176bd GIT binary patch literal 1198 zcmV;f1X25mP)xhA{a0y>Im96${OsrCSN-)*s3M_Th;&+(W%hrUdAb6Y zm!mf?mr!#QKd=+!V36W9q859c&u^#!mv3?MN}RivHb$EUfLllZG$|oW$^aO+6j9FF zf!6W&@v>wxO7ZgwqGnjuyGVvZ9c2xskEo0msBwVxh@XXMeYu}Gy*qx7I<87ir>_x4 zDboYzB?E{OZ4c>@;Jn8N;DrGbCd)W;%$Zp}hMHN{foqamrt&J*BF%)s=Bvm1il2 zVxH|g6g5jMAj;r#=n{6P*&cOrOATHf8r=K1$DYCEnL-?7otk{(B~Z$GqTXy z5p#-`3QE+Q9f&l=^@#L7Yv~@v-V<2&GK)O-{P#{lI)tZ)I(xf?w%($rPxhBvMhrr~ z9a2wT;kK+}I7?9wGV3JN&U%|a#x{jUB&J-|;;C9l7eW;(muSj$`BY&#PW}=^VLzu- z=a>+W_EKTiBS^bWlqY)|!#jEWa1$qnaK09_GeW6@_pq*`=;0M0-}Q(;(^CinmI&8s z`Bb>-+<|q0_;k1~g8PJla5bHytJmWn4AyClrlNW>H7555WV5n3;_I0 zD*OEXQgegKGg50jXUi(%$aLmOsiP$9ct}1itknaDVsuzJUfeA;6NhMzKwm0cC$%=Q z;QUmh$tKYqwsKIB?g4FlZTBvv#*BSTR=LEdVKJC0+d~XgjjTJV8ncXP7a-qI;slnd z4C9wSL!KdAXap{*7)7{cEBs)XC?Ds=)6tozXjcOz7eAj!7*Bc8~XFid+4WH%&_xWRSE+QtGt&O;Yn>H(D3J zlAqMd+>^e + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/heading + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/headingHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:9149018.6 %
    Date:2024-04-18 23:11:36Functions:125721.1 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    hdg_generic.cpp +
    0.0%
    +
    0.0 %0 / 3570.0 %0 / 34
    hdg_passthrough.cpp +
    68.4%68.4%
    +
    68.4 %91 / 13352.2 %12 / 23
    <unnamed>68.4 %91 / 13352.2 %12 / 23
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/heading/index-detail-sort-l.html b/mrs_uav_state_estimators/src/estimators/heading/index-detail-sort-l.html new file mode 100644 index 0000000000..5717eb00ce --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/heading/index-detail-sort-l.html @@ -0,0 +1,120 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/heading + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/headingHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:9149018.6 %
    Date:2024-04-18 23:11:36Functions:125721.1 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    hdg_generic.cpp +
    0.0%
    +
    0.0 %0 / 3570.0 %0 / 34
    hdg_passthrough.cpp +
    68.4%68.4%
    +
    68.4 %91 / 13352.2 %12 / 23
    <unnamed>68.4 %91 / 13352.2 %12 / 23
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/heading/index-detail.html b/mrs_uav_state_estimators/src/estimators/heading/index-detail.html new file mode 100644 index 0000000000..444f53c220 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/heading/index-detail.html @@ -0,0 +1,120 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/heading + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/headingHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:9149018.6 %
    Date:2024-04-18 23:11:36Functions:125721.1 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    hdg_generic.cpp +
    0.0%
    +
    0.0 %0 / 3570.0 %0 / 34
    hdg_passthrough.cpp +
    68.4%68.4%
    +
    68.4 %91 / 13352.2 %12 / 23
    <unnamed>68.4 %91 / 13352.2 %12 / 23
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/heading/index-sort-f.html b/mrs_uav_state_estimators/src/estimators/heading/index-sort-f.html new file mode 100644 index 0000000000..431dd104d1 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/heading/index-sort-f.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/heading + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/headingHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:9149018.6 %
    Date:2024-04-18 23:11:36Functions:125721.1 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    hdg_generic.cpp +
    0.0%
    +
    0.0 %0 / 3570.0 %0 / 34
    hdg_passthrough.cpp +
    68.4%68.4%
    +
    68.4 %91 / 13352.2 %12 / 23
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/heading/index-sort-l.html b/mrs_uav_state_estimators/src/estimators/heading/index-sort-l.html new file mode 100644 index 0000000000..fcdebe1cbc --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/heading/index-sort-l.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/heading + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/headingHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:9149018.6 %
    Date:2024-04-18 23:11:36Functions:125721.1 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    hdg_generic.cpp +
    0.0%
    +
    0.0 %0 / 3570.0 %0 / 34
    hdg_passthrough.cpp +
    68.4%68.4%
    +
    68.4 %91 / 13352.2 %12 / 23
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/heading/index.html b/mrs_uav_state_estimators/src/estimators/heading/index.html new file mode 100644 index 0000000000..04c2ce6fda --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/heading/index.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/heading + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/headingHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:9149018.6 %
    Date:2024-04-18 23:11:36Functions:125721.1 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    hdg_generic.cpp +
    0.0%
    +
    0.0 %0 / 3570.0 %0 / 34
    hdg_passthrough.cpp +
    68.4%68.4%
    +
    68.4 %91 / 13352.2 %12 / 23
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/lateral/index-detail-sort-f.html b/mrs_uav_state_estimators/src/estimators/lateral/index-detail-sort-f.html new file mode 100644 index 0000000000..1a645ccbf5 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/lateral/index-detail-sort-f.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/lateral + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/lateralHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:24143755.1 %
    Date:2024-04-18 23:11:36Functions:253375.8 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    lat_generic.cpp +
    55.1%55.1%
    +
    55.1 %241 / 43775.8 %25 / 33
    <unnamed>55.1 %241 / 43775.8 %25 / 33
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/lateral/index-detail-sort-l.html b/mrs_uav_state_estimators/src/estimators/lateral/index-detail-sort-l.html new file mode 100644 index 0000000000..3b3de34db6 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/lateral/index-detail-sort-l.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/lateral + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/lateralHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:24143755.1 %
    Date:2024-04-18 23:11:36Functions:253375.8 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    lat_generic.cpp +
    55.1%55.1%
    +
    55.1 %241 / 43775.8 %25 / 33
    <unnamed>55.1 %241 / 43775.8 %25 / 33
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/lateral/index-detail.html b/mrs_uav_state_estimators/src/estimators/lateral/index-detail.html new file mode 100644 index 0000000000..72d7e0b89d --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/lateral/index-detail.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/lateral + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/lateralHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:24143755.1 %
    Date:2024-04-18 23:11:36Functions:253375.8 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    lat_generic.cpp +
    55.1%55.1%
    +
    55.1 %241 / 43775.8 %25 / 33
    <unnamed>55.1 %241 / 43775.8 %25 / 33
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/lateral/index-sort-f.html b/mrs_uav_state_estimators/src/estimators/lateral/index-sort-f.html new file mode 100644 index 0000000000..54f2a7bea3 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/lateral/index-sort-f.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/lateral + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/lateralHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:24143755.1 %
    Date:2024-04-18 23:11:36Functions:253375.8 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    lat_generic.cpp +
    55.1%55.1%
    +
    55.1 %241 / 43775.8 %25 / 33
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/lateral/index-sort-l.html b/mrs_uav_state_estimators/src/estimators/lateral/index-sort-l.html new file mode 100644 index 0000000000..4fe9b28c01 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/lateral/index-sort-l.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/lateral + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/lateralHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:24143755.1 %
    Date:2024-04-18 23:11:36Functions:253375.8 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    lat_generic.cpp +
    55.1%55.1%
    +
    55.1 %241 / 43775.8 %25 / 33
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/lateral/index.html b/mrs_uav_state_estimators/src/estimators/lateral/index.html new file mode 100644 index 0000000000..6da0568d4e --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/lateral/index.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/lateral + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/lateralHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:24143755.1 %
    Date:2024-04-18 23:11:36Functions:253375.8 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    lat_generic.cpp +
    55.1%55.1%
    +
    55.1 %241 / 43775.8 %25 / 33
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/lateral/lat_generic.cpp.func-sort-c.html b/mrs_uav_state_estimators/src/estimators/lateral/lat_generic.cpp.func-sort-c.html new file mode 100644 index 0000000000..906884652f --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/lateral/lat_generic.cpp.func-sort-c.html @@ -0,0 +1,212 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/lateral/lat_generic.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/lateral - lat_generic.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:24143755.1 %
    Date:2024-04-18 23:11:36Functions:253375.8 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::LatGeneric::timerCheckHealth(ros::TimerEvent const&)0
    mrs_uav_state_estimators::LatGeneric::setCovarianceMatrix(Eigen::Matrix<double, 6, 6, 0, 6, 6> const&)0
    mrs_uav_state_estimators::LatGeneric::generateRepredictorModels(double)0
    mrs_uav_state_estimators::LatGeneric::pause()0
    mrs_uav_state_estimators::LatGeneric::reset()0
    mrs_uav_state_estimators::LatGeneric::setStates(Eigen::Matrix<double, 6, 1, 0, 6, 1> const&)0
    mrs_uav_state_estimators::LatGeneric::generateRepredictorModels(double)::{lambda(double)#2}::operator()(double) const0
    mrs_uav_state_estimators::LatGeneric::generateRepredictorModels(double)::{lambda(double)#1}::operator()(double) const0
    mrs_uav_state_estimators::LatGeneric::initialize(ros::NodeHandle&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)97
    mrs_uav_state_estimators::LatGeneric::isConverged()97
    mrs_uav_state_estimators::LatGeneric::callbackReconfigure(mrs_uav_state_estimators::LateralEstimatorConfig&, unsigned int)97
    mrs_uav_state_estimators::LatGeneric::setInputCoeff(double const&)188
    mrs_uav_state_estimators::LatGeneric::setState(double const&, int const&)326
    mrs_uav_state_estimators::LatGeneric::setState(double const&, int const&, int const&)326
    mrs_uav_state_estimators::LatGeneric::getNamespacedName[abi:cxx11]() const586
    mrs_uav_state_estimators::LatGeneric::getPrintName[abi:cxx11]() const902
    mrs_uav_state_estimators::LatGeneric::start()3956
    mrs_uav_state_estimators::LatGeneric::initialize(ros::NodeHandle&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)::{lambda(int, int)#1}::operator()(int, int) const10948
    mrs_uav_state_estimators::LatGeneric::getCovarianceMatrix() const171855
    mrs_uav_state_estimators::LatGeneric::setDt(double const&)171858
    mrs_uav_state_estimators::LatGeneric::getStates() const171859
    mrs_uav_state_estimators::LatGeneric::generateA()172144
    mrs_uav_state_estimators::LatGeneric::generateB()172147
    mrs_uav_state_estimators::LatGeneric::timerUpdate(ros::TimerEvent const&)192957
    mrs_uav_state_estimators::LatGeneric::doCorrection(Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, double, mrs_uav_managers::estimation_manager::StateId_t const&, ros::Time const&)193302
    mrs_uav_state_estimators::LatGeneric::doCorrection(mrs_uav_state_estimators::Correction<2>::MeasurementStamped const&, double, mrs_uav_managers::estimation_manager::StateId_t const&)193370
    mrs_uav_state_estimators::LatGeneric::initialize(ros::NodeHandle&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)::{lambda(mrs_uav_state_estimators::Correction<2>::MeasurementStamped const&, double, mrs_uav_managers::estimation_manager::StateId_t)#2}::operator()(mrs_uav_state_estimators::Correction<2>::MeasurementStamped const&, double, mrs_uav_managers::estimation_manager::StateId_t) const193371
    mrs_uav_state_estimators::LatGeneric::getInnovation(int const&) const365345
    mrs_uav_state_estimators::LatGeneric::getInnovation(int const&, int const&) const365496
    mrs_uav_state_estimators::LatGeneric::getCovariance(int const&) const730909
    mrs_uav_state_estimators::LatGeneric::getCovariance(int const&, int const&) const731064
    mrs_uav_state_estimators::LatGeneric::getState(int const&) const1472217
    mrs_uav_state_estimators::LatGeneric::getState(int const&, int const&) const1472696
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/lateral/lat_generic.cpp.func.html b/mrs_uav_state_estimators/src/estimators/lateral/lat_generic.cpp.func.html new file mode 100644 index 0000000000..42bea4c1b7 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/lateral/lat_generic.cpp.func.html @@ -0,0 +1,212 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/lateral/lat_generic.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/lateral - lat_generic.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:24143755.1 %
    Date:2024-04-18 23:11:36Functions:253375.8 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::LatGeneric::initialize(ros::NodeHandle&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)97
    mrs_uav_state_estimators::LatGeneric::isConverged()97
    mrs_uav_state_estimators::LatGeneric::timerUpdate(ros::TimerEvent const&)192957
    mrs_uav_state_estimators::LatGeneric::doCorrection(Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, double, mrs_uav_managers::estimation_manager::StateId_t const&, ros::Time const&)193302
    mrs_uav_state_estimators::LatGeneric::doCorrection(mrs_uav_state_estimators::Correction<2>::MeasurementStamped const&, double, mrs_uav_managers::estimation_manager::StateId_t const&)193370
    mrs_uav_state_estimators::LatGeneric::setInputCoeff(double const&)188
    mrs_uav_state_estimators::LatGeneric::timerCheckHealth(ros::TimerEvent const&)0
    mrs_uav_state_estimators::LatGeneric::callbackReconfigure(mrs_uav_state_estimators::LateralEstimatorConfig&, unsigned int)97
    mrs_uav_state_estimators::LatGeneric::setCovarianceMatrix(Eigen::Matrix<double, 6, 6, 0, 6, 6> const&)0
    mrs_uav_state_estimators::LatGeneric::generateRepredictorModels(double)0
    mrs_uav_state_estimators::LatGeneric::pause()0
    mrs_uav_state_estimators::LatGeneric::reset()0
    mrs_uav_state_estimators::LatGeneric::setDt(double const&)171858
    mrs_uav_state_estimators::LatGeneric::start()3956
    mrs_uav_state_estimators::LatGeneric::setState(double const&, int const&)326
    mrs_uav_state_estimators::LatGeneric::setState(double const&, int const&, int const&)326
    mrs_uav_state_estimators::LatGeneric::generateA()172144
    mrs_uav_state_estimators::LatGeneric::generateB()172147
    mrs_uav_state_estimators::LatGeneric::setStates(Eigen::Matrix<double, 6, 1, 0, 6, 1> const&)0
    mrs_uav_state_estimators::LatGeneric::getPrintName[abi:cxx11]() const902
    mrs_uav_state_estimators::LatGeneric::getCovariance(int const&) const730909
    mrs_uav_state_estimators::LatGeneric::getCovariance(int const&, int const&) const731064
    mrs_uav_state_estimators::LatGeneric::getInnovation(int const&) const365345
    mrs_uav_state_estimators::LatGeneric::getInnovation(int const&, int const&) const365496
    mrs_uav_state_estimators::LatGeneric::getNamespacedName[abi:cxx11]() const586
    mrs_uav_state_estimators::LatGeneric::getCovarianceMatrix() const171855
    mrs_uav_state_estimators::LatGeneric::getState(int const&) const1472217
    mrs_uav_state_estimators::LatGeneric::getState(int const&, int const&) const1472696
    mrs_uav_state_estimators::LatGeneric::getStates() const171859
    mrs_uav_state_estimators::LatGeneric::initialize(ros::NodeHandle&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)::{lambda(mrs_uav_state_estimators::Correction<2>::MeasurementStamped const&, double, mrs_uav_managers::estimation_manager::StateId_t)#2}::operator()(mrs_uav_state_estimators::Correction<2>::MeasurementStamped const&, double, mrs_uav_managers::estimation_manager::StateId_t) const193371
    mrs_uav_state_estimators::LatGeneric::initialize(ros::NodeHandle&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)::{lambda(int, int)#1}::operator()(int, int) const10948
    mrs_uav_state_estimators::LatGeneric::generateRepredictorModels(double)::{lambda(double)#2}::operator()(double) const0
    mrs_uav_state_estimators::LatGeneric::generateRepredictorModels(double)::{lambda(double)#1}::operator()(double) const0
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/lateral/lat_generic.cpp.gcov.frameset.html b/mrs_uav_state_estimators/src/estimators/lateral/lat_generic.cpp.gcov.frameset.html new file mode 100644 index 0000000000..20cba12156 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/lateral/lat_generic.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/lateral/lat_generic.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_state_estimators/src/estimators/lateral/lat_generic.cpp.gcov.html b/mrs_uav_state_estimators/src/estimators/lateral/lat_generic.cpp.gcov.html new file mode 100644 index 0000000000..ac183adceb --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/lateral/lat_generic.cpp.gcov.html @@ -0,0 +1,887 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/lateral/lat_generic.cpp + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/lateral - lat_generic.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:24143755.1 %
    Date:2024-04-18 23:11:36Functions:253375.8 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #define VERSION "0.0.0.1"
    +       2             : 
    +       3             : /* includes //{ */
    +       4             : 
    +       5             : #include <mrs_uav_state_estimators/estimators/lateral/lat_generic.h>
    +       6             : 
    +       7             : //}
    +       8             : 
    +       9             : namespace mrs_uav_state_estimators
    +      10             : {
    +      11             : 
    +      12             : /* initialize() //{*/
    +      13          97 : void LatGeneric::initialize(ros::NodeHandle &nh, const std::shared_ptr<CommonHandlers_t> &ch, const std::shared_ptr<PrivateHandlers_t> &ph) {
    +      14             : 
    +      15          97 :   ch_ = ch;
    +      16          97 :   ph_ = ph;
    +      17             : 
    +      18          97 :   ns_frame_id_ = ch_->uav_name + "/" + frame_id_;
    +      19             : 
    +      20             :   // clang-format off
    +      21          97 :   dt_ = 0.01;
    +      22          97 :   input_coeff_ = 10;
    +      23          97 :   default_input_coeff_ = 10;
    +      24             : 
    +      25          97 :   generateA();
    +      26          97 :   generateB();
    +      27             : 
    +      28          97 :   H_ <<
    +      29          97 :     1, 0, 0, 0, 0, 0,
    +      30          97 :     0, 1, 0, 0, 0, 0;
    +      31             : 
    +      32          97 :   innovation_ << 
    +      33          97 :     0, 0;
    +      34             : 
    +      35             : 
    +      36             :   // clang-format on
    +      37             : 
    +      38             :   // | --------------- initialize parameter loader -------------- |
    +      39             : 
    +      40          97 :   if (is_core_plugin_) {
    +      41             : 
    +      42          97 :     ph->param_loader->addYamlFile(ros::package::getPath(package_name_) + "/config/private/" + parent_state_est_name_ + "/" + getName() + ".yaml");
    +      43          97 :     ph->param_loader->addYamlFile(ros::package::getPath(package_name_) + "/config/public/" + parent_state_est_name_ + "/" + getName() + ".yaml");
    +      44             :   }
    +      45             : 
    +      46          97 :   ph->param_loader->setPrefix(ch_->package_name + "/" + Support::toSnakeCase(ch_->nodelet_name) + "/" + getNamespacedName() + "/");
    +      47             : 
    +      48             :   // | --------------------- load parameters -------------------- |
    +      49          97 :   ph->param_loader->loadParam("hdg_source_topic", hdg_source_topic_);
    +      50          97 :   ph->param_loader->loadParam("max_flight_z", max_flight_z_);
    +      51          97 :   ph->param_loader->loadParam("innovation/limit", pos_innovation_limit_);
    +      52          97 :   ph->param_loader->loadParam("innovation/action", exc_innovation_action_name_);
    +      53          97 :   exc_innovation_action_ = map_exc_inno_action.at(exc_innovation_action_name_);
    +      54          97 :   ph->param_loader->loadParam("repredictor/enabled", is_repredictor_enabled_);
    +      55          97 :   if (is_repredictor_enabled_) {
    +      56           0 :     ph->param_loader->loadParam("repredictor/buffer_size", rep_buffer_size_);
    +      57             :   }
    +      58             : 
    +      59             :   // | --------------- corrections initialization --------------- |
    +      60          97 :   ph->param_loader->loadParam("corrections", correction_names_);
    +      61             : 
    +      62         198 :   for (auto corr_name : correction_names_) {
    +      63         101 :     corrections_.push_back(std::make_shared<Correction<lat_generic::n_measurements>>(
    +      64       11150 :         nh, getNamespacedName(), corr_name, ns_frame_id_, EstimatorType_t::LATERAL, ch_, ph_, [this](int a, int b) { return this->getState(a, b); },
    +      65      193371 :         [this](const Correction<lat_generic::n_measurements>::MeasurementStamped &meas, const double R, const StateId_t state) {
    +      66      193371 :           return this->doCorrection(meas, R, state);
    +      67             :         }));
    +      68             :   }
    +      69             : 
    +      70             :   // | ------- check if all parameters loaded successfully ------ |
    +      71          97 :   if (!ph->param_loader->loadedSuccessfully()) {
    +      72           0 :     ROS_ERROR("[%s]: Could not load all non-optional parameters. Shutting down.", getPrintName().c_str());
    +      73           0 :     ros::shutdown();
    +      74             :   }
    +      75             : 
    +      76          97 :   ph->param_loader->setPrefix(ch_->package_name + "/" + Support::toSnakeCase(ch_->nodelet_name) + "/" + getNamespacedName() + "/");
    +      77             : 
    +      78             :   // | ----------- initialize process noise covariance ---------- |
    +      79          97 :   Q_ = Q_t::Zero();
    +      80             :   double tmp_noise;
    +      81          97 :   ph->param_loader->loadParam("process_noise/pos", tmp_noise);
    +      82          97 :   Q_(stateIdToIndex(POSITION, AXIS_X), stateIdToIndex(POSITION, AXIS_X)) = tmp_noise;
    +      83          97 :   Q_(stateIdToIndex(POSITION, AXIS_Y), stateIdToIndex(POSITION, AXIS_Y)) = tmp_noise;
    +      84          97 :   ph->param_loader->loadParam("process_noise/vel", tmp_noise);
    +      85          97 :   Q_(stateIdToIndex(VELOCITY, AXIS_X), stateIdToIndex(VELOCITY, AXIS_X)) = tmp_noise;
    +      86          97 :   Q_(stateIdToIndex(VELOCITY, AXIS_Y), stateIdToIndex(VELOCITY, AXIS_Y)) = tmp_noise;
    +      87          97 :   ph->param_loader->loadParam("process_noise/acc", tmp_noise);
    +      88          97 :   Q_(stateIdToIndex(ACCELERATION, AXIS_X), stateIdToIndex(ACCELERATION, AXIS_X)) = tmp_noise;
    +      89          97 :   Q_(stateIdToIndex(ACCELERATION, AXIS_Y), stateIdToIndex(ACCELERATION, AXIS_Y)) = tmp_noise;
    +      90             : 
    +      91             :   // | ------------- initialize dynamic reconfigure ------------- |
    +      92             :   drmgr_ =
    +      93          97 :       std::make_unique<drmgr_t>(ros::NodeHandle("~/" + getNamespacedName()), true, getPrintName(), boost::bind(&LatGeneric::callbackReconfigure, this, _1, _2));
    +      94          97 :   drmgr_->config.pos = Q_(stateIdToIndex(POSITION, AXIS_X), stateIdToIndex(POSITION, AXIS_X));
    +      95          97 :   drmgr_->config.vel = Q_(stateIdToIndex(VELOCITY, AXIS_X), stateIdToIndex(VELOCITY, AXIS_X));
    +      96          97 :   drmgr_->config.acc = Q_(stateIdToIndex(ACCELERATION, AXIS_X), stateIdToIndex(ACCELERATION, AXIS_X));
    +      97          97 :   drmgr_->update_config(drmgr_->config);
    +      98             : 
    +      99             :   // | --------------- Kalman filter intialization -------------- |
    +     100          97 :   const x_t        x0 = x_t::Zero();
    +     101          97 :   const P_t        P0 = 1e3 * P_t::Identity();
    +     102          97 :   const statecov_t sc0({x0, P0});
    +     103          97 :   sc_ = sc0;
    +     104             : 
    +     105          97 :   lkf_ = std::make_shared<lkf_t>(A_, B_, H_);
    +     106          97 :   if (is_repredictor_enabled_) {
    +     107             : 
    +     108           0 :     generateRepredictorModels(input_coeff_);
    +     109             : 
    +     110           0 :     const u_t       u0 = u_t::Zero();
    +     111           0 :     const ros::Time t0 = ros::Time::now();
    +     112           0 :     lkf_rep_           = std::make_unique<mrs_lib::Repredictor<varstep_lkf_t>>(x0, P0, u0, Q_, t0, models_.at(0), rep_buffer_size_);
    +     113             : 
    +     114           0 :     setDt(1.0 / ch_->desired_uav_state_rate);
    +     115             :   }
    +     116             : 
    +     117             :   // | ------------------ timers initialization ----------------- |
    +     118          97 :   timer_update_ = nh.createTimer(ros::Rate(ch_->desired_uav_state_rate), &LatGeneric::timerUpdate, this);  // not running after init
    +     119             :   /* timer_check_health_       = nh.createTimer(ros::Rate(ch_->desired_uav_state_rate), &LatGeneric::timerCheckHealth, this); */
    +     120             : 
    +     121             :   // | --------------- subscribers initialization --------------- |
    +     122             :   // subscriber to odometry
    +     123         194 :   mrs_lib::SubscribeHandlerOptions shopts;
    +     124          97 :   shopts.nh                 = nh;
    +     125          97 :   shopts.node_name          = getPrintName();
    +     126          97 :   shopts.no_message_timeout = mrs_lib::no_timeout;
    +     127          97 :   shopts.threadsafe         = true;
    +     128          97 :   shopts.autostart          = true;
    +     129          97 :   shopts.queue_size         = 10;
    +     130          97 :   shopts.transport_hints    = ros::TransportHints().tcpNoDelay();
    +     131             : 
    +     132          97 :   sh_control_input_ = mrs_lib::SubscribeHandler<mrs_msgs::EstimatorInput>(shopts, "control_input_in");
    +     133             :   sh_hdg_state_ =
    +     134          97 :       mrs_lib::SubscribeHandler<mrs_msgs::EstimatorOutput>(shopts, hdg_source_topic_);  // for transformation of desired accelerations from body to global frame
    +     135             : 
    +     136             :   // | ---------------- publishers initialization --------------- |
    +     137          97 :   if (ch_->debug_topics.input) {
    +     138          97 :     ph_input_ = mrs_lib::PublisherHandler<mrs_msgs::Float64ArrayStamped>(nh, getNamespacedName() + "/input", 10);
    +     139             :   }
    +     140          97 :   if (ch_->debug_topics.output) {
    +     141          97 :     ph_output_ = mrs_lib::PublisherHandler<mrs_msgs::EstimatorOutput>(nh, getNamespacedName() + "/output", 10);
    +     142             :   }
    +     143          97 :   if (ch_->debug_topics.diag) {
    +     144           0 :     ph_diagnostics_ = mrs_lib::PublisherHandler<mrs_msgs::EstimatorDiagnostics>(nh, getNamespacedName() + "/diagnostics", 10);
    +     145             :   }
    +     146             : 
    +     147             :   // | ------------------ finish initialization ----------------- |
    +     148             : 
    +     149          97 :   if (changeState(INITIALIZED_STATE)) {
    +     150          97 :     ROS_INFO("[%s]: Estimator initialized, version %s", getPrintName().c_str(), VERSION);
    +     151             :   } else {
    +     152           0 :     ROS_INFO("[%s]: Estimator could not be initialized", getPrintName().c_str());
    +     153             :   }
    +     154          97 : }
    +     155             : /*//}*/
    +     156             : 
    +     157             : /*//{ start() */
    +     158        3956 : bool LatGeneric::start(void) {
    +     159             : 
    +     160        3956 :   if (isInState(READY_STATE)) {
    +     161             :     /* timer_update_.start(); */
    +     162          97 :     changeState(STARTED_STATE);
    +     163          97 :     return true;
    +     164             : 
    +     165             :   } else {
    +     166        3859 :     ROS_WARN_THROTTLE(1.0, "[%s]: Estimator must be in READY_STATE to start it", getPrintName().c_str());
    +     167        3859 :     return false;
    +     168             :   }
    +     169             : }
    +     170             : /*//}*/
    +     171             : 
    +     172             : /*//{ pause() */
    +     173           0 : bool LatGeneric::pause(void) {
    +     174             : 
    +     175           0 :   if (isInState(RUNNING_STATE)) {
    +     176           0 :     changeState(STOPPED_STATE);
    +     177           0 :     return true;
    +     178             : 
    +     179             :   } else {
    +     180           0 :     return false;
    +     181             :   }
    +     182             : }
    +     183             : /*//}*/
    +     184             : 
    +     185             : /*//{ reset() */
    +     186           0 : bool LatGeneric::reset(void) {
    +     187             : 
    +     188           0 :   if (!isInitialized()) {
    +     189           0 :     ROS_ERROR("[%s]: Cannot reset uninitialized estimator", getPrintName().c_str());
    +     190           0 :     return false;
    +     191             :   }
    +     192             : 
    +     193           0 :   changeState(STOPPED_STATE);
    +     194             : 
    +     195             :   // Initialize LKF state and covariance
    +     196           0 :   const x_t        x0 = x_t::Zero();
    +     197           0 :   const P_t        P0 = 1e6 * P_t::Identity();
    +     198           0 :   const statecov_t sc0({x0, P0});
    +     199           0 :   sc_ = sc0;
    +     200             : 
    +     201             :   // Instantiate the LKF itself
    +     202           0 :   lkf_ = std::make_shared<lkf_t>(A_, B_, H_);
    +     203           0 :   if (is_repredictor_enabled_) {
    +     204             : 
    +     205           0 :     const u_t       u0 = u_t::Zero();
    +     206           0 :     const ros::Time t0 = ros::Time(0);
    +     207           0 :     lkf_rep_           = std::make_unique<mrs_lib::Repredictor<varstep_lkf_t>>(x0, P0, u0, Q_, t0, models_[0], rep_buffer_size_);
    +     208             :   }
    +     209             : 
    +     210           0 :   ROS_INFO("[%s]: Estimator reset", getPrintName().c_str());
    +     211             : 
    +     212           0 :   return true;
    +     213             : }
    +     214             : /*//}*/
    +     215             : 
    +     216             : /* timerUpdate() //{*/
    +     217      192957 : void LatGeneric::timerUpdate(const ros::TimerEvent &event) {
    +     218             : 
    +     219      192957 :   if (!isInitialized()) {
    +     220       21095 :     return;
    +     221             :   }
    +     222             : 
    +     223      192922 :   switch (getCurrentSmState()) {
    +     224             : 
    +     225           0 :     case UNINITIALIZED_STATE: {
    +     226           0 :       ROS_INFO_THROTTLE(1.0, "[%s]: %s initialization", getPrintName().c_str(), Support::waiting_for_string.c_str());
    +     227           0 :       break;
    +     228             :     }
    +     229             : 
    +     230          48 :     case READY_STATE: {
    +     231          48 :       ROS_INFO_THROTTLE(1.0, "[%s]: %s estimator start", getPrintName().c_str(), Support::waiting_for_string.c_str());
    +     232          48 :       break;
    +     233             :     }
    +     234             : 
    +     235        6594 :     case INITIALIZED_STATE: {
    +     236             :       // initialize the estimator with current corrections
    +     237        6757 :       for (auto correction : corrections_) {
    +     238        6660 :         auto res = correction->getProcessedCorrection();
    +     239        6658 :         if (res) {
    +     240         163 :           auto measurement_stamped = res.value(); 
    +     241         163 :           setState(measurement_stamped.value(AXIS_X), correction->getStateId(), AXIS_X);
    +     242         163 :           setState(measurement_stamped.value(AXIS_Y), correction->getStateId(), AXIS_Y);
    +     243         163 :           ROS_INFO_THROTTLE(1.0, "[%s]: Setting initial state to: %.2f %.2f", getPrintName().c_str(), measurement_stamped.value(AXIS_X),
    +     244             :                             measurement_stamped.value(AXIS_Y));
    +     245             :         } else {
    +     246        6497 :           ROS_INFO_THROTTLE(1.0, "[%s]: %s correction %s", getPrintName().c_str(), Support::waiting_for_string.c_str(), correction->getNamespacedName().c_str());
    +     247        6496 :           return;
    +     248             :         }
    +     249             :       }
    +     250          97 :       ROS_INFO_THROTTLE(1.0, "[%s]: Ready to start", getPrintName().c_str());
    +     251          97 :       changeState(READY_STATE);
    +     252          97 :       break;
    +     253             :     }
    +     254             : 
    +     255          97 :     case STARTED_STATE: {
    +     256          97 :       ROS_INFO_THROTTLE(1.0, "[%s]: %s convergence of LKF", getPrintName().c_str(), Support::waiting_for_string.c_str());
    +     257          97 :       if (isConverged()) {
    +     258          97 :         ROS_INFO_THROTTLE(1.0, "[%s]: LKF converged", getPrintName().c_str());
    +     259          97 :         changeState(RUNNING_STATE);
    +     260             :       }
    +     261          97 :       break;
    +     262             :     }
    +     263             : 
    +     264      186191 :     case RUNNING_STATE: {
    +     265      383597 :       for (auto correction : corrections_) {
    +     266      197403 :         if (!correction->isHealthy()) {
    +     267           0 :           ROS_ERROR_THROTTLE(1.0, "[%s]: Correction %s is not healthy!", getPrintName().c_str(), correction->getNamespacedName().c_str());
    +     268           0 :           changeState(ERROR_STATE);
    +     269             :         }
    +     270             :       }
    +     271      186178 :       break;
    +     272             :     }
    +     273             : 
    +     274           0 :     case STOPPED_STATE: {
    +     275           0 :       ROS_INFO_THROTTLE(1.0, "[%s]: Estimator is stopped", getPrintName().c_str());
    +     276           0 :       break;
    +     277             :     }
    +     278             : 
    +     279           0 :     case ERROR_STATE: {
    +     280           0 :       ROS_INFO_THROTTLE(1.0, "[%s]: Estimator is in ERROR state", getPrintName().c_str());
    +     281             : 
    +     282           0 :       ros::Time t_now = ros::Time::now();
    +     283           0 :       if (is_error_state_first_time_) {
    +     284           0 :         prev_time_in_error_state_  = t_now;
    +     285           0 :         is_error_state_first_time_ = false;
    +     286           0 :         error_state_duration_      = ros::Duration(0.0);
    +     287             :       }
    +     288           0 :       error_state_duration_ += t_now - prev_time_in_error_state_;
    +     289             : 
    +     290             : 
    +     291             :       // check if all corrections are healthy now
    +     292           0 :       bool all_corrections_healthy = true;
    +     293           0 :       for (auto correction : corrections_) {
    +     294           0 :         if (!correction->isHealthy()) {
    +     295           0 :           ROS_ERROR_THROTTLE(1.0, "[%s]: Correction %s is not healthy!", getPrintName().c_str(), correction->getNamespacedName().c_str());
    +     296           0 :           all_corrections_healthy = false;
    +     297             :         }
    +     298             :       }
    +     299             : 
    +     300           0 :       if (all_corrections_healthy && innovation_ok_) {
    +     301             :         // initialize the estimator again if corrections become healthy
    +     302           0 :         if (error_state_duration_.toSec() > 5.0) {
    +     303           0 :           ROS_INFO("[%s]: corrections healthy for %.2f s", getPrintName().c_str(), error_state_duration_.toSec());
    +     304           0 :           changeState(INITIALIZED_STATE);
    +     305           0 :           is_error_state_first_time_ = true;
    +     306           0 :         }
    +     307             :       } else {
    +     308           0 :         is_error_state_first_time_ = true;
    +     309             :       }
    +     310             : 
    +     311           0 :       prev_time_in_error_state_ = t_now;
    +     312             : 
    +     313           0 :       break;
    +     314             :     }
    +     315             :   }
    +     316             : 
    +     317      186421 :   if (sh_control_input_.newMsg()) {
    +     318       91408 :     is_input_ready_ = true;
    +     319             :   }
    +     320             : 
    +     321             :   // check age of input
    +     322      186429 :   if (is_input_ready_ && (ros::Time::now() - sh_control_input_.lastMsgTime()).toSec() > 0.1) {  // TODO: parametrize, if older than say 1 second, eland
    +     323          16 :     ROS_WARN_THROTTLE(1.0, "[%s]: input too old (%.4f s), using zero input instead", getPrintName().c_str(),
    +     324             :                       (ros::Time::now() - sh_control_input_.lastMsgTime()).toSec());
    +     325          16 :     is_input_ready_ = false;
    +     326             :   }
    +     327             : 
    +     328      186426 :   if (fun_get_hdg_()) {
    +     329      186209 :     is_hdg_state_ready_ = true;
    +     330             :   }
    +     331             : 
    +     332      186434 :   if (!isRunning() && !isStarted()) {
    +     333         136 :     return;
    +     334             :   }
    +     335             : 
    +     336      186281 :   if (first_iter_) {
    +     337          97 :     first_iter_ = false;
    +     338          97 :     return;
    +     339             :   }
    +     340             : 
    +     341             :   // obtain dt for state prediction
    +     342      186184 :   double dt = (event.current_real - event.last_real).toSec();
    +     343      186180 :   if (dt <= 0.0) {  // sometimes the timer ticks twice simultaneously in simulation - we ignore the second tick
    +     344       14338 :     return;
    +     345             :   }
    +     346             : 
    +     347      171842 :   if (!is_repredictor_enabled_) { // repredictor calculates dt on its own
    +     348      171854 :     setDt(dt);
    +     349             :   }
    +     350             : 
    +     351             :   // obtain unbiased desired control acceleration in the estimator frame that will be used as input to the estimator
    +     352      171816 :   u_t       u;
    +     353      171774 :   ros::Time input_stamp;
    +     354      171810 :   if (is_input_ready_ && is_hdg_state_ready_) {
    +     355      103804 :     auto res = fun_get_hdg_();
    +     356      103816 :     if (!res) {
    +     357           0 :       ROS_ERROR_THROTTLE(1.0, "[%s]: could not obtain heading", getPrintName().c_str());
    +     358           0 :       return;
    +     359             :     }
    +     360             : 
    +     361      103821 :     const tf2::Vector3 des_acc_global = getAccGlobal(sh_control_input_.getMsg(), res.value());
    +     362      103605 :     input_stamp                       = sh_control_input_.getMsg()->header.stamp;
    +     363      103730 :     if (input_coeff_ != default_input_coeff_){
    +     364          75 :       setInputCoeff(default_input_coeff_);
    +     365             :     }
    +     366      103730 :     u(0) = des_acc_global.getX();
    +     367      103645 :     u(1) = des_acc_global.getY();
    +     368             : 
    +     369             :   } else {  // this is ok before the controller starts controlling but bad during actual flight (causes delayed estimated acceleration and velocity)
    +     370       67996 :     ROS_DEBUG_THROTTLE(1.0, "[%s]: not receiving control input, estimation suboptimal, potentially unstable", getPrintName().c_str());
    +     371       68004 :     input_stamp = ros::Time::now();
    +     372       68007 :     if (input_coeff_ != 0){
    +     373         113 :       setInputCoeff(0);
    +     374             :     }
    +     375       68007 :     u = u_t::Zero();
    +     376             :   }
    +     377             : 
    +     378             :   // go through available corrections and apply them
    +     379             :   /* for (auto correction : corrections_) { */
    +     380             :   /*   auto res = correction->getProcessedCorrection(); */
    +     381             :   /*   if (res) { */
    +     382             :   /*     auto measurement_stamped = res.value(); */
    +     383             :   /*     doCorrection(measurement_stamped.value, correction->getR(), correction->getStateId(), measurement_stamped.stamp); */
    +     384             :   /*   } */
    +     385             :   /* } */
    +     386             : 
    +     387             :   // get current state, covariance, and process noise
    +     388      171712 :   statecov_t sc = mrs_lib::get_mutexed(mutex_sc_, sc_);
    +     389      171796 :   Q_t        Q  = mrs_lib::get_mutexed(mtx_Q_, Q_);
    +     390             : 
    +     391             :   // prediction step
    +     392             :   try {
    +     393             :     // Apply the prediction step
    +     394      343645 :     std::scoped_lock lock(mutex_lkf_);
    +     395      171797 :     if (is_repredictor_enabled_) {
    +     396           0 :       lkf_rep_->addInputChangeWithNoise(u, Q, input_stamp, models_[0]);
    +     397           0 :       sc = lkf_rep_->predictTo(ros::Time::now());
    +     398             :     } else {
    +     399      171797 :       sc = lkf_->predict(sc, u, Q, dt_);
    +     400             :     }
    +     401             :   }
    +     402           0 :   catch (const std::exception &e) {
    +     403           0 :     ROS_ERROR("[%s]: LKF prediction failed: %s", getPrintName().c_str(), e.what());
    +     404           0 :     changeState(ERROR_STATE);
    +     405             :   }
    +     406             : 
    +     407             :   // update the state and covariance variable that is queried by the estimation manager
    +     408      171791 :   mrs_lib::set_mutexed(mutex_sc_, sc, sc_);
    +     409             : 
    +     410             :   // publishing
    +     411      171761 :   publishInput(u, input_stamp);
    +     412      171862 :   publishOutput();
    +     413      171863 :   publishDiagnostics();
    +     414             : }
    +     415             : /*//}*/
    +     416             : 
    +     417             : /*//{ timerCheckHealth() */
    +     418           0 : void LatGeneric::timerCheckHealth([[maybe_unused]] const ros::TimerEvent &event) {
    +     419             : 
    +     420           0 :   if (!isInitialized()) {
    +     421           0 :     return;
    +     422             :   }
    +     423             : 
    +     424           0 :   switch (getCurrentSmState()) {
    +     425             : 
    +     426           0 :     case UNINITIALIZED_STATE: {
    +     427           0 :       ROS_INFO_THROTTLE(1.0, "[%s]: %s initialization", getPrintName().c_str(), Support::waiting_for_string.c_str());
    +     428           0 :       break;
    +     429             :     }
    +     430             : 
    +     431           0 :     case READY_STATE: {
    +     432           0 :       ROS_INFO_THROTTLE(1.0, "[%s]: %s estimator start", getPrintName().c_str(), Support::waiting_for_string.c_str());
    +     433           0 :       break;
    +     434             :     }
    +     435             : 
    +     436           0 :     case INITIALIZED_STATE: {
    +     437             :       // initialize the estimator with current corrections
    +     438           0 :       for (auto correction : corrections_) {
    +     439           0 :         auto res = correction->getProcessedCorrection();
    +     440           0 :         if (res) {
    +     441           0 :           auto measurement_stamped = res.value();
    +     442           0 :           setState(measurement_stamped.value(AXIS_X), correction->getStateId(), AXIS_X);
    +     443           0 :           setState(measurement_stamped.value(AXIS_Y), correction->getStateId(), AXIS_Y);
    +     444           0 :           ROS_INFO_THROTTLE(1.0, "[%s]: Setting initial state to: %.2f %.2f", getPrintName().c_str(), measurement_stamped.value(AXIS_X),
    +     445             :                             measurement_stamped.value(AXIS_Y));
    +     446             :         } else {
    +     447           0 :           ROS_INFO_THROTTLE(1.0, "[%s]: %s correction %s", getPrintName().c_str(), Support::waiting_for_string.c_str(), correction->getPrintName().c_str());
    +     448           0 :           return;
    +     449             :         }
    +     450             :       }
    +     451           0 :       ROS_INFO_THROTTLE(1.0, "[%s]: Ready to start", getPrintName().c_str());
    +     452           0 :       changeState(READY_STATE);
    +     453           0 :       break;
    +     454             :     }
    +     455             : 
    +     456           0 :     case STARTED_STATE: {
    +     457           0 :       ROS_INFO_THROTTLE(1.0, "[%s]: %s convergence of LKF", getPrintName().c_str(), Support::waiting_for_string.c_str());
    +     458           0 :       if (isConverged()) {
    +     459           0 :         ROS_INFO_THROTTLE(1.0, "[%s]: LKF converged", getPrintName().c_str());
    +     460           0 :         changeState(RUNNING_STATE);
    +     461             :       }
    +     462           0 :       break;
    +     463             :     }
    +     464             : 
    +     465           0 :     case RUNNING_STATE: {
    +     466           0 :       for (auto correction : corrections_) {
    +     467           0 :         if (!correction->isHealthy()) {
    +     468           0 :           ROS_ERROR_THROTTLE(1.0, "[%s]: Correction %s is not healthy!", getPrintName().c_str(), correction->getNamespacedName().c_str());
    +     469           0 :           changeState(ERROR_STATE);
    +     470             :         }
    +     471             :       }
    +     472           0 :       break;
    +     473             :     }
    +     474             : 
    +     475           0 :     case STOPPED_STATE: {
    +     476           0 :       ROS_INFO_THROTTLE(1.0, "[%s]: Estimator is stopped", getPrintName().c_str());
    +     477           0 :       break;
    +     478             :     }
    +     479             : 
    +     480           0 :     case ERROR_STATE: {
    +     481           0 :       ROS_INFO_THROTTLE(1.0, "[%s]: Estimator is in ERROR state", getPrintName().c_str());
    +     482           0 :       bool all_corrections_healthy = true;
    +     483           0 :       for (auto correction : corrections_) {
    +     484           0 :         if (!correction->isHealthy()) {
    +     485           0 :           ROS_ERROR_THROTTLE(1.0, "[%s]: Correction %s is not healthy!", getPrintName().c_str(), correction->getNamespacedName().c_str());
    +     486           0 :           correction->resetProcessors();
    +     487           0 :           all_corrections_healthy = false;
    +     488             :         }
    +     489             :       }
    +     490             :       // initialize the estimator again if corrections become healthy
    +     491           0 :       if (all_corrections_healthy) {
    +     492           0 :         changeState(INITIALIZED_STATE);
    +     493             :       }
    +     494           0 :       break;
    +     495             :     }
    +     496             :   }
    +     497             : 
    +     498           0 :   if (sh_control_input_.newMsg()) {
    +     499           0 :     is_input_ready_ = true;
    +     500             :   }
    +     501             : 
    +     502             :   // check age of input
    +     503           0 :   if (is_input_ready_ && (ros::Time::now() - sh_control_input_.lastMsgTime()).toSec() > 0.1) {  // TODO: parametrize, if older than say 1 second, eland
    +     504           0 :     ROS_WARN_THROTTLE(1.0, "[%s]: input too old (%.4f s), using zero input instead", getPrintName().c_str(),
    +     505             :                       (ros::Time::now() - sh_control_input_.lastMsgTime()).toSec());
    +     506           0 :     is_input_ready_ = false;
    +     507             :   }
    +     508             : 
    +     509           0 :   if (fun_get_hdg_()) {
    +     510           0 :     is_hdg_state_ready_ = true;
    +     511             :   }
    +     512             : }
    +     513             : /*//}*/
    +     514             : 
    +     515             : /*//{ doCorrection() */
    +     516      193370 : void LatGeneric::doCorrection(const Correction<lat_generic::n_measurements>::MeasurementStamped &meas, const double R, const StateId_t &state_id) {
    +     517      193370 :   doCorrection(meas.value, R, state_id, meas.stamp);
    +     518      193373 : }
    +     519             : /*//}*/
    +     520             : 
    +     521             : /*//{ doCorrection() */
    +     522      193302 : void LatGeneric::doCorrection(const z_t &z, const double R, const StateId_t &state_id, const ros::Time &meas_stamp) {
    +     523             : 
    +     524      193302 :   if (!isInitialized()) {
    +     525         163 :     return;
    +     526             :   }
    +     527             : 
    +     528             :   // we do not want to perform corrections until the estimator is initialized
    +     529      193255 :   if (!(isInState(SMStates_t::READY_STATE) || isInState(SMStates_t::RUNNING_STATE) || isInState(SMStates_t::STARTED_STATE))) {
    +     530         161 :     return;
    +     531             :   }
    +     532             : 
    +     533             :   // for position state check the innovation
    +     534      193015 :   if (state_id == POSITION) {
    +     535             :     {
    +     536      182397 :       std::scoped_lock lock(mtx_innovation_);
    +     537             : 
    +     538      182441 :       is_mitigating_jump_ = false;
    +     539      182505 :       innovation_(0)      = z(0) - getState(POSITION, AXIS_X);
    +     540      182410 :       innovation_(1)      = z(1) - getState(POSITION, AXIS_Y);
    +     541             : 
    +     542      182455 :       if (fabs(innovation_(0)) > pos_innovation_limit_ || fabs(innovation_(1)) > pos_innovation_limit_) {
    +     543           0 :         ROS_WARN_THROTTLE(1.0, "[%s]: innovation too large - [%.2f %.2f] lim: %.2f", getPrintName().c_str(), innovation_(0), innovation_(1),
    +     544             :                           pos_innovation_limit_);
    +     545           0 :         innovation_ok_ = false;
    +     546           0 :         switch (exc_innovation_action_) {
    +     547           0 :           case ExcInnoAction_t::ELAND: {
    +     548           0 :             ROS_WARN_THROTTLE(1.0, "[%s]: large innovation should trigger eland in control manager", getPrintName().c_str());
    +     549           0 :             changeState(ERROR_STATE);
    +     550           0 :             break;
    +     551             :           }
    +     552           0 :           case ExcInnoAction_t::SWITCH: {
    +     553           0 :             ROS_WARN_THROTTLE(1.0, "[%s]: innovation should trigger estimator switch but no eland", getPrintName().c_str());
    +     554           0 :             innovation_(0) = 0.0;  // this is quite hacky but is there other way to switch estimators and not trigger eland by the large innovation?
    +     555           0 :             innovation_(1) = 0.0;
    +     556           0 :             changeState(ERROR_STATE);
    +     557           0 :             break;
    +     558             :           }
    +     559           0 :           case ExcInnoAction_t::MITIGATE: {
    +     560           0 :             ROS_WARN_THROTTLE(1.0, "[%s]: large innovation should trigger estimate jump mitigation", getPrintName().c_str());
    +     561           0 :             innovation_(0)      = 0.0;  // this is quite hacky but is there other way to switch estimators and not trigger eland by the large innovation?
    +     562           0 :             innovation_(1)      = 0.0;
    +     563           0 :             is_mitigating_jump_ = true;
    +     564           0 :             setState(z(0), POSITION, AXIS_X);
    +     565           0 :             setState(z(1), POSITION, AXIS_Y);
    +     566           0 :             break;
    +     567             :           }
    +     568           0 :           case ExcInnoAction_t::NONE: {
    +     569           0 :             ROS_WARN_THROTTLE(1.0, "[%s]: large innovation ignored", getPrintName().c_str());
    +     570           0 :             break;
    +     571             :           }
    +     572             :         }
    +     573             :       }
    +     574      182457 :       innovation_ok_ = true;
    +     575             :     }
    +     576             :   }
    +     577             : 
    +     578      193048 :   statecov_t sc = mrs_lib::get_mutexed(mutex_sc_, sc_);
    +     579             :   try {
    +     580             :     // Apply the correction step
    +     581      386219 :     std::scoped_lock lock(mutex_lkf_);
    +     582      193160 :     H_                           = H_t::Zero();
    +     583      193112 :     H_(AXIS_X, state_id * 2)     = 1;
    +     584      193144 :     H_(AXIS_Y, state_id * 2 + 1) = 1;
    +     585      193162 :     lkf_->H                      = H_;
    +     586             : 
    +     587      192840 :     if (is_repredictor_enabled_) {
    +     588             : 
    +     589           0 :       lkf_rep_->addMeasurement(z, R_t::Ones() * R, meas_stamp, models_[state_id]);
    +     590             :     } else {
    +     591      192840 :       sc = lkf_->correct(sc, z, R_t::Ones() * R);
    +     592             :     }
    +     593             :   }
    +     594           0 :   catch (const std::exception &e) {
    +     595             :     // In case of error, alert the user
    +     596           0 :     ROS_ERROR("[%s]: LKF correction failed: %s", getPrintName().c_str(), e.what());
    +     597             :   }
    +     598             : 
    +     599      192977 :   mrs_lib::set_mutexed(mutex_sc_, sc, sc_);
    +     600             : }  // namespace mrs_uav_state_estimators
    +     601             : /*//}*/
    +     602             : 
    +     603             : /*//{ isConverged() */
    +     604          97 : bool LatGeneric::isConverged() {
    +     605             : 
    +     606             :   // TODO: check convergence by rate of change of determinant
    +     607             : 
    +     608          97 :   return true;
    +     609             : }
    +     610             : /*//}*/
    +     611             : 
    +     612             : /*//{ getState() */
    +     613     1472696 : double LatGeneric::getState(const int &state_id_in, const int &axis_in) const {
    +     614     1472696 :   return getState(stateIdToIndex(state_id_in, axis_in));
    +     615             : }
    +     616             : 
    +     617     1472217 : double LatGeneric::getState(const int &state_idx_in) const {
    +     618     1472217 :   return mrs_lib::get_mutexed(mutex_sc_, sc_).x(state_idx_in);
    +     619             : }
    +     620             : /*//}*/
    +     621             : 
    +     622             : /*//{ setState() */
    +     623         326 : void LatGeneric::setState(const double &state_in, const int &state_id_in, const int &axis_in) {
    +     624         326 :   setState(state_in, stateIdToIndex(state_id_in, axis_in));
    +     625         326 : }
    +     626             : 
    +     627         326 : void LatGeneric::setState(const double &state_in, const int &state_idx_in) {
    +     628         326 :   mrs_lib::set_mutexed(mutex_sc_, state_in, sc_.x(state_idx_in));
    +     629         326 : }
    +     630             : /*//}*/
    +     631             : 
    +     632             : /*//{ getStates() */
    +     633      171859 : LatGeneric::states_t LatGeneric::getStates(void) const {
    +     634      343690 :   return mrs_lib::get_mutexed(mutex_sc_, sc_).x;
    +     635             : }
    +     636             : /*//}*/
    +     637             : 
    +     638             : /*//{ setStates() */
    +     639           0 : void LatGeneric::setStates(const states_t &states_in) {
    +     640           0 :   mrs_lib::set_mutexed(mutex_sc_, states_in, sc_.x);
    +     641           0 : }
    +     642             : /*//}*/
    +     643             : 
    +     644             : /*//{ getCovariance() */
    +     645      731064 : double LatGeneric::getCovariance(const int &state_id_in, const int &axis_in) const {
    +     646      731064 :   return getCovariance(stateIdToIndex(state_id_in, axis_in));
    +     647             : }
    +     648             : 
    +     649      730909 : double LatGeneric::getCovariance(const int &state_idx_in) const {
    +     650      730909 :   return mrs_lib::get_mutexed(mutex_sc_, sc_).P(state_idx_in, state_idx_in);
    +     651             : }
    +     652             : /*//}*/
    +     653             : 
    +     654             : /*//{ getCovarianceMatrix() */
    +     655      171855 : LatGeneric::covariance_t LatGeneric::getCovarianceMatrix(void) const {
    +     656      343683 :   return mrs_lib::get_mutexed(mutex_sc_, sc_).P;
    +     657             : }
    +     658             : /*//}*/
    +     659             : 
    +     660             : /*//{ setCovarianceMatrix() */
    +     661           0 : void LatGeneric::setCovarianceMatrix(const covariance_t &cov_in) {
    +     662           0 :   mrs_lib::set_mutexed(mutex_sc_, cov_in, sc_.P);
    +     663           0 : }
    +     664             : /*//}*/
    +     665             : 
    +     666             : /*//{ getInnovation() */
    +     667      365345 : double LatGeneric::getInnovation(const int &state_idx) const {
    +     668      365345 :   return mrs_lib::get_mutexed(mtx_innovation_, innovation_)(state_idx);
    +     669             : }
    +     670             : 
    +     671      365496 : double LatGeneric::getInnovation(const int &state_id_in, const int &axis_in) const {
    +     672      365496 :   return getInnovation(stateIdToIndex(state_id_in, axis_in));
    +     673             : }
    +     674             : /*//}*/
    +     675             : 
    +     676             : /*//{ setDt() */
    +     677      171858 : void LatGeneric::setDt(const double &dt) {
    +     678      171858 :   dt_ = dt;
    +     679      171858 :   generateA();
    +     680      171854 :   generateB();
    +     681      343669 :   std::scoped_lock lock(mutex_lkf_);
    +     682      171834 :   lkf_->A = A_;
    +     683      171850 :   lkf_->B = B_;
    +     684      171801 : }
    +     685             : /*//}*/
    +     686             : 
    +     687             : /*//{ setInputCoeff() */
    +     688         188 : void LatGeneric::setInputCoeff(const double &input_coeff) {
    +     689         188 :   input_coeff_ = input_coeff;
    +     690         188 :   generateA();
    +     691         188 :   generateB();
    +     692         376 :   std::scoped_lock lock(mutex_lkf_);
    +     693         188 :   lkf_->A = A_;
    +     694         188 :   lkf_->B = B_;
    +     695             : 
    +     696         188 :   if (is_repredictor_enabled_) {
    +     697           0 :     models_.clear();
    +     698           0 :     generateRepredictorModels(input_coeff_);
    +     699             :   }
    +     700         188 : }
    +     701             : /*//}*/
    +     702             : 
    +     703             : /*//{ generateRepredictorModels() */
    +     704           0 : void LatGeneric::generateRepredictorModels(const double input_coeff) {
    +     705           0 :     for (int i = 0; (int)(i < lat_generic::n_states / 2); i++) {
    +     706             : 
    +     707           0 :       auto lambda_generateA = [input_coeff](const double dt) {
    +     708           0 :         A_t A;
    +     709             :         // clang-format off
    +     710           0 :         A <<
    +     711           0 :           1, 0, dt, 0, 0.5 * dt * dt, 0,
    +     712           0 :           0, 1, 0, dt, 0, 0.5 * dt * dt,
    +     713           0 :           0, 0, 1, 0, dt, 0,
    +     714           0 :           0, 0, 0, 1, 0, dt,
    +     715           0 :           0, 0, 0, 0, 1-(input_coeff * dt), 0,
    +     716           0 :           0, 0, 0, 0, 0, 1-(input_coeff * dt);
    +     717             :         // clang-format on
    +     718           0 :         return A;
    +     719           0 :       };
    +     720             : 
    +     721           0 :       auto lambda_generateB = [input_coeff]([[maybe_unused]] const double dt) {
    +     722           0 :         B_t B = B.Zero();
    +     723             :         // clang-format off
    +     724           0 :           B <<
    +     725           0 :             0, 0,
    +     726           0 :             0, 0,
    +     727           0 :             0, 0,
    +     728           0 :             0, 0,
    +     729           0 :             input_coeff * dt, 0,
    +     730           0 :             0, input_coeff * dt;
    +     731             :         // clang-format on
    +     732             : 
    +     733           0 :         return B;
    +     734           0 :       };
    +     735             : 
    +     736           0 :       H_t H                = H.Zero();
    +     737           0 :       H(AXIS_X, i * 2)     = 1;
    +     738           0 :       H(AXIS_Y, i * 2 + 1) = 1;
    +     739           0 :       models_.push_back(std::make_shared<varstep_lkf_t>(lambda_generateA, lambda_generateB, H));
    +     740             :     }
    +     741           0 : }
    +     742             : /*//}*/
    +     743             : 
    +     744             : /*//{ generateA() */
    +     745      172144 : void LatGeneric::generateA() {
    +     746             : 
    +     747             :   // clang-format off
    +     748      172144 :     A_ <<
    +     749      172086 :       1, 0, dt_, 0, 0.5 * dt_ * dt_, 0,
    +     750      172132 :       0, 1, 0, dt_, 0, 0.5 * dt_ * dt_,
    +     751      172127 :       0, 0, 1, 0, dt_, 0,
    +     752      172126 :       0, 0, 0, 1, 0, dt_,
    +     753      172135 :       0, 0, 0, 0, 1-(input_coeff_ * dt_), 0,
    +     754      172133 :       0, 0, 0, 0, 0, 1-(input_coeff_ * dt_);
    +     755             :   // clang-format on
    +     756      172125 : }
    +     757             : /*//}*/
    +     758             : 
    +     759             : /*//{ generateB() */
    +     760      172147 : void LatGeneric::generateB() {
    +     761             : 
    +     762             :   // clang-format off
    +     763      172147 :     B_ <<
    +     764      172138 :       0, 0,
    +     765      172083 :       0, 0,
    +     766      172104 :       0, 0,
    +     767      172124 :       0, 0,
    +     768      172122 :       input_coeff_ * dt_, 0,
    +     769      172119 :       0, input_coeff_ * dt_;
    +     770             :   // clang-format on
    +     771      172120 : }
    +     772             : /*//}*/
    +     773             : 
    +     774             : /*//{ callbackReconfigure() */
    +     775          97 : void LatGeneric::callbackReconfigure(LateralEstimatorConfig &config, [[maybe_unused]] uint32_t level) {
    +     776             : 
    +     777          97 :   if (!isInitialized()) {
    +     778          97 :     return;
    +     779             :   }
    +     780             : 
    +     781           0 :   Q_t Q;
    +     782           0 :   Q(stateIdToIndex(POSITION, AXIS_X), stateIdToIndex(POSITION, AXIS_X))         = config.pos;
    +     783           0 :   Q(stateIdToIndex(POSITION, AXIS_Y), stateIdToIndex(POSITION, AXIS_Y))         = config.pos;
    +     784           0 :   Q(stateIdToIndex(VELOCITY, AXIS_X), stateIdToIndex(VELOCITY, AXIS_X))         = config.vel;
    +     785           0 :   Q(stateIdToIndex(VELOCITY, AXIS_Y), stateIdToIndex(VELOCITY, AXIS_Y))         = config.vel;
    +     786           0 :   Q(stateIdToIndex(ACCELERATION, AXIS_X), stateIdToIndex(ACCELERATION, AXIS_X)) = config.acc;
    +     787           0 :   Q(stateIdToIndex(ACCELERATION, AXIS_Y), stateIdToIndex(ACCELERATION, AXIS_Y)) = config.acc;
    +     788           0 :   mrs_lib::set_mutexed(mtx_Q_, Q, Q_);
    +     789             : }
    +     790             : /*//}*/
    +     791             : 
    +     792             : /*//{ getNamespacedName() */
    +     793         586 : std::string LatGeneric::getNamespacedName() const {
    +     794        1172 :   return parent_state_est_name_ + "/" + getName();
    +     795             : }
    +     796             : /*//}*/
    +     797             : 
    +     798             : /*//{ getPrintName() */
    +     799         902 : std::string LatGeneric::getPrintName() const {
    +     800        1804 :   return ch_->nodelet_name + "/" + parent_state_est_name_ + "/" + getName();
    +     801             : }
    +     802             : /*//}*/
    +     803             : };  // namespace mrs_uav_state_estimators
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/lateral/lat_generic.cpp.gcov.overview.html b/mrs_uav_state_estimators/src/estimators/lateral/lat_generic.cpp.gcov.overview.html new file mode 100644 index 0000000000..19d9bca23e --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/lateral/lat_generic.cpp.gcov.overview.html @@ -0,0 +1,221 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/lateral/lat_generic.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_state_estimators/src/estimators/lateral/lat_generic.cpp.gcov.png b/mrs_uav_state_estimators/src/estimators/lateral/lat_generic.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..508d03d81b4e53c31168d589e7b140e4bb5e1fec GIT binary patch literal 3146 zcmV-Q47Kx#P)_F@S;5{wS;5}G*?*N6>jy}HP|j}LK3%VuODPrz5I-ryMTpSeE>6cv(Kgju9By;G-wTKn?T=mzEA279A;Z^cfaW;{*|*Kn zgwguw4-~uOcUl;e9UZg5n!vhF-NtDK%dwopo*C(aFubC70Ggz+XJv#ZA12P>H@a*O z+Tq5ymB3qhWhA2Exi0ci1p}5CFa~fDu-sJ$;KFP<38{>cqMWgq`Jak>T-TR8w)A3O zhjm{~qeB-8<;qHBTS6cZse(~@=3}w^dLj8^m}JozKm4Py1ca?Mu3H6IFBy+% zOb=|*FdqXW8zy?ll4Aj6M|h3|=l}%2u@u&<1MoLIn!y?0>HzE(3L+I?Ai?=KKum%w znlrrXESQ*LJ6fK^oSgtzfU+yY3vNFjlX1dqrTa{Xxt65I0!9J|Ixhes8YN|n5t4xz zGu1P*BnvYEyQ^S+H1AVzrr9_=#`i|>e)-zA=#eOZevjBTWrK)w^sfPs8GUnnKX<3U zU(fSePl`k*k~2)VDMlTMP`sB^bV@&(qwehu$=vz0m}bqmnG33bR8LN;0LBOyxupP> z+!O&_#3($wesmMiS&8vT>lJqy&^XYeHTeM>?pkrAvLVH>B#hQMA~Bm(G3zjU29o`z zX$_l;M~iGq(T5TehW+K!N6QNYHoP=wm3{o4H8YPo`rs*taL?s$K?WBZ-4BO8srj3l zkMY|P&uloN>E)wwspsKoNx9BFX`JMQHUX*UD>JGqM`{z?nLx@3%QCcAF?xF1b2N^3 zAZ~WpF&jZF7Z-_KLLMW}v2Ag!mcp!Lja~YKVHPv0LYu5JHq|-+3C6ealQA~jJOa42 zvJ^dYG)qrgO8pDeS)2B7LITA2Ya(^almH};H^JRjY z9H|#^Oh01J%Ve3?!AQ$`h1r8#l@3_d6BhI@^1wcFxztE5I3K27g-Z&HICZJa(fH^? z!a=fSdw+--(P{AOiDd2(&?1jUrRiYLoY)VXE!{KB2CY%YgMD8433}V2mr`Ul-Zs%A`w; zHqY@GCa08rbSjl1-ey2c2FWC7eu_phtC`~}MQ~N}N(&(GpffES&aX>~F!9R3*3!UO zp>(x8R)9+C)5xD+!*ILpF(eFw--CCa=ocRw(~kV)3Q%&JJ)mVv>QycS!_QwCw6V9M zxN2j6<=q`Qz2Dr}ff$t*g_xZ>(LF)M8l?*&Gj0wZkj4o7T>Ya7*v5y(72wMTxRYR| z1T-xT<)fDc8vpDF&@}98J%lJAci2oZ6H;m1N`2QbMTwZ4o=9{s@n+zoAtUy=?eQ`s zVLaFNm`6!8IQEoBh&?;X@8?FPJ;?>b$3S_>bHW}-8+q(oX?v&Ec zM%mMTa)%anEulfmx^gL}8~fAS@ya@vF*LVgvPZo zsE(3k^yx4p(^R}k5BuU*Z<$k`XL-UGDBUfVFw?Rm75CF~u?a6N;Wy?upHTrrRiY}0sBKRdAZ<=Q5$-S2l zk2AJD8+%N(2w2!Xo}YYI6VGsCkUJOMoNC9A5zsbbV$TclIK_GwY0QZQFuD!9XS69f z^_u%&iN)0>Ng1wsDQH7iiRoat-U1AOSC|wyUap6GJYYS>;+21N{o6cyY;g7wWqN!R0d~2~#%{dIj+E|KH1Pg?xVJh5LCpN+vB1m-ogvImFtqorGWQM!?qzp27Q5OlK`=lnD zKhrSqFLi}nAEABCcOXWm2NJ%J#sxY`Kzri+u-}Z1)qq=j^GbPKz$bKcv6_at2Vy` z_J6r7jT-3V%@6sA>;w@)#T~(#*7i|Q*st2h(~F9XLnte@s7 zS{aWF_#;%Ox;`|gy1q*o?|-ntR{_RQc0r|QZ?E& z)~2VBQ>U-_D;Hl=u^9XsUsA@#T;WCRaP(hgXsNLuVQpnNVa0!ma6KvPDuCPtxJSQ~J}^U46r_rp_< z-g>-jz<Kt#w9+p4WwJxY$eW7UeBAxgWS;YeCRHx}F?ll1BV30fc*$v3ftOWdw z;abe4Fg)S7V2;PI`dqzdd=~X$hYQMp=FwAaw)$ollzhn>(&dEtCY!Kl9)McQU;;c^ zzEnW;GwB-Wu8VYS^=mW6wTQ#_WH2_+ny53M)~}-%!W=A3c!$m{O6Se~qG!QzmwOEGnPcb5 z>#u4S4}{FMQDfes!_MneQTDBZz<6G|?@JI^FCF zE_o?)W3XT!Yc>1<`-tc0Q1Yo^ACo%XLmr!p!xK>}`K+Xi};Ja1MD^C`|h zq=m%jN?J&-yXabL^U$>LVoPzAJoaCY8O|tjbL{xIC_l~zY^4AKpk_-k(5HSBUyH+QZY#7%Ap%{bfU(=)gO zU=NL)h>u40tT=&;FoyikMgWh8n=r0#_ zxEMel7XuiVY~xTD7&F^>z|2Sa$xw^4bk7>teTMX8@eO^Tdz794(Q3!DOOHi-Qc1(a zo-YGtO>SaL5~c#0q{lqs48J92IphwFR5GCF;X(5zPZa@rD`7qN!H-y~G&axOAo?)m zdlt*S-hc4R@NuIZA3+&zL2&8AyZGNrfQvtBA3ix%2NY4&fC4H8V{|T`?5*|$Blw&g zU<7D=nCBh*oQ{-GA#cVeAEHV^jPv^6K85JuBa{xQVi7#y$Kq# k-~y^2L%vD~mXd+{4}ZzB4 + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/state/gps_baro.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/state - gps_baro.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:55100.0 %
    Date:2024-04-18 23:11:36Functions:44100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    (anonymous namespace)::ProxyExec0::ProxyExec0()19
    mrs_uav_state_estimators::gps_baro::GpsBaro::GpsBaro()19
    mrs_uav_state_estimators::gps_baro::GpsBaro::~GpsBaro()19
    mrs_uav_state_estimators::gps_baro::GpsBaro::~GpsBaro().219
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/state/gps_baro.cpp.func.html b/mrs_uav_state_estimators/src/estimators/state/gps_baro.cpp.func.html new file mode 100644 index 0000000000..4bac81a184 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/state/gps_baro.cpp.func.html @@ -0,0 +1,96 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/state/gps_baro.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/state - gps_baro.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:55100.0 %
    Date:2024-04-18 23:11:36Functions:44100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    (anonymous namespace)::ProxyExec0::ProxyExec0()19
    mrs_uav_state_estimators::gps_baro::GpsBaro::GpsBaro()19
    mrs_uav_state_estimators::gps_baro::GpsBaro::~GpsBaro()19
    mrs_uav_state_estimators::gps_baro::GpsBaro::~GpsBaro().219
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/state/gps_baro.cpp.gcov.frameset.html b/mrs_uav_state_estimators/src/estimators/state/gps_baro.cpp.gcov.frameset.html new file mode 100644 index 0000000000..cdfd029a0c --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/state/gps_baro.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/state/gps_baro.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_state_estimators/src/estimators/state/gps_baro.cpp.gcov.html b/mrs_uav_state_estimators/src/estimators/state/gps_baro.cpp.gcov.html new file mode 100644 index 0000000000..06aa4d6551 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/state/gps_baro.cpp.gcov.html @@ -0,0 +1,109 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/state/gps_baro.cpp + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/state - gps_baro.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:55100.0 %
    Date:2024-04-18 23:11:36Functions:44100.0 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #include <mrs_uav_state_estimators/estimators/state/state_generic.h>
    +       2             : 
    +       3             : namespace mrs_uav_state_estimators
    +       4             : {
    +       5             : 
    +       6             : namespace gps_baro
    +       7             : {
    +       8             : 
    +       9             : const char estimator_name[] = "gps_baro";
    +      10             : const bool is_core_plugin = true;
    +      11             : 
    +      12             : class GpsBaro : public StateGeneric {
    +      13             : public:
    +      14          19 :   GpsBaro() : StateGeneric(estimator_name, is_core_plugin) {
    +      15          19 :   }
    +      16             : 
    +      17          38 :   ~GpsBaro(void) {
    +      18          38 :   }
    +      19             : };
    +      20             : 
    +      21             : }  // namespace gps_baro
    +      22             : }  // namespace mrs_uav_state_estimators
    +      23             : 
    +      24             : #include <pluginlib/class_list_macros.h>
    +      25          19 : PLUGINLIB_EXPORT_CLASS(mrs_uav_state_estimators::gps_baro::GpsBaro, mrs_uav_managers::StateEstimator)
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/state/gps_baro.cpp.gcov.overview.html b/mrs_uav_state_estimators/src/estimators/state/gps_baro.cpp.gcov.overview.html new file mode 100644 index 0000000000..2b03dc176f --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/state/gps_baro.cpp.gcov.overview.html @@ -0,0 +1,27 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/state/gps_baro.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_state_estimators/src/estimators/state/gps_baro.cpp.gcov.png b/mrs_uav_state_estimators/src/estimators/state/gps_baro.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..32cb0dad19f40488be4eb0ccd03a6cbd7fc1ac32 GIT binary patch literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^0YEIt!VDxsGPYO&DTx4|5ZC|z|E~gq + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/state/gps_garmin.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/state - gps_garmin.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:55100.0 %
    Date:2024-04-18 23:11:36Functions:44100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    (anonymous namespace)::ProxyExec0::ProxyExec0()74
    mrs_uav_state_estimators::gps_garmin::GpsGarmin::GpsGarmin()74
    mrs_uav_state_estimators::gps_garmin::GpsGarmin::~GpsGarmin()74
    mrs_uav_state_estimators::gps_garmin::GpsGarmin::~GpsGarmin().274
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/state/gps_garmin.cpp.func.html b/mrs_uav_state_estimators/src/estimators/state/gps_garmin.cpp.func.html new file mode 100644 index 0000000000..bb15da9ccb --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/state/gps_garmin.cpp.func.html @@ -0,0 +1,96 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/state/gps_garmin.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/state - gps_garmin.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:55100.0 %
    Date:2024-04-18 23:11:36Functions:44100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    (anonymous namespace)::ProxyExec0::ProxyExec0()74
    mrs_uav_state_estimators::gps_garmin::GpsGarmin::GpsGarmin()74
    mrs_uav_state_estimators::gps_garmin::GpsGarmin::~GpsGarmin()74
    mrs_uav_state_estimators::gps_garmin::GpsGarmin::~GpsGarmin().274
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/state/gps_garmin.cpp.gcov.frameset.html b/mrs_uav_state_estimators/src/estimators/state/gps_garmin.cpp.gcov.frameset.html new file mode 100644 index 0000000000..716d11d216 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/state/gps_garmin.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/state/gps_garmin.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_state_estimators/src/estimators/state/gps_garmin.cpp.gcov.html b/mrs_uav_state_estimators/src/estimators/state/gps_garmin.cpp.gcov.html new file mode 100644 index 0000000000..085980309a --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/state/gps_garmin.cpp.gcov.html @@ -0,0 +1,109 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/state/gps_garmin.cpp + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/state - gps_garmin.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:55100.0 %
    Date:2024-04-18 23:11:36Functions:44100.0 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #include <mrs_uav_state_estimators/estimators/state/state_generic.h>
    +       2             : 
    +       3             : namespace mrs_uav_state_estimators
    +       4             : {
    +       5             : 
    +       6             : namespace gps_garmin
    +       7             : {
    +       8             : 
    +       9             : const char estimator_name[] = "gps_garmin";
    +      10             : const bool is_core_plugin = true;
    +      11             : 
    +      12             : class GpsGarmin : public StateGeneric {
    +      13             : public:
    +      14          74 :   GpsGarmin() : StateGeneric(estimator_name, is_core_plugin) {
    +      15          74 :   }
    +      16             : 
    +      17         148 :   ~GpsGarmin(void) {
    +      18         148 :   }
    +      19             : };
    +      20             : 
    +      21             : }  // namespace gps_garmin
    +      22             : }  // namespace mrs_uav_state_estimators
    +      23             : 
    +      24             : #include <pluginlib/class_list_macros.h>
    +      25          74 : PLUGINLIB_EXPORT_CLASS(mrs_uav_state_estimators::gps_garmin::GpsGarmin, mrs_uav_managers::StateEstimator)
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/state/gps_garmin.cpp.gcov.overview.html b/mrs_uav_state_estimators/src/estimators/state/gps_garmin.cpp.gcov.overview.html new file mode 100644 index 0000000000..88be0074b4 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/state/gps_garmin.cpp.gcov.overview.html @@ -0,0 +1,27 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/state/gps_garmin.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_state_estimators/src/estimators/state/gps_garmin.cpp.gcov.png b/mrs_uav_state_estimators/src/estimators/state/gps_garmin.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..606fb073ca70818dc0b3b5dba84fd6a7044d0512 GIT binary patch literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^0YEIt!VDxsGPYO&DTx4|5ZC|z|E~gq^JNDtZ&EXPgU2N!e?RY*!@G!k?Ta()7BTAKis#>5!bv}um4PI*Z02~7mGQc zuCNw3Xkx0Ko_*uhD$z@81X?onZt12fEV|g{c9?_v+hwVbPc627Ikr{%)|^j!tT$gZ WJ^4%e>pP$W7(8A5T-G@yGywov30pG& literal 0 HcmV?d00001 diff --git a/mrs_uav_state_estimators/src/estimators/state/index-detail-sort-f.html b/mrs_uav_state_estimators/src/estimators/state/index-detail-sort-f.html new file mode 100644 index 0000000000..062eacc110 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/state/index-detail-sort-f.html @@ -0,0 +1,200 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/state + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/stateHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:31144070.7 %
    Date:2024-04-18 23:11:36Functions:283775.7 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    passthrough.cpp +
    76.4%76.4%
    +
    76.4 %97 / 12755.6 %5 / 9
    <unnamed>76.4 %97 / 12755.6 %5 / 9
    state_generic.cpp +
    66.2%66.2%
    +
    66.2 %194 / 29358.3 %7 / 12
    <unnamed>66.2 %194 / 29358.3 %7 / 12
    gps_garmin.cpp +
    100.0%
    +
    100.0 %5 / 5100.0 %4 / 4
    <unnamed>100.0 %5 / 5100.0 %4 / 4
    rtk.cpp +
    100.0%
    +
    100.0 %5 / 5100.0 %4 / 4
    <unnamed>100.0 %5 / 5100.0 %4 / 4
    gps_baro.cpp +
    100.0%
    +
    100.0 %5 / 5100.0 %4 / 4
    <unnamed>100.0 %5 / 5100.0 %4 / 4
    rtk_garmin.cpp +
    100.0%
    +
    100.0 %5 / 5100.0 %4 / 4
    <unnamed>100.0 %5 / 5100.0 %4 / 4
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/state/index-detail-sort-l.html b/mrs_uav_state_estimators/src/estimators/state/index-detail-sort-l.html new file mode 100644 index 0000000000..186abfdd84 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/state/index-detail-sort-l.html @@ -0,0 +1,200 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/state + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/stateHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:31144070.7 %
    Date:2024-04-18 23:11:36Functions:283775.7 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    state_generic.cpp +
    66.2%66.2%
    +
    66.2 %194 / 29358.3 %7 / 12
    <unnamed>66.2 %194 / 29358.3 %7 / 12
    passthrough.cpp +
    76.4%76.4%
    +
    76.4 %97 / 12755.6 %5 / 9
    <unnamed>76.4 %97 / 12755.6 %5 / 9
    gps_garmin.cpp +
    100.0%
    +
    100.0 %5 / 5100.0 %4 / 4
    <unnamed>100.0 %5 / 5100.0 %4 / 4
    rtk.cpp +
    100.0%
    +
    100.0 %5 / 5100.0 %4 / 4
    <unnamed>100.0 %5 / 5100.0 %4 / 4
    gps_baro.cpp +
    100.0%
    +
    100.0 %5 / 5100.0 %4 / 4
    <unnamed>100.0 %5 / 5100.0 %4 / 4
    rtk_garmin.cpp +
    100.0%
    +
    100.0 %5 / 5100.0 %4 / 4
    <unnamed>100.0 %5 / 5100.0 %4 / 4
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/state/index-detail.html b/mrs_uav_state_estimators/src/estimators/state/index-detail.html new file mode 100644 index 0000000000..ad8d3a572d --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/state/index-detail.html @@ -0,0 +1,200 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/state + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/stateHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:31144070.7 %
    Date:2024-04-18 23:11:36Functions:283775.7 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    gps_baro.cpp +
    100.0%
    +
    100.0 %5 / 5100.0 %4 / 4
    <unnamed>100.0 %5 / 5100.0 %4 / 4
    gps_garmin.cpp +
    100.0%
    +
    100.0 %5 / 5100.0 %4 / 4
    <unnamed>100.0 %5 / 5100.0 %4 / 4
    passthrough.cpp +
    76.4%76.4%
    +
    76.4 %97 / 12755.6 %5 / 9
    <unnamed>76.4 %97 / 12755.6 %5 / 9
    rtk.cpp +
    100.0%
    +
    100.0 %5 / 5100.0 %4 / 4
    <unnamed>100.0 %5 / 5100.0 %4 / 4
    rtk_garmin.cpp +
    100.0%
    +
    100.0 %5 / 5100.0 %4 / 4
    <unnamed>100.0 %5 / 5100.0 %4 / 4
    state_generic.cpp +
    66.2%66.2%
    +
    66.2 %194 / 29358.3 %7 / 12
    <unnamed>66.2 %194 / 29358.3 %7 / 12
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/state/index-sort-f.html b/mrs_uav_state_estimators/src/estimators/state/index-sort-f.html new file mode 100644 index 0000000000..9309893a4d --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/state/index-sort-f.html @@ -0,0 +1,152 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/state + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/stateHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:31144070.7 %
    Date:2024-04-18 23:11:36Functions:283775.7 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    passthrough.cpp +
    76.4%76.4%
    +
    76.4 %97 / 12755.6 %5 / 9
    state_generic.cpp +
    66.2%66.2%
    +
    66.2 %194 / 29358.3 %7 / 12
    gps_garmin.cpp +
    100.0%
    +
    100.0 %5 / 5100.0 %4 / 4
    rtk.cpp +
    100.0%
    +
    100.0 %5 / 5100.0 %4 / 4
    gps_baro.cpp +
    100.0%
    +
    100.0 %5 / 5100.0 %4 / 4
    rtk_garmin.cpp +
    100.0%
    +
    100.0 %5 / 5100.0 %4 / 4
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/state/index-sort-l.html b/mrs_uav_state_estimators/src/estimators/state/index-sort-l.html new file mode 100644 index 0000000000..76055ab387 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/state/index-sort-l.html @@ -0,0 +1,152 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/state + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/stateHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:31144070.7 %
    Date:2024-04-18 23:11:36Functions:283775.7 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    state_generic.cpp +
    66.2%66.2%
    +
    66.2 %194 / 29358.3 %7 / 12
    passthrough.cpp +
    76.4%76.4%
    +
    76.4 %97 / 12755.6 %5 / 9
    gps_garmin.cpp +
    100.0%
    +
    100.0 %5 / 5100.0 %4 / 4
    rtk.cpp +
    100.0%
    +
    100.0 %5 / 5100.0 %4 / 4
    gps_baro.cpp +
    100.0%
    +
    100.0 %5 / 5100.0 %4 / 4
    rtk_garmin.cpp +
    100.0%
    +
    100.0 %5 / 5100.0 %4 / 4
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/state/index.html b/mrs_uav_state_estimators/src/estimators/state/index.html new file mode 100644 index 0000000000..ffb68c6dbc --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/state/index.html @@ -0,0 +1,152 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/state + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/stateHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:31144070.7 %
    Date:2024-04-18 23:11:36Functions:283775.7 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    gps_baro.cpp +
    100.0%
    +
    100.0 %5 / 5100.0 %4 / 4
    gps_garmin.cpp +
    100.0%
    +
    100.0 %5 / 5100.0 %4 / 4
    passthrough.cpp +
    76.4%76.4%
    +
    76.4 %97 / 12755.6 %5 / 9
    rtk.cpp +
    100.0%
    +
    100.0 %5 / 5100.0 %4 / 4
    rtk_garmin.cpp +
    100.0%
    +
    100.0 %5 / 5100.0 %4 / 4
    state_generic.cpp +
    66.2%66.2%
    +
    66.2 %194 / 29358.3 %7 / 12
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/state/passthrough.cpp.func-sort-c.html b/mrs_uav_state_estimators/src/estimators/state/passthrough.cpp.func-sort-c.html new file mode 100644 index 0000000000..b3819bcf3a --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/state/passthrough.cpp.func-sort-c.html @@ -0,0 +1,116 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/state/passthrough.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/state - passthrough.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:9712776.4 %
    Date:2024-04-18 23:11:36Functions:5955.6 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::passthrough::Passthrough::isConverged()0
    mrs_uav_state_estimators::passthrough::Passthrough::setUavState(mrs_msgs::UavState_<std::allocator<void> > const&)0
    mrs_uav_state_estimators::passthrough::Passthrough::pause()0
    mrs_uav_state_estimators::passthrough::Passthrough::reset()0
    (anonymous namespace)::ProxyExec0::ProxyExec0()1
    mrs_uav_state_estimators::passthrough::Passthrough::initialize(ros::NodeHandle&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)1
    mrs_uav_state_estimators::passthrough::Passthrough::start()1
    mrs_uav_state_estimators::passthrough::Passthrough::timerUpdate(ros::TimerEvent const&)1049
    mrs_uav_state_estimators::passthrough::Passthrough::timerCheckHealth(ros::TimerEvent const&)1067
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/state/passthrough.cpp.func.html b/mrs_uav_state_estimators/src/estimators/state/passthrough.cpp.func.html new file mode 100644 index 0000000000..d4ef3804f2 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/state/passthrough.cpp.func.html @@ -0,0 +1,116 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/state/passthrough.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/state - passthrough.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:9712776.4 %
    Date:2024-04-18 23:11:36Functions:5955.6 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    (anonymous namespace)::ProxyExec0::ProxyExec0()1
    mrs_uav_state_estimators::passthrough::Passthrough::initialize(ros::NodeHandle&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)1
    mrs_uav_state_estimators::passthrough::Passthrough::isConverged()0
    mrs_uav_state_estimators::passthrough::Passthrough::setUavState(mrs_msgs::UavState_<std::allocator<void> > const&)0
    mrs_uav_state_estimators::passthrough::Passthrough::timerUpdate(ros::TimerEvent const&)1049
    mrs_uav_state_estimators::passthrough::Passthrough::timerCheckHealth(ros::TimerEvent const&)1067
    mrs_uav_state_estimators::passthrough::Passthrough::pause()0
    mrs_uav_state_estimators::passthrough::Passthrough::reset()0
    mrs_uav_state_estimators::passthrough::Passthrough::start()1
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/state/passthrough.cpp.gcov.frameset.html b/mrs_uav_state_estimators/src/estimators/state/passthrough.cpp.gcov.frameset.html new file mode 100644 index 0000000000..cf08741b5f --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/state/passthrough.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/state/passthrough.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_state_estimators/src/estimators/state/passthrough.cpp.gcov.html b/mrs_uav_state_estimators/src/estimators/state/passthrough.cpp.gcov.html new file mode 100644 index 0000000000..b8a8b1ee07 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/state/passthrough.cpp.gcov.html @@ -0,0 +1,343 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/state/passthrough.cpp + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/state - passthrough.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:9712776.4 %
    Date:2024-04-18 23:11:36Functions:5955.6 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : /* includes //{ */
    +       2             : 
    +       3             : #include <mrs_uav_state_estimators/estimators/state/passthrough.h>
    +       4             : 
    +       5             : //}
    +       6             : 
    +       7             : namespace mrs_uav_state_estimators
    +       8             : {
    +       9             : 
    +      10             : namespace passthrough
    +      11             : {
    +      12             : 
    +      13             : /* initialize() //{*/
    +      14           1 : void Passthrough::initialize(ros::NodeHandle &nh, const std::shared_ptr<CommonHandlers_t> &ch, const std::shared_ptr<PrivateHandlers_t> &ph) {
    +      15             : 
    +      16           1 :   ch_ = ch;
    +      17           1 :   ph_ = ph;
    +      18             : 
    +      19           1 :   ns_frame_id_ = ch_->uav_name + "/" + frame_id_;
    +      20             : 
    +      21             :   // | --------------- param loader initialization -------------- |
    +      22             : 
    +      23           1 :   if (is_core_plugin_) {
    +      24             : 
    +      25           1 :     ph->param_loader->addYamlFile(ros::package::getPath(package_name_) + "/config/private/" + getName() + "/" + getName() + ".yaml");
    +      26           1 :     ph->param_loader->addYamlFile(ros::package::getPath(package_name_) + "/config/public/" + getName() + "/" + getName() + ".yaml");
    +      27             :   }
    +      28             : 
    +      29           1 :   ph->param_loader->setPrefix(ch_->package_name + "/" + Support::toSnakeCase(ch_->nodelet_name) + "/" + getName() + "/");
    +      30             : 
    +      31             :   // | --------------------- load parameters -------------------- |
    +      32           1 :   ph->param_loader->loadParam("max_flight_z", max_flight_z_);
    +      33           1 :   ph->param_loader->loadParam("message/topic", msg_topic_);
    +      34           1 :   msg_topic_ = "/" + ch_->uav_name + "/" + msg_topic_;
    +      35             : 
    +      36             :   // | ------------------ timers initialization ----------------- |
    +      37           1 :   timer_update_       = nh.createTimer(ros::Rate(ch_->desired_uav_state_rate), &Passthrough::timerUpdate, this, false, false);  // not running after init
    +      38           1 :   timer_check_health_ = nh.createTimer(ros::Rate(ch_->desired_uav_state_rate), &Passthrough::timerCheckHealth, this);
    +      39             : 
    +      40             :   // | --------------- subscribers initialization --------------- |
    +      41           2 :   mrs_lib::SubscribeHandlerOptions shopts;
    +      42           1 :   shopts.nh                 = nh;
    +      43           1 :   shopts.node_name          = getPrintName();
    +      44           1 :   shopts.no_message_timeout = mrs_lib::no_timeout;
    +      45           1 :   shopts.threadsafe         = true;
    +      46           1 :   shopts.autostart          = true;
    +      47           1 :   shopts.queue_size         = 10;
    +      48           1 :   shopts.transport_hints    = ros::TransportHints().tcpNoDelay();
    +      49             : 
    +      50           1 :   sh_passthrough_odom_ = mrs_lib::SubscribeHandler<nav_msgs::Odometry>(shopts, msg_topic_);
    +      51             : 
    +      52             :   // | ---------------- publishers initialization --------------- |
    +      53           1 :   ph_odom_ = mrs_lib::PublisherHandler<nav_msgs::Odometry>(nh, Support::toSnakeCase(getName()) + "/odom", 10);  // needed for tf
    +      54           1 :   if (ch_->debug_topics.state) {
    +      55           1 :     ph_uav_state_ = mrs_lib::PublisherHandler<mrs_msgs::UavState>(nh, Support::toSnakeCase(getName()) + "/uav_state", 10);
    +      56             :   }
    +      57           1 :   if (ch_->debug_topics.covariance) {
    +      58           0 :     ph_pose_covariance_  = mrs_lib::PublisherHandler<mrs_msgs::Float64ArrayStamped>(nh, Support::toSnakeCase(getName()) + "/pose_covariance", 10);
    +      59           0 :     ph_twist_covariance_ = mrs_lib::PublisherHandler<mrs_msgs::Float64ArrayStamped>(nh, Support::toSnakeCase(getName()) + "/twist_covariance", 10);
    +      60             :   }
    +      61           1 :   if (ch_->debug_topics.innovation) {
    +      62           0 :     ph_innovation_ = mrs_lib::PublisherHandler<nav_msgs::Odometry>(nh, Support::toSnakeCase(getName()) + "/innovation", 10);
    +      63             :   }
    +      64           1 :   if (ch_->debug_topics.diag) {
    +      65           0 :     ph_diagnostics_ = mrs_lib::PublisherHandler<mrs_msgs::EstimatorDiagnostics>(nh, Support::toSnakeCase(getName()) + "/diagnostics", 10);
    +      66             :   }
    +      67             : 
    +      68             :   // | ------------------ initialize published messages ------------------ |
    +      69           1 :   uav_state_init_.header.frame_id = ns_frame_id_;
    +      70           1 :   uav_state_init_.child_frame_id  = ch_->frames.ns_fcu;
    +      71             : 
    +      72           1 :   uav_state_init_.estimator_horizontal = est_lat_name_;
    +      73           1 :   uav_state_init_.estimator_vertical   = est_alt_name_;
    +      74           1 :   uav_state_init_.estimator_heading    = est_hdg_name_;
    +      75             : 
    +      76           1 :   innovation_init_.header.frame_id         = ns_frame_id_;
    +      77           1 :   innovation_init_.child_frame_id          = ch_->frames.ns_fcu;
    +      78           1 :   innovation_init_.pose.pose.orientation.w = 1.0;
    +      79             : 
    +      80             :   // | ------------------ finish initialization ----------------- |
    +      81             : 
    +      82           1 :   if (changeState(INITIALIZED_STATE)) {
    +      83           1 :     ROS_INFO("[%s]: Estimator initialized", getPrintName().c_str());
    +      84             :   } else {
    +      85           0 :     ROS_INFO("[%s]: Estimator could not be initialized", getPrintName().c_str());
    +      86             :   }
    +      87           1 : }
    +      88             : /*//}*/
    +      89             : 
    +      90             : /*//{ start() */
    +      91           1 : bool Passthrough::start(void) {
    +      92             : 
    +      93             : 
    +      94           1 :   if (isInState(READY_STATE)) {
    +      95             : 
    +      96           1 :     timer_update_.start();
    +      97           1 :     changeState(STARTED_STATE);
    +      98           1 :     return true;
    +      99             : 
    +     100             :   } else {
    +     101           0 :     ROS_WARN("[%s]: Estimator must be in READY_STATE to start it", getPrintName().c_str());
    +     102           0 :     ros::Duration(1.0).sleep();
    +     103             :   }
    +     104           0 :   return false;
    +     105             : 
    +     106             :   ROS_ERROR("[%s]: Failed to start", getPrintName().c_str());
    +     107             :   return false;
    +     108             : }
    +     109             : /*//}*/
    +     110             : 
    +     111             : /*//{ pause() */
    +     112           0 : bool Passthrough::pause(void) {
    +     113             : 
    +     114           0 :   if (isInState(RUNNING_STATE)) {
    +     115           0 :     changeState(STOPPED_STATE);
    +     116           0 :     return true;
    +     117             :   }
    +     118           0 :   return false;
    +     119             : }
    +     120             : /*//}*/
    +     121             : 
    +     122             : /*//{ reset() */
    +     123           0 : bool Passthrough::reset(void) {
    +     124             : 
    +     125           0 :   if (!isInitialized()) {
    +     126           0 :     ROS_ERROR("[%s]: Cannot reset uninitialized estimator", getPrintName().c_str());
    +     127           0 :     return false;
    +     128             :   }
    +     129             : 
    +     130           0 :   changeState(STOPPED_STATE);
    +     131             : 
    +     132           0 :   ROS_INFO("[%s]: Estimator reset", getPrintName().c_str());
    +     133             : 
    +     134           0 :   return true;
    +     135             : }
    +     136             : /*//}*/
    +     137             : 
    +     138             : /* timerUpdate() //{*/
    +     139        1049 : void Passthrough::timerUpdate([[maybe_unused]] const ros::TimerEvent &event) {
    +     140             : 
    +     141             : 
    +     142        1049 :   if (!isInitialized()) {
    +     143           0 :     return;
    +     144             :   }
    +     145             : 
    +     146        1049 :   const ros::Time time_now = ros::Time::now();
    +     147             : 
    +     148        2098 :   nav_msgs::OdometryConstPtr msg = sh_passthrough_odom_.getMsg();
    +     149             : 
    +     150        1049 :   if (first_iter_) {
    +     151           1 :     prev_msg_   = msg;
    +     152           1 :     first_iter_ = false;
    +     153             :   }
    +     154             : 
    +     155        2098 :   mrs_msgs::UavState uav_state = uav_state_init_;
    +     156             : 
    +     157        1049 :   uav_state.header.stamp = time_now;
    +     158             : 
    +     159        1049 :   uav_state.pose.position    = msg->pose.pose.position;
    +     160        1049 :   uav_state.pose.orientation = msg->pose.pose.orientation;
    +     161             : 
    +     162        1049 :   uav_state.velocity.linear  = Support::rotateVector(msg->twist.twist.linear, msg->pose.pose.orientation);
    +     163        1049 :   uav_state.velocity.angular = msg->twist.twist.angular;
    +     164             : 
    +     165        2098 :   const nav_msgs::Odometry odom = Support::uavStateToOdom(uav_state);
    +     166             : 
    +     167        2098 :   nav_msgs::Odometry innovation = innovation_init_;
    +     168        1049 :   innovation.header.stamp       = time_now;
    +     169             : 
    +     170        1049 :   innovation.pose.pose.position.x = prev_msg_->pose.pose.position.x - msg->pose.pose.position.x;
    +     171        1049 :   innovation.pose.pose.position.y = prev_msg_->pose.pose.position.y - msg->pose.pose.position.y;
    +     172        1049 :   innovation.pose.pose.position.z = prev_msg_->pose.pose.position.z - msg->pose.pose.position.z;
    +     173             : 
    +     174        2098 :   mrs_msgs::Float64ArrayStamped pose_covariance, twist_covariance;
    +     175        1049 :   pose_covariance.header.stamp  = time_now;
    +     176        1049 :   twist_covariance.header.stamp = time_now;
    +     177             : 
    +     178        1049 :   const int n_states = 6;  // TODO this should be defined somewhere else
    +     179        1049 :   pose_covariance.values.resize(n_states * n_states);
    +     180        1049 :   pose_covariance.values.at(n_states * AXIS_X + AXIS_X) = 1e-10;
    +     181        1049 :   pose_covariance.values.at(n_states * AXIS_Y + AXIS_Y) = 1e-10;
    +     182        1049 :   pose_covariance.values.at(n_states * AXIS_Z + AXIS_Z) = 1e-10;
    +     183             : 
    +     184        1049 :   twist_covariance.values.resize(n_states * n_states);
    +     185        1049 :   twist_covariance.values.at(n_states * AXIS_X + AXIS_X) = 1e-10;
    +     186        1049 :   twist_covariance.values.at(n_states * AXIS_Y + AXIS_Y) = 1e-10;
    +     187        1049 :   twist_covariance.values.at(n_states * AXIS_Z + AXIS_Z) = 1e-10;
    +     188             : 
    +     189        1049 :   mrs_lib::set_mutexed(mtx_uav_state_, uav_state, uav_state_);
    +     190        1049 :   mrs_lib::set_mutexed(mtx_odom_, odom, odom_);
    +     191        1049 :   mrs_lib::set_mutexed(mtx_innovation_, innovation, innovation_);
    +     192        1049 :   mrs_lib::set_mutexed(mtx_covariance_, pose_covariance, pose_covariance_);
    +     193        1049 :   mrs_lib::set_mutexed(mtx_covariance_, twist_covariance, twist_covariance_);
    +     194             : 
    +     195        1049 :   publishUavState();
    +     196        1049 :   publishOdom();
    +     197        1049 :   publishCovariance();
    +     198        1049 :   publishInnovation();
    +     199        1049 :   publishDiagnostics();
    +     200             : 
    +     201        1049 :   prev_msg_ = msg;
    +     202             : }
    +     203             : /*//}*/
    +     204             : 
    +     205             : /*//{ timerCheckHealth() */
    +     206        1067 : void Passthrough::timerCheckHealth([[maybe_unused]] const ros::TimerEvent &event) {
    +     207             : 
    +     208        1067 :   if (!isInitialized()) {
    +     209           0 :     return;
    +     210             :   }
    +     211             : 
    +     212        1067 :   if (isInState(INITIALIZED_STATE)) {
    +     213             : 
    +     214          18 :     if (sh_passthrough_odom_.hasMsg()) {
    +     215           1 :       changeState(READY_STATE);
    +     216           1 :       ROS_INFO_THROTTLE(1.0, "[%s]: Estimator is ready to start", getPrintName().c_str());
    +     217             :     } else {
    +     218          17 :       ROS_INFO_THROTTLE(1.0, "[%s]: %s msg on topic %s", getPrintName().c_str(), Support::waiting_for_string.c_str(), sh_passthrough_odom_.topicName().c_str());
    +     219          17 :       return;
    +     220             :     }
    +     221             :   }
    +     222             : 
    +     223             : 
    +     224        1050 :   if (isInState(STARTED_STATE)) {
    +     225             : 
    +     226           1 :     changeState(RUNNING_STATE);
    +     227             :   }
    +     228             : }
    +     229             : /*//}*/
    +     230             : 
    +     231             : /*//{ isConverged() */
    +     232           0 : bool Passthrough::isConverged() {
    +     233             : 
    +     234             :   // TODO: check convergence by rate of change of determinant
    +     235             :   // most likely not used in top-level estimator
    +     236             : 
    +     237           0 :   return true;
    +     238             : }
    +     239             : /*//}*/
    +     240             : 
    +     241             : /*//{ setUavState() */
    +     242           0 : bool Passthrough::setUavState([[maybe_unused]] const mrs_msgs::UavState &uav_state) {
    +     243             : 
    +     244           0 :   if (!isInState(STOPPED_STATE)) {
    +     245           0 :     ROS_WARN("[%s]: Estimator state can be set only in the STOPPED state", getPrintName().c_str());
    +     246           0 :     return false;
    +     247             :   }
    +     248             : 
    +     249           0 :   ROS_WARN("[%s]: Setting the state of this estimator is not implemented.", getPrintName().c_str());
    +     250           0 :   return false;
    +     251             : }
    +     252             : /*//}*/
    +     253             : 
    +     254             : }  // namespace passthrough
    +     255             : 
    +     256             : }  // namespace mrs_uav_state_estimators
    +     257             : 
    +     258             : #include <pluginlib/class_list_macros.h>
    +     259           1 : PLUGINLIB_EXPORT_CLASS(mrs_uav_state_estimators::passthrough::Passthrough, mrs_uav_managers::StateEstimator)
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/state/passthrough.cpp.gcov.overview.html b/mrs_uav_state_estimators/src/estimators/state/passthrough.cpp.gcov.overview.html new file mode 100644 index 0000000000..5a663b9a3d --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/state/passthrough.cpp.gcov.overview.html @@ -0,0 +1,85 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/state/passthrough.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_state_estimators/src/estimators/state/passthrough.cpp.gcov.png b/mrs_uav_state_estimators/src/estimators/state/passthrough.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..a57b3d1729bc3cdac5e4ae2ad4e24468373c0602 GIT binary patch literal 1099 zcmV-R1ho5!P)CR&-|8ai1Q<*+6d4na1&0Mk zrYzb^4VF?m$^_?ucXr{IX=DbBSx|OS#%OII(-i59jDZGlK*u>+0!@d@)G^qPw`1vA z5I8zu8oC^q8cqViaU^8tqMJbA8e^E|!GRmdB+OBks`;Z>FYQ>7@56w1Mg`no%WEq{K{?J={g%RO<`JEIPElp`a-e>NZIyFAu`fr1cTx;zevpp>H-w=Hez0H1or28Hphso^eiqdNx~U5^`VZgEm@}w4@WW}Lj9fl` zQh^>fSSI5s)`=AI-C#5(vSv*jj^M8h#8fwzUQBX)Ehq= z&a44HYI+|ysN>BqtwJfV;+~R5PyGnKID!Os`AF$kci}8L-2Nn&UjS;DQ8lVZUjRF- z&d7zg1vD^YxKZLm-~(f9TvTjOp5YdgLT@GLD!yc0P002ovPDHLkV1lbW1y=w7 literal 0 HcmV?d00001 diff --git a/mrs_uav_state_estimators/src/estimators/state/rtk.cpp.func-sort-c.html b/mrs_uav_state_estimators/src/estimators/state/rtk.cpp.func-sort-c.html new file mode 100644 index 0000000000..56fa0851d0 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/state/rtk.cpp.func-sort-c.html @@ -0,0 +1,96 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/state/rtk.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/state - rtk.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:55100.0 %
    Date:2024-04-18 23:11:36Functions:44100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    (anonymous namespace)::ProxyExec0::ProxyExec0()2
    mrs_uav_state_estimators::rtk::Rtk::Rtk()2
    mrs_uav_state_estimators::rtk::Rtk::~Rtk()2
    mrs_uav_state_estimators::rtk::Rtk::~Rtk().22
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/state/rtk.cpp.func.html b/mrs_uav_state_estimators/src/estimators/state/rtk.cpp.func.html new file mode 100644 index 0000000000..e9936b8083 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/state/rtk.cpp.func.html @@ -0,0 +1,96 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/state/rtk.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/state - rtk.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:55100.0 %
    Date:2024-04-18 23:11:36Functions:44100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    (anonymous namespace)::ProxyExec0::ProxyExec0()2
    mrs_uav_state_estimators::rtk::Rtk::Rtk()2
    mrs_uav_state_estimators::rtk::Rtk::~Rtk()2
    mrs_uav_state_estimators::rtk::Rtk::~Rtk().22
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/state/rtk.cpp.gcov.frameset.html b/mrs_uav_state_estimators/src/estimators/state/rtk.cpp.gcov.frameset.html new file mode 100644 index 0000000000..5de9a9f3df --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/state/rtk.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/state/rtk.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_state_estimators/src/estimators/state/rtk.cpp.gcov.html b/mrs_uav_state_estimators/src/estimators/state/rtk.cpp.gcov.html new file mode 100644 index 0000000000..d5a1447d7e --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/state/rtk.cpp.gcov.html @@ -0,0 +1,109 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/state/rtk.cpp + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/state - rtk.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:55100.0 %
    Date:2024-04-18 23:11:36Functions:44100.0 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #include <mrs_uav_state_estimators/estimators/state/state_generic.h>
    +       2             : 
    +       3             : namespace mrs_uav_state_estimators
    +       4             : {
    +       5             : 
    +       6             : namespace rtk
    +       7             : {
    +       8             : 
    +       9             : const char estimator_name[] = "rtk";
    +      10             : const bool is_core_plugin = true;
    +      11             : 
    +      12             : class Rtk : public StateGeneric {
    +      13             : public:
    +      14           2 :   Rtk() : StateGeneric(estimator_name, is_core_plugin) {
    +      15           2 :   }
    +      16             : 
    +      17           4 :   ~Rtk(void) {
    +      18           4 :   }
    +      19             : };
    +      20             : 
    +      21             : }  // namespace rtk
    +      22             : }  // namespace mrs_uav_state_estimators
    +      23             : 
    +      24             : #include <pluginlib/class_list_macros.h>
    +      25           2 : PLUGINLIB_EXPORT_CLASS(mrs_uav_state_estimators::rtk::Rtk, mrs_uav_managers::StateEstimator)
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/state/rtk.cpp.gcov.overview.html b/mrs_uav_state_estimators/src/estimators/state/rtk.cpp.gcov.overview.html new file mode 100644 index 0000000000..6e78d250c4 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/state/rtk.cpp.gcov.overview.html @@ -0,0 +1,27 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/state/rtk.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_state_estimators/src/estimators/state/rtk.cpp.gcov.png b/mrs_uav_state_estimators/src/estimators/state/rtk.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..a73b427303050221946009b0afa810dd7c98d9b4 GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^0YEIt!VDxsGPYO&DTx4|5ZC|z|E~gqp;PJr literal 0 HcmV?d00001 diff --git a/mrs_uav_state_estimators/src/estimators/state/rtk_garmin.cpp.func-sort-c.html b/mrs_uav_state_estimators/src/estimators/state/rtk_garmin.cpp.func-sort-c.html new file mode 100644 index 0000000000..0d8ee0ca59 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/state/rtk_garmin.cpp.func-sort-c.html @@ -0,0 +1,96 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/state/rtk_garmin.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/state - rtk_garmin.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:55100.0 %
    Date:2024-04-18 23:11:36Functions:44100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    (anonymous namespace)::ProxyExec0::ProxyExec0()2
    mrs_uav_state_estimators::rtk_garmin::RtkGarmin::RtkGarmin()2
    mrs_uav_state_estimators::rtk_garmin::RtkGarmin::~RtkGarmin()2
    mrs_uav_state_estimators::rtk_garmin::RtkGarmin::~RtkGarmin().22
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/state/rtk_garmin.cpp.func.html b/mrs_uav_state_estimators/src/estimators/state/rtk_garmin.cpp.func.html new file mode 100644 index 0000000000..504d17002b --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/state/rtk_garmin.cpp.func.html @@ -0,0 +1,96 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/state/rtk_garmin.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/state - rtk_garmin.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:55100.0 %
    Date:2024-04-18 23:11:36Functions:44100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    (anonymous namespace)::ProxyExec0::ProxyExec0()2
    mrs_uav_state_estimators::rtk_garmin::RtkGarmin::RtkGarmin()2
    mrs_uav_state_estimators::rtk_garmin::RtkGarmin::~RtkGarmin()2
    mrs_uav_state_estimators::rtk_garmin::RtkGarmin::~RtkGarmin().22
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/state/rtk_garmin.cpp.gcov.frameset.html b/mrs_uav_state_estimators/src/estimators/state/rtk_garmin.cpp.gcov.frameset.html new file mode 100644 index 0000000000..5a40bb2c46 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/state/rtk_garmin.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/state/rtk_garmin.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_state_estimators/src/estimators/state/rtk_garmin.cpp.gcov.html b/mrs_uav_state_estimators/src/estimators/state/rtk_garmin.cpp.gcov.html new file mode 100644 index 0000000000..0b26fc8f43 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/state/rtk_garmin.cpp.gcov.html @@ -0,0 +1,109 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/state/rtk_garmin.cpp + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/state - rtk_garmin.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:55100.0 %
    Date:2024-04-18 23:11:36Functions:44100.0 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : #include <mrs_uav_state_estimators/estimators/state/state_generic.h>
    +       2             : 
    +       3             : namespace mrs_uav_state_estimators
    +       4             : {
    +       5             : 
    +       6             : namespace rtk_garmin
    +       7             : {
    +       8             : 
    +       9             : const char estimator_name[] = "rtk_garmin";
    +      10             : const bool is_core_plugin = true;
    +      11             : 
    +      12             : class RtkGarmin : public StateGeneric {
    +      13             : public:
    +      14           2 :   RtkGarmin() : StateGeneric(estimator_name, is_core_plugin) {
    +      15           2 :   }
    +      16             : 
    +      17           4 :   ~RtkGarmin(void) {
    +      18           4 :   }
    +      19             : };
    +      20             : 
    +      21             : }  // namespace rtk_garmin
    +      22             : }  // namespace mrs_uav_state_estimators
    +      23             : 
    +      24             : #include <pluginlib/class_list_macros.h>
    +      25           2 : PLUGINLIB_EXPORT_CLASS(mrs_uav_state_estimators::rtk_garmin::RtkGarmin, mrs_uav_managers::StateEstimator)
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/state/rtk_garmin.cpp.gcov.overview.html b/mrs_uav_state_estimators/src/estimators/state/rtk_garmin.cpp.gcov.overview.html new file mode 100644 index 0000000000..36bf07081e --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/state/rtk_garmin.cpp.gcov.overview.html @@ -0,0 +1,27 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/state/rtk_garmin.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_state_estimators/src/estimators/state/rtk_garmin.cpp.gcov.png b/mrs_uav_state_estimators/src/estimators/state/rtk_garmin.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..606fb073ca70818dc0b3b5dba84fd6a7044d0512 GIT binary patch literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^0YEIt!VDxsGPYO&DTx4|5ZC|z|E~gq^JNDtZ&EXPgU2N!e?RY*!@G!k?Ta()7BTAKis#>5!bv}um4PI*Z02~7mGQc zuCNw3Xkx0Ko_*uhD$z@81X?onZt12fEV|g{c9?_v+hwVbPc627Ikr{%)|^j!tT$gZ WJ^4%e>pP$W7(8A5T-G@yGywov30pG& literal 0 HcmV?d00001 diff --git a/mrs_uav_state_estimators/src/estimators/state/state_generic.cpp.func-sort-c.html b/mrs_uav_state_estimators/src/estimators/state/state_generic.cpp.func-sort-c.html new file mode 100644 index 0000000000..7b62168cf3 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/state/state_generic.cpp.func-sort-c.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/state/state_generic.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/state - state_generic.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:19429366.2 %
    Date:2024-04-18 23:11:36Functions:71258.3 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::StateGeneric::isConverged()0
    mrs_uav_state_estimators::StateGeneric::setUavState(mrs_msgs::UavState_<std::allocator<void> > const&)0
    mrs_uav_state_estimators::StateGeneric::timerCheckHealth(ros::TimerEvent const&)0
    mrs_uav_state_estimators::StateGeneric::pause()0
    mrs_uav_state_estimators::StateGeneric::reset()0
    mrs_uav_state_estimators::StateGeneric::initialize(ros::NodeHandle&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)97
    mrs_uav_state_estimators::StateGeneric::start()7279
    mrs_uav_state_estimators::StateGeneric::updateUavState()182854
    mrs_uav_state_estimators::StateGeneric::timerUpdate(ros::TimerEvent const&)193265
    mrs_uav_state_estimators::StateGeneric::timerPubAttitude(ros::TimerEvent const&)193267
    mrs_uav_state_estimators::StateGeneric::initialize(ros::NodeHandle&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)::{lambda()#1}::operator()() const290228
    mrs_uav_state_estimators::StateGeneric::getHeading() const290234
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/state/state_generic.cpp.func.html b/mrs_uav_state_estimators/src/estimators/state/state_generic.cpp.func.html new file mode 100644 index 0000000000..1d4270a35d --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/state/state_generic.cpp.func.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/state/state_generic.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/state - state_generic.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:19429366.2 %
    Date:2024-04-18 23:11:36Functions:71258.3 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_state_estimators::StateGeneric::initialize(ros::NodeHandle&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)97
    mrs_uav_state_estimators::StateGeneric::isConverged()0
    mrs_uav_state_estimators::StateGeneric::setUavState(mrs_msgs::UavState_<std::allocator<void> > const&)0
    mrs_uav_state_estimators::StateGeneric::timerUpdate(ros::TimerEvent const&)193265
    mrs_uav_state_estimators::StateGeneric::updateUavState()182854
    mrs_uav_state_estimators::StateGeneric::timerCheckHealth(ros::TimerEvent const&)0
    mrs_uav_state_estimators::StateGeneric::timerPubAttitude(ros::TimerEvent const&)193267
    mrs_uav_state_estimators::StateGeneric::pause()0
    mrs_uav_state_estimators::StateGeneric::reset()0
    mrs_uav_state_estimators::StateGeneric::start()7279
    mrs_uav_state_estimators::StateGeneric::getHeading() const290234
    mrs_uav_state_estimators::StateGeneric::initialize(ros::NodeHandle&, std::shared_ptr<mrs_uav_managers::estimation_manager::CommonHandlers_t> const&, std::shared_ptr<mrs_uav_managers::estimation_manager::PrivateHandlers_t> const&)::{lambda()#1}::operator()() const290228
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/state/state_generic.cpp.gcov.frameset.html b/mrs_uav_state_estimators/src/estimators/state/state_generic.cpp.gcov.frameset.html new file mode 100644 index 0000000000..ae1b3eba16 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/state/state_generic.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/state/state_generic.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_state_estimators/src/estimators/state/state_generic.cpp.gcov.html b/mrs_uav_state_estimators/src/estimators/state/state_generic.cpp.gcov.html new file mode 100644 index 0000000000..e2e7706db4 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/state/state_generic.cpp.gcov.html @@ -0,0 +1,633 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/state/state_generic.cpp + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_state_estimators/src/estimators/state - state_generic.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:19429366.2 %
    Date:2024-04-18 23:11:36Functions:71258.3 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : /* includes //{ */
    +       2             : 
    +       3             : #include <mrs_uav_state_estimators/estimators/state/state_generic.h>
    +       4             : 
    +       5             : //}
    +       6             : 
    +       7             : namespace mrs_uav_state_estimators
    +       8             : {
    +       9             : 
    +      10             : /* initialize() //{*/
    +      11          97 : void StateGeneric::initialize(ros::NodeHandle &parent_nh, const std::shared_ptr<CommonHandlers_t> &ch, const std::shared_ptr<PrivateHandlers_t> &ph) {
    +      12             : 
    +      13          97 :   ch_ = ch;
    +      14          97 :   ph_ = ph;
    +      15             : 
    +      16         194 :   ros::NodeHandle nh(parent_nh);
    +      17             : 
    +      18          97 :   if (is_core_plugin_) {
    +      19             : 
    +      20          97 :     ph->param_loader->addYamlFile(ros::package::getPath(package_name_) + "/config/private/" + getName() + "/" + getName() + ".yaml");
    +      21          97 :     ph->param_loader->addYamlFile(ros::package::getPath(package_name_) + "/config/public/" + getName() + "/" + getName() + ".yaml");
    +      22             :   }
    +      23             : 
    +      24          97 :   ph->param_loader->setPrefix(ch_->package_name + "/" + Support::toSnakeCase(ch_->nodelet_name) + "/" + getName() + "/");
    +      25             : 
    +      26          97 :   ph->param_loader->loadParam("estimators/lateral/name", est_lat_name_);
    +      27          97 :   ph->param_loader->loadParam("estimators/altitude/name", est_alt_name_);
    +      28          97 :   ph->param_loader->loadParam("estimators/heading/name", est_hdg_name_);
    +      29          97 :   ph->param_loader->loadParam("estimators/heading/passthrough", is_hdg_passthrough_);
    +      30             : 
    +      31          97 :   ph->param_loader->loadParam("override_frame_id/enabled", is_override_frame_id_);
    +      32          97 :   if (is_override_frame_id_) {
    +      33           0 :     ph->param_loader->loadParam("override_frame_id/frame_id", frame_id_);
    +      34             :   }
    +      35             : 
    +      36         194 :   std::string topic_orientation;
    +      37          97 :   ph->param_loader->loadParam("topics/orientation", topic_orientation);
    +      38          97 :   topic_orientation_ = "/" + ch_->uav_name + "/" + topic_orientation;
    +      39         194 :   std::string topic_angular_velocity;
    +      40          97 :   ph->param_loader->loadParam("topics/angular_velocity", topic_angular_velocity);
    +      41          97 :   topic_angular_velocity_ = "/" + ch_->uav_name + "/" + topic_angular_velocity;
    +      42             : 
    +      43          97 :   if (!ph->param_loader->loadedSuccessfully()) {
    +      44           0 :     ROS_ERROR("[%s]: Could not load all non-optional parameters. Shutting down.", getPrintName().c_str());
    +      45           0 :     ros::shutdown();
    +      46             :   }
    +      47             : 
    +      48          97 :   ns_frame_id_ = ch_->uav_name + "/" + frame_id_;
    +      49             : 
    +      50             :   // | ------------------ timers initialization ----------------- |
    +      51          97 :   timer_update_ = nh.createTimer(ros::Rate(ch_->desired_uav_state_rate), &StateGeneric::timerUpdate, this);  // not running after init
    +      52             :   /* timer_check_health_ = nh.createTimer(ros::Rate(ch_->desired_uav_state_rate), &StateGeneric::timerCheckHealth, this); */
    +      53          97 :   timer_pub_attitude_ = nh.createTimer(ros::Rate(ch_->desired_uav_state_rate), &StateGeneric::timerPubAttitude, this);
    +      54             : 
    +      55             :   // | --------------- subscribers initialization --------------- |
    +      56         194 :   mrs_lib::SubscribeHandlerOptions shopts;
    +      57          97 :   shopts.nh                 = nh;
    +      58          97 :   shopts.node_name          = getPrintName();
    +      59          97 :   shopts.no_message_timeout = mrs_lib::no_timeout;
    +      60          97 :   shopts.threadsafe         = true;
    +      61          97 :   shopts.autostart          = true;
    +      62          97 :   shopts.queue_size         = 10;
    +      63          97 :   shopts.transport_hints    = ros::TransportHints().tcpNoDelay();
    +      64             : 
    +      65          97 :   sh_hw_api_orient_  = mrs_lib::SubscribeHandler<geometry_msgs::QuaternionStamped>(shopts, topic_orientation_);
    +      66          97 :   sh_hw_api_ang_vel_ = mrs_lib::SubscribeHandler<geometry_msgs::Vector3Stamped>(shopts, topic_angular_velocity_);
    +      67             : 
    +      68             :   // | ---------------- publishers initialization --------------- |
    +      69          97 :   ph_odom_     = mrs_lib::PublisherHandler<nav_msgs::Odometry>(nh, Support::toSnakeCase(getName()) + "/odom", 10);
    +      70          97 :   ph_attitude_ = mrs_lib::PublisherHandler<geometry_msgs::QuaternionStamped>(nh, Support::toSnakeCase(getName()) + "/attitude", 10);
    +      71             : 
    +      72          97 :   if (ch_->debug_topics.state) {
    +      73          97 :     ph_uav_state_ = mrs_lib::PublisherHandler<mrs_msgs::UavState>(nh, Support::toSnakeCase(getName()) + "/uav_state", 10);
    +      74             :   }
    +      75          97 :   if (ch_->debug_topics.covariance) {
    +      76           0 :     ph_pose_covariance_  = mrs_lib::PublisherHandler<mrs_msgs::Float64ArrayStamped>(nh, Support::toSnakeCase(getName()) + "/pose_covariance", 10);
    +      77           0 :     ph_twist_covariance_ = mrs_lib::PublisherHandler<mrs_msgs::Float64ArrayStamped>(nh, Support::toSnakeCase(getName()) + "/twist_covariance", 10);
    +      78             :   }
    +      79          97 :   if (ch_->debug_topics.innovation) {
    +      80           0 :     ph_innovation_ = mrs_lib::PublisherHandler<nav_msgs::Odometry>(nh, Support::toSnakeCase(getName()) + "/innovation", 10);
    +      81             :   }
    +      82          97 :   if (ch_->debug_topics.diag) {
    +      83           0 :     ph_diagnostics_ = mrs_lib::PublisherHandler<mrs_msgs::EstimatorDiagnostics>(nh, Support::toSnakeCase(getName()) + "/diagnostics", 10);
    +      84             :   }
    +      85             : 
    +      86             :   // | ---------------- estimators initialization --------------- |
    +      87         194 :   std::vector<double> max_altitudes;
    +      88             : 
    +      89          97 :   if (is_hdg_passthrough_) {
    +      90          97 :     est_hdg_ = std::make_unique<HdgPassthrough>(est_hdg_name_, frame_id_, getName(), is_core_plugin_);
    +      91             :   } else {
    +      92           0 :     est_hdg_ = std::make_unique<HdgGeneric>(est_hdg_name_, frame_id_, getName(), is_core_plugin_);
    +      93             :   }
    +      94          97 :   est_hdg_->initialize(nh, ch_, ph_);
    +      95          97 :   max_altitudes.push_back(est_hdg_->getMaxFlightZ());
    +      96             : 
    +      97      290325 :   est_lat_ = std::make_unique<LatGeneric>(est_lat_name_, frame_id_, getName(), is_core_plugin_, [this](void) { return this->getHeading(); });
    +      98          97 :   est_lat_->initialize(nh, ch_, ph_);
    +      99          97 :   max_altitudes.push_back(est_lat_->getMaxFlightZ());
    +     100             : 
    +     101          97 :   est_alt_ = std::make_unique<AltGeneric>(est_alt_name_, frame_id_, getName(), is_core_plugin_);
    +     102          97 :   est_alt_->initialize(nh, ch_, ph_);
    +     103          97 :   max_altitudes.push_back(est_alt_->getMaxFlightZ());
    +     104             : 
    +     105          97 :   max_flight_z_ = *std::min_element(max_altitudes.begin(), max_altitudes.end());
    +     106             : 
    +     107             :   // | ------------------ initialize published messages ------------------ |
    +     108          97 :   uav_state_init_.header.frame_id = ns_frame_id_;
    +     109          97 :   uav_state_init_.child_frame_id  = ch_->frames.ns_fcu;
    +     110             : 
    +     111          97 :   uav_state_init_.estimator_horizontal = est_lat_name_;
    +     112          97 :   uav_state_init_.estimator_vertical   = est_alt_name_;
    +     113          97 :   uav_state_init_.estimator_heading    = est_hdg_name_;
    +     114             : 
    +     115          97 :   innovation_init_.header.frame_id         = ns_frame_id_;
    +     116          97 :   innovation_init_.child_frame_id          = ch_->frames.ns_fcu;
    +     117          97 :   innovation_init_.pose.pose.orientation.w = 1.0;
    +     118             : 
    +     119             :   // | ------------------ finish initialization ----------------- |
    +     120             : 
    +     121          97 :   if (changeState(INITIALIZED_STATE)) {
    +     122          97 :     ROS_INFO("[%s]: Estimator initialized", getPrintName().c_str());
    +     123             :   } else {
    +     124           0 :     ROS_INFO("[%s]: Estimator could not be initialized", getPrintName().c_str());
    +     125             :   }
    +     126          97 : }
    +     127             : /*//}*/
    +     128             : 
    +     129             : /*//{ start() */
    +     130        7279 : bool StateGeneric::start(void) {
    +     131             : 
    +     132        7279 :   if (isInState(READY_STATE)) {
    +     133             : 
    +     134             :     bool est_lat_start_successful, est_alt_start_successful, est_hdg_start_successful;
    +     135             : 
    +     136        7279 :     if (est_lat_->isStarted() || est_lat_->isRunning()) {
    +     137        3323 :       est_lat_start_successful = true;
    +     138             :     } else {
    +     139        3956 :       est_lat_start_successful = est_lat_->start();
    +     140             :     }
    +     141             : 
    +     142        7279 :     if (est_alt_->isStarted() || est_alt_->isRunning()) {
    +     143        3213 :       est_alt_start_successful = true;
    +     144             :     } else {
    +     145        4066 :       est_alt_start_successful = est_alt_->start();
    +     146             :     }
    +     147             : 
    +     148        7279 :     if (est_hdg_->isStarted() || est_hdg_->isRunning()) {
    +     149        7109 :       timer_pub_attitude_.start();
    +     150        7109 :       est_hdg_start_successful = true;
    +     151             :     } else {
    +     152         170 :       est_hdg_start_successful = est_hdg_->start();
    +     153             :     }
    +     154             : 
    +     155        7279 :     if (est_lat_start_successful && est_alt_start_successful && est_hdg_start_successful) {
    +     156             :       /* timer_update_.start(); */
    +     157          97 :       changeState(STARTED_STATE);
    +     158          97 :       return true;
    +     159             :     }
    +     160             : 
    +     161             :   } else {
    +     162           0 :     ROS_WARN("[%s]: Estimator must be in READY_STATE to start it", getPrintName().c_str());
    +     163           0 :     ros::Duration(1.0).sleep();
    +     164             :   }
    +     165        7182 :   return false;
    +     166             : 
    +     167             :   ROS_ERROR("[%s]: Failed to start", getPrintName().c_str());
    +     168             :   return false;
    +     169             : }
    +     170             : /*//}*/
    +     171             : 
    +     172             : /*//{ pause() */
    +     173           0 : bool StateGeneric::pause(void) {
    +     174             : 
    +     175           0 :   if (isInState(RUNNING_STATE)) {
    +     176           0 :     est_lat_->pause();
    +     177           0 :     est_alt_->pause();
    +     178           0 :     est_hdg_->pause();
    +     179           0 :     changeState(STOPPED_STATE);
    +     180           0 :     return true;
    +     181             : 
    +     182             :   } else {
    +     183           0 :     return false;
    +     184             :   }
    +     185             : }
    +     186             : /*//}*/
    +     187             : 
    +     188             : /*//{ reset() */
    +     189           0 : bool StateGeneric::reset(void) {
    +     190             : 
    +     191           0 :   if (!isInitialized()) {
    +     192           0 :     ROS_ERROR("[%s]: Cannot reset uninitialized estimator", getPrintName().c_str());
    +     193           0 :     return false;
    +     194             :   }
    +     195             : 
    +     196           0 :   est_lat_->pause();
    +     197           0 :   est_alt_->pause();
    +     198           0 :   est_hdg_->pause();
    +     199           0 :   changeState(STOPPED_STATE);
    +     200             : 
    +     201           0 :   ROS_INFO("[%s]: Estimator reset", getPrintName().c_str());
    +     202             : 
    +     203           0 :   return true;
    +     204             : }
    +     205             : /*//}*/
    +     206             : 
    +     207             : /* timerUpdate() //{*/
    +     208      193265 : void StateGeneric::timerUpdate([[maybe_unused]] const ros::TimerEvent &event) {
    +     209             : 
    +     210             : 
    +     211      193265 :   if (!isInitialized()) {
    +     212       10368 :     return;
    +     213             :   }
    +     214             : 
    +     215      385226 :   mrs_lib::ScopeTimer scope_timer = mrs_lib::ScopeTimer("StateGeneric::timerUpdate", ch_->scope_timer.logger, ch_->scope_timer.enabled);
    +     216             : 
    +     217      192594 :   switch (getCurrentSmState()) {
    +     218             : 
    +     219           0 :     case UNINITIALIZED_STATE: {
    +     220           0 :       break;
    +     221             :     }
    +     222        2454 :     case INITIALIZED_STATE: {
    +     223             : 
    +     224        2454 :       if (sh_hw_api_orient_.hasMsg() && sh_hw_api_ang_vel_.hasMsg()) {
    +     225          97 :         if (est_lat_->isInitialized() && est_alt_->isInitialized() && est_hdg_->isInitialized()) {
    +     226          97 :           changeState(READY_STATE);
    +     227          97 :           ROS_INFO_THROTTLE(1.0, "[%s]: Estimator is ready to start", getPrintName().c_str());
    +     228             :         } else {
    +     229           0 :           ROS_INFO_THROTTLE(1.0, "[%s]: %s subestimators to be initialized", getPrintName().c_str(), Support::waiting_for_string.c_str());
    +     230           0 :           return;
    +     231             :         }
    +     232             :       } else {
    +     233        2357 :         ROS_INFO_THROTTLE(1.0, "[%s]: %s msg on topic %s", getPrintName().c_str(), Support::waiting_for_string.c_str(), sh_hw_api_orient_.topicName().c_str());
    +     234        2357 :         return;
    +     235             :       }
    +     236             : 
    +     237          97 :       break;
    +     238             :     }
    +     239             : 
    +     240        7238 :     case READY_STATE: {
    +     241        7238 :       break;
    +     242             :     }
    +     243             : 
    +     244         130 :     case STARTED_STATE: {
    +     245             : 
    +     246         130 :       ROS_INFO_THROTTLE(1.0, "[%s]: %s convergence of LKF", getPrintName().c_str(), Support::waiting_for_string.c_str());
    +     247             : 
    +     248         130 :       if (est_lat_->isRunning() && est_alt_->isRunning() && est_hdg_->isRunning()) {
    +     249          97 :         ROS_INFO_THROTTLE(1.0, "[%s]: Subestimators converged", getPrintName().c_str());
    +     250          97 :         changeState(RUNNING_STATE);
    +     251             :       } else {
    +     252          33 :         return;
    +     253             :       }
    +     254          97 :       break;
    +     255             :     }
    +     256             : 
    +     257      182789 :     case RUNNING_STATE: {
    +     258      182789 :       if (est_lat_->isError() || est_alt_->isError() || est_hdg_->isError()) {
    +     259           0 :         changeState(ERROR_STATE);
    +     260             :       }
    +     261      182761 :       break;
    +     262             :     }
    +     263             : 
    +     264           0 :     case STOPPED_STATE: {
    +     265           0 :       break;
    +     266             :     }
    +     267             : 
    +     268           0 :     case ERROR_STATE: {
    +     269           0 :       if ((est_lat_->isReady() || est_lat_->isRunning()) && (est_alt_->isReady() || est_alt_->isRunning()) && (est_hdg_->isReady() || est_hdg_->isRunning())) {
    +     270           0 :         changeState(READY_STATE);
    +     271             :       }
    +     272           0 :       break;
    +     273             :     }
    +     274             :   }
    +     275             : 
    +     276      190189 :   if (!isRunning() && !isStarted()) {
    +     277        7335 :     return;
    +     278             :   }
    +     279             : 
    +     280      182862 :   updateUavState();
    +     281             : 
    +     282      182864 :   publishUavState();
    +     283      182896 :   publishOdom();
    +     284      182899 :   publishCovariance();
    +     285      182899 :   publishInnovation();
    +     286      182899 :   publishDiagnostics();
    +     287             : }
    +     288             : /*//}*/
    +     289             : 
    +     290             : /*//{ timerCheckHealth() */
    +     291           0 : void StateGeneric::timerCheckHealth([[maybe_unused]] const ros::TimerEvent &event) {
    +     292             : 
    +     293           0 :   if (!isInitialized()) {
    +     294           0 :     return;
    +     295             :   }
    +     296             : 
    +     297           0 :   mrs_lib::ScopeTimer scope_timer = mrs_lib::ScopeTimer("StateGeneric::timerCheckHealth", ch_->scope_timer.logger, ch_->scope_timer.enabled);
    +     298             : 
    +     299           0 :   switch (getCurrentSmState()) {
    +     300             : 
    +     301           0 :     case UNINITIALIZED_STATE: {
    +     302           0 :       break;
    +     303             :     }
    +     304           0 :     case INITIALIZED_STATE: {
    +     305             : 
    +     306           0 :       if (sh_hw_api_orient_.hasMsg() && sh_hw_api_ang_vel_.hasMsg()) {
    +     307           0 :         if (est_lat_->isInitialized() && est_alt_->isInitialized() && est_hdg_->isInitialized()) {
    +     308           0 :           changeState(READY_STATE);
    +     309           0 :           ROS_INFO_THROTTLE(1.0, "[%s]: Estimator is ready to start", getPrintName().c_str());
    +     310             :         } else {
    +     311           0 :           ROS_INFO_THROTTLE(1.0, "[%s]: %s subestimators to be initialized", getPrintName().c_str(), Support::waiting_for_string.c_str());
    +     312           0 :           return;
    +     313             :         }
    +     314             :       } else {
    +     315           0 :         ROS_INFO_THROTTLE(1.0, "[%s]: %s msg on topic %s", getPrintName().c_str(), Support::waiting_for_string.c_str(), sh_hw_api_orient_.topicName().c_str());
    +     316           0 :         return;
    +     317             :       }
    +     318             : 
    +     319           0 :       break;
    +     320             :     }
    +     321             : 
    +     322           0 :     case READY_STATE: {
    +     323           0 :       break;
    +     324             :     }
    +     325             : 
    +     326           0 :     case STARTED_STATE: {
    +     327             : 
    +     328           0 :       ROS_INFO_THROTTLE(1.0, "[%s]: %s for convergence of LKF", getPrintName().c_str(), Support::waiting_for_string.c_str());
    +     329             : 
    +     330           0 :       if (est_lat_->isError() || est_alt_->isError() || est_hdg_->isError()) {
    +     331           0 :         changeState(ERROR_STATE);
    +     332             :       }
    +     333             : 
    +     334           0 :       if (est_lat_->isRunning() && est_alt_->isRunning() && est_hdg_->isRunning()) {
    +     335           0 :         ROS_INFO_THROTTLE(1.0, "[%s]: Subestimators converged", getPrintName().c_str());
    +     336           0 :         changeState(RUNNING_STATE);
    +     337             :       } else {
    +     338           0 :         return;
    +     339             :       }
    +     340           0 :       break;
    +     341             :     }
    +     342             : 
    +     343           0 :     case RUNNING_STATE: {
    +     344           0 :       if (est_lat_->isError() || est_alt_->isError() || est_hdg_->isError()) {
    +     345           0 :         changeState(ERROR_STATE);
    +     346             :       }
    +     347           0 :       break;
    +     348             :     }
    +     349             : 
    +     350           0 :     case STOPPED_STATE: {
    +     351           0 :       break;
    +     352             :     }
    +     353             : 
    +     354           0 :     case ERROR_STATE: {
    +     355           0 :       if (est_lat_->isReady() && est_alt_->isReady() && est_hdg_->isReady()) {
    +     356           0 :         changeState(READY_STATE);
    +     357             :       }
    +     358           0 :       break;
    +     359             :     }
    +     360             :   }
    +     361             : }
    +     362             : /*//}*/
    +     363             : 
    +     364             : /* timerPubAttitude() //{*/
    +     365      193267 : void StateGeneric::timerPubAttitude([[maybe_unused]] const ros::TimerEvent &event) {
    +     366             : 
    +     367      193267 :   if (!isInitialized()) {
    +     368        3302 :     return;
    +     369             :   }
    +     370             : 
    +     371      385226 :   mrs_lib::ScopeTimer scope_timer = mrs_lib::ScopeTimer("StateGeneric::timerPubAttitude", ch_->scope_timer.logger, ch_->scope_timer.enabled);
    +     372             : 
    +     373      192593 :   if (!sh_hw_api_orient_.hasMsg()) {
    +     374        1383 :     ROS_WARN_THROTTLE(1.0, "[%s]: has not received orientation on topic %s yet", getPrintName().c_str(), sh_hw_api_orient_.topicName().c_str());
    +     375        1383 :     return;
    +     376             :   }
    +     377             : 
    +     378      191220 :   if (!est_hdg_->isRunning() && !isError()) {
    +     379        1277 :     ROS_WARN_THROTTLE(1.0, "[%s]: cannot publish attitude, heading estimator is not running", getPrintName().c_str());
    +     380        1277 :     return;
    +     381             :   }
    +     382             : 
    +     383      189942 :   scope_timer.checkpoint("checks");
    +     384             : 
    +     385      189912 :   const ros::Time time_now = ros::Time::now();
    +     386             : 
    +     387      189963 :   geometry_msgs::QuaternionStamped att;
    +     388      189924 :   att.header.stamp    = time_now;
    +     389      189924 :   att.header.frame_id = ns_frame_id_ + "_att_only";
    +     390             : 
    +     391             :   double hdg;
    +     392      189886 :   if (isError()) {
    +     393           0 :     hdg = est_hdg_->getLastValidHdg();
    +     394             :   } else {
    +     395      189901 :     hdg = est_hdg_->getState(POSITION);
    +     396             :   }
    +     397             : 
    +     398      189897 :   auto res = rotateQuaternionByHeading(sh_hw_api_orient_.getMsg()->quaternion, hdg);
    +     399      189703 :   if (res) {
    +     400      189850 :     att.quaternion = res.value();
    +     401             :   } else {
    +     402           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: could not rotate orientation by heading", getPrintName().c_str());
    +     403           0 :     return;
    +     404             :   }
    +     405             : 
    +     406      189653 :   scope_timer.checkpoint("rotate");
    +     407             : 
    +     408      189804 :   if (!Support::noNans(att.quaternion)) {
    +     409           0 :     ROS_ERROR_THROTTLE(1.0, "[%s]: NaNs in timerPubAttitude quaternion", getPrintName().c_str());
    +     410           0 :     return;
    +     411             :   }
    +     412             : 
    +     413      189800 :   scope_timer.checkpoint("nan check");
    +     414             : 
    +     415      189688 :   ph_attitude_.publish(att);
    +     416      189966 :   scope_timer.checkpoint("publish");
    +     417             : }
    +     418             : /*//}*/
    +     419             : 
    +     420             : /*//{ isConverged() */
    +     421           0 : bool StateGeneric::isConverged() {
    +     422             : 
    +     423             :   // TODO: check convergence by rate of change of determinant
    +     424             :   // most likely not used in top-level estimator
    +     425             : 
    +     426           0 :   return true;
    +     427             : }
    +     428             : /*//}*/
    +     429             : 
    +     430             : /*//{ updateUavState() */
    +     431      182854 : void StateGeneric::updateUavState() {
    +     432             : 
    +     433      182854 :   if (!sh_hw_api_orient_.hasMsg()) {
    +     434           0 :     ROS_WARN_THROTTLE(1.0, "[%s]: has not received orientation on topic %s yet", getPrintName().c_str(), sh_hw_api_orient_.topicName().c_str());
    +     435           0 :     return;
    +     436             :   }
    +     437             : 
    +     438      182851 :   if (!sh_hw_api_ang_vel_.hasMsg()) {
    +     439           0 :     ROS_WARN_THROTTLE(1.0, "[%s]: has not received angular velocity on topic %s yet", getPrintName().c_str(), sh_hw_api_ang_vel_.topicName().c_str());
    +     440           0 :     return;
    +     441             :   }
    +     442      365752 :   mrs_lib::ScopeTimer scope_timer = mrs_lib::ScopeTimer("StateGeneric::updateUavState", ch_->scope_timer.logger, ch_->scope_timer.enabled);
    +     443             : 
    +     444      182878 :   const ros::Time time_now = ros::Time::now();
    +     445             : 
    +     446      182898 :   mrs_msgs::UavState uav_state = uav_state_init_;
    +     447      182892 :   uav_state.header.stamp       = time_now;
    +     448             : 
    +     449             :   // do not rotate orientation if passthrough hdg
    +     450      182892 :   if (est_hdg_name_ == "hdg_passthrough") {
    +     451           0 :     uav_state.pose.orientation = sh_hw_api_orient_.getMsg()->quaternion;
    +     452             :   } else {
    +     453             :     double hdg;
    +     454      182876 :     if (isError()) {
    +     455           0 :       hdg = est_hdg_->getLastValidHdg();
    +     456             :     } else {
    +     457      182867 :       hdg = est_hdg_->getState(POSITION);
    +     458             :     }
    +     459             : 
    +     460      182845 :     auto res = rotateQuaternionByHeading(sh_hw_api_orient_.getMsg()->quaternion, hdg);
    +     461      182680 :     if (res) {
    +     462      182792 :       uav_state.pose.orientation = res.value();
    +     463             :     } else {
    +     464           0 :       ROS_ERROR_THROTTLE(1.0, "[%s]: could not rotate orientation by heading", getPrintName().c_str());
    +     465           0 :       return;
    +     466             :     }
    +     467             :   }
    +     468             : 
    +     469      182696 :   scope_timer.checkpoint("rotate orientation");
    +     470             : 
    +     471      182774 :   uav_state.velocity.angular = sh_hw_api_ang_vel_.getMsg()->vector;
    +     472             : 
    +     473      182759 :   uav_state.pose.position.x = est_lat_->getState(POSITION, AXIS_X);
    +     474      182817 :   uav_state.pose.position.y = est_lat_->getState(POSITION, AXIS_Y);
    +     475      182802 :   uav_state.pose.position.z = est_alt_->getState(POSITION);
    +     476             : 
    +     477      182740 :   uav_state.velocity.linear.x = est_lat_->getState(VELOCITY, AXIS_X);  // in global frame
    +     478      182801 :   uav_state.velocity.linear.y = est_lat_->getState(VELOCITY, AXIS_Y);  // in global frame
    +     479      182822 :   uav_state.velocity.linear.z = est_alt_->getState(VELOCITY);          // in global frame
    +     480             : 
    +     481      182809 :   uav_state.acceleration.linear.x = est_lat_->getState(ACCELERATION, AXIS_X);  // in global frame
    +     482      182821 :   uav_state.acceleration.linear.y = est_lat_->getState(ACCELERATION, AXIS_Y);  // in global frame
    +     483      182833 :   uav_state.acceleration.linear.z = est_alt_->getState(ACCELERATION);          // in global frame
    +     484             : 
    +     485      182826 :   scope_timer.checkpoint("fill uav state");
    +     486             : 
    +     487      365625 :   const nav_msgs::Odometry odom = Support::uavStateToOdom(uav_state);
    +     488      182885 :   scope_timer.checkpoint("uav state to odom");
    +     489             : 
    +     490      365634 :   nav_msgs::Odometry innovation = innovation_init_;
    +     491      182840 :   innovation.header.stamp       = time_now;
    +     492             : 
    +     493      182840 :   innovation.pose.pose.position.x = est_lat_->getInnovation(POSITION, AXIS_X);
    +     494      182754 :   innovation.pose.pose.position.y = est_lat_->getInnovation(POSITION, AXIS_Y);
    +     495      182770 :   innovation.pose.pose.position.z = est_alt_->getInnovation(POSITION);
    +     496             : 
    +     497      182727 :   is_mitigating_jump_ = est_alt_->isMitigatingJump() || est_lat_->isMitigatingJump() || est_hdg_->isMitigatingJump();
    +     498             : 
    +     499      182848 :   scope_timer.checkpoint("innovation");
    +     500             : 
    +     501      365521 :   mrs_msgs::Float64ArrayStamped pose_covariance, twist_covariance;
    +     502      182610 :   pose_covariance.header.stamp  = time_now;
    +     503      182610 :   twist_covariance.header.stamp = time_now;
    +     504             : 
    +     505      182610 :   const int n_states = 6;  // TODO this should be defined somewhere else
    +     506      182610 :   pose_covariance.values.resize(n_states * n_states);
    +     507      182744 :   pose_covariance.values.at(n_states * AXIS_X + AXIS_X) = est_lat_->getCovariance(POSITION, AXIS_X);
    +     508      182561 :   pose_covariance.values.at(n_states * AXIS_Y + AXIS_Y) = est_lat_->getCovariance(POSITION, AXIS_Y);
    +     509      182738 :   pose_covariance.values.at(n_states * AXIS_Z + AXIS_Z) = est_alt_->getCovariance(POSITION);
    +     510             : 
    +     511      182578 :   twist_covariance.values.resize(n_states * n_states);
    +     512      182807 :   twist_covariance.values.at(n_states * AXIS_X + AXIS_X) = est_lat_->getCovariance(VELOCITY, AXIS_X);
    +     513      182785 :   twist_covariance.values.at(n_states * AXIS_Y + AXIS_Y) = est_lat_->getCovariance(VELOCITY, AXIS_Y);
    +     514      182832 :   twist_covariance.values.at(n_states * AXIS_Z + AXIS_Z) = est_alt_->getCovariance(VELOCITY);
    +     515             : 
    +     516      182794 :   scope_timer.checkpoint("covariance");
    +     517             : 
    +     518      182711 :   mrs_lib::set_mutexed(mtx_uav_state_, uav_state, uav_state_);
    +     519      182730 :   mrs_lib::set_mutexed(mtx_odom_, odom, odom_);
    +     520      182631 :   mrs_lib::set_mutexed(mtx_innovation_, innovation, innovation_);
    +     521      182825 :   mrs_lib::set_mutexed(mtx_covariance_, pose_covariance, pose_covariance_);
    +     522      182722 :   mrs_lib::set_mutexed(mtx_covariance_, twist_covariance, twist_covariance_);
    +     523             : }
    +     524             : /*//}*/
    +     525             : 
    +     526             : /*//{ getHeading() */
    +     527      290234 : std::optional<double> StateGeneric::getHeading() const {
    +     528      290234 :   if (!est_hdg_->isRunning()) {
    +     529         176 :     return {};
    +     530             :   }
    +     531      290051 :   return est_hdg_->getState(POSITION);
    +     532             : }
    +     533             : /*//}*/
    +     534             : 
    +     535             : /*//{ setUavState() */
    +     536           0 : bool StateGeneric::setUavState([[maybe_unused]] const mrs_msgs::UavState &uav_state) {
    +     537             : 
    +     538           0 :   if (!isInState(STOPPED_STATE)) {
    +     539           0 :     ROS_WARN("[%s]: Estimator state can be set only in the STOPPED state", getPrintName().c_str());
    +     540           0 :     return false;
    +     541             :   }
    +     542             : 
    +     543           0 :   ROS_WARN("[%s]: Setting the state of this estimator is not implemented.", getPrintName().c_str());
    +     544           0 :   return false;
    +     545             : }
    +     546             : /*//}*/
    +     547             : 
    +     548             : }  // namespace mrs_uav_state_estimators
    +     549             : 
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_state_estimators/src/estimators/state/state_generic.cpp.gcov.overview.html b/mrs_uav_state_estimators/src/estimators/state/state_generic.cpp.gcov.overview.html new file mode 100644 index 0000000000..200fa9f980 --- /dev/null +++ b/mrs_uav_state_estimators/src/estimators/state/state_generic.cpp.gcov.overview.html @@ -0,0 +1,158 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_state_estimators/src/estimators/state/state_generic.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_state_estimators/src/estimators/state/state_generic.cpp.gcov.png b/mrs_uav_state_estimators/src/estimators/state/state_generic.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..8938884936a7531808d51a4f305de8fd22b967fe GIT binary patch literal 1968 zcmV;h2T%BkP)RelK&I9M6mH^bcPZ98fHBq4&s^YMH>$M?VC zs`18mAeBcm#_=-d2#+Je(&dx~tD86V3hsGUb2_xUYWK-7fn%6vt!I5HAWoXHKhIZS z^y*O;@i@)3p_EZL3JB=%APo#{7vvR{GGYU^OucB#X6bp-hKPo}BiJCb8Oa^}G{}&%$F!$v*3iBPY${N5+&);VP^9#MWh` zr-XTstCuDghI5|x9;#hA+Xajk&XFw@_eP#}%iHa!d_-xG7fZT;YPDk59K| zH)9-$k+e|G=m-$kqpTgTn{F@c*vKrI2D=5hbj;Vc1a3P@n{-tz|h1I2Jd!5+_-dm%w)p76 z;PyJ!Gb;&?%?SxCDW)Oz5?SGJhC7S^v>#`@k^+T+D*zbdE)Hvb3U3DaxCBQI&ewM>X<}JsFs^_279i$dJL;q*>ylLzFyMsrjNKlxSJOU?;q%>Jun7SHKeLoRwO#@DGJbk}b z*)rf57LIX~EJ~fCg0UxH#UB?_;1tmC@B@ahb-fSBtZmO+fzvR5H) zK&VLNDq!T0I$K5?(hRP|BSqj_8_HrM7?EX#2`MzuyhuZXv^G3oJ=iapZFb+qYJi;3 z>JV3_{YP1QT#py`QVeAPW0%F5)j}~wP2a&|HIQN>T0p8Ww-nu=)fDy$O#l^R%uGVE zK`akgoYznjpo51`zu^?b7}PM-F3LnRq&geG7`5D~9+EU`1^d-W^8}AY77dSNMYGZp zcjb$Ut4+9Eub#`drh5N&4lUh`|As=dg89ttD-f^&V;S}oU^%VWQ?IkM~|} z+f5Eg3RmKhBJgdM)nX$Uw}R=)7{6?VlxLCOeDG2OEH-3Ud=~ylm2x|e^=c0zy<~mD zPpgeN1&omdDe{`m?{(==#5K7Y@%T-uI(fX_IeMEW`nsP(h0@Q{H+J#i^#Nu7* zVJGdJju2st9BO7S^mo|WnOq_bjvZsz7#g-yeTFgeo;;WIc#$s1LNPkuwv48mzCa$$ zwjCf&Iq#{prT6p^FR6vl43$Ubrd>Rh1wHm~GgUu@bZp31=)OJoovh`kFs-|gU7>0Z zSNhWR$jj^N&ZbL`>6%z2o0xLy38e}-e)>J?(Iymps2)0CKpFTeI-0euQgKI93NH;C z)ApL{;Salx=GR=J{f`fOpy6RRN}9`gsefYIPUtlkTg_=jD&Nuo-3+eH(uKV}c22t= z>)ipM{fKBP%<97Zx^)ny%hsZ9C6{72izmb;clarb5hXqBK_MJzauFh(ao*Otyrzox z<7UrcS`&hm6kP62V7YfJ#F27u0J~x49y?O*b=!haFZZl^upJugn^Mt-pZi$Aa?b+R zC-=QKy7|bRe{_0;#*kHa#+6QDj2%-^jF$jvO8T7CS=wrkHdg_f1EU7;9FMv5VaQ(z zX!tzMqoQWxfDITm!I#OI>_I>NLzf*sBTe*0NGHvLh#RQ~aiy)z8s|#D`81EoG`Q{o zUeZbAa~M5eaj6so7EG8^p6bC8lQKpyZL6yDlu3I%ys4cWFLHsT|qrREi>{=;J@R==gg z{(i%eJhR8jwpje$tJVMK0J3;%muobOdFVN{(D)CEfGpm?B=2Sb0000 + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/joy_tracker + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/joy_trackerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:6614246.5 %
    Date:2024-04-18 23:11:36Functions:71838.9 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    joy_tracker.cpp +
    46.5%46.5%
    +
    46.5 %66 / 14238.9 %7 / 18
    <unnamed>46.5 %66 / 14238.9 %7 / 18
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/joy_tracker/index-detail-sort-l.html b/mrs_uav_trackers/src/joy_tracker/index-detail-sort-l.html new file mode 100644 index 0000000000..65124af2ec --- /dev/null +++ b/mrs_uav_trackers/src/joy_tracker/index-detail-sort-l.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/joy_tracker + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/joy_trackerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:6614246.5 %
    Date:2024-04-18 23:11:36Functions:71838.9 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    joy_tracker.cpp +
    46.5%46.5%
    +
    46.5 %66 / 14238.9 %7 / 18
    <unnamed>46.5 %66 / 14238.9 %7 / 18
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/joy_tracker/index-detail.html b/mrs_uav_trackers/src/joy_tracker/index-detail.html new file mode 100644 index 0000000000..947d4da69f --- /dev/null +++ b/mrs_uav_trackers/src/joy_tracker/index-detail.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/joy_tracker + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/joy_trackerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:6614246.5 %
    Date:2024-04-18 23:11:36Functions:71838.9 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    joy_tracker.cpp +
    46.5%46.5%
    +
    46.5 %66 / 14238.9 %7 / 18
    <unnamed>46.5 %66 / 14238.9 %7 / 18
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/joy_tracker/index-sort-f.html b/mrs_uav_trackers/src/joy_tracker/index-sort-f.html new file mode 100644 index 0000000000..15eacc666b --- /dev/null +++ b/mrs_uav_trackers/src/joy_tracker/index-sort-f.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/joy_tracker + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/joy_trackerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:6614246.5 %
    Date:2024-04-18 23:11:36Functions:71838.9 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    joy_tracker.cpp +
    46.5%46.5%
    +
    46.5 %66 / 14238.9 %7 / 18
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/joy_tracker/index-sort-l.html b/mrs_uav_trackers/src/joy_tracker/index-sort-l.html new file mode 100644 index 0000000000..d31a837883 --- /dev/null +++ b/mrs_uav_trackers/src/joy_tracker/index-sort-l.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/joy_tracker + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/joy_trackerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:6614246.5 %
    Date:2024-04-18 23:11:36Functions:71838.9 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    joy_tracker.cpp +
    46.5%46.5%
    +
    46.5 %66 / 14238.9 %7 / 18
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/joy_tracker/index.html b/mrs_uav_trackers/src/joy_tracker/index.html new file mode 100644 index 0000000000..3ca64736e9 --- /dev/null +++ b/mrs_uav_trackers/src/joy_tracker/index.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/joy_tracker + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/joy_trackerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:6614246.5 %
    Date:2024-04-18 23:11:36Functions:71838.9 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    joy_tracker.cpp +
    46.5%46.5%
    +
    46.5 %66 / 14238.9 %7 / 18
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/joy_tracker/joy_tracker.cpp.func-sort-c.html b/mrs_uav_trackers/src/joy_tracker/joy_tracker.cpp.func-sort-c.html new file mode 100644 index 0000000000..ae127047cd --- /dev/null +++ b/mrs_uav_trackers/src/joy_tracker/joy_tracker.cpp.func-sort-c.html @@ -0,0 +1,152 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/joy_tracker/joy_tracker.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/joy_tracker - joy_tracker.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:6614246.5 %
    Date:2024-04-18 23:11:36Functions:71838.9 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_trackers::joy_tracker::JoyTracker::resetStatic()0
    mrs_uav_trackers::joy_tracker::JoyTracker::setReference(boost::shared_ptr<mrs_msgs::ReferenceSrvRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::joy_tracker::JoyTracker::gotoTrajectoryStart(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::joy_tracker::JoyTracker::setVelocityReference(boost::shared_ptr<mrs_msgs::VelocityReferenceSrvRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::joy_tracker::JoyTracker::switchOdometrySource(mrs_msgs::UavState_<std::allocator<void> > const&)0
    mrs_uav_trackers::joy_tracker::JoyTracker::stopTrajectoryTracking(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::joy_tracker::JoyTracker::startTrajectoryTracking(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::joy_tracker::JoyTracker::resumeTrajectoryTracking(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::joy_tracker::JoyTracker::hover(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::joy_tracker::JoyTracker::activate[abi:cxx11](std::optional<mrs_msgs::TrackerCommand_<std::allocator<void> > > const&)0
    mrs_uav_trackers::joy_tracker::JoyTracker::getStatus()0
    mrs_uav_trackers::joy_tracker::JoyTracker::setTrajectoryReference(boost::shared_ptr<mrs_msgs::TrajectoryReferenceSrvRequest_<std::allocator<void> > const> const&)4
    mrs_uav_trackers::joy_tracker::JoyTracker::deactivate()20
    (anonymous namespace)::ProxyExec0::ProxyExec0()91
    mrs_uav_trackers::joy_tracker::JoyTracker::initialize(ros::NodeHandle const&, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t>, std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t>)91
    mrs_uav_trackers::joy_tracker::JoyTracker::setConstraints(boost::shared_ptr<mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> > const> const&)298
    mrs_uav_trackers::joy_tracker::JoyTracker::enableCallbacks(boost::shared_ptr<std_srvs::SetBoolRequest_<std::allocator<void> > const> const&)313
    mrs_uav_trackers::joy_tracker::JoyTracker::update(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_uav_managers::Controller::ControlOutput const&)120314
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/joy_tracker/joy_tracker.cpp.func.html b/mrs_uav_trackers/src/joy_tracker/joy_tracker.cpp.func.html new file mode 100644 index 0000000000..49e95d00b9 --- /dev/null +++ b/mrs_uav_trackers/src/joy_tracker/joy_tracker.cpp.func.html @@ -0,0 +1,152 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/joy_tracker/joy_tracker.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/joy_tracker - joy_tracker.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:6614246.5 %
    Date:2024-04-18 23:11:36Functions:71838.9 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    (anonymous namespace)::ProxyExec0::ProxyExec0()91
    mrs_uav_trackers::joy_tracker::JoyTracker::deactivate()20
    mrs_uav_trackers::joy_tracker::JoyTracker::initialize(ros::NodeHandle const&, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t>, std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t>)91
    mrs_uav_trackers::joy_tracker::JoyTracker::resetStatic()0
    mrs_uav_trackers::joy_tracker::JoyTracker::setReference(boost::shared_ptr<mrs_msgs::ReferenceSrvRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::joy_tracker::JoyTracker::setConstraints(boost::shared_ptr<mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> > const> const&)298
    mrs_uav_trackers::joy_tracker::JoyTracker::enableCallbacks(boost::shared_ptr<std_srvs::SetBoolRequest_<std::allocator<void> > const> const&)313
    mrs_uav_trackers::joy_tracker::JoyTracker::gotoTrajectoryStart(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::joy_tracker::JoyTracker::setVelocityReference(boost::shared_ptr<mrs_msgs::VelocityReferenceSrvRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::joy_tracker::JoyTracker::switchOdometrySource(mrs_msgs::UavState_<std::allocator<void> > const&)0
    mrs_uav_trackers::joy_tracker::JoyTracker::setTrajectoryReference(boost::shared_ptr<mrs_msgs::TrajectoryReferenceSrvRequest_<std::allocator<void> > const> const&)4
    mrs_uav_trackers::joy_tracker::JoyTracker::stopTrajectoryTracking(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::joy_tracker::JoyTracker::startTrajectoryTracking(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::joy_tracker::JoyTracker::resumeTrajectoryTracking(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::joy_tracker::JoyTracker::hover(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::joy_tracker::JoyTracker::update(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_uav_managers::Controller::ControlOutput const&)120314
    mrs_uav_trackers::joy_tracker::JoyTracker::activate[abi:cxx11](std::optional<mrs_msgs::TrackerCommand_<std::allocator<void> > > const&)0
    mrs_uav_trackers::joy_tracker::JoyTracker::getStatus()0
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/joy_tracker/joy_tracker.cpp.gcov.frameset.html b/mrs_uav_trackers/src/joy_tracker/joy_tracker.cpp.gcov.frameset.html new file mode 100644 index 0000000000..8092e9ce7e --- /dev/null +++ b/mrs_uav_trackers/src/joy_tracker/joy_tracker.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/joy_tracker/joy_tracker.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_trackers/src/joy_tracker/joy_tracker.cpp.gcov.html b/mrs_uav_trackers/src/joy_tracker/joy_tracker.cpp.gcov.html new file mode 100644 index 0000000000..2409e9d891 --- /dev/null +++ b/mrs_uav_trackers/src/joy_tracker/joy_tracker.cpp.gcov.html @@ -0,0 +1,588 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/joy_tracker/joy_tracker.cpp + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/joy_tracker - joy_tracker.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:6614246.5 %
    Date:2024-04-18 23:11:36Functions:71838.9 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : /* includes //{ */
    +       2             : 
    +       3             : #include <ros/ros.h>
    +       4             : #include <ros/package.h>
    +       5             : 
    +       6             : #include <mrs_uav_managers/tracker.h>
    +       7             : 
    +       8             : #include <nav_msgs/Odometry.h>
    +       9             : #include <sensor_msgs/Joy.h>
    +      10             : 
    +      11             : #include <mrs_lib/profiler.h>
    +      12             : #include <mrs_lib/mutex.h>
    +      13             : #include <mrs_lib/attitude_converter.h>
    +      14             : #include <mrs_lib/subscribe_handler.h>
    +      15             : #include <mrs_lib/geometry/cyclic.h>
    +      16             : 
    +      17             : #include <mrs_msgs/VelocityReferenceSrv.h>
    +      18             : 
    +      19             : //}
    +      20             : 
    +      21             : /* defines //{ */
    +      22             : 
    +      23             : #define STOP_THR 1e-3
    +      24             : 
    +      25             : //}
    +      26             : 
    +      27             : /* using //{ */
    +      28             : 
    +      29             : using vec2_t = mrs_lib::geometry::vec_t<2>;
    +      30             : using vec3_t = mrs_lib::geometry::vec_t<3>;
    +      31             : 
    +      32             : using radians  = mrs_lib::geometry::radians;
    +      33             : using sradians = mrs_lib::geometry::sradians;
    +      34             : 
    +      35             : //}
    +      36             : 
    +      37             : namespace mrs_uav_trackers
    +      38             : {
    +      39             : 
    +      40             : namespace joy_tracker
    +      41             : {
    +      42             : 
    +      43             : /* //{ class JoyTracker */
    +      44             : 
    +      45             : class JoyTracker : public mrs_uav_managers::Tracker {
    +      46             : public:
    +      47             :   bool initialize(const ros::NodeHandle &nh, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t> common_handlers,
    +      48             :                   std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t> private_handlers);
    +      49             : 
    +      50             :   std::tuple<bool, std::string> activate(const std::optional<mrs_msgs::TrackerCommand> &last_tracker_cmd);
    +      51             :   void                          deactivate(void);
    +      52             :   bool                          resetStatic(void);
    +      53             : 
    +      54             :   std::optional<mrs_msgs::TrackerCommand>   update(const mrs_msgs::UavState &uav_state, const mrs_uav_managers::Controller::ControlOutput &last_control_output);
    +      55             :   const mrs_msgs::TrackerStatus             getStatus();
    +      56             :   const std_srvs::SetBoolResponse::ConstPtr enableCallbacks(const std_srvs::SetBoolRequest::ConstPtr &cmd);
    +      57             :   const std_srvs::TriggerResponse::ConstPtr switchOdometrySource(const mrs_msgs::UavState &new_uav_state);
    +      58             : 
    +      59             :   const mrs_msgs::ReferenceSrvResponse::ConstPtr           setReference(const mrs_msgs::ReferenceSrvRequest::ConstPtr &cmd);
    +      60             :   const mrs_msgs::VelocityReferenceSrvResponse::ConstPtr   setVelocityReference(const mrs_msgs::VelocityReferenceSrvRequest::ConstPtr &cmd);
    +      61             :   const mrs_msgs::TrajectoryReferenceSrvResponse::ConstPtr setTrajectoryReference(const mrs_msgs::TrajectoryReferenceSrvRequest::ConstPtr &cmd);
    +      62             : 
    +      63             :   const mrs_msgs::DynamicsConstraintsSrvResponse::ConstPtr setConstraints(const mrs_msgs::DynamicsConstraintsSrvRequest::ConstPtr &cmd);
    +      64             : 
    +      65             :   const std_srvs::TriggerResponse::ConstPtr hover(const std_srvs::TriggerRequest::ConstPtr &cmd);
    +      66             :   const std_srvs::TriggerResponse::ConstPtr startTrajectoryTracking(const std_srvs::TriggerRequest::ConstPtr &cmd);
    +      67             :   const std_srvs::TriggerResponse::ConstPtr stopTrajectoryTracking(const std_srvs::TriggerRequest::ConstPtr &cmd);
    +      68             :   const std_srvs::TriggerResponse::ConstPtr resumeTrajectoryTracking(const std_srvs::TriggerRequest::ConstPtr &cmd);
    +      69             :   const std_srvs::TriggerResponse::ConstPtr gotoTrajectoryStart(const std_srvs::TriggerRequest::ConstPtr &cmd);
    +      70             : 
    +      71             : private:
    +      72             :   ros::NodeHandle nh_;
    +      73             : 
    +      74             :   std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t>  common_handlers_;
    +      75             :   std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t> private_handlers_;
    +      76             : 
    +      77             :   bool callbacks_enabled_ = true;
    +      78             : 
    +      79             :   std::string _uav_name_;
    +      80             : 
    +      81             :   bool is_initialized_ = false;
    +      82             :   bool is_active_      = false;
    +      83             : 
    +      84             :   ros::Time last_update;
    +      85             : 
    +      86             :   // | ------------------------ uav state ----------------------- |
    +      87             : 
    +      88             :   mrs_msgs::UavState uav_state_;
    +      89             :   bool               got_uav_state_ = false;
    +      90             :   std::mutex         mutex_uav_state_;
    +      91             : 
    +      92             :   // | ------------------ dynamics constraints ------------------ |
    +      93             : 
    +      94             :   double     _heading_rate_;
    +      95             :   std::mutex mutex_constraints_;
    +      96             : 
    +      97             :   // | ------------------ tracker's inner state ----------------- |
    +      98             : 
    +      99             :   double     state_z_;
    +     100             :   double     state_heading_;
    +     101             :   std::mutex mutex_state_;
    +     102             : 
    +     103             :   // | ------------------- joystick subscriber ------------------ |
    +     104             : 
    +     105             :   mrs_lib::SubscribeHandler<sensor_msgs::Joy> sh_joystick_;
    +     106             : 
    +     107             :   double _max_tilt_;
    +     108             :   double _vertical_speed_;
    +     109             : 
    +     110             :   // channel numbers and channel multipliers
    +     111             :   int    _channel_pitch_;
    +     112             :   int    _channel_roll_;
    +     113             :   int    _channel_heading_;
    +     114             :   int    _channel_throttle_;
    +     115             :   double _channel_mult_pitch_;
    +     116             :   double _channel_mult_roll_;
    +     117             :   double _channel_mult_heading_;
    +     118             :   double _channel_mult_throttle_;
    +     119             : 
    +     120             :   // | ------------------------ profiler ------------------------ |
    +     121             : 
    +     122             :   mrs_lib::Profiler profiler_;
    +     123             :   bool              _profiler_enabled_ = false;
    +     124             : };
    +     125             : 
    +     126             : //}
    +     127             : 
    +     128             : // | -------------- tracker's interface routines -------------- |
    +     129             : 
    +     130             : /* //{ initialize() */
    +     131             : 
    +     132          91 : bool JoyTracker::initialize(const ros::NodeHandle &nh, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t> common_handlers,
    +     133             :                             std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t> private_handlers) {
    +     134             : 
    +     135          91 :   this->common_handlers_  = common_handlers;
    +     136          91 :   this->private_handlers_ = private_handlers;
    +     137             : 
    +     138          91 :   _uav_name_ = common_handlers->uav_name;
    +     139             : 
    +     140          91 :   nh_ = nh;
    +     141             : 
    +     142          91 :   ros::Time::waitForValid();
    +     143             : 
    +     144             :   // --------------------------------------------------------------
    +     145             :   // |                     loading parameters                     |
    +     146             :   // --------------------------------------------------------------
    +     147             : 
    +     148             :   // | ---------- loading params using the parent's nh ---------- |
    +     149             : 
    +     150         182 :   mrs_lib::ParamLoader param_loader_parent(common_handlers->parent_nh, "ControlManager");
    +     151             : 
    +     152          91 :   param_loader_parent.loadParam("enable_profiler", _profiler_enabled_);
    +     153             : 
    +     154          91 :   if (!param_loader_parent.loadedSuccessfully()) {
    +     155           0 :     ROS_ERROR("[JoyTracker]: Could not load all parameters!");
    +     156           0 :     return false;
    +     157             :   }
    +     158             : 
    +     159             :   // | ---------------- load plugin's parameters ---------------- |
    +     160             : 
    +     161          91 :   private_handlers->param_loader->addYamlFile(ros::package::getPath("mrs_uav_trackers") + "/config/private/joy_tracker.yaml");
    +     162          91 :   private_handlers->param_loader->addYamlFile(ros::package::getPath("mrs_uav_trackers") + "/config/public/joy_tracker.yaml");
    +     163             : 
    +     164         182 :   const std::string yaml_prefix = "mrs_uav_trackers/joy_tracker/";
    +     165             : 
    +     166          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "vertical_tracker/vertical_speed", _vertical_speed_);
    +     167             : 
    +     168          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "max_tilt", _max_tilt_);
    +     169             : 
    +     170          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "heading_tracker/heading_rate", _heading_rate_);
    +     171             : 
    +     172             :   // load channels
    +     173          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "channels/pitch", _channel_pitch_);
    +     174          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "channels/roll", _channel_roll_);
    +     175          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "channels/heading", _channel_heading_);
    +     176          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "channels/throttle", _channel_throttle_);
    +     177             : 
    +     178             :   // load channel multipliers
    +     179          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "channel_multipliers/pitch", _channel_mult_pitch_);
    +     180          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "channel_multipliers/roll", _channel_mult_roll_);
    +     181          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "channel_multipliers/heading", _channel_mult_heading_);
    +     182          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "channel_multipliers/throttle", _channel_mult_throttle_);
    +     183             : 
    +     184          91 :   if (!private_handlers->param_loader->loadedSuccessfully()) {
    +     185           0 :     ROS_ERROR("[JoyTracker]: could not load all parameters!");
    +     186           0 :     return false;
    +     187             :   }
    +     188             : 
    +     189             :   // | ------------------------ profiler ------------------------ |
    +     190             : 
    +     191          91 :   profiler_ = mrs_lib::Profiler(common_handlers->parent_nh, "JoyTracker", _profiler_enabled_);
    +     192             : 
    +     193             :   // | ----------------------- subscribers ---------------------- |
    +     194             : 
    +     195          91 :   mrs_lib::SubscribeHandlerOptions shopts;
    +     196          91 :   shopts.nh              = nh_;
    +     197          91 :   shopts.node_name       = "JoyTracker";
    +     198          91 :   shopts.queue_size      = 1;
    +     199          91 :   shopts.transport_hints = ros::TransportHints().tcpNoDelay();
    +     200             : 
    +     201          91 :   sh_joystick_ = mrs_lib::SubscribeHandler<sensor_msgs::Joy>(shopts, "joystick");
    +     202             : 
    +     203             :   // | --------------------- finish the init -------------------- |
    +     204             : 
    +     205          91 :   last_update = ros::Time(0);
    +     206             : 
    +     207          91 :   is_initialized_ = true;
    +     208             : 
    +     209          91 :   ROS_INFO("[JoyTracker]: initialized");
    +     210             : 
    +     211          91 :   return true;
    +     212             : }
    +     213             : 
    +     214             : //}
    +     215             : 
    +     216             : /* //{ activate() */
    +     217             : 
    +     218           0 : std::tuple<bool, std::string> JoyTracker::activate(const std::optional<mrs_msgs::TrackerCommand> &last_tracker_cmd) {
    +     219             : 
    +     220           0 :   std::stringstream ss;
    +     221             : 
    +     222           0 :   if (!got_uav_state_) {
    +     223             : 
    +     224           0 :     ss << "odometry not set";
    +     225           0 :     return std::tuple(false, ss.str());
    +     226             :   }
    +     227             : 
    +     228           0 :   if (!sh_joystick_.hasMsg()) {
    +     229             : 
    +     230           0 :     ss << "missing joystick goal";
    +     231           0 :     return std::tuple(false, ss.str());
    +     232             :   }
    +     233             : 
    +     234           0 :   auto uav_state = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +     235             : 
    +     236           0 :   double uav_heading = 0;
    +     237             : 
    +     238             :   try {
    +     239           0 :     uav_heading = mrs_lib::AttitudeConverter(uav_state.pose.orientation).getHeading();
    +     240             :   }
    +     241           0 :   catch (...) {
    +     242           0 :     ROS_ERROR_THROTTLE(1.0, "[JoyTracker]: could not calculate UAV heading");
    +     243             :   }
    +     244             : 
    +     245             :   // initialized the heading and z from the last tracker command / odometry
    +     246             :   {
    +     247           0 :     std::scoped_lock lock(mutex_state_);
    +     248             : 
    +     249           0 :     if (last_tracker_cmd) {
    +     250             : 
    +     251             :       // the last command is usable
    +     252           0 :       state_z_       = last_tracker_cmd->position.z;
    +     253           0 :       state_heading_ = last_tracker_cmd->heading;
    +     254             : 
    +     255             :     } else {
    +     256             : 
    +     257           0 :       state_z_       = uav_state.pose.position.z;
    +     258           0 :       state_heading_ = uav_heading;
    +     259             : 
    +     260           0 :       ROS_WARN("[JoyTracker]: the previous command is not usable for activation, using Odometry instead");
    +     261             :     }
    +     262             :   }
    +     263             : 
    +     264           0 :   is_active_ = true;
    +     265             : 
    +     266           0 :   ss << "activated";
    +     267           0 :   ROS_INFO_STREAM("[JoyTracker]: " << ss.str());
    +     268             : 
    +     269           0 :   return std::tuple(true, ss.str());
    +     270             : }
    +     271             : 
    +     272             : //}
    +     273             : 
    +     274             : /* //{ deactivate() */
    +     275             : 
    +     276          20 : void JoyTracker::deactivate(void) {
    +     277             : 
    +     278          20 :   is_active_ = false;
    +     279             : 
    +     280          20 :   ROS_INFO("[JoyTracker]: deactivated");
    +     281          20 : }
    +     282             : 
    +     283             : //}
    +     284             : 
    +     285             : /* //{ resetStatic() */
    +     286             : 
    +     287           0 : bool JoyTracker::resetStatic(void) {
    +     288             : 
    +     289           0 :   return false;
    +     290             : }
    +     291             : 
    +     292             : //}
    +     293             : 
    +     294             : /* //{ update() */
    +     295             : 
    +     296      120314 : std::optional<mrs_msgs::TrackerCommand> JoyTracker::update(const mrs_msgs::UavState &                                          uav_state,
    +     297             :                                                            [[maybe_unused]] const mrs_uav_managers::Controller::ControlOutput &last_control_output) {
    +     298             : 
    +     299      360942 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("update");
    +     300      360942 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("JoyTracker::update", common_handlers_->scope_timer.logger, common_handlers_->scope_timer.enabled);
    +     301             : 
    +     302             :   {
    +     303      120314 :     std::scoped_lock lock(mutex_uav_state_);
    +     304             : 
    +     305      120314 :     uav_state_ = uav_state;
    +     306             : 
    +     307      120314 :     got_uav_state_ = true;
    +     308             :   }
    +     309             : 
    +     310      120314 :   double dt = (ros::Time::now() - last_update).toSec();
    +     311             : 
    +     312      120314 :   last_update = ros::Time::now();
    +     313             : 
    +     314             :   // up to this part the update() method is evaluated even when the tracker is not active
    +     315      120314 :   if (!is_active_) {
    +     316      120314 :     return {};
    +     317             :   }
    +     318             : 
    +     319           0 :   if (!sh_joystick_.hasMsg()) {
    +     320           0 :     return {};
    +     321             :   }
    +     322             : 
    +     323             :   // | ------------------ get the joystick data ----------------- |
    +     324             : 
    +     325           0 :   sensor_msgs::JoyConstPtr joy_data = sh_joystick_.getMsg();
    +     326             : 
    +     327           0 :   double desired_vertical_speed = _channel_mult_throttle_ * joy_data->axes[_channel_throttle_] * _vertical_speed_;
    +     328           0 :   double desired_heading_rate   = _channel_mult_heading_ * joy_data->axes[_channel_heading_] * _heading_rate_;
    +     329           0 :   double desired_pitch          = _channel_mult_pitch_ * joy_data->axes[_channel_pitch_] * _max_tilt_;
    +     330           0 :   double desired_roll           = _channel_mult_roll_ * joy_data->axes[_channel_roll_] * _max_tilt_;
    +     331             : 
    +     332             :   // | ----------------------- z tracking ----------------------- |
    +     333             : 
    +     334           0 :   state_z_ += desired_vertical_speed * dt;
    +     335             : 
    +     336             :   // | -------------------- heading tracking -------------------- |
    +     337             : 
    +     338           0 :   state_heading_ += desired_heading_rate * dt;
    +     339           0 :   state_heading_ = radians::wrap(state_heading_);
    +     340             : 
    +     341           0 :   ROS_INFO_THROTTLE(1.0, "[JoyTracker]: desired vert_speed: %.2f, heading_speed: %.2f, pitch: %.2f, roll: %.2f", desired_vertical_speed, desired_heading_rate,
    +     342             :                     desired_pitch, desired_roll);
    +     343             : 
    +     344           0 :   mrs_msgs::TrackerCommand tracker_cmd;
    +     345             : 
    +     346           0 :   tracker_cmd.header.stamp    = ros::Time::now();
    +     347           0 :   tracker_cmd.header.frame_id = uav_state.header.frame_id;
    +     348             : 
    +     349           0 :   tracker_cmd.use_position_vertical = true;
    +     350           0 :   tracker_cmd.position.z            = state_z_;
    +     351             : 
    +     352             :   // filling these anyway to allow visualization of the reference
    +     353           0 :   tracker_cmd.position.x = uav_state.pose.position.x;
    +     354           0 :   tracker_cmd.position.y = uav_state.pose.position.y;
    +     355             : 
    +     356           0 :   tracker_cmd.use_velocity_vertical = true;
    +     357           0 :   tracker_cmd.velocity.z            = desired_vertical_speed;
    +     358             : 
    +     359           0 :   tracker_cmd.use_heading_rate = 1;
    +     360           0 :   tracker_cmd.heading_rate     = desired_heading_rate;
    +     361             : 
    +     362             :   /* tracker_cmd.orientation     = mrs_lib::AttitudeConverter(desired_roll, desired_pitch, 0).setHeadingByYaw(state_heading_); */
    +     363           0 :   tracker_cmd.orientation     = mrs_lib::AttitudeConverter(desired_roll, desired_pitch, state_heading_);
    +     364           0 :   tracker_cmd.use_orientation = true;
    +     365             : 
    +     366           0 :   return {tracker_cmd};
    +     367             : }
    +     368             : 
    +     369             : //}
    +     370             : 
    +     371             : /* //{ getStatus() */
    +     372             : 
    +     373           0 : const mrs_msgs::TrackerStatus JoyTracker::getStatus() {
    +     374             : 
    +     375           0 :   mrs_msgs::TrackerStatus tracker_status;
    +     376             : 
    +     377           0 :   tracker_status.active            = is_active_;
    +     378           0 :   tracker_status.callbacks_enabled = callbacks_enabled_;
    +     379             : 
    +     380           0 :   return tracker_status;
    +     381             : }
    +     382             : 
    +     383             : //}
    +     384             : 
    +     385             : /* //{ enableCallbacks() */
    +     386             : 
    +     387         313 : const std_srvs::SetBoolResponse::ConstPtr JoyTracker::enableCallbacks(const std_srvs::SetBoolRequest::ConstPtr &cmd) {
    +     388             : 
    +     389         626 :   std_srvs::SetBoolResponse res;
    +     390         626 :   std::stringstream         ss;
    +     391             : 
    +     392         313 :   if (cmd->data != callbacks_enabled_) {
    +     393             : 
    +     394          19 :     callbacks_enabled_ = cmd->data;
    +     395             : 
    +     396          19 :     ss << "callbacks " << (callbacks_enabled_ ? "enabled" : "disabled");
    +     397          19 :     ROS_INFO_STREAM_THROTTLE(1.0, "[JoyTracker]: " << ss.str());
    +     398             : 
    +     399             :   } else {
    +     400             : 
    +     401         294 :     ss << "callbacks were already " << (callbacks_enabled_ ? "enabled" : "disabled");
    +     402         294 :     ROS_WARN_STREAM_THROTTLE(1.0, "[JoyTracker]: " << ss.str());
    +     403             :   }
    +     404             : 
    +     405         313 :   res.message = ss.str();
    +     406         313 :   res.success = true;
    +     407             : 
    +     408         626 :   return std_srvs::SetBoolResponse::ConstPtr(new std_srvs::SetBoolResponse(res));
    +     409             : }
    +     410             : 
    +     411             : //}
    +     412             : 
    +     413             : /* switchOdometrySource() //{ */
    +     414             : 
    +     415           0 : const std_srvs::TriggerResponse::ConstPtr JoyTracker::switchOdometrySource([[maybe_unused]] const mrs_msgs::UavState &new_uav_state) {
    +     416           0 :   return std_srvs::TriggerResponse::Ptr();
    +     417             : }
    +     418             : 
    +     419             : //}
    +     420             : 
    +     421             : /* //{ hover() */
    +     422             : 
    +     423           0 : const std_srvs::TriggerResponse::ConstPtr JoyTracker::hover([[maybe_unused]] const std_srvs::TriggerRequest::ConstPtr &cmd) {
    +     424             : 
    +     425           0 :   return std_srvs::TriggerResponse::Ptr();
    +     426             : }
    +     427             : 
    +     428             : //}
    +     429             : 
    +     430             : /* //{ startTrajectoryTracking() */
    +     431             : 
    +     432           0 : const std_srvs::TriggerResponse::ConstPtr JoyTracker::startTrajectoryTracking([[maybe_unused]] const std_srvs::TriggerRequest::ConstPtr &cmd) {
    +     433           0 :   return std_srvs::TriggerResponse::Ptr();
    +     434             : }
    +     435             : 
    +     436             : //}
    +     437             : 
    +     438             : /* //{ stopTrajectoryTracking() */
    +     439             : 
    +     440           0 : const std_srvs::TriggerResponse::ConstPtr JoyTracker::stopTrajectoryTracking([[maybe_unused]] const std_srvs::TriggerRequest::ConstPtr &cmd) {
    +     441           0 :   return std_srvs::TriggerResponse::Ptr();
    +     442             : }
    +     443             : 
    +     444             : //}
    +     445             : 
    +     446             : /* //{ resumeTrajectoryTracking() */
    +     447             : 
    +     448           0 : const std_srvs::TriggerResponse::ConstPtr JoyTracker::resumeTrajectoryTracking([[maybe_unused]] const std_srvs::TriggerRequest::ConstPtr &cmd) {
    +     449           0 :   return std_srvs::TriggerResponse::Ptr();
    +     450             : }
    +     451             : 
    +     452             : //}
    +     453             : 
    +     454             : /* //{ gotoTrajectoryStart() */
    +     455             : 
    +     456           0 : const std_srvs::TriggerResponse::ConstPtr JoyTracker::gotoTrajectoryStart([[maybe_unused]] const std_srvs::TriggerRequest::ConstPtr &cmd) {
    +     457           0 :   return std_srvs::TriggerResponse::Ptr();
    +     458             : }
    +     459             : 
    +     460             : //}
    +     461             : 
    +     462             : /* //{ setConstraints() */
    +     463             : 
    +     464         298 : const mrs_msgs::DynamicsConstraintsSrvResponse::ConstPtr JoyTracker::setConstraints([
    +     465             :     [maybe_unused]] const mrs_msgs::DynamicsConstraintsSrvRequest::ConstPtr &cmd) {
    +     466             : 
    +     467         298 :   return mrs_msgs::DynamicsConstraintsSrvResponse::Ptr();
    +     468             : }
    +     469             : 
    +     470             : //}
    +     471             : 
    +     472             : /* //{ setReference() */
    +     473             : 
    +     474           0 : const mrs_msgs::ReferenceSrvResponse::ConstPtr JoyTracker::setReference([[maybe_unused]] const mrs_msgs::ReferenceSrvRequest::ConstPtr &cmd) {
    +     475             : 
    +     476           0 :   return mrs_msgs::ReferenceSrvResponse::Ptr();
    +     477             : }
    +     478             : 
    +     479             : //}
    +     480             : 
    +     481             : /* //{ setVelocityReference() */
    +     482             : 
    +     483           0 : const mrs_msgs::VelocityReferenceSrvResponse::ConstPtr JoyTracker::setVelocityReference([
    +     484             :     [maybe_unused]] const mrs_msgs::VelocityReferenceSrvRequest::ConstPtr &cmd) {
    +     485           0 :   return mrs_msgs::VelocityReferenceSrvResponse::Ptr();
    +     486             : }
    +     487             : 
    +     488             : //}
    +     489             : 
    +     490             : /* //{ setTrajectoryReference() */
    +     491             : 
    +     492           4 : const mrs_msgs::TrajectoryReferenceSrvResponse::ConstPtr JoyTracker::setTrajectoryReference([
    +     493             :     [maybe_unused]] const mrs_msgs::TrajectoryReferenceSrvRequest::ConstPtr &cmd) {
    +     494           4 :   return mrs_msgs::TrajectoryReferenceSrvResponse::Ptr();
    +     495             : }
    +     496             : 
    +     497             : //}
    +     498             : 
    +     499             : }  // namespace joy_tracker
    +     500             : 
    +     501             : }  // namespace mrs_uav_trackers
    +     502             : 
    +     503             : #include <pluginlib/class_list_macros.h>
    +     504          91 : PLUGINLIB_EXPORT_CLASS(mrs_uav_trackers::joy_tracker::JoyTracker, mrs_uav_managers::Tracker)
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/joy_tracker/joy_tracker.cpp.gcov.overview.html b/mrs_uav_trackers/src/joy_tracker/joy_tracker.cpp.gcov.overview.html new file mode 100644 index 0000000000..e3fb54a601 --- /dev/null +++ b/mrs_uav_trackers/src/joy_tracker/joy_tracker.cpp.gcov.overview.html @@ -0,0 +1,146 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/joy_tracker/joy_tracker.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_trackers/src/joy_tracker/joy_tracker.cpp.gcov.png b/mrs_uav_trackers/src/joy_tracker/joy_tracker.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..b07281049e6b3ff0652e5eed36bda1c0faa868e7 GIT binary patch literal 1740 zcmV;-1~d7IP)QIt;}fm==}}m=>S|rvFv~_$T=*+2ZUWiSx2EnYmnjEDOnI-!!Xvp7r@> zk{T!9O**$I1F#8Yi*`fHGE#wqQZtMdLlBV8SfR}Tsf=Xv=sFIP4#z;ssBR^d9Pzyd zZ&E4FXRH=AdNM|<_KGC~nWD972CthKIoS`)j0>OES`n8FL^rq}5Uor^-Wtd-T2rpc z)@ZtQ45UtCNM<^`Ci!iK7gPt!8Z#6UpUJHeYdOXXzyarHEYwq^s5UxkgaKE_jA-VN z?ci+_=rmv%lQKF6U`-KtgHf?j0n(}xs*VvOXR((3h(4z{{Qf5isHngTNdRiABi(2! zItXC+l)_jUR=qY*^Q@lWs?_7fwKIlv1EDiI9q%;W1fGZnkRjTKl>pn#i0Y23O~ZMR zueHCn)uQ?DRG9EA-1Crn5R#4xCV!_Y2t7XIr4*&t#F8YYF*ZieXcmWzAp;p!v(?En zg1}XNSqx5LI;k2ut$&wFPk<_W>XVa%(x#K3L)g0Wx!?cd}4W5(u& z0iNFQ?HG?7@BhZk0uL6xGd z0+Eb+&1inEKfZK2>#1S|6c`QAy{!P(3s^3xkd8|laR5jhjxj?9-OxWX%5Gn&;hAya zQ*#f~>YKAx!S>xgT%31d?!0(3 zWcyxIm(Dm*ldr8(jw7`N4Z0t<+Y9Aj0LG+_b9K_!zZ?(MJ@%euw`f(kcin%Lt7xhD zF&Gn~qF^=Ek6?AxyvYa(o1L}WaVQzL8Eej$IL1@a&T0gV)#d1TO#@>l2{V&7CZ{7d zrr>nW6ygx~nQb@kZHQlYE?S5`@RZHwEp8h_wA!ZdHe-}yc6;53=&=6sToy>oD2$Zy zTqX73et4mv?AdFs*QO7Y*W_ZDEc(GI6nm-?m%QI%xyfEL?fdnM){Nl8?wLLr?QXag zRS&ZzTuK)Wb``v|q_SBgHssTYGtMCV&UsV=4o6&GqfyA7`o5BTb z?Sjxjvbg!Nc2dY?JQs~NRiW|+8p<8$+QRs%7sJ+Pd~%bDzT<&ljJU%YE$N;22>J2R zT~}@W>rN2*_RZq0X57yqtBJ;-_B!H&|A>Ic27$2PhQM3Ik;g&c5dm?R%ISvj7IHYY z8*=y_*_!oZmyZ5eWn?qecQZ#_%PHT(jdXD^9xdtdbtU-`x_!VHp%eFTtp;p`jiDZ6 zz91Y^_h9egEtPT6jx=Kq0-BGGtmUkDob3||X0yN-vi4!0oWpA!HUmi2anwDD_-@g~ zeY-e%py3gaDjGkRVjgZz#`QQl+I+w!2gScO<2Iehc28j`W8jOL3b`h3!p9i+-rDc* zm@ntsE=EISL$@m0E{1G~_Z1&i;H#oXEP$d8)HQy|2c3_^tmP&NonN0-e&s}*F4{DD zpnuG^7ai?hqlsiOE~_O357n%&6N^QoS#g)~MT>8TLt}3JR^BR z + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/landoff_tracker + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/landoff_trackerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:43359273.1 %
    Date:2024-04-18 23:11:36Functions:213167.7 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    landoff_tracker.cpp +
    73.1%73.1%
    +
    73.1 %433 / 59267.7 %21 / 31
    <unnamed>73.1 %433 / 59267.7 %21 / 31
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/landoff_tracker/index-detail-sort-l.html b/mrs_uav_trackers/src/landoff_tracker/index-detail-sort-l.html new file mode 100644 index 0000000000..6edf5a3c85 --- /dev/null +++ b/mrs_uav_trackers/src/landoff_tracker/index-detail-sort-l.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/landoff_tracker + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/landoff_trackerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:43359273.1 %
    Date:2024-04-18 23:11:36Functions:213167.7 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    landoff_tracker.cpp +
    73.1%73.1%
    +
    73.1 %433 / 59267.7 %21 / 31
    <unnamed>73.1 %433 / 59267.7 %21 / 31
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/landoff_tracker/index-detail.html b/mrs_uav_trackers/src/landoff_tracker/index-detail.html new file mode 100644 index 0000000000..dc868dd00c --- /dev/null +++ b/mrs_uav_trackers/src/landoff_tracker/index-detail.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/landoff_tracker + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/landoff_trackerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:43359273.1 %
    Date:2024-04-18 23:11:36Functions:213167.7 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    landoff_tracker.cpp +
    73.1%73.1%
    +
    73.1 %433 / 59267.7 %21 / 31
    <unnamed>73.1 %433 / 59267.7 %21 / 31
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/landoff_tracker/index-sort-f.html b/mrs_uav_trackers/src/landoff_tracker/index-sort-f.html new file mode 100644 index 0000000000..6c414cf022 --- /dev/null +++ b/mrs_uav_trackers/src/landoff_tracker/index-sort-f.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/landoff_tracker + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/landoff_trackerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:43359273.1 %
    Date:2024-04-18 23:11:36Functions:213167.7 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    landoff_tracker.cpp +
    73.1%73.1%
    +
    73.1 %433 / 59267.7 %21 / 31
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/landoff_tracker/index-sort-l.html b/mrs_uav_trackers/src/landoff_tracker/index-sort-l.html new file mode 100644 index 0000000000..72c6efa339 --- /dev/null +++ b/mrs_uav_trackers/src/landoff_tracker/index-sort-l.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/landoff_tracker + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/landoff_trackerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:43359273.1 %
    Date:2024-04-18 23:11:36Functions:213167.7 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    landoff_tracker.cpp +
    73.1%73.1%
    +
    73.1 %433 / 59267.7 %21 / 31
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/landoff_tracker/index.html b/mrs_uav_trackers/src/landoff_tracker/index.html new file mode 100644 index 0000000000..c405131c45 --- /dev/null +++ b/mrs_uav_trackers/src/landoff_tracker/index.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/landoff_tracker + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/landoff_trackerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:43359273.1 %
    Date:2024-04-18 23:11:36Functions:213167.7 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    landoff_tracker.cpp +
    73.1%73.1%
    +
    73.1 %433 / 59267.7 %21 / 31
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/landoff_tracker/landoff_tracker.cpp.func-sort-c.html b/mrs_uav_trackers/src/landoff_tracker/landoff_tracker.cpp.func-sort-c.html new file mode 100644 index 0000000000..ed43c83a3f --- /dev/null +++ b/mrs_uav_trackers/src/landoff_tracker/landoff_tracker.cpp.func-sort-c.html @@ -0,0 +1,204 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/landoff_tracker/landoff_tracker.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/landoff_tracker - landoff_tracker.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:43359273.1 %
    Date:2024-04-18 23:11:36Functions:213167.7 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_trackers::landoff_tracker::LandoffTracker::resetStatic()0
    mrs_uav_trackers::landoff_tracker::LandoffTracker::setReference(boost::shared_ptr<mrs_msgs::ReferenceSrvRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::landoff_tracker::LandoffTracker::stopVertical()0
    mrs_uav_trackers::landoff_tracker::LandoffTracker::gotoTrajectoryStart(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::landoff_tracker::LandoffTracker::setVelocityReference(boost::shared_ptr<mrs_msgs::VelocityReferenceSrvRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::landoff_tracker::LandoffTracker::switchOdometrySource(mrs_msgs::UavState_<std::allocator<void> > const&)0
    mrs_uav_trackers::landoff_tracker::LandoffTracker::stopTrajectoryTracking(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::landoff_tracker::LandoffTracker::startTrajectoryTracking(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::landoff_tracker::LandoffTracker::resumeTrajectoryTracking(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::landoff_tracker::LandoffTracker::hover(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::landoff_tracker::LandoffTracker::setTrajectoryReference(boost::shared_ptr<mrs_msgs::TrajectoryReferenceSrvRequest_<std::allocator<void> > const> const&)4
    mrs_uav_trackers::landoff_tracker::LandoffTracker::callbackLand(std_srvs::TriggerRequest_<std::allocator<void> >&, std_srvs::TriggerResponse_<std::allocator<void> >&)5
    mrs_uav_trackers::landoff_tracker::LandoffTracker::callbackELand(std_srvs::TriggerRequest_<std::allocator<void> >&, std_srvs::TriggerResponse_<std::allocator<void> >&)9
    mrs_uav_trackers::landoff_tracker::LandoffTracker::callbackTakeoff(mrs_msgs::Vec1Request_<std::allocator<void> >&, mrs_msgs::Vec1Response_<std::allocator<void> >&)20
    mrs_uav_trackers::landoff_tracker::LandoffTracker::activate[abi:cxx11](std::optional<mrs_msgs::TrackerCommand_<std::allocator<void> > > const&)45
    mrs_uav_trackers::landoff_tracker::LandoffTracker::deactivate()61
    (anonymous namespace)::ProxyExec0::ProxyExec0()91
    mrs_uav_trackers::landoff_tracker::LandoffTracker::initialize(ros::NodeHandle const&, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t>, std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t>)91
    mrs_uav_trackers::landoff_tracker::LandoffTracker::changeState(mrs_uav_trackers::landoff_tracker::States_t)147
    mrs_uav_trackers::landoff_tracker::LandoffTracker::changeStateHorizontal(mrs_uav_trackers::landoff_tracker::States_t)180
    mrs_uav_trackers::landoff_tracker::LandoffTracker::changeStateVertical(mrs_uav_trackers::landoff_tracker::States_t)220
    mrs_uav_trackers::landoff_tracker::LandoffTracker::setConstraints(boost::shared_ptr<mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> > const> const&)298
    mrs_uav_trackers::landoff_tracker::LandoffTracker::enableCallbacks(boost::shared_ptr<std_srvs::SetBoolRequest_<std::allocator<void> > const> const&)313
    mrs_uav_trackers::landoff_tracker::LandoffTracker::stopVerticalMotion()652
    mrs_uav_trackers::landoff_tracker::LandoffTracker::stopHorizontalMotion()652
    mrs_uav_trackers::landoff_tracker::LandoffTracker::getStatus()2210
    mrs_uav_trackers::landoff_tracker::LandoffTracker::decelerateVertical()4480
    mrs_uav_trackers::landoff_tracker::LandoffTracker::accelerateVertical()15845
    mrs_uav_trackers::landoff_tracker::LandoffTracker::stopHorizontal()20325
    mrs_uav_trackers::landoff_tracker::LandoffTracker::timerMain(ros::TimerEvent const&)23263
    mrs_uav_trackers::landoff_tracker::LandoffTracker::update(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_uav_managers::Controller::ControlOutput const&)120314
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/landoff_tracker/landoff_tracker.cpp.func.html b/mrs_uav_trackers/src/landoff_tracker/landoff_tracker.cpp.func.html new file mode 100644 index 0000000000..c101cf715b --- /dev/null +++ b/mrs_uav_trackers/src/landoff_tracker/landoff_tracker.cpp.func.html @@ -0,0 +1,204 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/landoff_tracker/landoff_tracker.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/landoff_tracker - landoff_tracker.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:43359273.1 %
    Date:2024-04-18 23:11:36Functions:213167.7 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    (anonymous namespace)::ProxyExec0::ProxyExec0()91
    mrs_uav_trackers::landoff_tracker::LandoffTracker::deactivate()61
    mrs_uav_trackers::landoff_tracker::LandoffTracker::initialize(ros::NodeHandle const&, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t>, std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t>)91
    mrs_uav_trackers::landoff_tracker::LandoffTracker::changeState(mrs_uav_trackers::landoff_tracker::States_t)147
    mrs_uav_trackers::landoff_tracker::LandoffTracker::resetStatic()0
    mrs_uav_trackers::landoff_tracker::LandoffTracker::callbackLand(std_srvs::TriggerRequest_<std::allocator<void> >&, std_srvs::TriggerResponse_<std::allocator<void> >&)5
    mrs_uav_trackers::landoff_tracker::LandoffTracker::setReference(boost::shared_ptr<mrs_msgs::ReferenceSrvRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::landoff_tracker::LandoffTracker::stopVertical()0
    mrs_uav_trackers::landoff_tracker::LandoffTracker::callbackELand(std_srvs::TriggerRequest_<std::allocator<void> >&, std_srvs::TriggerResponse_<std::allocator<void> >&)9
    mrs_uav_trackers::landoff_tracker::LandoffTracker::setConstraints(boost::shared_ptr<mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> > const> const&)298
    mrs_uav_trackers::landoff_tracker::LandoffTracker::stopHorizontal()20325
    mrs_uav_trackers::landoff_tracker::LandoffTracker::callbackTakeoff(mrs_msgs::Vec1Request_<std::allocator<void> >&, mrs_msgs::Vec1Response_<std::allocator<void> >&)20
    mrs_uav_trackers::landoff_tracker::LandoffTracker::enableCallbacks(boost::shared_ptr<std_srvs::SetBoolRequest_<std::allocator<void> > const> const&)313
    mrs_uav_trackers::landoff_tracker::LandoffTracker::accelerateVertical()15845
    mrs_uav_trackers::landoff_tracker::LandoffTracker::decelerateVertical()4480
    mrs_uav_trackers::landoff_tracker::LandoffTracker::stopVerticalMotion()652
    mrs_uav_trackers::landoff_tracker::LandoffTracker::changeStateVertical(mrs_uav_trackers::landoff_tracker::States_t)220
    mrs_uav_trackers::landoff_tracker::LandoffTracker::gotoTrajectoryStart(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::landoff_tracker::LandoffTracker::setVelocityReference(boost::shared_ptr<mrs_msgs::VelocityReferenceSrvRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::landoff_tracker::LandoffTracker::stopHorizontalMotion()652
    mrs_uav_trackers::landoff_tracker::LandoffTracker::switchOdometrySource(mrs_msgs::UavState_<std::allocator<void> > const&)0
    mrs_uav_trackers::landoff_tracker::LandoffTracker::changeStateHorizontal(mrs_uav_trackers::landoff_tracker::States_t)180
    mrs_uav_trackers::landoff_tracker::LandoffTracker::setTrajectoryReference(boost::shared_ptr<mrs_msgs::TrajectoryReferenceSrvRequest_<std::allocator<void> > const> const&)4
    mrs_uav_trackers::landoff_tracker::LandoffTracker::stopTrajectoryTracking(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::landoff_tracker::LandoffTracker::startTrajectoryTracking(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::landoff_tracker::LandoffTracker::resumeTrajectoryTracking(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::landoff_tracker::LandoffTracker::hover(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::landoff_tracker::LandoffTracker::update(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_uav_managers::Controller::ControlOutput const&)120314
    mrs_uav_trackers::landoff_tracker::LandoffTracker::activate[abi:cxx11](std::optional<mrs_msgs::TrackerCommand_<std::allocator<void> > > const&)45
    mrs_uav_trackers::landoff_tracker::LandoffTracker::getStatus()2210
    mrs_uav_trackers::landoff_tracker::LandoffTracker::timerMain(ros::TimerEvent const&)23263
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/landoff_tracker/landoff_tracker.cpp.gcov.frameset.html b/mrs_uav_trackers/src/landoff_tracker/landoff_tracker.cpp.gcov.frameset.html new file mode 100644 index 0000000000..469c4b6023 --- /dev/null +++ b/mrs_uav_trackers/src/landoff_tracker/landoff_tracker.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/landoff_tracker/landoff_tracker.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_trackers/src/landoff_tracker/landoff_tracker.cpp.gcov.html b/mrs_uav_trackers/src/landoff_tracker/landoff_tracker.cpp.gcov.html new file mode 100644 index 0000000000..11b625130d --- /dev/null +++ b/mrs_uav_trackers/src/landoff_tracker/landoff_tracker.cpp.gcov.html @@ -0,0 +1,1636 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/landoff_tracker/landoff_tracker.cpp + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/landoff_tracker - landoff_tracker.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:43359273.1 %
    Date:2024-04-18 23:11:36Functions:213167.7 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : /* includes //{ */
    +       2             : 
    +       3             : #include <ros/ros.h>
    +       4             : #include <ros/package.h>
    +       5             : 
    +       6             : #include <mrs_uav_managers/tracker.h>
    +       7             : 
    +       8             : #include <mrs_msgs/Vec1.h>
    +       9             : #include <mrs_msgs/UavState.h>
    +      10             : #include <mrs_msgs/VelocityReferenceSrv.h>
    +      11             : 
    +      12             : #include <mrs_lib/profiler.h>
    +      13             : #include <mrs_lib/mutex.h>
    +      14             : #include <mrs_lib/attitude_converter.h>
    +      15             : #include <mrs_lib/utils.h>
    +      16             : #include <mrs_lib/geometry/cyclic.h>
    +      17             : #include <mrs_lib/geometry/misc.h>
    +      18             : 
    +      19             : //}
    +      20             : 
    +      21             : /* defines //{ */
    +      22             : 
    +      23             : #define STOP_THR 1e-3
    +      24             : 
    +      25             : //}
    +      26             : 
    +      27             : /* using //{ */
    +      28             : 
    +      29             : using vec2_t = mrs_lib::geometry::vec_t<2>;
    +      30             : using vec3_t = mrs_lib::geometry::vec_t<3>;
    +      31             : 
    +      32             : using radians  = mrs_lib::geometry::radians;
    +      33             : using sradians = mrs_lib::geometry::sradians;
    +      34             : 
    +      35             : //}
    +      36             : 
    +      37             : namespace mrs_uav_trackers
    +      38             : {
    +      39             : 
    +      40             : namespace landoff_tracker
    +      41             : {
    +      42             : 
    +      43             : /* //{ class LandoffTracker */
    +      44             : 
    +      45             : // state machine
    +      46             : typedef enum
    +      47             : {
    +      48             : 
    +      49             :   IDLE_STATE,
    +      50             :   LANDED_STATE,
    +      51             :   STOP_MOTION_STATE,
    +      52             :   HOVER_STATE,
    +      53             :   ACCELERATING_STATE,
    +      54             :   DECELERATING_STATE,
    +      55             :   STOPPING_STATE,
    +      56             : 
    +      57             : } States_t;
    +      58             : 
    +      59             : const char* state_names[7] = {
    +      60             : 
    +      61             :     "IDLING", "LANDED", "STOPPING_MOTION", "HOVERING", "ACCELERATING", "DECELERATING", "STOPPING"};
    +      62             : 
    +      63             : class LandoffTracker : public mrs_uav_managers::Tracker {
    +      64             : public:
    +      65             :   bool initialize(const ros::NodeHandle& nh, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t> common_handlers,
    +      66             :                   std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t> private_handlers);
    +      67             : 
    +      68             :   std::tuple<bool, std::string> activate(const std::optional<mrs_msgs::TrackerCommand>& last_tracker_cmd);
    +      69             :   void                          deactivate(void);
    +      70             :   bool                          resetStatic(void);
    +      71             : 
    +      72             :   std::optional<mrs_msgs::TrackerCommand>   update(const mrs_msgs::UavState& uav_state, const mrs_uav_managers::Controller::ControlOutput& last_control_output);
    +      73             :   const mrs_msgs::TrackerStatus             getStatus();
    +      74             :   const std_srvs::SetBoolResponse::ConstPtr enableCallbacks(const std_srvs::SetBoolRequest::ConstPtr& cmd);
    +      75             :   const std_srvs::TriggerResponse::ConstPtr switchOdometrySource(const mrs_msgs::UavState& new_uav_state);
    +      76             : 
    +      77             :   const mrs_msgs::ReferenceSrvResponse::ConstPtr           setReference(const mrs_msgs::ReferenceSrvRequest::ConstPtr& cmd);
    +      78             :   const mrs_msgs::VelocityReferenceSrvResponse::ConstPtr   setVelocityReference(const mrs_msgs::VelocityReferenceSrvRequest::ConstPtr& cmd);
    +      79             :   const mrs_msgs::TrajectoryReferenceSrvResponse::ConstPtr setTrajectoryReference(const mrs_msgs::TrajectoryReferenceSrvRequest::ConstPtr& cmd);
    +      80             : 
    +      81             :   const std_srvs::TriggerResponse::ConstPtr hover(const std_srvs::TriggerRequest::ConstPtr& cmd);
    +      82             :   const std_srvs::TriggerResponse::ConstPtr startTrajectoryTracking(const std_srvs::TriggerRequest::ConstPtr& cmd);
    +      83             :   const std_srvs::TriggerResponse::ConstPtr stopTrajectoryTracking(const std_srvs::TriggerRequest::ConstPtr& cmd);
    +      84             :   const std_srvs::TriggerResponse::ConstPtr resumeTrajectoryTracking(const std_srvs::TriggerRequest::ConstPtr& cmd);
    +      85             :   const std_srvs::TriggerResponse::ConstPtr gotoTrajectoryStart(const std_srvs::TriggerRequest::ConstPtr& cmd);
    +      86             : 
    +      87             :   const mrs_msgs::DynamicsConstraintsSrvResponse::ConstPtr setConstraints(const mrs_msgs::DynamicsConstraintsSrvRequest::ConstPtr& cmd);
    +      88             : 
    +      89             : private:
    +      90             :   bool callbacks_enabled_ = true;
    +      91             : 
    +      92             :   mrs_uav_managers::Controller::ControlOutput last_control_output_;
    +      93             :   std::mutex                                  mutex_last_control_output_;
    +      94             : 
    +      95             :   ros::NodeHandle nh_;
    +      96             :   std::string     _uav_name_;
    +      97             : 
    +      98             :   std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t>  common_handlers_;
    +      99             :   std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t> private_handlers_;
    +     100             : 
    +     101             :   // main timer
    +     102             :   void       timerMain(const ros::TimerEvent& event);
    +     103             :   ros::Timer timer_main_;
    +     104             :   std::mutex mutex_main_timer_;
    +     105             : 
    +     106             :   // | ------------------------ uav state ----------------------- |
    +     107             : 
    +     108             :   mrs_msgs::UavState uav_state_;
    +     109             :   bool               got_uav_state_ = false;
    +     110             :   std::mutex         mutex_uav_state_;
    +     111             : 
    +     112             :   // | ---------------- the tracker's inner state --------------- |
    +     113             : 
    +     114             :   int    _main_timer_rate_;
    +     115             :   double _landing_reference_;
    +     116             :   double _tracker_dt_;
    +     117             :   bool   is_initialized_ = false;
    +     118             :   bool   is_active_      = false;
    +     119             : 
    +     120             :   bool   _takeoff_disable_lateral_gains_ = false;
    +     121             :   double _takeoff_disable_lateral_gains_z_;
    +     122             : 
    +     123             :   // | --------------- the tracker's state machine -------------- |
    +     124             : 
    +     125             :   States_t current_state_vertical_    = IDLE_STATE;
    +     126             :   States_t previous_state_vertical_   = IDLE_STATE;
    +     127             :   States_t current_state_horizontal_  = IDLE_STATE;
    +     128             :   States_t previous_state_horizontal_ = IDLE_STATE;
    +     129             : 
    +     130             :   void changeStateHorizontal(States_t new_state);
    +     131             :   void changeStateVertical(States_t new_state);
    +     132             :   void changeState(States_t new_state);
    +     133             : 
    +     134             :   std::atomic<bool> taking_off_ = false;
    +     135             :   std::atomic<bool> landing_    = false;
    +     136             :   std::atomic<bool> elanding_   = false;
    +     137             : 
    +     138             :   std::atomic<bool> cause_failsafe_ = false;
    +     139             : 
    +     140             :   void stopHorizontalMotion(void);
    +     141             :   void stopVerticalMotion(void);
    +     142             :   void accelerateVertical(void);
    +     143             :   void decelerateVertical(void);
    +     144             :   void stopHorizontal(void);
    +     145             :   void stopVertical(void);
    +     146             : 
    +     147             :   // | --------------- takeoff / landing services --------------- |
    +     148             : 
    +     149             :   ros::ServiceServer service_takeoff_;
    +     150             :   ros::ServiceServer service_land_;
    +     151             :   ros::ServiceServer service_eland_;
    +     152             : 
    +     153             :   bool callbackTakeoff(mrs_msgs::Vec1::Request& req, mrs_msgs::Vec1::Response& res);
    +     154             :   bool callbackLand(std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res);
    +     155             :   bool callbackELand(std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res);
    +     156             : 
    +     157             :   // | ------------------ dynamics constraints ------------------ |
    +     158             : 
    +     159             :   double _horizontal_speed_;
    +     160             :   double _vertical_speed_;
    +     161             :   double _takeoff_speed_;
    +     162             :   double _landing_speed_;
    +     163             :   double _elanding_speed_;
    +     164             : 
    +     165             :   double _horizontal_acceleration_;
    +     166             :   double _vertical_acceleration_;
    +     167             :   double _takeoff_acceleration_;
    +     168             :   double _landing_acceleration_;
    +     169             :   double _elanding_acceleration_;
    +     170             : 
    +     171             :   double _heading_rate_;
    +     172             :   double _heading_gain_;
    +     173             : 
    +     174             :   double _max_position_difference_;
    +     175             : 
    +     176             :   // | -------------------------- goal -------------------------- |
    +     177             : 
    +     178             :   double            goal_x_, goal_y_, goal_z_, goal_heading_;
    +     179             :   std::atomic<bool> have_goal_ = false;
    +     180             :   std::mutex        mutex_goal_;
    +     181             : 
    +     182             :   // | ---------------- tracker's internal state ---------------- |
    +     183             : 
    +     184             :   double     state_x_, state_y_, state_z_, state_heading_;
    +     185             :   double     speed_x_, speed_y_, speed_heading_;
    +     186             :   double     current_heading_, current_vertical_direction_, current_vertical_speed_, current_horizontal_speed_;
    +     187             :   double     current_horizontal_acceleration_, current_vertical_acceleration_;
    +     188             :   std::mutex mutex_state_;
    +     189             : 
    +     190             :   // | -------------------- tracker's output -------------------- |
    +     191             : 
    +     192             :   mrs_msgs::TrackerCommand position_output_;
    +     193             : 
    +     194             :   // | ------------------------ profiler ------------------------ |
    +     195             : 
    +     196             :   mrs_lib::Profiler profiler_;
    +     197             :   bool              _profiler_enabled_ = false;
    +     198             : 
    +     199             :   // | ----------------------- constraints ---------------------- |
    +     200             : 
    +     201             :   mrs_msgs::DynamicsConstraints constraints_;
    +     202             :   std::mutex                    mutex_constraints_;
    +     203             : };
    +     204             : 
    +     205             : //}
    +     206             : 
    +     207             : // | -------------- tracker's interface routines -------------- |
    +     208             : 
    +     209             : /* //{ initialize() */
    +     210             : 
    +     211          91 : bool LandoffTracker::initialize(const ros::NodeHandle& nh, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t> common_handlers,
    +     212             :                                 std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t> private_handlers) {
    +     213             : 
    +     214          91 :   this->common_handlers_  = common_handlers;
    +     215          91 :   this->private_handlers_ = private_handlers;
    +     216             : 
    +     217          91 :   _uav_name_ = common_handlers->uav_name;
    +     218             : 
    +     219          91 :   nh_ = nh;
    +     220             : 
    +     221          91 :   ros::Time::waitForValid();
    +     222             : 
    +     223             :   // --------------------------------------------------------------
    +     224             :   // |                     loading parameters                     |
    +     225             :   // --------------------------------------------------------------
    +     226             : 
    +     227             :   // | ---------- loading params using the parent's nh ---------- |
    +     228             : 
    +     229         182 :   mrs_lib::ParamLoader param_loader_parent(common_handlers->parent_nh, "ControlManager");
    +     230             : 
    +     231          91 :   param_loader_parent.loadParam("enable_profiler", _profiler_enabled_);
    +     232             : 
    +     233          91 :   if (!param_loader_parent.loadedSuccessfully()) {
    +     234           0 :     ROS_ERROR("[LandoffTracker]: Could not load all parameters!");
    +     235           0 :     return false;
    +     236             :   }
    +     237             : 
    +     238             :   // | --------------- loading plugin's parameters -------------- |
    +     239             : 
    +     240          91 :   private_handlers->param_loader->addYamlFile(ros::package::getPath("mrs_uav_trackers") + "/config/private/landoff_tracker.yaml");
    +     241          91 :   private_handlers->param_loader->addYamlFile(ros::package::getPath("mrs_uav_trackers") + "/config/public/landoff_tracker.yaml");
    +     242             : 
    +     243         182 :   const std::string yaml_prefix = "mrs_uav_trackers/landoff_tracker/";
    +     244             : 
    +     245          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "horizontal_tracker/horizontal_speed", _horizontal_speed_);
    +     246          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "horizontal_tracker/horizontal_acceleration", _horizontal_acceleration_);
    +     247             : 
    +     248          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "vertical_tracker/vertical_speed", _vertical_speed_);
    +     249          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "vertical_tracker/vertical_acceleration", _vertical_acceleration_);
    +     250             : 
    +     251          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "vertical_tracker/takeoff_speed", _takeoff_speed_);
    +     252          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "vertical_tracker/takeoff_acceleration", _takeoff_acceleration_);
    +     253             : 
    +     254          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "vertical_tracker/landing_speed", _landing_speed_);
    +     255          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "vertical_tracker/landing_acceleration", _landing_acceleration_);
    +     256             : 
    +     257          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "vertical_tracker/elanding_speed", _elanding_speed_);
    +     258          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "vertical_tracker/elanding_acceleration", _elanding_acceleration_);
    +     259             : 
    +     260          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "heading_tracker/heading_rate", _heading_rate_);
    +     261          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "heading_tracker/heading_gain", _heading_gain_);
    +     262             : 
    +     263          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "main_timer_rate", _main_timer_rate_);
    +     264             : 
    +     265          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "landing_reference", _landing_reference_);
    +     266             : 
    +     267          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "max_position_difference", _max_position_difference_);
    +     268             : 
    +     269          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "takeoff_disable_lateral_gains", _takeoff_disable_lateral_gains_);
    +     270          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "takeoff_disable_lateral_gains_z", _takeoff_disable_lateral_gains_z_);
    +     271             : 
    +     272          91 :   if (!private_handlers->param_loader->loadedSuccessfully()) {
    +     273           0 :     ROS_ERROR("[LandoffTracker]: Could not load all parameters!");
    +     274           0 :     return false;
    +     275             :   }
    +     276             : 
    +     277          91 :   _tracker_dt_ = 1.0 / double(_main_timer_rate_);
    +     278             : 
    +     279          91 :   ROS_INFO("[LandoffTracker]: tracker_dt: %f", _tracker_dt_);
    +     280             : 
    +     281          91 :   state_x_       = 0;
    +     282          91 :   state_y_       = 0;
    +     283          91 :   state_z_       = 0;
    +     284          91 :   state_heading_ = 0;
    +     285             : 
    +     286          91 :   speed_x_       = 0;
    +     287          91 :   speed_y_       = 0;
    +     288          91 :   speed_heading_ = 0;
    +     289             : 
    +     290          91 :   current_horizontal_speed_ = 0;
    +     291          91 :   current_vertical_speed_   = 0;
    +     292             : 
    +     293          91 :   current_horizontal_acceleration_ = 0;
    +     294          91 :   current_vertical_acceleration_   = 0;
    +     295             : 
    +     296          91 :   current_vertical_direction_ = 0;
    +     297             : 
    +     298          91 :   current_state_vertical_  = LANDED_STATE;
    +     299          91 :   previous_state_vertical_ = LANDED_STATE;
    +     300             : 
    +     301          91 :   current_state_horizontal_  = LANDED_STATE;
    +     302          91 :   previous_state_horizontal_ = LANDED_STATE;
    +     303             : 
    +     304             :   // | ------------------------ profiler ------------------------ |
    +     305             : 
    +     306          91 :   profiler_ = mrs_lib::Profiler(common_handlers->parent_nh, "LandoffTracker", _profiler_enabled_);
    +     307             : 
    +     308             :   // | ------------------------ services ------------------------ |
    +     309             : 
    +     310          91 :   service_takeoff_ = nh_.advertiseService("takeoff", &LandoffTracker::callbackTakeoff, this);
    +     311          91 :   service_land_    = nh_.advertiseService("land", &LandoffTracker::callbackLand, this);
    +     312          91 :   service_eland_   = nh_.advertiseService("eland", &LandoffTracker::callbackELand, this);
    +     313             : 
    +     314             :   // | ------------------------- timers ------------------------- |
    +     315             : 
    +     316          91 :   timer_main_ = nh_.createTimer(ros::Rate(_main_timer_rate_), &LandoffTracker::timerMain, this, false, false);
    +     317             : 
    +     318             :   // | ----------------------- finish init ---------------------- |
    +     319             : 
    +     320          91 :   is_initialized_ = true;
    +     321             : 
    +     322          91 :   ROS_INFO("[LandoffTracker]: initialized");
    +     323             : 
    +     324          91 :   return true;
    +     325             : }
    +     326             : 
    +     327             : //}
    +     328             : 
    +     329             : /* //{ activate() */
    +     330             : 
    +     331          45 : std::tuple<bool, std::string> LandoffTracker::activate([[maybe_unused]] const std::optional<mrs_msgs::TrackerCommand>& last_tracker_cmd) {
    +     332             : 
    +     333          90 :   std::stringstream ss;
    +     334             : 
    +     335          45 :   if (!got_uav_state_) {
    +     336             : 
    +     337           0 :     ss << "odometry not set";
    +     338           0 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[LandoffTracker]: " << ss.str());
    +     339           0 :     return std::tuple(false, ss.str());
    +     340             :   }
    +     341             : 
    +     342             :   // copy member variables
    +     343          90 :   auto uav_state = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +     344             : 
    +     345             :   double uav_heading;
    +     346             : 
    +     347             :   try {
    +     348          45 :     uav_heading = mrs_lib::AttitudeConverter(uav_state.pose.orientation).getHeading();
    +     349             :   }
    +     350           0 :   catch (...) {
    +     351             : 
    +     352           0 :     ss << "could not initialize the UAV heading";
    +     353           0 :     ROS_ERROR_STREAM("[LandoffTracker]: " << ss.str());
    +     354           0 :     return std::tuple(false, ss.str());
    +     355             :   }
    +     356             : 
    +     357             :   // --------------------------------------------------------------
    +     358             :   // |                      initial condition                     |
    +     359             :   // --------------------------------------------------------------
    +     360             : 
    +     361             :   {
    +     362          90 :     std::scoped_lock lock(mutex_goal_);
    +     363             : 
    +     364             :     // the last command is usable
    +     365          45 :     state_x_       = uav_state.pose.position.x;
    +     366          45 :     state_y_       = uav_state.pose.position.y;
    +     367          45 :     state_z_       = uav_state.pose.position.z;
    +     368          45 :     state_heading_ = uav_heading;
    +     369             : 
    +     370          45 :     speed_x_         = uav_state.velocity.linear.x;
    +     371          45 :     speed_y_         = uav_state.velocity.linear.y;
    +     372          45 :     current_heading_ = atan2(speed_y_, speed_x_);
    +     373             : 
    +     374          45 :     current_horizontal_speed_ = sqrt(pow(speed_x_, 2) + pow(speed_y_, 2));
    +     375             : 
    +     376          45 :     current_vertical_speed_     = fabs(uav_state.velocity.linear.z);
    +     377          45 :     current_vertical_direction_ = uav_state.velocity.linear.z > 0 ? +1 : -1;
    +     378             : 
    +     379          45 :     current_horizontal_acceleration_ = 0;
    +     380          45 :     current_vertical_acceleration_   = 0;
    +     381             : 
    +     382          45 :     goal_heading_ = uav_heading;
    +     383             : 
    +     384          45 :     ROS_INFO("[LandoffTracker]: initial condition: x: %.2f, y: %.2f, z: %.2f, heading: %.2f", state_x_, state_y_, state_z_, state_heading_);
    +     385             :   }
    +     386             : 
    +     387             :   // --------------------------------------------------------------
    +     388             :   // |          horizontal initial conditions prediction          |
    +     389             :   // --------------------------------------------------------------
    +     390             : 
    +     391             :   double horizontal_t_stop, horizontal_stop_dist, stop_dist_x, stop_dist_y;
    +     392             : 
    +     393             :   {
    +     394          45 :     std::scoped_lock lock(mutex_state_);
    +     395             : 
    +     396          45 :     horizontal_t_stop    = current_horizontal_speed_ / _horizontal_acceleration_;
    +     397          45 :     horizontal_stop_dist = (horizontal_t_stop * current_horizontal_speed_) / 2.0;
    +     398          45 :     stop_dist_x          = cos(current_heading_) * horizontal_stop_dist;
    +     399          45 :     stop_dist_y          = sin(current_heading_) * horizontal_stop_dist;
    +     400             :   }
    +     401             : 
    +     402             :   // --------------------------------------------------------------
    +     403             :   // |           vertical initial conditions prediction           |
    +     404             :   // --------------------------------------------------------------
    +     405             : 
    +     406             :   double vertical_t_stop, vertical_stop_dist;
    +     407             : 
    +     408             :   {
    +     409          45 :     std::scoped_lock lock(mutex_state_);
    +     410             : 
    +     411          45 :     vertical_t_stop    = current_vertical_speed_ / _vertical_acceleration_;
    +     412          45 :     vertical_stop_dist = current_vertical_direction_ * (vertical_t_stop * current_vertical_speed_) / 2.0;
    +     413             :   }
    +     414             : 
    +     415             :   // --------------------------------------------------------------
    +     416             :   // |               heading initial condition prediction             |
    +     417             :   // --------------------------------------------------------------
    +     418             : 
    +     419             :   {
    +     420          45 :     std::scoped_lock lock(mutex_goal_, mutex_state_);
    +     421             : 
    +     422          45 :     goal_x_ = state_x_ + stop_dist_x;
    +     423          45 :     goal_y_ = state_y_ + stop_dist_y;
    +     424          45 :     goal_z_ = state_z_ + vertical_stop_dist;
    +     425             :   }
    +     426             : 
    +     427          45 :   landing_        = false;
    +     428          45 :   taking_off_     = false;
    +     429          45 :   is_active_      = true;
    +     430          45 :   have_goal_      = false;
    +     431          45 :   cause_failsafe_ = false;
    +     432             : 
    +     433          45 :   timer_main_.start();
    +     434             : 
    +     435             :   {
    +     436          90 :     std::scoped_lock lock(mutex_goal_);
    +     437             : 
    +     438          45 :     ROS_INFO("[LandoffTracker]: stopping goal: x: %.2f, y: %.2f, z: %.2f, heading: %.2f", goal_x_, goal_y_, goal_z_, goal_heading_);
    +     439             :   }
    +     440             : 
    +     441          45 :   changeState(STOP_MOTION_STATE);
    +     442             : 
    +     443          45 :   ss << "activated";
    +     444          45 :   ROS_INFO_STREAM("[LandoffTracker]: " << ss.str());
    +     445             : 
    +     446          45 :   return std::tuple(true, ss.str());
    +     447             : }
    +     448             : 
    +     449             : //}
    +     450             : 
    +     451             : /* //{ deactivate() */
    +     452             : 
    +     453          61 : void LandoffTracker::deactivate(void) {
    +     454             : 
    +     455          61 :   is_active_                = false;
    +     456          61 :   landing_                  = false;
    +     457          61 :   taking_off_               = false;
    +     458          61 :   current_state_vertical_   = IDLE_STATE;
    +     459          61 :   current_state_horizontal_ = IDLE_STATE;
    +     460             : 
    +     461          61 :   timer_main_.stop();
    +     462             : 
    +     463          61 :   ROS_INFO("[LandoffTracker]: deactivated");
    +     464          61 : }
    +     465             : 
    +     466             : //}
    +     467             : 
    +     468             : /* //{ resetStatic() */
    +     469             : 
    +     470           0 : bool LandoffTracker::resetStatic(void) {
    +     471             : 
    +     472           0 :   return false;
    +     473             : }
    +     474             : 
    +     475             : //}
    +     476             : 
    +     477             : /* //{ update() */
    +     478             : 
    +     479      120314 : std::optional<mrs_msgs::TrackerCommand> LandoffTracker::update(const mrs_msgs::UavState&                                           uav_state,
    +     480             :                                                                [[maybe_unused]] const mrs_uav_managers::Controller::ControlOutput& last_control_output) {
    +     481             : 
    +     482      360942 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("update");
    +     483      360942 :   mrs_lib::ScopeTimer timer = mrs_lib::ScopeTimer("LandoffTracker::update", common_handlers_->scope_timer.logger, common_handlers_->scope_timer.enabled);
    +     484             : 
    +     485             :   {
    +     486      120314 :     std::scoped_lock lock(mutex_uav_state_);
    +     487             : 
    +     488      120314 :     uav_state_ = uav_state;
    +     489             : 
    +     490      120314 :     got_uav_state_ = true;
    +     491             :   }
    +     492             : 
    +     493             :   // up to this part the update() method is evaluated even when the tracker is not active
    +     494      120314 :   if (!is_active_ || cause_failsafe_) {
    +     495      102825 :     return {};
    +     496             :   }
    +     497             : 
    +     498       17489 :   position_output_.header.stamp    = ros::Time::now();
    +     499       17489 :   position_output_.header.frame_id = uav_state_.header.frame_id;
    +     500             : 
    +     501             :   {
    +     502       17489 :     std::scoped_lock lock(mutex_state_);
    +     503             : 
    +     504       17489 :     position_output_.position.x = state_x_;
    +     505       17489 :     position_output_.position.y = state_y_;
    +     506       17489 :     position_output_.position.z = state_z_;
    +     507       17489 :     position_output_.heading    = state_heading_;
    +     508             : 
    +     509       17489 :     position_output_.velocity.x   = cos(current_heading_) * current_horizontal_speed_;
    +     510       17489 :     position_output_.velocity.y   = sin(current_heading_) * current_horizontal_speed_;
    +     511       17489 :     position_output_.velocity.z   = current_vertical_direction_ * current_vertical_speed_;
    +     512       17489 :     position_output_.heading_rate = speed_heading_;
    +     513             : 
    +     514       17489 :     position_output_.use_position_vertical   = 1;
    +     515       17489 :     position_output_.use_position_horizontal = 1;
    +     516       17489 :     position_output_.use_heading             = 1;
    +     517       17489 :     position_output_.use_heading_rate        = 1;
    +     518       17489 :     position_output_.use_velocity_vertical   = 1;
    +     519       17489 :     position_output_.use_velocity_horizontal = 1;
    +     520             :   }
    +     521             : 
    +     522             :   {
    +     523       34978 :     std::scoped_lock lock(mutex_last_control_output_);
    +     524             : 
    +     525       17489 :     last_control_output_ = last_control_output;
    +     526             :   }
    +     527             : 
    +     528       17489 :   if (_takeoff_disable_lateral_gains_ && taking_off_ && uav_state_.pose.position.z < _takeoff_disable_lateral_gains_z_) {
    +     529           0 :     position_output_.disable_position_gains = true;
    +     530             :   } else {
    +     531       17489 :     position_output_.disable_position_gains = false;
    +     532             :   }
    +     533             : 
    +     534       17489 :   if (taking_off_) {
    +     535        8633 :     position_output_.disable_antiwindups = true;
    +     536             :   } else {
    +     537        8856 :     position_output_.disable_antiwindups = false;
    +     538             :   }
    +     539             : 
    +     540       17489 :   return {position_output_};
    +     541             : }
    +     542             : 
    +     543             : //}
    +     544             : 
    +     545             : /* //{ getStatus() */
    +     546             : 
    +     547        2210 : const mrs_msgs::TrackerStatus LandoffTracker::getStatus() {
    +     548             : 
    +     549        2210 :   mrs_msgs::TrackerStatus tracker_status;
    +     550             : 
    +     551        2210 :   tracker_status.active            = is_active_;
    +     552        2210 :   tracker_status.callbacks_enabled = callbacks_enabled_;
    +     553             : 
    +     554        2210 :   bool hovering = current_state_vertical_ == HOVER_STATE && current_state_horizontal_ == HOVER_STATE;
    +     555        2210 :   bool idling   = current_state_vertical_ == IDLE_STATE && current_state_horizontal_ == IDLE_STATE;
    +     556             : 
    +     557        2210 :   tracker_status.have_goal = landing_ || taking_off_ || !(hovering || idling);
    +     558             : 
    +     559        2210 :   tracker_status.tracking_trajectory = false;
    +     560             : 
    +     561        2210 :   return tracker_status;
    +     562             : }
    +     563             : 
    +     564             : //}
    +     565             : 
    +     566             : /* //{ enableCallbacks() */
    +     567             : 
    +     568         313 : const std_srvs::SetBoolResponse::ConstPtr LandoffTracker::enableCallbacks(const std_srvs::SetBoolRequest::ConstPtr& cmd) {
    +     569             : 
    +     570         626 :   std_srvs::SetBoolResponse res;
    +     571         626 :   std::stringstream         ss;
    +     572             : 
    +     573         313 :   if (cmd->data != callbacks_enabled_) {
    +     574             : 
    +     575          19 :     callbacks_enabled_ = cmd->data;
    +     576             : 
    +     577          19 :     ss << "callbacks " << (callbacks_enabled_ ? "enabled" : "disabled");
    +     578          19 :     ROS_INFO_STREAM_THROTTLE(1.0, "[LandoffTrakcer]: " << ss.str());
    +     579             : 
    +     580             :   } else {
    +     581             : 
    +     582         294 :     ss << "callbacks were already " << (callbacks_enabled_ ? "enabled" : "disabled");
    +     583         294 :     ROS_WARN_STREAM_THROTTLE(1.0, "[LandoffTrakcer]: " << ss.str());
    +     584             :   }
    +     585             : 
    +     586         313 :   res.message = ss.str();
    +     587         313 :   res.success = true;
    +     588             : 
    +     589         626 :   return std_srvs::SetBoolResponse::ConstPtr(new std_srvs::SetBoolResponse(res));
    +     590             : }
    +     591             : 
    +     592             : //}
    +     593             : 
    +     594             : /* switchOdometrySource() //{ */
    +     595             : 
    +     596           0 : const std_srvs::TriggerResponse::ConstPtr LandoffTracker::switchOdometrySource([[maybe_unused]] const mrs_msgs::UavState& new_uav_state) {
    +     597             : 
    +     598           0 :   std::scoped_lock lock(mutex_goal_, mutex_state_);
    +     599             : 
    +     600           0 :   auto uav_state = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +     601             : 
    +     602           0 :   double old_heading  = 0;
    +     603           0 :   double new_heading  = 0;
    +     604           0 :   bool   got_headings = true;
    +     605             : 
    +     606             :   try {
    +     607           0 :     old_heading = mrs_lib::AttitudeConverter(uav_state.pose.orientation).getHeading();
    +     608             :   }
    +     609           0 :   catch (...) {
    +     610           0 :     ROS_ERROR_THROTTLE(1.0, "[LandoffTracker]: could not calculate the old UAV heading");
    +     611           0 :     got_headings = false;
    +     612             :   }
    +     613             : 
    +     614             :   try {
    +     615           0 :     new_heading = mrs_lib::AttitudeConverter(new_uav_state.pose.orientation).getHeading();
    +     616             :   }
    +     617           0 :   catch (...) {
    +     618           0 :     ROS_ERROR_THROTTLE(1.0, "[LandoffTracker]: could not calculate the new UAV heading");
    +     619           0 :     got_headings = false;
    +     620             :   }
    +     621             : 
    +     622           0 :   std_srvs::TriggerResponse res;
    +     623             : 
    +     624           0 :   if (!got_headings) {
    +     625           0 :     res.message = "could not calculate the heading difference";
    +     626           0 :     res.success = false;
    +     627             : 
    +     628           0 :     return std_srvs::TriggerResponse::ConstPtr(new std_srvs::TriggerResponse(res));
    +     629             :   }
    +     630             : 
    +     631             :   // | --------- recalculate the goal to new coordinates -------- |
    +     632             : 
    +     633           0 :   double dx       = new_uav_state.pose.position.x - uav_state.pose.position.x;
    +     634           0 :   double dy       = new_uav_state.pose.position.y - uav_state.pose.position.y;
    +     635           0 :   double dz       = new_uav_state.pose.position.z - uav_state.pose.position.z;
    +     636           0 :   double dheading = new_heading - old_heading;
    +     637             : 
    +     638           0 :   goal_x_ += dx;
    +     639           0 :   goal_y_ += dy;
    +     640           0 :   goal_z_ += dz;
    +     641           0 :   goal_heading_ += dheading;
    +     642             : 
    +     643             :   // | -------------------- update the state -------------------- |
    +     644             : 
    +     645           0 :   state_x_ += dx;
    +     646           0 :   state_y_ += dy;
    +     647           0 :   state_z_ += dz;
    +     648           0 :   state_heading_ += dheading;
    +     649             : 
    +     650           0 :   current_heading_ = atan2(goal_y_ - state_y_, goal_x_ - state_x_);
    +     651             : 
    +     652           0 :   res.message = "odometry source switched";
    +     653           0 :   res.success = true;
    +     654             : 
    +     655           0 :   return std_srvs::TriggerResponse::ConstPtr(new std_srvs::TriggerResponse(res));
    +     656             : }
    +     657             : 
    +     658             : //}
    +     659             : 
    +     660             : /* //{ hover() */
    +     661           0 : const std_srvs::TriggerResponse::ConstPtr LandoffTracker::hover([[maybe_unused]] const std_srvs::TriggerRequest::ConstPtr& cmd) {
    +     662             : 
    +     663           0 :   std::scoped_lock lock(mutex_main_timer_);
    +     664             : 
    +     665             :   // copy member variables
    +     666           0 :   auto uav_state = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +     667             : 
    +     668           0 :   auto [current_horizontal_speed, current_vertical_speed, current_heading, current_vertical_direction] =
    +     669           0 :       mrs_lib::get_mutexed(mutex_state_, current_horizontal_speed_, current_vertical_speed_, current_heading_, current_vertical_direction_);
    +     670             : 
    +     671           0 :   std_srvs::TriggerResponse res;
    +     672             : 
    +     673             :   // --------------------------------------------------------------
    +     674             :   // |          horizontal initial conditions prediction          |
    +     675             :   // --------------------------------------------------------------
    +     676             :   {
    +     677           0 :     std::scoped_lock lock(mutex_state_);
    +     678             : 
    +     679           0 :     current_horizontal_speed_ = sqrt(pow(uav_state.velocity.linear.x, 2) + pow(uav_state.velocity.linear.y, 2));
    +     680           0 :     current_vertical_speed_   = uav_state.velocity.linear.z;
    +     681           0 :     current_heading_          = atan2(uav_state.velocity.linear.y, uav_state.velocity.linear.x);
    +     682             :   }
    +     683             : 
    +     684             :   double horizontal_t_stop, horizontal_stop_dist, stop_dist_x, stop_dist_y;
    +     685             : 
    +     686           0 :   horizontal_t_stop    = current_horizontal_speed / _horizontal_acceleration_;
    +     687           0 :   horizontal_stop_dist = (horizontal_t_stop * current_horizontal_speed) / 2.0;
    +     688           0 :   stop_dist_x          = cos(current_heading) * horizontal_stop_dist;
    +     689           0 :   stop_dist_y          = sin(current_heading) * horizontal_stop_dist;
    +     690             : 
    +     691             :   // --------------------------------------------------------------
    +     692             :   // |           vertical initial conditions prediction           |
    +     693             :   // --------------------------------------------------------------
    +     694             : 
    +     695           0 :   double vertical_t_stop    = current_vertical_speed / _vertical_acceleration_;
    +     696           0 :   double vertical_stop_dist = current_vertical_direction * (vertical_t_stop * current_vertical_speed) / 2.0;
    +     697             : 
    +     698             :   // --------------------------------------------------------------
    +     699             :   // |                        set the goal                        |
    +     700             :   // --------------------------------------------------------------
    +     701             : 
    +     702             :   {
    +     703           0 :     std::scoped_lock lock(mutex_state_, mutex_goal_);
    +     704             : 
    +     705           0 :     goal_x_ = state_x_ + stop_dist_x;
    +     706           0 :     goal_y_ = state_y_ + stop_dist_y;
    +     707           0 :     goal_z_ = state_z_ + vertical_stop_dist;
    +     708             :   }
    +     709             : 
    +     710           0 :   res.message = "hover initiated";
    +     711           0 :   res.success = true;
    +     712             : 
    +     713           0 :   changeState(STOP_MOTION_STATE);
    +     714             : 
    +     715           0 :   return std_srvs::TriggerResponse::ConstPtr(new std_srvs::TriggerResponse(res));
    +     716             : }
    +     717             : 
    +     718             : //}
    +     719             : 
    +     720             : /* //{ startTrajectoryTracking() */
    +     721             : 
    +     722           0 : const std_srvs::TriggerResponse::ConstPtr LandoffTracker::startTrajectoryTracking([[maybe_unused]] const std_srvs::TriggerRequest::ConstPtr& cmd) {
    +     723           0 :   return std_srvs::TriggerResponse::Ptr();
    +     724             : }
    +     725             : 
    +     726             : //}
    +     727             : 
    +     728             : /* //{ stopTrajectoryTracking() */
    +     729             : 
    +     730           0 : const std_srvs::TriggerResponse::ConstPtr LandoffTracker::stopTrajectoryTracking([[maybe_unused]] const std_srvs::TriggerRequest::ConstPtr& cmd) {
    +     731           0 :   return std_srvs::TriggerResponse::Ptr();
    +     732             : }
    +     733             : 
    +     734             : //}
    +     735             : 
    +     736             : /* //{ resumeTrajectoryTracking() */
    +     737             : 
    +     738           0 : const std_srvs::TriggerResponse::ConstPtr LandoffTracker::resumeTrajectoryTracking([[maybe_unused]] const std_srvs::TriggerRequest::ConstPtr& cmd) {
    +     739           0 :   return std_srvs::TriggerResponse::Ptr();
    +     740             : }
    +     741             : 
    +     742             : //}
    +     743             : 
    +     744             : /* //{ gotoTrajectoryStart() */
    +     745             : 
    +     746           0 : const std_srvs::TriggerResponse::ConstPtr LandoffTracker::gotoTrajectoryStart([[maybe_unused]] const std_srvs::TriggerRequest::ConstPtr& cmd) {
    +     747           0 :   return std_srvs::TriggerResponse::Ptr();
    +     748             : }
    +     749             : 
    +     750             : //}
    +     751             : 
    +     752             : /* //{ setConstraints() */
    +     753             : 
    +     754         298 : const mrs_msgs::DynamicsConstraintsSrvResponse::ConstPtr LandoffTracker::setConstraints([
    +     755             :     [maybe_unused]] const mrs_msgs::DynamicsConstraintsSrvRequest::ConstPtr& cmd) {
    +     756             : 
    +     757             : 
    +     758         298 :   mrs_lib::set_mutexed(mutex_constraints_, cmd->constraints, constraints_);
    +     759             : 
    +     760         298 :   ROS_INFO("[LandoffTracker]: updating constraints");
    +     761             : 
    +     762         596 :   mrs_msgs::DynamicsConstraintsSrvResponse res;
    +     763         298 :   res.success = true;
    +     764         298 :   res.message = "constraints updated";
    +     765             : 
    +     766         596 :   return mrs_msgs::DynamicsConstraintsSrvResponse::ConstPtr(new mrs_msgs::DynamicsConstraintsSrvResponse(res));
    +     767             : }
    +     768             : 
    +     769             : //}
    +     770             : 
    +     771             : /* //{ setReference() */
    +     772             : 
    +     773           0 : const mrs_msgs::ReferenceSrvResponse::ConstPtr LandoffTracker::setReference([[maybe_unused]] const mrs_msgs::ReferenceSrvRequest::ConstPtr& cmd) {
    +     774             : 
    +     775           0 :   return mrs_msgs::ReferenceSrvResponse::Ptr();
    +     776             : }
    +     777             : 
    +     778             : //}
    +     779             : 
    +     780             : /* //{ setVelocityReference() */
    +     781             : 
    +     782           0 : const mrs_msgs::VelocityReferenceSrvResponse::ConstPtr LandoffTracker::setVelocityReference([
    +     783             :     [maybe_unused]] const mrs_msgs::VelocityReferenceSrvRequest::ConstPtr& cmd) {
    +     784           0 :   return mrs_msgs::VelocityReferenceSrvResponse::Ptr();
    +     785             : }
    +     786             : 
    +     787             : //}
    +     788             : 
    +     789             : /* //{ setTrajectoryReference() */
    +     790             : 
    +     791           4 : const mrs_msgs::TrajectoryReferenceSrvResponse::ConstPtr LandoffTracker::setTrajectoryReference([
    +     792             :     [maybe_unused]] const mrs_msgs::TrajectoryReferenceSrvRequest::ConstPtr& cmd) {
    +     793           4 :   return mrs_msgs::TrajectoryReferenceSrvResponse::Ptr();
    +     794             : }
    +     795             : 
    +     796             : //}
    +     797             : 
    +     798             : // | ----------------- state machine routines ----------------- |
    +     799             : 
    +     800             : /* //{ changeStateHorizontal() */
    +     801             : 
    +     802         180 : void LandoffTracker::changeStateHorizontal(States_t new_state) {
    +     803             : 
    +     804         180 :   previous_state_horizontal_ = current_state_horizontal_;
    +     805         180 :   current_state_horizontal_  = new_state;
    +     806             : 
    +     807         180 :   switch (current_state_horizontal_) {
    +     808             : 
    +     809          57 :     case STOPPING_STATE: {
    +     810             : 
    +     811         114 :       std::scoped_lock lock(mutex_state_);
    +     812          57 :       current_horizontal_speed_ = 0;
    +     813             : 
    +     814          57 :       break;
    +     815             :     };
    +     816             : 
    +     817         123 :     default: {
    +     818             : 
    +     819         123 :       break;
    +     820             :     }
    +     821             :   }
    +     822             : 
    +     823         180 :   ROS_INFO("[LandoffTracker]: Switching horizontal state %s -> %s", state_names[previous_state_horizontal_], state_names[current_state_horizontal_]);
    +     824         180 : }
    +     825             : 
    +     826             : //}
    +     827             : 
    +     828             : /* //{ changeStateVertical() */
    +     829             : 
    +     830         220 : void LandoffTracker::changeStateVertical(States_t new_state) {
    +     831             : 
    +     832         220 :   previous_state_vertical_ = current_state_vertical_;
    +     833         220 :   current_state_vertical_  = new_state;
    +     834             : 
    +     835         220 :   switch (current_state_vertical_) {
    +     836             : 
    +     837          44 :     case HOVER_STATE: {
    +     838          44 :       taking_off_ = false;
    +     839          44 :       break;
    +     840             :     }
    +     841             : 
    +     842         176 :     default: {
    +     843         176 :       break;
    +     844             :     }
    +     845             :   }
    +     846             : 
    +     847         220 :   ROS_INFO("[LandoffTracker]: Switching vertical state %s -> %s", state_names[previous_state_vertical_], state_names[current_state_vertical_]);
    +     848         220 : }
    +     849             : 
    +     850             : //}
    +     851             : 
    +     852             : /* //{ changeState() */
    +     853             : 
    +     854         147 : void LandoffTracker::changeState(States_t new_state) {
    +     855             : 
    +     856         147 :   changeStateVertical(new_state);
    +     857         147 :   changeStateHorizontal(new_state);
    +     858         147 : }
    +     859             : 
    +     860             : //}
    +     861             : 
    +     862             : // | --------------------- motion routines -------------------- |
    +     863             : 
    +     864             : /* //{ stopHorizontalMotion() */
    +     865             : 
    +     866         652 : void LandoffTracker::stopHorizontalMotion(void) {
    +     867             : 
    +     868             :   {
    +     869        1304 :     std::scoped_lock lock(mutex_state_);
    +     870             : 
    +     871         652 :     current_horizontal_speed_ -= _horizontal_acceleration_ * _tracker_dt_;
    +     872             : 
    +     873         652 :     if (current_horizontal_speed_ < 0) {
    +     874         362 :       current_horizontal_speed_        = 0;
    +     875         362 :       current_horizontal_acceleration_ = 0;
    +     876             :     } else {
    +     877         290 :       current_horizontal_acceleration_ = -_horizontal_acceleration_;
    +     878             :     }
    +     879             :   }
    +     880         652 : }
    +     881             : 
    +     882             : //}
    +     883             : 
    +     884             : /* //{ stopVerticalMotion() */
    +     885             : 
    +     886         652 : void LandoffTracker::stopVerticalMotion(void) {
    +     887             : 
    +     888             :   {
    +     889        1304 :     std::scoped_lock lock(mutex_state_);
    +     890             : 
    +     891         652 :     current_vertical_speed_ -= _vertical_acceleration_ * _tracker_dt_;
    +     892             : 
    +     893         652 :     if (current_vertical_speed_ < 0) {
    +     894          47 :       current_vertical_speed_        = 0;
    +     895          47 :       current_vertical_acceleration_ = 0;
    +     896             :     } else {
    +     897         605 :       current_vertical_acceleration_ = -_vertical_acceleration_;
    +     898             :     }
    +     899             :   }
    +     900         652 : }
    +     901             : 
    +     902             : //}
    +     903             : 
    +     904             : /* //{ accelerateVertical() */
    +     905             : 
    +     906       15845 : void LandoffTracker::accelerateVertical(void) {
    +     907             : 
    +     908             :   // copy member variables
    +     909       15845 :   auto [current_vertical_speed, state_z] = mrs_lib::get_mutexed(mutex_state_, current_vertical_speed_, state_z_);
    +     910       15845 :   auto goal_z                            = mrs_lib::get_mutexed(mutex_goal_, goal_z_);
    +     911       15845 :   auto constraints                       = mrs_lib::get_mutexed(mutex_constraints_, constraints_);
    +     912             : 
    +     913             :   double used_acceleration;
    +     914             :   double used_speed;
    +     915             : 
    +     916       15845 :   if (taking_off_) {
    +     917             : 
    +     918        4480 :     used_speed        = _takeoff_speed_;
    +     919        4480 :     used_acceleration = _takeoff_acceleration_;
    +     920             : 
    +     921        4480 :     if (used_speed > constraints.vertical_ascending_speed) {
    +     922           0 :       used_speed = constraints.vertical_ascending_speed;
    +     923           0 :       ROS_WARN_THROTTLE(1.0, "[LandoffTracker]: saturating takeoff speed");
    +     924             :     }
    +     925             : 
    +     926        4480 :     if (used_acceleration > constraints.vertical_ascending_acceleration) {
    +     927           0 :       used_acceleration = constraints.vertical_ascending_acceleration;
    +     928           0 :       ROS_WARN_THROTTLE(1.0, "[LandoffTracker]: saturating takeoff acceleration");
    +     929             :     }
    +     930             : 
    +     931       11365 :   } else if (landing_) {
    +     932             : 
    +     933       11365 :     if (elanding_) {
    +     934             : 
    +     935        7140 :       used_speed        = _elanding_speed_;
    +     936        7140 :       used_acceleration = _elanding_acceleration_;
    +     937             : 
    +     938             :     } else {
    +     939             : 
    +     940        4225 :       used_speed        = _landing_speed_;
    +     941        4225 :       used_acceleration = _landing_acceleration_;
    +     942             : 
    +     943        4225 :       if (used_speed > constraints.vertical_descending_speed) {
    +     944           0 :         used_speed = constraints.vertical_descending_speed;
    +     945           0 :         ROS_WARN_THROTTLE(1.0, "[LandoffTracker]: saturating landing speed");
    +     946             :       }
    +     947             : 
    +     948        4225 :       if (used_acceleration > constraints.vertical_descending_acceleration) {
    +     949           0 :         used_acceleration = constraints.vertical_descending_acceleration;
    +     950           0 :         ROS_WARN_THROTTLE(1.0, "[LandoffTracker]: saturating landing acceleration");
    +     951             :       }
    +     952             :     }
    +     953             : 
    +     954             :   } else {
    +     955             : 
    +     956             :     // TODO take this from constraints
    +     957           0 :     used_speed        = _vertical_speed_;
    +     958           0 :     used_acceleration = _vertical_acceleration_;
    +     959             :   }
    +     960             : 
    +     961             :   // set the right heading
    +     962       15845 :   double tar_z = goal_z - state_z;
    +     963             : 
    +     964             :   // set the right vertical direction
    +     965             :   {
    +     966       15845 :     std::scoped_lock lock(mutex_state_);
    +     967             : 
    +     968       15845 :     current_vertical_direction_ = mrs_lib::signum(tar_z);
    +     969             :   }
    +     970             : 
    +     971       15845 :   auto current_vertical_direction = mrs_lib::get_mutexed(mutex_state_, current_vertical_direction_);
    +     972             : 
    +     973             :   // calculate the time to stop and the distance it will take to stop [vertical]
    +     974       15845 :   double vertical_t_stop    = current_vertical_speed / used_acceleration;
    +     975       15845 :   double vertical_stop_dist = (vertical_t_stop * current_vertical_speed) / 2.0;
    +     976       15845 :   double stop_dist_z        = current_vertical_direction * vertical_stop_dist;
    +     977             : 
    +     978             :   {
    +     979       31690 :     std::scoped_lock lock(mutex_state_);
    +     980             : 
    +     981       15845 :     current_vertical_speed_ += used_acceleration * _tracker_dt_;
    +     982             : 
    +     983       15845 :     if (current_vertical_speed_ >= used_speed) {
    +     984        3917 :       current_vertical_speed_ -= _vertical_acceleration_ * _tracker_dt_;
    +     985        3917 :       current_vertical_acceleration_ = 0;
    +     986             :     } else {
    +     987       11928 :       current_vertical_acceleration_ = used_acceleration;
    +     988             :     }
    +     989             :   }
    +     990             : 
    +     991             :   // stopping condition to change to decelerate state
    +     992             :   //
    +     993             :   // It does not apply if landing or elanding, cause,
    +     994             :   // it could potentially stop in mid air if odometry jumps (this happened),
    +     995             :   // Instead, landing and elanding is stopped by sensing the throttle.
    +     996       15845 :   if (!elanding_ && !landing_) {
    +     997        4480 :     if (fabs(state_z + stop_dist_z - goal_z) < (2 * (used_speed * _tracker_dt_))) {
    +     998             : 
    +     999             :       {
    +    1000          20 :         std::scoped_lock lock(mutex_state_);
    +    1001             : 
    +    1002          20 :         current_vertical_acceleration_ = 0;
    +    1003             :       }
    +    1004             : 
    +    1005          20 :       changeStateVertical(DECELERATING_STATE);
    +    1006             :     }
    +    1007             :   }
    +    1008       15845 : }
    +    1009             : 
    +    1010             : //}
    +    1011             : 
    +    1012             : /* //{ decelerateVertical() */
    +    1013             : 
    +    1014        4480 : void LandoffTracker::decelerateVertical(void) {
    +    1015             : 
    +    1016             :   double used_acceleration;
    +    1017             : 
    +    1018        4480 :   if (taking_off_) {
    +    1019             : 
    +    1020        4480 :     used_acceleration = _takeoff_acceleration_;
    +    1021             : 
    +    1022           0 :   } else if (landing_) {
    +    1023             : 
    +    1024           0 :     if (elanding_) {
    +    1025             : 
    +    1026           0 :       used_acceleration = _elanding_acceleration_;
    +    1027             : 
    +    1028             :     } else {
    +    1029             : 
    +    1030           0 :       used_acceleration = _landing_acceleration_;
    +    1031             :     }
    +    1032             : 
    +    1033             :   } else {
    +    1034           0 :     used_acceleration = _vertical_acceleration_;
    +    1035             :   }
    +    1036             : 
    +    1037             :   {
    +    1038        8960 :     std::scoped_lock lock(mutex_state_);
    +    1039             : 
    +    1040        4480 :     current_vertical_speed_ -= used_acceleration * _tracker_dt_;
    +    1041             : 
    +    1042        4480 :     if (current_vertical_speed_ < 0) {
    +    1043          20 :       current_vertical_speed_ = 0;
    +    1044             :     } else {
    +    1045        4460 :       current_vertical_acceleration_ = -used_acceleration;
    +    1046             :     }
    +    1047             :   }
    +    1048             : 
    +    1049        4480 :   auto current_vertical_speed = mrs_lib::get_mutexed(mutex_state_, current_vertical_speed_);
    +    1050             : 
    +    1051        4480 :   if (current_vertical_speed == 0) {
    +    1052             : 
    +    1053             :     {
    +    1054          20 :       std::scoped_lock lock(mutex_state_);
    +    1055             : 
    +    1056          20 :       current_vertical_acceleration_ = 0;
    +    1057             :     }
    +    1058             : 
    +    1059          20 :     changeStateVertical(STOPPING_STATE);
    +    1060             :   }
    +    1061        4480 : }
    +    1062             : 
    +    1063             : //}
    +    1064             : 
    +    1065             : /* //{ stopHorizontal() */
    +    1066             : 
    +    1067       20325 : void LandoffTracker::stopHorizontal(void) {
    +    1068             : 
    +    1069             :   {
    +    1070       20325 :     std::scoped_lock lock(mutex_state_, mutex_goal_);
    +    1071             : 
    +    1072       20325 :     double new_state_x = 0.95 * state_x_ + 0.05 * goal_x_;
    +    1073       20325 :     double new_state_y = 0.95 * state_y_ + 0.05 * goal_y_;
    +    1074             : 
    +    1075       20325 :     double dist_x = new_state_x - state_x_;
    +    1076       20325 :     double dist_y = new_state_y - state_y_;
    +    1077             : 
    +    1078       20325 :     double dt = 1.0 / _main_timer_rate_;
    +    1079             : 
    +    1080       20325 :     if (std::abs(dist_x / dt) > 1.0) {
    +    1081           0 :       dist_x = mrs_lib::signum(dist_x) * (1.0 * dt);
    +    1082             :     }
    +    1083             : 
    +    1084       20325 :     if (std::abs(dist_y / dt) > 1.0) {
    +    1085           0 :       dist_y = mrs_lib::signum(dist_y) * (1.0 * dt);
    +    1086             :     }
    +    1087             : 
    +    1088       20325 :     state_x_ += dist_x;
    +    1089       20325 :     state_y_ += dist_y;
    +    1090             : 
    +    1091       20325 :     current_horizontal_acceleration_ = 0;
    +    1092             :   }
    +    1093       20325 : }
    +    1094             : 
    +    1095             : //}
    +    1096             : 
    +    1097             : /* //{ stopVertical() */
    +    1098             : 
    +    1099           0 : void LandoffTracker::stopVertical(void) {
    +    1100             : 
    +    1101             :   {
    +    1102           0 :     std::scoped_lock lock(mutex_state_, mutex_goal_);
    +    1103             : 
    +    1104           0 :     double new_state_z = 0.95 * state_z_ + 0.05 * goal_z_;
    +    1105             : 
    +    1106           0 :     double dist_z = new_state_z - state_z_;
    +    1107             : 
    +    1108           0 :     double dt = 1.0 / _main_timer_rate_;
    +    1109             : 
    +    1110           0 :     if (std::abs(dist_z / dt) > 1.0) {
    +    1111           0 :       dist_z = mrs_lib::signum(dist_z) * (1.0 * dt);
    +    1112             :     }
    +    1113             : 
    +    1114           0 :     state_z_ += dist_z;
    +    1115             : 
    +    1116           0 :     current_vertical_acceleration_ = 0;
    +    1117             :   }
    +    1118           0 : }
    +    1119             : 
    +    1120             : //}
    +    1121             : 
    +    1122             : // | --------------------- timer routines --------------------- |
    +    1123             : 
    +    1124             : /* //{ timerMain() */
    +    1125             : 
    +    1126       23263 : void LandoffTracker::timerMain(const ros::TimerEvent& event) {
    +    1127             : 
    +    1128       23263 :   std::scoped_lock lock(mutex_main_timer_);
    +    1129             : 
    +    1130       23263 :   if (!is_active_) {
    +    1131           0 :     return;
    +    1132             :   }
    +    1133             : 
    +    1134             :   // copy member variables
    +    1135       46526 :   auto uav_state = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +    1136       23263 :   auto [state_x, state_y, state_z, current_horizontal_speed, current_vertical_speed, current_heading, current_vertical_direction] = mrs_lib::get_mutexed(
    +    1137       23263 :       mutex_state_, state_x_, state_y_, state_z_, current_horizontal_speed_, current_vertical_speed_, current_heading_, current_vertical_direction_);
    +    1138       23263 :   auto [goal_x, goal_y, goal_z] = mrs_lib::get_mutexed(mutex_goal_, goal_x_, goal_y_, goal_z_);
    +    1139       46526 :   auto last_control_output      = mrs_lib::get_mutexed(mutex_last_control_output_, last_control_output_);
    +    1140             : 
    +    1141             :   double uav_x, uav_y, uav_z;
    +    1142       23263 :   uav_x = uav_state.pose.position.x;
    +    1143       23263 :   uav_y = uav_state.pose.position.y;
    +    1144       23263 :   uav_z = uav_state.pose.position.z;
    +    1145             : 
    +    1146       69789 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("main", _main_timer_rate_, 0.002, event);
    +    1147       69789 :   mrs_lib::ScopeTimer timer = mrs_lib::ScopeTimer("LandoffTracker::main", common_handlers_->scope_timer.logger, common_handlers_->scope_timer.enabled);
    +    1148             : 
    +    1149       23263 :   bool takeoff_saturated = false;
    +    1150             : 
    +    1151       23263 :   if (taking_off_) {
    +    1152             : 
    +    1153             :     // calculate the vector
    +    1154        9477 :     double err_x      = uav_x - state_x;
    +    1155        9477 :     double err_y      = uav_y - state_y;
    +    1156        9477 :     double err_z      = uav_z - state_z;
    +    1157        9477 :     double error_size = sqrt(pow(err_x, 2) + pow(err_y, 2) + pow(err_z, 2));
    +    1158             : 
    +    1159        9477 :     if (error_size > _max_position_difference_) {
    +    1160             : 
    +    1161             :       // calculate the potential next step
    +    1162          61 :       double future_state_x = state_x + cos(current_heading) * current_horizontal_speed * _tracker_dt_;
    +    1163          61 :       double future_state_y = state_y + sin(current_heading) * current_horizontal_speed * _tracker_dt_;
    +    1164          61 :       double future_state_z = state_z + current_vertical_direction * current_vertical_speed * _tracker_dt_;
    +    1165             : 
    +    1166             :       // if the step would lead to a greater control error than the threshold
    +    1167          61 :       if (mrs_lib::geometry::dist(vec3_t(future_state_x, future_state_y, future_state_z), vec3_t(uav_x, uav_y, uav_z)) > error_size) {
    +    1168             : 
    +    1169             :         // set this to true... later, we will not update the model if this is true, thus the tracker's motion will stop
    +    1170             :         // => the tracker will wait for the controller
    +    1171          61 :         takeoff_saturated = true;
    +    1172             : 
    +    1173          61 :         ROS_WARN_THROTTLE(
    +    1174             :             0.1, "[LandoffTracker]: position difference %.3f > %.3f, saturating the motion. Reference: x=%.2f, y=%.2f, z=%.2f, Odometry: %.2f, %.2f, %.2f",
    +    1175             :             error_size, _max_position_difference_, future_state_x, future_state_y, future_state_z, uav_x, uav_y, uav_z);
    +    1176             :       }
    +    1177             :     }
    +    1178             : 
    +    1179             :     // saturate while ramping up during takeoff
    +    1180        9477 :     if (last_control_output.diagnostics.ramping_up) {
    +    1181             : 
    +    1182         456 :       ROS_INFO_THROTTLE(1.0, "[LandoffTracker]: waiting for the controller to rampup");
    +    1183         456 :       takeoff_saturated = true;
    +    1184             :     }
    +    1185             :   }
    +    1186             : 
    +    1187       23263 :   if (!takeoff_saturated) {
    +    1188             : 
    +    1189       22746 :     switch (current_state_horizontal_) {
    +    1190             : 
    +    1191         652 :       case STOP_MOTION_STATE: {
    +    1192             : 
    +    1193         652 :         stopHorizontalMotion();
    +    1194         652 :         break;
    +    1195             :       }
    +    1196             : 
    +    1197       20325 :       case STOPPING_STATE: {
    +    1198             : 
    +    1199       20325 :         stopHorizontal();
    +    1200       20325 :         break;
    +    1201             :       }
    +    1202             : 
    +    1203        1769 :       default: {
    +    1204             : 
    +    1205        1769 :         break;
    +    1206             :       }
    +    1207             :     }
    +    1208             : 
    +    1209       22746 :     switch (current_state_vertical_) {
    +    1210             : 
    +    1211         652 :       case STOP_MOTION_STATE: {
    +    1212             : 
    +    1213         652 :         stopVerticalMotion();
    +    1214         652 :         break;
    +    1215             :       }
    +    1216             : 
    +    1217       15845 :       case ACCELERATING_STATE: {
    +    1218             : 
    +    1219       15845 :         accelerateVertical();
    +    1220       15845 :         break;
    +    1221             :       }
    +    1222             : 
    +    1223        4480 :       case DECELERATING_STATE: {
    +    1224             : 
    +    1225        4480 :         decelerateVertical();
    +    1226        4480 :         break;
    +    1227             :       }
    +    1228             : 
    +    1229           0 :       case STOPPING_STATE: {
    +    1230             : 
    +    1231           0 :         stopVertical();
    +    1232           0 :         break;
    +    1233             :       }
    +    1234             : 
    +    1235        1769 :       default: {
    +    1236             : 
    +    1237        1769 :         break;
    +    1238             :       }
    +    1239             :     }
    +    1240             :   }
    +    1241             : 
    +    1242       23263 :   if (current_state_horizontal_ == STOP_MOTION_STATE && current_state_vertical_ == STOP_MOTION_STATE) {
    +    1243         672 :     if (fabs(current_vertical_speed) <= 0.1 && fabs(current_horizontal_speed) <= 0.1) {
    +    1244             : 
    +    1245             :       // if the current motion was stopped (the conditions above) but we still have a goal (landing or taking off)
    +    1246             :       // -> we should start accelerating towards the goal in the vertical direction
    +    1247             :       // This is important, do not modify without testing, otherwise your landing routine may crash into the ground
    +    1248             :       // while having large lateral speed
    +    1249          57 :       if (have_goal_) {
    +    1250             : 
    +    1251          33 :         changeStateVertical(ACCELERATING_STATE);
    +    1252          33 :         changeStateHorizontal(STOPPING_STATE);
    +    1253             : 
    +    1254             :       } else {
    +    1255             : 
    +    1256          24 :         changeState(STOPPING_STATE);
    +    1257             : 
    +    1258             :         {
    +    1259          24 :           std::scoped_lock lock(mutex_state_);
    +    1260             : 
    +    1261          24 :           current_horizontal_speed_ = 0;
    +    1262          24 :           current_vertical_speed_   = 0;
    +    1263             :         }
    +    1264             :       }
    +    1265             :     }
    +    1266             :   }
    +    1267             : 
    +    1268       23263 :   if (current_state_vertical_ == STOPPING_STATE && current_state_horizontal_ == STOPPING_STATE) {
    +    1269             : 
    +    1270          44 :     if (fabs(state_x - goal_x) > 1.0 || fabs(state_y - goal_y) > 1.0 || fabs(state_z - goal_z) > 1.0) {
    +    1271             : 
    +    1272           0 :       ROS_ERROR("[LandoffTracker]: distance to the goal is too large when STOPPING, this could have been caused by a race condition!");
    +    1273           0 :       ROS_ERROR("[LandoffTracker]: call for Tomas!!");
    +    1274             : 
    +    1275           0 :       cause_failsafe_ = true;
    +    1276             : 
    +    1277           0 :       changeState(HOVER_STATE);
    +    1278             : 
    +    1279          44 :     } else if (fabs(state_x - goal_x) < 0.1 && fabs(state_y - goal_y) < 0.1 && fabs(state_z - goal_z) < 0.1) {
    +    1280             : 
    +    1281             :       {
    +    1282          44 :         std::scoped_lock lock(mutex_state_);
    +    1283             : 
    +    1284          44 :         if (!taking_off_) {
    +    1285          24 :           state_x_ = goal_x;
    +    1286          24 :           state_y_ = goal_y;
    +    1287          24 :           state_z_ = goal_z;
    +    1288             :         }
    +    1289             : 
    +    1290          44 :         current_horizontal_speed_ = 0;
    +    1291          44 :         current_vertical_speed_   = 0;
    +    1292             :       }
    +    1293             : 
    +    1294          44 :       changeState(HOVER_STATE);
    +    1295             : 
    +    1296          44 :       have_goal_ = false;
    +    1297             :     }
    +    1298             :   }
    +    1299             : 
    +    1300       23263 :   if (current_state_horizontal_ == LANDED_STATE && current_state_vertical_ == LANDED_STATE) {
    +    1301             :     {
    +    1302           0 :       std::scoped_lock lock(mutex_state_);
    +    1303             : 
    +    1304           0 :       state_x_ = goal_x = uav_x;
    +    1305           0 :       state_y_ = goal_y = uav_y;
    +    1306           0 :       state_z_ = goal_z = uav_z;
    +    1307             : 
    +    1308           0 :       have_goal_ = false;
    +    1309             :     }
    +    1310             :   }
    +    1311             : 
    +    1312             :   // --------------------------------------------------------------
    +    1313             :   // |              motion saturation during takeoff              |
    +    1314             :   // --------------------------------------------------------------
    +    1315             : 
    +    1316             :   // update the inner states
    +    1317       23263 :   if (!takeoff_saturated) {
    +    1318             :     {
    +    1319       22746 :       std::scoped_lock lock(mutex_state_);
    +    1320             : 
    +    1321       22746 :       state_x_ += cos(current_heading) * current_horizontal_speed * _tracker_dt_;
    +    1322       22746 :       state_y_ += sin(current_heading) * current_horizontal_speed * _tracker_dt_;
    +    1323       22746 :       state_z_ += current_vertical_direction * current_vertical_speed * _tracker_dt_;
    +    1324             :     }
    +    1325             :   }
    +    1326             : 
    +    1327             :   // --------------------------------------------------------------
    +    1328             :   // |                        heading tracking                        |
    +    1329             :   // --------------------------------------------------------------
    +    1330             : 
    +    1331             :   // compute the desired heading rate
    +    1332             :   {
    +    1333       46526 :     std::scoped_lock lock(mutex_state_);
    +    1334             : 
    +    1335             :     double current_heading_rate;
    +    1336             : 
    +    1337       23263 :     if (fabs(goal_heading_ - state_heading_) > M_PI)
    +    1338           0 :       current_heading_rate = -_heading_gain_ * (goal_heading_ - state_heading_);
    +    1339             :     else
    +    1340       23263 :       current_heading_rate = _heading_gain_ * (goal_heading_ - state_heading_);
    +    1341             : 
    +    1342       23263 :     if (current_heading_rate > _heading_rate_) {
    +    1343           0 :       current_heading_rate = _heading_rate_;
    +    1344       23263 :     } else if (current_heading_rate < -_heading_rate_) {
    +    1345           0 :       current_heading_rate = -_heading_rate_;
    +    1346             :     }
    +    1347             : 
    +    1348             :     // flap the resulted state_heading_ aroud PI
    +    1349       23263 :     state_heading_ += current_heading_rate * _tracker_dt_;
    +    1350             : 
    +    1351       23263 :     if (state_heading_ > M_PI) {
    +    1352           0 :       state_heading_ -= 2 * M_PI;
    +    1353       23263 :     } else if (state_heading_ < -M_PI) {
    +    1354           0 :       state_heading_ += 2 * M_PI;
    +    1355             :     }
    +    1356             : 
    +    1357       23263 :     if (fabs(state_heading_ - goal_heading_) < (2 * (_heading_rate_ * _tracker_dt_))) {
    +    1358       23263 :       state_heading_ = goal_heading_;
    +    1359             :     }
    +    1360             :   }
    +    1361             : 
    +    1362             :   // --------------------------------------------------------------
    +    1363             :   // |                      landing setpoint                      |
    +    1364             :   // --------------------------------------------------------------
    +    1365             : 
    +    1366       23263 :   if (landing_) {
    +    1367             :     {
    +    1368       11955 :       std::scoped_lock lock(mutex_goal_);
    +    1369             : 
    +    1370       11955 :       goal_z_ = uav_z + _landing_reference_;
    +    1371             :     }
    +    1372             :   }
    +    1373             : }
    +    1374             : 
    +    1375             : //}
    +    1376             : 
    +    1377             : // | ------------------------ callbacks ----------------------- |
    +    1378             : 
    +    1379             : /* //{ callbackTakeoff() */
    +    1380             : 
    +    1381          20 : bool LandoffTracker::callbackTakeoff(mrs_msgs::Vec1::Request& req, mrs_msgs::Vec1::Response& res) {
    +    1382             : 
    +    1383          40 :   std::stringstream ss;
    +    1384             : 
    +    1385             :   // copy member variables
    +    1386          40 :   auto uav_state = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +    1387             : 
    +    1388          20 :   double uav_heading = mrs_lib::AttitudeConverter(uav_state.pose.orientation).getHeading();
    +    1389             : 
    +    1390             :   double uav_x, uav_y, uav_z;
    +    1391          20 :   uav_x = uav_state.pose.position.x;
    +    1392          20 :   uav_y = uav_state.pose.position.y;
    +    1393          20 :   uav_z = uav_state.pose.position.z;
    +    1394             : 
    +    1395          20 :   if (!is_active_) {
    +    1396           0 :     ss << "can not takeoff, the tracker is not active";
    +    1397           0 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[LandoffTracker]: " << ss.str());
    +    1398           0 :     res.success = false;
    +    1399           0 :     res.message = ss.str();
    +    1400           0 :     return true;
    +    1401             :   }
    +    1402             : 
    +    1403          20 :   if (!callbacks_enabled_) {
    +    1404           0 :     ss << "can not takeoff, the callbacks are disabled";
    +    1405           0 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[LandoffTracker]: " << ss.str());
    +    1406           0 :     res.success = false;
    +    1407           0 :     res.message = ss.str();
    +    1408           0 :     return true;
    +    1409             :   }
    +    1410             : 
    +    1411          20 :   if (req.goal < 0.5 || req.goal > 10.0) {
    +    1412             : 
    +    1413           0 :     ss << "can not takeoff, the goal should be within [0.5, 10.0] m!";
    +    1414           0 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[LandoffTracker]: " << ss.str());
    +    1415           0 :     res.success = false;
    +    1416           0 :     res.message = ss.str();
    +    1417           0 :     return true;
    +    1418             :   }
    +    1419             : 
    +    1420             :   {
    +    1421          40 :     std::scoped_lock lock(mutex_goal_, mutex_state_);
    +    1422             : 
    +    1423          20 :     state_x_ = uav_x;
    +    1424          20 :     goal_x_  = uav_x;
    +    1425             : 
    +    1426          20 :     state_y_ = uav_y;
    +    1427          20 :     goal_y_  = uav_y;
    +    1428             : 
    +    1429          20 :     state_z_ = uav_z;
    +    1430          20 :     goal_z_  = uav_z + req.goal;
    +    1431             : 
    +    1432          20 :     state_heading_ = uav_heading;
    +    1433          20 :     goal_heading_  = uav_heading;
    +    1434             : 
    +    1435          20 :     speed_x_                = 0;
    +    1436          20 :     speed_y_                = 0;
    +    1437          20 :     current_vertical_speed_ = 0;
    +    1438             : 
    +    1439          20 :     have_goal_ = true;
    +    1440             :   }
    +    1441             : 
    +    1442          20 :   ROS_INFO("[LandoffTracker]: taking off");
    +    1443             : 
    +    1444          20 :   taking_off_ = true;
    +    1445          20 :   landing_    = false;
    +    1446          20 :   elanding_   = false;
    +    1447             : 
    +    1448          20 :   res.success = true;
    +    1449          20 :   res.message = "taking off";
    +    1450             : 
    +    1451          20 :   changeState(STOP_MOTION_STATE);
    +    1452             : 
    +    1453          20 :   return true;
    +    1454             : }
    +    1455             : 
    +    1456             : //}
    +    1457             : 
    +    1458             : /* //{ callbackLand() */
    +    1459             : 
    +    1460           5 : bool LandoffTracker::callbackLand([[maybe_unused]] std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res) {
    +    1461             : 
    +    1462          10 :   std::scoped_lock lock(mutex_main_timer_);
    +    1463             : 
    +    1464          10 :   std::stringstream ss;
    +    1465             : 
    +    1466             :   // copy member variables
    +    1467          10 :   auto uav_state = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +    1468             : 
    +    1469           5 :   if (!is_active_) {
    +    1470           0 :     ss << "can not land, the tracker is not active";
    +    1471           0 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[LandoffTracker]: " << ss.str());
    +    1472           0 :     res.success = false;
    +    1473           0 :     res.message = ss.str();
    +    1474           0 :     return true;
    +    1475             :   }
    +    1476             : 
    +    1477             :   {
    +    1478           5 :     std::scoped_lock lock(mutex_goal_);
    +    1479             : 
    +    1480           5 :     goal_z_ = uav_state.pose.position.z + _landing_reference_;
    +    1481             :   }
    +    1482             : 
    +    1483           5 :   ROS_INFO("[LandoffTracker]: landing");
    +    1484             : 
    +    1485           5 :   landing_    = true;
    +    1486           5 :   elanding_   = false;
    +    1487           5 :   taking_off_ = false;
    +    1488           5 :   have_goal_  = true;
    +    1489             : 
    +    1490           5 :   res.success = true;
    +    1491           5 :   res.message = "landing";
    +    1492             : 
    +    1493           5 :   changeState(STOP_MOTION_STATE);
    +    1494             : 
    +    1495           5 :   return true;
    +    1496             : }
    +    1497             : 
    +    1498             : //}
    +    1499             : 
    +    1500             : /* //{ callbackELand() */
    +    1501             : 
    +    1502           9 : bool LandoffTracker::callbackELand([[maybe_unused]] std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res) {
    +    1503             : 
    +    1504          18 :   std::scoped_lock lock(mutex_main_timer_);
    +    1505             : 
    +    1506          18 :   std::stringstream ss;
    +    1507             : 
    +    1508             :   // copy member variables
    +    1509          18 :   auto uav_state = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +    1510             : 
    +    1511           9 :   if (!is_active_) {
    +    1512             : 
    +    1513           0 :     ss << "can not eland, the tracker is not active";
    +    1514           0 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[LandoffTracker]: " << ss.str());
    +    1515           0 :     res.success = false;
    +    1516           0 :     res.message = ss.str();
    +    1517           0 :     taking_off_ = false;
    +    1518           0 :     landing_    = false;
    +    1519           0 :     elanding_   = false;
    +    1520           0 :     changeState(LANDED_STATE);
    +    1521           0 :     return true;
    +    1522             :   }
    +    1523             : 
    +    1524             :   {
    +    1525           9 :     std::scoped_lock lock(mutex_goal_);
    +    1526             : 
    +    1527           9 :     goal_z_ = uav_state.pose.position.z + _landing_reference_;
    +    1528             :   }
    +    1529             : 
    +    1530           9 :   ROS_WARN("[LandoffTracker]: emergency landing");
    +    1531             : 
    +    1532           9 :   landing_    = true;
    +    1533           9 :   elanding_   = true;
    +    1534           9 :   taking_off_ = false;
    +    1535           9 :   have_goal_  = true;
    +    1536             : 
    +    1537           9 :   res.success = true;
    +    1538           9 :   res.message = "elanding";
    +    1539             : 
    +    1540           9 :   changeState(STOP_MOTION_STATE);
    +    1541             : 
    +    1542           9 :   return true;
    +    1543             : }
    +    1544             : 
    +    1545             : //}
    +    1546             : 
    +    1547             : }  // namespace landoff_tracker
    +    1548             : 
    +    1549             : }  // namespace mrs_uav_trackers
    +    1550             : 
    +    1551             : #include <pluginlib/class_list_macros.h>
    +    1552          91 : PLUGINLIB_EXPORT_CLASS(mrs_uav_trackers::landoff_tracker::LandoffTracker, mrs_uav_managers::Tracker)
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/landoff_tracker/landoff_tracker.cpp.gcov.overview.html b/mrs_uav_trackers/src/landoff_tracker/landoff_tracker.cpp.gcov.overview.html new file mode 100644 index 0000000000..a184a445d4 --- /dev/null +++ b/mrs_uav_trackers/src/landoff_tracker/landoff_tracker.cpp.gcov.overview.html @@ -0,0 +1,408 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/landoff_tracker/landoff_tracker.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_trackers/src/landoff_tracker/landoff_tracker.cpp.gcov.png b/mrs_uav_trackers/src/landoff_tracker/landoff_tracker.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..0549fe81374e6b7f724bd0b45f36c19b2bf94f41 GIT binary patch literal 4772 zcmV;V5?k$wP)1 zRCt{2U5jDsDh!P`uvf4*a8`&naQ9#3#(aekAn|GH-g4h-lk`L&A%qYDKbC1(mihhf z(W|`aDWXe>qz4wE;;L<#dr}lsEooyb`ys^)$F~r0&`SZrCA4Jij!*O)Q_+l zgNkS`nq#=`%Jf4sJ(Wi+8z`)Lo{BnYJEmXV1A4})Piee#uQ{kXOMO7qlh#OGcaIsw z(klZM(+rCJxqh(qkFBX}Q_D8U>~SIm_LJw_m)yfx3Og32sS`~@(hYB;@DqF|Y~x}L znkRbIFo!^{aC}=FxhZyV7Wjp1;WOhXO+od9bA_lnmI;a^u)(+x9L^8i&}o5P1DZzF zj`}U&9lR_87qRw`6fFhE&77#(f&(u(1LV2WtTxUu?;P={w=Ceq1zt!7a5imh?HSiN zLsmkNTR*5^p1asok_)Kf0Wkk{VRL+C9N;XNj=5E5is_UxaOU@(u6kN{J*TJ!bC0PF ze-{AqWCKcF1R473Gn|#x2l6`HcS~Un_c!a6&I!1q!&*GE+Bo^{upR^8yoT%f!RwcW zYhpaGRJETal%G-rz7csKyMz-|rU?t-X|&bvyU;jLW;x=Nse+lXk;d(f+lhfQ7r3y2 za{?$}28W~)1fv*Ws^UOzJ9HrMEIrE%pzan1aLxcL+n8-7n<6W;7XjH6djq-5?i<=v{@`GY{O^3a**z zvy?k80v0_fF|gmhOK9tvz}&=+Ca&JVKFbu|Xki0us_w)Mig4rMS2q;g3vciULj>wv zvJRhy2|j9= z;+9_43a<;1Y#Q2FjMlh6dX^ejD?j`C^m7xp5_Gj4QxQI z7;W&oTSmq6xjnIMyvBUbg`^V*)lbi6W2 zDAG;aF!1&I3d(W)cYK}if4aPM(ZKg#&sV-YUL}MDio0;}0j3#FAx&MFEdrpRueHT7 zKlhl}D(&lJ38)Kze^vigeY>i+{>*G6#M7VRfT~k7o05tL-eLMM;(0q~dH<}oXPi0T zFkKL~7Zd=;zC0&A+y z)s48$0l8K8kIt;7L&)Nnr~(^4sEtsBUZ%l23*1)(#OyhW7>K8zYOa@j-XNdrV%OBS zal-NI`kuL3nX`~>Q(W7aS#`ITfsCMs2C~bL(*-7~(2HWI`J}e(G6S&s?`1_=;eT>5vv*2uK@TtHOm$<>go<{eNWVt z`wbuWcVnT^$2G=T$9r@8R;yor1Ot$$dJNE8fYitkm}XmbGo!_n*zv(lN&l!MEZ3 zBDH4LXI|X4j+tyn?jgZ6D?n&*jgeAqu#aSa*Yq`BpM~!NrSN}3LucC@P^ku_0bj$a z8Nko0ncZaqJ56)gb3@f^ZXg574^T6tWx<<0v^{7>a&MK+{RE}(o7X-IY7Qj*qdci7 zAYIXgdc0@-lolYZXaoA%xjlPAwO!Sg0Ul6O%m-ZnkU`N%C<|m37{)08xfDO>*%Mxh zcTL=jA(jIBa2*_W)!bsoP}_i;`DT69zE3Dh4tS?X+|UfRF552lZF+EfBgFzbEi3}9 z((Xy+jW)#6KxP3HhiuyAg3@foWmi2=al2ho0|HVmFqH_0F=JB9P5ak_8RQZ~xrPb6 z=mAM-U4WcE`5Ly8^uWX1UD_=*(Vu!rGZ2&Hv;O9Srm6Ju(^%>jZ~Yl2a@v4 zFxyDSAF17x0oE)&#G*gh0u`qA3)PMxc9|ZpGvSP32Z`)!A|No5>+I%!LLaI5^KlLM z0BZ_seK8qOYzxz%d8+r^imON$M7(1lF#tOUJYD@{Yln2T)HPREFz7gfDIkz-BS z3IhzMKm**NwW(YUD@IVo`d3S4DmeygLrq!Wtp-=O@kJ$i5lghaHYql@H|#*y+w@{e zoE-+WnY8^?9zb@_t-Np9!J;W|CtS@&)2Y9Z8H!F)4hPj#MMdS<%C@K<16xeia zl~XjWdVA!(fUhIv_Xj|38`-IsX7zDW-4=EsHwjUYdP%Cy;c_ew{m%i9LL7NWqU4_( zd&n_ZDvnhCH45nea6-FX*)tcJH_ZnNV))JZyb9{}@w*Ekl~ySuIEN?KF@}@sruyTn&E_>eI$`*fEqFc`AiL-X5MhNs8)yO!2UNJ;3?so$T&- zIbXrBAzcN_-$A3Ucg{3li~))eX-@;Pf!w~nLn1kxXF}x(0={rN!g*mpC2 ziop*!oJLrR6Kaj)nk^nhQ49Jw2ueMGy4PdipmpKtoT$|NG02mGB}MoD_RU;r->u*~ zag-b>@!U|39m1}Ea_l3>KRNcoJnUG3;l)y?;-L2#y)3KpcT1^NrBIQ2(N5j+ODbZ=J+JVZ4zqgW(Clv$s1tE zdkfq1AJNhI1dvT}^%Qdnyb_AM(-#n^B$K+NQd%_&$Uv>4^ry8XLElDR)hnMFo~;=0 z*l)ruw0UY*#@c3W;myuz_F8kLY!5O$wYCS}u#p00OizpLNho`b?V*pkL5kKy6t7F@ zJ!ZH?VgPPCuF^hk?3fG>~`bjHVd8^%Qwrv%ByfqY#d{9M%*2!Y z{l-i@+S)lAHeVDA2?HUX0&?!bd?9$YslnWN-fKPnxw5jTi7|s!cE(wv!e+*;x zL9QFhpRpPIrvmbV$by~$hBS5K%?6qIN}v4@F!QA%?A@8!{dwL(7mEA32xL%J^81^&@dyMi?I{RE#f*Q?ie`a*#+)^OAcqkit7G>Juw1hgDa>S zKM5fyKV(snF)L#ZYU33((nx{2;UXm1fExz$?w5t3+EXmmPnS2NV=`9( z&hDb|h~oA4*(@}#H?slH_CI4`T^qshGtdbx0-ftoa5jPVY`|IB>_a@@t!}(>)y{p^ z5N~*iTrQU8UO<+faXb1!XgJNyUo7PZ$5OcA2W}Y_Re1Ib7O1=IjMJTU3whq7c|KQ} zo{S>T$rYSz>h9X7+DJT=tans_&C4g(3cuOq;s*C~kLc|Yvquzp%nZpa*aEI`F@F`` zMrOaBlD90>#MMWBsvDCTfqTtmhTAiQlR~$VyCl7t^U>{q2$39;a5Q;bH$92P{Hm;a z^$YB4y}bu7DuKePgVjdzf@~g8RP~z>uulmfpQ69gU6D=93fff&qP_1oXLM)7*xi($ z+{UL_xt3A}*+705GEMXEw2%Ex4MkfS6k|!7W-%SKerfZ$iMa zPXPH8!JQFj^2YN|T8fvw%c^h}LG9%)ij~GEL9-84F>$YN$k7Z=__XC{cD%YAyIgJ} zdp73Tr&H|36q)fJea{C+DemxGdkeIG2s2LIE5GpBi67t#?jCmgf3$+!L!fI->R6sQ z2sqPm`cOQmT}h?r4&*YkdO}XR)F@&-S85l@5%vsy@4TFu-oaG3shKsZcJ;C9$Ac!f zum=J`x9s-*boX2OtaB-=eA?Zijubdyq4@NK|hQK0qV=2q-e1YKx;3R$;Gh z(XZ{Sw1hqf*o!g0FBI3A7`Hj>_FHFilPIYZdwp~Uu1N!F?&_cVcz;4*_9BhXMuxYP zM5@K}L=H#$b1DL@?eQ#)HOleN0$CJC>|ZkuiPv$Re^|u&S*{ryFJi7)KrS=AhhaQs z+HV*bJ7&_7`ndLN1tG3~Tr=AEJ=Q51!3!mzw@+nx>Y=yJy z<{Tj0mMT9y}zI~KH@;@E3Ypu+BZ_!-b}r`{6*Lf6LJYpHmK+ zBq)sqewZhApZ351S>P?}Lef1HW?mJ8iWa!DfWNY8J#+P{+E0akqhgAX!_s-1Gsa5W7=r8$cp(rf~tYYyHG4? zjso7}nN7V9bS9T6DD}3Y3p<{^as%);EPN_Fd+jA1#v!HMnLh_9(S^L=jC4W@7kp%x z=36GD=F1H<38t}U%`;vi93ZD^W~qGKXveCv7O#ThFPyo0og7ZiTwx?evf~pO3c4Tv zX08H|OA$_Snb_6mr#L=EeXBDAcyfWR6o7xz@JFX%aw-`*4fCfs4)F8SaGzs?*wl5Q y_-m%&c?x#RI?zWHJ1k2<>cNtw8c%HWRQC@U&N?gtwp!f)0000 + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/line_tracker + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/line_trackerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:32247467.9 %
    Date:2024-04-18 23:11:36Functions:193063.3 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    line_tracker.cpp +
    67.9%67.9%
    +
    67.9 %322 / 47463.3 %19 / 30
    <unnamed>67.9 %322 / 47463.3 %19 / 30
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/line_tracker/index-detail-sort-l.html b/mrs_uav_trackers/src/line_tracker/index-detail-sort-l.html new file mode 100644 index 0000000000..dcc3a97d05 --- /dev/null +++ b/mrs_uav_trackers/src/line_tracker/index-detail-sort-l.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/line_tracker + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/line_trackerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:32247467.9 %
    Date:2024-04-18 23:11:36Functions:193063.3 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    line_tracker.cpp +
    67.9%67.9%
    +
    67.9 %322 / 47463.3 %19 / 30
    <unnamed>67.9 %322 / 47463.3 %19 / 30
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/line_tracker/index-detail.html b/mrs_uav_trackers/src/line_tracker/index-detail.html new file mode 100644 index 0000000000..4afd3099e1 --- /dev/null +++ b/mrs_uav_trackers/src/line_tracker/index-detail.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/line_tracker + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/line_trackerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:32247467.9 %
    Date:2024-04-18 23:11:36Functions:193063.3 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    line_tracker.cpp +
    67.9%67.9%
    +
    67.9 %322 / 47463.3 %19 / 30
    <unnamed>67.9 %322 / 47463.3 %19 / 30
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/line_tracker/index-sort-f.html b/mrs_uav_trackers/src/line_tracker/index-sort-f.html new file mode 100644 index 0000000000..194d6e46bc --- /dev/null +++ b/mrs_uav_trackers/src/line_tracker/index-sort-f.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/line_tracker + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/line_trackerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:32247467.9 %
    Date:2024-04-18 23:11:36Functions:193063.3 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    line_tracker.cpp +
    67.9%67.9%
    +
    67.9 %322 / 47463.3 %19 / 30
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/line_tracker/index-sort-l.html b/mrs_uav_trackers/src/line_tracker/index-sort-l.html new file mode 100644 index 0000000000..2105bcac85 --- /dev/null +++ b/mrs_uav_trackers/src/line_tracker/index-sort-l.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/line_tracker + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/line_trackerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:32247467.9 %
    Date:2024-04-18 23:11:36Functions:193063.3 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    line_tracker.cpp +
    67.9%67.9%
    +
    67.9 %322 / 47463.3 %19 / 30
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/line_tracker/index.html b/mrs_uav_trackers/src/line_tracker/index.html new file mode 100644 index 0000000000..f4d39dfdca --- /dev/null +++ b/mrs_uav_trackers/src/line_tracker/index.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/line_tracker + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/line_trackerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:32247467.9 %
    Date:2024-04-18 23:11:36Functions:193063.3 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    line_tracker.cpp +
    67.9%67.9%
    +
    67.9 %322 / 47463.3 %19 / 30
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/line_tracker/line_tracker.cpp.func-sort-c.html b/mrs_uav_trackers/src/line_tracker/line_tracker.cpp.func-sort-c.html new file mode 100644 index 0000000000..1b3e928cf1 --- /dev/null +++ b/mrs_uav_trackers/src/line_tracker/line_tracker.cpp.func-sort-c.html @@ -0,0 +1,200 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/line_tracker/line_tracker.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/line_tracker - line_tracker.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:32247467.9 %
    Date:2024-04-18 23:11:36Functions:193063.3 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_trackers::line_tracker::LineTracker::deactivate()0
    mrs_uav_trackers::line_tracker::LineTracker::resetStatic()0
    mrs_uav_trackers::line_tracker::LineTracker::enableCallbacks(boost::shared_ptr<std_srvs::SetBoolRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::line_tracker::LineTracker::gotoTrajectoryStart(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::line_tracker::LineTracker::setVelocityReference(boost::shared_ptr<mrs_msgs::VelocityReferenceSrvRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::line_tracker::LineTracker::switchOdometrySource(mrs_msgs::UavState_<std::allocator<void> > const&)0
    mrs_uav_trackers::line_tracker::LineTracker::setTrajectoryReference(boost::shared_ptr<mrs_msgs::TrajectoryReferenceSrvRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::line_tracker::LineTracker::stopTrajectoryTracking(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::line_tracker::LineTracker::startTrajectoryTracking(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::line_tracker::LineTracker::resumeTrajectoryTracking(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::line_tracker::LineTracker::hover(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    (anonymous namespace)::ProxyExec0::ProxyExec0()1
    mrs_uav_trackers::line_tracker::LineTracker::initialize(ros::NodeHandle const&, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t>, std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t>)1
    mrs_uav_trackers::line_tracker::LineTracker::setReference(boost::shared_ptr<mrs_msgs::ReferenceSrvRequest_<std::allocator<void> > const> const&)1
    mrs_uav_trackers::line_tracker::LineTracker::activate[abi:cxx11](std::optional<mrs_msgs::TrackerCommand_<std::allocator<void> > > const&)1
    mrs_uav_trackers::line_tracker::LineTracker::stopVerticalMotion()2
    mrs_uav_trackers::line_tracker::LineTracker::stopHorizontalMotion()2
    mrs_uav_trackers::line_tracker::LineTracker::setConstraints(boost::shared_ptr<mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> > const> const&)3
    mrs_uav_trackers::line_tracker::LineTracker::changeState(mrs_uav_trackers::line_tracker::States_t)6
    mrs_uav_trackers::line_tracker::LineTracker::changeStateVertical(mrs_uav_trackers::line_tracker::States_t)8
    mrs_uav_trackers::line_tracker::LineTracker::changeStateHorizontal(mrs_uav_trackers::line_tracker::States_t)8
    mrs_uav_trackers::line_tracker::LineTracker::stopHorizontal()46
    mrs_uav_trackers::line_tracker::LineTracker::decelerateVertical()100
    mrs_uav_trackers::line_tracker::LineTracker::decelerateHorizontal()100
    mrs_uav_trackers::line_tracker::LineTracker::getStatus()180
    mrs_uav_trackers::line_tracker::LineTracker::accelerateVertical()199
    mrs_uav_trackers::line_tracker::LineTracker::stopVertical()851
    mrs_uav_trackers::line_tracker::LineTracker::accelerateHorizontal()1004
    mrs_uav_trackers::line_tracker::LineTracker::update(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_uav_managers::Controller::ControlOutput const&)1655
    mrs_uav_trackers::line_tracker::LineTracker::mainTimer(ros::TimerEvent const&)2216
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/line_tracker/line_tracker.cpp.func.html b/mrs_uav_trackers/src/line_tracker/line_tracker.cpp.func.html new file mode 100644 index 0000000000..67278f5ccc --- /dev/null +++ b/mrs_uav_trackers/src/line_tracker/line_tracker.cpp.func.html @@ -0,0 +1,200 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/line_tracker/line_tracker.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/line_tracker - line_tracker.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:32247467.9 %
    Date:2024-04-18 23:11:36Functions:193063.3 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    (anonymous namespace)::ProxyExec0::ProxyExec0()1
    mrs_uav_trackers::line_tracker::LineTracker::deactivate()0
    mrs_uav_trackers::line_tracker::LineTracker::initialize(ros::NodeHandle const&, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t>, std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t>)1
    mrs_uav_trackers::line_tracker::LineTracker::changeState(mrs_uav_trackers::line_tracker::States_t)6
    mrs_uav_trackers::line_tracker::LineTracker::resetStatic()0
    mrs_uav_trackers::line_tracker::LineTracker::setReference(boost::shared_ptr<mrs_msgs::ReferenceSrvRequest_<std::allocator<void> > const> const&)1
    mrs_uav_trackers::line_tracker::LineTracker::stopVertical()851
    mrs_uav_trackers::line_tracker::LineTracker::setConstraints(boost::shared_ptr<mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> > const> const&)3
    mrs_uav_trackers::line_tracker::LineTracker::stopHorizontal()46
    mrs_uav_trackers::line_tracker::LineTracker::enableCallbacks(boost::shared_ptr<std_srvs::SetBoolRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::line_tracker::LineTracker::accelerateVertical()199
    mrs_uav_trackers::line_tracker::LineTracker::decelerateVertical()100
    mrs_uav_trackers::line_tracker::LineTracker::stopVerticalMotion()2
    mrs_uav_trackers::line_tracker::LineTracker::changeStateVertical(mrs_uav_trackers::line_tracker::States_t)8
    mrs_uav_trackers::line_tracker::LineTracker::gotoTrajectoryStart(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::line_tracker::LineTracker::accelerateHorizontal()1004
    mrs_uav_trackers::line_tracker::LineTracker::decelerateHorizontal()100
    mrs_uav_trackers::line_tracker::LineTracker::setVelocityReference(boost::shared_ptr<mrs_msgs::VelocityReferenceSrvRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::line_tracker::LineTracker::stopHorizontalMotion()2
    mrs_uav_trackers::line_tracker::LineTracker::switchOdometrySource(mrs_msgs::UavState_<std::allocator<void> > const&)0
    mrs_uav_trackers::line_tracker::LineTracker::changeStateHorizontal(mrs_uav_trackers::line_tracker::States_t)8
    mrs_uav_trackers::line_tracker::LineTracker::setTrajectoryReference(boost::shared_ptr<mrs_msgs::TrajectoryReferenceSrvRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::line_tracker::LineTracker::stopTrajectoryTracking(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::line_tracker::LineTracker::startTrajectoryTracking(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::line_tracker::LineTracker::resumeTrajectoryTracking(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::line_tracker::LineTracker::hover(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::line_tracker::LineTracker::update(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_uav_managers::Controller::ControlOutput const&)1655
    mrs_uav_trackers::line_tracker::LineTracker::activate[abi:cxx11](std::optional<mrs_msgs::TrackerCommand_<std::allocator<void> > > const&)1
    mrs_uav_trackers::line_tracker::LineTracker::getStatus()180
    mrs_uav_trackers::line_tracker::LineTracker::mainTimer(ros::TimerEvent const&)2216
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/line_tracker/line_tracker.cpp.gcov.frameset.html b/mrs_uav_trackers/src/line_tracker/line_tracker.cpp.gcov.frameset.html new file mode 100644 index 0000000000..e94e1aecd5 --- /dev/null +++ b/mrs_uav_trackers/src/line_tracker/line_tracker.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/line_tracker/line_tracker.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_trackers/src/line_tracker/line_tracker.cpp.gcov.html b/mrs_uav_trackers/src/line_tracker/line_tracker.cpp.gcov.html new file mode 100644 index 0000000000..6aec83119b --- /dev/null +++ b/mrs_uav_trackers/src/line_tracker/line_tracker.cpp.gcov.html @@ -0,0 +1,1359 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/line_tracker/line_tracker.cpp + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/line_tracker - line_tracker.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:32247467.9 %
    Date:2024-04-18 23:11:36Functions:193063.3 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : /* includes //{ */
    +       2             : 
    +       3             : #include <ros/ros.h>
    +       4             : #include <ros/package.h>
    +       5             : 
    +       6             : #include <mrs_uav_managers/tracker.h>
    +       7             : 
    +       8             : #include <mrs_lib/profiler.h>
    +       9             : #include <mrs_lib/mutex.h>
    +      10             : #include <mrs_lib/attitude_converter.h>
    +      11             : #include <mrs_lib/utils.h>
    +      12             : #include <mrs_lib/geometry/cyclic.h>
    +      13             : #include <mrs_lib/geometry/misc.h>
    +      14             : 
    +      15             : #include <mrs_msgs/VelocityReferenceSrv.h>
    +      16             : 
    +      17             : //}
    +      18             : 
    +      19             : /* defines //{ */
    +      20             : 
    +      21             : #define STOP_THR 1e-3
    +      22             : 
    +      23             : //}
    +      24             : 
    +      25             : /* using //{ */
    +      26             : 
    +      27             : using namespace Eigen;
    +      28             : 
    +      29             : using vec2_t = mrs_lib::geometry::vec_t<2>;
    +      30             : using vec3_t = mrs_lib::geometry::vec_t<3>;
    +      31             : 
    +      32             : using radians  = mrs_lib::geometry::radians;
    +      33             : using sradians = mrs_lib::geometry::sradians;
    +      34             : 
    +      35             : //}
    +      36             : 
    +      37             : namespace mrs_uav_trackers
    +      38             : {
    +      39             : 
    +      40             : namespace line_tracker
    +      41             : {
    +      42             : 
    +      43             : /* //{ class LineTracker */
    +      44             : 
    +      45             : // state machine
    +      46             : typedef enum
    +      47             : {
    +      48             : 
    +      49             :   IDLE_STATE,
    +      50             :   STOP_MOTION_STATE,
    +      51             :   ACCELERATING_STATE,
    +      52             :   DECELERATING_STATE,
    +      53             :   STOPPING_STATE,
    +      54             : 
    +      55             : } States_t;
    +      56             : 
    +      57             : const char *state_names[5] = {
    +      58             : 
    +      59             :     "IDLING", "STOPPING_MOTION", "ACCELERATING", "DECELERATING", "STOPPING"};
    +      60             : 
    +      61             : class LineTracker : public mrs_uav_managers::Tracker {
    +      62             : public:
    +      63             :   bool initialize(const ros::NodeHandle &nh, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t> common_handlers,
    +      64             :                   std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t> private_handlers);
    +      65             : 
    +      66             :   std::tuple<bool, std::string> activate(const std::optional<mrs_msgs::TrackerCommand> &last_tracker_cmd);
    +      67             :   void                          deactivate(void);
    +      68             :   bool                          resetStatic(void);
    +      69             : 
    +      70             :   std::optional<mrs_msgs::TrackerCommand>   update(const mrs_msgs::UavState &uav_state, const mrs_uav_managers::Controller::ControlOutput &last_control_output);
    +      71             :   const mrs_msgs::TrackerStatus             getStatus();
    +      72             :   const std_srvs::SetBoolResponse::ConstPtr enableCallbacks(const std_srvs::SetBoolRequest::ConstPtr &cmd);
    +      73             :   const std_srvs::TriggerResponse::ConstPtr switchOdometrySource(const mrs_msgs::UavState &new_uav_state);
    +      74             : 
    +      75             :   const mrs_msgs::ReferenceSrvResponse::ConstPtr           setReference(const mrs_msgs::ReferenceSrvRequest::ConstPtr &cmd);
    +      76             :   const mrs_msgs::VelocityReferenceSrvResponse::ConstPtr   setVelocityReference(const mrs_msgs::VelocityReferenceSrvRequest::ConstPtr &cmd);
    +      77             :   const mrs_msgs::TrajectoryReferenceSrvResponse::ConstPtr setTrajectoryReference(const mrs_msgs::TrajectoryReferenceSrvRequest::ConstPtr &cmd);
    +      78             : 
    +      79             :   const mrs_msgs::DynamicsConstraintsSrvResponse::ConstPtr setConstraints(const mrs_msgs::DynamicsConstraintsSrvRequest::ConstPtr &cmd);
    +      80             : 
    +      81             :   const std_srvs::TriggerResponse::ConstPtr hover(const std_srvs::TriggerRequest::ConstPtr &cmd);
    +      82             :   const std_srvs::TriggerResponse::ConstPtr startTrajectoryTracking(const std_srvs::TriggerRequest::ConstPtr &cmd);
    +      83             :   const std_srvs::TriggerResponse::ConstPtr stopTrajectoryTracking(const std_srvs::TriggerRequest::ConstPtr &cmd);
    +      84             :   const std_srvs::TriggerResponse::ConstPtr resumeTrajectoryTracking(const std_srvs::TriggerRequest::ConstPtr &cmd);
    +      85             :   const std_srvs::TriggerResponse::ConstPtr gotoTrajectoryStart(const std_srvs::TriggerRequest::ConstPtr &cmd);
    +      86             : 
    +      87             : private:
    +      88             :   ros::NodeHandle nh_;
    +      89             : 
    +      90             :   std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t>  common_handlers_;
    +      91             :   std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t> private_handlers_;
    +      92             : 
    +      93             :   bool callbacks_enabled_ = true;
    +      94             : 
    +      95             :   std::string _uav_name_;
    +      96             : 
    +      97             :   void       mainTimer(const ros::TimerEvent &event);
    +      98             :   ros::Timer main_timer_;
    +      99             : 
    +     100             :   // | ------------------------ uav state ----------------------- |
    +     101             : 
    +     102             :   mrs_msgs::UavState uav_state_;
    +     103             :   bool               got_uav_state_ = false;
    +     104             :   std::mutex         mutex_uav_state_;
    +     105             : 
    +     106             :   double uav_x_;
    +     107             :   double uav_y_;
    +     108             :   double uav_z_;
    +     109             : 
    +     110             :   // tracker's inner states
    +     111             :   double _tracker_loop_rate_;
    +     112             :   double _tracker_dt_;
    +     113             :   bool   is_initialized_ = false;
    +     114             :   bool   is_active_      = false;
    +     115             : 
    +     116             :   // | ----------------- internal state mmachine ---------------- |
    +     117             : 
    +     118             :   States_t current_state_vertical_    = IDLE_STATE;
    +     119             :   States_t previous_state_vertical_   = IDLE_STATE;
    +     120             :   States_t current_state_horizontal_  = IDLE_STATE;
    +     121             :   States_t previous_state_horizontal_ = IDLE_STATE;
    +     122             : 
    +     123             :   void changeStateHorizontal(States_t new_state);
    +     124             :   void changeStateVertical(States_t new_state);
    +     125             :   void changeState(States_t new_state);
    +     126             : 
    +     127             :   void stopHorizontalMotion(void);
    +     128             :   void stopVerticalMotion(void);
    +     129             :   void accelerateHorizontal(void);
    +     130             :   void accelerateVertical(void);
    +     131             :   void decelerateHorizontal(void);
    +     132             :   void decelerateVertical(void);
    +     133             :   void stopHorizontal(void);
    +     134             :   void stopVertical(void);
    +     135             : 
    +     136             :   // | ------------------ dynamics constraints ------------------ |
    +     137             : 
    +     138             :   double     _horizontal_speed_;
    +     139             :   double     _vertical_speed_;
    +     140             :   double     _horizontal_acceleration_;
    +     141             :   double     _vertical_acceleration_;
    +     142             :   double     _heading_rate_;
    +     143             :   double     _heading_gain_;
    +     144             :   std::mutex mutex_constraints_;
    +     145             : 
    +     146             :   // | ---------------------- desired goal ---------------------- |
    +     147             : 
    +     148             :   double     goal_x_;
    +     149             :   double     goal_y_;
    +     150             :   double     goal_z_;
    +     151             :   double     goal_heading_;
    +     152             :   bool       have_goal_ = false;
    +     153             :   std::mutex mutex_goal_;
    +     154             : 
    +     155             :   // | ------------------- the state variables ------------------ |
    +     156             :   double state_x_;
    +     157             :   double state_y_;
    +     158             :   double state_z_;
    +     159             :   double state_heading_;
    +     160             : 
    +     161             :   double speed_x_;
    +     162             :   double speed_y_;
    +     163             :   double speed_heading_;
    +     164             : 
    +     165             :   double current_heading_;
    +     166             :   double current_vertical_direction_;
    +     167             : 
    +     168             :   double current_vertical_speed_;
    +     169             :   double current_horizontal_speed_;
    +     170             : 
    +     171             :   double current_horizontal_acceleration_;
    +     172             :   double current_vertical_acceleration_;
    +     173             : 
    +     174             :   std::mutex mutex_state_;
    +     175             : 
    +     176             :   // | ------------------------ profiler ------------------------ |
    +     177             : 
    +     178             :   mrs_lib::Profiler profiler_;
    +     179             :   bool              _profiler_enabled_ = false;
    +     180             : };
    +     181             : 
    +     182             : //}
    +     183             : 
    +     184             : // | -------------- tracker's interface routines -------------- |
    +     185             : 
    +     186             : /* //{ initialize() */
    +     187             : 
    +     188           1 : bool LineTracker::initialize(const ros::NodeHandle &nh, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t> common_handlers,
    +     189             :                              std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t> private_handlers) {
    +     190             : 
    +     191           1 :   this->common_handlers_  = common_handlers;
    +     192           1 :   this->private_handlers_ = private_handlers;
    +     193             : 
    +     194           1 :   _uav_name_ = common_handlers->uav_name;
    +     195             : 
    +     196           1 :   nh_ = nh;
    +     197             : 
    +     198           1 :   ros::Time::waitForValid();
    +     199             : 
    +     200             :   // --------------------------------------------------------------
    +     201             :   // |                     loading parameters                     |
    +     202             :   // --------------------------------------------------------------
    +     203             : 
    +     204             :   // | ---------- loading params using the parent's nh ---------- |
    +     205             : 
    +     206           2 :   mrs_lib::ParamLoader param_loader_parent(common_handlers->parent_nh, "ControlManager");
    +     207             : 
    +     208           1 :   param_loader_parent.loadParam("enable_profiler", _profiler_enabled_);
    +     209             : 
    +     210           1 :   if (!param_loader_parent.loadedSuccessfully()) {
    +     211           0 :     ROS_ERROR("[LineTracker]: Could not load all parameters!");
    +     212           0 :     return false;
    +     213             :   }
    +     214             : 
    +     215             :   // | ---------------- load plugin's parameters ---------------- |
    +     216             : 
    +     217           1 :   private_handlers->param_loader->addYamlFile(ros::package::getPath("mrs_uav_trackers") + "/config/private/line_tracker.yaml");
    +     218           1 :   private_handlers->param_loader->addYamlFile(ros::package::getPath("mrs_uav_trackers") + "/config/public/line_tracker.yaml");
    +     219             : 
    +     220           2 :   const std::string yaml_prefix = "mrs_uav_trackers/line_tracker/";
    +     221             : 
    +     222           1 :   private_handlers->param_loader->loadParam(yaml_prefix + "horizontal_tracker/horizontal_speed", _horizontal_speed_);
    +     223           1 :   private_handlers->param_loader->loadParam(yaml_prefix + "horizontal_tracker/horizontal_acceleration", _horizontal_acceleration_);
    +     224             : 
    +     225           1 :   private_handlers->param_loader->loadParam(yaml_prefix + "vertical_tracker/vertical_speed", _vertical_speed_);
    +     226           1 :   private_handlers->param_loader->loadParam(yaml_prefix + "vertical_tracker/vertical_acceleration", _vertical_acceleration_);
    +     227             : 
    +     228           1 :   private_handlers->param_loader->loadParam(yaml_prefix + "heading_tracker/heading_rate", _heading_rate_);
    +     229           1 :   private_handlers->param_loader->loadParam(yaml_prefix + "heading_tracker/heading_gain", _heading_gain_);
    +     230             : 
    +     231           1 :   private_handlers->param_loader->loadParam(yaml_prefix + "tracker_loop_rate", _tracker_loop_rate_);
    +     232             : 
    +     233           1 :   _tracker_dt_ = 1.0 / double(_tracker_loop_rate_);
    +     234             : 
    +     235           1 :   ROS_INFO("[LineTracker]: tracker_dt: %.2f", _tracker_dt_);
    +     236             : 
    +     237           1 :   state_x_       = 0;
    +     238           1 :   state_y_       = 0;
    +     239           1 :   state_z_       = 0;
    +     240           1 :   state_heading_ = 0;
    +     241             : 
    +     242           1 :   speed_x_       = 0;
    +     243           1 :   speed_y_       = 0;
    +     244           1 :   speed_heading_ = 0;
    +     245             : 
    +     246           1 :   current_horizontal_speed_ = 0;
    +     247           1 :   current_vertical_speed_   = 0;
    +     248             : 
    +     249           1 :   current_horizontal_acceleration_ = 0;
    +     250           1 :   current_vertical_acceleration_   = 0;
    +     251             : 
    +     252           1 :   current_vertical_direction_ = 0;
    +     253             : 
    +     254           1 :   current_state_vertical_  = IDLE_STATE;
    +     255           1 :   previous_state_vertical_ = IDLE_STATE;
    +     256             : 
    +     257           1 :   current_state_horizontal_  = IDLE_STATE;
    +     258           1 :   previous_state_horizontal_ = IDLE_STATE;
    +     259             : 
    +     260             :   // --------------------------------------------------------------
    +     261             :   // |                          profiler                          |
    +     262             :   // --------------------------------------------------------------
    +     263             : 
    +     264           1 :   profiler_ = mrs_lib::Profiler(common_handlers->parent_nh, "LineTracker", _profiler_enabled_);
    +     265             : 
    +     266             :   // --------------------------------------------------------------
    +     267             :   // |                           timers                           |
    +     268             :   // --------------------------------------------------------------
    +     269             : 
    +     270           1 :   main_timer_ = nh_.createTimer(ros::Rate(_tracker_loop_rate_), &LineTracker::mainTimer, this);
    +     271             : 
    +     272           1 :   if (!private_handlers->param_loader->loadedSuccessfully()) {
    +     273           0 :     ROS_ERROR("[LineTracker]: could not load all parameters!");
    +     274           0 :     return false;
    +     275             :   }
    +     276             : 
    +     277           1 :   is_initialized_ = true;
    +     278             : 
    +     279           1 :   ROS_INFO("[LineTracker]: initialized");
    +     280             : 
    +     281           1 :   return true;
    +     282             : }
    +     283             : 
    +     284             : //}
    +     285             : 
    +     286             : /* //{ activate() */
    +     287             : 
    +     288           1 : std::tuple<bool, std::string> LineTracker::activate(const std::optional<mrs_msgs::TrackerCommand> &last_tracker_cmd) {
    +     289             : 
    +     290           2 :   std::stringstream ss;
    +     291             : 
    +     292           1 :   if (!got_uav_state_) {
    +     293             : 
    +     294           0 :     ss << "odometry not set";
    +     295           0 :     ROS_ERROR_STREAM("[LineTracker]: " << ss.str());
    +     296           0 :     return std::tuple(false, ss.str());
    +     297             :   }
    +     298             : 
    +     299             :   // copy member variables
    +     300           2 :   auto uav_state = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +     301             : 
    +     302             :   double uav_heading;
    +     303             : 
    +     304             :   try {
    +     305           1 :     uav_heading = mrs_lib::AttitudeConverter(uav_state.pose.orientation).getHeading();
    +     306             :   }
    +     307           0 :   catch (...) {
    +     308           0 :     ss << "could not calculate the UAV heading";
    +     309           0 :     return std::tuple(false, ss.str());
    +     310             :   }
    +     311             : 
    +     312             :   {
    +     313           2 :     std::scoped_lock lock(mutex_goal_, mutex_state_);
    +     314             : 
    +     315           1 :     if (last_tracker_cmd) {
    +     316             : 
    +     317             :       // the last command is usable
    +     318           1 :       if (last_tracker_cmd->use_position_horizontal) {
    +     319           1 :         state_x_ = last_tracker_cmd->position.x;
    +     320           1 :         state_y_ = last_tracker_cmd->position.y;
    +     321             :       } else {
    +     322           0 :         state_x_ = uav_state.pose.position.x;
    +     323           0 :         state_y_ = uav_state.pose.position.y;
    +     324             :       }
    +     325             : 
    +     326           1 :       if (last_tracker_cmd->use_position_vertical) {
    +     327           1 :         state_z_ = last_tracker_cmd->position.z;
    +     328             :       } else {
    +     329           0 :         state_z_ = uav_state.pose.position.z;
    +     330             :       }
    +     331             : 
    +     332           1 :       if (last_tracker_cmd->use_heading) {
    +     333           1 :         state_heading_ = last_tracker_cmd->heading;
    +     334           0 :       } else if (last_tracker_cmd->use_orientation) {
    +     335             :         try {
    +     336           0 :           state_heading_ = mrs_lib::AttitudeConverter(last_tracker_cmd->orientation).getHeading();
    +     337             :         }
    +     338           0 :         catch (...) {
    +     339           0 :           state_heading_ = uav_heading;
    +     340             :         }
    +     341             :       } else {
    +     342           0 :         state_heading_ = uav_heading;
    +     343             :       }
    +     344             : 
    +     345           1 :       if (last_tracker_cmd->use_velocity_horizontal) {
    +     346           1 :         speed_x_ = last_tracker_cmd->velocity.x;
    +     347           1 :         speed_y_ = last_tracker_cmd->velocity.y;
    +     348             :       } else {
    +     349           0 :         speed_x_ = uav_state.velocity.linear.x;
    +     350           0 :         speed_y_ = uav_state.velocity.linear.y;
    +     351             :       }
    +     352             : 
    +     353           1 :       current_heading_          = atan2(speed_y_, speed_x_);
    +     354           1 :       current_horizontal_speed_ = sqrt(pow(speed_x_, 2) + pow(speed_y_, 2));
    +     355             : 
    +     356           1 :       current_vertical_speed_     = fabs(last_tracker_cmd->velocity.z);
    +     357           1 :       current_vertical_direction_ = last_tracker_cmd->velocity.z > 0 ? +1 : -1;
    +     358             : 
    +     359           1 :       current_horizontal_acceleration_ = 0;
    +     360           1 :       current_vertical_acceleration_   = 0;
    +     361             : 
    +     362           1 :       goal_heading_ = last_tracker_cmd->heading;
    +     363             : 
    +     364           1 :       ROS_INFO("[LineTracker]: initial condition: x=%.2f, y=%.2f, z=%.2f, heading=%.2f", last_tracker_cmd->position.x, last_tracker_cmd->position.y,
    +     365             :                last_tracker_cmd->position.z, last_tracker_cmd->heading);
    +     366           1 :       ROS_INFO("[LineTracker]: initial condition: x_rate=%.2f, y_rate=%.2f, z_rate=%.2f", speed_x_, speed_y_, current_vertical_speed_);
    +     367             : 
    +     368             :     } else {
    +     369             : 
    +     370           0 :       state_x_       = uav_state.pose.position.x;
    +     371           0 :       state_y_       = uav_state.pose.position.y;
    +     372           0 :       state_z_       = uav_state.pose.position.z;
    +     373           0 :       state_heading_ = uav_heading;
    +     374             : 
    +     375           0 :       speed_x_                  = uav_state.velocity.linear.x;
    +     376           0 :       speed_y_                  = uav_state.velocity.linear.y;
    +     377           0 :       current_heading_          = atan2(speed_y_, speed_x_);
    +     378           0 :       current_horizontal_speed_ = sqrt(pow(speed_x_, 2) + pow(speed_y_, 2));
    +     379             : 
    +     380           0 :       current_vertical_speed_     = fabs(uav_state.velocity.linear.z);
    +     381           0 :       current_vertical_direction_ = uav_state.velocity.linear.z > 0 ? +1 : -1;
    +     382             : 
    +     383           0 :       current_horizontal_acceleration_ = 0;
    +     384           0 :       current_vertical_acceleration_   = 0;
    +     385             : 
    +     386           0 :       goal_heading_ = uav_heading;
    +     387             : 
    +     388           0 :       ROS_WARN("[LineTracker]: the previous command is not usable for activation, using Odometry instead");
    +     389             :     }
    +     390             :   }
    +     391             : 
    +     392             :   // --------------------------------------------------------------
    +     393             :   // |          horizontal initial conditions prediction          |
    +     394             :   // --------------------------------------------------------------
    +     395             : 
    +     396             :   double horizontal_t_stop, horizontal_stop_dist, stop_dist_x, stop_dist_y;
    +     397             : 
    +     398             :   {
    +     399           1 :     std::scoped_lock lock(mutex_state_);
    +     400             : 
    +     401           1 :     horizontal_t_stop    = current_horizontal_speed_ / _horizontal_acceleration_;
    +     402           1 :     horizontal_stop_dist = (horizontal_t_stop * current_horizontal_speed_) / 2.0;
    +     403           1 :     stop_dist_x          = cos(current_heading_) * horizontal_stop_dist;
    +     404           1 :     stop_dist_y          = sin(current_heading_) * horizontal_stop_dist;
    +     405             :   }
    +     406             : 
    +     407             :   // --------------------------------------------------------------
    +     408             :   // |           vertical initial conditions prediction           |
    +     409             :   // --------------------------------------------------------------
    +     410             : 
    +     411             :   double vertical_t_stop, vertical_stop_dist;
    +     412             : 
    +     413             :   {
    +     414           1 :     std::scoped_lock lock(mutex_state_);
    +     415             : 
    +     416           1 :     vertical_t_stop    = current_vertical_speed_ / _vertical_acceleration_;
    +     417           1 :     vertical_stop_dist = current_vertical_direction_ * (vertical_t_stop * current_vertical_speed_) / 2.0;
    +     418             :   }
    +     419             : 
    +     420             :   // --------------------------------------------------------------
    +     421             :   // |              heading initial condition  prediction             |
    +     422             :   // --------------------------------------------------------------
    +     423             : 
    +     424             :   {
    +     425           2 :     std::scoped_lock lock(mutex_goal_, mutex_state_);
    +     426             : 
    +     427           1 :     goal_x_ = state_x_ + stop_dist_x;
    +     428           1 :     goal_y_ = state_y_ + stop_dist_y;
    +     429           1 :     goal_z_ = state_z_ + vertical_stop_dist;
    +     430             : 
    +     431           1 :     ROS_INFO("[LineTracker]: setting z goal to %.2f", goal_z_);
    +     432             :   }
    +     433             : 
    +     434           1 :   is_active_ = true;
    +     435             : 
    +     436           1 :   ss << "activated";
    +     437           1 :   ROS_INFO_STREAM("[LineTracker]: " << ss.str());
    +     438             : 
    +     439           1 :   changeState(STOP_MOTION_STATE);
    +     440             : 
    +     441           1 :   return std::tuple(true, ss.str());
    +     442             : }
    +     443             : 
    +     444             : //}
    +     445             : 
    +     446             : /* //{ deactivate() */
    +     447             : 
    +     448           0 : void LineTracker::deactivate(void) {
    +     449             : 
    +     450           0 :   is_active_ = false;
    +     451             : 
    +     452           0 :   ROS_INFO("[LineTracker]: deactivated");
    +     453           0 : }
    +     454             : 
    +     455             : //}
    +     456             : 
    +     457             : /* //{ resetStatic() */
    +     458             : 
    +     459           0 : bool LineTracker::resetStatic(void) {
    +     460             : 
    +     461           0 :   if (!is_initialized_) {
    +     462           0 :     ROS_ERROR("[LineTracker]: can not reset, not initialized");
    +     463           0 :     return false;
    +     464             :   }
    +     465             : 
    +     466           0 :   if (!is_active_) {
    +     467           0 :     ROS_ERROR("[LineTracker]: can not reset, not active");
    +     468           0 :     return false;
    +     469             :   }
    +     470             : 
    +     471           0 :   ROS_INFO("[LineTracker]: reseting with no dynamics");
    +     472             : 
    +     473           0 :   auto uav_state = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +     474             : 
    +     475             :   double uav_heading;
    +     476             :   try {
    +     477           0 :     uav_heading = mrs_lib::AttitudeConverter(uav_state.pose.orientation).getHeading();
    +     478             :   }
    +     479           0 :   catch (...) {
    +     480           0 :     ROS_ERROR_THROTTLE(1.0, "[LineTracker]: could not calculate the UAV heading");
    +     481           0 :     return false;
    +     482             :   }
    +     483             : 
    +     484             :   {
    +     485           0 :     std::scoped_lock lock(mutex_goal_, mutex_state_, mutex_uav_state_);
    +     486             : 
    +     487           0 :     state_x_       = uav_state_.pose.position.x;
    +     488           0 :     state_y_       = uav_state_.pose.position.y;
    +     489           0 :     state_z_       = uav_state_.pose.position.z;
    +     490           0 :     state_heading_ = uav_heading;
    +     491             : 
    +     492           0 :     speed_x_                  = 0;
    +     493           0 :     speed_y_                  = 0;
    +     494           0 :     current_heading_          = 0;
    +     495           0 :     current_horizontal_speed_ = 0;
    +     496             : 
    +     497           0 :     current_vertical_speed_     = 0;
    +     498           0 :     current_vertical_direction_ = 0;
    +     499             : 
    +     500           0 :     current_horizontal_acceleration_ = 0;
    +     501           0 :     current_vertical_acceleration_   = 0;
    +     502             : 
    +     503           0 :     goal_heading_ = uav_heading;
    +     504             :   }
    +     505             : 
    +     506           0 :   changeState(IDLE_STATE);
    +     507             : 
    +     508           0 :   return true;
    +     509             : }
    +     510             : 
    +     511             : //}
    +     512             : 
    +     513             : /* //{ update() */
    +     514             : 
    +     515        1655 : std::optional<mrs_msgs::TrackerCommand> LineTracker::update(const mrs_msgs::UavState &                                          uav_state,
    +     516             :                                                             [[maybe_unused]] const mrs_uav_managers::Controller::ControlOutput &last_control_output) {
    +     517             : 
    +     518        4965 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("update");
    +     519        4965 :   mrs_lib::ScopeTimer timer = mrs_lib::ScopeTimer("LineTracker::update", common_handlers_->scope_timer.logger, common_handlers_->scope_timer.enabled);
    +     520             : 
    +     521             :   {
    +     522        1655 :     std::scoped_lock lock(mutex_uav_state_);
    +     523             : 
    +     524        1655 :     uav_state_ = uav_state;
    +     525        1655 :     uav_x_     = uav_state_.pose.position.x;
    +     526        1655 :     uav_y_     = uav_state_.pose.position.y;
    +     527        1655 :     uav_z_     = uav_state_.pose.position.z;
    +     528             : 
    +     529        1655 :     got_uav_state_ = true;
    +     530             :   }
    +     531             : 
    +     532             :   // up to this part the update() method is evaluated even when the tracker is not active
    +     533        1655 :   if (!is_active_) {
    +     534         104 :     return {};
    +     535             :   }
    +     536             : 
    +     537        3102 :   mrs_msgs::TrackerCommand tracker_cmd;
    +     538             : 
    +     539        1551 :   tracker_cmd.header.stamp    = ros::Time::now();
    +     540        1551 :   tracker_cmd.header.frame_id = uav_state.header.frame_id;
    +     541             : 
    +     542             :   {
    +     543        1551 :     std::scoped_lock lock(mutex_state_);
    +     544             : 
    +     545        1551 :     tracker_cmd.position.x = state_x_;
    +     546        1551 :     tracker_cmd.position.y = state_y_;
    +     547        1551 :     tracker_cmd.position.z = state_z_;
    +     548        1551 :     tracker_cmd.heading    = radians::wrap(state_heading_);
    +     549             : 
    +     550        1551 :     tracker_cmd.velocity.x   = cos(current_heading_) * current_horizontal_speed_;
    +     551        1551 :     tracker_cmd.velocity.y   = sin(current_heading_) * current_horizontal_speed_;
    +     552        1551 :     tracker_cmd.velocity.z   = current_vertical_direction_ * current_vertical_speed_;
    +     553        1551 :     tracker_cmd.heading_rate = speed_heading_;
    +     554             : 
    +     555        1551 :     tracker_cmd.acceleration.x = 0;
    +     556        1551 :     tracker_cmd.acceleration.y = 0;
    +     557        1551 :     tracker_cmd.acceleration.z = current_vertical_direction_ * current_vertical_acceleration_;
    +     558             : 
    +     559        1551 :     tracker_cmd.use_position_vertical   = 1;
    +     560        1551 :     tracker_cmd.use_position_horizontal = 1;
    +     561        1551 :     tracker_cmd.use_heading             = 1;
    +     562        1551 :     tracker_cmd.use_heading_rate        = 1;
    +     563        1551 :     tracker_cmd.use_velocity_vertical   = 1;
    +     564        1551 :     tracker_cmd.use_velocity_horizontal = 1;
    +     565        1551 :     tracker_cmd.use_acceleration        = 1;
    +     566             :   }
    +     567             : 
    +     568        1551 :   return {tracker_cmd};
    +     569             : }
    +     570             : 
    +     571             : //}
    +     572             : 
    +     573             : /* //{ getStatus() */
    +     574             : 
    +     575         180 : const mrs_msgs::TrackerStatus LineTracker::getStatus() {
    +     576             : 
    +     577         180 :   mrs_msgs::TrackerStatus tracker_status;
    +     578             : 
    +     579         180 :   tracker_status.active            = is_active_;
    +     580         180 :   tracker_status.callbacks_enabled = callbacks_enabled_;
    +     581             : 
    +     582         180 :   bool idling = current_state_vertical_ == IDLE_STATE && current_state_horizontal_ == IDLE_STATE;
    +     583             : 
    +     584         180 :   tracker_status.have_goal = !idling;
    +     585             : 
    +     586         180 :   tracker_status.tracking_trajectory = false;
    +     587             : 
    +     588         180 :   return tracker_status;
    +     589             : }
    +     590             : 
    +     591             : //}
    +     592             : 
    +     593             : /* //{ enableCallbacks() */
    +     594             : 
    +     595           0 : const std_srvs::SetBoolResponse::ConstPtr LineTracker::enableCallbacks(const std_srvs::SetBoolRequest::ConstPtr &cmd) {
    +     596             : 
    +     597           0 :   std_srvs::SetBoolResponse res;
    +     598           0 :   std::stringstream         ss;
    +     599             : 
    +     600           0 :   if (cmd->data != callbacks_enabled_) {
    +     601             : 
    +     602           0 :     callbacks_enabled_ = cmd->data;
    +     603             : 
    +     604           0 :     ss << "callbacks " << (callbacks_enabled_ ? "enabled" : "disabled");
    +     605           0 :     ROS_INFO_STREAM_THROTTLE(1.0, "[LineTracker]: " << ss.str());
    +     606             : 
    +     607             :   } else {
    +     608             : 
    +     609           0 :     ss << "callbacks were already " << (callbacks_enabled_ ? "enabled" : "disabled");
    +     610           0 :     ROS_WARN_STREAM_THROTTLE(1.0, "[LineTracker]: " << ss.str());
    +     611             :   }
    +     612             : 
    +     613           0 :   res.message = ss.str();
    +     614           0 :   res.success = true;
    +     615             : 
    +     616           0 :   return std_srvs::SetBoolResponse::ConstPtr(new std_srvs::SetBoolResponse(res));
    +     617             : }
    +     618             : 
    +     619             : //}
    +     620             : 
    +     621             : /* switchOdometrySource() //{ */
    +     622             : 
    +     623           0 : const std_srvs::TriggerResponse::ConstPtr LineTracker::switchOdometrySource(const mrs_msgs::UavState &new_uav_state) {
    +     624             : 
    +     625           0 :   std::scoped_lock lock(mutex_goal_, mutex_state_);
    +     626             : 
    +     627           0 :   auto uav_state = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +     628             : 
    +     629           0 :   double old_heading  = 0;
    +     630           0 :   double new_heading  = 0;
    +     631           0 :   bool   got_headings = true;
    +     632             : 
    +     633             :   try {
    +     634           0 :     old_heading = mrs_lib::AttitudeConverter(uav_state.pose.orientation).getHeading();
    +     635             :   }
    +     636           0 :   catch (...) {
    +     637           0 :     ROS_ERROR_THROTTLE(1.0, "[LineTracker]: could not calculate the old UAV heading");
    +     638           0 :     got_headings = false;
    +     639             :   }
    +     640             : 
    +     641             :   try {
    +     642           0 :     new_heading = mrs_lib::AttitudeConverter(new_uav_state.pose.orientation).getHeading();
    +     643             :   }
    +     644           0 :   catch (...) {
    +     645           0 :     ROS_ERROR_THROTTLE(1.0, "[LineTracker]: could not calculate the new UAV heading");
    +     646           0 :     got_headings = false;
    +     647             :   }
    +     648             : 
    +     649           0 :   std_srvs::TriggerResponse res;
    +     650             : 
    +     651           0 :   if (!got_headings) {
    +     652           0 :     res.message = "could not calculate the heading difference";
    +     653           0 :     res.success = false;
    +     654             : 
    +     655           0 :     return std_srvs::TriggerResponse::ConstPtr(new std_srvs::TriggerResponse(res));
    +     656             :   }
    +     657             : 
    +     658             :   // | --------- recalculate the goal to new coordinates -------- |
    +     659             : 
    +     660           0 :   double dx       = new_uav_state.pose.position.x - uav_state.pose.position.x;
    +     661           0 :   double dy       = new_uav_state.pose.position.y - uav_state.pose.position.y;
    +     662           0 :   double dz       = new_uav_state.pose.position.z - uav_state.pose.position.z;
    +     663           0 :   double dheading = new_heading - old_heading;
    +     664             : 
    +     665           0 :   goal_x_ += dx;
    +     666           0 :   goal_y_ += dy;
    +     667           0 :   goal_z_ += dz;
    +     668           0 :   goal_heading_ += dheading;
    +     669             : 
    +     670             :   // | -------------------- update the state -------------------- |
    +     671             : 
    +     672           0 :   state_x_ += dx;
    +     673           0 :   state_y_ += dy;
    +     674           0 :   state_z_ += dz;
    +     675           0 :   state_heading_ += dheading;
    +     676             : 
    +     677           0 :   current_heading_ = atan2(goal_y_ - state_y_, goal_x_ - state_x_);
    +     678             : 
    +     679           0 :   res.message = "odometry source switched";
    +     680           0 :   res.success = true;
    +     681             : 
    +     682           0 :   return std_srvs::TriggerResponse::ConstPtr(new std_srvs::TriggerResponse(res));
    +     683             : }
    +     684             : 
    +     685             : //}
    +     686             : 
    +     687             : /* //{ hover() */
    +     688             : 
    +     689           0 : const std_srvs::TriggerResponse::ConstPtr LineTracker::hover([[maybe_unused]] const std_srvs::TriggerRequest::ConstPtr &cmd) {
    +     690             : 
    +     691           0 :   std_srvs::TriggerResponse res;
    +     692             : 
    +     693             :   // --------------------------------------------------------------
    +     694             :   // |          horizontal initial conditions prediction          |
    +     695             :   // --------------------------------------------------------------
    +     696             :   {
    +     697           0 :     std::scoped_lock lock(mutex_state_, mutex_uav_state_);
    +     698             : 
    +     699           0 :     current_horizontal_speed_ = sqrt(pow(uav_state_.velocity.linear.x, 2) + pow(uav_state_.velocity.linear.y, 2));
    +     700           0 :     current_vertical_speed_   = uav_state_.velocity.linear.z;
    +     701           0 :     current_heading_          = atan2(uav_state_.velocity.linear.y, uav_state_.velocity.linear.x);
    +     702             :   }
    +     703             : 
    +     704             :   double horizontal_t_stop, horizontal_stop_dist, stop_dist_x, stop_dist_y;
    +     705             : 
    +     706             :   {
    +     707           0 :     std::scoped_lock lock(mutex_state_);
    +     708             : 
    +     709           0 :     horizontal_t_stop    = current_horizontal_speed_ / _horizontal_acceleration_;
    +     710           0 :     horizontal_stop_dist = (horizontal_t_stop * current_horizontal_speed_) / 2.0;
    +     711           0 :     stop_dist_x          = cos(current_heading_) * horizontal_stop_dist;
    +     712           0 :     stop_dist_y          = sin(current_heading_) * horizontal_stop_dist;
    +     713             :   }
    +     714             : 
    +     715             :   // --------------------------------------------------------------
    +     716             :   // |           vertical initial conditions prediction           |
    +     717             :   // --------------------------------------------------------------
    +     718             : 
    +     719             :   double vertical_t_stop, vertical_stop_dist;
    +     720             : 
    +     721             :   {
    +     722           0 :     std::scoped_lock lock(mutex_state_);
    +     723             : 
    +     724           0 :     vertical_t_stop    = current_vertical_speed_ / _vertical_acceleration_;
    +     725           0 :     vertical_stop_dist = current_vertical_direction_ * (vertical_t_stop * current_vertical_speed_) / 2.0;
    +     726             :   }
    +     727             : 
    +     728             :   // --------------------------------------------------------------
    +     729             :   // |                        set the goal                        |
    +     730             :   // --------------------------------------------------------------
    +     731             : 
    +     732             :   {
    +     733           0 :     std::scoped_lock lock(mutex_goal_, mutex_state_);
    +     734             : 
    +     735           0 :     goal_x_ = state_x_ + stop_dist_x;
    +     736           0 :     goal_y_ = state_y_ + stop_dist_y;
    +     737           0 :     goal_z_ = state_z_ + vertical_stop_dist;
    +     738             :   }
    +     739             : 
    +     740           0 :   res.message = "hover initiated";
    +     741           0 :   res.success = true;
    +     742             : 
    +     743           0 :   changeState(STOP_MOTION_STATE);
    +     744             : 
    +     745           0 :   return std_srvs::TriggerResponse::ConstPtr(new std_srvs::TriggerResponse(res));
    +     746             : }
    +     747             : 
    +     748             : //}
    +     749             : 
    +     750             : /* //{ startTrajectoryTracking() */
    +     751             : 
    +     752           0 : const std_srvs::TriggerResponse::ConstPtr LineTracker::startTrajectoryTracking([[maybe_unused]] const std_srvs::TriggerRequest::ConstPtr &cmd) {
    +     753           0 :   return std_srvs::TriggerResponse::Ptr();
    +     754             : }
    +     755             : 
    +     756             : //}
    +     757             : 
    +     758             : /* //{ stopTrajectoryTracking() */
    +     759             : 
    +     760           0 : const std_srvs::TriggerResponse::ConstPtr LineTracker::stopTrajectoryTracking([[maybe_unused]] const std_srvs::TriggerRequest::ConstPtr &cmd) {
    +     761           0 :   return std_srvs::TriggerResponse::Ptr();
    +     762             : }
    +     763             : 
    +     764             : //}
    +     765             : 
    +     766             : /* //{ resumeTrajectoryTracking() */
    +     767             : 
    +     768           0 : const std_srvs::TriggerResponse::ConstPtr LineTracker::resumeTrajectoryTracking([[maybe_unused]] const std_srvs::TriggerRequest::ConstPtr &cmd) {
    +     769           0 :   return std_srvs::TriggerResponse::Ptr();
    +     770             : }
    +     771             : 
    +     772             : //}
    +     773             : 
    +     774             : /* //{ gotoTrajectoryStart() */
    +     775             : 
    +     776           0 : const std_srvs::TriggerResponse::ConstPtr LineTracker::gotoTrajectoryStart([[maybe_unused]] const std_srvs::TriggerRequest::ConstPtr &cmd) {
    +     777           0 :   return std_srvs::TriggerResponse::Ptr();
    +     778             : }
    +     779             : 
    +     780             : //}
    +     781             : 
    +     782             : /* //{ setConstraints() */
    +     783             : 
    +     784           3 : const mrs_msgs::DynamicsConstraintsSrvResponse::ConstPtr LineTracker::setConstraints(const mrs_msgs::DynamicsConstraintsSrvRequest::ConstPtr &cmd) {
    +     785             : 
    +     786           6 :   mrs_msgs::DynamicsConstraintsSrvResponse res;
    +     787             : 
    +     788             :   // this is the place to copy the constraints
    +     789             :   {
    +     790           3 :     std::scoped_lock lock(mutex_constraints_);
    +     791             : 
    +     792           3 :     _horizontal_speed_        = cmd->constraints.horizontal_speed;
    +     793           3 :     _horizontal_acceleration_ = cmd->constraints.horizontal_acceleration;
    +     794             : 
    +     795           3 :     _vertical_speed_        = cmd->constraints.vertical_ascending_speed;
    +     796           3 :     _vertical_acceleration_ = cmd->constraints.vertical_ascending_acceleration;
    +     797             : 
    +     798           3 :     _heading_rate_ = cmd->constraints.heading_speed;
    +     799             :   }
    +     800             : 
    +     801           3 :   res.success = true;
    +     802           3 :   res.message = "constraints updated";
    +     803             : 
    +     804           6 :   return mrs_msgs::DynamicsConstraintsSrvResponse::ConstPtr(new mrs_msgs::DynamicsConstraintsSrvResponse(res));
    +     805             : }
    +     806             : 
    +     807             : //}
    +     808             : 
    +     809             : /* //{ setReference() */
    +     810             : 
    +     811           1 : const mrs_msgs::ReferenceSrvResponse::ConstPtr LineTracker::setReference(const mrs_msgs::ReferenceSrvRequest::ConstPtr &cmd) {
    +     812             : 
    +     813           2 :   mrs_msgs::ReferenceSrvResponse res;
    +     814             : 
    +     815           1 :   auto state_heading = mrs_lib::get_mutexed(mutex_state_, state_heading_);
    +     816             : 
    +     817             :   {
    +     818           1 :     std::scoped_lock lock(mutex_goal_);
    +     819             : 
    +     820           1 :     goal_x_       = cmd->reference.position.x;
    +     821           1 :     goal_y_       = cmd->reference.position.y;
    +     822           1 :     goal_z_       = cmd->reference.position.z;
    +     823           1 :     goal_heading_ = radians::unwrap(cmd->reference.heading, state_heading);
    +     824             : 
    +     825           1 :     ROS_INFO("[LineTracker]: received new setpoint %.2f, %.2f, %.2f, %.2f", goal_x_, goal_y_, goal_z_, goal_heading_);
    +     826             : 
    +     827           1 :     have_goal_ = true;
    +     828             :   }
    +     829             : 
    +     830           1 :   changeState(STOP_MOTION_STATE);
    +     831             : 
    +     832           1 :   res.success = true;
    +     833           1 :   res.message = "reference set";
    +     834             : 
    +     835           2 :   return mrs_msgs::ReferenceSrvResponse::ConstPtr(new mrs_msgs::ReferenceSrvResponse(res));
    +     836             : }
    +     837             : 
    +     838             : //}
    +     839             : 
    +     840             : /* //{ setVelocityReference() */
    +     841             : 
    +     842           0 : const mrs_msgs::VelocityReferenceSrvResponse::ConstPtr LineTracker::setVelocityReference([
    +     843             :     [maybe_unused]] const mrs_msgs::VelocityReferenceSrvRequest::ConstPtr &cmd) {
    +     844           0 :   return mrs_msgs::VelocityReferenceSrvResponse::Ptr();
    +     845             : }
    +     846             : 
    +     847             : //}
    +     848             : 
    +     849             : /* //{ setTrajectoryReference() */
    +     850             : 
    +     851           0 : const mrs_msgs::TrajectoryReferenceSrvResponse::ConstPtr LineTracker::setTrajectoryReference([
    +     852             :     [maybe_unused]] const mrs_msgs::TrajectoryReferenceSrvRequest::ConstPtr &cmd) {
    +     853           0 :   return mrs_msgs::TrajectoryReferenceSrvResponse::Ptr();
    +     854             : }
    +     855             : 
    +     856             : //}
    +     857             : 
    +     858             : // | ----------------- state machine routines ----------------- |
    +     859             : 
    +     860             : /* //{ changeStateHorizontal() */
    +     861             : 
    +     862           8 : void LineTracker::changeStateHorizontal(States_t new_state) {
    +     863             : 
    +     864           8 :   previous_state_horizontal_ = current_state_horizontal_;
    +     865           8 :   current_state_horizontal_  = new_state;
    +     866             : 
    +     867             :   // just for ROS_INFO
    +     868           8 :   ROS_DEBUG("[LineTracker]: Switching horizontal state %s -> %s", state_names[previous_state_horizontal_], state_names[current_state_horizontal_]);
    +     869           8 : }
    +     870             : 
    +     871             : //}
    +     872             : 
    +     873             : /* //{ changeStateVertical() */
    +     874             : 
    +     875           8 : void LineTracker::changeStateVertical(States_t new_state) {
    +     876             : 
    +     877           8 :   previous_state_vertical_ = current_state_vertical_;
    +     878           8 :   current_state_vertical_  = new_state;
    +     879             : 
    +     880             :   // just for ROS_INFO
    +     881           8 :   ROS_DEBUG("[LineTracker]: Switching vertical state %s -> %s", state_names[previous_state_vertical_], state_names[current_state_vertical_]);
    +     882           8 : }
    +     883             : 
    +     884             : //}
    +     885             : 
    +     886             : /* //{ changeState() */
    +     887             : 
    +     888           6 : void LineTracker::changeState(States_t new_state) {
    +     889             : 
    +     890           6 :   changeStateVertical(new_state);
    +     891           6 :   changeStateHorizontal(new_state);
    +     892           6 : }
    +     893             : 
    +     894             : //}
    +     895             : 
    +     896             : // | --------------------- motion routines -------------------- |
    +     897             : 
    +     898             : /* //{ stopHorizontalMotion() */
    +     899             : 
    +     900           2 : void LineTracker::stopHorizontalMotion(void) {
    +     901             : 
    +     902             :   {
    +     903           4 :     std::scoped_lock lock(mutex_state_);
    +     904             : 
    +     905           2 :     current_horizontal_speed_ -= _horizontal_acceleration_ * _tracker_dt_;
    +     906             : 
    +     907           2 :     if (current_horizontal_speed_ < 0) {
    +     908           2 :       current_horizontal_speed_        = 0;
    +     909           2 :       current_horizontal_acceleration_ = 0;
    +     910             :     } else {
    +     911           0 :       current_horizontal_acceleration_ = -_horizontal_acceleration_;
    +     912             :     }
    +     913             :   }
    +     914           2 : }
    +     915             : 
    +     916             : //}
    +     917             : 
    +     918             : /* //{ stopVerticalMotion() */
    +     919             : 
    +     920           2 : void LineTracker::stopVerticalMotion(void) {
    +     921             : 
    +     922             :   {
    +     923           4 :     std::scoped_lock lock(mutex_state_);
    +     924             : 
    +     925           2 :     current_vertical_speed_ -= _vertical_acceleration_ * _tracker_dt_;
    +     926             : 
    +     927           2 :     if (current_vertical_speed_ < 0) {
    +     928           2 :       current_vertical_speed_        = 0;
    +     929           2 :       current_vertical_acceleration_ = 0;
    +     930             :     } else {
    +     931           0 :       current_vertical_acceleration_ = -_vertical_acceleration_;
    +     932             :     }
    +     933             :   }
    +     934           2 : }
    +     935             : 
    +     936             : //}
    +     937             : 
    +     938             : /* //{ accelerateHorizontal() */
    +     939             : 
    +     940        1004 : void LineTracker::accelerateHorizontal(void) {
    +     941             : 
    +     942             :   // copy member variables
    +     943        1004 :   auto [goal_x, goal_y]                             = mrs_lib::get_mutexed(mutex_goal_, goal_x_, goal_y_);
    +     944        1004 :   auto [state_x, state_y, current_horizontal_speed] = mrs_lib::get_mutexed(mutex_state_, state_x_, state_y_, current_horizontal_speed_);
    +     945             : 
    +     946             :   {
    +     947        1004 :     std::scoped_lock lock(mutex_state_);
    +     948             : 
    +     949        1004 :     current_heading_ = atan2(goal_y - state_y, goal_x - state_x);
    +     950             :   }
    +     951             : 
    +     952        1004 :   auto current_heading = mrs_lib::get_mutexed(mutex_state_, current_heading_);
    +     953             : 
    +     954             :   double horizontal_t_stop, horizontal_stop_dist, stop_dist_x, stop_dist_y;
    +     955             : 
    +     956        1004 :   horizontal_t_stop    = current_horizontal_speed / _horizontal_acceleration_;
    +     957        1004 :   horizontal_stop_dist = (horizontal_t_stop * current_horizontal_speed) / 2.0;
    +     958        1004 :   stop_dist_x          = cos(current_heading) * horizontal_stop_dist;
    +     959        1004 :   stop_dist_y          = sin(current_heading) * horizontal_stop_dist;
    +     960             : 
    +     961             :   {
    +     962        2008 :     std::scoped_lock lock(mutex_state_);
    +     963             : 
    +     964        1004 :     current_horizontal_speed_ += _horizontal_acceleration_ * _tracker_dt_;
    +     965             : 
    +     966        1004 :     if (current_horizontal_speed_ >= _horizontal_speed_) {
    +     967         905 :       current_horizontal_speed_        = _horizontal_speed_;
    +     968         905 :       current_horizontal_acceleration_ = 0;
    +     969             :     } else {
    +     970          99 :       current_horizontal_acceleration_ = _horizontal_acceleration_;
    +     971             :     }
    +     972             :   }
    +     973             : 
    +     974        1004 :   if (sqrt(pow(state_x + stop_dist_x - goal_x, 2) + pow(state_y + stop_dist_y - goal_y, 2)) < (2 * (_horizontal_speed_ * _tracker_dt_))) {
    +     975             : 
    +     976             :     {
    +     977           1 :       std::scoped_lock lock(mutex_state_);
    +     978             : 
    +     979           1 :       current_horizontal_acceleration_ = 0;
    +     980             :     }
    +     981             : 
    +     982           1 :     changeStateHorizontal(DECELERATING_STATE);
    +     983             :   }
    +     984        1004 : }
    +     985             : 
    +     986             : //}
    +     987             : 
    +     988             : /* //{ accelerateVertical() */
    +     989             : 
    +     990         199 : void LineTracker::accelerateVertical(void) {
    +     991             : 
    +     992         199 :   auto goal_z                            = mrs_lib::get_mutexed(mutex_goal_, goal_z_);
    +     993         199 :   auto [state_z, current_vertical_speed] = mrs_lib::get_mutexed(mutex_state_, state_z_, current_vertical_speed_);
    +     994             : 
    +     995             :   // set the right heading
    +     996         199 :   double tar_z = goal_z - state_z;
    +     997             : 
    +     998             :   // set the right vertical direction
    +     999             :   {
    +    1000         199 :     std::scoped_lock lock(mutex_state_);
    +    1001             : 
    +    1002         199 :     current_vertical_direction_ = mrs_lib::signum(tar_z);
    +    1003             :   }
    +    1004             : 
    +    1005         199 :   auto current_vertical_direction = mrs_lib::get_mutexed(mutex_state_, current_vertical_direction_);
    +    1006             : 
    +    1007             :   // calculate the time to stop and the distance it will take to stop [vertical]
    +    1008         199 :   double vertical_t_stop    = current_vertical_speed / _vertical_acceleration_;
    +    1009         199 :   double vertical_stop_dist = (vertical_t_stop * current_vertical_speed) / 2.0;
    +    1010         199 :   double stop_dist_z        = current_vertical_direction * vertical_stop_dist;
    +    1011             : 
    +    1012             :   {
    +    1013         398 :     std::scoped_lock lock(mutex_state_);
    +    1014             : 
    +    1015         199 :     current_vertical_speed_ += _vertical_acceleration_ * _tracker_dt_;
    +    1016             : 
    +    1017         199 :     if (current_vertical_speed_ >= _vertical_speed_) {
    +    1018         100 :       current_vertical_speed_        = _vertical_speed_;
    +    1019         100 :       current_vertical_acceleration_ = 0;
    +    1020             :     } else {
    +    1021          99 :       current_vertical_acceleration_ = _vertical_acceleration_;
    +    1022             :     }
    +    1023             :   }
    +    1024             : 
    +    1025         199 :   if (fabs(state_z + stop_dist_z - goal_z) < (2 * (_vertical_speed_ * _tracker_dt_))) {
    +    1026             : 
    +    1027             :     {
    +    1028           1 :       std::scoped_lock lock(mutex_state_);
    +    1029             : 
    +    1030           1 :       current_vertical_acceleration_ = 0;
    +    1031             :     }
    +    1032             : 
    +    1033           1 :     changeStateVertical(DECELERATING_STATE);
    +    1034             :   }
    +    1035         199 : }
    +    1036             : 
    +    1037             : //}
    +    1038             : 
    +    1039             : /* //{ decelerateHorizontal() */
    +    1040             : 
    +    1041         100 : void LineTracker::decelerateHorizontal(void) {
    +    1042             : 
    +    1043             :   {
    +    1044         200 :     std::scoped_lock lock(mutex_state_);
    +    1045             : 
    +    1046         100 :     current_horizontal_speed_ -= _horizontal_acceleration_ * _tracker_dt_;
    +    1047             : 
    +    1048         100 :     if (current_horizontal_speed_ < 0) {
    +    1049           1 :       current_horizontal_speed_ = 0;
    +    1050             :     } else {
    +    1051          99 :       current_horizontal_acceleration_ = -_horizontal_acceleration_;
    +    1052             :     }
    +    1053             :   }
    +    1054             : 
    +    1055         100 :   auto current_horizontal_speed = mrs_lib::get_mutexed(mutex_state_, current_horizontal_speed_);
    +    1056             : 
    +    1057         100 :   if (current_horizontal_speed == 0) {
    +    1058             : 
    +    1059             :     {
    +    1060           1 :       std::scoped_lock lock(mutex_state_);
    +    1061             : 
    +    1062           1 :       current_horizontal_acceleration_ = 0;
    +    1063             :     }
    +    1064             : 
    +    1065           1 :     changeStateHorizontal(STOPPING_STATE);
    +    1066             :   }
    +    1067         100 : }
    +    1068             : 
    +    1069             : //}
    +    1070             : 
    +    1071             : /* //{ decelerateVertical() */
    +    1072             : 
    +    1073         100 : void LineTracker::decelerateVertical(void) {
    +    1074             : 
    +    1075             :   {
    +    1076         200 :     std::scoped_lock lock(mutex_state_);
    +    1077             : 
    +    1078         100 :     current_vertical_speed_ -= _vertical_acceleration_ * _tracker_dt_;
    +    1079             : 
    +    1080         100 :     if (current_vertical_speed_ < 0) {
    +    1081           1 :       current_vertical_speed_ = 0;
    +    1082             :     } else {
    +    1083          99 :       current_vertical_acceleration_ = -_vertical_acceleration_;
    +    1084             :     }
    +    1085             :   }
    +    1086             : 
    +    1087         100 :   auto current_vertical_speed = mrs_lib::get_mutexed(mutex_state_, current_vertical_speed_);
    +    1088             : 
    +    1089         100 :   if (current_vertical_speed == 0) {
    +    1090           1 :     current_vertical_acceleration_ = 0;
    +    1091           1 :     changeStateVertical(STOPPING_STATE);
    +    1092             :   }
    +    1093         100 : }
    +    1094             : 
    +    1095             : //}
    +    1096             : 
    +    1097             : /* //{ stopHorizontal() */
    +    1098             : 
    +    1099          46 : void LineTracker::stopHorizontal(void) {
    +    1100             : 
    +    1101             :   {
    +    1102          46 :     std::scoped_lock lock(mutex_state_);
    +    1103             : 
    +    1104          46 :     state_x_                         = 0.95 * state_x_ + 0.05 * goal_x_;
    +    1105          46 :     state_y_                         = 0.95 * state_y_ + 0.05 * goal_y_;
    +    1106          46 :     current_horizontal_acceleration_ = 0;
    +    1107             :   }
    +    1108          46 : }
    +    1109             : 
    +    1110             : //}
    +    1111             : 
    +    1112             : /* //{ stopVertical() */
    +    1113             : 
    +    1114         851 : void LineTracker::stopVertical(void) {
    +    1115             : 
    +    1116             :   {
    +    1117         851 :     std::scoped_lock lock(mutex_state_);
    +    1118             : 
    +    1119         851 :     state_z_                       = 0.95 * state_z_ + 0.05 * goal_z_;
    +    1120         851 :     current_vertical_acceleration_ = 0;
    +    1121             :   }
    +    1122         851 : }
    +    1123             : 
    +    1124             : //}
    +    1125             : 
    +    1126             : // | ------------------------- timers ------------------------- |
    +    1127             : 
    +    1128             : /* //{ mainTimer() */
    +    1129             : 
    +    1130        2216 : void LineTracker::mainTimer(const ros::TimerEvent &event) {
    +    1131             : 
    +    1132        2216 :   if (!is_active_) {
    +    1133         417 :     return;
    +    1134             :   }
    +    1135             : 
    +    1136        5397 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("main", _tracker_loop_rate_, 0.01, event);
    +    1137        5397 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("LineTracker::main", common_handlers_->scope_timer.logger, common_handlers_->scope_timer.enabled);
    +    1138             : 
    +    1139        1799 :   auto [goal_x, goal_y, goal_z]    = mrs_lib::get_mutexed(mutex_goal_, goal_x_, goal_y_, goal_z_);
    +    1140        1799 :   auto [state_x, state_y, state_z] = mrs_lib::get_mutexed(mutex_state_, state_x_, state_y_, state_z_);
    +    1141             : 
    +    1142        1799 :   switch (current_state_horizontal_) {
    +    1143             : 
    +    1144         647 :     case IDLE_STATE:
    +    1145             : 
    +    1146         647 :       break;
    +    1147             : 
    +    1148           2 :     case STOP_MOTION_STATE:
    +    1149             : 
    +    1150           2 :       stopHorizontalMotion();
    +    1151             : 
    +    1152           2 :       break;
    +    1153             : 
    +    1154        1004 :     case ACCELERATING_STATE:
    +    1155             : 
    +    1156        1004 :       accelerateHorizontal();
    +    1157             : 
    +    1158        1004 :       break;
    +    1159             : 
    +    1160         100 :     case DECELERATING_STATE:
    +    1161             : 
    +    1162         100 :       decelerateHorizontal();
    +    1163             : 
    +    1164         100 :       break;
    +    1165             : 
    +    1166          46 :     case STOPPING_STATE:
    +    1167             : 
    +    1168          46 :       stopHorizontal();
    +    1169             : 
    +    1170          46 :       break;
    +    1171             :   }
    +    1172             : 
    +    1173        1799 :   switch (current_state_vertical_) {
    +    1174             : 
    +    1175         647 :     case IDLE_STATE:
    +    1176             : 
    +    1177         647 :       break;
    +    1178             : 
    +    1179           2 :     case STOP_MOTION_STATE:
    +    1180             : 
    +    1181           2 :       stopVerticalMotion();
    +    1182             : 
    +    1183           2 :       break;
    +    1184             : 
    +    1185         199 :     case ACCELERATING_STATE:
    +    1186             : 
    +    1187         199 :       accelerateVertical();
    +    1188             : 
    +    1189         199 :       break;
    +    1190             : 
    +    1191         100 :     case DECELERATING_STATE:
    +    1192             : 
    +    1193         100 :       decelerateVertical();
    +    1194             : 
    +    1195         100 :       break;
    +    1196             : 
    +    1197         851 :     case STOPPING_STATE:
    +    1198             : 
    +    1199         851 :       stopVertical();
    +    1200             : 
    +    1201         851 :       break;
    +    1202             :   }
    +    1203             : 
    +    1204        1799 :   if (current_state_horizontal_ == STOP_MOTION_STATE && current_state_vertical_ == STOP_MOTION_STATE) {
    +    1205           2 :     if (current_vertical_speed_ == 0 && current_horizontal_speed_ == 0) {
    +    1206           2 :       if (have_goal_) {
    +    1207           1 :         changeState(ACCELERATING_STATE);
    +    1208             :       } else {
    +    1209           1 :         changeState(STOPPING_STATE);
    +    1210             :       }
    +    1211             :     }
    +    1212             :   }
    +    1213             : 
    +    1214        1799 :   if (current_state_horizontal_ == STOPPING_STATE && current_state_vertical_ == STOPPING_STATE) {
    +    1215          48 :     if (fabs(state_x - goal_x) < 1e-3 && fabs(state_y - goal_y) < 1e-3 && fabs(state_z - goal_z) < 1e-3) {
    +    1216             : 
    +    1217             :       {
    +    1218           2 :         std::scoped_lock lock(mutex_state_);
    +    1219             : 
    +    1220           2 :         state_x_ = goal_x;
    +    1221           2 :         state_y_ = goal_y;
    +    1222           2 :         state_z_ = goal_z;
    +    1223             :       }
    +    1224             : 
    +    1225           2 :       changeState(IDLE_STATE);
    +    1226             : 
    +    1227           2 :       have_goal_ = false;
    +    1228             :     }
    +    1229             :   }
    +    1230             : 
    +    1231             :   {
    +    1232        1799 :     std::scoped_lock lock(mutex_state_);
    +    1233             : 
    +    1234        1799 :     state_x_ += cos(current_heading_) * current_horizontal_speed_ * _tracker_dt_;
    +    1235        1799 :     state_y_ += sin(current_heading_) * current_horizontal_speed_ * _tracker_dt_;
    +    1236        1799 :     state_z_ += current_vertical_direction_ * current_vertical_speed_ * _tracker_dt_;
    +    1237             :   }
    +    1238             : 
    +    1239             :   // --------------------------------------------------------------
    +    1240             :   // |                        heading tracking                        |
    +    1241             :   // --------------------------------------------------------------
    +    1242             : 
    +    1243             :   {
    +    1244        3598 :     std::scoped_lock lock(mutex_state_);
    +    1245             : 
    +    1246             :     // compute the desired heading rate
    +    1247             :     double current_heading_rate;
    +    1248        1799 :     if (fabs(goal_heading_ - state_heading_) > M_PI)
    +    1249           0 :       current_heading_rate = -_heading_gain_ * (goal_heading_ - state_heading_);
    +    1250             :     else
    +    1251        1799 :       current_heading_rate = _heading_gain_ * (goal_heading_ - state_heading_);
    +    1252             : 
    +    1253        1799 :     if (current_heading_rate > _heading_rate_) {
    +    1254          50 :       current_heading_rate = _heading_rate_;
    +    1255        1749 :     } else if (current_heading_rate < -_heading_rate_) {
    +    1256           0 :       current_heading_rate = -_heading_rate_;
    +    1257             :     }
    +    1258             : 
    +    1259             :     // flap the resulted state_heading_ aroud PI
    +    1260        1799 :     state_heading_ += current_heading_rate * _tracker_dt_;
    +    1261             : 
    +    1262        1799 :     if (fabs(state_heading_ - goal_heading_) < (2 * (_heading_rate_ * _tracker_dt_))) {
    +    1263        1360 :       state_heading_ = goal_heading_;
    +    1264             :     }
    +    1265             :   }
    +    1266             : }
    +    1267             : 
    +    1268             : //}
    +    1269             : 
    +    1270             : }  // namespace line_tracker
    +    1271             : 
    +    1272             : }  // namespace mrs_uav_trackers
    +    1273             : 
    +    1274             : #include <pluginlib/class_list_macros.h>
    +    1275           1 : PLUGINLIB_EXPORT_CLASS(mrs_uav_trackers::line_tracker::LineTracker, mrs_uav_managers::Tracker)
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/line_tracker/line_tracker.cpp.gcov.overview.html b/mrs_uav_trackers/src/line_tracker/line_tracker.cpp.gcov.overview.html new file mode 100644 index 0000000000..b00a836f88 --- /dev/null +++ b/mrs_uav_trackers/src/line_tracker/line_tracker.cpp.gcov.overview.html @@ -0,0 +1,339 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/line_tracker/line_tracker.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_trackers/src/line_tracker/line_tracker.cpp.gcov.png b/mrs_uav_trackers/src/line_tracker/line_tracker.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..b7a7e459ce10c0e0990050079801959c58954678 GIT binary patch literal 3774 zcmV;v4ngsWP)QIT0000OP)t-s|NsB0 zs;a7|?_FK${{R500003000620&P%hU00009a7bBm000ie000ie0hKEb8vph4P2>B& zTdVS>cMzRYBt0+*&1P-O*py;~8Up6kQ6O7EQ45SwRTV~)J=uH8KK8!)@mpYX^T|@Gg*&A(r#>5x8vQRudPC+tgks|$T|+}z42@_4JM_fS?;Ig4wQ-!tFgsA7 zmaeBW`rp9_KEXeTmMm#dJCN1^6bV)PMJS;FtQejc3CA0$=y=v~L>Tbblp+K=3iM?X zXlsxqOi0mE0MdxS0}T2n3Y-wIwvL2iiP69^f}c@g#_+8QIB0=8QUM%I9rZ$M(Vjs@ zn`$UVim6^2IOa)xgH|~<86ZIGHyUmZfw-}N(g%Q6tWnguPx7(X%4g&LHZ{R_-wnQd zSh%C3n(8X+s0!jb0M+Gezcbv7_QIrfgC3Y-?S1+X#CtKp)SnlbuFa=_Ax} z6Dfw3rNB`OoYcUv)@_7&A%S3!S))4M@5>#P#r zLz&Tlc9gVsVKiLbGn9^3rW}fV)fNhTJYJw|`~UAB&-Z`l2M<$D;1hfzl-nbPu)ypt zoLm%qdj0aLz1ZNSWB@bz`t&&F=SoSf7MMX%Du{Xp@Q-x^)=M_U_xOQ_5IO)9)^V{v zZS9IFzF#a$d{pWMJlZD(RF>=15h#`lxXv+P5$lLl0Z?kEQr5EAWfWIqUuo7+UFdmP^cl@&s;-?P&I#Y_6<2B4x5w#b zll|kg$2jAseZgzbhm=CwA+xjBg}lJ+mSL{IUe`$DXQ-L+d}m@PvIk+Fb=j1IHD?NJ z9kswU;h#?6-jAmvK?6LeW_qAXfAq>Dwj+`6!_D&pQgbzSQU`+59Kc@3ml>Jni{7)`Bw@Xaq6; zjxL1%EJa~;(N`l%@eU>>IiZ5iqv(qw*Nu4FuwJ|ah7Ebd7p3JAG}+*n6>F5rgs?NLj-2Bwo*iZnG}s6$4q5A z{vEG3)0sErpz!E)$}cNhczo#BuO~M-?zw)APY02gB@^X}SzK*C+~;v-9I4=UH|W9_ zF!95_e{sNLP=hq!Ysgvw)K2X)x-e7C>=HLv<{oj+byc&mf($5Mpk_qN(3=(MBMqG0 z+w}}SKCcuvdo#ef?+fmr88a!W%SZD)*4|B5@I6oi zvW)9#4VD%-0n}5}FWPC>;!MwM;rtsHeS_z$#Rcu*c1w6Id3|(Ktk#iuVV>lLw|678 zvW`NgNm#1v0DPr#S0%!nWs77!vVab(0Un~nfVy%Eb5|R2L7>6Jj ziXqR8#+_?wJ%#?(_+^ z(4MISm_P{f6q|>lnq=fiTkj%+!kl|+P}BPqZ-y|PQY5B5a_ZVad__;$Q;g4a);9~JfW9vG&VrTYM1c7H;PvCzj9Px$-! zB2$7~iY6j`$!BQ)BGLrK(<3!}43sV+-MY+%)eZi^Ljx6iK72D4NiCkU0Xn>Gbf&ol zV*^L=crSK*m(lfOXDXPUVRf>kXEw5Z2ERi+{0d<|JEfL-pV$g;x! z>r6#QH6vPv-fUdTE_{3F+&3tNeK*oa)^t>g`h9!MF@Jp*p7x$P@Lmk$6|HYt@hPhJ zqgxOMOM^{_uiqCIx>6q>>Jyb*J95o)!FFtr@%?MZHVygLj%{Xr|9v|)+89gk*hB00 z^*akZsbGyh?`BSu!yMcuNcL*Ey1lNAHht~y!$xI*cWI07TF9E`Y`-B}w8VbTx=zM6 zBi+qRft~h|rf&Ll`nbX?TqI$Xb%gs;xc0LzF19bF)mD4Kr35#bmAe$in;2jQMY~lx z+=mZz_-D2P*KUBG4UPE4O5K2W!JB|>cQq&D*OSl!{?EFC2^>R60Q+usmpXdR-({EU z_9CLUaC^A(FXr}IxjsJrJc^J^-Q+*nzY?eRFM4?QVxeotDJj?Dss=x|NyrV3TKpmn z?)RJeMI@I@u6g2DvuT{88Ei7ZVk&G#G8t+LqRDVJBLa(U2AhmCg+H75+HofH(KqWo zh$cub#XTeEPH!urKy@9z!LIFnn>NN>(Y2R-GI0y$4cpSom($m+cLGW`9MhXB&|`#! z8;?8y(#jZ$I;q>=nhu|w zw)kK6K^pE?hMH+BIV<%nM=A7Os1-)rj_e{kw?3nFq?d~TzBFn!H#MLS!vSZ(13Pc8 zhbd$}z|@`piAil1auzr4ioz7J9%BRFw~PwpG7SXm8GMAifs}a-KKavqqs=i6=0>o= z9u~oOXh6O=#K5b2zJl};dZI-% zDxg4N@tSE~T{KjXyHG2PwjJ3}fn)t^Lxpcm7JP}@`)pF0yMN69TTOiKo}x~e9^Q=R zAA>3%KXU?2+-b3lrc&x}@{gaLO0jkPwf^x-r&8bIA3wSPA-TtP(cT>Zzr;U^?y=ZE zitaI(7mD|=vYvtm{!&lT?8r%&52=&-=lqr!Z8B^Q`h$lt1F?T#S?Ck`s5 z{w6i!l_$rW{Vwgn$A-~@T-~mwhF2V8eS{AjFWuH?QzXfrxu?zx7+}8>5RoTe?C;5w zFAgqYI{cn_5Yer%-?^*m&G+FNyRbrBb5x?%_slLrN&?js=OndUiZF%Th9YyTd;^L) zpq66F&F546lluFmZbflUi(Eia1MK;bgP7O*b9-sl8cX;dsoOh%KdCDz>VR5`{oG#a z7;7Fy4X}gTlQxGfXp;f6HjDuK2dlmN!9E)+Ju2Kuk$|dnAwy9Hs#@} + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/midair_activation_tracker + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/midair_activation_trackerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:679272.8 %
    Date:2024-04-18 23:11:36Functions:91850.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    midair_activation_tracker.cpp +
    72.8%72.8%
    +
    72.8 %67 / 9250.0 %9 / 18
    <unnamed>72.8 %67 / 9250.0 %9 / 18
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/midair_activation_tracker/index-detail-sort-l.html b/mrs_uav_trackers/src/midair_activation_tracker/index-detail-sort-l.html new file mode 100644 index 0000000000..11acd4c194 --- /dev/null +++ b/mrs_uav_trackers/src/midair_activation_tracker/index-detail-sort-l.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/midair_activation_tracker + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/midair_activation_trackerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:679272.8 %
    Date:2024-04-18 23:11:36Functions:91850.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    midair_activation_tracker.cpp +
    72.8%72.8%
    +
    72.8 %67 / 9250.0 %9 / 18
    <unnamed>72.8 %67 / 9250.0 %9 / 18
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/midair_activation_tracker/index-detail.html b/mrs_uav_trackers/src/midair_activation_tracker/index-detail.html new file mode 100644 index 0000000000..192873194e --- /dev/null +++ b/mrs_uav_trackers/src/midair_activation_tracker/index-detail.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/midair_activation_tracker + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/midair_activation_trackerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:679272.8 %
    Date:2024-04-18 23:11:36Functions:91850.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    midair_activation_tracker.cpp +
    72.8%72.8%
    +
    72.8 %67 / 9250.0 %9 / 18
    <unnamed>72.8 %67 / 9250.0 %9 / 18
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/midair_activation_tracker/index-sort-f.html b/mrs_uav_trackers/src/midair_activation_tracker/index-sort-f.html new file mode 100644 index 0000000000..945f15c584 --- /dev/null +++ b/mrs_uav_trackers/src/midair_activation_tracker/index-sort-f.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/midair_activation_tracker + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/midair_activation_trackerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:679272.8 %
    Date:2024-04-18 23:11:36Functions:91850.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    midair_activation_tracker.cpp +
    72.8%72.8%
    +
    72.8 %67 / 9250.0 %9 / 18
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/midair_activation_tracker/index-sort-l.html b/mrs_uav_trackers/src/midair_activation_tracker/index-sort-l.html new file mode 100644 index 0000000000..1ba687b764 --- /dev/null +++ b/mrs_uav_trackers/src/midair_activation_tracker/index-sort-l.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/midair_activation_tracker + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/midair_activation_trackerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:679272.8 %
    Date:2024-04-18 23:11:36Functions:91850.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    midair_activation_tracker.cpp +
    72.8%72.8%
    +
    72.8 %67 / 9250.0 %9 / 18
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/midair_activation_tracker/index.html b/mrs_uav_trackers/src/midair_activation_tracker/index.html new file mode 100644 index 0000000000..3074e7dc79 --- /dev/null +++ b/mrs_uav_trackers/src/midair_activation_tracker/index.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/midair_activation_tracker + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/midair_activation_trackerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:679272.8 %
    Date:2024-04-18 23:11:36Functions:91850.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    midair_activation_tracker.cpp +
    72.8%72.8%
    +
    72.8 %67 / 9250.0 %9 / 18
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/midair_activation_tracker/midair_activation_tracker.cpp.func-sort-c.html b/mrs_uav_trackers/src/midair_activation_tracker/midair_activation_tracker.cpp.func-sort-c.html new file mode 100644 index 0000000000..344381a7a7 --- /dev/null +++ b/mrs_uav_trackers/src/midair_activation_tracker/midair_activation_tracker.cpp.func-sort-c.html @@ -0,0 +1,152 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/midair_activation_tracker/midair_activation_tracker.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/midair_activation_tracker - midair_activation_tracker.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:679272.8 %
    Date:2024-04-18 23:11:36Functions:91850.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_trackers::midair_activation_tracker::MidairActivationTracker::resetStatic()0
    mrs_uav_trackers::midair_activation_tracker::MidairActivationTracker::setReference(boost::shared_ptr<mrs_msgs::ReferenceSrvRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::midair_activation_tracker::MidairActivationTracker::gotoTrajectoryStart(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::midair_activation_tracker::MidairActivationTracker::setVelocityReference(boost::shared_ptr<mrs_msgs::VelocityReferenceSrvRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::midair_activation_tracker::MidairActivationTracker::switchOdometrySource(mrs_msgs::UavState_<std::allocator<void> > const&)0
    mrs_uav_trackers::midair_activation_tracker::MidairActivationTracker::stopTrajectoryTracking(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::midair_activation_tracker::MidairActivationTracker::startTrajectoryTracking(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::midair_activation_tracker::MidairActivationTracker::resumeTrajectoryTracking(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::midair_activation_tracker::MidairActivationTracker::hover(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::midair_activation_tracker::MidairActivationTracker::setTrajectoryReference(boost::shared_ptr<mrs_msgs::TrajectoryReferenceSrvRequest_<std::allocator<void> > const> const&)4
    mrs_uav_trackers::midair_activation_tracker::MidairActivationTracker::getStatus()36
    (anonymous namespace)::ProxyExec0::ProxyExec0()91
    mrs_uav_trackers::midair_activation_tracker::MidairActivationTracker::initialize(ros::NodeHandle const&, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t>, std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t>)91
    mrs_uav_trackers::midair_activation_tracker::MidairActivationTracker::activate[abi:cxx11](std::optional<mrs_msgs::TrackerCommand_<std::allocator<void> > > const&)126
    mrs_uav_trackers::midair_activation_tracker::MidairActivationTracker::deactivate()146
    mrs_uav_trackers::midair_activation_tracker::MidairActivationTracker::setConstraints(boost::shared_ptr<mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> > const> const&)298
    mrs_uav_trackers::midair_activation_tracker::MidairActivationTracker::enableCallbacks(boost::shared_ptr<std_srvs::SetBoolRequest_<std::allocator<void> > const> const&)313
    mrs_uav_trackers::midair_activation_tracker::MidairActivationTracker::update(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_uav_managers::Controller::ControlOutput const&)120314
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/midair_activation_tracker/midair_activation_tracker.cpp.func.html b/mrs_uav_trackers/src/midair_activation_tracker/midair_activation_tracker.cpp.func.html new file mode 100644 index 0000000000..be231f5899 --- /dev/null +++ b/mrs_uav_trackers/src/midair_activation_tracker/midair_activation_tracker.cpp.func.html @@ -0,0 +1,152 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/midair_activation_tracker/midair_activation_tracker.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/midair_activation_tracker - midair_activation_tracker.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:679272.8 %
    Date:2024-04-18 23:11:36Functions:91850.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    (anonymous namespace)::ProxyExec0::ProxyExec0()91
    mrs_uav_trackers::midair_activation_tracker::MidairActivationTracker::deactivate()146
    mrs_uav_trackers::midair_activation_tracker::MidairActivationTracker::initialize(ros::NodeHandle const&, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t>, std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t>)91
    mrs_uav_trackers::midair_activation_tracker::MidairActivationTracker::resetStatic()0
    mrs_uav_trackers::midair_activation_tracker::MidairActivationTracker::setReference(boost::shared_ptr<mrs_msgs::ReferenceSrvRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::midair_activation_tracker::MidairActivationTracker::setConstraints(boost::shared_ptr<mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> > const> const&)298
    mrs_uav_trackers::midair_activation_tracker::MidairActivationTracker::enableCallbacks(boost::shared_ptr<std_srvs::SetBoolRequest_<std::allocator<void> > const> const&)313
    mrs_uav_trackers::midair_activation_tracker::MidairActivationTracker::gotoTrajectoryStart(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::midair_activation_tracker::MidairActivationTracker::setVelocityReference(boost::shared_ptr<mrs_msgs::VelocityReferenceSrvRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::midair_activation_tracker::MidairActivationTracker::switchOdometrySource(mrs_msgs::UavState_<std::allocator<void> > const&)0
    mrs_uav_trackers::midair_activation_tracker::MidairActivationTracker::setTrajectoryReference(boost::shared_ptr<mrs_msgs::TrajectoryReferenceSrvRequest_<std::allocator<void> > const> const&)4
    mrs_uav_trackers::midair_activation_tracker::MidairActivationTracker::stopTrajectoryTracking(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::midair_activation_tracker::MidairActivationTracker::startTrajectoryTracking(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::midair_activation_tracker::MidairActivationTracker::resumeTrajectoryTracking(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::midair_activation_tracker::MidairActivationTracker::hover(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::midair_activation_tracker::MidairActivationTracker::update(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_uav_managers::Controller::ControlOutput const&)120314
    mrs_uav_trackers::midair_activation_tracker::MidairActivationTracker::activate[abi:cxx11](std::optional<mrs_msgs::TrackerCommand_<std::allocator<void> > > const&)126
    mrs_uav_trackers::midair_activation_tracker::MidairActivationTracker::getStatus()36
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/midair_activation_tracker/midair_activation_tracker.cpp.gcov.frameset.html b/mrs_uav_trackers/src/midair_activation_tracker/midair_activation_tracker.cpp.gcov.frameset.html new file mode 100644 index 0000000000..fa5ac7f267 --- /dev/null +++ b/mrs_uav_trackers/src/midair_activation_tracker/midair_activation_tracker.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/midair_activation_tracker/midair_activation_tracker.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_trackers/src/midair_activation_tracker/midair_activation_tracker.cpp.gcov.html b/mrs_uav_trackers/src/midair_activation_tracker/midair_activation_tracker.cpp.gcov.html new file mode 100644 index 0000000000..334bee52ee --- /dev/null +++ b/mrs_uav_trackers/src/midair_activation_tracker/midair_activation_tracker.cpp.gcov.html @@ -0,0 +1,426 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/midair_activation_tracker/midair_activation_tracker.cpp + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/midair_activation_tracker - midair_activation_tracker.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:679272.8 %
    Date:2024-04-18 23:11:36Functions:91850.0 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : /* includes //{ */
    +       2             : 
    +       3             : #include <ros/ros.h>
    +       4             : #include <ros/package.h>
    +       5             : 
    +       6             : #include <mrs_uav_managers/tracker.h>
    +       7             : 
    +       8             : #include <mrs_lib/profiler.h>
    +       9             : #include <mrs_lib/mutex.h>
    +      10             : #include <mrs_lib/attitude_converter.h>
    +      11             : #include <mrs_lib/geometry/cyclic.h>
    +      12             : #include <mrs_lib/geometry/misc.h>
    +      13             : 
    +      14             : //}
    +      15             : 
    +      16             : namespace mrs_uav_trackers
    +      17             : {
    +      18             : 
    +      19             : namespace midair_activation_tracker
    +      20             : {
    +      21             : 
    +      22             : /* //{ class MidairActivationTracker */
    +      23             : 
    +      24             : class MidairActivationTracker : public mrs_uav_managers::Tracker {
    +      25             : public:
    +      26             :   bool initialize(const ros::NodeHandle &nh, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t> common_handlers,
    +      27             :                   std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t> private_handlers);
    +      28             : 
    +      29             :   std::tuple<bool, std::string> activate(const std::optional<mrs_msgs::TrackerCommand> &last_tracker_cmd);
    +      30             :   void                          deactivate(void);
    +      31             :   bool                          resetStatic(void);
    +      32             : 
    +      33             :   std::optional<mrs_msgs::TrackerCommand>   update(const mrs_msgs::UavState &uav_state, const mrs_uav_managers::Controller::ControlOutput &last_control_output);
    +      34             :   const mrs_msgs::TrackerStatus             getStatus();
    +      35             :   const std_srvs::SetBoolResponse::ConstPtr enableCallbacks(const std_srvs::SetBoolRequest::ConstPtr &cmd);
    +      36             :   const std_srvs::TriggerResponse::ConstPtr switchOdometrySource(const mrs_msgs::UavState &new_uav_state);
    +      37             : 
    +      38             :   const mrs_msgs::ReferenceSrvResponse::ConstPtr           setReference(const mrs_msgs::ReferenceSrvRequest::ConstPtr &cmd);
    +      39             :   const mrs_msgs::VelocityReferenceSrvResponse::ConstPtr   setVelocityReference(const mrs_msgs::VelocityReferenceSrvRequest::ConstPtr &cmd);
    +      40             :   const mrs_msgs::TrajectoryReferenceSrvResponse::ConstPtr setTrajectoryReference(const mrs_msgs::TrajectoryReferenceSrvRequest::ConstPtr &cmd);
    +      41             : 
    +      42             :   const mrs_msgs::DynamicsConstraintsSrvResponse::ConstPtr setConstraints(const mrs_msgs::DynamicsConstraintsSrvRequest::ConstPtr &cmd);
    +      43             : 
    +      44             :   const std_srvs::TriggerResponse::ConstPtr hover(const std_srvs::TriggerRequest::ConstPtr &cmd);
    +      45             :   const std_srvs::TriggerResponse::ConstPtr startTrajectoryTracking(const std_srvs::TriggerRequest::ConstPtr &cmd);
    +      46             :   const std_srvs::TriggerResponse::ConstPtr stopTrajectoryTracking(const std_srvs::TriggerRequest::ConstPtr &cmd);
    +      47             :   const std_srvs::TriggerResponse::ConstPtr resumeTrajectoryTracking(const std_srvs::TriggerRequest::ConstPtr &cmd);
    +      48             :   const std_srvs::TriggerResponse::ConstPtr gotoTrajectoryStart(const std_srvs::TriggerRequest::ConstPtr &cmd);
    +      49             : 
    +      50             : private:
    +      51             :   ros::NodeHandle nh_;
    +      52             : 
    +      53             :   bool callbacks_enabled_ = true;
    +      54             : 
    +      55             :   std::string _uav_name_;
    +      56             : 
    +      57             :   std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t>  common_handlers_;
    +      58             :   std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t> private_handlers_;
    +      59             : 
    +      60             :   // | ---------------- the tracker's inner state --------------- |
    +      61             : 
    +      62             :   bool is_initialized_ = false;
    +      63             :   bool is_active_      = false;
    +      64             : 
    +      65             :   // | ------------------------ profiler ------------------------ |
    +      66             : 
    +      67             :   mrs_lib::Profiler profiler_;
    +      68             :   bool              _profiler_enabled_ = false;
    +      69             : };
    +      70             : 
    +      71             : //}
    +      72             : 
    +      73             : // | -------------- tracker's interface routines -------------- |
    +      74             : 
    +      75             : /* //{ initialize() */
    +      76             : 
    +      77          91 : bool MidairActivationTracker::initialize(const ros::NodeHandle &nh, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t> common_handlers,
    +      78             :                                          std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t> private_handlers) {
    +      79             : 
    +      80          91 :   this->common_handlers_  = common_handlers;
    +      81          91 :   this->private_handlers_ = private_handlers;
    +      82             : 
    +      83          91 :   _uav_name_ = common_handlers->uav_name;
    +      84             : 
    +      85          91 :   nh_ = nh;
    +      86             : 
    +      87          91 :   ros::Time::waitForValid();
    +      88             : 
    +      89             :   // --------------------------------------------------------------
    +      90             :   // |                     loading parameters                     |
    +      91             :   // --------------------------------------------------------------
    +      92             : 
    +      93             :   // | ---------- loading params using the parent's nh ---------- |
    +      94             : 
    +      95         182 :   mrs_lib::ParamLoader param_loader_parent(common_handlers->parent_nh, "ControlManager");
    +      96             : 
    +      97          91 :   param_loader_parent.loadParam("enable_profiler", _profiler_enabled_);
    +      98             : 
    +      99          91 :   if (!param_loader_parent.loadedSuccessfully()) {
    +     100           0 :     ROS_ERROR("[MidairActivationTracker]: Could not load all parameters!");
    +     101           0 :     return false;
    +     102             :   }
    +     103             : 
    +     104             :   // | ---------------- load plugin's parameters ---------------- |
    +     105             : 
    +     106          91 :   private_handlers->param_loader->addYamlFile(ros::package::getPath("mrs_uav_trackers") + "/config/private/midair_activation_tracker.yaml");
    +     107          91 :   private_handlers->param_loader->addYamlFile(ros::package::getPath("mrs_uav_trackers") + "/config/public/midair_activation_tracker.yaml");
    +     108             : 
    +     109         182 :   const std::string yaml_prefix = "mrs_uav_trackers/midair_activation_tracker/";
    +     110             : 
    +     111          91 :   if (!private_handlers->param_loader->loadedSuccessfully()) {
    +     112           0 :     ROS_ERROR("[MidairActivationTracker]: could not load all parameters!");
    +     113           0 :     return false;
    +     114             :   }
    +     115             : 
    +     116             :   // | ------------------------ profiler ------------------------ |
    +     117             : 
    +     118          91 :   profiler_ = mrs_lib::Profiler(common_handlers->parent_nh, "MidairActivationTracker", _profiler_enabled_);
    +     119             : 
    +     120             :   // | --------------------- finish the init -------------------- |
    +     121             : 
    +     122          91 :   is_initialized_ = true;
    +     123             : 
    +     124          91 :   ROS_INFO("[MidairActivationTracker]: initialized");
    +     125             : 
    +     126          91 :   return true;
    +     127             : }
    +     128             : 
    +     129             : //}
    +     130             : 
    +     131             : /* //{ activate() */
    +     132             : 
    +     133         126 : std::tuple<bool, std::string> MidairActivationTracker::activate([[maybe_unused]] const std::optional<mrs_msgs::TrackerCommand> &last_tracker_cmd) {
    +     134             : 
    +     135         126 :   std::stringstream ss;
    +     136             : 
    +     137         126 :   is_active_ = true;
    +     138             : 
    +     139         126 :   ss << "activated";
    +     140         126 :   ROS_INFO_STREAM("[MidairActivationTracker]: " << ss.str());
    +     141             : 
    +     142         252 :   return std::tuple(true, ss.str());
    +     143             : }
    +     144             : 
    +     145             : //}
    +     146             : 
    +     147             : /* //{ deactivate() */
    +     148             : 
    +     149         146 : void MidairActivationTracker::deactivate(void) {
    +     150             : 
    +     151         146 :   is_active_ = false;
    +     152             : 
    +     153         146 :   ROS_INFO("[MidairActivationTracker]: deactivated");
    +     154         146 : }
    +     155             : 
    +     156             : //}
    +     157             : 
    +     158             : /* //{ resetStatic() */
    +     159             : 
    +     160           0 : bool MidairActivationTracker::resetStatic(void) {
    +     161             : 
    +     162           0 :   return false;
    +     163             : }
    +     164             : 
    +     165             : //}
    +     166             : 
    +     167             : /* //{ update() */
    +     168             : 
    +     169      120314 : std::optional<mrs_msgs::TrackerCommand> MidairActivationTracker::update(
    +     170             :     const mrs_msgs::UavState &uav_state, [[maybe_unused]] const mrs_uav_managers::Controller::ControlOutput &last_control_output) {
    +     171             : 
    +     172             :   // up to this part the update() method is evaluated even when the tracker is not active
    +     173      120314 :   if (!is_active_) {
    +     174      120033 :     return {};
    +     175             :   }
    +     176             : 
    +     177         843 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("update");
    +     178             :   mrs_lib::ScopeTimer timer =
    +     179         843 :       mrs_lib::ScopeTimer("MidairActivationTracker::update", common_handlers_->scope_timer.logger, common_handlers_->scope_timer.enabled);
    +     180             : 
    +     181         562 :   mrs_msgs::TrackerCommand tracker_cmd;
    +     182             : 
    +     183         281 :   tracker_cmd.header.frame_id = uav_state.header.frame_id;
    +     184         281 :   tracker_cmd.header.stamp    = ros::Time::now();
    +     185             : 
    +     186         281 :   tracker_cmd.position.x = uav_state.pose.position.x;
    +     187         281 :   tracker_cmd.position.y = uav_state.pose.position.y;
    +     188         281 :   tracker_cmd.position.z = uav_state.pose.position.z;
    +     189             : 
    +     190         281 :   tracker_cmd.velocity.x = uav_state.velocity.linear.x;
    +     191         281 :   tracker_cmd.velocity.y = uav_state.velocity.linear.y;
    +     192         281 :   tracker_cmd.velocity.z = uav_state.velocity.linear.z;
    +     193             : 
    +     194             :   try {
    +     195         281 :     tracker_cmd.heading = mrs_lib::AttitudeConverter(uav_state.pose.orientation).getHeading();
    +     196             :   }
    +     197           0 :   catch (...) {
    +     198           0 :     tracker_cmd.heading = mrs_lib::AttitudeConverter(uav_state.pose.orientation).getYaw();
    +     199           0 :     ROS_WARN_THROTTLE(1.0, "[MidairActivationTracker]: could not get heading");
    +     200             :   }
    +     201             : 
    +     202         281 :   tracker_cmd.use_position_vertical   = true;
    +     203         281 :   tracker_cmd.use_position_horizontal = true;
    +     204             : 
    +     205         281 :   tracker_cmd.use_velocity_vertical   = true;
    +     206         281 :   tracker_cmd.use_velocity_horizontal = true;
    +     207             : 
    +     208         281 :   tracker_cmd.use_heading = true;
    +     209             : 
    +     210         281 :   ROS_WARN_THROTTLE(0.1, "[MidairActivationTracker]: outputting cmd");
    +     211             : 
    +     212         281 :   return {tracker_cmd};
    +     213             : }
    +     214             : 
    +     215             : //}
    +     216             : 
    +     217             : /* //{ getStatus() */
    +     218             : 
    +     219          36 : const mrs_msgs::TrackerStatus MidairActivationTracker::getStatus() {
    +     220             : 
    +     221          36 :   mrs_msgs::TrackerStatus tracker_status;
    +     222             : 
    +     223          36 :   tracker_status.active            = is_active_;
    +     224          36 :   tracker_status.callbacks_enabled = callbacks_enabled_;
    +     225             : 
    +     226          36 :   return tracker_status;
    +     227             : }
    +     228             : 
    +     229             : //}
    +     230             : 
    +     231             : /* //{ enableCallbacks() */
    +     232             : 
    +     233         313 : const std_srvs::SetBoolResponse::ConstPtr MidairActivationTracker::enableCallbacks([[maybe_unused]] const std_srvs::SetBoolRequest::ConstPtr &cmd) {
    +     234             : 
    +     235         626 :   std_srvs::SetBoolResponse res;
    +     236             : 
    +     237         313 :   res.message = "callbacks are always disabled";
    +     238         313 :   res.success = true;
    +     239             : 
    +     240         626 :   return std_srvs::SetBoolResponse::ConstPtr(new std_srvs::SetBoolResponse(res));
    +     241             : }
    +     242             : 
    +     243             : //}
    +     244             : 
    +     245             : /* switchOdometrySource() //{ */
    +     246             : 
    +     247           0 : const std_srvs::TriggerResponse::ConstPtr MidairActivationTracker::switchOdometrySource([[maybe_unused]] const mrs_msgs::UavState &new_uav_state) {
    +     248             : 
    +     249           0 :   return std_srvs::TriggerResponse::Ptr();
    +     250             : }
    +     251             : 
    +     252             : //}
    +     253             : 
    +     254             : /* //{ hover() */
    +     255             : 
    +     256           0 : const std_srvs::TriggerResponse::ConstPtr MidairActivationTracker::hover([[maybe_unused]] const std_srvs::TriggerRequest::ConstPtr &cmd) {
    +     257             : 
    +     258           0 :   return std_srvs::TriggerResponse::Ptr();
    +     259             : }
    +     260             : 
    +     261             : //}
    +     262             : 
    +     263             : /* //{ startTrajectoryTracking() */
    +     264             : 
    +     265           0 : const std_srvs::TriggerResponse::ConstPtr MidairActivationTracker::startTrajectoryTracking([[maybe_unused]] const std_srvs::TriggerRequest::ConstPtr &cmd) {
    +     266           0 :   return std_srvs::TriggerResponse::Ptr();
    +     267             : }
    +     268             : 
    +     269             : //}
    +     270             : 
    +     271             : /* //{ stopTrajectoryTracking() */
    +     272             : 
    +     273           0 : const std_srvs::TriggerResponse::ConstPtr MidairActivationTracker::stopTrajectoryTracking([[maybe_unused]] const std_srvs::TriggerRequest::ConstPtr &cmd) {
    +     274           0 :   return std_srvs::TriggerResponse::Ptr();
    +     275             : }
    +     276             : 
    +     277             : //}
    +     278             : 
    +     279             : /* //{ resumeTrajectoryTracking() */
    +     280             : 
    +     281           0 : const std_srvs::TriggerResponse::ConstPtr MidairActivationTracker::resumeTrajectoryTracking([[maybe_unused]] const std_srvs::TriggerRequest::ConstPtr &cmd) {
    +     282           0 :   return std_srvs::TriggerResponse::Ptr();
    +     283             : }
    +     284             : 
    +     285             : //}
    +     286             : 
    +     287             : /* //{ gotoTrajectoryStart() */
    +     288             : 
    +     289           0 : const std_srvs::TriggerResponse::ConstPtr MidairActivationTracker::gotoTrajectoryStart([[maybe_unused]] const std_srvs::TriggerRequest::ConstPtr &cmd) {
    +     290           0 :   return std_srvs::TriggerResponse::Ptr();
    +     291             : }
    +     292             : 
    +     293             : //}
    +     294             : 
    +     295             : /* //{ setConstraints() */
    +     296             : 
    +     297         298 : const mrs_msgs::DynamicsConstraintsSrvResponse::ConstPtr MidairActivationTracker::setConstraints([
    +     298             :     [maybe_unused]] const mrs_msgs::DynamicsConstraintsSrvRequest::ConstPtr &cmd) {
    +     299             : 
    +     300         596 :   mrs_msgs::DynamicsConstraintsSrvResponse res;
    +     301             : 
    +     302         298 :   res.success = true;
    +     303         298 :   res.message = "constraints updated";
    +     304             : 
    +     305         596 :   return mrs_msgs::DynamicsConstraintsSrvResponse::ConstPtr(new mrs_msgs::DynamicsConstraintsSrvResponse(res));
    +     306             : }
    +     307             : 
    +     308             : //}
    +     309             : 
    +     310             : /* //{ setReference() */
    +     311             : 
    +     312           0 : const mrs_msgs::ReferenceSrvResponse::ConstPtr MidairActivationTracker::setReference([[maybe_unused]] const mrs_msgs::ReferenceSrvRequest::ConstPtr &cmd) {
    +     313             : 
    +     314           0 :   return mrs_msgs::ReferenceSrvResponse::Ptr();
    +     315             : }
    +     316             : 
    +     317             : //}
    +     318             : 
    +     319             : /* //{ setVelocityReference() */
    +     320             : 
    +     321           0 : const mrs_msgs::VelocityReferenceSrvResponse::ConstPtr MidairActivationTracker::setVelocityReference([
    +     322             :     [maybe_unused]] const mrs_msgs::VelocityReferenceSrvRequest::ConstPtr &cmd) {
    +     323           0 :   return mrs_msgs::VelocityReferenceSrvResponse::Ptr();
    +     324             : }
    +     325             : 
    +     326             : //}
    +     327             : 
    +     328             : /* //{ setTrajectoryReference() */
    +     329             : 
    +     330           4 : const mrs_msgs::TrajectoryReferenceSrvResponse::ConstPtr MidairActivationTracker::setTrajectoryReference([
    +     331             :     [maybe_unused]] const mrs_msgs::TrajectoryReferenceSrvRequest::ConstPtr &cmd) {
    +     332           4 :   return mrs_msgs::TrajectoryReferenceSrvResponse::Ptr();
    +     333             : }
    +     334             : 
    +     335             : //}
    +     336             : 
    +     337             : }  // namespace midair_activation_tracker
    +     338             : 
    +     339             : }  // namespace mrs_uav_trackers
    +     340             : 
    +     341             : #include <pluginlib/class_list_macros.h>
    +     342          91 : PLUGINLIB_EXPORT_CLASS(mrs_uav_trackers::midair_activation_tracker::MidairActivationTracker, mrs_uav_managers::Tracker)
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/midair_activation_tracker/midair_activation_tracker.cpp.gcov.overview.html b/mrs_uav_trackers/src/midair_activation_tracker/midair_activation_tracker.cpp.gcov.overview.html new file mode 100644 index 0000000000..92abe9ea3b --- /dev/null +++ b/mrs_uav_trackers/src/midair_activation_tracker/midair_activation_tracker.cpp.gcov.overview.html @@ -0,0 +1,106 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/midair_activation_tracker/midair_activation_tracker.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_trackers/src/midair_activation_tracker/midair_activation_tracker.cpp.gcov.png b/mrs_uav_trackers/src/midair_activation_tracker/midair_activation_tracker.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..4f71e52c409a351c83f61f35774f7a90c3d741d3 GIT binary patch literal 1153 zcmV-{1b+L8P)J!}>NZyyuFasP|62uJU5*aFu zjmS0d?pPuUM>KcvwhD9>G)*Rz=p=yIWPvvr_@@Y55pdMTNMg%6%JYb>a|plxWB~;i zsF4hyv^Mf5%|!6`TAz(e^Ad~0QdkGdHqTsTA!J->1xS#7+h-UE z*P@GUim)73fPB?L#8jXQJ(B^lO1%0Hy*7GM^Lkq^aejm3Xq5Ox^wTJOU7cj(=d*u^ zvHRc3yjeD4P`C0`Z{V&?`FF`cK;?mo05XS_xFh>hd2JFe%P0|pHs)z*m$(ouAWnKA z&Vrl78WM~f0LYZc9(K`4`~U8>&3;z&EgHZh8S3tOuV-R8A(&bu(x&Y(@Hl>xaq559 z%g^;=E*yse{@m}2V>xOF2W)oX>USL`>-&o%E-a1)V1uts#<8zzg2Y@HVvoPg*Kv6p z@pX=7aJeb%0h5I7(8Q>X*344QA4(}UN>l`Fk+_%Yh66H+mI1QI6P=XJ{?pn%%yMp3 zcU6T-AJEgK)PQ`6yPYaab+Y`F;Y$G^Uv;RDs$jya;_>-DJms;4a1%XcMjuF0Y!|Xs zKj^~Y^IJE5T}_Tkc3gB9UJ=$nUR^&HW?gS6?2i#X@u?J*q2dcR%-|>|mggwRMhYbW&05|Ly{-x8L`mb* zz31AUMYQS;iE+o71#VmR0HRNI=@8-x;JA%g;s4nf~I@b)c)wInYn^?NK z=JKZERbBI}j%&dMpIF(uQ}uJ5)$C6qGwtFQ4vE` zht6!K@}##)v_)&z-lR9r0625IM{P>uYj24ja7sC26LL2I>G3R8*qQbENDBWoDBz2> zd(%?=m++cIfgi?=GtVddALemFs`&CahsZCFbMonb&*P*s$kKBo*d&GH2UWO5^?r8- z=uA4Xo<_6QKf;dG%rgUQQC)Z@9*$>U(rAjQQARFTYGDrcJ;ZZ{x2@|*q-O|ENDoJL zXa1J+KC+_;Pe^|u;WHSYpGZq71!j>~q!cN_cSk+zQzeeuXun#61_{jPc|86AD!MUP TVQf$600000NkvXXu0mjfd_WxL literal 0 HcmV?d00001 diff --git a/mrs_uav_trackers/src/mpc_tracker/index-detail-sort-f.html b/mrs_uav_trackers/src/mpc_tracker/index-detail-sort-f.html new file mode 100644 index 0000000000..bb4cb24763 --- /dev/null +++ b/mrs_uav_trackers/src/mpc_tracker/index-detail-sort-f.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/mpc_tracker + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/mpc_trackerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:1320165080.0 %
    Date:2024-04-18 23:11:36Functions:405080.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    mpc_tracker.cpp +
    80.0%80.0%
    +
    80.0 %1320 / 165080.0 %40 / 50
    <unnamed>80.0 %1320 / 165080.0 %40 / 50
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/mpc_tracker/index-detail-sort-l.html b/mrs_uav_trackers/src/mpc_tracker/index-detail-sort-l.html new file mode 100644 index 0000000000..9b3f76124b --- /dev/null +++ b/mrs_uav_trackers/src/mpc_tracker/index-detail-sort-l.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/mpc_tracker + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/mpc_trackerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:1320165080.0 %
    Date:2024-04-18 23:11:36Functions:405080.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    mpc_tracker.cpp +
    80.0%80.0%
    +
    80.0 %1320 / 165080.0 %40 / 50
    <unnamed>80.0 %1320 / 165080.0 %40 / 50
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/mpc_tracker/index-detail.html b/mrs_uav_trackers/src/mpc_tracker/index-detail.html new file mode 100644 index 0000000000..2c71846935 --- /dev/null +++ b/mrs_uav_trackers/src/mpc_tracker/index-detail.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/mpc_tracker + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/mpc_trackerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:1320165080.0 %
    Date:2024-04-18 23:11:36Functions:405080.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    mpc_tracker.cpp +
    80.0%80.0%
    +
    80.0 %1320 / 165080.0 %40 / 50
    <unnamed>80.0 %1320 / 165080.0 %40 / 50
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/mpc_tracker/index-sort-f.html b/mrs_uav_trackers/src/mpc_tracker/index-sort-f.html new file mode 100644 index 0000000000..6eb0f903a1 --- /dev/null +++ b/mrs_uav_trackers/src/mpc_tracker/index-sort-f.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/mpc_tracker + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/mpc_trackerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:1320165080.0 %
    Date:2024-04-18 23:11:36Functions:405080.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    mpc_tracker.cpp +
    80.0%80.0%
    +
    80.0 %1320 / 165080.0 %40 / 50
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/mpc_tracker/index-sort-l.html b/mrs_uav_trackers/src/mpc_tracker/index-sort-l.html new file mode 100644 index 0000000000..97f9845f68 --- /dev/null +++ b/mrs_uav_trackers/src/mpc_tracker/index-sort-l.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/mpc_tracker + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/mpc_trackerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:1320165080.0 %
    Date:2024-04-18 23:11:36Functions:405080.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    mpc_tracker.cpp +
    80.0%80.0%
    +
    80.0 %1320 / 165080.0 %40 / 50
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/mpc_tracker/index.html b/mrs_uav_trackers/src/mpc_tracker/index.html new file mode 100644 index 0000000000..dcd29f1fc9 --- /dev/null +++ b/mrs_uav_trackers/src/mpc_tracker/index.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/mpc_tracker + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/mpc_trackerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:1320165080.0 %
    Date:2024-04-18 23:11:36Functions:405080.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    mpc_tracker.cpp +
    80.0%80.0%
    +
    80.0 %1320 / 165080.0 %40 / 50
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/mpc_tracker/mpc_tracker.cpp.func-sort-c.html b/mrs_uav_trackers/src/mpc_tracker/mpc_tracker.cpp.func-sort-c.html new file mode 100644 index 0000000000..b488b63f71 --- /dev/null +++ b/mrs_uav_trackers/src/mpc_tracker/mpc_tracker.cpp.func-sort-c.html @@ -0,0 +1,280 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/mpc_tracker/mpc_tracker.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/mpc_tracker - mpc_tracker.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:1320165080.0 %
    Date:2024-04-18 23:11:36Functions:405080.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_trackers::mpc_tracker::MpcTracker::resetStatic()0
    mrs_uav_trackers::mpc_tracker::MpcTracker::callbackWiggle(std_srvs::SetBoolRequest_<std::allocator<void> >&, std_srvs::SetBoolResponse_<std::allocator<void> >&)0
    mrs_uav_trackers::mpc_tracker::MpcTracker::debugPrintState(double)0
    mrs_uav_trackers::mpc_tracker::MpcTracker::debugPrintMPCResult(double)0
    mrs_uav_trackers::mpc_tracker::MpcTracker::stopTrajectoryTracking(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::mpc_tracker::MpcTracker::resumeTrajectoryTracking(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::mpc_tracker::MpcTracker::stopTrajectoryTrackingImpl[abi:cxx11]()0
    mrs_uav_trackers::mpc_tracker::MpcTracker::resumeTrajectoryTrackingImpl[abi:cxx11]()0
    mrs_uav_trackers::mpc_tracker::MpcTracker::callbackToggleCollisionAvoidance(std_srvs::SetBoolRequest_<std::allocator<void> >&, std_srvs::SetBoolResponse_<std::allocator<void> >&)0
    mrs_uav_trackers::mpc_tracker::MpcTracker::hover(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::mpc_tracker::MpcTracker::gotoTrajectoryStart(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)1
    mrs_uav_trackers::mpc_tracker::MpcTracker::gotoTrajectoryStartImpl[abi:cxx11]()1
    mrs_uav_trackers::mpc_tracker::MpcTracker::startTrajectoryTracking(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)1
    mrs_uav_trackers::mpc_tracker::MpcTracker::startTrajectoryTrackingImpl[abi:cxx11]()1
    mrs_uav_trackers::mpc_tracker::MpcTracker::setTrajectoryReference(boost::shared_ptr<mrs_msgs::TrajectoryReferenceSrvRequest_<std::allocator<void> > const> const&)4
    mrs_uav_trackers::mpc_tracker::MpcTracker::switchOdometrySource(mrs_msgs::UavState_<std::allocator<void> > const&)5
    mrs_uav_trackers::mpc_tracker::MpcTracker::deactivate()40
    mrs_uav_trackers::mpc_tracker::MpcTracker::activate[abi:cxx11](std::optional<mrs_msgs::TrackerCommand_<std::allocator<void> > > const&)82
    (anonymous namespace)::ProxyExec0::ProxyExec0()91
    mrs_uav_trackers::mpc_tracker::MpcTracker::initialize(ros::NodeHandle const&, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t>, std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t>)91
    mrs_uav_trackers::mpc_tracker::MpcTracker::dynamicReconfigureCallback(mrs_uav_trackers::mpc_trackerConfig&, unsigned int)91
    mrs_uav_trackers::mpc_tracker::MpcTracker::timerHover(ros::TimerEvent const&)92
    mrs_uav_trackers::mpc_tracker::MpcTracker::setRelativeGoal(double, double, double, double, bool)174
    mrs_uav_trackers::mpc_tracker::MpcTracker::setReference(boost::shared_ptr<mrs_msgs::ReferenceSrvRequest_<std::allocator<void> > const> const&)262
    mrs_uav_trackers::mpc_tracker::MpcTracker::setGoal(double, double, double, double, bool)263
    mrs_uav_trackers::mpc_tracker::MpcTracker::callbackOtherMavTrajectory(boost::shared_ptr<mrs_msgs::FutureTrajectory_<std::allocator<void> > const>)284
    mrs_uav_trackers::mpc_tracker::MpcTracker::setConstraints(boost::shared_ptr<mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> > const> const&)298
    mrs_uav_trackers::mpc_tracker::MpcTracker::setSinglePointReference(double, double, double, double)437
    mrs_uav_trackers::mpc_tracker::MpcTracker::setVelocityReference(boost::shared_ptr<mrs_msgs::VelocityReferenceSrvRequest_<std::allocator<void> > const> const&)468
    mrs_uav_trackers::mpc_tracker::MpcTracker::timerVelocityTracking(ros::TimerEvent const&)496
    mrs_uav_trackers::mpc_tracker::MpcTracker::loadTrajectory[abi:cxx11](mrs_msgs::TrajectoryReference_<std::allocator<void> >)498
    mrs_uav_trackers::mpc_tracker::MpcTracker::toggleHover(bool)940
    mrs_uav_trackers::mpc_tracker::MpcTracker::enableCallbacks(boost::shared_ptr<std_srvs::SetBoolRequest_<std::allocator<void> > const> const&)1677
    mrs_uav_trackers::mpc_tracker::MpcTracker::callbackOtherMavDiagnostics(boost::shared_ptr<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > const>)1881
    mrs_uav_trackers::mpc_tracker::MpcTracker::timerAvoidanceTrajectory(ros::TimerEvent const&)3840
    mrs_uav_trackers::mpc_tracker::MpcTracker::getCurrentTrajectoryIdx()7505
    mrs_uav_trackers::mpc_tracker::MpcTracker::getStatus()7505
    mrs_uav_trackers::mpc_tracker::MpcTracker::increaseCurrentTrajectoryTime(double)12157
    mrs_uav_trackers::mpc_tracker::MpcTracker::timerDiagnostics(ros::TimerEvent const&)19362
    mrs_uav_trackers::mpc_tracker::MpcTracker::publishDiagnostics()20339
    mrs_uav_trackers::mpc_tracker::MpcTracker::iterateModel(double const&)64564
    mrs_uav_trackers::mpc_tracker::MpcTracker::checkTrajectoryForCollisions(int&)69752
    mrs_uav_trackers::mpc_tracker::MpcTracker::calculateMPC()70716
    mrs_uav_trackers::mpc_tracker::MpcTracker::filterReferenceZ(Eigen::Matrix<double, -1, 1, 0, -1, 1> const&, double, double)70716
    mrs_uav_trackers::mpc_tracker::MpcTracker::filterReferenceXY(Eigen::Matrix<double, -1, 1, 0, -1, 1> const&, Eigen::Matrix<double, -1, 1, 0, -1, 1> const&, double, double)70716
    mrs_uav_trackers::mpc_tracker::MpcTracker::manageConstraints()70716
    mrs_uav_trackers::mpc_tracker::MpcTracker::timerMPC(ros::TimerEvent const&)70716
    mrs_uav_trackers::mpc_tracker::MpcTracker::update(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_uav_managers::Controller::ControlOutput const&)120314
    mrs_uav_trackers::mpc_tracker::MpcTracker::checkCollision(double, double, double, double, double, double)144480
    mrs_uav_trackers::mpc_tracker::MpcTracker::checkCollisionInflated(double, double, double, double, double, double)144480
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/mpc_tracker/mpc_tracker.cpp.func.html b/mrs_uav_trackers/src/mpc_tracker/mpc_tracker.cpp.func.html new file mode 100644 index 0000000000..a15a20112b --- /dev/null +++ b/mrs_uav_trackers/src/mpc_tracker/mpc_tracker.cpp.func.html @@ -0,0 +1,280 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/mpc_tracker/mpc_tracker.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/mpc_tracker - mpc_tracker.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:1320165080.0 %
    Date:2024-04-18 23:11:36Functions:405080.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    (anonymous namespace)::ProxyExec0::ProxyExec0()91
    mrs_uav_trackers::mpc_tracker::MpcTracker::deactivate()40
    mrs_uav_trackers::mpc_tracker::MpcTracker::initialize(ros::NodeHandle const&, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t>, std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t>)91
    mrs_uav_trackers::mpc_tracker::MpcTracker::timerHover(ros::TimerEvent const&)92
    mrs_uav_trackers::mpc_tracker::MpcTracker::resetStatic()0
    mrs_uav_trackers::mpc_tracker::MpcTracker::toggleHover(bool)940
    mrs_uav_trackers::mpc_tracker::MpcTracker::calculateMPC()70716
    mrs_uav_trackers::mpc_tracker::MpcTracker::iterateModel(double const&)64564
    mrs_uav_trackers::mpc_tracker::MpcTracker::setReference(boost::shared_ptr<mrs_msgs::ReferenceSrvRequest_<std::allocator<void> > const> const&)262
    mrs_uav_trackers::mpc_tracker::MpcTracker::callbackWiggle(std_srvs::SetBoolRequest_<std::allocator<void> >&, std_srvs::SetBoolResponse_<std::allocator<void> >&)0
    mrs_uav_trackers::mpc_tracker::MpcTracker::checkCollision(double, double, double, double, double, double)144480
    mrs_uav_trackers::mpc_tracker::MpcTracker::loadTrajectory[abi:cxx11](mrs_msgs::TrajectoryReference_<std::allocator<void> >)498
    mrs_uav_trackers::mpc_tracker::MpcTracker::setConstraints(boost::shared_ptr<mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> > const> const&)298
    mrs_uav_trackers::mpc_tracker::MpcTracker::debugPrintState(double)0
    mrs_uav_trackers::mpc_tracker::MpcTracker::enableCallbacks(boost::shared_ptr<std_srvs::SetBoolRequest_<std::allocator<void> > const> const&)1677
    mrs_uav_trackers::mpc_tracker::MpcTracker::setRelativeGoal(double, double, double, double, bool)174
    mrs_uav_trackers::mpc_tracker::MpcTracker::filterReferenceZ(Eigen::Matrix<double, -1, 1, 0, -1, 1> const&, double, double)70716
    mrs_uav_trackers::mpc_tracker::MpcTracker::timerDiagnostics(ros::TimerEvent const&)19362
    mrs_uav_trackers::mpc_tracker::MpcTracker::filterReferenceXY(Eigen::Matrix<double, -1, 1, 0, -1, 1> const&, Eigen::Matrix<double, -1, 1, 0, -1, 1> const&, double, double)70716
    mrs_uav_trackers::mpc_tracker::MpcTracker::manageConstraints()70716
    mrs_uav_trackers::mpc_tracker::MpcTracker::publishDiagnostics()20339
    mrs_uav_trackers::mpc_tracker::MpcTracker::debugPrintMPCResult(double)0
    mrs_uav_trackers::mpc_tracker::MpcTracker::gotoTrajectoryStart(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)1
    mrs_uav_trackers::mpc_tracker::MpcTracker::setVelocityReference(boost::shared_ptr<mrs_msgs::VelocityReferenceSrvRequest_<std::allocator<void> > const> const&)468
    mrs_uav_trackers::mpc_tracker::MpcTracker::switchOdometrySource(mrs_msgs::UavState_<std::allocator<void> > const&)5
    mrs_uav_trackers::mpc_tracker::MpcTracker::timerVelocityTracking(ros::TimerEvent const&)496
    mrs_uav_trackers::mpc_tracker::MpcTracker::checkCollisionInflated(double, double, double, double, double, double)144480
    mrs_uav_trackers::mpc_tracker::MpcTracker::setTrajectoryReference(boost::shared_ptr<mrs_msgs::TrajectoryReferenceSrvRequest_<std::allocator<void> > const> const&)4
    mrs_uav_trackers::mpc_tracker::MpcTracker::stopTrajectoryTracking(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::mpc_tracker::MpcTracker::getCurrentTrajectoryIdx()7505
    mrs_uav_trackers::mpc_tracker::MpcTracker::gotoTrajectoryStartImpl[abi:cxx11]()1
    mrs_uav_trackers::mpc_tracker::MpcTracker::setSinglePointReference(double, double, double, double)437
    mrs_uav_trackers::mpc_tracker::MpcTracker::startTrajectoryTracking(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)1
    mrs_uav_trackers::mpc_tracker::MpcTracker::resumeTrajectoryTracking(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::mpc_tracker::MpcTracker::timerAvoidanceTrajectory(ros::TimerEvent const&)3840
    mrs_uav_trackers::mpc_tracker::MpcTracker::callbackOtherMavTrajectory(boost::shared_ptr<mrs_msgs::FutureTrajectory_<std::allocator<void> > const>)284
    mrs_uav_trackers::mpc_tracker::MpcTracker::dynamicReconfigureCallback(mrs_uav_trackers::mpc_trackerConfig&, unsigned int)91
    mrs_uav_trackers::mpc_tracker::MpcTracker::stopTrajectoryTrackingImpl[abi:cxx11]()0
    mrs_uav_trackers::mpc_tracker::MpcTracker::callbackOtherMavDiagnostics(boost::shared_ptr<mrs_msgs::MpcTrackerDiagnostics_<std::allocator<void> > const>)1881
    mrs_uav_trackers::mpc_tracker::MpcTracker::startTrajectoryTrackingImpl[abi:cxx11]()1
    mrs_uav_trackers::mpc_tracker::MpcTracker::checkTrajectoryForCollisions(int&)69752
    mrs_uav_trackers::mpc_tracker::MpcTracker::resumeTrajectoryTrackingImpl[abi:cxx11]()0
    mrs_uav_trackers::mpc_tracker::MpcTracker::increaseCurrentTrajectoryTime(double)12157
    mrs_uav_trackers::mpc_tracker::MpcTracker::callbackToggleCollisionAvoidance(std_srvs::SetBoolRequest_<std::allocator<void> >&, std_srvs::SetBoolResponse_<std::allocator<void> >&)0
    mrs_uav_trackers::mpc_tracker::MpcTracker::hover(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::mpc_tracker::MpcTracker::update(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_uav_managers::Controller::ControlOutput const&)120314
    mrs_uav_trackers::mpc_tracker::MpcTracker::setGoal(double, double, double, double, bool)263
    mrs_uav_trackers::mpc_tracker::MpcTracker::activate[abi:cxx11](std::optional<mrs_msgs::TrackerCommand_<std::allocator<void> > > const&)82
    mrs_uav_trackers::mpc_tracker::MpcTracker::timerMPC(ros::TimerEvent const&)70716
    mrs_uav_trackers::mpc_tracker::MpcTracker::getStatus()7505
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/mpc_tracker/mpc_tracker.cpp.gcov.frameset.html b/mrs_uav_trackers/src/mpc_tracker/mpc_tracker.cpp.gcov.frameset.html new file mode 100644 index 0000000000..70888f86ff --- /dev/null +++ b/mrs_uav_trackers/src/mpc_tracker/mpc_tracker.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/mpc_tracker/mpc_tracker.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_trackers/src/mpc_tracker/mpc_tracker.cpp.gcov.html b/mrs_uav_trackers/src/mpc_tracker/mpc_tracker.cpp.gcov.html new file mode 100644 index 0000000000..f712a8aaea --- /dev/null +++ b/mrs_uav_trackers/src/mpc_tracker/mpc_tracker.cpp.gcov.html @@ -0,0 +1,3931 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/mpc_tracker/mpc_tracker.cpp + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/mpc_tracker - mpc_tracker.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:1320165080.0 %
    Date:2024-04-18 23:11:36Functions:405080.0 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : /* includes //{ */
    +       2             : 
    +       3             : #include <ros/ros.h>
    +       4             : #include <ros/package.h>
    +       5             : 
    +       6             : #include <mrs_uav_managers/tracker.h>
    +       7             : #include <mrs_uav_managers/controller.h>
    +       8             : 
    +       9             : #include <geometry_msgs/Pose.h>
    +      10             : #include <geometry_msgs/PoseArray.h>
    +      11             : 
    +      12             : #include <mrs_msgs/FuturePoint.h>
    +      13             : #include <mrs_msgs/FutureTrajectory.h>
    +      14             : #include <mrs_msgs/MpcTrackerDiagnostics.h>
    +      15             : #include <mrs_msgs/MpcPredictionFullState.h>
    +      16             : #include <mrs_msgs/EstimationDiagnostics.h>
    +      17             : #include <mrs_msgs/VelocityReference.h>
    +      18             : #include <mrs_msgs/VelocityReferenceSrv.h>
    +      19             : 
    +      20             : #include <std_msgs/String.h>
    +      21             : 
    +      22             : #include <mrs_lib/profiler.h>
    +      23             : #include <mrs_lib/utils.h>
    +      24             : #include <mrs_lib/mutex.h>
    +      25             : #include <mrs_lib/attitude_converter.h>
    +      26             : #include <mrs_lib/subscribe_handler.h>
    +      27             : #include <mrs_lib/publisher_handler.h>
    +      28             : #include <mrs_lib/geometry/cyclic.h>
    +      29             : #include <mrs_lib/geometry/misc.h>
    +      30             : #include <mrs_lib/scope_timer.h>
    +      31             : 
    +      32             : #include <mpc_tracker.h>
    +      33             : 
    +      34             : #include <dynamic_reconfigure/server.h>
    +      35             : #include <mrs_uav_trackers/mpc_trackerConfig.h>
    +      36             : 
    +      37             : #include <visualization_msgs/Marker.h>
    +      38             : #include <visualization_msgs/MarkerArray.h>
    +      39             : 
    +      40             : //}
    +      41             : 
    +      42             : /* defines //{ */
    +      43             : 
    +      44             : #define MPC_N_STATES 12
    +      45             : #define MPC_N_INPUTS 3
    +      46             : 
    +      47             : #define MPC_HEADING_N_STATES 4
    +      48             : #define MPC_HEADING_N_INPUTS 1
    +      49             : 
    +      50             : #define MPC_HORIZON_LENGTH 40
    +      51             : 
    +      52             : //}
    +      53             : 
    +      54             : /* using //{ */
    +      55             : 
    +      56             : using namespace Eigen;
    +      57             : 
    +      58             : using vec2_t = mrs_lib::geometry::vec_t<2>;
    +      59             : using vec3_t = mrs_lib::geometry::vec_t<3>;
    +      60             : 
    +      61             : using radians  = mrs_lib::geometry::radians;
    +      62             : using sradians = mrs_lib::geometry::sradians;
    +      63             : 
    +      64             : using quat_t = Eigen::Quaterniond;
    +      65             : 
    +      66             : //}
    +      67             : 
    +      68             : namespace mrs_uav_trackers
    +      69             : {
    +      70             : 
    +      71             : namespace mpc_tracker
    +      72             : {
    +      73             : 
    +      74             : /* //{ class MpcTracker */
    +      75             : 
    +      76             : class MpcTracker : public mrs_uav_managers::Tracker {
    +      77             : public:
    +      78             :   bool initialize(const ros::NodeHandle& nh, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t> common_handlers,
    +      79             :                   std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t> private_handlers);
    +      80             : 
    +      81             :   std::tuple<bool, std::string> activate(const std::optional<mrs_msgs::TrackerCommand>& last_tracker_cmd);
    +      82             :   void                          deactivate(void);
    +      83             :   bool                          resetStatic(void);
    +      84             : 
    +      85             :   std::optional<mrs_msgs::TrackerCommand>   update(const mrs_msgs::UavState& uav_state, const mrs_uav_managers::Controller::ControlOutput& last_control_output);
    +      86             :   const std_srvs::SetBoolResponse::ConstPtr enableCallbacks(const std_srvs::SetBoolRequest::ConstPtr& cmd);
    +      87             :   const mrs_msgs::TrackerStatus             getStatus();
    +      88             :   const std_srvs::TriggerResponse::ConstPtr switchOdometrySource(const mrs_msgs::UavState& new_uav_state);
    +      89             : 
    +      90             :   const mrs_msgs::ReferenceSrvResponse::ConstPtr           setReference(const mrs_msgs::ReferenceSrvRequest::ConstPtr& cmd);
    +      91             :   const mrs_msgs::VelocityReferenceSrvResponse::ConstPtr   setVelocityReference(const mrs_msgs::VelocityReferenceSrvRequest::ConstPtr& cmd);
    +      92             :   const mrs_msgs::TrajectoryReferenceSrvResponse::ConstPtr setTrajectoryReference(const mrs_msgs::TrajectoryReferenceSrvRequest::ConstPtr& cmd);
    +      93             : 
    +      94             :   const std_srvs::TriggerResponse::ConstPtr hover(const std_srvs::TriggerRequest::ConstPtr& cmd);
    +      95             :   const std_srvs::TriggerResponse::ConstPtr startTrajectoryTracking(const std_srvs::TriggerRequest::ConstPtr& cmd);
    +      96             :   const std_srvs::TriggerResponse::ConstPtr stopTrajectoryTracking(const std_srvs::TriggerRequest::ConstPtr& cmd);
    +      97             :   const std_srvs::TriggerResponse::ConstPtr resumeTrajectoryTracking(const std_srvs::TriggerRequest::ConstPtr& cmd);
    +      98             :   const std_srvs::TriggerResponse::ConstPtr gotoTrajectoryStart(const std_srvs::TriggerRequest::ConstPtr& cmd);
    +      99             : 
    +     100             :   const mrs_msgs::DynamicsConstraintsSrvResponse::ConstPtr setConstraints(const mrs_msgs::DynamicsConstraintsSrvRequest::ConstPtr& cmd);
    +     101             : 
    +     102             : private:
    +     103             :   ros::NodeHandle nh_;
    +     104             : 
    +     105             :   std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t>  common_handlers_;
    +     106             :   std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t> private_handlers_;
    +     107             : 
    +     108             :   std::atomic<bool> callbacks_enabled_ = true;
    +     109             : 
    +     110             :   std::string _uav_name_;
    +     111             : 
    +     112             :   // debugging publishers
    +     113             :   mrs_lib::PublisherHandler<mrs_msgs::MpcTrackerDiagnostics> pub_diagnostics_;
    +     114             :   mrs_lib::PublisherHandler<std_msgs::String>                pub_status_string_;
    +     115             : 
    +     116             :   mrs_lib::PublisherHandler<geometry_msgs::PoseArray>        pub_debug_processed_trajectory_poses_;
    +     117             :   mrs_lib::PublisherHandler<visualization_msgs::MarkerArray> pub_debug_processed_trajectory_markers_;
    +     118             : 
    +     119             :   mrs_msgs::UavState uav_state_;
    +     120             :   std::mutex         mutex_uav_state_;
    +     121             : 
    +     122             :   bool is_active_      = false;
    +     123             :   bool is_initialized_ = false;
    +     124             : 
    +     125             :   // | ----------------------- constraints ---------------------- |
    +     126             : 
    +     127             :   mrs_msgs::DynamicsConstraints constraints_;
    +     128             :   std::mutex                    mutex_constraints_;
    +     129             : 
    +     130             :   mrs_msgs::DynamicsConstraints constraints_filtered_;
    +     131             :   std::mutex                    mutex_constraints_filtered_;
    +     132             : 
    +     133             :   std::atomic<bool> got_constraints_     = false;
    +     134             :   std::atomic<bool> all_constraints_set_ = false;
    +     135             : 
    +     136             :   double _diag_pos_tracking_thr_;
    +     137             :   double _diag_heading_tracking_thr_;
    +     138             : 
    +     139             :   double _mpc_synchronous_rate_limit_;
    +     140             :   double _mpc_asynchronous_rate_;
    +     141             : 
    +     142             :   double update_rate_ = 100.0;
    +     143             : 
    +     144             :   double     dt1_;
    +     145             :   std::mutex mutex_dt1_;
    +     146             : 
    +     147             :   double _dt2_;
    +     148             : 
    +     149             :   MatrixXd          _mat_A_;  // system matrix for virtual UAV
    +     150             :   MatrixXd          _mat_B_;  // input matrix for virtual UAV
    +     151             :   MatrixXd          A_;       // system matrix for virtual UAV
    +     152             :   MatrixXd          B_;       // input matrix for virtual UAV
    +     153             :   std::atomic<bool> model_first_iteration_ = true;
    +     154             :   ros::Time         model_iteration_last_time_;
    +     155             : 
    +     156             :   MatrixXd _mat_A_heading_;  // system matrix for heading
    +     157             :   MatrixXd _mat_B_heading_;  // input matrix for heading
    +     158             :   MatrixXd A_heading_;       // system matrix for heading
    +     159             :   MatrixXd B_heading_;       // input matrix for heading
    +     160             : 
    +     161             :   // the reference over the prediction horizon per axis
    +     162             :   MatrixXd   des_x_trajectory_;
    +     163             :   MatrixXd   des_y_trajectory_;
    +     164             :   MatrixXd   des_z_trajectory_;
    +     165             :   MatrixXd   des_heading_trajectory_;
    +     166             :   std::mutex mutex_des_trajectory_;
    +     167             : 
    +     168             :   // the reference filtered over the prediction horizon per axis
    +     169             :   MatrixXd des_z_filtered_offset_;
    +     170             : 
    +     171             :   // the whole trajectory reference split per axis
    +     172             :   std::shared_ptr<VectorXd> des_x_whole_trajectory_;
    +     173             :   std::shared_ptr<VectorXd> des_y_whole_trajectory_;
    +     174             :   std::shared_ptr<VectorXd> des_z_whole_trajectory_;
    +     175             :   std::shared_ptr<VectorXd> des_heading_whole_trajectory_;
    +     176             :   int                       des_whole_trajectory_id_ = 0;
    +     177             :   std::mutex                mutex_des_whole_trajectory_;
    +     178             : 
    +     179             :   int  getCurrentTrajectoryIdx();
    +     180             :   void increaseCurrentTrajectoryTime(const double dt);
    +     181             : 
    +     182             :   // trajectory tracking
    +     183             :   std::atomic<bool> trajectory_tracking_in_progress_ = false;
    +     184             :   double            trajectory_current_time_;
    +     185             :   std::mutex        mutex_trajectory_tracking_states_;
    +     186             : 
    +     187             :   // params of the loaded trajectory
    +     188             :   int    trajectory_size_          = 0;
    +     189             :   double trajectory_dt_            = 0.2;
    +     190             :   bool   trajectory_track_heading_ = false;
    +     191             :   bool   trajectory_tracking_loop_ = false;
    +     192             :   bool   trajectory_set_           = false;
    +     193             :   int    trajectory_count_         = 0;  // counts how many trajectories we have received
    +     194             : 
    +     195             :   // mpc output
    +     196             :   VectorXd   mpc_u_;
    +     197             :   double     mpc_u_heading_;
    +     198             :   std::mutex mutex_mpc_u_;
    +     199             : 
    +     200             :   // current state of the dynamical system
    +     201             :   MatrixXd   mpc_x_;          // translation state
    +     202             :   MatrixXd   mpc_x_heading_;  // heading state
    +     203             :   std::mutex mutex_mpc_x_;
    +     204             : 
    +     205             :   // odometry reset
    +     206             :   std::atomic<bool> odometry_reset_in_progress_ = false;
    +     207             :   std::atomic<bool> mpc_result_invalid_         = false;
    +     208             : 
    +     209             :   // predicting the future
    +     210             :   MatrixXd   predicted_trajectory_;
    +     211             :   MatrixXd   predicted_heading_trajectory_;
    +     212             :   std::mutex mutex_predicted_trajectory_;
    +     213             : 
    +     214             :   mrs_msgs::MpcPredictionFullState prediction_full_state_;
    +     215             :   std::mutex                       mutex_prediction_full_state_;
    +     216             : 
    +     217             :   mrs_lib::PublisherHandler<geometry_msgs::PoseArray>   ph_predicted_trajectory_debugging_;
    +     218             :   mrs_lib::PublisherHandler<geometry_msgs::PoseArray>   ph_mpc_reference_debugging_;
    +     219             :   mrs_lib::PublisherHandler<geometry_msgs::PoseStamped> ph_current_trajectory_point_;
    +     220             : 
    +     221             :   std::atomic<bool> mpc_computed_ = false;
    +     222             : 
    +     223             :   bool brake_ = false;
    +     224             : 
    +     225             :   // | ----------------------- MPC solver ----------------------- |
    +     226             : 
    +     227             :   std::shared_ptr<mrs_mpc_solvers::mpc_tracker::Solver> mpc_solver_y_;
    +     228             :   std::shared_ptr<mrs_mpc_solvers::mpc_tracker::Solver> mpc_solver_x_;
    +     229             :   std::shared_ptr<mrs_mpc_solvers::mpc_tracker::Solver> mpc_solver_z_;
    +     230             :   std::shared_ptr<mrs_mpc_solvers::mpc_tracker::Solver> mpc_solver_heading_;
    +     231             : 
    +     232             :   std::mutex mutex_mpc_calculation_;
    +     233             : 
    +     234             :   int _max_iters_xy_;
    +     235             :   int _max_iters_z_;
    +     236             :   int _max_iters_heading_;
    +     237             : 
    +     238             :   // | ----------- measuring the "MPC realtime factor" ---------- |
    +     239             : 
    +     240             :   double mpc_rtf_ = 0.0;
    +     241             : 
    +     242             :   // | ------------------- collision avoidance ------------------ |
    +     243             : 
    +     244             :   // configurable params
    +     245             :   bool collision_avoidance_enabled_           = false;
    +     246             :   bool collision_avoidance_enabled_passively_ = true;
    +     247             : 
    +     248             :   // TODO what is this?
    +     249             :   double    coef_scaler = 0;
    +     250             :   ros::Time coef_time;
    +     251             : 
    +     252             :   double minimum_collison_free_altitude_ = std::numeric_limits<double>::lowest();
    +     253             : 
    +     254             :   // params
    +     255             :   double                   _avoidance_trajectory_rate_;
    +     256             :   double                   _avoidance_radius_threshold_;
    +     257             :   double                   _avoidance_z_correction_;
    +     258             :   std::string              _avoidance_diagnostics_topic_name_;
    +     259             :   std::vector<std::string> _avoidance_other_uav_names_;
    +     260             :   double                   _avoidance_z_threshold_;
    +     261             : 
    +     262             :   // how old can the other UAV trajectory be (since receive time)
    +     263             :   double _collision_trajectory_timeout_;
    +     264             : 
    +     265             :   // when collision detected, slow down during the manouver
    +     266             :   double _avoidance_collision_horizontal_speed_coef_;
    +     267             : 
    +     268             :   // when collision detected, slow down fully this number of steps before it
    +     269             :   int _avoidance_collision_slow_down_fully_;
    +     270             : 
    +     271             :   // when collision detected, start slowing down this number of steps before it
    +     272             :   int _avoidance_collision_slow_down_;
    +     273             : 
    +     274             :   // when avoiding, start climbing this number of steps before it
    +     275             :   int _avoidance_collision_start_climbing_;
    +     276             : 
    +     277             :   int avoidance_this_uav_number_;
    +     278             :   int avoidance_this_uav_priority_;
    +     279             : 
    +     280             :   double            collision_free_altitude_;
    +     281             :   std::atomic<bool> avoiding_collision_               = false;
    +     282             :   bool              collision_avoidance_affecting_me_ = false;
    +     283             : 
    +     284             :   // avoidance trajectory will not be published unless we computed it at least once
    +     285             :   std::atomic<bool> future_was_predicted_ = false;
    +     286             : 
    +     287             :   // subscribing to the other UAV future trajectories
    +     288             :   void callbackOtherMavTrajectory(const mrs_msgs::FutureTrajectory::ConstPtr msg);
    +     289             : 
    +     290             :   std::vector<mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory>> other_uav_trajectory_subscribers_;
    +     291             :   std::map<std::string, mrs_msgs::FutureTrajectory>                  other_uav_avoidance_trajectories_;
    +     292             :   std::mutex                                                         mutex_other_uav_avoidance_trajectories_;
    +     293             : 
    +     294             :   // subscribing to the other UAV diagnostics'
    +     295             :   void callbackOtherMavDiagnostics(const mrs_msgs::MpcTrackerDiagnostics::ConstPtr msg);
    +     296             : 
    +     297             :   std::vector<mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics>> other_uav_diag_subscribers_;
    +     298             :   std::map<std::string, mrs_msgs::MpcTrackerDiagnostics>                  other_uav_diagnostics_;
    +     299             :   std::mutex                                                              mutex_other_uav_diagnostics_;
    +     300             : 
    +     301             :   bool checkCollision(const double ax, const double ay, const double az, const double bx, const double by, const double bz);
    +     302             :   bool checkCollisionInflated(const double ax, const double ay, const double az, const double bx, const double by, const double bz);
    +     303             : 
    +     304             :   mrs_lib::PublisherHandler<mrs_msgs::FutureTrajectory> ph_avoidance_trajectory_;
    +     305             : 
    +     306             :   ros::ServiceServer service_server_toggle_avoidance_;
    +     307             :   bool               callbackToggleCollisionAvoidance(std_srvs::SetBool::Request& req, std_srvs::SetBool::Response& res);
    +     308             : 
    +     309             :   mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics> sh_estimation_diag_;
    +     310             : 
    +     311             :   // | --------------------- MPC calculation -------------------- |
    +     312             : 
    +     313             :   ros::Timer        timer_mpc_iteration_;
    +     314             :   std::atomic<bool> mpc_synchronous_ = false;
    +     315             :   ros::TimerEvent   synchronous_timer_event_;
    +     316             : 
    +     317             :   std::atomic<bool> mpc_timer_running_ = false;
    +     318             :   void              timerMPC(const ros::TimerEvent& event);
    +     319             : 
    +     320             :   // | -------------------- velocity tracking ------------------- |
    +     321             : 
    +     322             :   ros::Timer                  timer_velocity_tracking_;
    +     323             :   void                        timerVelocityTracking(const ros::TimerEvent& event);
    +     324             :   ros::Time                   velocity_reference_time_;
    +     325             :   mrs_msgs::VelocityReference velocity_reference_;
    +     326             :   std::mutex                  mutex_velocity_reference_;
    +     327             :   std::atomic<bool>           velocity_tracking_active_ = false;
    +     328             : 
    +     329             :   // | ------------------ avoidance trajectory ------------------ |
    +     330             : 
    +     331             :   ros::Timer timer_avoidance_trajectory_;
    +     332             :   void       timerAvoidanceTrajectory(const ros::TimerEvent& event);
    +     333             : 
    +     334             :   // | ----------------------- diagnostics ---------------------- |
    +     335             : 
    +     336             :   ros::Timer timer_diagnostics_;
    +     337             :   double     _diagnostics_rate_;
    +     338             :   void       timerDiagnostics(const ros::TimerEvent& event);
    +     339             : 
    +     340             :   // | ------------------------ hovering ------------------------ |
    +     341             : 
    +     342             :   ros::Timer        timer_hover_;
    +     343             :   void              timerHover(const ros::TimerEvent& event);
    +     344             :   std::atomic<bool> hovering_in_progress_ = false;
    +     345             :   void              toggleHover(bool in);
    +     346             : 
    +     347             :   // | ------------------- trajectory tracking ------------------ |
    +     348             : 
    +     349             :   std::tuple<bool, std::string> resumeTrajectoryTrackingImpl(void);
    +     350             :   std::tuple<bool, std::string> startTrajectoryTrackingImpl(void);
    +     351             :   std::tuple<bool, std::string> stopTrajectoryTrackingImpl(void);
    +     352             :   std::tuple<bool, std::string> gotoTrajectoryStartImpl(void);
    +     353             : 
    +     354             :   // | --------------------- other routines --------------------- |
    +     355             : 
    +     356             :   void publishDiagnostics();
    +     357             : 
    +     358             :   void debugPrintState(const double throttle);
    +     359             :   void debugPrintMPCResult(const double throttle);
    +     360             : 
    +     361             :   void setGoal(const double pos_x, const double pos_y, const double pos_z, const double heading, const bool use_heading);
    +     362             :   void setRelativeGoal(const double pos_x, const double pos_y, const double pos_z, const double heading, const bool use_heading);
    +     363             :   void setSinglePointReference(const double x, const double y, const double z, const double heading);
    +     364             : 
    +     365             :   std::tuple<bool, std::string, bool> loadTrajectory(const mrs_msgs::TrajectoryReference msg);
    +     366             : 
    +     367             :   MatrixXd                       filterReferenceZ(const VectorXd& des_z_trajectory, const double max_ascending_speed, const double max_descending_speed);
    +     368             :   std::tuple<MatrixXd, MatrixXd> filterReferenceXY(const VectorXd& des_x_trajectory, const VectorXd& des_y_trajectory, double max_speed_x, double max_speed_y);
    +     369             : 
    +     370             :   double checkTrajectoryForCollisions(int& first_collision_index);
    +     371             : 
    +     372             :   void manageConstraints(void);
    +     373             :   void calculateMPC(void);
    +     374             :   void iterateModel(const double& dt);
    +     375             : 
    +     376             :   // | ------------------------ profiler ------------------------ |
    +     377             : 
    +     378             :   mrs_lib::Profiler profiler;
    +     379             :   bool              _profiler_enabled_ = false;
    +     380             : 
    +     381             :   // | ------------------------- wiggle ------------------------- |
    +     382             : 
    +     383             :   ros::ServiceServer service_server_wiggle_;
    +     384             :   bool               callbackWiggle(std_srvs::SetBool::Request& req, std_srvs::SetBool::Response& res);
    +     385             : 
    +     386             :   double wiggle_phase_ = 0;
    +     387             : 
    +     388             :   // | --------------- dynamic reconfigure server --------------- |
    +     389             : 
    +     390             :   void dynamicReconfigureCallback(mrs_uav_trackers::mpc_trackerConfig& config, uint32_t level);
    +     391             : 
    +     392             :   boost::recursive_mutex                      config_mutex_;
    +     393             :   typedef mrs_uav_trackers::mpc_trackerConfig Config;
    +     394             :   typedef dynamic_reconfigure::Server<Config> ReconfigureServer;
    +     395             :   boost::shared_ptr<ReconfigureServer>        reconfigure_server_;
    +     396             :   mrs_uav_trackers::mpc_trackerConfig         drs_params_;
    +     397             :   std::mutex                                  mutex_drs_params_;
    +     398             : };
    +     399             : 
    +     400             : //}
    +     401             : 
    +     402             : // | -------------- tracker's interface routines -------------- |
    +     403             : 
    +     404             : /* //{ initialize() */
    +     405             : 
    +     406          91 : bool MpcTracker::initialize(const ros::NodeHandle& nh, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t> common_handlers,
    +     407             :                             std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t> private_handlers) {
    +     408             : 
    +     409          91 :   nh_ = nh;
    +     410             : 
    +     411          91 :   common_handlers_  = common_handlers;
    +     412          91 :   private_handlers_ = private_handlers;
    +     413             : 
    +     414          91 :   _uav_name_ = common_handlers->uav_name;
    +     415             : 
    +     416          91 :   ros::Time::waitForValid();
    +     417             : 
    +     418             :   // --------------------------------------------------------------
    +     419             :   // |                     loading parameters                     |
    +     420             :   // --------------------------------------------------------------
    +     421             : 
    +     422             :   // | ---------- loading params using the parent's nh ---------- |
    +     423             : 
    +     424         182 :   mrs_lib::ParamLoader param_loader_parent(common_handlers->parent_nh, "ControlManager");
    +     425             : 
    +     426          91 :   param_loader_parent.loadParam("enable_profiler", _profiler_enabled_);
    +     427             : 
    +     428          91 :   if (!param_loader_parent.loadedSuccessfully()) {
    +     429           0 :     ROS_ERROR("[MpcTracker]: Could not load all parameters!");
    +     430           0 :     return false;
    +     431             :   }
    +     432             : 
    +     433             :   // | --------------- loading plugin's parameters -------------- |
    +     434             : 
    +     435          91 :   private_handlers->param_loader->addYamlFile(ros::package::getPath("mrs_uav_trackers") + "/config/private/mpc_tracker.yaml");
    +     436          91 :   private_handlers->param_loader->addYamlFile(ros::package::getPath("mrs_uav_trackers") + "/config/public/mpc_tracker.yaml");
    +     437             : 
    +     438         182 :   const std::string yaml_prefix = "mrs_uav_trackers/mpc_tracker/";
    +     439             : 
    +     440          91 :   private_handlers->param_loader->loadParam("network/robot_names", _avoidance_other_uav_names_);
    +     441             : 
    +     442          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "mpc_loop/synchronous_rate_limit", _mpc_synchronous_rate_limit_);
    +     443          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "mpc_loop/asynchronous_loop_rate", _mpc_asynchronous_rate_);
    +     444             : 
    +     445          91 :   if (_mpc_asynchronous_rate_ < 15) {
    +     446           0 :     ROS_ERROR("[MpcTracker]: the asynchronous_loop_rate must be > 15 Hz");
    +     447           0 :     return false;
    +     448             :   }
    +     449             : 
    +     450          91 :   dt1_ = 1.0 / _mpc_asynchronous_rate_;
    +     451             : 
    +     452          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "braking/enabled", drs_params_.braking_enabled);
    +     453          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "braking/q_vel_braking", drs_params_.q_vel_braking);
    +     454          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "braking/q_vel_no_braking", drs_params_.q_vel_no_braking);
    +     455             : 
    +     456          91 :   private_handlers->param_loader->loadMatrixKnown(yaml_prefix + "model/translation/A", _mat_A_, MPC_N_STATES, MPC_N_STATES);
    +     457          91 :   private_handlers->param_loader->loadMatrixKnown(yaml_prefix + "model/translation/B", _mat_B_, MPC_N_STATES, MPC_N_INPUTS);
    +     458             : 
    +     459          91 :   A_ = _mat_A_;
    +     460          91 :   B_ = _mat_B_;
    +     461             : 
    +     462          91 :   private_handlers->param_loader->loadMatrixKnown(yaml_prefix + "model/heading/A", _mat_A_heading_, MPC_HEADING_N_STATES, MPC_HEADING_N_STATES);
    +     463          91 :   private_handlers->param_loader->loadMatrixKnown(yaml_prefix + "model/heading/B", _mat_B_heading_, MPC_HEADING_N_STATES, MPC_HEADING_N_INPUTS);
    +     464             : 
    +     465          91 :   A_heading_ = _mat_A_heading_;
    +     466          91 :   B_heading_ = _mat_B_heading_;
    +     467             : 
    +     468             :   // load the MPC parameters
    +     469          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "mpc_solver/dt2", _dt2_);
    +     470             : 
    +     471          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "diagnostics/rate", _diagnostics_rate_);
    +     472          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "diagnostics/position_tracking_threshold", _diag_pos_tracking_thr_);
    +     473          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "diagnostics/orientation_tracking_threshold", _diag_heading_tracking_thr_);
    +     474             : 
    +     475          91 :   bool verbose_xy      = false;
    +     476          91 :   bool verbose_z       = false;
    +     477          91 :   bool verbose_heading = false;
    +     478             : 
    +     479         182 :   std::vector<double> xy_Q;
    +     480         182 :   std::vector<double> z_Q;
    +     481         182 :   std::vector<double> heading_Q;
    +     482             : 
    +     483          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "mpc_solver/xy/verbose", verbose_xy);
    +     484          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "mpc_solver/xy/max_n_iterations", _max_iters_xy_);
    +     485          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "mpc_solver/xy/Q", xy_Q);
    +     486             : 
    +     487          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "mpc_solver/z/verbose", verbose_z);
    +     488          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "mpc_solver/z/max_n_iterations", _max_iters_z_);
    +     489          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "mpc_solver/z/Q", z_Q);
    +     490             : 
    +     491          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "mpc_solver/heading/verbose", verbose_heading);
    +     492          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "mpc_solver/heading/max_n_iterations", _max_iters_heading_);
    +     493          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "mpc_solver/heading/Q", heading_Q);
    +     494             : 
    +     495          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "wiggle/enabled", drs_params_.wiggle_enabled);
    +     496          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "wiggle/amplitude", drs_params_.wiggle_amplitude);
    +     497          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "wiggle/frequency", drs_params_.wiggle_frequency);
    +     498             : 
    +     499          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "collision_avoidance/enabled", collision_avoidance_enabled_);
    +     500          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "collision_avoidance/enabled_passively", collision_avoidance_enabled_passively_);
    +     501          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "collision_avoidance/predicted_trajectory_publish_rate", _avoidance_trajectory_rate_);
    +     502          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "collision_avoidance/correction", _avoidance_z_correction_);
    +     503          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "collision_avoidance/radius", _avoidance_radius_threshold_);
    +     504          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "collision_avoidance/altitude_threshold", _avoidance_z_threshold_);
    +     505          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "collision_avoidance/collision_horizontal_speed_coef", _avoidance_collision_horizontal_speed_coef_);
    +     506          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "collision_avoidance/collision_slow_down_fully", _avoidance_collision_slow_down_fully_);
    +     507          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "collision_avoidance/collision_slow_down_start", _avoidance_collision_slow_down_);
    +     508          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "collision_avoidance/collision_start_climbing", _avoidance_collision_start_climbing_);
    +     509          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "collision_avoidance/trajectory_timeout", _collision_trajectory_timeout_);
    +     510             : 
    +     511          91 :   if (!private_handlers->param_loader->loadedSuccessfully()) {
    +     512           0 :     ROS_ERROR("[MpcTracker]: could not load all parameters!");
    +     513           0 :     return false;
    +     514             :   }
    +     515             : 
    +     516          91 :   ROS_INFO_STREAM("[MpcTracker]: initializing solvers with dt1 = " << dt1_);
    +     517             : 
    +     518          91 :   mpc_solver_y_ = std::make_shared<mrs_mpc_solvers::mpc_tracker::Solver>("MpcTracker_y", verbose_xy, _max_iters_xy_, xy_Q, dt1_, _dt2_, 1);
    +     519          91 :   mpc_solver_x_ = std::make_shared<mrs_mpc_solvers::mpc_tracker::Solver>("MpcTracker_x", verbose_xy, _max_iters_xy_, xy_Q, dt1_, _dt2_, 0);
    +     520          91 :   mpc_solver_z_ = std::make_shared<mrs_mpc_solvers::mpc_tracker::Solver>("MpcTracker_z", verbose_z, _max_iters_z_, z_Q, dt1_, _dt2_, 2);
    +     521             :   mpc_solver_heading_ =
    +     522          91 :       std::make_shared<mrs_mpc_solvers::mpc_tracker::Solver>("MpcTracker_hdg", verbose_heading, _max_iters_heading_, heading_Q, dt1_, _dt2_, 0);
    +     523             : 
    +     524          91 :   mpc_x_         = MatrixXd::Zero(MPC_N_STATES, 1);
    +     525          91 :   mpc_x_heading_ = MatrixXd::Zero(MPC_HEADING_N_STATES, 1);
    +     526             : 
    +     527          91 :   mpc_u_ = VectorXd::Zero(MPC_N_INPUTS);
    +     528             : 
    +     529          91 :   coef_time = ros::Time(0);
    +     530             : 
    +     531          91 :   des_x_trajectory_       = MatrixXd::Zero(MPC_HORIZON_LENGTH, 1);
    +     532          91 :   des_y_trajectory_       = MatrixXd::Zero(MPC_HORIZON_LENGTH, 1);
    +     533          91 :   des_z_trajectory_       = MatrixXd::Zero(MPC_HORIZON_LENGTH, 1);
    +     534          91 :   des_z_filtered_offset_  = MatrixXd::Zero(MPC_HORIZON_LENGTH, 1);
    +     535          91 :   des_heading_trajectory_ = MatrixXd::Zero(MPC_HORIZON_LENGTH, 1);
    +     536             : 
    +     537          91 :   service_server_wiggle_ = nh_.advertiseService("wiggle", &MpcTracker::callbackWiggle, this);
    +     538             : 
    +     539          91 :   pub_diagnostics_   = mrs_lib::PublisherHandler<mrs_msgs::MpcTrackerDiagnostics>(nh_, "diagnostics", 1);
    +     540          91 :   pub_status_string_ = mrs_lib::PublisherHandler<std_msgs::String>(nh_, "string", 1);
    +     541             : 
    +     542             :   // extract the numerical name
    +     543          91 :   sscanf(_uav_name_.c_str(), "uav%d", &avoidance_this_uav_number_);
    +     544          91 :   ROS_INFO("[MpcTracker]: Numerical ID of this UAV is %d", avoidance_this_uav_number_);
    +     545          91 :   avoidance_this_uav_priority_ = avoidance_this_uav_number_;
    +     546             : 
    +     547             :   // exclude this drone from the list
    +     548          91 :   std::vector<std::string>::iterator it = _avoidance_other_uav_names_.begin();
    +     549         192 :   while (it != _avoidance_other_uav_names_.end()) {
    +     550             : 
    +     551         101 :     std::string temp_str = *it;
    +     552             : 
    +     553             :     int other_uav_priority;
    +     554         101 :     sscanf(temp_str.c_str(), "uav%d", &other_uav_priority);
    +     555             : 
    +     556         101 :     if (other_uav_priority == avoidance_this_uav_number_) {
    +     557             : 
    +     558          91 :       _avoidance_other_uav_names_.erase(it);
    +     559          91 :       continue;
    +     560             :     }
    +     561             : 
    +     562          10 :     it++;
    +     563             :   }
    +     564             : 
    +     565             :   // initialize velocity tracker
    +     566             : 
    +     567          91 :   velocity_reference_time_ = ros::Time(0);
    +     568             : 
    +     569             :   // create publishers for predicted trajectory
    +     570             : 
    +     571          91 :   ph_avoidance_trajectory_           = mrs_lib::PublisherHandler<mrs_msgs::FutureTrajectory>(nh_, "predicted_trajectory", 1);
    +     572          91 :   ph_predicted_trajectory_debugging_ = mrs_lib::PublisherHandler<geometry_msgs::PoseArray>(nh_, "predicted_trajectory_debugging", 1);
    +     573          91 :   ph_mpc_reference_debugging_        = mrs_lib::PublisherHandler<geometry_msgs::PoseArray>(nh_, "mpc_reference_debugging", 1, true);
    +     574          91 :   ph_current_trajectory_point_       = mrs_lib::PublisherHandler<geometry_msgs::PoseStamped>(nh_, "current_trajectory_point", 1, true);
    +     575             : 
    +     576          91 :   pub_debug_processed_trajectory_poses_   = mrs_lib::PublisherHandler<geometry_msgs::PoseArray>(nh_, "trajectory_processed/poses", 1, true);
    +     577          91 :   pub_debug_processed_trajectory_markers_ = mrs_lib::PublisherHandler<visualization_msgs::MarkerArray>(nh_, "trajectory_processed/markers", 1, true);
    +     578             : 
    +     579             :   // preallocate predicted trajectory
    +     580          91 :   predicted_trajectory_         = MatrixXd::Zero(MPC_HORIZON_LENGTH * MPC_N_STATES, 1);
    +     581          91 :   predicted_heading_trajectory_ = MatrixXd::Zero(MPC_HORIZON_LENGTH * MPC_N_STATES, 1);
    +     582             : 
    +     583          91 :   collision_free_altitude_ = std::numeric_limits<float>::lowest();
    +     584             : 
    +     585             :   // collision avoidance toggle service
    +     586          91 :   service_server_toggle_avoidance_ = nh_.advertiseService("collision_avoidance", &MpcTracker::callbackToggleCollisionAvoidance, this);
    +     587             : 
    +     588         182 :   mrs_lib::SubscribeHandlerOptions shopts;
    +     589          91 :   shopts.nh                 = nh_;
    +     590          91 :   shopts.node_name          = "MpcTracker";
    +     591          91 :   shopts.no_message_timeout = mrs_lib::no_timeout;
    +     592          91 :   shopts.threadsafe         = true;
    +     593          91 :   shopts.autostart          = true;
    +     594          91 :   shopts.queue_size         = 10;
    +     595          91 :   shopts.transport_hints    = ros::TransportHints().tcpNoDelay();
    +     596             : 
    +     597             :   // create subscribers on other drones diagnostics
    +     598          91 :   if (collision_avoidance_enabled_ || collision_avoidance_enabled_passively_) {
    +     599             : 
    +     600         101 :     for (int i = 0; i < int(_avoidance_other_uav_names_.size()); i++) {
    +     601             : 
    +     602          30 :       std::string prediction_topic_name = std::string("/") + _avoidance_other_uav_names_[i] + "/control_manager/mpc_tracker/predicted_trajectory";
    +     603          20 :       std::string diag_topic_name       = std::string("/") + _avoidance_other_uav_names_[i] + "/control_manager/mpc_tracker/diagnostics";
    +     604             : 
    +     605          10 :       ROS_INFO("[MpcTracker]: subscribing to %s", prediction_topic_name.c_str());
    +     606             : 
    +     607          10 :       other_uav_trajectory_subscribers_.push_back(
    +     608          20 :           mrs_lib::SubscribeHandler<mrs_msgs::FutureTrajectory>(shopts, prediction_topic_name, &MpcTracker::callbackOtherMavTrajectory, this));
    +     609             : 
    +     610          10 :       ROS_INFO("[MpcTracker]: subscribing to %s", diag_topic_name.c_str());
    +     611             : 
    +     612          10 :       other_uav_diag_subscribers_.push_back(
    +     613          20 :           mrs_lib::SubscribeHandler<mrs_msgs::MpcTrackerDiagnostics>(shopts, diag_topic_name, &MpcTracker::callbackOtherMavDiagnostics, this));
    +     614             :     }
    +     615             :   }
    +     616             : 
    +     617          91 :   sh_estimation_diag_ = mrs_lib::SubscribeHandler<mrs_msgs::EstimationDiagnostics>(shopts, std::string("/") + _uav_name_ + "/estimation_manager/diagnostics");
    +     618             : 
    +     619             :   // | --------------- dynamic reconfigure server --------------- |
    +     620             : 
    +     621          91 :   reconfigure_server_.reset(new ReconfigureServer(config_mutex_, nh_));
    +     622          91 :   reconfigure_server_->updateConfig(drs_params_);
    +     623          91 :   ReconfigureServer::CallbackType f = boost::bind(&MpcTracker::dynamicReconfigureCallback, this, _1, _2);
    +     624          91 :   reconfigure_server_->setCallback(f);
    +     625             : 
    +     626             :   // | ------------------------ profiler ------------------------ |
    +     627             : 
    +     628          91 :   profiler = mrs_lib::Profiler(common_handlers->parent_nh, "MpcTracker", _profiler_enabled_);
    +     629             : 
    +     630             :   // | ------------------------- timers ------------------------- |
    +     631             : 
    +     632         182 :   timer_avoidance_trajectory_ = nh_.createTimer(ros::Rate(_avoidance_trajectory_rate_), &MpcTracker::timerAvoidanceTrajectory, this, false,
    +     633         182 :                                                 collision_avoidance_enabled_ || collision_avoidance_enabled_passively_);
    +     634          91 :   timer_diagnostics_          = nh_.createTimer(ros::Rate(_diagnostics_rate_), &MpcTracker::timerDiagnostics, this);
    +     635          91 :   timer_mpc_iteration_        = nh_.createTimer(ros::Rate(_mpc_asynchronous_rate_), &MpcTracker::timerMPC, this, false, false);
    +     636          91 :   timer_velocity_tracking_    = nh_.createTimer(ros::Rate(30.0), &MpcTracker::timerVelocityTracking, this, false, false);
    +     637          91 :   timer_hover_                = nh_.createTimer(ros::Rate(10.0), &MpcTracker::timerHover, this, false, false);
    +     638             : 
    +     639             :   // | ----------------------- finish init ---------------------- |
    +     640             : 
    +     641          91 :   is_initialized_ = true;
    +     642             : 
    +     643          91 :   ROS_INFO("[MpcTracker]: initialized");
    +     644             : 
    +     645          91 :   return true;
    +     646             : }
    +     647             : 
    +     648             : //}
    +     649             : 
    +     650             : /* //{ activate() */
    +     651             : 
    +     652          82 : std::tuple<bool, std::string> MpcTracker::activate(const std::optional<mrs_msgs::TrackerCommand>& last_tracker_cmd) {
    +     653             : 
    +     654         164 :   std::stringstream ss;
    +     655             : 
    +     656          82 :   if (!got_constraints_) {
    +     657             : 
    +     658           0 :     ss << "can not activate, missing constraints";
    +     659           0 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[MpcTracker]: " << ss.str());
    +     660             : 
    +     661           0 :     return std::tuple(false, ss.str());
    +     662             :   }
    +     663             : 
    +     664         164 :   auto uav_state = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +     665             : 
    +     666             :   double uav_state_heading;
    +     667             : 
    +     668             :   try {
    +     669          82 :     uav_state_heading = mrs_lib::AttitudeConverter(uav_state.pose.orientation).getHeading();
    +     670             :   }
    +     671           0 :   catch (...) {
    +     672           0 :     ss << "could not calculate the UAV heading";
    +     673           0 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[MpcTracker]: " << ss.str());
    +     674           0 :     return std::tuple(false, ss.str());
    +     675             :   }
    +     676             : 
    +     677         164 :   MatrixXd mpc_x         = MatrixXd::Zero(MPC_N_STATES, 1);
    +     678          82 :   MatrixXd mpc_x_heading = MatrixXd::Zero(MPC_HEADING_N_STATES, 1);
    +     679             : 
    +     680          82 :   if (last_tracker_cmd) {
    +     681             : 
    +     682             :     // set the initial condition from the last tracker's cmd
    +     683             : 
    +     684          80 :     if (last_tracker_cmd->use_position_horizontal) {
    +     685          80 :       mpc_x(0, 0) = last_tracker_cmd->position.x;
    +     686          80 :       mpc_x(4, 0) = last_tracker_cmd->position.y;
    +     687             :     } else {
    +     688           0 :       mpc_x(0, 0) = uav_state.pose.position.x;
    +     689           0 :       mpc_x(4, 0) = uav_state.pose.position.y;
    +     690             :     }
    +     691             : 
    +     692          80 :     if (last_tracker_cmd->use_position_vertical) {
    +     693          80 :       mpc_x(8, 0) = last_tracker_cmd->position.z;
    +     694             :     } else {
    +     695           0 :       mpc_x(8, 0) = uav_state.pose.position.z;
    +     696             :     }
    +     697             : 
    +     698          80 :     if (last_tracker_cmd->use_velocity_horizontal) {
    +     699          80 :       mpc_x(1, 0) = last_tracker_cmd->velocity.x;
    +     700          80 :       mpc_x(5, 0) = last_tracker_cmd->velocity.y;
    +     701             :     } else {
    +     702           0 :       mpc_x(1, 0) = uav_state.velocity.linear.x;
    +     703           0 :       mpc_x(5, 0) = uav_state.velocity.linear.y;
    +     704             :     }
    +     705             : 
    +     706          80 :     if (last_tracker_cmd->use_velocity_vertical) {
    +     707          80 :       mpc_x(9, 0) = last_tracker_cmd->velocity.z;
    +     708             :     } else {
    +     709           0 :       mpc_x(9, 0) = uav_state.velocity.linear.z;
    +     710             :     }
    +     711             : 
    +     712          80 :     if (last_tracker_cmd->use_acceleration) {
    +     713           0 :       mpc_x(2, 0)  = last_tracker_cmd->acceleration.x;
    +     714           0 :       mpc_x(6, 0)  = last_tracker_cmd->acceleration.y;
    +     715           0 :       mpc_x(10, 0) = last_tracker_cmd->acceleration.z;
    +     716             :     } else {
    +     717          80 :       mpc_x(2, 0)  = 0;
    +     718          80 :       mpc_x(6, 0)  = 0;
    +     719          80 :       mpc_x(10, 0) = 0;
    +     720             :     }
    +     721             : 
    +     722             :     // the jerks
    +     723          80 :     mpc_x(3, 0)  = 0;
    +     724          80 :     mpc_x(7, 0)  = 0;
    +     725          80 :     mpc_x(11, 0) = 0;
    +     726             : 
    +     727          80 :     if (last_tracker_cmd->use_heading) {
    +     728          80 :       mpc_x_heading(0, 0) = last_tracker_cmd->heading;
    +     729           0 :     } else if (last_tracker_cmd->use_orientation) {
    +     730             :       try {
    +     731           0 :         mpc_x_heading(0, 0) = mrs_lib::AttitudeConverter(last_tracker_cmd->orientation).getHeading();
    +     732             :       }
    +     733           0 :       catch (...) {
    +     734           0 :         mpc_x_heading(0, 0) = uav_state_heading;
    +     735             :       }
    +     736             :     } else {
    +     737           0 :       mpc_x_heading(0, 0) = uav_state_heading;
    +     738             :     }
    +     739             : 
    +     740          80 :     if (last_tracker_cmd->use_heading_rate) {
    +     741          20 :       mpc_x_heading(1, 0) = last_tracker_cmd->heading_rate;
    +     742             :     } else {
    +     743          60 :       mpc_x_heading(1, 0) = uav_state.velocity.angular.z;
    +     744             :     }
    +     745             : 
    +     746          80 :     mpc_x_heading(2, 0) = 0;
    +     747          80 :     mpc_x_heading(3, 0) = 0;
    +     748             : 
    +     749          80 :     ROS_INFO("[MpcTracker]: activated with last tracker's command");
    +     750             : 
    +     751             :   } else {
    +     752             : 
    +     753             :     // set the initial condition completely from the uav_state
    +     754             : 
    +     755           2 :     mpc_x(0, 0) = uav_state.pose.position.x;
    +     756           2 :     mpc_x(1, 0) = uav_state.velocity.linear.x;
    +     757           2 :     mpc_x(2, 0) = 0;
    +     758           2 :     mpc_x(3, 0) = 0;
    +     759             : 
    +     760           2 :     mpc_x(4, 0) = uav_state.pose.position.y;
    +     761           2 :     mpc_x(5, 0) = uav_state.velocity.linear.y;
    +     762           2 :     mpc_x(6, 0) = 0;
    +     763           2 :     mpc_x(7, 0) = 0;
    +     764             : 
    +     765           2 :     mpc_x(8, 0)  = uav_state.pose.position.z;
    +     766           2 :     mpc_x(9, 0)  = uav_state.velocity.linear.z;
    +     767           2 :     mpc_x(10, 0) = 0;
    +     768           2 :     mpc_x(11, 0) = 0;
    +     769             : 
    +     770           2 :     mpc_x_heading(0, 0) = uav_state_heading;
    +     771           2 :     mpc_x_heading(1, 0) = uav_state.velocity.angular.z;
    +     772           2 :     mpc_x_heading(2, 0) = 0;
    +     773           2 :     mpc_x_heading(3, 0) = 0;
    +     774             : 
    +     775           2 :     ROS_INFO("[MpcTracker]: activated with uav state");
    +     776             :   }
    +     777             : 
    +     778             :   {
    +     779         164 :     std::scoped_lock lock(mutex_mpc_x_);
    +     780             : 
    +     781          82 :     mpc_x_         = mpc_x;
    +     782          82 :     mpc_x_heading_ = mpc_x_heading;
    +     783             :   }
    +     784             : 
    +     785          82 :   trajectory_tracking_in_progress_ = false;
    +     786             : 
    +     787          82 :   ss << "activated";
    +     788          82 :   ROS_INFO_STREAM("[MpcTracker]: " << ss.str());
    +     789             : 
    +     790             :   // this is here to initialize the desired_trajectory vector
    +     791             :   // if deleted (and I tried) the UAV will briefly fly to the
    +     792             :   // origin after activation
    +     793          82 :   setRelativeGoal(0, 0, 0, 0, false);  // do not delete
    +     794             : 
    +     795          82 :   toggleHover(true);
    +     796             : 
    +     797          82 :   model_first_iteration_ = true;
    +     798             : 
    +     799          82 :   A_ = _mat_A_;
    +     800          82 :   B_ = _mat_B_;
    +     801             : 
    +     802          82 :   A_heading_ = _mat_A_heading_;
    +     803          82 :   B_heading_ = _mat_B_heading_;
    +     804             : 
    +     805          82 :   is_active_ = true;
    +     806             : 
    +     807          82 :   if (!mpc_synchronous_) {
    +     808          72 :     timer_mpc_iteration_.start();
    +     809             :   }
    +     810             : 
    +     811          82 :   return std::tuple(true, ss.str());
    +     812             : }
    +     813             : 
    +     814             : //}
    +     815             : 
    +     816             : /* //{ deactivate() */
    +     817             : 
    +     818          40 : void MpcTracker::deactivate(void) {
    +     819             : 
    +     820          40 :   toggleHover(false);
    +     821             : 
    +     822          40 :   is_active_                       = false;
    +     823          40 :   trajectory_tracking_in_progress_ = false;
    +     824          40 :   model_first_iteration_           = true;
    +     825             : 
    +     826             :   {
    +     827          40 :     std::scoped_lock lock(mutex_trajectory_tracking_states_);
    +     828             : 
    +     829          40 :     trajectory_current_time_ = 0;
    +     830             :   }
    +     831             : 
    +     832          40 :   ROS_INFO("[MpcTracker]: deactivated");
    +     833             : 
    +     834          40 :   timer_mpc_iteration_.stop();
    +     835             : 
    +     836          40 :   publishDiagnostics();
    +     837          40 : }
    +     838             : 
    +     839             : //}
    +     840             : 
    +     841             : /* //{ resetStatic() */
    +     842             : 
    +     843           0 : bool MpcTracker::resetStatic(void) {
    +     844             : 
    +     845           0 :   if (!is_initialized_) {
    +     846           0 :     ROS_ERROR("[MpcTracker]: can not reset, not initialized");
    +     847           0 :     return false;
    +     848             :   }
    +     849             : 
    +     850           0 :   if (!is_active_) {
    +     851           0 :     ROS_ERROR("[MpcTracker]: can not reset, not active");
    +     852           0 :     return false;
    +     853             :   }
    +     854             : 
    +     855           0 :   auto uav_state = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +     856             : 
    +     857             :   double uav_state_heading;
    +     858             : 
    +     859             :   try {
    +     860           0 :     uav_state_heading = mrs_lib::AttitudeConverter(uav_state.pose.orientation).getHeading();
    +     861             :   }
    +     862           0 :   catch (...) {
    +     863           0 :     ROS_ERROR_THROTTLE(1.0, "[MpcTracker]: could not calculate the UAV heading");
    +     864           0 :     return false;
    +     865             :   }
    +     866             : 
    +     867             :   {
    +     868           0 :     std::scoped_lock lock(mutex_mpc_x_);
    +     869             : 
    +     870             :     // set the initial condition from the odometry
    +     871             : 
    +     872           0 :     ROS_INFO("[MpcTracker]: reseting with uav state with no dynamics");
    +     873             : 
    +     874           0 :     mpc_x_(0, 0) = uav_state.pose.position.x;
    +     875           0 :     mpc_x_(1, 0) = 0;
    +     876           0 :     mpc_x_(2, 0) = 0;
    +     877           0 :     mpc_x_(3, 0) = 0;
    +     878             : 
    +     879           0 :     mpc_x_(4, 0) = uav_state.pose.position.y;
    +     880           0 :     mpc_x_(5, 0) = 0;
    +     881           0 :     mpc_x_(6, 0) = 0;
    +     882           0 :     mpc_x_(7, 0) = 0;
    +     883             : 
    +     884           0 :     mpc_x_(8, 0)  = uav_state.pose.position.z;
    +     885           0 :     mpc_x_(9, 0)  = 0;
    +     886           0 :     mpc_x_(10, 0) = 0;
    +     887           0 :     mpc_x_(11, 0) = 0;
    +     888             : 
    +     889           0 :     mpc_x_heading_(0, 0) = uav_state_heading;
    +     890           0 :     mpc_x_heading_(1, 0) = 0;
    +     891           0 :     mpc_x_heading_(2, 0) = 0;
    +     892           0 :     mpc_x_heading_(3, 0) = 0;
    +     893             : 
    +     894           0 :     trajectory_tracking_in_progress_ = false;
    +     895             : 
    +     896           0 :     ROS_INFO("[MpcTracker]: reseted");
    +     897             :   }
    +     898             : 
    +     899             :   // this is here to initialize the desired_trajectory vector
    +     900             :   // if deleted (and I tried) the UAV will briefly fly to the
    +     901             :   // origin after activation
    +     902           0 :   setRelativeGoal(0, 0, 0, 0, false);  // do not delete
    +     903             : 
    +     904           0 :   return true;
    +     905             : }
    +     906             : 
    +     907             : //}
    +     908             : 
    +     909             : /* //{ update() */
    +     910             : 
    +     911      120314 : std::optional<mrs_msgs::TrackerCommand> MpcTracker::update(const mrs_msgs::UavState&                                           uav_state,
    +     912             :                                                            [[maybe_unused]] const mrs_uav_managers::Controller::ControlOutput& last_control_output) {
    +     913             : 
    +     914      360942 :   mrs_lib::Routine    profiler_routine = profiler.createRoutine("update");
    +     915      360942 :   mrs_lib::ScopeTimer timer            = mrs_lib::ScopeTimer("MpcTracker::update", common_handlers_->scope_timer.logger, common_handlers_->scope_timer.enabled);
    +     916             : 
    +     917      240628 :   auto old_uav_state = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +     918             : 
    +     919             :   // the time from the last update call
    +     920      120314 :   double dt = (uav_state.header.stamp - old_uav_state.header.stamp).toSec();
    +     921             : 
    +     922             :   // save the uav state
    +     923      120314 :   mrs_lib::set_mutexed(mutex_uav_state_, uav_state, uav_state_);
    +     924             : 
    +     925      120314 :   if (dt > 0) {
    +     926             : 
    +     927      120314 :     double rate = 1.0 / dt;
    +     928             : 
    +     929      120314 :     update_rate_ = 0.9 * update_rate_ + 0.1 * rate;
    +     930             : 
    +     931      120314 :     if (mpc_synchronous_ && (update_rate_ > _mpc_synchronous_rate_limit_)) {
    +     932           0 :       mpc_synchronous_ = false;
    +     933           0 :       ROS_INFO("[MpcTracker]: detecting high update date (%.1f Hz > %.1f Hz), switching to asynchronous mode.", rate, _mpc_synchronous_rate_limit_);
    +     934           0 :       if (is_active_) {
    +     935           0 :         timer_mpc_iteration_.start();
    +     936             :       }
    +     937      120314 :     } else if (!mpc_synchronous_ && (update_rate_ <= _mpc_synchronous_rate_limit_)) {
    +     938          14 :       mpc_synchronous_ = true;
    +     939          14 :       ROS_INFO("[MpcTracker]: detecting low update rate (%.1f Hz < %.1f Hz), switching to synchronous mode.", rate, _mpc_synchronous_rate_limit_);
    +     940          14 :       timer_mpc_iteration_.stop();
    +     941             :     }
    +     942             :   }
    +     943             : 
    +     944             :   // up to this part the update() method is evaluated even when the tracker is not active
    +     945      120314 :   if (!is_active_) {
    +     946       55684 :     return {};
    +     947             :   }
    +     948             : 
    +     949      129260 :   mrs_msgs::TrackerCommand tracker_cmd;
    +     950             : 
    +     951       64630 :   if (!mpc_synchronous_ && (!mpc_computed_ || mpc_result_invalid_)) {
    +     952             : 
    +     953          66 :     ROS_WARN_THROTTLE(0.1, "[MpcTracker]: MPC not ready, returning current odom as the command");
    +     954             : 
    +     955             :     // set the header
    +     956          66 :     tracker_cmd.header.stamp    = uav_state.header.stamp;
    +     957          66 :     tracker_cmd.header.frame_id = uav_state.header.frame_id;
    +     958             : 
    +     959             :     // set positions from odom
    +     960          66 :     tracker_cmd.position.x              = uav_state.pose.position.x;
    +     961          66 :     tracker_cmd.position.y              = uav_state.pose.position.y;
    +     962          66 :     tracker_cmd.position.z              = uav_state.pose.position.z;
    +     963          66 :     tracker_cmd.use_position_vertical   = 1;
    +     964          66 :     tracker_cmd.use_position_horizontal = 1;
    +     965             : 
    +     966             :     // set velocities from odom
    +     967          66 :     tracker_cmd.velocity.x              = uav_state.velocity.linear.x;
    +     968          66 :     tracker_cmd.velocity.y              = uav_state.velocity.linear.y;
    +     969          66 :     tracker_cmd.velocity.z              = uav_state.velocity.linear.z;
    +     970          66 :     tracker_cmd.use_velocity_vertical   = 1;
    +     971          66 :     tracker_cmd.use_velocity_horizontal = 1;
    +     972             : 
    +     973             :     // set zero accelerations
    +     974          66 :     tracker_cmd.acceleration.x   = 0;
    +     975          66 :     tracker_cmd.acceleration.y   = 0;
    +     976          66 :     tracker_cmd.acceleration.z   = 0;
    +     977          66 :     tracker_cmd.use_acceleration = 1;
    +     978             : 
    +     979             :     try {
    +     980          66 :       tracker_cmd.heading     = mrs_lib::AttitudeConverter(uav_state.pose.orientation).getHeading();
    +     981          66 :       tracker_cmd.use_heading = 1;
    +     982             :     }
    +     983           0 :     catch (...) {
    +     984           0 :       tracker_cmd.use_heading = 0;
    +     985           0 :       ROS_WARN_THROTTLE(1.0, "[MpcTracker]: could not calculate the current UAV heading");
    +     986             :     }
    +     987             : 
    +     988             :     // set zero jerk
    +     989          66 :     tracker_cmd.jerk.x = 0;
    +     990          66 :     tracker_cmd.jerk.y = 0;
    +     991          66 :     tracker_cmd.jerk.z = 0;
    +     992             : 
    +     993             :     try {
    +     994          66 :       tracker_cmd.heading_rate     = mrs_lib::AttitudeConverter(uav_state.pose.orientation).getHeadingRate(uav_state.velocity.angular);
    +     995          66 :       tracker_cmd.use_heading_rate = 1;
    +     996             :     }
    +     997           0 :     catch (...) {
    +     998           0 :       tracker_cmd.use_heading_rate = 0;
    +     999           0 :       ROS_WARN_THROTTLE(1.0, "[MpcTracker]: could not calculate the current UAV heading rate");
    +    1000             :     }
    +    1001             : 
    +    1002          66 :     return {tracker_cmd};
    +    1003             :   }
    +    1004             : 
    +    1005       64564 :   if (mpc_synchronous_) {
    +    1006             : 
    +    1007        3555 :     ROS_DEBUG_THROTTLE(1.0, "[MpcTracker]: running in SYNCHRONOUS mode");
    +    1008             : 
    +    1009        3555 :     if (synchronous_timer_event_.last_real.toSec() > 0) {
    +    1010        3541 :       synchronous_timer_event_.last_real = synchronous_timer_event_.current_real;
    +    1011             :     } else {
    +    1012          14 :       synchronous_timer_event_.last_real = ros::Time::now();
    +    1013             :     }
    +    1014             : 
    +    1015        3555 :     synchronous_timer_event_.current_real = ros::Time::now();
    +    1016             : 
    +    1017        3555 :     timerMPC(synchronous_timer_event_);
    +    1018             : 
    +    1019             :   } else {
    +    1020       61009 :     ROS_DEBUG_THROTTLE(1.0, "[MpcTracker]: running in ASYNCHRONOUS mode");
    +    1021             :   }
    +    1022             : 
    +    1023       64564 :   if (dt > 0) {
    +    1024       64564 :     iterateModel(dt);
    +    1025             :   } else {
    +    1026           0 :     ROS_WARN_THROTTLE(1.0, "[MpcTracker]: dt !> 0, not iterating the model");
    +    1027             :   }
    +    1028             : 
    +    1029      129128 :   auto [mpc_x, mpc_x_heading] = mrs_lib::get_mutexed(mutex_mpc_x_, mpc_x_, mpc_x_heading_);
    +    1030      129128 :   auto prediction_full_state  = mrs_lib::get_mutexed(mutex_prediction_full_state_, prediction_full_state_);
    +    1031             : 
    +    1032             :   // check whether all outputs are finite
    +    1033       64564 :   bool arefinite = true;
    +    1034      839332 :   for (int i = 0; i < 12; i++) {
    +    1035      774768 :     if (!std::isfinite(mpc_x(i, 0))) {
    +    1036           0 :       arefinite = false;
    +    1037             :     }
    +    1038             :   }
    +    1039             : 
    +    1040       64564 :   if (arefinite) {
    +    1041             : 
    +    1042             :     // set the desired states base on the result of the mpc
    +    1043       64564 :     tracker_cmd.position.x     = mpc_x(0, 0);
    +    1044       64564 :     tracker_cmd.velocity.x     = mpc_x(1, 0);
    +    1045       64564 :     tracker_cmd.acceleration.x = mpc_x(2, 0);
    +    1046       64564 :     tracker_cmd.jerk.x         = mpc_x(3, 0);
    +    1047             : 
    +    1048       64564 :     tracker_cmd.position.y     = mpc_x(4, 0);
    +    1049       64564 :     tracker_cmd.velocity.y     = mpc_x(5, 0);
    +    1050       64564 :     tracker_cmd.acceleration.y = mpc_x(6, 0);
    +    1051       64564 :     tracker_cmd.jerk.y         = mpc_x(7, 0);
    +    1052             : 
    +    1053       64564 :     tracker_cmd.position.z     = mpc_x(8, 0);
    +    1054       64564 :     tracker_cmd.velocity.z     = mpc_x(9, 0);
    +    1055       64564 :     tracker_cmd.acceleration.z = mpc_x(10, 0);
    +    1056       64564 :     tracker_cmd.jerk.z         = mpc_x(11, 0);
    +    1057             : 
    +    1058       64564 :     tracker_cmd.full_state_prediction = prediction_full_state;
    +    1059             : 
    +    1060       64564 :     tracker_cmd.use_position_vertical     = 1;
    +    1061       64564 :     tracker_cmd.use_position_horizontal   = 1;
    +    1062       64564 :     tracker_cmd.use_velocity_vertical     = 1;
    +    1063       64564 :     tracker_cmd.use_velocity_horizontal   = 1;
    +    1064       64564 :     tracker_cmd.use_acceleration          = 1;
    +    1065       64564 :     tracker_cmd.use_jerk                  = 1;
    +    1066       64564 :     tracker_cmd.use_full_state_prediction = 1;
    +    1067             : 
    +    1068             :   } else {
    +    1069             : 
    +    1070           0 :     ROS_ERROR_THROTTLE(1.0, "[MpcTracker]: MPC translation outputs are not finite!");
    +    1071             : 
    +    1072           0 :     return {};
    +    1073             :   }
    +    1074             : 
    +    1075       64564 :   bool heading_finite = true;
    +    1076      322820 :   for (int i = 0; i < MPC_HEADING_N_STATES; i++) {
    +    1077      258256 :     if (!std::isfinite(mpc_x_heading(i, 0))) {
    +    1078           0 :       heading_finite = false;
    +    1079             :     }
    +    1080             :   }
    +    1081             : 
    +    1082       64564 :   if (heading_finite) {
    +    1083             : 
    +    1084       64564 :     tracker_cmd.heading              = mpc_x_heading(0, 0);
    +    1085       64564 :     tracker_cmd.heading_rate         = mpc_x_heading(1, 0);
    +    1086       64564 :     tracker_cmd.heading_acceleration = mpc_x_heading(2, 0);
    +    1087       64564 :     tracker_cmd.heading_jerk         = mpc_x_heading(3, 0);
    +    1088             : 
    +    1089       64564 :     tracker_cmd.use_heading              = 1;
    +    1090       64564 :     tracker_cmd.use_heading_rate         = 1;
    +    1091       64564 :     tracker_cmd.use_heading_acceleration = 1;
    +    1092       64564 :     tracker_cmd.use_heading_jerk         = 1;
    +    1093             : 
    +    1094             :   } else {
    +    1095             : 
    +    1096           0 :     ROS_ERROR_THROTTLE(1.0, "[MpcTracker]: MPC heading output is not finite!");
    +    1097             : 
    +    1098           0 :     return {};
    +    1099             :   }
    +    1100             : 
    +    1101             :   // set the header
    +    1102       64564 :   tracker_cmd.header.stamp    = uav_state.header.stamp;
    +    1103       64564 :   tracker_cmd.header.frame_id = uav_state.header.frame_id;
    +    1104             : 
    +    1105             :   // u have to return a position command
    +    1106             :   // can set the jerk to 0
    +    1107       64564 :   return {tracker_cmd};
    +    1108             : }  // namespace mpc_tracker
    +    1109             : 
    +    1110             : //}
    +    1111             : 
    +    1112             : /* //{ getStatus() */
    +    1113             : 
    +    1114        7505 : const mrs_msgs::TrackerStatus MpcTracker::getStatus() {
    +    1115             : 
    +    1116       15010 :   auto [mpc_x, mpc_x_heading] = mrs_lib::get_mutexed(mutex_mpc_x_, mpc_x_, mpc_x_heading_);
    +    1117        7505 :   auto trajectory_size        = mrs_lib::get_mutexed(mutex_des_trajectory_, trajectory_size_);
    +    1118             : 
    +    1119             :   double des_x, des_y, des_z, des_heading;
    +    1120             :   {
    +    1121        7505 :     std::scoped_lock lock(mutex_des_trajectory_);
    +    1122             : 
    +    1123        7505 :     des_x       = des_x_trajectory_(0);
    +    1124        7505 :     des_y       = des_y_trajectory_(0);
    +    1125        7505 :     des_z       = des_z_trajectory_(0);
    +    1126        7505 :     des_heading = des_heading_trajectory_(0);
    +    1127             :   }
    +    1128             : 
    +    1129        7505 :   mrs_msgs::TrackerStatus tracker_status;
    +    1130             : 
    +    1131        7505 :   tracker_status.active            = is_active_;
    +    1132        7505 :   tracker_status.callbacks_enabled = is_active_ && callbacks_enabled_ && !hovering_in_progress_;
    +    1133             : 
    +    1134        7505 :   tracker_status.tracking_trajectory = trajectory_tracking_in_progress_;
    +    1135             : 
    +    1136        7505 :   bool have_position_error   = sqrt(pow(mpc_x(0, 0) - des_x, 2) + pow(mpc_x(4, 0) - des_y, 2) + pow(mpc_x(8, 0) - des_z, 2)) > _diag_pos_tracking_thr_;
    +    1137        7505 :   bool have_heading_error    = fabs(radians::diff(mpc_x_heading(0), des_heading)) > _diag_heading_tracking_thr_;
    +    1138        7505 :   bool have_nonzero_velocity = fabs(mpc_x(1, 0)) > 0.1 || fabs(mpc_x(5, 0)) > 0.1 || fabs(mpc_x(9, 0)) > 0.1 || fabs(mpc_x_heading(1, 0)) > 0.1;
    +    1139             : 
    +    1140        7505 :   tracker_status.have_goal = trajectory_tracking_in_progress_ || hovering_in_progress_ || have_position_error || have_heading_error || have_nonzero_velocity;
    +    1141             : 
    +    1142        7505 :   int trajectory_tracking_idx = getCurrentTrajectoryIdx();
    +    1143             : 
    +    1144        7505 :   tracker_status.trajectory_length = trajectory_size;
    +    1145        7505 :   tracker_status.trajectory_idx    = trajectory_tracking_idx;
    +    1146             : 
    +    1147        7505 :   if (trajectory_tracking_in_progress_) {
    +    1148             : 
    +    1149        2656 :     auto uav_state = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +    1150             : 
    +    1151        2656 :     std::scoped_lock lock(mutex_des_whole_trajectory_);
    +    1152             : 
    +    1153        1328 :     tracker_status.trajectory_reference.header.stamp    = ros::Time::now();
    +    1154        1328 :     tracker_status.trajectory_reference.header.frame_id = uav_state.header.frame_id;
    +    1155             : 
    +    1156        1328 :     tracker_status.trajectory_reference.reference.position.x = (*des_x_whole_trajectory_)(trajectory_tracking_idx);
    +    1157        1328 :     tracker_status.trajectory_reference.reference.position.y = (*des_y_whole_trajectory_)(trajectory_tracking_idx);
    +    1158        1328 :     tracker_status.trajectory_reference.reference.position.z = (*des_z_whole_trajectory_)(trajectory_tracking_idx);
    +    1159        1328 :     tracker_status.trajectory_reference.reference.heading    = (*des_heading_whole_trajectory_)(trajectory_tracking_idx);
    +    1160             : 
    +    1161             :     // | ---------- publish the current trajectory point ---------- |
    +    1162             : 
    +    1163        2656 :     geometry_msgs::PoseStamped debug_trajectory_point;
    +    1164        1328 :     debug_trajectory_point.header.stamp    = ros::Time::now();
    +    1165        1328 :     debug_trajectory_point.header.frame_id = uav_state_.header.frame_id;
    +    1166             : 
    +    1167        1328 :     debug_trajectory_point.pose.position.x = (*des_x_whole_trajectory_)(trajectory_tracking_idx);
    +    1168        1328 :     debug_trajectory_point.pose.position.y = (*des_y_whole_trajectory_)(trajectory_tracking_idx);
    +    1169        1328 :     debug_trajectory_point.pose.position.z = (*des_z_whole_trajectory_)(trajectory_tracking_idx);
    +    1170             : 
    +    1171        1328 :     debug_trajectory_point.pose.orientation = mrs_lib::AttitudeConverter(0, 0, (*des_heading_whole_trajectory_)(trajectory_tracking_idx));
    +    1172             : 
    +    1173        1328 :     ph_current_trajectory_point_.publish(debug_trajectory_point);
    +    1174             :   }
    +    1175             : 
    +    1176       15010 :   return tracker_status;
    +    1177             : }
    +    1178             : 
    +    1179             : //}
    +    1180             : 
    +    1181             : /* //{ enableCallbacks() */
    +    1182             : 
    +    1183        1677 : const std_srvs::SetBoolResponse::ConstPtr MpcTracker::enableCallbacks(const std_srvs::SetBoolRequest::ConstPtr& cmd) {
    +    1184             : 
    +    1185        3354 :   std::stringstream ss;
    +    1186             : 
    +    1187        1677 :   if (cmd->data != callbacks_enabled_) {
    +    1188             : 
    +    1189        1383 :     callbacks_enabled_ = cmd->data;
    +    1190        1383 :     ss << "callbacks %s" << (callbacks_enabled_ ? "enabled" : "disabled");
    +    1191             : 
    +    1192             :   } else {
    +    1193             : 
    +    1194         294 :     ss << "callbacks were already %s" << (callbacks_enabled_ ? "enabled" : "disabled");
    +    1195             :   }
    +    1196             : 
    +    1197        3354 :   std_srvs::SetBoolResponse res;
    +    1198        1677 :   res.message = ss.str();
    +    1199        1677 :   res.success = true;
    +    1200             : 
    +    1201        3354 :   return std_srvs::SetBoolResponse::ConstPtr(new std_srvs::SetBoolResponse(res));
    +    1202             : }
    +    1203             : 
    +    1204             : //}
    +    1205             : 
    +    1206             : /* switchOdometrySource() //{ */
    +    1207             : 
    +    1208           5 : const std_srvs::TriggerResponse::ConstPtr MpcTracker::switchOdometrySource(const mrs_msgs::UavState& new_uav_state) {
    +    1209             : 
    +    1210           5 :   odometry_reset_in_progress_ = true;
    +    1211           5 :   mpc_result_invalid_         = true;
    +    1212             : 
    +    1213          10 :   auto x         = mrs_lib::get_mutexed(mutex_mpc_x_, mpc_x_);
    +    1214          10 :   auto uav_state = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +    1215             : 
    +    1216           5 :   ROS_INFO(
    +    1217             :       "[MpcTracker]: start of odmetry reset, curent state [x: %.2f, y: %.2f, z: %.2f] [x_d: %.2f, y_d: %.2f, z_d: %.2f] [x_dd: %.2f, y_dd: %.2f, z_dd: "
    +    1218             :       "%.2f], "
    +    1219             :       "new odom [x: %.2f, y: %.2f, z: %.2f] [x_d: %.2f, y_d: %.2f, z_d: %.2f] [x_dd: %.2f, y_dd: %.2f, z_dd: %.2f]",
    +    1220             :       x(0, 0), x(4, 0), x(8, 0), x(1, 0), x(5, 0), x(9, 0), x(2, 0), x(6, 0), x(10, 0), new_uav_state.pose.position.x, new_uav_state.pose.position.y,
    +    1221             :       new_uav_state.pose.position.z, new_uav_state.velocity.linear.x, new_uav_state.velocity.linear.y, new_uav_state.velocity.linear.z,
    +    1222             :       new_uav_state.acceleration.linear.x, new_uav_state.acceleration.linear.y, new_uav_state.acceleration.linear.z);
    +    1223             : 
    +    1224           5 :   timer_mpc_iteration_.stop();
    +    1225           5 :   ROS_INFO("[MpcTracker]: mpc timer stopped");
    +    1226             : 
    +    1227           5 :   while (mpc_timer_running_) {
    +    1228             : 
    +    1229           1 :     ROS_DEBUG("[MpcTracker]: the mpc is in the middle of an iteration, waiting for it to finish");
    +    1230           1 :     ros::Duration wait(0.001);
    +    1231           1 :     wait.sleep();
    +    1232             : 
    +    1233           1 :     if (!mpc_timer_running_) {
    +    1234           1 :       ROS_DEBUG("[MpcTracker]: mpc timer finished");
    +    1235           1 :       break;
    +    1236             :     }
    +    1237             :   }
    +    1238             : 
    +    1239             :   // | --------- recalculate the goal to new coordinates -------- |
    +    1240             : 
    +    1241           5 :   double old_heading  = 0;
    +    1242           5 :   double new_heading  = 0;
    +    1243           5 :   bool   got_headings = true;
    +    1244             : 
    +    1245             :   try {
    +    1246           5 :     old_heading = mrs_lib::AttitudeConverter(uav_state.pose.orientation).getHeading();
    +    1247             :   }
    +    1248           0 :   catch (...) {
    +    1249           0 :     ROS_ERROR_THROTTLE(1.0, "[LineTracker]: could not calculate the old UAV heading");
    +    1250           0 :     got_headings = false;
    +    1251             :   }
    +    1252             : 
    +    1253             :   try {
    +    1254           5 :     new_heading = mrs_lib::AttitudeConverter(new_uav_state.pose.orientation).getHeading();
    +    1255             :   }
    +    1256           0 :   catch (...) {
    +    1257           0 :     ROS_ERROR_THROTTLE(1.0, "[LineTracker]: could not calculate the new UAV heading");
    +    1258           0 :     got_headings = false;
    +    1259             :   }
    +    1260             : 
    +    1261          10 :   std_srvs::TriggerResponse res;
    +    1262             : 
    +    1263           5 :   if (!got_headings) {
    +    1264           0 :     res.message = "could not calculate the heading difference";
    +    1265           0 :     res.success = false;
    +    1266             : 
    +    1267           0 :     return std_srvs::TriggerResponse::ConstPtr(new std_srvs::TriggerResponse(res));
    +    1268             :   }
    +    1269             : 
    +    1270             :   // calculate the difference of position
    +    1271           5 :   double dx       = new_uav_state.pose.position.x - uav_state_.pose.position.x;
    +    1272           5 :   double dy       = new_uav_state.pose.position.y - uav_state_.pose.position.y;
    +    1273           5 :   double dz       = new_uav_state.pose.position.z - uav_state_.pose.position.z;
    +    1274           5 :   double dheading = new_heading - old_heading;
    +    1275             : 
    +    1276           5 :   ROS_INFO("[MpcTracker]: dx %f dy %f dz %f dheading %f", dx, dy, dz, dheading);
    +    1277             : 
    +    1278             :   {
    +    1279           5 :     std::scoped_lock lock(mutex_mpc_x_, mutex_des_trajectory_, mutex_des_whole_trajectory_, mutex_uav_state_);
    +    1280             : 
    +    1281           5 :     if (trajectory_set_) {
    +    1282             : 
    +    1283           0 :       for (int i = 0; i < trajectory_size_ + MPC_HORIZON_LENGTH; i++) {
    +    1284             : 
    +    1285           0 :         Eigen::Vector2d temp_vec((*des_x_whole_trajectory_)(i)-uav_state_.pose.position.x, (*des_y_whole_trajectory_)(i)-uav_state_.pose.position.y);
    +    1286           0 :         temp_vec = Eigen::Rotation2D<double>(dheading).toRotationMatrix() * temp_vec;
    +    1287             : 
    +    1288           0 :         (*des_x_whole_trajectory_)(i) = new_uav_state.pose.position.x + temp_vec[0];
    +    1289           0 :         (*des_y_whole_trajectory_)(i) = new_uav_state.pose.position.y + temp_vec[1];
    +    1290           0 :         (*des_z_whole_trajectory_)(i) += dz;
    +    1291           0 :         (*des_heading_whole_trajectory_)(i) += dheading;
    +    1292             :       }
    +    1293             :     }
    +    1294             : 
    +    1295         205 :     for (int i = 0; i < MPC_HORIZON_LENGTH; i++) {
    +    1296             : 
    +    1297         200 :       Eigen::Vector2d temp_vec(des_x_trajectory_(i) - uav_state_.pose.position.x, des_y_trajectory_(i) - uav_state_.pose.position.y);
    +    1298         200 :       temp_vec = Eigen::Rotation2D<double>(dheading).toRotationMatrix() * temp_vec;
    +    1299             : 
    +    1300         200 :       des_x_trajectory_(i, 0) = new_uav_state.pose.position.x + temp_vec[0];
    +    1301         200 :       des_y_trajectory_(i, 0) = new_uav_state.pose.position.y + temp_vec[1];
    +    1302         200 :       des_z_trajectory_(i, 0) += dz;
    +    1303         200 :       des_heading_trajectory_(i, 0) += dheading;
    +    1304             :     }
    +    1305             : 
    +    1306             :     // update the position
    +    1307             :     {
    +    1308           5 :       Eigen::Vector2d temp_vec(mpc_x_(0, 0) - uav_state_.pose.position.x, mpc_x_(4, 0) - uav_state_.pose.position.y);
    +    1309           5 :       temp_vec     = Eigen::Rotation2D<double>(dheading).toRotationMatrix() * temp_vec;
    +    1310           5 :       mpc_x_(0, 0) = new_uav_state.pose.position.x + temp_vec[0];
    +    1311           5 :       mpc_x_(4, 0) = new_uav_state.pose.position.y + temp_vec[1];
    +    1312           5 :       mpc_x_(8, 0) += dz;
    +    1313             :     }
    +    1314             : 
    +    1315             :     // update the velocity
    +    1316             :     {
    +    1317           5 :       mpc_x_(1, 0) = new_uav_state.velocity.linear.x;
    +    1318           5 :       mpc_x_(5, 0) = new_uav_state.velocity.linear.y;
    +    1319             :       // we leave the z velocity as it was in the original frame
    +    1320             :     }
    +    1321             : 
    +    1322             :     // update the acceleration
    +    1323             :     {
    +    1324           5 :       mpc_x_(2, 0)  = 0;
    +    1325           5 :       mpc_x_(6, 0)  = 0;
    +    1326           5 :       mpc_x_(10, 0) = 0;
    +    1327             :     }
    +    1328             : 
    +    1329             :     // update the heading and its derivative
    +    1330           5 :     mpc_x_heading_(0, 0) += dheading;
    +    1331           5 :     mpc_x_heading_(1, 0) = new_uav_state.velocity.angular.x;
    +    1332             :   }
    +    1333             : 
    +    1334           5 :   ROS_INFO(
    +    1335             :       "[MpcTracker]: start of odmetry reset, curent state [x: %.2f, y: %.2f, z: %.2f] [x_d: %.2f, y_d: %.2f, z_d: %.2f] [x_dd: %.2f, y_dd: %.2f, z_dd: "
    +    1336             :       "%.2f]",
    +    1337             :       x(0, 0), x(4, 0), x(8, 0), x(1, 0), x(5, 0), x(9, 0), x(2, 0), x(6, 0), x(10, 0));
    +    1338             : 
    +    1339           5 :   ROS_INFO("[MpcTracker]: starting the MPC timer");
    +    1340             : 
    +    1341           5 :   if (!mpc_synchronous_) {
    +    1342           5 :     timer_mpc_iteration_.start();
    +    1343             :   }
    +    1344             : 
    +    1345           5 :   odometry_reset_in_progress_ = false;
    +    1346             : 
    +    1347           5 :   return std_srvs::TriggerResponse::ConstPtr(new std_srvs::TriggerResponse(res));
    +    1348             : }
    +    1349             : 
    +    1350             : //}
    +    1351             : 
    +    1352             : /* //{ hover() */
    +    1353             : 
    +    1354           0 : const std_srvs::TriggerResponse::ConstPtr MpcTracker::hover([[maybe_unused]] const std_srvs::TriggerRequest::ConstPtr& cmd) {
    +    1355             : 
    +    1356           0 :   toggleHover(true);
    +    1357             : 
    +    1358           0 :   std::stringstream ss;
    +    1359           0 :   ss << "initiating hover";
    +    1360             : 
    +    1361           0 :   std_srvs::TriggerResponse res;
    +    1362           0 :   res.success = true;
    +    1363           0 :   res.message = ss.str();
    +    1364             : 
    +    1365           0 :   return std_srvs::TriggerResponse::ConstPtr(new std_srvs::TriggerResponse(res));
    +    1366             : }
    +    1367             : 
    +    1368             : //}
    +    1369             : 
    +    1370             : /* //{ startTrajectoryTracking() */
    +    1371             : 
    +    1372           1 : const std_srvs::TriggerResponse::ConstPtr MpcTracker::startTrajectoryTracking([[maybe_unused]] const std_srvs::TriggerRequest::ConstPtr& cmd) {
    +    1373           2 :   std::stringstream ss;
    +    1374             : 
    +    1375           2 :   auto [success, message] = startTrajectoryTrackingImpl();
    +    1376             : 
    +    1377           2 :   std_srvs::TriggerResponse res;
    +    1378           1 :   res.success = success;
    +    1379           1 :   res.message = message;
    +    1380             : 
    +    1381           2 :   return std_srvs::TriggerResponse::ConstPtr(new std_srvs::TriggerResponse(res));
    +    1382             : }
    +    1383             : 
    +    1384             : //}
    +    1385             : 
    +    1386             : /* //{ stopTrajectoryTracking() */
    +    1387             : 
    +    1388           0 : const std_srvs::TriggerResponse::ConstPtr MpcTracker::stopTrajectoryTracking([[maybe_unused]] const std_srvs::TriggerRequest::ConstPtr& cmd) {
    +    1389             : 
    +    1390           0 :   auto [success, message] = stopTrajectoryTrackingImpl();
    +    1391             : 
    +    1392           0 :   std_srvs::TriggerResponse res;
    +    1393           0 :   res.success = success;
    +    1394           0 :   res.message = message;
    +    1395             : 
    +    1396           0 :   return std_srvs::TriggerResponse::ConstPtr(new std_srvs::TriggerResponse(res));
    +    1397             : }
    +    1398             : 
    +    1399             : //}
    +    1400             : 
    +    1401             : /* //{ resumeTrajectoryTracking() */
    +    1402             : 
    +    1403           0 : const std_srvs::TriggerResponse::ConstPtr MpcTracker::resumeTrajectoryTracking([[maybe_unused]] const std_srvs::TriggerRequest::ConstPtr& cmd) {
    +    1404             : 
    +    1405           0 :   auto [success, message] = resumeTrajectoryTrackingImpl();
    +    1406             : 
    +    1407           0 :   std_srvs::TriggerResponse res;
    +    1408           0 :   res.success = success;
    +    1409           0 :   res.message = message;
    +    1410             : 
    +    1411           0 :   return std_srvs::TriggerResponse::ConstPtr(new std_srvs::TriggerResponse(res));
    +    1412             : }
    +    1413             : 
    +    1414             : //}
    +    1415             : 
    +    1416             : /* //{ gotoTrajectoryStart() */
    +    1417             : 
    +    1418           1 : const std_srvs::TriggerResponse::ConstPtr MpcTracker::gotoTrajectoryStart([[maybe_unused]] const std_srvs::TriggerRequest::ConstPtr& cmd) {
    +    1419             : 
    +    1420           2 :   auto [success, message] = gotoTrajectoryStartImpl();
    +    1421             : 
    +    1422           2 :   std_srvs::TriggerResponse res;
    +    1423           1 :   res.success = success;
    +    1424           1 :   res.message = message;
    +    1425             : 
    +    1426           2 :   return std_srvs::TriggerResponse::ConstPtr(new std_srvs::TriggerResponse(res));
    +    1427             : }
    +    1428             : 
    +    1429             : //}
    +    1430             : 
    +    1431             : /* //{ setConstraints() */
    +    1432             : 
    +    1433         298 : const mrs_msgs::DynamicsConstraintsSrvResponse::ConstPtr MpcTracker::setConstraints(const mrs_msgs::DynamicsConstraintsSrvRequest::ConstPtr& constraints) {
    +    1434             : 
    +    1435         298 :   if (!is_initialized_) {
    +    1436           0 :     return mrs_msgs::DynamicsConstraintsSrvResponse::ConstPtr(new mrs_msgs::DynamicsConstraintsSrvResponse());
    +    1437             :   }
    +    1438             : 
    +    1439         298 :   mrs_lib::set_mutexed(mutex_constraints_, constraints->constraints, constraints_);
    +    1440             : 
    +    1441             :   // directly updated the speeds in the constraints
    +    1442             :   // the reset needs to wait for manageConstraints()
    +    1443             :   {
    +    1444         596 :     std::scoped_lock lock(mutex_constraints_filtered_);
    +    1445             : 
    +    1446             :     // important! this needs to be done to initialize the full struct
    +    1447         298 :     if (!got_constraints_) {
    +    1448             : 
    +    1449          91 :       constraints_filtered_ = constraints->constraints;
    +    1450             : 
    +    1451             :     } else {
    +    1452             : 
    +    1453         207 :       constraints_filtered_.horizontal_speed          = constraints->constraints.horizontal_speed;
    +    1454         207 :       constraints_filtered_.vertical_ascending_speed  = constraints->constraints.vertical_ascending_speed;
    +    1455         207 :       constraints_filtered_.vertical_descending_speed = constraints->constraints.vertical_descending_speed;
    +    1456         207 :       constraints_filtered_.heading_speed             = constraints->constraints.heading_speed;
    +    1457             :     }
    +    1458             :   }
    +    1459             : 
    +    1460         298 :   got_constraints_ = true;
    +    1461             : 
    +    1462         298 :   all_constraints_set_ = false;
    +    1463             : 
    +    1464         298 :   ROS_INFO("[MpcTracker]: updating constraints");
    +    1465             : 
    +    1466         596 :   mrs_msgs::DynamicsConstraintsSrvResponse res;
    +    1467         298 :   res.success = true;
    +    1468         298 :   res.message = "constraints updated";
    +    1469             : 
    +    1470         298 :   return mrs_msgs::DynamicsConstraintsSrvResponse::ConstPtr(new mrs_msgs::DynamicsConstraintsSrvResponse(res));
    +    1471             : }
    +    1472             : 
    +    1473             : //}
    +    1474             : 
    +    1475             : /* //{ setReference() */
    +    1476             : 
    +    1477         262 : const mrs_msgs::ReferenceSrvResponse::ConstPtr MpcTracker::setReference(const mrs_msgs::ReferenceSrvRequest::ConstPtr& cmd) {
    +    1478             : 
    +    1479         262 :   toggleHover(false);
    +    1480             : 
    +    1481         262 :   setGoal(cmd->reference.position.x, cmd->reference.position.y, cmd->reference.position.z, cmd->reference.heading, true);
    +    1482             : 
    +    1483         524 :   mrs_msgs::ReferenceSrvResponse res;
    +    1484         262 :   res.success = true;
    +    1485         262 :   res.message = "reference set";
    +    1486             : 
    +    1487         524 :   return mrs_msgs::ReferenceSrvResponse::ConstPtr(new mrs_msgs::ReferenceSrvResponse(res));
    +    1488             : }
    +    1489             : 
    +    1490             : //}
    +    1491             : 
    +    1492             : /* //{ setVelocityReference() */
    +    1493             : 
    +    1494         468 : const mrs_msgs::VelocityReferenceSrvResponse::ConstPtr MpcTracker::setVelocityReference(const mrs_msgs::VelocityReferenceSrvRequest::ConstPtr& cmd) {
    +    1495             : 
    +    1496         468 :   if (!is_initialized_) {
    +    1497           0 :     return mrs_msgs::VelocityReferenceSrvResponse::Ptr();
    +    1498             :   }
    +    1499             : 
    +    1500             :   {
    +    1501         468 :     std::scoped_lock lock(mutex_velocity_reference_);
    +    1502             : 
    +    1503         468 :     velocity_reference_time_ = ros::Time::now();
    +    1504             : 
    +    1505         468 :     velocity_reference_ = cmd->reference;
    +    1506             :   }
    +    1507             : 
    +    1508         468 :   if (!velocity_tracking_active_) {
    +    1509             : 
    +    1510           2 :     ROS_INFO("[MpcTracker]: starting velocity tracking timer");
    +    1511             : 
    +    1512           2 :     timer_velocity_tracking_.stop();
    +    1513           2 :     timer_velocity_tracking_.start();
    +    1514             : 
    +    1515           2 :     velocity_tracking_active_ = true;
    +    1516             :   }
    +    1517             : 
    +    1518         936 :   mrs_msgs::VelocityReferenceSrvResponse response;
    +    1519         468 :   response.success = true;
    +    1520         468 :   response.message = "reference set";
    +    1521             : 
    +    1522         468 :   return mrs_msgs::VelocityReferenceSrvResponse::ConstPtr(new mrs_msgs::VelocityReferenceSrvResponse(response));
    +    1523             : }
    +    1524             : 
    +    1525             : //}
    +    1526             : 
    +    1527             : /* //{ setTrajectoryReference() */
    +    1528             : 
    +    1529           4 : const mrs_msgs::TrajectoryReferenceSrvResponse::ConstPtr MpcTracker::setTrajectoryReference([
    +    1530             :     [maybe_unused]] const mrs_msgs::TrajectoryReferenceSrvRequest::ConstPtr& cmd) {
    +    1531             : 
    +    1532           8 :   std::stringstream ss;
    +    1533             : 
    +    1534          12 :   auto [success, message, modified] = loadTrajectory(cmd->trajectory);
    +    1535             : 
    +    1536           8 :   mrs_msgs::TrajectoryReferenceSrvResponse response;
    +    1537           4 :   response.success  = success;
    +    1538           4 :   response.message  = message;
    +    1539           4 :   response.modified = modified;
    +    1540             : 
    +    1541           8 :   return mrs_msgs::TrajectoryReferenceSrvResponse::ConstPtr(new mrs_msgs::TrajectoryReferenceSrvResponse(response));
    +    1542             : }
    +    1543             : 
    +    1544             : //}
    +    1545             : 
    +    1546             : // | ------------------------ callbacks ----------------------- |
    +    1547             : 
    +    1548             : /* //{ callbackOtherMavTrajectory() */
    +    1549             : 
    +    1550         284 : void MpcTracker::callbackOtherMavTrajectory(const mrs_msgs::FutureTrajectory::ConstPtr msg) {
    +    1551             : 
    +    1552         284 :   if (!is_initialized_) {
    +    1553           0 :     return;
    +    1554             :   }
    +    1555             : 
    +    1556         568 :   mrs_lib::Routine    profiler_routine = profiler.createRoutine("callbackOtherMavTrajectory");
    +    1557             :   mrs_lib::ScopeTimer timer =
    +    1558         568 :       mrs_lib::ScopeTimer("MpcTracker::callbackOtherMavTrajectory", common_handlers_->scope_timer.logger, common_handlers_->scope_timer.enabled);
    +    1559             : 
    +    1560         284 :   auto uav_state = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +    1561             : 
    +    1562         284 :   mrs_msgs::FutureTrajectory trajectory = *msg;
    +    1563             : 
    +    1564             :   // the times might not be synchronized, so just remember the time of receiving it
    +    1565         284 :   trajectory.stamp = ros::Time::now();
    +    1566             : 
    +    1567             :   // transform it from the utm origin to the currently used frame
    +    1568         568 :   auto res = common_handlers_->transformer->getTransform("utm_origin", uav_state.header.frame_id, ros::Time::now());
    +    1569             : 
    +    1570         284 :   if (!res) {
    +    1571             : 
    +    1572           0 :     std::string message = "[MpcTracker]: can not transform other drone trajectory to the current frame";
    +    1573           0 :     ROS_WARN_STREAM_ONCE(message);
    +    1574           0 :     ROS_DEBUG_STREAM_THROTTLE(1.0, message);
    +    1575             : 
    +    1576           0 :     return;
    +    1577             :   }
    +    1578             : 
    +    1579         284 :   geometry_msgs::TransformStamped tf = res.value();
    +    1580             : 
    +    1581       11644 :   for (int i = 0; i < int(trajectory.points.size()); i++) {
    +    1582             : 
    +    1583       11360 :     geometry_msgs::PoseStamped original_pose;
    +    1584             : 
    +    1585       11360 :     original_pose.pose.position.x = trajectory.points[i].x;
    +    1586       11360 :     original_pose.pose.position.y = trajectory.points[i].y;
    +    1587       11360 :     original_pose.pose.position.z = trajectory.points[i].z;
    +    1588             : 
    +    1589       11360 :     original_pose.pose.orientation = mrs_lib::AttitudeConverter(0, 0, 0);
    +    1590             : 
    +    1591       11360 :     auto res = common_handlers_->transformer->transform(original_pose, tf);
    +    1592             : 
    +    1593       11360 :     if (res) {
    +    1594       11360 :       trajectory.points[i].x = res.value().pose.position.x;
    +    1595       11360 :       trajectory.points[i].y = res.value().pose.position.y;
    +    1596       11360 :       trajectory.points[i].z = res.value().pose.position.z;
    +    1597             :     } else {
    +    1598             : 
    +    1599           0 :       std::string message = "[MpcTracker]: could not transform point of other uav future trajectory!";
    +    1600           0 :       ROS_WARN_STREAM_ONCE(message);
    +    1601           0 :       ROS_DEBUG_STREAM_THROTTLE(1.0, message);
    +    1602             : 
    +    1603           0 :       return;
    +    1604             :     }
    +    1605             :   }
    +    1606             : 
    +    1607             :   {
    +    1608         568 :     std::scoped_lock lock(mutex_other_uav_avoidance_trajectories_);
    +    1609             : 
    +    1610             :     // update the diagnostics
    +    1611         284 :     other_uav_avoidance_trajectories_[trajectory.uav_name] = trajectory;
    +    1612             :   }
    +    1613             : }
    +    1614             : 
    +    1615             : //}
    +    1616             : 
    +    1617             : /* //{ callbackOtherMavDiagnostics() */
    +    1618             : 
    +    1619        1881 : void MpcTracker::callbackOtherMavDiagnostics(const mrs_msgs::MpcTrackerDiagnostics::ConstPtr msg) {
    +    1620             : 
    +    1621        5643 :   mrs_lib::Routine    profiler_routine = profiler.createRoutine("callbackOtherMavDiagnostics");
    +    1622             :   mrs_lib::ScopeTimer timer =
    +    1623        5643 :       mrs_lib::ScopeTimer("MpcTracker::callbackOtherMavDiagnostics", common_handlers_->scope_timer.logger, common_handlers_->scope_timer.enabled);
    +    1624             : 
    +    1625        3762 :   std::scoped_lock lock(mutex_other_uav_diagnostics_);
    +    1626             : 
    +    1627        3762 :   mrs_msgs::MpcTrackerDiagnostics diagnostics = *msg;
    +    1628             : 
    +    1629             :   // fill in the current time
    +    1630             :   // the other uav's time might not be synchronized with ours
    +    1631        1881 :   diagnostics.header.stamp = ros::Time::now();
    +    1632             : 
    +    1633             :   // update the diagnostics
    +    1634        1881 :   other_uav_diagnostics_[diagnostics.uav_name] = diagnostics;
    +    1635        1881 : }
    +    1636             : 
    +    1637             : //}
    +    1638             : 
    +    1639             : /* //{ callbackToggleCollisionAvoidance() */
    +    1640             : 
    +    1641           0 : bool MpcTracker::callbackToggleCollisionAvoidance(std_srvs::SetBool::Request& req, std_srvs::SetBool::Response& res) {
    +    1642             : 
    +    1643           0 :   collision_avoidance_enabled_ = req.data;
    +    1644             : 
    +    1645           0 :   ROS_INFO("[MpcTracker]: Collision avoidance was switched %s", collision_avoidance_enabled_ ? "TRUE" : "FALSE");
    +    1646             : 
    +    1647           0 :   res.message = "Collision avoidance set.";
    +    1648           0 :   res.success = true;
    +    1649             : 
    +    1650           0 :   return true;
    +    1651             : }
    +    1652             : 
    +    1653             : //}
    +    1654             : 
    +    1655             : /* callbackWiggle() //{ */
    +    1656             : 
    +    1657           0 : bool MpcTracker::callbackWiggle(std_srvs::SetBool::Request& req, std_srvs::SetBool::Response& res) {
    +    1658             : 
    +    1659           0 :   if (!is_initialized_) {
    +    1660             : 
    +    1661           0 :     res.success = false;
    +    1662           0 :     res.message = "tracker not active";
    +    1663           0 :     return true;
    +    1664             :   }
    +    1665             : 
    +    1666             :   {
    +    1667           0 :     std::scoped_lock lock(mutex_drs_params_);
    +    1668             : 
    +    1669           0 :     drs_params_.wiggle_enabled = req.data;
    +    1670             : 
    +    1671           0 :     reconfigure_server_->updateConfig(drs_params_);
    +    1672             :   }
    +    1673             : 
    +    1674           0 :   res.success = true;
    +    1675           0 :   res.message = "wiggle updated";
    +    1676             : 
    +    1677           0 :   return true;
    +    1678             : }
    +    1679             : 
    +    1680             : //}
    +    1681             : 
    +    1682             : /* //{ dynamicReconfigureCallback() */
    +    1683             : 
    +    1684          91 : void MpcTracker::dynamicReconfigureCallback(mrs_uav_trackers::mpc_trackerConfig& config, [[maybe_unused]] uint32_t level) {
    +    1685             : 
    +    1686         182 :   std::scoped_lock lock(mutex_drs_params_);
    +    1687             : 
    +    1688          91 :   drs_params_ = config;
    +    1689             : 
    +    1690          91 :   ROS_INFO("[MpcTracker]: DRS updated");
    +    1691          91 : }
    +    1692             : 
    +    1693             : //}
    +    1694             : 
    +    1695             : // --------------------------------------------------------------
    +    1696             : // |                          routines                          |
    +    1697             : // --------------------------------------------------------------
    +    1698             : 
    +    1699             : // | --------------- mutual collision avoidance --------------- |
    +    1700             : 
    +    1701             : /* //{ checkCollision() */
    +    1702             : 
    +    1703      144480 : bool MpcTracker::checkCollision(const double ax, const double ay, const double az, const double bx, const double by, const double bz) {
    +    1704             : 
    +    1705      144480 :   if (mrs_lib::geometry::dist(vec2_t(ax, ay), vec2_t(bx, by)) < _avoidance_radius_threshold_ && fabs(az - bz) < _avoidance_z_threshold_) {
    +    1706             : 
    +    1707       20980 :     return true;
    +    1708             : 
    +    1709             :   } else {
    +    1710             : 
    +    1711      123500 :     return false;
    +    1712             :   }
    +    1713             : }
    +    1714             : 
    +    1715             : //}
    +    1716             : 
    +    1717             : /* //{ checkCollisionInflated() */
    +    1718             : 
    +    1719      144480 : bool MpcTracker::checkCollisionInflated(const double ax, const double ay, const double az, const double bx, const double by, const double bz) {
    +    1720             : 
    +    1721      144480 :   if (mrs_lib::geometry::dist(vec2_t(ax, ay), vec2_t(bx, by)) < _avoidance_radius_threshold_ + 1.0 && fabs(az - bz) < _avoidance_z_threshold_ + 1.0) {
    +    1722             : 
    +    1723      144480 :     return true;
    +    1724             : 
    +    1725             :   } else {
    +    1726             : 
    +    1727           0 :     return false;
    +    1728             :   }
    +    1729             : }
    +    1730             : 
    +    1731             : //}
    +    1732             : 
    +    1733             : /* //{ checkTrajectoryForCollisions() */
    +    1734             : 
    +    1735             : // Check for potential collisions and return the needed altitude offset to avoid other drones
    +    1736       69752 : double MpcTracker::checkTrajectoryForCollisions(int& first_collision_index) {
    +    1737             : 
    +    1738       69752 :   std::scoped_lock lock(mutex_predicted_trajectory_, mutex_des_trajectory_, mutex_other_uav_avoidance_trajectories_);
    +    1739             : 
    +    1740       69752 :   first_collision_index = INT_MAX;
    +    1741       69752 :   avoiding_collision_   = false;
    +    1742             : 
    +    1743       69752 :   std::map<std::string, mrs_msgs::FutureTrajectory>::iterator u = other_uav_avoidance_trajectories_.begin();
    +    1744             : 
    +    1745       73364 :   while (u != other_uav_avoidance_trajectories_.end()) {
    +    1746             : 
    +    1747             :     // is the other's trajectory fresh enought?
    +    1748        3612 :     if ((ros::Time::now() - u->second.stamp).toSec() < _collision_trajectory_timeout_) {
    +    1749             : 
    +    1750      148092 :       for (int v = 0; v < MPC_HORIZON_LENGTH; v++) {
    +    1751             : 
    +    1752             :         // check all points of the trajectory for possible collisions
    +    1753      144480 :         if (checkCollision(predicted_trajectory_(v * MPC_N_STATES, 0), predicted_trajectory_(v * MPC_N_STATES + 4, 0),
    +    1754      144480 :                            predicted_trajectory_(v * MPC_N_STATES + 8, 0), u->second.points[v].x, u->second.points[v].y, u->second.points[v].z)) {
    +    1755             : 
    +    1756             :           // collision is detected
    +    1757       20980 :           int other_uav_priority = INT_MAX;
    +    1758             :           // get the priority of the other uav
    +    1759             :           /* sscanf(u->first.c_str(), "uav%d", &other_uav_priority); */
    +    1760       20980 :           other_uav_priority = u->second.priority;
    +    1761             : 
    +    1762             :           // check if we should be avoiding (out priority is higher, or the other uav has collision avoidance turned off)
    +    1763       20980 :           if ((u->second.collision_avoidance == false) || (other_uav_priority < avoidance_this_uav_priority_)) {
    +    1764             : 
    +    1765             :             // we should be avoiding
    +    1766       15249 :             avoiding_collision_      = true;
    +    1767       15249 :             double tmp_safe_altitude = u->second.points[v].z + _avoidance_z_correction_;
    +    1768             : 
    +    1769       15249 :             if (tmp_safe_altitude > collision_free_altitude_ && v <= _avoidance_collision_start_climbing_) {
    +    1770         378 :               collision_free_altitude_ = tmp_safe_altitude;
    +    1771             :             }
    +    1772             : 
    +    1773       15249 :             ROS_ERROR_STREAM_THROTTLE(1, "[MpcTracker]: avoiding collision with uav" << other_uav_priority);
    +    1774             : 
    +    1775             :           } else {
    +    1776             :             // the other uav should avoid us
    +    1777        5731 :             ROS_WARN_STREAM_THROTTLE(1, "[MpcTracker]: detected collision with uav" << other_uav_priority << ", not avoiding (my priority is higher)");
    +    1778             :           }
    +    1779             :         }
    +    1780             : 
    +    1781      144480 :         if (checkCollisionInflated(predicted_trajectory_(v * MPC_N_STATES, 0), predicted_trajectory_(v * MPC_N_STATES + 4, 0),
    +    1782      144480 :                                    predicted_trajectory_(v * MPC_N_STATES + 8, 0), u->second.points[v].x, u->second.points[v].y, u->second.points[v].z)) {
    +    1783             : 
    +    1784             :           // collision is detected
    +    1785      144480 :           if (first_collision_index > v) {
    +    1786        3612 :             first_collision_index = v;
    +    1787             :           }
    +    1788             :         }
    +    1789             :       }
    +    1790             :     }
    +    1791        3612 :     u++;
    +    1792             :   }
    +    1793             : 
    +    1794       69752 :   if (!avoiding_collision_) {
    +    1795             : 
    +    1796       68896 :     auto dt1 = mrs_lib::get_mutexed(mutex_dt1_, dt1_);
    +    1797             : 
    +    1798             :     // we are not avoiding any collisions, so we slowly reduce the collision avoidance offset to return to normal flight
    +    1799       68896 :     collision_free_altitude_ -= 2.0 / (1.0 / dt1);
    +    1800             : 
    +    1801       68896 :     double safety_area_min_z = std::numeric_limits<double>::lowest();
    +    1802             : 
    +    1803       68896 :     if (collision_free_altitude_ < safety_area_min_z) {
    +    1804             : 
    +    1805           0 :       collision_free_altitude_ = safety_area_min_z;
    +    1806             :     }
    +    1807             :   }
    +    1808             : 
    +    1809      139504 :   return collision_free_altitude_;
    +    1810             : }
    +    1811             : 
    +    1812             : //}
    +    1813             : 
    +    1814             : // | ------------------ trajectory filtering ------------------ |
    +    1815             : 
    +    1816             : /* //{ filterReferenceXY() */
    +    1817             : 
    +    1818       70716 : std::tuple<MatrixXd, MatrixXd> MpcTracker::filterReferenceXY(const VectorXd& des_x_trajectory, const VectorXd& des_y_trajectory, double max_speed_x,
    +    1819             :                                                              double max_speed_y) {
    +    1820             : 
    +    1821       70716 :   auto dt1 = mrs_lib::get_mutexed(mutex_dt1_, dt1_);
    +    1822             : 
    +    1823      141432 :   auto mpc_x         = mrs_lib::get_mutexed(mutex_mpc_x_, mpc_x_);
    +    1824       70716 :   auto trajectory_dt = mrs_lib::get_mutexed(mutex_des_trajectory_, trajectory_dt_);
    +    1825             : 
    +    1826      141432 :   MatrixXd filtered_x_trajectory = MatrixXd::Zero(MPC_HORIZON_LENGTH, 1);
    +    1827      141432 :   MatrixXd filtered_y_trajectory = MatrixXd::Zero(MPC_HORIZON_LENGTH, 1);
    +    1828             : 
    +    1829             :   double difference_x;
    +    1830             :   double difference_y;
    +    1831             :   double max_sample_x;
    +    1832             :   double max_sample_y;
    +    1833             : 
    +    1834     2899356 :   for (int i = 0; i < MPC_HORIZON_LENGTH; i++) {
    +    1835             : 
    +    1836     2828640 :     if (i == 0) {
    +    1837       70716 :       max_sample_x = max_speed_x * dt1;
    +    1838       70716 :       max_sample_y = max_speed_y * dt1;
    +    1839       70716 :       difference_x = des_x_trajectory(i, 0) - mpc_x(0, 0);
    +    1840       70716 :       difference_y = des_y_trajectory(i, 0) - mpc_x(4, 0);
    +    1841             :     } else {
    +    1842     2757924 :       max_sample_x = max_speed_x * _dt2_;
    +    1843     2757924 :       max_sample_y = max_speed_y * _dt2_;
    +    1844     2757924 :       difference_x = des_x_trajectory(i, 0) - filtered_x_trajectory(i - 1, 0);
    +    1845     2757924 :       difference_y = des_y_trajectory(i, 0) - filtered_y_trajectory(i - 1, 0);
    +    1846             :     }
    +    1847             : 
    +    1848     2828640 :     if (!trajectory_tracking_in_progress_) {
    +    1849             : 
    +    1850     2342600 :       double direction_angle  = atan2(difference_y, difference_x);
    +    1851     2342600 :       double max_dir_sample_x = abs(max_sample_x * cos(direction_angle));
    +    1852     2342600 :       double max_dir_sample_y = abs(max_sample_y * sin(direction_angle));
    +    1853             : 
    +    1854     2342600 :       if (max_sample_x > max_dir_sample_x) {
    +    1855      275206 :         max_sample_x = max_dir_sample_x;
    +    1856             :       }
    +    1857     2342600 :       if (max_sample_y > max_dir_sample_y) {
    +    1858     2342233 :         max_sample_y = max_dir_sample_y;
    +    1859             :       }
    +    1860             : 
    +    1861             :       // saturate the difference
    +    1862     2342600 :       if (difference_x > max_sample_x)
    +    1863      115939 :         difference_x = max_sample_x;
    +    1864     2226661 :       else if (difference_x < -max_sample_x)
    +    1865      175657 :         difference_x = -max_sample_x;
    +    1866             : 
    +    1867     2342600 :       if (difference_y > max_sample_y)
    +    1868       90423 :         difference_y = max_sample_y;
    +    1869     2252177 :       else if (difference_y < -max_sample_y)
    +    1870      179631 :         difference_y = -max_sample_y;
    +    1871             :     }
    +    1872             : 
    +    1873     2828640 :     if (i == 0) {
    +    1874       70716 :       filtered_x_trajectory(i, 0) = mpc_x(0, 0) + difference_x;
    +    1875       70716 :       filtered_y_trajectory(i, 0) = mpc_x(4, 0) + difference_y;
    +    1876             :     } else {
    +    1877     2757924 :       filtered_x_trajectory(i, 0) = filtered_x_trajectory(i - 1, 0) + difference_x;
    +    1878     2757924 :       filtered_y_trajectory(i, 0) = filtered_y_trajectory(i - 1, 0) + difference_y;
    +    1879             :     }
    +    1880             :   }
    +    1881             : 
    +    1882             :   // | ----------------------- add wiggle ----------------------- |
    +    1883             : 
    +    1884       70716 :   auto [wiggle_enabled, wiggle_amplitude, wiggle_frequency_] =
    +    1885       70716 :       mrs_lib::get_mutexed(mutex_drs_params_, drs_params_.wiggle_enabled, drs_params_.wiggle_amplitude, drs_params_.wiggle_frequency);
    +    1886             : 
    +    1887       70716 :   if (wiggle_enabled) {
    +    1888             : 
    +    1889           0 :     for (int i = 0; i < MPC_HORIZON_LENGTH; i++) {
    +    1890           0 :       filtered_x_trajectory(i, 0) += wiggle_amplitude * cos(wiggle_frequency_ * 2 * M_PI * i * trajectory_dt + wiggle_phase_);
    +    1891           0 :       filtered_y_trajectory(i, 0) += wiggle_amplitude * sin(wiggle_frequency_ * 2 * M_PI * i * trajectory_dt + wiggle_phase_);
    +    1892             :     }
    +    1893             : 
    +    1894           0 :     wiggle_phase_ += wiggle_frequency_ * dt1 * 2 * M_PI;
    +    1895             : 
    +    1896           0 :     if (wiggle_phase_ > M_PI) {
    +    1897           0 :       wiggle_phase_ -= 2 * M_PI;
    +    1898             :     }
    +    1899             :   }
    +    1900             : 
    +    1901      141432 :   return std::make_tuple(filtered_x_trajectory, filtered_y_trajectory);
    +    1902             : }
    +    1903             : 
    +    1904             : //}
    +    1905             : 
    +    1906             : /* //{ filterReferenceZ() */
    +    1907             : 
    +    1908       70716 : MatrixXd MpcTracker::filterReferenceZ(const VectorXd& des_z_trajectory, const double max_ascending_speed, const double max_descending_speed) {
    +    1909             : 
    +    1910      141432 :   auto mpc_x = mrs_lib::get_mutexed(mutex_mpc_x_, mpc_x_);
    +    1911             : 
    +    1912       70716 :   auto dt1 = mrs_lib::get_mutexed(mutex_dt1_, dt1_);
    +    1913             : 
    +    1914             :   double difference_z;
    +    1915             :   double max_sample_z;
    +    1916             : 
    +    1917       70716 :   MatrixXd filtered_trajectory = MatrixXd::Zero(MPC_HORIZON_LENGTH, 1);
    +    1918             : 
    +    1919       70716 :   double current_z = mpc_x(8, 0);
    +    1920             : 
    +    1921     2899356 :   for (int i = 0; i < MPC_HORIZON_LENGTH; i++) {
    +    1922             : 
    +    1923     2828640 :     if (i == 0) {
    +    1924             : 
    +    1925       70716 :       difference_z = des_z_trajectory(i, 0) - current_z;
    +    1926             : 
    +    1927       70716 :       if (difference_z > 0) {
    +    1928       23465 :         max_sample_z = max_ascending_speed * dt1;
    +    1929             :       } else {
    +    1930       47251 :         max_sample_z = max_descending_speed * dt1;
    +    1931             :       }
    +    1932             : 
    +    1933             :     } else {
    +    1934             : 
    +    1935     2757924 :       difference_z = des_z_trajectory(i, 0) - filtered_trajectory(i - 1, 0);
    +    1936             : 
    +    1937     2757924 :       if (difference_z > 0) {
    +    1938      180934 :         max_sample_z = max_ascending_speed * _dt2_;
    +    1939             :       } else {
    +    1940     2576990 :         max_sample_z = max_descending_speed * _dt2_;
    +    1941             :       }
    +    1942             :     }
    +    1943             : 
    +    1944     2828640 :     if (!trajectory_tracking_in_progress_) {
    +    1945             : 
    +    1946             :       // saturate the difference
    +    1947     2342560 :       if (difference_z > max_sample_z)
    +    1948       79714 :         difference_z = max_sample_z;
    +    1949     2262846 :       else if (difference_z < -max_sample_z)
    +    1950       22445 :         difference_z = -max_sample_z;
    +    1951             :     }
    +    1952             : 
    +    1953     2828640 :     if (i == 0) {
    +    1954       70716 :       filtered_trajectory(i, 0) = current_z + difference_z;
    +    1955             :     } else {
    +    1956     2757924 :       filtered_trajectory(i, 0) = filtered_trajectory(i - 1, 0) + difference_z;
    +    1957             :     }
    +    1958             :   }
    +    1959             : 
    +    1960      141432 :   return filtered_trajectory;
    +    1961             : }
    +    1962             : 
    +    1963             : //}
    +    1964             : 
    +    1965             : /* //{ manageConstraints() */
    +    1966             : 
    +    1967       70716 : void MpcTracker::manageConstraints() {
    +    1968             : 
    +    1969       70716 :   if (!got_constraints_) {
    +    1970       70564 :     return;
    +    1971             :   }
    +    1972             : 
    +    1973       70716 :   if (all_constraints_set_) {
    +    1974       70564 :     return;
    +    1975             :   }
    +    1976             : 
    +    1977         152 :   auto constraints            = mrs_lib::get_mutexed(mutex_constraints_, constraints_);
    +    1978         304 :   auto [mpc_x, mpc_x_heading] = mrs_lib::get_mutexed(mutex_mpc_x_, mpc_x_, mpc_x_heading_);
    +    1979             : 
    +    1980         304 :   bool can_change = (fabs(mpc_x(1, 0)) < constraints.horizontal_speed) && (fabs(mpc_x(2, 0)) < constraints.horizontal_acceleration) &&
    +    1981         152 :                     (fabs(mpc_x(3, 0)) < constraints.horizontal_jerk) && (fabs(mpc_x(5, 0)) < constraints.horizontal_speed) &&
    +    1982         152 :                     (fabs(mpc_x(6, 0)) < constraints.horizontal_acceleration) && (fabs(mpc_x(7, 0)) < constraints.horizontal_jerk) &&
    +    1983         152 :                     (mpc_x(9, 0) < constraints.vertical_ascending_speed) && (mpc_x(9, 0) > -constraints.vertical_descending_speed) &&
    +    1984         152 :                     (mpc_x(10, 0) < constraints.vertical_ascending_acceleration) && (mpc_x(10, 0) > -constraints.vertical_descending_acceleration) &&
    +    1985         152 :                     (mpc_x(11, 0) < constraints.vertical_ascending_jerk) && (mpc_x(11, 0) > -constraints.vertical_descending_jerk) &&
    +    1986         456 :                     (fabs(mpc_x_heading(1, 0)) < constraints.heading_speed) && (fabs(mpc_x_heading(2, 0)) < constraints.heading_acceleration) &&
    +    1987         152 :                     (fabs(mpc_x_heading(3, 0)) < constraints.heading_jerk);
    +    1988             : 
    +    1989         152 :   if (can_change) {
    +    1990             : 
    +    1991             :     {
    +    1992         152 :       std::scoped_lock lock(mutex_constraints_filtered_);
    +    1993             : 
    +    1994         152 :       constraints_filtered_.horizontal_acceleration = constraints.horizontal_acceleration;
    +    1995         152 :       constraints_filtered_.horizontal_jerk         = constraints.horizontal_jerk;
    +    1996         152 :       constraints_filtered_.horizontal_snap         = constraints.horizontal_snap;
    +    1997             : 
    +    1998         152 :       constraints_filtered_.vertical_ascending_acceleration = constraints.vertical_ascending_acceleration;
    +    1999         152 :       constraints_filtered_.vertical_ascending_jerk         = constraints.vertical_ascending_jerk;
    +    2000         152 :       constraints_filtered_.vertical_ascending_snap         = constraints.vertical_ascending_snap;
    +    2001             : 
    +    2002         152 :       constraints_filtered_.vertical_descending_acceleration = constraints.vertical_descending_acceleration;
    +    2003         152 :       constraints_filtered_.vertical_descending_jerk         = constraints.vertical_descending_jerk;
    +    2004         152 :       constraints_filtered_.vertical_descending_snap         = constraints.vertical_descending_snap;
    +    2005             : 
    +    2006         152 :       constraints_filtered_.heading_acceleration = constraints.heading_acceleration;
    +    2007         152 :       constraints_filtered_.heading_jerk         = constraints.heading_jerk;
    +    2008         152 :       constraints_filtered_.heading_snap         = constraints.heading_snap;
    +    2009             :     }
    +    2010             : 
    +    2011         152 :     ROS_INFO_THROTTLE(1.0, "[MpcTracker]: all constraints succesfully applied");
    +    2012         152 :     all_constraints_set_ = true;
    +    2013             : 
    +    2014             :   } else {
    +    2015           0 :     ROS_WARN_STREAM_THROTTLE(1.0, "[MpcTracker]: slowing down to apply new constraints");
    +    2016             :   }
    +    2017             : }
    +    2018             : 
    +    2019             : //}
    +    2020             : 
    +    2021             : /* //{ calculateMPC() */
    +    2022             : 
    +    2023       70716 : void MpcTracker::calculateMPC() {
    +    2024             : 
    +    2025       70716 :   std::scoped_lock lock(mutex_mpc_calculation_);
    +    2026             : 
    +    2027       70716 :   auto dt1 = mrs_lib::get_mutexed(mutex_dt1_, dt1_);
    +    2028             : 
    +    2029       70716 :   ROS_DEBUG_STREAM_THROTTLE(1.0, "[MpcTracker]: MPC calculation dt = " << dt1);
    +    2030             : 
    +    2031       70716 :   auto constraints            = mrs_lib::get_mutexed(mutex_constraints_filtered_, constraints_filtered_);
    +    2032       70716 :   auto [mpc_x, mpc_x_heading] = mrs_lib::get_mutexed(mutex_mpc_x_, mpc_x_, mpc_x_heading_);
    +    2033       70716 :   auto uav_state              = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +    2034       70716 :   auto drs_params             = mrs_lib::get_mutexed(mutex_drs_params_, drs_params_);
    +    2035             : 
    +    2036       70716 :   MatrixXd des_x_trajectory, des_y_trajectory, des_z_trajectory, des_heading_trajectory;
    +    2037             :   {
    +    2038      141432 :     std::scoped_lock lock(mutex_des_trajectory_);
    +    2039             : 
    +    2040       70716 :     des_x_trajectory       = des_x_trajectory_;
    +    2041       70716 :     des_y_trajectory       = des_y_trajectory_;
    +    2042       70716 :     des_z_trajectory       = des_z_trajectory_;
    +    2043       70716 :     des_heading_trajectory = des_heading_trajectory_;
    +    2044             :   }
    +    2045             : 
    +    2046       70716 :   int    first_collision_index = INT_MAX;
    +    2047       70716 :   double lowest_z              = std::numeric_limits<double>::max();
    +    2048             : 
    +    2049       70716 :   if (collision_avoidance_enabled_ && (uav_state.estimator_horizontal == "lat_gps" || uav_state.estimator_horizontal == "lat_rtk")) {
    +    2050             : 
    +    2051             :     // determine the lowest point in our trajectory
    +    2052     2859832 :     for (int i = 0; i < MPC_HORIZON_LENGTH; i++) {
    +    2053     2790080 :       if (des_z_trajectory_(i, 0) < lowest_z) {
    +    2054       90188 :         lowest_z = des_z_trajectory_(i, 0);
    +    2055             :       }
    +    2056             :     }
    +    2057             : 
    +    2058             :     // check other drone trajectories for collisions
    +    2059       69752 :     minimum_collison_free_altitude_ = checkTrajectoryForCollisions(first_collision_index);
    +    2060             : 
    +    2061             :   } else {
    +    2062             : 
    +    2063         964 :     minimum_collison_free_altitude_ = std::numeric_limits<double>::lowest();
    +    2064             :   }
    +    2065             : 
    +    2066       70716 :   double max_speed_x = constraints.horizontal_speed;
    +    2067       70716 :   double max_speed_y = constraints.horizontal_speed;
    +    2068       70716 :   double max_speed_z = constraints.vertical_ascending_speed;
    +    2069       70716 :   double min_speed_z = constraints.vertical_descending_speed;
    +    2070             : 
    +    2071       70716 :   double max_acc_x = constraints.horizontal_acceleration;
    +    2072       70716 :   double max_acc_y = constraints.horizontal_acceleration;
    +    2073       70716 :   double max_acc_z = constraints.vertical_ascending_acceleration;
    +    2074       70716 :   double min_acc_z = constraints.vertical_descending_acceleration;
    +    2075             : 
    +    2076       70716 :   double max_snap_x = constraints.horizontal_snap;
    +    2077       70716 :   double max_snap_y = constraints.horizontal_snap;
    +    2078       70716 :   double max_snap_z = constraints.vertical_ascending_snap;
    +    2079       70716 :   double min_snap_z = constraints.vertical_descending_snap;
    +    2080             : 
    +    2081       70716 :   double max_jerk_x = constraints.horizontal_jerk;
    +    2082       70716 :   double max_jerk_y = constraints.horizontal_jerk;
    +    2083       70716 :   double max_jerk_z = constraints.vertical_ascending_jerk;
    +    2084       70716 :   double min_jerk_z = constraints.vertical_descending_jerk;
    +    2085             : 
    +    2086       70716 :   collision_avoidance_affecting_me_ = false;
    +    2087             : 
    +    2088       70716 :   if (first_collision_index < MPC_HORIZON_LENGTH) {
    +    2089             : 
    +    2090        3612 :     collision_avoidance_affecting_me_ = true;
    +    2091             :     // the tmp variable is used to scale the speed of our drone in collision avoidance, depending on how far away the collision is
    +    2092        3612 :     double tmp = 0;
    +    2093             : 
    +    2094        3612 :     if (first_collision_index <= _avoidance_collision_slow_down_fully_) {
    +    2095        3612 :       tmp = 1;
    +    2096           0 :     } else if (first_collision_index <= _avoidance_collision_slow_down_) {
    +    2097           0 :       tmp = 1.0 - ((double)(first_collision_index - _avoidance_collision_slow_down_fully_)) /
    +    2098           0 :                       (double)(_avoidance_collision_slow_down_ - _avoidance_collision_slow_down_fully_);
    +    2099           0 :       tmp = tmp * tmp;
    +    2100             :     }
    +    2101             : 
    +    2102        3612 :     if (!std::isfinite(tmp)) {
    +    2103           0 :       tmp = 1.0;
    +    2104           0 :       ROS_ERROR("[MpcTracker]: NaN detected in variable 'tmp', setting it to 1.0 and returning!!!");
    +    2105           0 :       return;
    +    2106        3612 :     } else if (tmp > 1.0) {
    +    2107           0 :       tmp = 1.0;
    +    2108        3612 :     } else if (tmp < 0.0) {
    +    2109           0 :       tmp = 0.0;
    +    2110             :     }
    +    2111             : 
    +    2112        3612 :     if (tmp > coef_scaler) {
    +    2113           6 :       coef_scaler = tmp;
    +    2114           6 :       coef_time   = ros::Time::now();
    +    2115             :     }
    +    2116        3612 :     if ((ros::Time::now() - coef_time).toSec() > 2.0) {
    +    2117        3161 :       coef_scaler = tmp;
    +    2118             :     }
    +    2119             : 
    +    2120             :     // we are close to a possible collision, better slow down a bit to give everyone more time
    +    2121        3612 :     max_speed_x = constraints.horizontal_speed * ((_avoidance_collision_horizontal_speed_coef_ * coef_scaler) + (1.0 - coef_scaler));
    +    2122        3612 :     max_speed_y = constraints.horizontal_speed * ((_avoidance_collision_horizontal_speed_coef_ * coef_scaler) + (1.0 - coef_scaler));
    +    2123             :   }
    +    2124             : 
    +    2125       70716 :   if (collision_free_altitude_ > lowest_z) {
    +    2126             : 
    +    2127        1935 :     collision_avoidance_affecting_me_ = true;
    +    2128        1935 :     max_speed_x                       = constraints.horizontal_speed * (_avoidance_collision_horizontal_speed_coef_);
    +    2129        1935 :     max_speed_y                       = constraints.horizontal_speed * (_avoidance_collision_horizontal_speed_coef_);
    +    2130             :   }
    +    2131             : 
    +    2132             :   // first control input generated by MPC
    +    2133      141432 :   VectorXd mpc_u         = VectorXd::Zero(MPC_N_INPUTS);
    +    2134       70716 :   double   mpc_u_heading = 0;
    +    2135             : 
    +    2136       70716 :   double iters_z       = 0;
    +    2137       70716 :   double iters_x       = 0;
    +    2138       70716 :   double iters_y       = 0;
    +    2139       70716 :   double iters_heading = 0;
    +    2140             : 
    +    2141       70716 :   ros::Time time_begin = ros::Time::now();
    +    2142             : 
    +    2143      141432 :   MatrixXd des_z_filtered = filterReferenceZ(des_z_trajectory, max_speed_z, min_speed_z);
    +    2144             : 
    +    2145     2899356 :   for (int i = 0; i < MPC_HORIZON_LENGTH; i++) {
    +    2146     2828640 :     if (des_z_filtered(i, 0) < minimum_collison_free_altitude_) {
    +    2147       76915 :       des_z_filtered_offset_(i, 0) = minimum_collison_free_altitude_;
    +    2148             :     } else {
    +    2149     2751725 :       des_z_filtered_offset_(i, 0) = des_z_filtered(i, 0);
    +    2150             :     }
    +    2151             :   }
    +    2152             : 
    +    2153             :   // | ----------------- prepare the references ----------------- |
    +    2154             : 
    +    2155             :   // | -------------------- MPC solver z-axis ------------------- |
    +    2156             : 
    +    2157       70716 :   if (brake_ && !trajectory_tracking_in_progress_) {
    +    2158       55925 :     mpc_solver_z_->setVelQ(drs_params.q_vel_braking);
    +    2159             :   } else {
    +    2160       14791 :     mpc_solver_z_->setVelQ(drs_params.q_vel_no_braking);
    +    2161             :   }
    +    2162             : 
    +    2163      141432 :   MatrixXd initial_z = MatrixXd::Zero(4, 1);
    +    2164             : 
    +    2165       70716 :   initial_z(0, 0) = mpc_x(8, 0);
    +    2166       70716 :   initial_z(1, 0) = mpc_x(9, 0);
    +    2167       70716 :   initial_z(2, 0) = mpc_x(10, 0);
    +    2168       70716 :   initial_z(3, 0) = mpc_x(11, 0);
    +    2169             : 
    +    2170       70716 :   mpc_solver_z_->setDt(dt1);
    +    2171       70716 :   mpc_solver_z_->setInitialState(initial_z);
    +    2172       70716 :   mpc_solver_z_->loadReference(des_z_filtered_offset_);
    +    2173       70716 :   mpc_solver_z_->setLimits(max_speed_z, min_speed_z, max_acc_z, min_acc_z, max_jerk_z, min_jerk_z, max_snap_z, min_snap_z);
    +    2174       70716 :   iters_z += mpc_solver_z_->solveMPC();
    +    2175             : 
    +    2176             :   {
    +    2177      141432 :     std::scoped_lock lock(mutex_predicted_trajectory_);
    +    2178             : 
    +    2179       70716 :     mpc_solver_z_->getStates(predicted_trajectory_);
    +    2180             :   }
    +    2181             : 
    +    2182       70716 :   mpc_u(2) = mpc_solver_z_->getFirstControlInput();
    +    2183             : 
    +    2184             :   // if we are climbing to avoid a collision, reduce or arrest our horizontal velocity
    +    2185             :   double ascend;
    +    2186             :   {
    +    2187       70716 :     std::scoped_lock lock(mutex_predicted_trajectory_);
    +    2188             : 
    +    2189       70716 :     ascend = (predicted_trajectory_(10, 0) / max_speed_z);
    +    2190             :   }
    +    2191             : 
    +    2192       70716 :   if (ascend > 0 && collision_free_altitude_ > lowest_z) {
    +    2193        1015 :     max_speed_y = max_speed_y * (1.0 - ascend);
    +    2194        1015 :     max_speed_x = max_speed_x * (1.0 - ascend);
    +    2195             :   }
    +    2196             : 
    +    2197      212148 :   auto [des_x_filtered, des_y_filtered] = filterReferenceXY(des_x_trajectory, des_y_trajectory, max_speed_x, max_speed_y);
    +    2198             : 
    +    2199             :   // unwrap the heading reference
    +    2200             : 
    +    2201       70716 :   des_heading_trajectory(0, 0) = sradians::unwrap(des_heading_trajectory(0, 0), mpc_x_heading(0));
    +    2202             : 
    +    2203     2828640 :   for (int i = 1; i < MPC_HORIZON_LENGTH; i++) {
    +    2204     2757924 :     des_heading_trajectory(i, 0) = sradians::unwrap(des_heading_trajectory(i, 0), des_heading_trajectory(i - 1, 0));
    +    2205             :   }
    +    2206             : 
    +    2207             :   // | -------------------- MPC solver x-axis ------------------- |
    +    2208             : 
    +    2209       70716 :   if (brake_ && !trajectory_tracking_in_progress_) {
    +    2210       55925 :     mpc_solver_x_->setVelQ(drs_params.q_vel_braking);
    +    2211             :   } else {
    +    2212       14791 :     mpc_solver_x_->setVelQ(drs_params.q_vel_no_braking);
    +    2213             :   }
    +    2214             : 
    +    2215      141432 :   MatrixXd initial_x = MatrixXd::Zero(4, 1);
    +    2216             : 
    +    2217       70716 :   initial_x(0, 0) = mpc_x(0, 0);
    +    2218       70716 :   initial_x(1, 0) = mpc_x(1, 0);
    +    2219       70716 :   initial_x(2, 0) = mpc_x(2, 0);
    +    2220       70716 :   initial_x(3, 0) = mpc_x(3, 0);
    +    2221             : 
    +    2222       70716 :   mpc_solver_x_->setDt(dt1);
    +    2223       70716 :   mpc_solver_x_->setInitialState(initial_x);
    +    2224       70716 :   mpc_solver_x_->loadReference(des_x_filtered);
    +    2225       70716 :   mpc_solver_x_->setLimits(max_speed_x, max_speed_x, max_acc_x, max_acc_x, max_jerk_x, max_jerk_x, max_snap_x, max_snap_x);
    +    2226       70716 :   iters_x += mpc_solver_x_->solveMPC();
    +    2227             : 
    +    2228             :   {
    +    2229      141432 :     std::scoped_lock lock(mutex_predicted_trajectory_);
    +    2230             : 
    +    2231       70716 :     mpc_solver_x_->getStates(predicted_trajectory_);
    +    2232             :   }
    +    2233             : 
    +    2234       70716 :   mpc_u(0) = mpc_solver_x_->getFirstControlInput();
    +    2235             : 
    +    2236             :   // | -------------------- MPC solver y-axis ------------------- |
    +    2237             : 
    +    2238       70716 :   if (brake_ && !trajectory_tracking_in_progress_) {
    +    2239       55924 :     mpc_solver_y_->setVelQ(drs_params.q_vel_braking);
    +    2240             :   } else {
    +    2241       14792 :     mpc_solver_y_->setVelQ(drs_params.q_vel_no_braking);
    +    2242             :   }
    +    2243             : 
    +    2244      141432 :   MatrixXd initial_y = MatrixXd::Zero(4, 1);
    +    2245             : 
    +    2246       70716 :   initial_y(0, 0) = mpc_x(4, 0);
    +    2247       70716 :   initial_y(1, 0) = mpc_x(5, 0);
    +    2248       70716 :   initial_y(2, 0) = mpc_x(6, 0);
    +    2249       70716 :   initial_y(3, 0) = mpc_x(7, 0);
    +    2250             : 
    +    2251       70716 :   mpc_solver_y_->setDt(dt1);
    +    2252       70716 :   mpc_solver_y_->setInitialState(initial_y);
    +    2253       70716 :   mpc_solver_y_->loadReference(des_y_filtered);
    +    2254       70716 :   mpc_solver_y_->setLimits(max_speed_y, max_speed_y, max_acc_y, max_acc_y, max_jerk_y, max_jerk_y, max_snap_y, max_snap_y);
    +    2255       70716 :   iters_y += mpc_solver_y_->solveMPC();
    +    2256             :   {
    +    2257      141432 :     std::scoped_lock lock(mutex_predicted_trajectory_);
    +    2258             : 
    +    2259       70716 :     mpc_solver_y_->getStates(predicted_trajectory_);
    +    2260             :   }
    +    2261       70716 :   mpc_u(1) = mpc_solver_y_->getFirstControlInput();
    +    2262             : 
    +    2263             :   // | ------------------- MPC solver heading ------------------- |
    +    2264             : 
    +    2265       70716 :   if (brake_ && !trajectory_tracking_in_progress_) {
    +    2266       55923 :     mpc_solver_heading_->setVelQ(drs_params.q_vel_braking);
    +    2267             :   } else {
    +    2268       14793 :     mpc_solver_heading_->setVelQ(drs_params.q_vel_no_braking);
    +    2269             :   }
    +    2270             : 
    +    2271       70716 :   mpc_solver_heading_->setDt(dt1);
    +    2272       70716 :   mpc_solver_heading_->setInitialState(mpc_x_heading);
    +    2273       70716 :   mpc_solver_heading_->loadReference(des_heading_trajectory);
    +    2274       70716 :   mpc_solver_heading_->setLimits(constraints.heading_speed, constraints.heading_speed, constraints.heading_acceleration, constraints.heading_acceleration,
    +    2275             :                                  constraints.heading_jerk, constraints.heading_jerk, constraints.heading_snap, constraints.heading_snap);
    +    2276       70716 :   iters_heading += mpc_solver_heading_->solveMPC();
    +    2277             :   {
    +    2278      141432 :     std::scoped_lock lock(mutex_predicted_trajectory_);
    +    2279             : 
    +    2280       70716 :     mpc_solver_heading_->getStates(predicted_heading_trajectory_);
    +    2281             :   }
    +    2282       70716 :   mpc_u_heading = mpc_solver_heading_->getFirstControlInput();
    +    2283             : 
    +    2284             :   {
    +    2285       70716 :     bool saturating = false;
    +    2286             : 
    +    2287       70716 :     if (mpc_u(0) > max_snap_x * 1.01) {
    +    2288           0 :       ROS_WARN_STREAM_THROTTLE(0.1, "[MpcTracker]: saturating snap X: " << mpc_u(0));
    +    2289           0 :       mpc_u(0)   = max_snap_x;
    +    2290           0 :       saturating = true;
    +    2291             :     }
    +    2292       70716 :     if (mpc_u(0) < -max_snap_x * 1.01) {
    +    2293           0 :       ROS_WARN_STREAM_THROTTLE(0.1, "[MpcTracker]: saturating snap X: " << mpc_u(0));
    +    2294           0 :       mpc_u(0)   = -max_snap_x;
    +    2295           0 :       saturating = true;
    +    2296             :     }
    +    2297       70716 :     if (mpc_u(1) > max_snap_y * 1.01) {
    +    2298           0 :       ROS_WARN_STREAM_THROTTLE(0.1, "[MpcTracker]: saturating snap Y: " << mpc_u(1));
    +    2299           0 :       mpc_u(1)   = max_snap_y;
    +    2300           0 :       saturating = true;
    +    2301             :     }
    +    2302       70716 :     if (mpc_u(1) < -max_snap_y * 1.01) {
    +    2303           0 :       ROS_WARN_STREAM_THROTTLE(0.1, "[MpcTracker]: saturating snap Y: " << mpc_u(1));
    +    2304           0 :       mpc_u(1)   = -max_snap_y;
    +    2305           0 :       saturating = true;
    +    2306             :     }
    +    2307       70716 :     if (mpc_u(2) > max_snap_z * 1.01) {
    +    2308           0 :       ROS_WARN_STREAM_THROTTLE(0.1, "[MpcTracker]: saturating snap Z: " << mpc_u(2));
    +    2309           0 :       mpc_u(2)   = max_snap_z;
    +    2310           0 :       saturating = true;
    +    2311             :     }
    +    2312       70716 :     if (mpc_u(2) < -min_snap_z * 1.01) {
    +    2313           0 :       ROS_WARN_STREAM_THROTTLE(0.1, "[MpcTracker]: saturating snap Z: " << mpc_u(2));
    +    2314           0 :       mpc_u(2)   = -min_snap_z;
    +    2315           0 :       saturating = true;
    +    2316             :     }
    +    2317             : 
    +    2318       70716 :     if (saturating) {
    +    2319           0 :       debugPrintState(0.1);
    +    2320           0 :       debugPrintMPCResult(0.1);
    +    2321             :     }
    +    2322             :   }
    +    2323             : 
    +    2324             :   {
    +    2325       70716 :     std::scoped_lock lock(mutex_mpc_u_);
    +    2326             : 
    +    2327       70716 :     mpc_u_         = mpc_u;
    +    2328       70716 :     mpc_u_heading_ = mpc_u_heading;
    +    2329             :   }
    +    2330             : 
    +    2331       70716 :   double mpc_solver_time = (ros::Time::now() - time_begin).toSec();
    +    2332       70716 :   if (mpc_solver_time > dt1 || iters_x > _max_iters_xy_ || iters_y > _max_iters_xy_ || iters_z > _max_iters_z_ || iters_heading > _max_iters_heading_) {
    +    2333           0 :     ROS_DEBUG_STREAM_THROTTLE(1.0, "[MpcTracker]: Total MPC solver time: " << mpc_solver_time << " iters X: " << iters_x << "/" << _max_iters_xy_
    +    2334             :                                                                            << " iters Y:  " << iters_y << "/" << _max_iters_xy_ << " iters Z: " << iters_z
    +    2335             :                                                                            << "/" << _max_iters_z_ << " iters heading: " << iters_heading << "/"
    +    2336             :                                                                            << _max_iters_heading_);
    +    2337             :   }
    +    2338             : 
    +    2339       70716 :   future_was_predicted_ = true;
    +    2340             : 
    +    2341             :   // | ------------- breaking for the next iteration ------------ |
    +    2342             : 
    +    2343      135453 :   if (drs_params.braking_enabled && (std::abs(des_x_filtered(MPC_HORIZON_LENGTH - 6) - des_x_filtered(MPC_HORIZON_LENGTH - 1)) <= 0.1) &&
    +    2344      125080 :       (std::abs(des_y_filtered(MPC_HORIZON_LENGTH - 6) - des_y_filtered(MPC_HORIZON_LENGTH - 1)) <= 0.1) &&
    +    2345      201775 :       (std::abs(des_z_filtered(MPC_HORIZON_LENGTH - 6) - des_z_filtered(MPC_HORIZON_LENGTH - 1)) <= 0.1) &&
    +    2346       58743 :       (std::abs(radians::diff(des_heading_trajectory(MPC_HORIZON_LENGTH - 6), des_heading_trajectory(MPC_HORIZON_LENGTH - 1))) <= 0.1)) {
    +    2347             : 
    +    2348       58608 :     brake_ = true;
    +    2349       58608 :     ROS_DEBUG_THROTTLE(1.0, "[MpcTracker]: braking");
    +    2350             : 
    +    2351             :   } else {
    +    2352       12108 :     brake_ = false;
    +    2353             :   }
    +    2354             : 
    +    2355             :   /* publish mpc reference //{ */
    +    2356             : 
    +    2357             :   {
    +    2358      141432 :     geometry_msgs::PoseArray debug_trajectory_out;
    +    2359       70716 :     debug_trajectory_out.header.stamp    = ros::Time::now();
    +    2360       70716 :     debug_trajectory_out.header.frame_id = uav_state_.header.frame_id;
    +    2361             : 
    +    2362             :     {
    +    2363      141432 :       std::scoped_lock lock(mutex_predicted_trajectory_);
    +    2364             : 
    +    2365     2899356 :       for (int i = 0; i < MPC_HORIZON_LENGTH; i++) {
    +    2366             : 
    +    2367     2828640 :         geometry_msgs::Pose new_pose;
    +    2368             : 
    +    2369     2828640 :         new_pose.position.x = des_x_filtered(i, 0);
    +    2370     2828640 :         new_pose.position.y = des_y_filtered(i, 0);
    +    2371     2828640 :         new_pose.position.z = des_z_filtered(i, 0);
    +    2372             : 
    +    2373     2828640 :         new_pose.orientation = mrs_lib::AttitudeConverter(0, 0, des_heading_trajectory(i));
    +    2374             : 
    +    2375     2828640 :         debug_trajectory_out.poses.push_back(new_pose);
    +    2376             :       }
    +    2377             :     }
    +    2378             : 
    +    2379       70716 :     ph_mpc_reference_debugging_.publish(debug_trajectory_out);
    +    2380             :   }
    +    2381             : 
    +    2382             :   //}
    +    2383             : }
    +    2384             : 
    +    2385             : //}
    +    2386             : 
    +    2387             : /* iterateModel() //{ */
    +    2388             : 
    +    2389       64564 : void MpcTracker::iterateModel(const double& dt) {
    +    2390             : 
    +    2391       64564 :   auto dt1 = mrs_lib::get_mutexed(mutex_dt1_, dt1_);
    +    2392             : 
    +    2393       64564 :   if (model_first_iteration_) {
    +    2394             : 
    +    2395          82 :     model_iteration_last_time_ = ros::Time::now();
    +    2396          82 :     model_first_iteration_     = false;
    +    2397             : 
    +    2398             :   } else {
    +    2399             : 
    +    2400       64482 :     dt1 = 0.9 * dt1 + 0.1 * dt;
    +    2401             : 
    +    2402       64482 :     mrs_lib::set_mutexed(mutex_dt1_, dt1, dt1_);
    +    2403       64482 :     timer_mpc_iteration_.setPeriod(ros::Duration(dt1), false);
    +    2404             : 
    +    2405             :     // clang-format off
    +    2406       64482 :     A_ << 1, dt1, 0.5*dt1*dt1, 0,           0, 0,   0,           0,           0, 0,   0,           0,
    +    2407       64482 :           0, 1,   dt1,         0.5*dt1*dt1, 0, 0,   0,           0,           0, 0,   0,           0,
    +    2408       64482 :           0, 0,   1,           dt1,         0, 0,   0,           0,           0, 0,   0,           0,
    +    2409       64482 :           0, 0,   0,           1,           0, 0,   0,           0,           0, 0,   0,           0,
    +    2410       64482 :           0, 0,   0,           0,           1, dt1, 0.5*dt1*dt1, 0,           0, 0,   0,           0,
    +    2411       64482 :           0, 0,   0,           0,           0, 1,   dt1,         0.5*dt1*dt1, 0, 0,   0,           0,
    +    2412       64482 :           0, 0,   0,           0,           0, 0,   1,           dt1,         0, 0,   0,           0,
    +    2413       64482 :           0, 0,   0,           0,           0, 0,   0,           1,           0, 0,   0,           0,
    +    2414       64482 :           0, 0,   0,           0,           0, 0,   0,           0,           1, dt1, 0.5*dt1*dt1, 0,
    +    2415       64482 :           0, 0,   0,           0,           0, 0,   0,           0,           0, 1,   dt1,         0.5*dt1*dt1,
    +    2416       64482 :           0, 0,   0,           0,           0, 0,   0,           0,           0, 0,   1,           dt1,
    +    2417       64482 :           0, 0,   0,           0,           0, 0,   0,           0,           0, 0,   0,           1;
    +    2418             : 
    +    2419       64482 :       B_ << 0,   0,   0,
    +    2420       64482 :             0,   0,   0,
    +    2421       64482 :             0,   0,   0,
    +    2422       64482 :             dt1, 0,   0,
    +    2423       64482 :             0,   0,   0,
    +    2424       64482 :             0,   0,   0,
    +    2425       64482 :             0,   0,   0,
    +    2426       64482 :             0,   dt1, 0,
    +    2427       64482 :             0,   0,   0,
    +    2428       64482 :             0,   0,   0,
    +    2429       64482 :             0,   0,   0,
    +    2430       64482 :             0,   0,   dt1;
    +    2431             : 
    +    2432       64482 :       A_heading_ << 1, dt1, 0.5*dt1*dt1, 0,
    +    2433       64482 :                     0, 1,   dt1,         0.5*dt1*dt1,
    +    2434       64482 :                     0, 0,   1,           dt1,
    +    2435       64482 :                     0, 0,   0,           1;
    +    2436             : 
    +    2437       64482 :       B_heading_ << 0,
    +    2438       64482 :                     0,
    +    2439      128964 :                     0,
    +    2440       64482 :                     dt1;
    +    2441             : 
    +    2442       64482 :     model_iteration_last_time_ = ros::Time::now();
    +    2443             :   }
    +    2444             : 
    +    2445             :   {
    +    2446      129128 :     auto [mpc_x, mpc_x_heading] = mrs_lib::get_mutexed(mutex_mpc_x_, mpc_x_, mpc_x_heading_);
    +    2447      129128 :     auto [mpc_u, mpc_u_heading] = mrs_lib::get_mutexed(mutex_mpc_u_, mpc_u_, mpc_u_heading_);
    +    2448             : 
    +    2449      129128 :     MatrixXd new_mpc_x         = A_ * mpc_x + B_ * mpc_u;
    +    2450      129128 :     MatrixXd new_mpc_x_heading = A_heading_ * mpc_x_heading + B_heading_ * mpc_u_heading;
    +    2451             : 
    +    2452             :     // | --------------- check the state difference --------------- |
    +    2453             :     {
    +    2454       64564 :       auto constraints = mrs_lib::get_mutexed(mutex_constraints_, constraints_);
    +    2455             : 
    +    2456       64564 :       bool problem = false;
    +    2457             : 
    +    2458             :       // position
    +    2459             : 
    +    2460       64564 :       if (fabs((new_mpc_x(0) - mpc_x(0)) / dt1) > 1.05 * constraints.horizontal_speed) {
    +    2461           0 :         ROS_DEBUG("[MpcTracker]: horizontal pos x update violates constraints: %.2f -> %.2f = %.2f, > %.2f", mpc_x(0), new_mpc_x(0),
    +    2462             :                   fabs((new_mpc_x(0) - mpc_x(0)) / dt1), constraints.horizontal_speed);
    +    2463           0 :         problem = true;
    +    2464             :       }
    +    2465             : 
    +    2466       64564 :       if (fabs((new_mpc_x(4) - mpc_x(4)) / dt1) > 1.05 * constraints.horizontal_speed) {
    +    2467           0 :         ROS_DEBUG("[MpcTracker]: horizontal pos y update violates constraints: %.2f -> %.2f = %.2f, > %.2f", mpc_x(4), new_mpc_x(4),
    +    2468             :                   fabs((new_mpc_x(4) - mpc_x(4)) / dt1), constraints.horizontal_speed);
    +    2469           0 :         problem = true;
    +    2470             :     }
    +    2471             : 
    +    2472       64564 :       if (((new_mpc_x(8) - mpc_x(8)) / dt1) > 1.05 * constraints.vertical_ascending_speed) {
    +    2473           0 :         ROS_DEBUG("[MpcTracker]: vertical pos z update violates constraints: %.2f -> %.2f = %.2f, > %.2f", mpc_x(8), new_mpc_x(8),
    +    2474             :                   ((new_mpc_x(8) - mpc_x(8)) / dt1), constraints.vertical_ascending_speed);
    +    2475           0 :         problem = true;
    +    2476             :       }
    +    2477             : 
    +    2478       64564 :       if (((new_mpc_x(8) - mpc_x(8)) / dt1) < 1.05 * -constraints.vertical_descending_speed) {
    +    2479           0 :         ROS_DEBUG("[MpcTracker]: vertical pos z update violates constraints: %.2f -> %.2f = %.2f, < %.2f", mpc_x(8), new_mpc_x(8),
    +    2480             :                   ((new_mpc_x(8) - mpc_x(8)) / dt1), -constraints.vertical_descending_speed);
    +    2481           0 :         problem = true;
    +    2482             :       }
    +    2483             : 
    +    2484             :       /* if (fabs(radians::diff(new_mpc_x_heading(0), mpc_x_heading(0)) / dt1) > 1.2 * constraints.heading_speed) { */
    +    2485             :       /*   ROS_DEBUG("[MpcTracker]: heading update violates constraints: %.2f -> %.2f = %.2f, > %.2f", mpc_x_heading(0), new_mpc_x_heading(0), */
    +    2486             :       /*             fabs(radians::diff(new_mpc_x_heading(0), mpc_x_heading(0)) / dt1), constraints.heading_speed); */
    +    2487             :       /*   problem = true; */
    +    2488             :       /* } */
    +    2489             : 
    +    2490             :       // velocity
    +    2491             : 
    +    2492       64564 :       if (fabs((new_mpc_x(1) - mpc_x(1)) / dt1) > 1.05 * constraints.horizontal_acceleration) {
    +    2493           0 :         ROS_DEBUG("[MpcTracker]: horizontal vel x update violates constraints: %.2f -> %.2f = %.2f, > %.2f", mpc_x(1), new_mpc_x(1),
    +    2494             :                   fabs((new_mpc_x(1) - mpc_x(1)) / dt1), constraints.horizontal_acceleration);
    +    2495           0 :         problem = true;
    +    2496             :       }
    +    2497             : 
    +    2498       64564 :       if (fabs((new_mpc_x(5) - mpc_x(5)) / dt1) > 1.05 * constraints.horizontal_acceleration) {
    +    2499           0 :         ROS_DEBUG("[MpcTracker]: horizontal vel y update violates constraints: %.2f -> %.2f = %.2f, > %.2f", mpc_x(5), new_mpc_x(5),
    +    2500             :                   fabs((new_mpc_x(5) - mpc_x(5)) / dt1), constraints.horizontal_acceleration);
    +    2501           0 :         problem = true;
    +    2502             :       }
    +    2503             : 
    +    2504       64564 :       if (((new_mpc_x(9) - mpc_x(9)) / dt1) > 1.05 * constraints.vertical_ascending_acceleration) {
    +    2505           0 :         ROS_DEBUG("[MpcTracker]: vertical vel z update violates constraints: %.2f -> %.2f = %.2f, > %.2f", mpc_x(9), new_mpc_x(9),
    +    2506             :                   ((new_mpc_x(9) - mpc_x(9)) / dt1), constraints.vertical_ascending_acceleration);
    +    2507           0 :         problem = true;
    +    2508             :       }
    +    2509             : 
    +    2510       64564 :       if (((new_mpc_x(9) - mpc_x(9)) / dt1) < 1.05 * -constraints.vertical_descending_acceleration) {
    +    2511           0 :         ROS_DEBUG("[MpcTracker]: vertical vel z update violates constraints: %.2f -> %.2f = %.2f, < %.2f", mpc_x(9), new_mpc_x(9),
    +    2512             :                   ((new_mpc_x(9) - mpc_x(9)) / dt1), -constraints.vertical_descending_acceleration);
    +    2513           0 :         problem = true;
    +    2514             :       }
    +    2515             : 
    +    2516             :       // acceleration
    +    2517             : 
    +    2518       64564 :       if (fabs((new_mpc_x(2) - mpc_x(2)) / dt1) > 1.05 * constraints.horizontal_jerk) {
    +    2519           0 :         ROS_DEBUG("[MpcTracker]: horizontal acc x update violates constraints: %.2f -> %.2f = %.2f, > %.2f", mpc_x(2), new_mpc_x(2),
    +    2520             :                   fabs((new_mpc_x(2) - mpc_x(2)) / dt1), constraints.horizontal_jerk);
    +    2521           0 :         problem = true;
    +    2522             :       }
    +    2523             : 
    +    2524       64564 :       if (fabs((new_mpc_x(6) - mpc_x(6)) / dt1) > 1.05 * constraints.horizontal_jerk) {
    +    2525           0 :         ROS_DEBUG("[MpcTracker]: horizontal acc y update violates constraints: %.2f -> %.2f, = %.2f > %.2f", mpc_x(6), new_mpc_x(6),
    +    2526             :                   fabs((new_mpc_x(6) - mpc_x(6)) / dt1), constraints.horizontal_jerk);
    +    2527           0 :         problem = true;
    +    2528             :       }
    +    2529             : 
    +    2530       64564 :       if (((new_mpc_x(10) - mpc_x(10)) / dt1) > 1.05 * constraints.vertical_ascending_jerk) {
    +    2531           0 :         ROS_DEBUG("[MpcTracker]: vertical acc z update violates constraints: %.2f -> %.2f = %.2f, > %.2f", mpc_x(10), new_mpc_x(10),
    +    2532             :                   ((new_mpc_x(10) - mpc_x(10)) / dt1), constraints.vertical_ascending_jerk);
    +    2533           0 :         problem = true;
    +    2534             :       }
    +    2535             : 
    +    2536       64564 :       if (((new_mpc_x(10) - mpc_x(10)) / dt1) < 1.05 * -constraints.vertical_descending_jerk) {
    +    2537           0 :         ROS_DEBUG("[MpcTracker]: vertical acc z update violates constraints: %.2f -> %.2f = %.2f, < %.2f", mpc_x(10), new_mpc_x(10),
    +    2538             :                   ((new_mpc_x(10) - mpc_x(10)) / dt1), -constraints.vertical_descending_jerk);
    +    2539           0 :         problem = true;
    +    2540             :       }
    +    2541             : 
    +    2542             :       // jerk
    +    2543             : 
    +    2544       64564 :       if (fabs((new_mpc_x(3) - mpc_x(3)) / dt1) > 1.05 * constraints.horizontal_snap) {
    +    2545           0 :         ROS_DEBUG("[MpcTracker]: horizontal jerk x update violates constraints: %.2f -> %.2f = %.2f, > %.2f", mpc_x(3), new_mpc_x(3),
    +    2546             :                   fabs((new_mpc_x(3) - mpc_x(3)) / dt1), constraints.horizontal_snap);
    +    2547           0 :         problem = true;
    +    2548             :       }
    +    2549             : 
    +    2550       64564 :       if (fabs((new_mpc_x(7) - mpc_x(7)) / dt1) > 1.05 * constraints.horizontal_snap) {
    +    2551           0 :         ROS_DEBUG("[MpcTracker]: horizontal jerk y update violates constraints: %.2f -> %.2f = %.2f, > %.2f", mpc_x(7), new_mpc_x(7),
    +    2552             :                   fabs((new_mpc_x(7) - mpc_x(7)) / dt1), constraints.horizontal_snap);
    +    2553           0 :         problem = true;
    +    2554             :       }
    +    2555             : 
    +    2556       64564 :       if (((new_mpc_x(11) - mpc_x(11)) / dt1) > 1.05 * constraints.vertical_ascending_snap) {
    +    2557           0 :         ROS_DEBUG("[MpcTracker]: vertical jerk z update violates constraints: %.2f -> %.2f = %.2f, > %.2f", mpc_x(11), new_mpc_x(11),
    +    2558             :                   ((new_mpc_x(11) - mpc_x(11)) / dt1), constraints.vertical_ascending_snap);
    +    2559           0 :         problem = true;
    +    2560             :       }
    +    2561             : 
    +    2562       64564 :       if (((new_mpc_x(11) - mpc_x(11)) / dt1) < 1.05 * -constraints.vertical_descending_snap) {
    +    2563           0 :         ROS_DEBUG("[MpcTracker]: vertical jerk z update violates constraints: %.2f -> %.2f = %.2f, < %.2f", mpc_x(11), new_mpc_x(11),
    +    2564             :                   ((new_mpc_x(11) - mpc_x(11)) / dt1), -constraints.vertical_descending_snap);
    +    2565           0 :         problem = true;
    +    2566             :       }
    +    2567             : 
    +    2568       64564 :       if (problem) {
    +    2569           0 :         debugPrintState(0.001);
    +    2570           0 :         debugPrintMPCResult(0.001);
    +    2571             :       }
    +    2572             :     }
    +    2573             : 
    +    2574             :     {
    +    2575       64564 :       std::scoped_lock lock(mutex_mpc_x_);
    +    2576             : 
    +    2577       64564 :       mpc_x_         = new_mpc_x;
    +    2578       64564 :       mpc_x_heading_ = new_mpc_x_heading;
    +    2579             : 
    +    2580       64564 :       mpc_x_heading_(0) = sradians::wrap(mpc_x_heading_(0));
    +    2581             :     }
    +    2582             :   }
    +    2583       64564 : }
    +    2584             : 
    +    2585             : //}
    +    2586             : 
    +    2587             : // | -------------------- referece setting -------------------- |
    +    2588             : 
    +    2589             : /* //{ loadTrajectory() */
    +    2590             : 
    +    2591             : // method for setting desired trajectory
    +    2592         498 : std::tuple<bool, std::string, bool> MpcTracker::loadTrajectory(const mrs_msgs::TrajectoryReference msg) {
    +    2593             : 
    +    2594         498 :   auto dt1 = mrs_lib::get_mutexed(mutex_dt1_, dt1_);
    +    2595             : 
    +    2596             :   // copy the member variables
    +    2597         996 :   auto x         = mrs_lib::get_mutexed(mutex_mpc_x_, mpc_x_);
    +    2598         996 :   auto uav_state = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +    2599             : 
    +    2600         996 :   std::stringstream ss;
    +    2601             : 
    +    2602             :   /* check the trajectory dt //{ */
    +    2603             : 
    +    2604             :   double trajectory_dt;
    +    2605         498 :   if (msg.dt <= 1e-4) {
    +    2606           0 :     trajectory_dt = 0.2;
    +    2607           0 :     ROS_WARN_THROTTLE(10.0, "[MpcTracker]: the trajectory dt was not specified, assuming its the old 0.2 s");
    +    2608         498 :   } else if (msg.dt < dt1) {
    +    2609           0 :     trajectory_dt = 0.2;
    +    2610           0 :     ss << std::setprecision(3) << "the trajectory dt (" << msg.dt << " s) is too small (smaller than the tracker's internal step size: " << dt1 << " s)";
    +    2611           0 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[MpcTracker]: " << ss.str());
    +    2612           0 :     return std::tuple(false, ss.str(), false);
    +    2613             :   } else {
    +    2614         498 :     trajectory_dt = msg.dt;
    +    2615             :   }
    +    2616             : 
    +    2617             :   //}
    +    2618             : 
    +    2619         498 :   int trajectory_size = msg.points.size();
    +    2620             : 
    +    2621             :   /* sanitize the time-ness of the trajectory //{ */
    +    2622             : 
    +    2623         498 :   int    trajectory_sample_offset    = 0;  // how many samples in past is the trajectory
    +    2624         498 :   int    trajectory_subsample_offset = 0;  // how many simulation inner loops ahead of the first valid sample
    +    2625         498 :   double trajectory_time_offset      = 0;  // how much time in past in [s]
    +    2626             : 
    +    2627             :   // btw, "trajectory_time_offset = trajectory_dt*trajectory_sample_offset + _dt1_*trajectory_subsample_offset" should hold
    +    2628         498 :   if (msg.fly_now) {
    +    2629             : 
    +    2630         497 :     ros::Time trajectory_time = msg.header.stamp;
    +    2631             : 
    +    2632             :     // the desired time is 0 => the current time
    +    2633             :     // the trajecoty is a single point => the current time
    +    2634         497 :     if (trajectory_time == ros::Time(0) || int(msg.points.size()) == 1) {
    +    2635             : 
    +    2636           2 :       trajectory_time_offset = 0.0;
    +    2637             : 
    +    2638             :       // the desired time is specified
    +    2639             :     } else {
    +    2640             : 
    +    2641         495 :       trajectory_time_offset = (ros::Time::now() - trajectory_time).toSec();
    +    2642             : 
    +    2643             :       // when the time offset is negative, thus in the future
    +    2644             :       // just say it, but use it like its from the current time
    +    2645         495 :       if (trajectory_time_offset < 0.0) {
    +    2646             : 
    +    2647           0 :         ROS_WARN_THROTTLE(1.0, "[MpcTracker]: received trajectory with timestamp in the future by %.3f s", -trajectory_time_offset);
    +    2648             : 
    +    2649           0 :         trajectory_time_offset = 0.0;
    +    2650             :       }
    +    2651             :     }
    +    2652             : 
    +    2653             :     // if the time offset is set, check if we need to "move the first idx"
    +    2654         497 :     if (trajectory_time_offset > 0.0) {
    +    2655             : 
    +    2656             :       // calculate the offset in samples
    +    2657           1 :       trajectory_sample_offset = int(floor(trajectory_time_offset / trajectory_dt));
    +    2658             : 
    +    2659             :       // and get the subsample offset, which will be used to initialize the interpolator
    +    2660           1 :       trajectory_subsample_offset = int(floor(fmod(trajectory_time_offset, trajectory_dt) / dt1));
    +    2661             : 
    +    2662           1 :       ROS_DEBUG_THROTTLE(0.1, "[MpcTracker]: received trajectory with timestamp in the past by %.3f s",
    +    2663             :                          trajectory_dt * trajectory_sample_offset + dt1 * trajectory_subsample_offset);
    +    2664             : 
    +    2665             :       // if the offset is larger than the number of points in the trajectory
    +    2666             :       // the trajectory can not be used
    +    2667           1 :       if (trajectory_sample_offset >= trajectory_size) {
    +    2668             : 
    +    2669           0 :         ss << "trajectory timestamp is too old (time difference = " << trajectory_time_offset << ")";
    +    2670           0 :         ROS_ERROR_STREAM_THROTTLE(1.0, "[MpcTracker]: " << ss.str());
    +    2671           0 :         return std::tuple(false, ss.str(), false);
    +    2672             : 
    +    2673             :       } else {
    +    2674             : 
    +    2675             :         // if the offset is larger than one trajectory sample,
    +    2676             :         // offset the start
    +    2677           1 :         if (trajectory_time_offset >= trajectory_dt) {
    +    2678             : 
    +    2679             :           // decrease the trajectory size
    +    2680           0 :           trajectory_size -= trajectory_sample_offset;
    +    2681             : 
    +    2682           0 :           ROS_DEBUG_THROTTLE(0.1, "[MpcTracker]: offsetting trajectory by %d samples", trajectory_sample_offset);
    +    2683             : 
    +    2684             :         } else {
    +    2685             : 
    +    2686           1 :           trajectory_sample_offset = 0;
    +    2687             :         }
    +    2688             :       }
    +    2689             :     }
    +    2690             : 
    +    2691             :   } else { // not fly_now
    +    2692             : 
    +    2693           1 :       trajectory_tracking_in_progress_ = false;
    +    2694             :   }
    +    2695             : 
    +    2696             :   //}
    +    2697             : 
    +    2698         498 :   ROS_DEBUG_THROTTLE(1.0, "[MpcTracker]: trajectory sample offset: %d", trajectory_sample_offset);
    +    2699         498 :   ROS_DEBUG_THROTTLE(1.0, "[MpcTracker]: trajectory subsample offset: %d", trajectory_subsample_offset);
    +    2700             : 
    +    2701             :   // after this, we should have the correct value of
    +    2702             :   // * trajectory_size
    +    2703             :   // * trajectory_sample_offset
    +    2704             :   // * trajectory_subsample_offset
    +    2705             : 
    +    2706             :   /* copy the trajectory to a local variable //{ */
    +    2707             : 
    +    2708             :   // copy only the part from the first valid index
    +    2709             : 
    +    2710         996 :   MatrixXd des_x_whole_trajectory       = VectorXd::Zero(trajectory_size + MPC_HORIZON_LENGTH, 1);
    +    2711         996 :   MatrixXd des_y_whole_trajectory       = VectorXd::Zero(trajectory_size + MPC_HORIZON_LENGTH, 1);
    +    2712         996 :   MatrixXd des_z_whole_trajectory       = VectorXd::Zero(trajectory_size + MPC_HORIZON_LENGTH, 1);
    +    2713         996 :   MatrixXd des_heading_whole_trajectory = VectorXd::Zero(trajectory_size + MPC_HORIZON_LENGTH, 1);
    +    2714             : 
    +    2715       25778 :   for (int i = 0; i < trajectory_size; i++) {
    +    2716             : 
    +    2717       25280 :     des_x_whole_trajectory(i)       = msg.points[trajectory_sample_offset + i].position.x;
    +    2718       25280 :     des_y_whole_trajectory(i)       = msg.points[trajectory_sample_offset + i].position.y;
    +    2719       25280 :     des_z_whole_trajectory(i)       = msg.points[trajectory_sample_offset + i].position.z;
    +    2720       25280 :     des_heading_whole_trajectory(i) = msg.points[trajectory_sample_offset + i].heading;
    +    2721             :   }
    +    2722             : 
    +    2723             :   //}
    +    2724             : 
    +    2725             :   /* set looping //{ */
    +    2726             : 
    +    2727         498 :   bool loop = false;
    +    2728             : 
    +    2729         498 :   if (msg.loop) {
    +    2730             : 
    +    2731           0 :     double first_x = des_x_whole_trajectory(0);
    +    2732           0 :     double first_y = des_y_whole_trajectory(0);
    +    2733           0 :     double first_z = des_z_whole_trajectory(0);
    +    2734           0 :     double first_hdg = des_heading_whole_trajectory(0);
    +    2735             : 
    +    2736           0 :     double last_x = des_x_whole_trajectory(trajectory_size - 1);
    +    2737           0 :     double last_y = des_y_whole_trajectory(trajectory_size - 1);
    +    2738           0 :     double last_z = des_z_whole_trajectory(trajectory_size - 1);
    +    2739           0 :     double last_hdg = des_heading_whole_trajectory(trajectory_size - 1);
    +    2740             : 
    +    2741             :     // check whether the trajectory is loopable
    +    2742           0 :     if (mrs_lib::geometry::dist(vec3_t(first_x, first_y, first_z), vec3_t(last_x, last_y, last_z)) < 1.0 && abs(sradians::diff(first_hdg, last_hdg)) < 0.2) {
    +    2743             : 
    +    2744           0 :       ROS_INFO_THROTTLE(1.0, "[MpcTracker]: looping enabled");
    +    2745           0 :       loop = true;
    +    2746             : 
    +    2747             :     } else {
    +    2748             : 
    +    2749           0 :       ss << "can not loop trajectory, the first and last points are too far apart";
    +    2750           0 :       ROS_WARN_STREAM_THROTTLE(1.0, "[MpcTracker]: " << ss.str());
    +    2751           0 :       return std::tuple(false, ss.str(), false);
    +    2752             :     }
    +    2753             : 
    +    2754             :   } else {
    +    2755             : 
    +    2756         498 :     loop = false;
    +    2757             :   }
    +    2758             : 
    +    2759             :   //}
    +    2760             : 
    +    2761             :   // by this time, the values of these should be set:
    +    2762             :   // * loop
    +    2763             : 
    +    2764             :   /* add tail (the last point repeated to fill the prediction horizon) //{ */
    +    2765             : 
    +    2766         498 :   if (!loop) {
    +    2767             : 
    +    2768             :     // extend it so it has smooth ending
    +    2769       20418 :     for (int i = 0; i < MPC_HORIZON_LENGTH; i++) {
    +    2770             : 
    +    2771       19920 :       des_x_whole_trajectory(i + trajectory_size)       = des_x_whole_trajectory(i + trajectory_size - 1);
    +    2772       19920 :       des_y_whole_trajectory(i + trajectory_size)       = des_y_whole_trajectory(i + trajectory_size - 1);
    +    2773       19920 :       des_z_whole_trajectory(i + trajectory_size)       = des_z_whole_trajectory(i + trajectory_size - 1);
    +    2774       19920 :       des_heading_whole_trajectory(i + trajectory_size) = des_heading_whole_trajectory(i + trajectory_size - 1);
    +    2775             :     }
    +    2776             :   }
    +    2777             : 
    +    2778             :   //}
    +    2779             : 
    +    2780             :   // by this time, the values of these should be set correctly:
    +    2781             :   // * trajectory_size
    +    2782             :   // * des_x_whole_trajectory
    +    2783             :   // * des_y_whole_trajectory
    +    2784             :   // * des_z_whole_trajectory
    +    2785             :   // * des_heading_whole_trajectory
    +    2786             : 
    +    2787             :   /* update the global variables //{ */
    +    2788             : 
    +    2789             :   {
    +    2790         996 :     std::scoped_lock lock(mutex_des_whole_trajectory_, mutex_des_trajectory_, mutex_trajectory_tracking_states_);
    +    2791             : 
    +    2792         498 :     des_whole_trajectory_id_ = msg.input_id;
    +    2793             : 
    +    2794         498 :     auto mpc_x_heading = mrs_lib::get_mutexed(mutex_mpc_x_, mpc_x_heading_);
    +    2795             : 
    +    2796         498 :     trajectory_tracking_in_progress_ = msg.fly_now;
    +    2797         498 :     trajectory_track_heading_        = msg.use_heading;
    +    2798             : 
    +    2799             :     // allocate the vectors
    +    2800         498 :     des_x_whole_trajectory_       = std::make_shared<VectorXd>(trajectory_size + MPC_HORIZON_LENGTH, 1);
    +    2801         498 :     des_y_whole_trajectory_       = std::make_shared<VectorXd>(trajectory_size + MPC_HORIZON_LENGTH, 1);
    +    2802         498 :     des_z_whole_trajectory_       = std::make_shared<VectorXd>(trajectory_size + MPC_HORIZON_LENGTH, 1);
    +    2803         498 :     des_heading_whole_trajectory_ = std::make_shared<VectorXd>(trajectory_size + MPC_HORIZON_LENGTH, 1);
    +    2804             : 
    +    2805       45698 :     for (int i = 0; i < trajectory_size + MPC_HORIZON_LENGTH; i++) {
    +    2806             : 
    +    2807       45200 :       (*des_x_whole_trajectory_)(i) = des_x_whole_trajectory(i);
    +    2808       45200 :       (*des_y_whole_trajectory_)(i) = des_y_whole_trajectory(i);
    +    2809       45200 :       (*des_z_whole_trajectory_)(i) = des_z_whole_trajectory(i);
    +    2810             : 
    +    2811       45200 :       if (trajectory_track_heading_) {
    +    2812       45200 :         (*des_heading_whole_trajectory_)(i) = des_heading_whole_trajectory(i);
    +    2813             :       } else {
    +    2814           0 :         (*des_heading_whole_trajectory_).fill(mpc_x_heading(0, 0));
    +    2815             :       }
    +    2816             :     }
    +    2817             : 
    +    2818             :     // if we are tracking trajectory, copy the setpoint
    +    2819         498 :     if (trajectory_tracking_in_progress_) {
    +    2820             : 
    +    2821         497 :       toggleHover(false);
    +    2822             : 
    +    2823             :       /* interpolate the trajectory points and fill in the desired_trajectory vector //{ */
    +    2824             : 
    +    2825       20377 :       for (int i = 0; i < MPC_HORIZON_LENGTH; i++) {
    +    2826             : 
    +    2827       19880 :         double first_time = dt1 + i * _dt2_ + trajectory_subsample_offset * dt1;
    +    2828             : 
    +    2829       19880 :         int first_idx  = floor(first_time / trajectory_dt);
    +    2830       19880 :         int second_idx = first_idx + 1;
    +    2831             : 
    +    2832       19880 :         double interp_coeff = std::fmod(first_time / trajectory_dt, 1.0);
    +    2833             : 
    +    2834       19880 :         if (trajectory_tracking_loop_) {
    +    2835             : 
    +    2836           0 :           if (second_idx >= trajectory_size) {
    +    2837           0 :             second_idx -= trajectory_size;
    +    2838             :           }
    +    2839             : 
    +    2840           0 :           if (first_idx >= trajectory_size) {
    +    2841           0 :             first_idx -= trajectory_size;
    +    2842             :           }
    +    2843             :         } else {
    +    2844             : 
    +    2845       19880 :           if (second_idx >= trajectory_size) {
    +    2846           0 :             second_idx = trajectory_size - 1;
    +    2847             :           }
    +    2848             : 
    +    2849       19880 :           if (first_idx >= trajectory_size) {
    +    2850           0 :             first_idx = trajectory_size - 1;
    +    2851             :           }
    +    2852             :         }
    +    2853             : 
    +    2854       19880 :         des_x_trajectory_(i, 0) = (1 - interp_coeff) * des_x_whole_trajectory(first_idx) + interp_coeff * des_x_whole_trajectory(second_idx);
    +    2855       19880 :         des_y_trajectory_(i, 0) = (1 - interp_coeff) * des_y_whole_trajectory(first_idx) + interp_coeff * des_y_whole_trajectory(second_idx);
    +    2856       19880 :         des_z_trajectory_(i, 0) = (1 - interp_coeff) * des_z_whole_trajectory(first_idx) + interp_coeff * des_z_whole_trajectory(second_idx);
    +    2857             : 
    +    2858       19880 :         des_heading_trajectory_(i, 0) = sradians::interp(des_heading_whole_trajectory(first_idx), des_heading_whole_trajectory(second_idx), interp_coeff);
    +    2859             :       }
    +    2860             : 
    +    2861             :       //}
    +    2862             :     }
    +    2863             : 
    +    2864         498 :     trajectory_size_             = trajectory_size;
    +    2865         498 :     trajectory_current_time_     = 0;
    +    2866         498 :     trajectory_set_              = true;
    +    2867         498 :     trajectory_tracking_loop_    = loop;
    +    2868         498 :     trajectory_dt_               = trajectory_dt;
    +    2869         498 :     trajectory_count_++;
    +    2870             :   }
    +    2871             : 
    +    2872             :   //}
    +    2873             : 
    +    2874         498 :   ROS_INFO_THROTTLE(1, "[MpcTracker]: finished setting trajectory with length %d", trajectory_size);
    +    2875             : 
    +    2876             :   /* publish the debugging topics of the post-processed trajectory //{ */
    +    2877             : 
    +    2878             :   {
    +    2879             : 
    +    2880         996 :     geometry_msgs::PoseArray debug_trajectory_out;
    +    2881         498 :     debug_trajectory_out.header.stamp    = ros::Time::now();
    +    2882         498 :     debug_trajectory_out.header.frame_id = common_handlers_->transformer->resolveFrame(msg.header.frame_id);
    +    2883             : 
    +    2884             :     {
    +    2885         996 :       std::scoped_lock lock(mutex_des_whole_trajectory_);
    +    2886             : 
    +    2887       25778 :       for (int i = 0; i < trajectory_size; i++) {
    +    2888             : 
    +    2889       25280 :         geometry_msgs::Pose new_pose;
    +    2890             : 
    +    2891       25280 :         new_pose.position.x = (*des_x_whole_trajectory_)(i);
    +    2892       25280 :         new_pose.position.y = (*des_y_whole_trajectory_)(i);
    +    2893       25280 :         new_pose.position.z = (*des_z_whole_trajectory_)(i);
    +    2894             : 
    +    2895       25280 :         new_pose.orientation = mrs_lib::AttitudeConverter(0, 0, (*des_heading_whole_trajectory_)(i));
    +    2896             : 
    +    2897       25280 :         debug_trajectory_out.poses.push_back(new_pose);
    +    2898             :       }
    +    2899             :     }
    +    2900             : 
    +    2901         498 :     pub_debug_processed_trajectory_poses_.publish(debug_trajectory_out);
    +    2902             : 
    +    2903         996 :     visualization_msgs::MarkerArray msg_out;
    +    2904             : 
    +    2905         996 :     visualization_msgs::Marker marker;
    +    2906             : 
    +    2907         498 :     marker.header.stamp     = ros::Time::now();
    +    2908         498 :     marker.header.frame_id  = common_handlers_->transformer->resolveFrame(msg.header.frame_id);
    +    2909         498 :     marker.type             = visualization_msgs::Marker::LINE_LIST;
    +    2910         498 :     marker.color.a          = 1;
    +    2911         498 :     marker.scale.x          = 0.05;
    +    2912         498 :     marker.color.r          = 1;
    +    2913         498 :     marker.color.g          = 0;
    +    2914         498 :     marker.color.b          = 0;
    +    2915         498 :     marker.pose.orientation = mrs_lib::AttitudeConverter(0, 0, 0);
    +    2916             : 
    +    2917             :     {
    +    2918         996 :       std::scoped_lock lock(mutex_des_whole_trajectory_);
    +    2919             : 
    +    2920       25280 :       for (int i = 0; i < trajectory_size - 1; i++) {
    +    2921             : 
    +    2922       24782 :         geometry_msgs::Point point1;
    +    2923             : 
    +    2924       24782 :         point1.x = des_x_whole_trajectory(i);
    +    2925       24782 :         point1.y = des_y_whole_trajectory(i);
    +    2926       24782 :         point1.z = des_z_whole_trajectory(i);
    +    2927             : 
    +    2928       24782 :         marker.points.push_back(point1);
    +    2929             : 
    +    2930       24782 :         geometry_msgs::Point point2;
    +    2931             : 
    +    2932       24782 :         point2.x = des_x_whole_trajectory(i + 1);
    +    2933       24782 :         point2.y = des_y_whole_trajectory(i + 1);
    +    2934       24782 :         point2.z = des_z_whole_trajectory(i + 1);
    +    2935             : 
    +    2936       24782 :         marker.points.push_back(point2);
    +    2937             :       }
    +    2938             :     }
    +    2939             : 
    +    2940         498 :     msg_out.markers.push_back(marker);
    +    2941             : 
    +    2942         498 :     pub_debug_processed_trajectory_markers_.publish(msg_out);
    +    2943             :   }
    +    2944             : 
    +    2945             :   //}
    +    2946             : 
    +    2947         498 :   publishDiagnostics();
    +    2948             : 
    +    2949         996 :   return std::tuple(true, "trajectory loaded", false);
    +    2950             : }
    +    2951             : 
    +    2952             : //}
    +    2953             : 
    +    2954             : /* //{ setSinglePointReference() */
    +    2955             : 
    +    2956             : // fill the des_*_trajectory based on a single point
    +    2957         437 : void MpcTracker::setSinglePointReference(const double x, const double y, const double z, const double heading) {
    +    2958             : 
    +    2959         874 :   std::scoped_lock lock(mutex_des_trajectory_);
    +    2960             : 
    +    2961         437 :   des_x_trajectory_.fill(x);
    +    2962         437 :   des_y_trajectory_.fill(y);
    +    2963         437 :   des_z_trajectory_.fill(z);
    +    2964         437 :   des_heading_trajectory_.fill(heading);
    +    2965         437 : }
    +    2966             : 
    +    2967             : //}
    +    2968             : 
    +    2969             : /* //{ setGoal() */
    +    2970             : 
    +    2971             : // set absolute goal
    +    2972         263 : void MpcTracker::setGoal(const double pos_x, const double pos_y, const double pos_z, const double heading, const bool use_heading) {
    +    2973             : 
    +    2974         263 :   double desired_heading = sradians::wrap(heading);
    +    2975             : 
    +    2976         526 :   auto mpc_x_heading = mrs_lib::get_mutexed(mutex_mpc_x_, mpc_x_heading_);
    +    2977             : 
    +    2978         263 :   if (!use_heading) {
    +    2979           0 :     desired_heading = mpc_x_heading(0, 0);
    +    2980             :   }
    +    2981             : 
    +    2982         263 :   trajectory_tracking_in_progress_ = false;
    +    2983             : 
    +    2984         263 :   setSinglePointReference(pos_x, pos_y, pos_z, desired_heading);
    +    2985             : 
    +    2986         263 :   publishDiagnostics();
    +    2987         263 : }
    +    2988             : 
    +    2989             : //}
    +    2990             : 
    +    2991             : /* //{ setRelativeGoal() */
    +    2992             : 
    +    2993         174 : void MpcTracker::setRelativeGoal(const double pos_x, const double pos_y, const double pos_z, const double heading, const bool use_heading) {
    +    2994             : 
    +    2995         348 :   auto [mpc_x, mpc_x_heading] = mrs_lib::get_mutexed(mutex_mpc_x_, mpc_x_, mpc_x_heading_);
    +    2996             : 
    +    2997         174 :   double abs_x = mpc_x(0, 0) + pos_x;
    +    2998         174 :   double abs_y = mpc_x(4, 0) + pos_y;
    +    2999         174 :   double abs_z = mpc_x(8, 0) + pos_z;
    +    3000             : 
    +    3001         174 :   double abs_heading = mpc_x_heading(0, 0);
    +    3002             : 
    +    3003         174 :   if (use_heading) {
    +    3004           0 :     abs_heading += heading;
    +    3005             :   }
    +    3006             : 
    +    3007         174 :   trajectory_tracking_in_progress_ = false;
    +    3008             : 
    +    3009         174 :   setSinglePointReference(abs_x, abs_y, abs_z, abs_heading);
    +    3010             : 
    +    3011         174 :   publishDiagnostics();
    +    3012         174 : }
    +    3013             : 
    +    3014             : //}
    +    3015             : 
    +    3016             : /* toggleHover() //{ */
    +    3017             : 
    +    3018         940 : void MpcTracker::toggleHover(bool in) {
    +    3019             : 
    +    3020         940 :   if (in == false && hovering_in_progress_) {
    +    3021             : 
    +    3022          84 :     ROS_DEBUG("[MpcTracker]: stoppping the hover timer");
    +    3023             : 
    +    3024          84 :     timer_hover_.stop();
    +    3025             : 
    +    3026          84 :     hovering_in_progress_ = false;
    +    3027             : 
    +    3028         856 :   } else if (in == true && !hovering_in_progress_) {
    +    3029             : 
    +    3030          84 :     ROS_DEBUG("[MpcTracker]: starting the hover timer");
    +    3031             : 
    +    3032          84 :     hovering_in_progress_ = true;
    +    3033             : 
    +    3034          84 :     timer_hover_.start();
    +    3035             :   }
    +    3036         940 : }
    +    3037             : 
    +    3038             : //}
    +    3039             : 
    +    3040             : // | ------------------- trajectory tracking ------------------ |
    +    3041             : 
    +    3042             : /* startTrajectoryTrackingImpl() //{ */
    +    3043             : 
    +    3044           1 : std::tuple<bool, std::string> MpcTracker::startTrajectoryTrackingImpl(void) {
    +    3045             : 
    +    3046           2 :   std::stringstream ss;
    +    3047             : 
    +    3048           1 :   if (trajectory_set_) {
    +    3049             : 
    +    3050           1 :     toggleHover(false);
    +    3051             : 
    +    3052             :     {
    +    3053           1 :       std::scoped_lock lock(mutex_des_trajectory_);
    +    3054             : 
    +    3055           1 :       trajectory_tracking_in_progress_ = true;
    +    3056           1 :       trajectory_current_time_ = 0;
    +    3057             :     }
    +    3058             : 
    +    3059           1 :     publishDiagnostics();
    +    3060             : 
    +    3061           1 :     ss << "trajectory tracking started";
    +    3062           1 :     ROS_INFO_STREAM_THROTTLE(1.0, "[MpcTracker]: " << ss.str());
    +    3063             : 
    +    3064           1 :     return std::tuple(true, ss.str());
    +    3065             : 
    +    3066             :   } else {
    +    3067             : 
    +    3068           0 :     ss << "can not start trajectory tracking, the trajectory is not set";
    +    3069           0 :     ROS_WARN_STREAM_THROTTLE(1.0, "[MpcTracker]: " << ss.str());
    +    3070             : 
    +    3071           0 :     return std::tuple(false, ss.str());
    +    3072             :   }
    +    3073             : }
    +    3074             : 
    +    3075             : //}
    +    3076             : 
    +    3077             : /* resumeTrajectoryTrackingImpl() //{ */
    +    3078             : 
    +    3079           0 : std::tuple<bool, std::string> MpcTracker::resumeTrajectoryTrackingImpl(void) {
    +    3080             : 
    +    3081           0 :   std::stringstream ss;
    +    3082             : 
    +    3083           0 :   if (trajectory_set_) {
    +    3084             : 
    +    3085           0 :     toggleHover(false);
    +    3086             : 
    +    3087           0 :     int trajectory_tracking_idx = getCurrentTrajectoryIdx();
    +    3088             : 
    +    3089           0 :     if (trajectory_tracking_idx < (trajectory_size_ - 1)) {
    +    3090             : 
    +    3091             :       {
    +    3092           0 :         std::scoped_lock lock(mutex_des_trajectory_);
    +    3093             : 
    +    3094           0 :         trajectory_tracking_in_progress_ = true;
    +    3095             :       }
    +    3096             : 
    +    3097           0 :       ss << "trajectory tracking resumed";
    +    3098           0 :       ROS_INFO_STREAM_THROTTLE(1.0, "[MpcTracker]: " << ss.str());
    +    3099             : 
    +    3100           0 :       publishDiagnostics();
    +    3101             : 
    +    3102           0 :       return std::tuple(true, ss.str());
    +    3103             : 
    +    3104             :     } else {
    +    3105             : 
    +    3106           0 :       ss << "can not resume trajectory tracking, trajectory is already finished";
    +    3107           0 :       ROS_WARN_STREAM_THROTTLE(1.0, "[MpcTracker]: " << ss.str());
    +    3108             : 
    +    3109           0 :       return std::tuple(false, ss.str());
    +    3110             :     }
    +    3111             : 
    +    3112             :   } else {
    +    3113             : 
    +    3114           0 :     ss << "can not resume trajectory tracking, ther trajectory is not set";
    +    3115           0 :     ROS_WARN_STREAM_THROTTLE(1.0, "[MpcTracker]: " << ss.str());
    +    3116             : 
    +    3117           0 :     return std::tuple(false, ss.str());
    +    3118             :   }
    +    3119             : }
    +    3120             : 
    +    3121             : //}
    +    3122             : 
    +    3123             : /* stopTrajectoryTrackingImpl() //{ */
    +    3124             : 
    +    3125           0 : std::tuple<bool, std::string> MpcTracker::stopTrajectoryTrackingImpl(void) {
    +    3126             : 
    +    3127           0 :   std::stringstream ss;
    +    3128             : 
    +    3129           0 :   if (trajectory_tracking_in_progress_) {
    +    3130             : 
    +    3131           0 :     trajectory_tracking_in_progress_ = false;
    +    3132             : 
    +    3133           0 :     toggleHover(true);
    +    3134             : 
    +    3135           0 :     ss << "stopping trajectory tracking";
    +    3136           0 :     ROS_INFO_STREAM_THROTTLE(1.0, "[MpcTracker]: " << ss.str());
    +    3137             : 
    +    3138           0 :     publishDiagnostics();
    +    3139             : 
    +    3140             :   } else {
    +    3141             : 
    +    3142           0 :     ss << "can not stop trajectory tracking, already at stop";
    +    3143           0 :     ROS_INFO_STREAM_THROTTLE(1.0, "[MpcTracker]: " << ss.str());
    +    3144             :   }
    +    3145             : 
    +    3146           0 :   return std::tuple(true, ss.str());
    +    3147             : }
    +    3148             : 
    +    3149             : //}
    +    3150             : 
    +    3151             : /* gotoTrajectoryStartImpl() //{ */
    +    3152             : 
    +    3153           1 : std::tuple<bool, std::string> MpcTracker::gotoTrajectoryStartImpl(void) {
    +    3154             : 
    +    3155           2 :   std::stringstream ss;
    +    3156             : 
    +    3157           1 :   if (trajectory_set_) {
    +    3158             : 
    +    3159           1 :     toggleHover(false);
    +    3160             : 
    +    3161           1 :     trajectory_tracking_in_progress_ = false;
    +    3162             : 
    +    3163             :     {
    +    3164           2 :       std::scoped_lock lock(mutex_des_whole_trajectory_);
    +    3165             : 
    +    3166           1 :       setGoal((*des_x_whole_trajectory_)[0], (*des_y_whole_trajectory_)[0], (*des_z_whole_trajectory_)[0], (*des_heading_whole_trajectory_)[0],
    +    3167           1 :               trajectory_track_heading_);
    +    3168             :     }
    +    3169             : 
    +    3170           1 :     publishDiagnostics();
    +    3171             : 
    +    3172           1 :     ss << "flying to the start of the trajectory";
    +    3173           1 :     ROS_INFO_STREAM_THROTTLE(1.0, "[MpcTracker]: " << ss.str());
    +    3174             : 
    +    3175           1 :     return std::tuple(true, ss.str());
    +    3176             : 
    +    3177             :   } else {
    +    3178             : 
    +    3179           0 :     ss << "can not fly to the start of the trajectory, the trajectory is not set";
    +    3180           0 :     ROS_WARN_STREAM_THROTTLE(1.0, "[MpcTracker]: " << ss.str());
    +    3181             : 
    +    3182           0 :     return std::tuple(false, ss.str());
    +    3183             :   }
    +    3184             : }
    +    3185             : 
    +    3186             : //}
    +    3187             : 
    +    3188             : // | ------------------------- support ------------------------ |
    +    3189             : 
    +    3190             : /* //{ publishDiagnostics() */
    +    3191             : 
    +    3192       20339 : void MpcTracker::publishDiagnostics(void) {
    +    3193             : 
    +    3194       40678 :   auto des_x_trajectory       = mrs_lib::get_mutexed(mutex_des_trajectory_, des_x_trajectory_);
    +    3195       40678 :   auto des_y_trajectory       = mrs_lib::get_mutexed(mutex_des_trajectory_, des_y_trajectory_);
    +    3196       40678 :   auto des_z_trajectory       = mrs_lib::get_mutexed(mutex_des_trajectory_, des_z_trajectory_);
    +    3197       40678 :   auto des_heading_trajectory = mrs_lib::get_mutexed(mutex_des_trajectory_, des_heading_trajectory_);
    +    3198             : 
    +    3199       40678 :   mrs_msgs::MpcTrackerDiagnostics diagnostics;
    +    3200             : 
    +    3201       20339 :   diagnostics.header.stamp    = ros::Time::now();
    +    3202       20339 :   diagnostics.header.frame_id = uav_state_.header.frame_id;
    +    3203             : 
    +    3204       20339 :   diagnostics.active = is_active_;
    +    3205             : 
    +    3206       20339 :   diagnostics.uav_name = _uav_name_;
    +    3207             : 
    +    3208       20339 :   diagnostics.collision_avoidance_active = collision_avoidance_enabled_;
    +    3209       20339 :   diagnostics.avoiding_collision         = collision_avoidance_affecting_me_;
    +    3210             : 
    +    3211       20339 :   diagnostics.setpoint.position.x = des_x_trajectory(0, 0);
    +    3212       20339 :   diagnostics.setpoint.position.y = des_y_trajectory(0, 0);
    +    3213       20339 :   diagnostics.setpoint.position.z = des_z_trajectory(0, 0);
    +    3214             : 
    +    3215       20339 :   diagnostics.setpoint.orientation = mrs_lib::AttitudeConverter(0, 0, des_heading_trajectory(0, 0));
    +    3216             : 
    +    3217       40678 :   std::stringstream ss;
    +    3218             : 
    +    3219             :   {
    +    3220       40678 :     std::scoped_lock lock(mutex_other_uav_diagnostics_);
    +    3221             : 
    +    3222             :     // fill in if other UAVs are sending their trajectories
    +    3223       20339 :     std::map<std::string, mrs_msgs::MpcTrackerDiagnostics>::iterator u = other_uav_diagnostics_.begin();
    +    3224             : 
    +    3225       22234 :     while (u != other_uav_diagnostics_.end()) {
    +    3226             : 
    +    3227        1895 :       if (u->second.collision_avoidance_active) {
    +    3228             : 
    +    3229             :         // is the other's trajectory fresh enought?
    +    3230        1211 :         if ((ros::Time::now() - u->second.header.stamp).toSec() < _collision_trajectory_timeout_) {
    +    3231        1211 :           diagnostics.avoidance_active_uavs.push_back(u->first);
    +    3232        1211 :           ss << u->first.c_str() << ", ";
    +    3233             :         }
    +    3234             :       }
    +    3235             : 
    +    3236        1895 :       u++;
    +    3237             :     }
    +    3238             :   }
    +    3239             : 
    +    3240       40678 :   auto uav_state = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +    3241             : 
    +    3242       20339 :   if (ss.str().length() > 0) {
    +    3243        1211 :     ROS_DEBUG_STREAM_THROTTLE(5.0, "[MpcTracker]: getting avoidance trajectories: " << ss.str());
    +    3244       41435 :   } else if (collision_avoidance_enabled_ &&
    +    3245       22307 :       (uav_state.estimator_horizontal == "lat_gps" || uav_state.estimator_horizontal == "lat_rtk")) {
    +    3246       15805 :     ROS_DEBUG_THROTTLE(10.0, "[MpcTracker]: missing avoidance trajectories!");
    +    3247             :   }
    +    3248             : 
    +    3249       20339 :   pub_diagnostics_.publish(diagnostics);
    +    3250             : 
    +    3251       40678 :   std_msgs::String string_msg;
    +    3252             : 
    +    3253       20339 :   if (diagnostics.avoidance_active_uavs.empty()) {
    +    3254             : 
    +    3255       19128 :     string_msg.data = "-id col_avoid I see: NOTHING";
    +    3256             : 
    +    3257             :   } else {
    +    3258             : 
    +    3259        1211 :     string_msg.data = "-id col_avoid I see: ";
    +    3260             :   }
    +    3261             : 
    +    3262       20339 :   if (diagnostics.avoidance_active_uavs.size() <= 3) {
    +    3263             : 
    +    3264       21550 :     for (size_t i = 0; i < diagnostics.avoidance_active_uavs.size(); i++) {
    +    3265        1211 :       if (i == 0) {
    +    3266        1211 :         string_msg.data += diagnostics.avoidance_active_uavs[i];
    +    3267             :       } else {
    +    3268           0 :         string_msg.data += ", " + diagnostics.avoidance_active_uavs[i];
    +    3269             :       }
    +    3270             :     }
    +    3271             : 
    +    3272             :   } else {
    +    3273             : 
    +    3274           0 :     std::stringstream ss;
    +    3275           0 :     ss << diagnostics.avoidance_active_uavs.size();
    +    3276             : 
    +    3277           0 :     string_msg.data += ss.str() + " UAVs";
    +    3278             :   }
    +    3279             : 
    +    3280       20339 :   pub_status_string_.publish(string_msg);
    +    3281       20339 : }
    +    3282             : 
    +    3283             : //}
    +    3284             : 
    +    3285             : /* debugPrintState() //{ */
    +    3286             : 
    +    3287           0 : void MpcTracker::debugPrintState(const double throttle) {
    +    3288             : 
    +    3289           0 :   auto [mpc_x, mpc_x_heading] = mrs_lib::get_mutexed(mutex_mpc_x_, mpc_x_, mpc_x_heading_);
    +    3290             : 
    +    3291           0 :   ROS_DEBUG_THROTTLE(throttle, "[MpcTracker]: MPC internal state: pos [%.2f, %.2f, %.2f, %.2f]", mpc_x(0), mpc_x(4), mpc_x(8), mpc_x_heading(0));
    +    3292           0 :   ROS_DEBUG_THROTTLE(throttle, "[MpcTracker]: MPC internal state: vel [%.2f, %.2f, %.2f, %.2f]", mpc_x(1), mpc_x(5), mpc_x(9), mpc_x_heading(1));
    +    3293           0 :   ROS_DEBUG_THROTTLE(throttle, "[MpcTracker]: MPC internal state: acc [%.2f, %.2f, %.2f, %.2f]", mpc_x(2), mpc_x(6), mpc_x(10), mpc_x_heading(2));
    +    3294           0 :   ROS_DEBUG_THROTTLE(throttle, "[MpcTracker]: MPC internal state: jerk [%.2f, %.2f, %.2f, %.2f]", mpc_x(3), mpc_x(7), mpc_x(11), mpc_x_heading(3));
    +    3295           0 : }
    +    3296             : 
    +    3297             : //}
    +    3298             : 
    +    3299             : /* debugPrintMPCu() //{ */
    +    3300             : 
    +    3301           0 : void MpcTracker::debugPrintMPCResult(const double throttle) {
    +    3302             : 
    +    3303           0 :   auto [mpc_u, mpc_u_heading] = mrs_lib::get_mutexed(mutex_mpc_u_, mpc_u_, mpc_u_heading_);
    +    3304           0 :   auto constraints            = mrs_lib::get_mutexed(mutex_constraints_, constraints_);
    +    3305             : 
    +    3306           0 :   ROS_DEBUG_THROTTLE(throttle, "[MpcTracker]: MPC result: [%.2f, %.2f, %.2f, %.2f]", mpc_u(0), mpc_u(1), mpc_u(2), mpc_u_heading);
    +    3307           0 :   ROS_DEBUG_THROTTLE(throttle, "[MpcTracker]: snap constraint: hor: %.2f, ver asc: %.2f, vert desc: %.2f, heading: %.2f]", constraints.horizontal_snap,
    +    3308             :                      constraints.vertical_ascending_snap, constraints.vertical_descending_snap, constraints.heading_snap);
    +    3309           0 : }
    +    3310             : 
    +    3311             : //}
    +    3312             : 
    +    3313             : /* getCurrentTrajectoryIdx() //{ */
    +    3314             : 
    +    3315        7505 : int MpcTracker::getCurrentTrajectoryIdx() {
    +    3316             : 
    +    3317        7505 :   auto trajectory_current_time = mrs_lib::get_mutexed(mutex_trajectory_tracking_states_, trajectory_current_time_);
    +    3318        7505 :   auto trajectory_dt   = mrs_lib::get_mutexed(mutex_trajectory_tracking_states_, trajectory_dt_);
    +    3319             : 
    +    3320        7505 :   return floor(trajectory_current_time / trajectory_dt);
    +    3321             : }
    +    3322             : 
    +    3323             : //}
    +    3324             : 
    +    3325             : /* increaseCurrentTrajectoryTime() //{ */
    +    3326             : 
    +    3327       12157 : void MpcTracker::increaseCurrentTrajectoryTime(const double dt) {
    +    3328             : 
    +    3329       12157 :   auto trajectory_current_time = mrs_lib::get_mutexed(mutex_trajectory_tracking_states_, trajectory_current_time_);
    +    3330       12157 :   auto [trajectory_size, trajectory_dt] = mrs_lib::get_mutexed(mutex_des_trajectory_, trajectory_size_, trajectory_dt_);
    +    3331             : 
    +    3332       12157 :   trajectory_current_time += dt;
    +    3333             : 
    +    3334       12157 :   const double trajectory_duration = trajectory_size * trajectory_dt;
    +    3335             : 
    +    3336             :   // if the tracking idx hits the end of the trajectory
    +    3337       12157 :   if (trajectory_current_time >= trajectory_duration) {
    +    3338             : 
    +    3339           4 :     if (trajectory_tracking_loop_) {
    +    3340             : 
    +    3341             :       // reset the idx
    +    3342           0 :       trajectory_current_time -= trajectory_duration;
    +    3343             : 
    +    3344           0 :       ROS_INFO("[MpcTracker]: trajectory looped");
    +    3345             : 
    +    3346             :     } else {
    +    3347             : 
    +    3348           4 :       trajectory_tracking_in_progress_ = false;
    +    3349             : 
    +    3350           4 :       ROS_INFO("[MpcTracker]: done tracking trajectory");
    +    3351             :     }
    +    3352             :   }
    +    3353             : 
    +    3354       12157 :   mrs_lib::set_mutexed(mutex_trajectory_tracking_states_, trajectory_current_time, trajectory_current_time_);
    +    3355       12157 : }
    +    3356             : 
    +    3357             : //}
    +    3358             : 
    +    3359             : // --------------------------------------------------------------
    +    3360             : // |                           timers                           |
    +    3361             : // --------------------------------------------------------------
    +    3362             : 
    +    3363             : /* //{ timerDiagnostics() */
    +    3364             : 
    +    3365             : // published diagnostics in reguar intervals
    +    3366       19362 : void MpcTracker::timerDiagnostics(const ros::TimerEvent& event) {
    +    3367             : 
    +    3368       19362 :   if (!is_initialized_)
    +    3369           0 :     return;
    +    3370             : 
    +    3371       58086 :   mrs_lib::Routine    profiler_routine = profiler.createRoutine("timerDiagnostics", _diagnostics_rate_, 0.1, event);
    +    3372       58086 :   mrs_lib::ScopeTimer timer = mrs_lib::ScopeTimer("MpcTracker::timerDiagnostics", common_handlers_->scope_timer.logger, common_handlers_->scope_timer.enabled);
    +    3373             : 
    +    3374       19362 :   publishDiagnostics();
    +    3375             : }
    +    3376             : 
    +    3377             : //}
    +    3378             : 
    +    3379             : /* //{ timerMPC() */
    +    3380             : 
    +    3381       70716 : void MpcTracker::timerMPC(const ros::TimerEvent& event) {
    +    3382             : 
    +    3383       70716 :   if (odometry_reset_in_progress_) {
    +    3384           0 :     ROS_ERROR("[MpcTracker]: mpc iteration tried run while reseting odometry");
    +    3385           0 :     return;
    +    3386             :   }
    +    3387             : 
    +    3388       70716 :   auto dt1 = mrs_lib::get_mutexed(mutex_dt1_, dt1_);
    +    3389             : 
    +    3390       70716 :   mrs_lib::AtomicScopeFlag unset_running(mpc_timer_running_);
    +    3391             : 
    +    3392       70716 :   bool started_with_invalid = mpc_result_invalid_;
    +    3393             : 
    +    3394       70716 :   if (!is_active_) {
    +    3395           0 :     return;
    +    3396             :   }
    +    3397             : 
    +    3398       70716 :   if (!is_initialized_) {
    +    3399           0 :     return;
    +    3400             :   }
    +    3401             : 
    +    3402      212148 :   mrs_lib::Routine    profiler_routine = profiler.createRoutine("timerMPC", 1.0 / dt1, 0.01, event);
    +    3403      212148 :   mrs_lib::ScopeTimer timer = mrs_lib::ScopeTimer("MpcTracker::timerMPC", common_handlers_->scope_timer.logger, common_handlers_->scope_timer.enabled);
    +    3404             : 
    +    3405       70716 :   ros::Time     begin = ros::Time::now();
    +    3406       70716 :   ros::Time     end;
    +    3407       70716 :   ros::Duration interval;
    +    3408             :   int           trajectory_id;
    +    3409             : 
    +    3410             :   // if we are tracking trajectory, copy the setpoint
    +    3411       70716 :   if (trajectory_tracking_in_progress_) {
    +    3412             : 
    +    3413       24314 :     MatrixXd des_x_trajectory, des_y_trajectory, des_z_trajectory, des_heading_trajectory;
    +    3414       24314 :     VectorXd des_x_whole_trajectory, des_y_whole_trajectory, des_z_whole_trajectory, des_heading_whole_trajectory;
    +    3415             :     double   trajectory_dt;
    +    3416             :     int      trajectory_size;
    +    3417             :     {
    +    3418       12157 :       std::scoped_lock lock(mutex_des_trajectory_, mutex_des_whole_trajectory_);
    +    3419             : 
    +    3420       12157 :       des_x_trajectory       = des_x_trajectory_;
    +    3421       12157 :       des_y_trajectory       = des_y_trajectory_;
    +    3422       12157 :       des_z_trajectory       = des_z_trajectory_;
    +    3423       12157 :       des_heading_trajectory = des_heading_trajectory_;
    +    3424             : 
    +    3425       12157 :       des_x_whole_trajectory       = *des_x_whole_trajectory_;
    +    3426       12157 :       des_y_whole_trajectory       = *des_y_whole_trajectory_;
    +    3427       12157 :       des_z_whole_trajectory       = *des_z_whole_trajectory_;
    +    3428       12157 :       des_heading_whole_trajectory = *des_heading_whole_trajectory_;
    +    3429             : 
    +    3430       12157 :       trajectory_size = trajectory_size_;
    +    3431       12157 :       trajectory_dt   = trajectory_dt_;
    +    3432             : 
    +    3433       12157 :       trajectory_id = des_whole_trajectory_id_;
    +    3434             :     }
    +    3435             : 
    +    3436             :     /* interpolate the trajectory points and fill in the desired_trajectory vector //{ */
    +    3437             : 
    +    3438       12157 :     const double dt_from_last_update = (event.current_real - event.last_real).toSec();
    +    3439             : 
    +    3440       12157 :     increaseCurrentTrajectoryTime(dt_from_last_update);
    +    3441             : 
    +    3442       12157 :     auto trajectory_current_time = mrs_lib::get_mutexed(mutex_trajectory_tracking_states_, trajectory_current_time_);
    +    3443             : 
    +    3444      498437 :     for (int i = 0; i < MPC_HORIZON_LENGTH; i++) {
    +    3445             : 
    +    3446      486280 :       double first_time = trajectory_current_time + double(i) * _dt2_;
    +    3447             : 
    +    3448      486280 :       int first_idx  = int(floor(first_time / trajectory_dt));
    +    3449      486280 :       int second_idx = first_idx + 1;
    +    3450             : 
    +    3451      486280 :       double interp_coeff = std::fmod(first_time / trajectory_dt, 1.0);
    +    3452             : 
    +    3453      486280 :       if (trajectory_tracking_loop_) {
    +    3454             : 
    +    3455           0 :         if (second_idx >= trajectory_size) {
    +    3456           0 :           second_idx = second_idx % trajectory_size;
    +    3457             :         }
    +    3458             : 
    +    3459           0 :         if (first_idx >= trajectory_size) {
    +    3460           0 :           first_idx = first_idx % trajectory_size;
    +    3461             :         }
    +    3462             : 
    +    3463             :       } else {
    +    3464             : 
    +    3465      486280 :         if (second_idx >= trajectory_size) {
    +    3466       60692 :           second_idx = trajectory_size - 1;
    +    3467             :         }
    +    3468             : 
    +    3469      486280 :         if (first_idx >= trajectory_size) {
    +    3470       57739 :           first_idx = trajectory_size - 1;
    +    3471             :         }
    +    3472             :       }
    +    3473             : 
    +    3474      486280 :       des_x_trajectory(i, 0) = (1 - interp_coeff) * des_x_whole_trajectory[first_idx] + interp_coeff * des_x_whole_trajectory[second_idx];
    +    3475      486280 :       des_y_trajectory(i, 0) = (1 - interp_coeff) * des_y_whole_trajectory[first_idx] + interp_coeff * des_y_whole_trajectory[second_idx];
    +    3476      486280 :       des_z_trajectory(i, 0) = (1 - interp_coeff) * des_z_whole_trajectory[first_idx] + interp_coeff * des_z_whole_trajectory[second_idx];
    +    3477             : 
    +    3478      486280 :       des_heading_trajectory(i, 0) = sradians::interp(des_heading_whole_trajectory[first_idx], des_heading_whole_trajectory[second_idx], interp_coeff);
    +    3479             :     }
    +    3480             : 
    +    3481             :     {
    +    3482       24314 :       std::scoped_lock lock(mutex_des_trajectory_);
    +    3483             : 
    +    3484       12157 :       des_x_trajectory_       = des_x_trajectory;
    +    3485       12157 :       des_y_trajectory_       = des_y_trajectory;
    +    3486       12157 :       des_z_trajectory_       = des_z_trajectory;
    +    3487       12157 :       des_heading_trajectory_ = des_heading_trajectory;
    +    3488             :     }
    +    3489             : 
    +    3490             :     //}
    +    3491             : 
    +    3492             :   } else {
    +    3493             : 
    +    3494       58559 :     std::scoped_lock lock(mutex_des_whole_trajectory_);
    +    3495             : 
    +    3496       58559 :     trajectory_id = des_whole_trajectory_id_;
    +    3497             :   }
    +    3498             : 
    +    3499       70716 :   manageConstraints();
    +    3500             : 
    +    3501       70716 :   calculateMPC();
    +    3502             : 
    +    3503       70716 :   end      = ros::Time::now();
    +    3504       70716 :   interval = end - begin;
    +    3505             : 
    +    3506             :   // | ------------------ calculate the MPC RTF ----------------- |
    +    3507             : 
    +    3508       70716 :   mpc_rtf_ = 0.99 * mpc_rtf_ + 0.01 * (interval.toSec()/dt1);
    +    3509             : 
    +    3510       70716 :   if (mpc_rtf_ >= 1.0) {
    +    3511           0 :     ROS_WARN_THROTTLE(5.0, "[MpcTracker] MPC Real Time Factor (%.3f) is slow", mpc_rtf_);
    +    3512             :   }
    +    3513             : 
    +    3514             :   /* publish predicted future //{ */
    +    3515             : 
    +    3516             :   {
    +    3517      141432 :     geometry_msgs::PoseArray debug_trajectory_out;
    +    3518       70716 :     debug_trajectory_out.header.stamp    = ros::Time::now();
    +    3519       70716 :     debug_trajectory_out.header.frame_id = uav_state_.header.frame_id;
    +    3520             : 
    +    3521             :     {
    +    3522      141432 :       std::scoped_lock lock(mutex_predicted_trajectory_);
    +    3523             : 
    +    3524     2899356 :       for (int i = 0; i < MPC_HORIZON_LENGTH; i++) {
    +    3525             : 
    +    3526     2828640 :         geometry_msgs::Pose newPose;
    +    3527             : 
    +    3528     2828640 :         newPose.position.x = predicted_trajectory_(i * MPC_N_STATES);
    +    3529     2828640 :         newPose.position.y = predicted_trajectory_(i * MPC_N_STATES + 4);
    +    3530     2828640 :         newPose.position.z = predicted_trajectory_(i * MPC_N_STATES + 8);
    +    3531             : 
    +    3532             :         try {
    +    3533     2828640 :           newPose.orientation = mrs_lib::AttitudeConverter(0, 0, predicted_heading_trajectory_(i * MPC_N_STATES));
    +    3534           0 :         } catch (...) {
    +    3535           0 :           ROS_ERROR_THROTTLE(1.0, "[MpcTracker]: failed to fill orientation into debug print trajectory");
    +    3536             :         }
    +    3537             : 
    +    3538     2828640 :         debug_trajectory_out.poses.push_back(newPose);
    +    3539             :       }
    +    3540             :     }
    +    3541             : 
    +    3542       70716 :     ph_predicted_trajectory_debugging_.publish(debug_trajectory_out);
    +    3543             :   }
    +    3544             : 
    +    3545             :   //}
    +    3546             : 
    +    3547             :   /* publish full state prediction //{ */
    +    3548             : 
    +    3549             :   {
    +    3550      141432 :     mrs_msgs::MpcPredictionFullState prediction_fs_out;
    +    3551       70716 :     prediction_fs_out.header.stamp    = ros::Time::now();
    +    3552       70716 :     prediction_fs_out.header.frame_id = uav_state_.header.frame_id;
    +    3553             : 
    +    3554       70716 :     ros::Time stamp = prediction_fs_out.header.stamp;
    +    3555             : 
    +    3556       70716 :     prediction_fs_out.input_id = trajectory_id;
    +    3557             : 
    +    3558             :     {
    +    3559      141432 :       std::scoped_lock lock(mutex_predicted_trajectory_);
    +    3560             : 
    +    3561     2899356 :       for (int i = 0; i < MPC_HORIZON_LENGTH; i++) {
    +    3562             : 
    +    3563     2828640 :         if (i == 0) {
    +    3564       70716 :           stamp += ros::Duration(0.01);
    +    3565             :         } else {
    +    3566     2757924 :           stamp += ros::Duration(0.2);
    +    3567             :         }
    +    3568             : 
    +    3569     2828640 :         prediction_fs_out.stamps.push_back(stamp);
    +    3570             : 
    +    3571             :         {  // position
    +    3572     2828640 :           geometry_msgs::Point point;
    +    3573             : 
    +    3574     2828640 :           point.x = predicted_trajectory_(i * MPC_N_STATES);
    +    3575     2828640 :           point.y = predicted_trajectory_(i * MPC_N_STATES + 4);
    +    3576     2828640 :           point.z = predicted_trajectory_(i * MPC_N_STATES + 8);
    +    3577             : 
    +    3578     2828640 :           prediction_fs_out.position.push_back(point);
    +    3579             :         }
    +    3580             : 
    +    3581             :         {  // velocity
    +    3582     2828640 :           geometry_msgs::Vector3 vector;
    +    3583             : 
    +    3584     2828640 :           vector.x = predicted_trajectory_(i * MPC_N_STATES + 1);
    +    3585     2828640 :           vector.y = predicted_trajectory_(i * MPC_N_STATES + 5);
    +    3586     2828640 :           vector.z = predicted_trajectory_(i * MPC_N_STATES + 9);
    +    3587             : 
    +    3588     2828640 :           prediction_fs_out.velocity.push_back(vector);
    +    3589             :         }
    +    3590             : 
    +    3591             :         {  // acceleration
    +    3592     2828640 :           geometry_msgs::Vector3 vector3;
    +    3593             : 
    +    3594     2828640 :           vector3.x = predicted_trajectory_(i * MPC_N_STATES + 2);
    +    3595     2828640 :           vector3.y = predicted_trajectory_(i * MPC_N_STATES + 6);
    +    3596     2828640 :           vector3.z = predicted_trajectory_(i * MPC_N_STATES + 10);
    +    3597             : 
    +    3598     2828640 :           prediction_fs_out.acceleration.push_back(vector3);
    +    3599             :         }
    +    3600             : 
    +    3601             :         {  // jerk
    +    3602     2828640 :           geometry_msgs::Vector3 vector3;
    +    3603             : 
    +    3604     2828640 :           vector3.x = predicted_trajectory_(i * MPC_N_STATES + 3);
    +    3605     2828640 :           vector3.y = predicted_trajectory_(i * MPC_N_STATES + 7);
    +    3606     2828640 :           vector3.z = predicted_trajectory_(i * MPC_N_STATES + 11);
    +    3607             : 
    +    3608     2828640 :           prediction_fs_out.jerk.push_back(vector3);
    +    3609             :         }
    +    3610             : 
    +    3611             :         {
    +    3612             :           // heading
    +    3613             : 
    +    3614     2828640 :           prediction_fs_out.heading.push_back(predicted_heading_trajectory_(i * MPC_N_STATES));
    +    3615     2828640 :           prediction_fs_out.heading_rate.push_back(predicted_heading_trajectory_(i * MPC_N_STATES + 1));
    +    3616     2828640 :           prediction_fs_out.heading_acceleration.push_back(predicted_heading_trajectory_(i * MPC_N_STATES + 2));
    +    3617     2828640 :           prediction_fs_out.heading_jerk.push_back(predicted_heading_trajectory_(i * MPC_N_STATES + 3));
    +    3618             :         }
    +    3619             :       }
    +    3620             :     }
    +    3621             : 
    +    3622             :     {
    +    3623      141432 :       std::scoped_lock lock(mutex_prediction_full_state_);
    +    3624       70716 :       prediction_full_state_ = prediction_fs_out;
    +    3625             :     }
    +    3626             :   }
    +    3627             : 
    +    3628             :   //}
    +    3629             : 
    +    3630       70716 :   mpc_computed_ = true;
    +    3631             : 
    +    3632       70716 :   if (started_with_invalid) {
    +    3633             : 
    +    3634           5 :     mpc_result_invalid_ = false;
    +    3635             : 
    +    3636           5 :     ROS_INFO("[MpcTracker]: calculated the first MPC result after invalidation");
    +    3637             :   }
    +    3638             : }
    +    3639             : 
    +    3640             : //}
    +    3641             : 
    +    3642             : /* timerVelocityTracking() //{ */
    +    3643             : 
    +    3644         496 : void MpcTracker::timerVelocityTracking(const ros::TimerEvent& event) {
    +    3645             : 
    +    3646         496 :   if (!is_initialized_) {
    +    3647           2 :     return;
    +    3648             :   }
    +    3649             : 
    +    3650         496 :   if (!velocity_tracking_active_) {
    +    3651           0 :     return;
    +    3652             :   }
    +    3653             : 
    +    3654         992 :   mrs_lib::Routine    profiler_routine = profiler.createRoutine("timerVelocityTracking", int(30.0), 0.01, event);
    +    3655             :   mrs_lib::ScopeTimer timer =
    +    3656         992 :       mrs_lib::ScopeTimer("MpcTracker::timerVelocityTracking", common_handlers_->scope_timer.logger, common_handlers_->scope_timer.enabled);
    +    3657             : 
    +    3658             :   // stop the timer when timeout
    +    3659         496 :   if ((ros::Time::now() - velocity_reference_time_).toSec() > 0.5) {
    +    3660             : 
    +    3661           2 :     ROS_WARN_THROTTLE(1.0, "[MpcTracker]: velocity reference timeouted, hovering");
    +    3662           2 :     timer_velocity_tracking_.stop();
    +    3663             : 
    +    3664           2 :     toggleHover(true);
    +    3665             : 
    +    3666           2 :     velocity_tracking_active_ = false;
    +    3667             : 
    +    3668           2 :     return;
    +    3669             :   }
    +    3670             : 
    +    3671         988 :   auto [mpc_x, mpc_x_heading] = mrs_lib::get_mutexed(mutex_mpc_x_, mpc_x_, mpc_x_heading_);
    +    3672         494 :   auto velocity_reference     = mrs_lib::get_mutexed(mutex_velocity_reference_, velocity_reference_);
    +    3673             : 
    +    3674         988 :   mrs_msgs::TrajectoryReference trajectory;
    +    3675             : 
    +    3676         494 :   trajectory.fly_now         = true;
    +    3677         494 :   trajectory.use_heading     = true;
    +    3678         494 :   trajectory.dt              = 0.2;
    +    3679         494 :   trajectory.header.stamp    = ros::Time::now();
    +    3680         494 :   trajectory.header.frame_id = "";
    +    3681             : 
    +    3682         494 :   double x       = mpc_x(0, 0);
    +    3683         494 :   double y       = mpc_x(4, 0);
    +    3684         494 :   double z       = mpc_x(8, 0);
    +    3685         494 :   double heading = mpc_x_heading(0, 0);
    +    3686             : 
    +    3687       25194 :   for (int i = 0; i < 50; i++) {
    +    3688             : 
    +    3689       24700 :     mrs_msgs::Reference reference;
    +    3690       24700 :     reference.position.x = x;
    +    3691       24700 :     reference.position.y = y;
    +    3692       24700 :     reference.position.z = z;
    +    3693       24700 :     reference.heading    = heading;
    +    3694             : 
    +    3695       24700 :     trajectory.points.push_back(reference);
    +    3696             : 
    +    3697       24700 :     x += velocity_reference.velocity.x * trajectory.dt;
    +    3698       24700 :     y += velocity_reference.velocity.y * trajectory.dt;
    +    3699       24700 :     z += velocity_reference.velocity.z * trajectory.dt;
    +    3700             : 
    +    3701       24700 :     if (velocity_reference.use_altitude) {
    +    3702           0 :       z = velocity_reference.altitude;
    +    3703             :     }
    +    3704             : 
    +    3705       24700 :     if (velocity_reference.use_heading_rate) {
    +    3706       24700 :       heading += velocity_reference.heading_rate * trajectory.dt;
    +    3707           0 :     } else if (velocity_reference.use_heading) {
    +    3708           0 :       heading = velocity_reference.heading;
    +    3709             :     }
    +    3710             :   }
    +    3711             : 
    +    3712         988 :   auto [success, message, modified] = loadTrajectory(trajectory);
    +    3713             : }
    +    3714             : 
    +    3715             : //}
    +    3716             : 
    +    3717             : /* //{ timerAvoidanceTrajectory() */
    +    3718             : 
    +    3719        3840 : void MpcTracker::timerAvoidanceTrajectory(const ros::TimerEvent& event) {
    +    3720             : 
    +    3721        3840 :   if (!is_active_) {
    +    3722        1948 :     return;
    +    3723             :   }
    +    3724             : 
    +    3725        1928 :   if (!is_initialized_) {
    +    3726           0 :     return;
    +    3727             :   }
    +    3728             : 
    +    3729        1928 :   if (!sh_estimation_diag_.hasMsg()) {
    +    3730           0 :     return;
    +    3731             :   } else {
    +    3732             :     // we won't try to transform and publish the avoidance prediction if we cannot transform it
    +    3733             : 
    +    3734        1928 :     auto                     estimation_diag      = sh_estimation_diag_.getMsg();
    +    3735        1928 :     std::vector<std::string> state_estimators = estimation_diag.get()->switchable_state_estimators;
    +    3736             : 
    +    3737        1928 :     bool got_gps_est = std::find(state_estimators.begin(), state_estimators.end(), "gps_garmin") != state_estimators.end() || std::find(state_estimators.begin(), state_estimators.end(), "gps_baro") != state_estimators.end();
    +    3738        1928 :     bool got_rtk_est = std::find(state_estimators.begin(), state_estimators.end(), "rtk") != state_estimators.end();
    +    3739             : 
    +    3740        1928 :     if (!got_gps_est && !got_rtk_est) {
    +    3741          36 :       return;
    +    3742             :     }
    +    3743             :   }
    +    3744             : 
    +    3745        3784 :   mrs_lib::Routine    profiler_routine = profiler.createRoutine("timerAvoidanceTrajectory", _avoidance_trajectory_rate_, 0.1, event);
    +    3746             :   mrs_lib::ScopeTimer timer =
    +    3747        3784 :       mrs_lib::ScopeTimer("MpcTracker::timerAvoidanceTrajectory", common_handlers_->scope_timer.logger, common_handlers_->scope_timer.enabled);
    +    3748             : 
    +    3749        1892 :   auto uav_state            = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +    3750        1892 :   auto predicted_trajectory = mrs_lib::get_mutexed(mutex_predicted_trajectory_, predicted_trajectory_);
    +    3751             : 
    +    3752        1892 :   if (future_was_predicted_) {
    +    3753             : 
    +    3754        1892 :     mrs_msgs::FutureTrajectory avoidance_trajectory;
    +    3755             : 
    +    3756             :     // fill last trajectory with initial data
    +    3757        1892 :     avoidance_trajectory.stamp               = ros::Time::now();
    +    3758        1892 :     avoidance_trajectory.uav_name            = _uav_name_;
    +    3759        1892 :     avoidance_trajectory.priority            = avoidance_this_uav_priority_;
    +    3760        1892 :     avoidance_trajectory.collision_avoidance = collision_avoidance_enabled_ && (uav_state.estimator_horizontal == "lat_gps" || uav_state.estimator_horizontal == "lat_rtk");
    +    3761        1892 :     avoidance_trajectory.points.clear();
    +    3762        1892 :     avoidance_trajectory.stamp               = ros::Time::now();
    +    3763        1892 :     avoidance_trajectory.uav_name            = _uav_name_;
    +    3764        1892 :     avoidance_trajectory.priority            = avoidance_this_uav_priority_;
    +    3765        1892 :     avoidance_trajectory.collision_avoidance = collision_avoidance_enabled_;
    +    3766             : 
    +    3767        3784 :     auto res = common_handlers_->transformer->getTransform(uav_state.header.frame_id, "utm_origin", ros::Time::now());
    +    3768             : 
    +    3769        1892 :     if (!res) {
    +    3770             : 
    +    3771           0 :       std::string message = "[MpcTracker]: can not transform predicted future to utm_origin";
    +    3772           0 :       ROS_WARN_STREAM_ONCE(message);
    +    3773           0 :       ROS_DEBUG_STREAM_THROTTLE(1.0, message);
    +    3774           0 :       return;
    +    3775             : 
    +    3776             :     } else {
    +    3777             : 
    +    3778        3784 :       geometry_msgs::TransformStamped tf = res.value();
    +    3779             : 
    +    3780       77572 :       for (int i = 0; i < MPC_HORIZON_LENGTH; i++) {
    +    3781             : 
    +    3782             :         // original point
    +    3783      151360 :         geometry_msgs::PoseStamped original_point;
    +    3784             : 
    +    3785       75680 :         original_point.header.stamp    = ros::Time::now();
    +    3786       75680 :         original_point.header.frame_id = uav_state.header.frame_id;
    +    3787             : 
    +    3788       75680 :         original_point.pose.position.x = predicted_trajectory(i * MPC_N_STATES);
    +    3789       75680 :         original_point.pose.position.y = predicted_trajectory(i * MPC_N_STATES + 4);
    +    3790       75680 :         original_point.pose.position.z = predicted_trajectory(i * MPC_N_STATES + 8);
    +    3791             : 
    +    3792       75680 :         original_point.pose.orientation = mrs_lib::AttitudeConverter(0, 0, 0);
    +    3793             : 
    +    3794      151360 :         auto res = common_handlers_->transformer->transform(original_point, tf);
    +    3795             : 
    +    3796       75680 :         if (res) {
    +    3797             : 
    +    3798       75680 :           mrs_msgs::FuturePoint new_point;
    +    3799             : 
    +    3800       75680 :           new_point.x = res.value().pose.position.x;
    +    3801       75680 :           new_point.y = res.value().pose.position.y;
    +    3802       75680 :           new_point.z = res.value().pose.position.z;
    +    3803             : 
    +    3804       75680 :           avoidance_trajectory.points.push_back(new_point);
    +    3805             : 
    +    3806             :         } else {
    +    3807             : 
    +    3808           0 :           std::string message = "[MpcTracker]: can not transform a point of a future trajectory";
    +    3809           0 :           ROS_WARN_STREAM_ONCE(message);
    +    3810           0 :           ROS_DEBUG_STREAM_THROTTLE(1.0, message);
    +    3811             :         }
    +    3812             :       }
    +    3813             :     }
    +    3814             : 
    +    3815        1892 :     ph_avoidance_trajectory_.publish(avoidance_trajectory);
    +    3816             :   }
    +    3817             : }
    +    3818             : 
    +    3819             : //}
    +    3820             : 
    +    3821             : /* timerHover() //{ */
    +    3822             : 
    +    3823          92 : void MpcTracker::timerHover(const ros::TimerEvent& event) {
    +    3824             : 
    +    3825         184 :   MatrixXd mpc_x = mrs_lib::get_mutexed(mutex_mpc_x_, mpc_x_);
    +    3826             : 
    +    3827         276 :   mrs_lib::Routine    profiler_routine = profiler.createRoutine("timerHover", 10, 0.01, event);
    +    3828         276 :   mrs_lib::ScopeTimer timer = mrs_lib::ScopeTimer("MpcTracker::timerHover", common_handlers_->scope_timer.logger, common_handlers_->scope_timer.enabled);
    +    3829             : 
    +    3830          92 :   setRelativeGoal(0, 0, 0, 0, false);
    +    3831             : 
    +    3832          92 :   if (fabs(mpc_x(1, 0)) < 0.1 && fabs(mpc_x(5, 0)) < 0.1 && fabs(mpc_x(9, 0)) < 0.1) {
    +    3833             : 
    +    3834          55 :     toggleHover(false);
    +    3835             : 
    +    3836          55 :     ROS_INFO("[MpcTracker]: timerHover: speed is low, stopping hover timer");
    +    3837             :   }
    +    3838          92 : }
    +    3839             : 
    +    3840             : //}
    +    3841             : 
    +    3842             : }  // namespace mpc_tracker
    +    3843             : 
    +    3844             : }  // namespace mrs_uav_trackers
    +    3845             : 
    +    3846             : #include <pluginlib/class_list_macros.h>
    +    3847          91 : PLUGINLIB_EXPORT_CLASS(mrs_uav_trackers::mpc_tracker::MpcTracker, mrs_uav_managers::Tracker)
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/mpc_tracker/mpc_tracker.cpp.gcov.overview.html b/mrs_uav_trackers/src/mpc_tracker/mpc_tracker.cpp.gcov.overview.html new file mode 100644 index 0000000000..38c674450b --- /dev/null +++ b/mrs_uav_trackers/src/mpc_tracker/mpc_tracker.cpp.gcov.overview.html @@ -0,0 +1,982 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/mpc_tracker/mpc_tracker.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_trackers/src/mpc_tracker/mpc_tracker.cpp.gcov.png b/mrs_uav_trackers/src/mpc_tracker/mpc_tracker.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..5541b3db44d56a3ccc412a4ada79e6a52a1042a1 GIT binary patch literal 12412 zcmV-?FoVyDP)vVxgI*zH%Ih3Y*{;uOWmvx11h^-m#Q*#R1fSs zBc=nF!#G}gpoo_MhxZJ+uHc@~^3j2=UvW@U)+ zz+irgfOiDgHO4ikUBVu>w+H|iDc}Vu09@S|duJvL&Y{&Hl=dHotQfBZW1+d>)d5#E zAJf@bmOjD&xLh0;O@PZzTDz=}7zeFqfbkwb+@0ONIM+!LaIxNg^OXd=ek#J~ z0Sg$Dr9f|+L1czWZ=AvF^t|5T7|Vc>Xb$7|H!_S4ki#e^X7OA5>d$EoWqvvXc67zr zJQJ`03l>-REIW*WJ%-ndKN-8}!CepbA;Xin{j!o4FOutfVGKVAn8K24*YIq~CHzhS zwoCYmwwclvm%9*_u0sZxy$T@1!)$vGm}(>ij%6hE5VKmLEFTrW$FsnZrBe*YxIhY) zOz8wbwETIarv=b=%>b_0RR1Ps@k%$i{dH%BMYvy^E+wk{?u?J>^m>u*5rYJy-7PL2 zls)5^n0Q#=0nG=G|L2HV1#=S?9$Hw0F_{Az+#Ob@S1DB#h>!OIQ7Iq`3>jWSDkLUp z>;{_tM0Rk{bPY(tnEL_CTc}`+{v6zYSg{-0!0W5b2aq`VyL|u@AKwUgS8~q$#ZbF2 z45h}|l(;(Jh~Zg`3vdR7opSL%X%h;goX2^5q2Mm~OY0cpolpgk)S|@S(UBaI9jY+K z)mkhS6!)Og*77}ITpg`rA~2?8F9aVn7^Myph_<-X@qoDnKm!t8hh9oonfUb7GR6)c z=@R}IkHU*T4+F%+6gGDnx()`WJ&8xx2O@~*x|3|O>-Fx>L-t<-NZp4GrFuogd;iZ$ zb=}o3?%HYZv`-I6P~B%2rgpUyaD=}{b-wm9gP;;U&KeiZW*EGSvjI+iAokN@rII|R zblQIY+_na9l;8AHz-$o`QnILYc&&NADA#2eA_6RRsdm#7?4c15I*L+Sny%~3M;6fR zf!)d2bHiJVWQ+^ydMea&US8=|_8 zVuKM;9ac>*)!{?&Y6$+to!0;vwVcEf7<-+msY3&EsKXN%{TjHfQa~xjT-(rqz3lN9 zt7w)Q*t7Hvsf@97&z2~j>Xn?L>&07FDp_6K^aq#Jxf3ic+{(L$!2;|VWikhF#b+%fOpFC!2qT>^TFev@_-L4D_ z4`K^sQ~-|vNDf5X^^SN(p==;+h1)#j^H&T7IAZ9F43P5Ss_D0;_ z>a}THU^0zYQpdZOf?@VIr!TG-XT|_-Qoz&Bk#Pn}%{0cddNLWF>IU8mSMs^u61yNecp3ZuuC&*Ogn0N@F| zb`?NE*7m-GcsfI!dtoYQNdsN8fQPQ@P!!NQT6h-=URrxX>lq{pGu(dJt=2h^CoNS{ z2}O`ST4H>RGD}acCw58?IXBLcZw;v?Qq1)hIrB~Oh{G9-1upr>uzF0UuuVz9U314A zJQ^`lI-CcT9PI^n1)Jfcba&kZ{hF?2JuA9~Y1PfaM3@+A4bps+5)*GaK?Q-HYqBkq z1zP=4>skVMh%pubrR*W(`yh5O+Qy}{l>Q>8Iw_!QBf?p)ZXD?t^Wg=+CiYOg4uDFk z{TDuPHDfrl$#%^3elm+Iu=;Ae;{})s4iNnz*EO6M7SPW$qqOp_tAGw8rv895@5X)-^0={}Xgq_7Ic8ZYf#!iMGlx zF1zv(w#{*##vQd`d_2CMuMq6^5m4x1_da`oj&#mXiXt&Q zB-Ho;)|y78z##S^0x4BPQCrt+3aN|aVFG?$RknNSiQ?lv&~q)5o_7jGP>`idhych) z&=K9UQt1Kfx_IxRa#Xqk8o}KhHaS&BGZZsX0HinAGcRv$7RmvSvcB_x4=ZO^s2XgP z;EDlda@NnsEROW8?D;9GKR|jYZ6*f%|4Yx?s3tUJ9OLu(^;H9 z*B(o@6hXTHMa$4ixWL|HyQTnTU7IRKk~}(L&u`T|1))f9S4w3qJ0M!L{tEs*|6|)r}d%Qrhm&n7}LtgKbSLecZ zxkwJ4dk8S?nNFF|U39PRzdIPkLDmy0Q$hyg)i5fLAE8`^gs*M~FZ zX3M=o4N#BKPV)$iZ_YV;OXAm7<)9v;___eE89s_+ilzumEXd_Y-AYZY{lMyQDSNi+ zEVp300b|z~yY_2pVKiDP1ygSFHazYUIh~wg7|YHpu>ufxJy8J+dk+5V zEAcxrE=I+@Ys6S|`4II0t_-W+m3ypm`04z_@6hK+~e-iVkUm^!U2}a}C9|kCEP)UK=VP~e!%PD|rVuHpXbz39G7prY;H z4*%_LC8;HFw;~-_9C2Pu5*&iWmc5i$kI@|+3wFSkIdaqd9cql@0UcAQTW13BB(JAi z*t1sZd{l`EX$VsR-@=}?>Xb^l-ZzQ0b0+lyjWWq5U(Js-yd%37QBToTSzIm*o$W~9@l$JnJzj?ep~ zX9M@r<&2yOcF*W!AR;H_umaC zXcDT0#7JXZYeM1cr%aM?;fcM-6#ys`o}{8=&?w%$=dXxf6O&H8QlaYOng3ux;*+en z=bFwt1B%b_#|xMkTV^;Yz*6FUswr65kZAMboXl}okShBL_l1gZ)?R zT$M9L+q!lbV=#1*?v^es5#ZJOG3to{zZpRKXElbWTIlt$H*^Y{`z2S%hd^3*c zS~`U-$Gz(h>Eqs^JMO`UlAWWSB)c~%o~p_rWY2b{h37fX#|*%HN+^x{BLVqTCmrGQ zZYwMSx|wug7s;Jyb1uMn(xEf@HRJv?VzaR-A!21mfCuH{c94lL#RHlsj2Js`G(S|6 z^&Hu$!B~jIL4ZwTMB_Y)fC(#`Jeu_a{#uOCDV5=lTxzlQ^0Bs$k#0aA9Yw(A$8>m% zh-W_x2t`Tf4g+t?`WI&J-hZht&6)aAz~?F-Aq^FV6EA9XP9Y)fQviF$m{kT)J@``; zv$zx|C!H2CepJ%wFnc%&zjafa|Da(*8eIw%2L7?NnuHkPtvwV#0?^qGJB%K)i{Xen z(mPM=aEyoLJLFW@PiM#N9i@5zkZq-|BjCuCW$FSu{n@7|fLOYENL;>10i5k;1%4{i z^z;ItqHCiW^6l?%3l#vy)j?9P@46e$Lh0R zR%cGFK8eF846LOOu4~wqQx!kbM5)x7F_1?IvPN zxjNo$SoDN~(Nb5afn2Po?Lo#FGbnwxj3#wRrz-vw~&C>A7B0d66K zq%VPHbq}XH;x1}9|K_dCT`Nb!XF<;@KJ6*3LEfAl>>J?)vu(cy^jDg{9tAXNq>=&qM8 zE+tDud{N(b0g~6*1fYZc!kR->G+D8>h4Prk#LyuzVtL#mn!>{NfTg#X&7ZV%eWppy zCsZ8GfNVNs7Mi|0p9=vvIyBu^HxSfu5lRm=g(;W(%vd5Tljs4DY_@$$bizjsVA-$u zNes`a&MxgVfcxQYIK4dXZes%x-tsXj8emVEL0a~d4@jFDuv#p7vh=KhO(fNEt?dO* zDF!63;XU9ShwlV0m&}nVc3vrn37kBggC-}i?MD1JS78MmA18C{`gc9-%gAW6tE?mO zC`k5`r^dz&e^moiV|j$lF)ZThKy`#aaQpjPhE2Ghn?}s$MF_C^)cxeNs`U z=&tYXL4Jo6e>?1MI2PZ?ylkx)5fv4{<4Ahy0o07~|E6){%~Cf;nZ{Ll6@0nYFTzdG ztWuO}ujYRg18Tt1 zs&mppm9wbnG+eH3!d{3aN_F-PBqG&=XOmTD$ubnNAp`f*G%y`cd!fCg9!c+>$MUsAxg1=&P#EY}!m z+GmPSqP5-)pKRu2Pp*`~nvGQv>xu+`yk}|{W9bSfNY7{Og`)~pGkamev9?sQk#Wt1 z;l(Lz#z@F41k?&{K?jTw+~l_TvjlgP@D_|X#I+wb;;@V4eGjbg22y^VDr66nBT4}3 zF@`Ol&Z?YQj<7i4jqC~AYy8lOkz_Rs*qvQ~Pq~GBg~^w8K!mfdp(qxK!7@80`J!M` zM7{KZs(FNNR-CUR%SwMD?|SmJi@}_YRF9G23kSHBeM1d^mHf1S*1X0m!GG~T(07=+ z;`^7E%qW~^_Xtdyna-;%(dHS|kRb(f3hoEY&<0I0Hq$ONyL(aFm(FG9JaO&~jk|l0 z>K=20F25YXW@e0vIfVWrAm|fxi4^mD- zW7kXym<3Y@K;h#04a+r%e-h-XW;j{k(8&Uv*=F;aafbC6?D#FJ$$*Vx%%hPHebw~Z zdfi=>7&*qhmeu3{AvMVmj>&*TDgiY{aeL4@1u7Mj)0V$9z~~eLkk%=xloOFod1q13 zL64%x`PSYcvA1AU*VJl>smAj2^@LFO>2WFjK?Cg6B|mO3xqi;jRNuQ69r_ik*;>}EdKa~{!r+C)LNv1)k>e(v&5ZEQCUem#-CV)y{FP*L__q9 zH-&xMZHuvm8>7Qs;7fSd+chmlw^REqn%MOe(cGG@|4%RPdLbNisacD#@xRqDJU*j6 zD9&DChiDLk!LoO!<@j!mb{N*?#I8YQhvzm znzl|Oj<6rJ7>$cy+}#H-37M)>+vnIl#kNL3{CD>xOc4MIF)GIBQ7-WQ!Cyl3T|f+r zp3Nc(&R8QW)F;!_OeGfAeuhGiE%80>T1o&Y#5kpxrR7+4jQ?XFz>wQ!N;T&)`6rL% z=IzJ&OQ%x1=L6+&fJnN_HK)WwY<$q@?&9lyJ0;$$<7nBhGrSOEW1wU)K?Oy9vWfOv zqwzt+hQxay6~+VBHirCZ8{;+GL_zmlN;h=Lj(Tp5RutAZ(hviLH{8vxL25w;1o4U( zq-CcrX!jiOa3w-@V+0q;d^HUN4vYK{)h;4?Vm%DMX%xE-n!+>2*=#H5nwVd*YZcYY z8q|kNN^##9>9N#e6hpn7MU<`nuE>?O5v%n;>F5;QYH z?ko=UPtHe1|4h?8XcH%|iZh0DC7b3jd@$Tah=`Aqqq!@0ak8$NpoYw{(VGe((#pwE zc+$*SjA@*`EptZbQvK-zFA_wT9wW{iWg-YQ0aeKD8mnYxUe|X%H=0=195Ejj>l$oV zV9oT#x(=x-1qAF&c@KYF5wkr8bBddA{i_4X&3N*hWgt!9bvGuc%KcP%lp>9+IDkV3 zDDCH?`~+fVC;*+ZcLVi>j*n!(8bGaTMi|e)SN{VI z;M9*HP z11LSkNt^FEc6l8lzlnS1PZG$weuSv6SMeR1NcHP0>n;KOJ!jWkAdOUg$k`PfREHS% zC&iuvamd6qXpeif=lRqJ$e~Blw;rVs$GL-MOD3|t>M0Z&mt%bAaZieoKhLyd47OR# znVR>VA2*HFEU`Xlj7MH%af%&2tzsH?(zFN7pPU&g{jzgr2;C!{nF$a63_f4q{$Gc) zUvi$=@te|3S(PNlxU2&1cb-15$yHdcpJsB6a_(nw3hZ3V*rR)sMD(`HJFhC=I7T-} z`-g0SKo98kP7dgPtF@W|uH53?lVdXnc(^fE0WEL>NWC{?`%W=tkF5D70;Dj~UtxcE@vj1G@$9T1F&<9$v6wd;OjNt=@j&gD2(f{avNtlm;7~vQ*e@2$OklDCZs(qN3 z4+Hj5{wdXp$CFXOkU!h!#B6pFq5p^r$bXjy$>%@#JPy|LlUWMP8DPRTEN-$f&N@Jz zF<=LGhv&K<5Cc~LL8%t;%;0+k4&Nw12wVk(@jXgnQehYmm;jdn+iKbU--y9j=rp>< z?E|Xu_9BerAjy)6D5J{0fNZ|R7m-gJxO-YtbC~-f$-E#hy+f#5<&A8M@$q+*fywe7V
  • ^(Lq6Q;{JVpa2}s9&gwO%l?{qnvdtn zD!?Q#}c&OvO+BwqG#)aeDlm?0S9@E+BDPE-v7jwTd;|F z?bG7<>jDAbyx5r-IZhZWnm}?;rFx}Y_4-z`QQXf}cX4t{O4Rq9Bfy_cF@TSsXHyIT zR1!nXMG=ty1J0%(v>5^9=jZ&hDL%xe_)}5^_UL8?PtTu{N->h_qyWhO!CRG7Z%9mv z`JK9FvPual&~H{Ln4mE#1#UQ25b>uB2&N$u3VbI30sY_7{>cVD{^a6v zO+Q9A9wt_>VT>xfCk6}@sg@G6!41yb&CvSsQHtC(`Tnn$4cxVW4|o4uy3>4wi|R3# zpO_f)52+8DiK%Dr&m!h;X8va8Z)R%5$hTo(#uBEwFp88tC8|I3QA?6NMdo3^GhT<6 z?}mNP{+5;loEUJ54tyZg*moVhvxl>O!f4@l%yZ0UwY+?|((@^O)9!nL$p~4bStbT> zO3HHN4?o*2rw^Yo~yw3seiom@n6zn832jZa>=`Y`2(+SEG7A&OKZvShBBwZMXgh zxA=2=s&V320<=H3oD={Gy2gO%pi3ChpzB?`LHCdG*8vLJ&Hnkh1r!Cq3wAu<`M$0d zfM+=m>Q{`>%YGTK-hweqs0$8bw(^RAn*}6OB?!QB*X0I@sRH`0#{){Hu-+8g@OZOO zdy!MlL~yB%LO>OJcF&M~w+`&=Yz_e5qg)0s zpvcetf1`T*O~sZtr74;jstKaMGOB5sf6rY1J5=BN8<|-HSy1kvcfX~Nh_1ms?i8#& z&ATH#^~!w28Zj9II2IA@$uhWGyf*l@%WN2 zn)Ws0O0;B)=8x+4Xo`_mO7EI6{CR~Re7!zy&HS5GH>{bA=+9U)|2Wl^%z>2ZVpt;% z`(i*f#JnvOa1(|CYJJVu$DN2g$^fI@;ehpS?ng^~2LJ#M{z*hZRFib1BEZpQP=u~# z1u;_}^Y#zSgSWgpAM+j*T7c8o3lHjGsXb7J3;fMHLlBIO68ts=25n9~_Xi?LFi4@daMhnJ6f0@u?W3YeW79XU1!u`ntJ`vRQh3J}i-;*4pSGY#q7H?DD7osI@ z8&!;hBu3cq!(g$Dc89V|3XPj6(!0 z&?S7+-+NIE(W=>I;;uJPQ4YmkHe(E%++r#~hP{cHn-GG$I+agDLo+;VUvLK8V`)ux zkKG&CoC-PBi0sntHSI-2PfYg7E=w&jKBr*yapG=0VlCnT?f=3bIYyu{?s$~sh9e*2 zrA-M99zJ{JuX&glV|+5_l=mJ}+!}H7V#}UP7FF&8V2mygST(xj>-sh!7?_zFsvuoB zpp|sNmQGEW8NAc0)=cuuDkBvSFf}jihH7Lu#25qv=;g1kSdm;jg@fnNFbS(EUO!4q zaWh0==fih}i#OhO8iFukj@M>CQR;8TF@@IP=9@h#@iL%G+0bnt;pH2sC05G$6MaoJ z_5i0;ak??!h$rTuo?F-86YKC-SQBQ6|G57*Bg7$^R$@~lz{Y4!2RsS;Ll+)OEHUWI&!yrGm z6w+r*+m0!v@lFODawLwI?4wGi3@Gf3Za`X(0K{7aU=_+SQZ7$7wA1&{oUs@Y=LJDf zUmJ)BXe^J3oMvU0UD7jMFlnC+c(Ro@cNN1^9Zo9qW*wdlaxS2JjLDTR3z(N+$hmHd zzlgTsM`l3c1Asr(y#KPvKgHrKlZ7}~WNbX?V`rQ6l=j(%>nmtwE%8>B8%q#B#j1jMiX#Eom2V;z3CY09| zF#Hwfg^&s*!^d&k5d)SBsJ)oPu+IS$twM~^AtjpGT}2o*?Olb-BF%QtwBefBxcr-= z5%7o@%YY8L4!Gel647CBgoT;;1ji5*Z%42H>~8~i-I*&XxCw0ze>bl^QI0QC`;N+- zrfH10-&L8DxQ%O6dowF@QZq9HP(Q}M%A5%|J6t3<@d2}^1>;VlYsGi~Zw3)Xg6cog z-V7%c5Ca96VswD@F?x)AC~zajfq;hggz6(cUG=ew^f+==+N@Ge&IHk8OkQsNDL~a2 zVPgRsFiztmQ9N}LplXZ~KK`QZgC|Bvb%v3Y%TF`d2c_h}9G@e8&DMlGjrD!pfk~$> zc5eVi9|(AN@r~|sECD2T4aZ00S_%K^X2#4CCEek=?I8#$nned_3R^hmnNQWNe3rxKfg7l{7{cqLFb+?IGe2Cf%K;;;r0w7BWG$??2sg|#JFI0TA z?c)_dC&vGU0%&w8b1k#Ax^qb{!8JuEP!Q9�GnV?etT#pCaO`05)JOMfxi+`sxLH z^5$?y2tvxoBh-rN$5?v(t`TDqPo|Tix6vF!sA=+m9)9>}3^@yOq8GrIFIoCRYH$c46ETKab?<9Hfc5KX2+f z^)+=8Gd}MFWW|6i?pI9ac6AD~%1TUDOhcL$NS`5XRJrN;8S(g7HTS~AdFESM~(4;n3rVmHDY{{7+)_G=clW9ArguU8Vd%^t>z*+Zt;`p zZlepAK9W)-Pdp*0YdpY0?w*)xj&&KJ2ICVAun*(hWJ$jjgfG_D5Q@J{VR(I8_=v1Z zmW|2w`nS7|!nh3HTxGlKQ@0m}Ngltu2HbpnxCkSu>edX z2>~iZt222QEQF2AVn1xfw0VFhn-{Okpw0jIYJKd9tq>NUbe-k__jT<;5LmzlVu~o+ z84gebt`UIO4~fvKj;>K!_c0f+nLSJj%{#5V5!Fo^Z<}3gsx5~diuB#{M-q|ok#%kv zyX*M48N(w@&*+Ivr3xz$C^hVfm5W2cVyaTyhWgGFY50Ndn&cmzMh6IzzAs)eR1dGX zE0)KtR)5it@om+g{1!LzMH@KL{P`?DA%XPR1N0x?c0pq!G3NX0?xX`YD!wQ0*HmB` zp06Md(w21$HEwYeZk$3qLG2hrGWih&j>uAd=Xr)1BSFjrp`a5R()FWaxRGa5P=U#s zxHP}r75tkgWsH$Q)Nmo7x@yt&s1jAa^ySZmZ>w4~|#RD)-rosh%i318xd!Bcz9vpBd8Qf$SfW`sxB0BWCWk>}OFZf)CP_S_WO`Y=Q&+ zEa@3{<3k)+hq>&W8AUe$NcdV1prY&4I0={$;D@Bz4vwj2GH6ei_Y$Uk>Rgv{wOXC2 zpl$^LsKAJ_{~|fKR+ZwI65iHY?*47Nybkg$Jpw=r8?Qy(^%b6C7Enq|d|b9HW{>2> zrl@y2A^|h4O@-vWGlFdsKXW9XLM-Dhg$77s0DPwhiEXIH`Da=7bXy}J`n&8QO8_Xu zs2O8Zh1nv;aF@80-pi%}3WBJgZQDom78U```j=F_6e|EwF%d4;tN{tn3+Q4%In@zm z5%5E-lx3VOUM&$bQp7ADj&noZ(B^iHA_n)c4zX4Ooa7 zYBUSsn#lm=7&YnX@0uBK_wj4T7-k~OIHA=Kk=na{suZ)s+-&mY`!Jvc<4N5lWPtY9 zv=jnBc@vhir=0tpuT{IEWnucb4=Et~*#d6pjKi_#B5#oxFTK%<3D=se<_!jMP#4|v z0MAmXpVlM5mIkH#9AHXMgl!?FrT{$P5h9xU9}q};Cb3S4OclNrp?WNWbyT2_J>kkU zi*y(zo+0g>=J=<<_Dn47H?gXQ4rB5{2E-R@ypRE3 z{eHT)-#s(|D6x^`iz|+?_(BF4a^vi8OUrW2QL!xOBO z(XOF+AzJ0criQ?@id8r{60kN#DKYHu+c6#+`5Xt?^}bi%^HtrPLF4%DF3&=pV12ra zAETY?@F8QG+9$Qw;@z-Y@fn?quMnqU%%SH5e~*7H=6?6@j%xXqHGM#SvSf3i$d_~L zBQVM-{AF(!PzM?nM&z{{S93q-G;t$d1axKfb%3HVUQMJ9Hq0O5=?mMe!EV+iS<`?x z0wm!?PkVR>^-XGKs9oV(ymt%_E52m zHrzLB>FTC%OV?ibMhdvc&^INZW{fqKPnhf0nK5F?6QiQKV4=(eRE;rj`Du9C%#`OQ z9pj!3uAS5~9Xnwc6vu}W(dFuGb4sH#-``O9z9rw=$h(#Rx=}^DyNHp#!XW^WVox?IwPa5}(GO7*RKx9D86f?Nn72p; zd!ex1exkZbNC)UhZ5$gCbGtcz^IFMG-BN16-rh_M#>luor~nqcE}HH%3m9>AWdY!> z18f~56@RIwx}sDLWwwh^Dz*5h=G$i0@zR1ZW#7*L>c&XTNDIc>aD8U9WJ%p$?&A86}LDu9Z9r0Ifj`Iqj9%H!gvD=@&479#)`Qj2g0mWk+zqnku u;M!RAtcGz&v{WpE78?mj%YHhm=lLJmPUiG@;u^gG0000 + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/speed_tracker + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/speed_trackerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:6141114.8 %
    Date:2024-04-18 23:11:36Functions:71936.8 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    speed_tracker.cpp +
    14.8%14.8%
    +
    14.8 %61 / 41136.8 %7 / 19
    <unnamed>14.8 %61 / 41136.8 %7 / 19
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/speed_tracker/index-detail-sort-l.html b/mrs_uav_trackers/src/speed_tracker/index-detail-sort-l.html new file mode 100644 index 0000000000..43486d0d92 --- /dev/null +++ b/mrs_uav_trackers/src/speed_tracker/index-detail-sort-l.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/speed_tracker + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/speed_trackerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:6141114.8 %
    Date:2024-04-18 23:11:36Functions:71936.8 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    speed_tracker.cpp +
    14.8%14.8%
    +
    14.8 %61 / 41136.8 %7 / 19
    <unnamed>14.8 %61 / 41136.8 %7 / 19
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/speed_tracker/index-detail.html b/mrs_uav_trackers/src/speed_tracker/index-detail.html new file mode 100644 index 0000000000..01461a9a26 --- /dev/null +++ b/mrs_uav_trackers/src/speed_tracker/index-detail.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/speed_tracker + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/speed_trackerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:6141114.8 %
    Date:2024-04-18 23:11:36Functions:71936.8 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    speed_tracker.cpp +
    14.8%14.8%
    +
    14.8 %61 / 41136.8 %7 / 19
    <unnamed>14.8 %61 / 41136.8 %7 / 19
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/speed_tracker/index-sort-f.html b/mrs_uav_trackers/src/speed_tracker/index-sort-f.html new file mode 100644 index 0000000000..163e42fd31 --- /dev/null +++ b/mrs_uav_trackers/src/speed_tracker/index-sort-f.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/speed_tracker + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/speed_trackerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:6141114.8 %
    Date:2024-04-18 23:11:36Functions:71936.8 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    speed_tracker.cpp +
    14.8%14.8%
    +
    14.8 %61 / 41136.8 %7 / 19
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/speed_tracker/index-sort-l.html b/mrs_uav_trackers/src/speed_tracker/index-sort-l.html new file mode 100644 index 0000000000..4680ee8808 --- /dev/null +++ b/mrs_uav_trackers/src/speed_tracker/index-sort-l.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/speed_tracker + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/speed_trackerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:6141114.8 %
    Date:2024-04-18 23:11:36Functions:71936.8 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    speed_tracker.cpp +
    14.8%14.8%
    +
    14.8 %61 / 41136.8 %7 / 19
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/speed_tracker/index.html b/mrs_uav_trackers/src/speed_tracker/index.html new file mode 100644 index 0000000000..92caf7b2b8 --- /dev/null +++ b/mrs_uav_trackers/src/speed_tracker/index.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/speed_tracker + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/speed_trackerHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:6141114.8 %
    Date:2024-04-18 23:11:36Functions:71936.8 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    speed_tracker.cpp +
    14.8%14.8%
    +
    14.8 %61 / 41136.8 %7 / 19
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/speed_tracker/speed_tracker.cpp.func-sort-c.html b/mrs_uav_trackers/src/speed_tracker/speed_tracker.cpp.func-sort-c.html new file mode 100644 index 0000000000..a6f6080e84 --- /dev/null +++ b/mrs_uav_trackers/src/speed_tracker/speed_tracker.cpp.func-sort-c.html @@ -0,0 +1,156 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/speed_tracker/speed_tracker.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/speed_tracker - speed_tracker.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:6141114.8 %
    Date:2024-04-18 23:11:36Functions:71936.8 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_trackers::speed_tracker::SpeedTracker::resetStatic()0
    mrs_uav_trackers::speed_tracker::SpeedTracker::setReference(boost::shared_ptr<mrs_msgs::ReferenceSrvRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::speed_tracker::SpeedTracker::callbackCommand(boost::shared_ptr<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > const>)0
    mrs_uav_trackers::speed_tracker::SpeedTracker::gotoTrajectoryStart(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::speed_tracker::SpeedTracker::setVelocityReference(boost::shared_ptr<mrs_msgs::VelocityReferenceSrvRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::speed_tracker::SpeedTracker::switchOdometrySource(mrs_msgs::UavState_<std::allocator<void> > const&)0
    mrs_uav_trackers::speed_tracker::SpeedTracker::stopTrajectoryTracking(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::speed_tracker::SpeedTracker::startTrajectoryTracking(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::speed_tracker::SpeedTracker::resumeTrajectoryTracking(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::speed_tracker::SpeedTracker::hover(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::speed_tracker::SpeedTracker::activate[abi:cxx11](std::optional<mrs_msgs::TrackerCommand_<std::allocator<void> > > const&)0
    mrs_uav_trackers::speed_tracker::SpeedTracker::getStatus()0
    mrs_uav_trackers::speed_tracker::SpeedTracker::setTrajectoryReference(boost::shared_ptr<mrs_msgs::TrajectoryReferenceSrvRequest_<std::allocator<void> > const> const&)4
    mrs_uav_trackers::speed_tracker::SpeedTracker::deactivate()20
    (anonymous namespace)::ProxyExec0::ProxyExec0()91
    mrs_uav_trackers::speed_tracker::SpeedTracker::initialize(ros::NodeHandle const&, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t>, std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t>)91
    mrs_uav_trackers::speed_tracker::SpeedTracker::setConstraints(boost::shared_ptr<mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> > const> const&)298
    mrs_uav_trackers::speed_tracker::SpeedTracker::enableCallbacks(boost::shared_ptr<std_srvs::SetBoolRequest_<std::allocator<void> > const> const&)313
    mrs_uav_trackers::speed_tracker::SpeedTracker::update(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_uav_managers::Controller::ControlOutput const&)120314
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/speed_tracker/speed_tracker.cpp.func.html b/mrs_uav_trackers/src/speed_tracker/speed_tracker.cpp.func.html new file mode 100644 index 0000000000..a6283962b4 --- /dev/null +++ b/mrs_uav_trackers/src/speed_tracker/speed_tracker.cpp.func.html @@ -0,0 +1,156 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/speed_tracker/speed_tracker.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/speed_tracker - speed_tracker.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:6141114.8 %
    Date:2024-04-18 23:11:36Functions:71936.8 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    (anonymous namespace)::ProxyExec0::ProxyExec0()91
    mrs_uav_trackers::speed_tracker::SpeedTracker::deactivate()20
    mrs_uav_trackers::speed_tracker::SpeedTracker::initialize(ros::NodeHandle const&, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t>, std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t>)91
    mrs_uav_trackers::speed_tracker::SpeedTracker::resetStatic()0
    mrs_uav_trackers::speed_tracker::SpeedTracker::setReference(boost::shared_ptr<mrs_msgs::ReferenceSrvRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::speed_tracker::SpeedTracker::setConstraints(boost::shared_ptr<mrs_msgs::DynamicsConstraintsSrvRequest_<std::allocator<void> > const> const&)298
    mrs_uav_trackers::speed_tracker::SpeedTracker::callbackCommand(boost::shared_ptr<mrs_msgs::SpeedTrackerCommand_<std::allocator<void> > const>)0
    mrs_uav_trackers::speed_tracker::SpeedTracker::enableCallbacks(boost::shared_ptr<std_srvs::SetBoolRequest_<std::allocator<void> > const> const&)313
    mrs_uav_trackers::speed_tracker::SpeedTracker::gotoTrajectoryStart(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::speed_tracker::SpeedTracker::setVelocityReference(boost::shared_ptr<mrs_msgs::VelocityReferenceSrvRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::speed_tracker::SpeedTracker::switchOdometrySource(mrs_msgs::UavState_<std::allocator<void> > const&)0
    mrs_uav_trackers::speed_tracker::SpeedTracker::setTrajectoryReference(boost::shared_ptr<mrs_msgs::TrajectoryReferenceSrvRequest_<std::allocator<void> > const> const&)4
    mrs_uav_trackers::speed_tracker::SpeedTracker::stopTrajectoryTracking(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::speed_tracker::SpeedTracker::startTrajectoryTracking(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::speed_tracker::SpeedTracker::resumeTrajectoryTracking(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::speed_tracker::SpeedTracker::hover(boost::shared_ptr<std_srvs::TriggerRequest_<std::allocator<void> > const> const&)0
    mrs_uav_trackers::speed_tracker::SpeedTracker::update(mrs_msgs::UavState_<std::allocator<void> > const&, mrs_uav_managers::Controller::ControlOutput const&)120314
    mrs_uav_trackers::speed_tracker::SpeedTracker::activate[abi:cxx11](std::optional<mrs_msgs::TrackerCommand_<std::allocator<void> > > const&)0
    mrs_uav_trackers::speed_tracker::SpeedTracker::getStatus()0
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/speed_tracker/speed_tracker.cpp.gcov.frameset.html b/mrs_uav_trackers/src/speed_tracker/speed_tracker.cpp.gcov.frameset.html new file mode 100644 index 0000000000..8377e2d518 --- /dev/null +++ b/mrs_uav_trackers/src/speed_tracker/speed_tracker.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/speed_tracker/speed_tracker.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_trackers/src/speed_tracker/speed_tracker.cpp.gcov.html b/mrs_uav_trackers/src/speed_tracker/speed_tracker.cpp.gcov.html new file mode 100644 index 0000000000..544f298cce --- /dev/null +++ b/mrs_uav_trackers/src/speed_tracker/speed_tracker.cpp.gcov.html @@ -0,0 +1,1178 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/speed_tracker/speed_tracker.cpp + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trackers/src/speed_tracker - speed_tracker.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:6141114.8 %
    Date:2024-04-18 23:11:36Functions:71936.8 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : /* includes //{ */
    +       2             : 
    +       3             : #include <ros/ros.h>
    +       4             : 
    +       5             : #include <mrs_uav_managers/tracker.h>
    +       6             : 
    +       7             : #include <mrs_msgs/SpeedTrackerCommand.h>
    +       8             : #include <mrs_msgs/VelocityReferenceSrv.h>
    +       9             : 
    +      10             : #include <mrs_lib/profiler.h>
    +      11             : #include <mrs_lib/mutex.h>
    +      12             : #include <mrs_lib/attitude_converter.h>
    +      13             : #include <mrs_lib/subscribe_handler.h>
    +      14             : #include <mrs_lib/geometry/cyclic.h>
    +      15             : #include <mrs_lib/geometry/misc.h>
    +      16             : #include <mrs_lib/publisher_handler.h>
    +      17             : 
    +      18             : #include <visualization_msgs/Marker.h>
    +      19             : #include <visualization_msgs/MarkerArray.h>
    +      20             : 
    +      21             : //}
    +      22             : 
    +      23             : /* defines //{ */
    +      24             : 
    +      25             : #define STOP_THR 1e-3
    +      26             : 
    +      27             : //}
    +      28             : 
    +      29             : /* using //{ */
    +      30             : 
    +      31             : using vec2_t = mrs_lib::geometry::vec_t<2>;
    +      32             : using vec3_t = mrs_lib::geometry::vec_t<3>;
    +      33             : 
    +      34             : using radians  = mrs_lib::geometry::radians;
    +      35             : using sradians = mrs_lib::geometry::sradians;
    +      36             : 
    +      37             : //}
    +      38             : 
    +      39             : namespace mrs_uav_trackers
    +      40             : {
    +      41             : 
    +      42             : namespace speed_tracker
    +      43             : {
    +      44             : 
    +      45             : /* //{ class SpeedTracker */
    +      46             : 
    +      47             : class SpeedTracker : public mrs_uav_managers::Tracker {
    +      48             : public:
    +      49             :   bool initialize(const ros::NodeHandle &nh, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t> common_handlers,
    +      50             :                   std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t> private_handlers);
    +      51             : 
    +      52             :   std::tuple<bool, std::string> activate(const std::optional<mrs_msgs::TrackerCommand> &last_tracker_cmd);
    +      53             :   void                          deactivate(void);
    +      54             :   bool                          resetStatic(void);
    +      55             : 
    +      56             :   std::optional<mrs_msgs::TrackerCommand>   update(const mrs_msgs::UavState &uav_state, const mrs_uav_managers::Controller::ControlOutput &last_control_output);
    +      57             :   const mrs_msgs::TrackerStatus             getStatus();
    +      58             :   const std_srvs::SetBoolResponse::ConstPtr enableCallbacks(const std_srvs::SetBoolRequest::ConstPtr &cmd);
    +      59             :   const std_srvs::TriggerResponse::ConstPtr switchOdometrySource(const mrs_msgs::UavState &new_uav_state);
    +      60             : 
    +      61             :   const mrs_msgs::ReferenceSrvResponse::ConstPtr           setReference(const mrs_msgs::ReferenceSrvRequest::ConstPtr &cmd);
    +      62             :   const mrs_msgs::VelocityReferenceSrvResponse::ConstPtr   setVelocityReference(const mrs_msgs::VelocityReferenceSrvRequest::ConstPtr &cmd);
    +      63             :   const mrs_msgs::TrajectoryReferenceSrvResponse::ConstPtr setTrajectoryReference(const mrs_msgs::TrajectoryReferenceSrvRequest::ConstPtr &cmd);
    +      64             : 
    +      65             :   const mrs_msgs::DynamicsConstraintsSrvResponse::ConstPtr setConstraints(const mrs_msgs::DynamicsConstraintsSrvRequest::ConstPtr &cmd);
    +      66             : 
    +      67             :   const std_srvs::TriggerResponse::ConstPtr hover(const std_srvs::TriggerRequest::ConstPtr &cmd);
    +      68             :   const std_srvs::TriggerResponse::ConstPtr startTrajectoryTracking(const std_srvs::TriggerRequest::ConstPtr &cmd);
    +      69             :   const std_srvs::TriggerResponse::ConstPtr stopTrajectoryTracking(const std_srvs::TriggerRequest::ConstPtr &cmd);
    +      70             :   const std_srvs::TriggerResponse::ConstPtr resumeTrajectoryTracking(const std_srvs::TriggerRequest::ConstPtr &cmd);
    +      71             :   const std_srvs::TriggerResponse::ConstPtr gotoTrajectoryStart(const std_srvs::TriggerRequest::ConstPtr &cmd);
    +      72             : 
    +      73             : private:
    +      74             :   ros::NodeHandle nh_;
    +      75             : 
    +      76             :   bool callbacks_enabled_ = true;
    +      77             : 
    +      78             :   std::string _uav_name_;
    +      79             : 
    +      80             :   std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t>  common_handlers_;
    +      81             :   std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t> private_handlers_;
    +      82             : 
    +      83             :   mrs_lib::PublisherHandler<visualization_msgs::MarkerArray> ph_rviz_marker_;
    +      84             : 
    +      85             :   // | ------------------------ uav state ----------------------- |
    +      86             : 
    +      87             :   mrs_msgs::UavState uav_state_;
    +      88             :   bool               got_uav_state_ = false;
    +      89             :   std::mutex         mutex_uav_state_;
    +      90             : 
    +      91             :   // | ------------------- tracker constraints ------------------ |
    +      92             : 
    +      93             :   mrs_msgs::DynamicsConstraints constraints_;
    +      94             :   std::mutex                    mutex_constraints_;
    +      95             : 
    +      96             :   // | ---------------- the tracker's inner state --------------- |
    +      97             : 
    +      98             :   bool is_initialized_  = false;
    +      99             :   bool is_active_       = false;
    +     100             :   bool first_iteration_ = true;
    +     101             : 
    +     102             :   double _external_command_timeout_;
    +     103             : 
    +     104             :   mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand> sh_command_;
    +     105             : 
    +     106             :   void callbackCommand(const mrs_msgs::SpeedTrackerCommand::ConstPtr msg);
    +     107             : 
    +     108             :   // stores the post-processed and transformed command
    +     109             :   mrs_msgs::SpeedTrackerCommand command_;
    +     110             :   std::mutex                    mutex_command_;
    +     111             :   ros::Time                     last_command_time_;
    +     112             : 
    +     113             :   // | ------------------------ profiler ------------------------ |
    +     114             : 
    +     115             :   mrs_lib::Profiler profiler_;
    +     116             :   bool              _profiler_enabled_ = false;
    +     117             : };
    +     118             : 
    +     119             : //}
    +     120             : 
    +     121             : // | -------------- tracker's interface routines -------------- |
    +     122             : 
    +     123             : /* //{ initialize() */
    +     124             : 
    +     125          91 : bool SpeedTracker::initialize(const ros::NodeHandle &nh, std::shared_ptr<mrs_uav_managers::control_manager::CommonHandlers_t> common_handlers,
    +     126             :                               std::shared_ptr<mrs_uav_managers::control_manager::PrivateHandlers_t> private_handlers) {
    +     127             : 
    +     128          91 :   this->common_handlers_  = common_handlers;
    +     129          91 :   this->private_handlers_ = private_handlers;
    +     130             : 
    +     131          91 :   _uav_name_ = common_handlers->uav_name;
    +     132             : 
    +     133          91 :   nh_ = nh;
    +     134             : 
    +     135          91 :   ros::Time::waitForValid();
    +     136             : 
    +     137             :   // --------------------------------------------------------------
    +     138             :   // |                     loading parameters                     |
    +     139             :   // --------------------------------------------------------------
    +     140             : 
    +     141             :   // | ---------------- load parent's parameters ---------------- |
    +     142             : 
    +     143         182 :   mrs_lib::ParamLoader param_loader_parent(common_handlers->parent_nh, "ControlManager");
    +     144             : 
    +     145          91 :   param_loader_parent.loadParam("enable_profiler", _profiler_enabled_);
    +     146             : 
    +     147          91 :   if (!param_loader_parent.loadedSuccessfully()) {
    +     148           0 :     ROS_ERROR("[SpeedTracker]: Could not load all parameters!");
    +     149           0 :     return false;
    +     150             :   }
    +     151             : 
    +     152             :   // | ---------------- load plugin's parameters ---------------- |
    +     153             : 
    +     154          91 :   private_handlers->param_loader->addYamlFile(ros::package::getPath("mrs_uav_trackers") + "/config/private/speed_tracker.yaml");
    +     155          91 :   private_handlers->param_loader->addYamlFile(ros::package::getPath("mrs_uav_trackers") + "/config/public/speed_tracker.yaml");
    +     156             : 
    +     157         182 :   const std::string yaml_prefix = "mrs_uav_trackers/speed_tracker/";
    +     158             : 
    +     159          91 :   private_handlers->param_loader->loadParam(yaml_prefix + "command_timeout", _external_command_timeout_);
    +     160             : 
    +     161          91 :   if (!private_handlers->param_loader->loadedSuccessfully()) {
    +     162           0 :     ROS_ERROR("[SpeedTracker]: could not load all parameters!");
    +     163           0 :     return false;
    +     164             :   }
    +     165             : 
    +     166             :   // | ------------------------ profiler ------------------------ |
    +     167             : 
    +     168          91 :   profiler_ = mrs_lib::Profiler(common_handlers->parent_nh, "SpeedTracker", _profiler_enabled_);
    +     169             : 
    +     170             :   // | ----------------------- subscribers ---------------------- |
    +     171             : 
    +     172          91 :   mrs_lib::SubscribeHandlerOptions shopts;
    +     173          91 :   shopts.nh              = nh_;
    +     174          91 :   shopts.node_name       = "SpeedTracker";
    +     175          91 :   shopts.threadsafe      = true;
    +     176          91 :   shopts.autostart       = true;
    +     177          91 :   shopts.transport_hints = ros::TransportHints().tcpNoDelay();
    +     178             : 
    +     179          91 :   sh_command_ = mrs_lib::SubscribeHandler<mrs_msgs::SpeedTrackerCommand>(shopts, "command", &SpeedTracker::callbackCommand, this);
    +     180             : 
    +     181             :   // | ----------------------- publishers ----------------------- |
    +     182             : 
    +     183          91 :   ph_rviz_marker_ = mrs_lib::PublisherHandler<visualization_msgs::MarkerArray>(nh_, "rviz_marker", 1);
    +     184             : 
    +     185             :   // | --------------------- finish the init -------------------- |
    +     186             : 
    +     187          91 :   is_initialized_ = true;
    +     188             : 
    +     189          91 :   ROS_INFO("[SpeedTracker]: initialized");
    +     190             : 
    +     191          91 :   return true;
    +     192             : }
    +     193             : 
    +     194             : //}
    +     195             : 
    +     196             : /* //{ activate() */
    +     197             : 
    +     198           0 : std::tuple<bool, std::string> SpeedTracker::activate([[maybe_unused]] const std::optional<mrs_msgs::TrackerCommand> &last_tracker_cmd) {
    +     199             : 
    +     200           0 :   std::stringstream ss;
    +     201             : 
    +     202           0 :   if (!got_uav_state_) {
    +     203           0 :     ss << "odometry not set";
    +     204           0 :     ROS_ERROR_STREAM("[SpeedTracker]: " << ss.str());
    +     205           0 :     return std::tuple(false, ss.str());
    +     206             :   }
    +     207             : 
    +     208           0 :   if (!sh_command_.hasMsg()) {
    +     209           0 :     ss << "missing command";
    +     210           0 :     ROS_ERROR_STREAM("[SpeedTracker]: " << ss.str());
    +     211           0 :     return std::tuple(false, ss.str());
    +     212             :   }
    +     213             : 
    +     214           0 :   ros::Time external_command_time = sh_command_.lastMsgTime();
    +     215             : 
    +     216             :   // timeout the external command
    +     217           0 :   if ((ros::Time::now() - external_command_time).toSec() > _external_command_timeout_) {
    +     218           0 :     ss << "the command is too old";
    +     219           0 :     ROS_ERROR_STREAM("[SpeedTracker]: " << ss.str());
    +     220           0 :     return std::tuple(false, ss.str());
    +     221             :   }
    +     222             : 
    +     223           0 :   is_active_ = true;
    +     224             : 
    +     225           0 :   ss << "activated";
    +     226           0 :   ROS_INFO_STREAM("[SpeedTracker]: " << ss.str());
    +     227             : 
    +     228           0 :   return std::tuple(true, ss.str());
    +     229             : }
    +     230             : 
    +     231             : //}
    +     232             : 
    +     233             : /* //{ deactivate() */
    +     234             : 
    +     235          20 : void SpeedTracker::deactivate(void) {
    +     236             : 
    +     237          20 :   is_active_ = false;
    +     238             : 
    +     239          20 :   ROS_INFO("[SpeedTracker]: deactivated");
    +     240          20 : }
    +     241             : 
    +     242             : //}
    +     243             : 
    +     244             : /* //{ resetStatic() */
    +     245             : 
    +     246           0 : bool SpeedTracker::resetStatic(void) {
    +     247             : 
    +     248           0 :   return false;
    +     249             : }
    +     250             : 
    +     251             : //}
    +     252             : 
    +     253             : /* //{ update() */
    +     254             : 
    +     255      120314 : std::optional<mrs_msgs::TrackerCommand> SpeedTracker::update(const mrs_msgs::UavState &                                          uav_state,
    +     256             :                                                              [[maybe_unused]] const mrs_uav_managers::Controller::ControlOutput &last_control_output) {
    +     257             : 
    +     258      360942 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("update");
    +     259      360942 :   mrs_lib::ScopeTimer timer = mrs_lib::ScopeTimer("SpeedTracker::update", common_handlers_->scope_timer.logger, common_handlers_->scope_timer.enabled);
    +     260             : 
    +     261             :   {
    +     262      120314 :     std::scoped_lock lock(mutex_uav_state_);
    +     263             : 
    +     264      120314 :     uav_state_ = uav_state;
    +     265             : 
    +     266      120314 :     got_uav_state_ = true;
    +     267             :   }
    +     268             : 
    +     269             :   double uav_heading;
    +     270             : 
    +     271             :   try {
    +     272      120314 :     uav_heading = mrs_lib::AttitudeConverter(uav_state_.pose.orientation).getHeading();
    +     273             :   }
    +     274           0 :   catch (...) {
    +     275           0 :     ROS_ERROR_THROTTLE(1.0, "[SpeedTracker]: could not calculate UAV heading");
    +     276             : 
    +     277           0 :     return {};
    +     278             :   }
    +     279             : 
    +     280             :   // up to this part the update() method is evaluated even when the tracker is not active
    +     281      120314 :   if (!is_active_) {
    +     282      120314 :     return {};
    +     283             :   }
    +     284             : 
    +     285           0 :   ros::Time external_command_time = sh_command_.lastMsgTime();
    +     286             : 
    +     287             :   // timeout the external command
    +     288           0 :   if (sh_command_.hasMsg() && (ros::Time::now() - external_command_time).toSec() > _external_command_timeout_) {
    +     289           0 :     ROS_ERROR("[SpeedTracker]: command timeouted, returning nil");
    +     290           0 :     first_iteration_ = true;
    +     291           0 :     return {};
    +     292             :   }
    +     293             : 
    +     294           0 :   auto command = mrs_lib::get_mutexed(mutex_command_, command_);
    +     295             : 
    +     296           0 :   mrs_msgs::TrackerCommand tracker_cmd;
    +     297             : 
    +     298           0 :   tracker_cmd.header.stamp    = ros::Time::now();
    +     299           0 :   tracker_cmd.header.frame_id = uav_state.header.frame_id;
    +     300             : 
    +     301           0 :   tracker_cmd.position.x = uav_state.pose.position.x;
    +     302           0 :   tracker_cmd.position.y = uav_state.pose.position.y;
    +     303             : 
    +     304           0 :   if (command.use_velocity) {
    +     305           0 :     tracker_cmd.velocity.x              = command.velocity.x;
    +     306           0 :     tracker_cmd.velocity.y              = command.velocity.y;
    +     307           0 :     tracker_cmd.velocity.z              = command.velocity.z;
    +     308           0 :     tracker_cmd.use_velocity_horizontal = true;
    +     309           0 :     tracker_cmd.use_velocity_vertical   = true;
    +     310             :   } else {
    +     311           0 :     tracker_cmd.velocity.x              = uav_state.velocity.linear.x;
    +     312           0 :     tracker_cmd.velocity.y              = uav_state.velocity.linear.y;
    +     313           0 :     tracker_cmd.velocity.z              = uav_state.velocity.linear.z;
    +     314           0 :     tracker_cmd.use_velocity_horizontal = false;
    +     315           0 :     tracker_cmd.use_velocity_vertical   = false;
    +     316             :   }
    +     317             : 
    +     318           0 :   if (command.use_z) {
    +     319           0 :     tracker_cmd.position.z            = command.z;
    +     320           0 :     tracker_cmd.use_position_vertical = true;
    +     321             :   } else {
    +     322           0 :     tracker_cmd.position.z            = uav_state.pose.position.z;
    +     323           0 :     tracker_cmd.use_position_vertical = false;
    +     324             :   }
    +     325             : 
    +     326           0 :   if (command.use_acceleration) {
    +     327           0 :     tracker_cmd.acceleration.x   = command.acceleration.x;
    +     328           0 :     tracker_cmd.acceleration.y   = command.acceleration.y;
    +     329           0 :     tracker_cmd.acceleration.z   = command.acceleration.z;
    +     330           0 :     tracker_cmd.use_acceleration = true;
    +     331           0 :   } else if (command.use_force) {
    +     332           0 :     tracker_cmd.acceleration.x   = command.force.x / last_control_output.diagnostics.total_mass;
    +     333           0 :     tracker_cmd.acceleration.y   = command.force.y / last_control_output.diagnostics.total_mass;
    +     334           0 :     tracker_cmd.acceleration.z   = command.force.z / last_control_output.diagnostics.total_mass;
    +     335           0 :     tracker_cmd.use_acceleration = true;
    +     336             :   } else {
    +     337           0 :     tracker_cmd.acceleration.x   = 0;
    +     338           0 :     tracker_cmd.acceleration.y   = 0;
    +     339           0 :     tracker_cmd.acceleration.z   = 0;
    +     340           0 :     tracker_cmd.use_acceleration = false;
    +     341             :   }
    +     342             : 
    +     343           0 :   if (command.use_heading) {
    +     344           0 :     tracker_cmd.heading     = command.heading;
    +     345           0 :     tracker_cmd.use_heading = true;
    +     346             :   } else {
    +     347           0 :     tracker_cmd.heading     = uav_heading;
    +     348           0 :     tracker_cmd.use_heading = false;
    +     349             :   }
    +     350             : 
    +     351           0 :   if (command.use_heading_rate) {
    +     352           0 :     tracker_cmd.heading_rate     = command.heading_rate;
    +     353           0 :     tracker_cmd.use_heading_rate = true;
    +     354             :   } else {
    +     355           0 :     tracker_cmd.heading_rate     = uav_state.velocity.angular.z;
    +     356           0 :     tracker_cmd.use_heading_rate = false;
    +     357             :   }
    +     358             : 
    +     359           0 :   return {tracker_cmd};
    +     360             : }
    +     361             : 
    +     362             : //}
    +     363             : 
    +     364             : /* //{ getStatus() */
    +     365             : 
    +     366           0 : const mrs_msgs::TrackerStatus SpeedTracker::getStatus() {
    +     367             : 
    +     368           0 :   mrs_msgs::TrackerStatus tracker_status;
    +     369             : 
    +     370           0 :   tracker_status.active            = is_active_;
    +     371           0 :   tracker_status.callbacks_enabled = callbacks_enabled_;
    +     372             : 
    +     373           0 :   return tracker_status;
    +     374             : }
    +     375             : 
    +     376             : //}
    +     377             : 
    +     378             : /* //{ enableCallbacks() */
    +     379             : 
    +     380         313 : const std_srvs::SetBoolResponse::ConstPtr SpeedTracker::enableCallbacks(const std_srvs::SetBoolRequest::ConstPtr &cmd) {
    +     381             : 
    +     382         626 :   std_srvs::SetBoolResponse res;
    +     383         626 :   std::stringstream         ss;
    +     384             : 
    +     385         313 :   if (cmd->data != callbacks_enabled_) {
    +     386             : 
    +     387          19 :     callbacks_enabled_ = cmd->data;
    +     388             : 
    +     389          19 :     ss << "callbacks " << (callbacks_enabled_ ? "enabled" : "disabled");
    +     390          19 :     ROS_INFO_STREAM_THROTTLE(1.0, "[SpeedTracker]: " << ss.str());
    +     391             : 
    +     392             :   } else {
    +     393             : 
    +     394         294 :     ss << "callbacks were already " << (callbacks_enabled_ ? "enabled" : "disabled");
    +     395         294 :     ROS_WARN_STREAM_THROTTLE(1.0, "[SpeedTracker]: " << ss.str());
    +     396             :   }
    +     397             : 
    +     398         313 :   res.message = ss.str();
    +     399         313 :   res.success = true;
    +     400             : 
    +     401         626 :   return std_srvs::SetBoolResponse::ConstPtr(new std_srvs::SetBoolResponse(res));
    +     402             : }
    +     403             : 
    +     404             : //}
    +     405             : 
    +     406             : /* switchOdometrySource() //{ */
    +     407             : 
    +     408           0 : const std_srvs::TriggerResponse::ConstPtr SpeedTracker::switchOdometrySource([[maybe_unused]] const mrs_msgs::UavState &new_uav_state) {
    +     409             : 
    +     410           0 :   return std_srvs::TriggerResponse::Ptr();
    +     411             : }
    +     412             : 
    +     413             : //}
    +     414             : 
    +     415             : /* //{ hover() */
    +     416             : 
    +     417           0 : const std_srvs::TriggerResponse::ConstPtr SpeedTracker::hover([[maybe_unused]] const std_srvs::TriggerRequest::ConstPtr &cmd) {
    +     418             : 
    +     419           0 :   return std_srvs::TriggerResponse::Ptr();
    +     420             : }
    +     421             : 
    +     422             : //}
    +     423             : 
    +     424             : /* //{ startTrajectoryTracking() */
    +     425             : 
    +     426           0 : const std_srvs::TriggerResponse::ConstPtr SpeedTracker::startTrajectoryTracking([[maybe_unused]] const std_srvs::TriggerRequest::ConstPtr &cmd) {
    +     427           0 :   return std_srvs::TriggerResponse::Ptr();
    +     428             : }
    +     429             : 
    +     430             : //}
    +     431             : 
    +     432             : /* //{ stopTrajectoryTracking() */
    +     433             : 
    +     434           0 : const std_srvs::TriggerResponse::ConstPtr SpeedTracker::stopTrajectoryTracking([[maybe_unused]] const std_srvs::TriggerRequest::ConstPtr &cmd) {
    +     435           0 :   return std_srvs::TriggerResponse::Ptr();
    +     436             : }
    +     437             : 
    +     438             : //}
    +     439             : 
    +     440             : /* //{ resumeTrajectoryTracking() */
    +     441             : 
    +     442           0 : const std_srvs::TriggerResponse::ConstPtr SpeedTracker::resumeTrajectoryTracking([[maybe_unused]] const std_srvs::TriggerRequest::ConstPtr &cmd) {
    +     443           0 :   return std_srvs::TriggerResponse::Ptr();
    +     444             : }
    +     445             : 
    +     446             : //}
    +     447             : 
    +     448             : /* //{ gotoTrajectoryStart() */
    +     449             : 
    +     450           0 : const std_srvs::TriggerResponse::ConstPtr SpeedTracker::gotoTrajectoryStart([[maybe_unused]] const std_srvs::TriggerRequest::ConstPtr &cmd) {
    +     451           0 :   return std_srvs::TriggerResponse::Ptr();
    +     452             : }
    +     453             : 
    +     454             : //}
    +     455             : 
    +     456             : /* //{ setConstraints() */
    +     457             : 
    +     458         298 : const mrs_msgs::DynamicsConstraintsSrvResponse::ConstPtr SpeedTracker::setConstraints([
    +     459             :     [maybe_unused]] const mrs_msgs::DynamicsConstraintsSrvRequest::ConstPtr &cmd) {
    +     460             : 
    +     461             :   {
    +     462         298 :     std::scoped_lock lock(mutex_constraints_);
    +     463             : 
    +     464         298 :     constraints_ = cmd->constraints;
    +     465             :   }
    +     466             : 
    +     467         596 :   mrs_msgs::DynamicsConstraintsSrvResponse res;
    +     468             : 
    +     469         298 :   res.success = true;
    +     470         298 :   res.message = "constraints updated";
    +     471             : 
    +     472         596 :   return mrs_msgs::DynamicsConstraintsSrvResponse::ConstPtr(new mrs_msgs::DynamicsConstraintsSrvResponse(res));
    +     473             : }
    +     474             : 
    +     475             : //}
    +     476             : 
    +     477             : /* //{ setReference() */
    +     478             : 
    +     479           0 : const mrs_msgs::ReferenceSrvResponse::ConstPtr SpeedTracker::setReference([[maybe_unused]] const mrs_msgs::ReferenceSrvRequest::ConstPtr &cmd) {
    +     480             : 
    +     481           0 :   return mrs_msgs::ReferenceSrvResponse::Ptr();
    +     482             : }
    +     483             : 
    +     484             : //}
    +     485             : 
    +     486             : /* //{ setVelocityReference() */
    +     487             : 
    +     488           0 : const mrs_msgs::VelocityReferenceSrvResponse::ConstPtr SpeedTracker::setVelocityReference([
    +     489             :     [maybe_unused]] const mrs_msgs::VelocityReferenceSrvRequest::ConstPtr &cmd) {
    +     490           0 :   return mrs_msgs::VelocityReferenceSrvResponse::Ptr();
    +     491             : }
    +     492             : 
    +     493             : //}
    +     494             : 
    +     495             : /* //{ setTrajectoryReference() */
    +     496             : 
    +     497           4 : const mrs_msgs::TrajectoryReferenceSrvResponse::ConstPtr SpeedTracker::setTrajectoryReference([
    +     498             :     [maybe_unused]] const mrs_msgs::TrajectoryReferenceSrvRequest::ConstPtr &cmd) {
    +     499           4 :   return mrs_msgs::TrajectoryReferenceSrvResponse::Ptr();
    +     500             : }
    +     501             : 
    +     502             : //}
    +     503             : 
    +     504             : // | --------------------- custom methods --------------------- |
    +     505             : 
    +     506             : /* callbackCommand() //{ */
    +     507             : 
    +     508           0 : void SpeedTracker::callbackCommand(const mrs_msgs::SpeedTrackerCommand::ConstPtr msg) {
    +     509             : 
    +     510           0 :   if (!is_initialized_)
    +     511           0 :     return;
    +     512             : 
    +     513           0 :   mrs_lib::Routine    profiler_routine = profiler_.createRoutine("callbackCommand");
    +     514           0 :   mrs_lib::ScopeTimer timer = mrs_lib::ScopeTimer("SpeedTracker::callbackCommand", common_handlers_->scope_timer.logger, common_handlers_->scope_timer.enabled);
    +     515             : 
    +     516           0 :   mrs_msgs::SpeedTrackerCommandConstPtr external_command = msg;
    +     517             : 
    +     518             :   double dt;
    +     519           0 :   if (first_iteration_) {
    +     520             : 
    +     521           0 :     last_command_time_ = ros::Time::now();
    +     522           0 :     first_iteration_   = false;
    +     523             : 
    +     524             :     {
    +     525           0 :       std::scoped_lock lock(mutex_command_);
    +     526             : 
    +     527           0 :       command_ = *external_command;
    +     528             :     }
    +     529             : 
    +     530           0 :     return;
    +     531             :   } else {
    +     532           0 :     dt                 = (ros::Time::now() - last_command_time_).toSec();
    +     533           0 :     last_command_time_ = ros::Time::now();
    +     534             : 
    +     535           0 :     if (dt <= 1e-4) {
    +     536           0 :       ROS_WARN_THROTTLE(1.0, "[SpeedTracker]: the command dt is %.5f, returning", dt);
    +     537           0 :       return;
    +     538             :     }
    +     539             :   }
    +     540             : 
    +     541           0 :   mrs_msgs::SpeedTrackerCommand transformed_command = *external_command;
    +     542             : 
    +     543           0 :   auto old_command = mrs_lib::get_mutexed(mutex_command_, command_);
    +     544           0 :   auto constraints = mrs_lib::get_mutexed(mutex_constraints_, constraints_);
    +     545           0 :   auto uav_state   = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +     546             : 
    +     547             :   double uav_heading;
    +     548             : 
    +     549             :   try {
    +     550           0 :     uav_heading = mrs_lib::AttitudeConverter(uav_state_.pose.orientation).getHeading();
    +     551             :   }
    +     552           0 :   catch (...) {
    +     553           0 :     ROS_ERROR_THROTTLE(1.0, "[SpeedTracker]: could not calculate UAV heading");
    +     554           0 :     return;
    +     555             :   }
    +     556             : 
    +     557             :   // transform the command
    +     558             : 
    +     559             :   // transform velocity
    +     560             : 
    +     561           0 :   if (transformed_command.use_velocity) {
    +     562             : 
    +     563           0 :     geometry_msgs::Vector3Stamped vector3;
    +     564           0 :     vector3.header = transformed_command.header;
    +     565             : 
    +     566           0 :     vector3.vector.x = transformed_command.velocity.x;
    +     567           0 :     vector3.vector.y = transformed_command.velocity.y;
    +     568           0 :     vector3.vector.z = transformed_command.velocity.z;
    +     569             : 
    +     570           0 :     auto ret = common_handlers_->transformer->transformSingle(vector3, "");
    +     571             : 
    +     572           0 :     if (ret) {
    +     573           0 :       transformed_command.velocity.x = ret.value().vector.x;
    +     574           0 :       transformed_command.velocity.y = ret.value().vector.y;
    +     575           0 :       transformed_command.velocity.z = ret.value().vector.z;
    +     576             :     } else {
    +     577           0 :       return;
    +     578             :     }
    +     579             : 
    +     580             :     /* horizontal speed limit //{ */
    +     581             : 
    +     582             :     {
    +     583           0 :       double des_horizontal_speed = sqrt(pow(transformed_command.velocity.x, 2) + pow(transformed_command.velocity.y, 2));
    +     584             : 
    +     585           0 :       if (des_horizontal_speed > constraints.horizontal_speed) {
    +     586             : 
    +     587           0 :         double des_speed_heading = atan2(transformed_command.velocity.y, transformed_command.velocity.x);
    +     588             : 
    +     589           0 :         transformed_command.velocity.x = cos(des_speed_heading) * constraints.horizontal_speed;
    +     590           0 :         transformed_command.velocity.y = sin(des_speed_heading) * constraints.horizontal_speed;
    +     591             :       }
    +     592             :     }
    +     593             : 
    +     594             :     //}
    +     595             : 
    +     596             :     /* horizontal speed change rate limit //{ */
    +     597             : 
    +     598             :     {
    +     599             :       Eigen::Vector2d hor_speed_derivative =
    +     600           0 :           Eigen::Vector2d(transformed_command.velocity.x - old_command.velocity.x, transformed_command.velocity.y - old_command.velocity.y) / dt;
    +     601             : 
    +     602             :       // exceeding the maximum acceleration
    +     603           0 :       if (hor_speed_derivative.norm() > constraints.horizontal_acceleration) {
    +     604             : 
    +     605           0 :         ROS_WARN_THROTTLE(1.0, "[SpeedTracker]: limitting speed change rate");
    +     606           0 :         double direction = atan2(hor_speed_derivative[1], hor_speed_derivative[0]);
    +     607             : 
    +     608           0 :         transformed_command.velocity.x = old_command.velocity.x + cos(direction) * constraints.horizontal_acceleration * dt;
    +     609           0 :         transformed_command.velocity.y = old_command.velocity.y + sin(direction) * constraints.horizontal_acceleration * dt;
    +     610             :       }
    +     611             :     }
    +     612             : 
    +     613             :     //}
    +     614             : 
    +     615             :     /* vertical speed limit //{ */
    +     616             : 
    +     617             :     {
    +     618             :       // if ascending
    +     619           0 :       if (transformed_command.velocity.z > constraints.vertical_ascending_speed) {
    +     620             : 
    +     621           0 :         transformed_command.velocity.z = constraints.vertical_ascending_speed;
    +     622             :       }
    +     623             : 
    +     624             :       // if descending
    +     625           0 :       if (transformed_command.velocity.z < -constraints.vertical_descending_speed) {
    +     626             : 
    +     627           0 :         transformed_command.velocity.z = -constraints.vertical_descending_speed;
    +     628             :       }
    +     629             :     }
    +     630             : 
    +     631             :     //}
    +     632             : 
    +     633             :     /* vertical speed change rate //{ */
    +     634             : 
    +     635             :     {
    +     636             : 
    +     637           0 :       double vert_speed_derivative = (transformed_command.velocity.z - old_command.velocity.z) / dt;
    +     638             : 
    +     639           0 :       if (vert_speed_derivative > constraints.vertical_ascending_acceleration) {
    +     640             : 
    +     641           0 :         ROS_WARN_THROTTLE(1.0, "[SpeedTracker]: limitting vertical ascending speed change rate");
    +     642           0 :         transformed_command.velocity.z = old_command.velocity.z + constraints.vertical_ascending_acceleration * dt;
    +     643             : 
    +     644           0 :       } else if (vert_speed_derivative < -constraints.vertical_descending_acceleration) {
    +     645             : 
    +     646           0 :         ROS_WARN_THROTTLE(1.0, "[SpeedTracker]: limitting vertical descending speed change rate");
    +     647           0 :         transformed_command.velocity.z = old_command.velocity.z - constraints.vertical_descending_acceleration * dt;
    +     648             :       }
    +     649             :     }
    +     650             : 
    +     651             :     //}
    +     652             :   }
    +     653             : 
    +     654             :   /* transform and constrain heading //{ */
    +     655             : 
    +     656           0 :   if (transformed_command.use_heading) {
    +     657             : 
    +     658           0 :     mrs_msgs::ReferenceStamped temp_ref;
    +     659           0 :     temp_ref.header = transformed_command.header;
    +     660             : 
    +     661           0 :     temp_ref.reference.heading = transformed_command.heading;
    +     662             : 
    +     663           0 :     auto ret = common_handlers_->transformer->transformSingle(temp_ref, "");
    +     664             : 
    +     665           0 :     if (ret) {
    +     666             : 
    +     667             :       // calculate the produced heading rate
    +     668           0 :       double des_hdg_rate = sradians::diff(ret.value().reference.heading, old_command.heading) / dt;
    +     669             : 
    +     670             :       // saturate the change in the desired heading
    +     671           0 :       if (des_hdg_rate > constraints.heading_speed) {
    +     672             : 
    +     673           0 :         ROS_WARN_THROTTLE(1.0, "[SpeedTracker]: limitting change of the desired heading using constraints");
    +     674           0 :         transformed_command.heading = old_command.heading + constraints.heading_speed * dt;
    +     675             : 
    +     676           0 :       } else if (des_hdg_rate < -constraints.heading_speed) {
    +     677             : 
    +     678           0 :         ROS_WARN_THROTTLE(1.0, "[SpeedTracker]: limitting change of the desired heading using constraints");
    +     679           0 :         transformed_command.heading = old_command.heading - constraints.heading_speed * dt;
    +     680             : 
    +     681             :       } else {
    +     682             : 
    +     683           0 :         transformed_command.heading = ret.value().reference.heading;
    +     684             :       }
    +     685             : 
    +     686             :     } else {
    +     687           0 :       return;
    +     688             :     }
    +     689             :   } else {
    +     690           0 :     transformed_command.use_heading = false;
    +     691           0 :     transformed_command.heading     = uav_heading;
    +     692             :   }
    +     693             : 
    +     694             :   //}
    +     695             : 
    +     696           0 :   if (transformed_command.use_heading_rate) {
    +     697             : 
    +     698           0 :     if (transformed_command.heading_rate > constraints.heading_speed) {
    +     699           0 :       transformed_command.heading_rate = constraints.heading_speed;
    +     700           0 :     } else if (transformed_command.heading_rate < -constraints.heading_speed) {
    +     701           0 :       transformed_command.heading_rate = -constraints.heading_speed;
    +     702             :     }
    +     703             :   }
    +     704             : 
    +     705           0 :   if (transformed_command.use_acceleration) {
    +     706             : 
    +     707           0 :     geometry_msgs::Vector3Stamped vector3;
    +     708           0 :     vector3.header = transformed_command.header;
    +     709             : 
    +     710           0 :     vector3.vector.x = transformed_command.acceleration.x;
    +     711           0 :     vector3.vector.y = transformed_command.acceleration.y;
    +     712           0 :     vector3.vector.z = transformed_command.acceleration.z;
    +     713             : 
    +     714           0 :     auto ret = common_handlers_->transformer->transformSingle(vector3, "");
    +     715             : 
    +     716           0 :     if (ret) {
    +     717           0 :       transformed_command.acceleration.x = ret.value().vector.x;
    +     718           0 :       transformed_command.acceleration.y = ret.value().vector.y;
    +     719           0 :       transformed_command.acceleration.z = ret.value().vector.z;
    +     720             :     } else {
    +     721           0 :       return;
    +     722             :     }
    +     723             : 
    +     724             :     /* horizontal acceleration limit //{ */
    +     725             : 
    +     726             :     {
    +     727           0 :       double des_horizontal_acceleration = sqrt(pow(transformed_command.acceleration.x, 2) + pow(transformed_command.acceleration.y, 2));
    +     728             : 
    +     729           0 :       if (des_horizontal_acceleration > constraints.horizontal_acceleration) {
    +     730             : 
    +     731           0 :         double des_acc_heading = atan2(transformed_command.acceleration.y, transformed_command.acceleration.x);
    +     732             : 
    +     733           0 :         transformed_command.acceleration.x = cos(des_acc_heading) * constraints.horizontal_acceleration;
    +     734           0 :         transformed_command.acceleration.y = sin(des_acc_heading) * constraints.horizontal_acceleration;
    +     735             :       }
    +     736             :     }
    +     737             : 
    +     738             :     //}
    +     739             : 
    +     740             :     /* horizontal acceleration change rate limit //{ */
    +     741             : 
    +     742             :     {
    +     743             :       Eigen::Vector2d hor_acc_derivative =
    +     744           0 :           Eigen::Vector2d(transformed_command.acceleration.x - old_command.acceleration.x, transformed_command.acceleration.y - old_command.acceleration.y) /
    +     745           0 :           (dt);
    +     746             : 
    +     747             :       // exceeding the maximum acceleration
    +     748           0 :       if (hor_acc_derivative.norm() > constraints.horizontal_jerk) {
    +     749             : 
    +     750           0 :         ROS_WARN_THROTTLE(1.0, "[SpeedTracker]: limitting acceleration change rate");
    +     751           0 :         double direction = atan2(hor_acc_derivative[1], hor_acc_derivative[0]);
    +     752             : 
    +     753           0 :         transformed_command.acceleration.x = old_command.acceleration.x + cos(direction) * constraints.horizontal_jerk * dt;
    +     754           0 :         transformed_command.acceleration.y = old_command.acceleration.y + sin(direction) * constraints.horizontal_jerk * dt;
    +     755             :       }
    +     756             :     }
    +     757             : 
    +     758             :     //}
    +     759             : 
    +     760             :     /* vertical acceleration limit //{ */
    +     761             : 
    +     762             :     {
    +     763             :       // if ascending
    +     764           0 :       if (transformed_command.acceleration.z > constraints.vertical_ascending_acceleration) {
    +     765             : 
    +     766           0 :         transformed_command.acceleration.z = constraints.vertical_ascending_acceleration;
    +     767             :       }
    +     768             : 
    +     769             :       // if descending
    +     770           0 :       if (transformed_command.acceleration.z < -constraints.vertical_descending_acceleration) {
    +     771             : 
    +     772           0 :         transformed_command.acceleration.z = -constraints.vertical_descending_acceleration;
    +     773             :       }
    +     774             :     }
    +     775             : 
    +     776             :     //}
    +     777             : 
    +     778             :     /* vertical acceleration change rate //{ */
    +     779             : 
    +     780             :     {
    +     781             : 
    +     782           0 :       double vert_acc_derivative = (transformed_command.acceleration.z - old_command.acceleration.z) / dt;
    +     783             : 
    +     784           0 :       if (vert_acc_derivative > constraints.vertical_ascending_jerk) {
    +     785             : 
    +     786           0 :         ROS_WARN_THROTTLE(1.0, "[SpeedTracker]: limitting vertical ascending acceleration change rate");
    +     787           0 :         transformed_command.acceleration.z = old_command.acceleration.z + constraints.vertical_ascending_jerk * dt;
    +     788             : 
    +     789           0 :       } else if (vert_acc_derivative < -constraints.vertical_descending_jerk) {
    +     790             : 
    +     791           0 :         ROS_WARN_THROTTLE(1.0, "[SpeedTracker]: limitting vertical descending acceleration change rate");
    +     792           0 :         transformed_command.acceleration.z = old_command.acceleration.z - constraints.vertical_descending_jerk * dt;
    +     793             :       }
    +     794             :     }
    +     795             : 
    +     796             :     //}
    +     797             :   }
    +     798             : 
    +     799             :   // transform force
    +     800             : 
    +     801           0 :   if (transformed_command.use_force) {
    +     802             : 
    +     803           0 :     geometry_msgs::Vector3Stamped vector3;
    +     804           0 :     vector3.header = transformed_command.header;
    +     805             : 
    +     806           0 :     vector3.vector.x = transformed_command.force.x;
    +     807           0 :     vector3.vector.y = transformed_command.force.y;
    +     808           0 :     vector3.vector.z = transformed_command.force.z;
    +     809             : 
    +     810           0 :     auto ret = common_handlers_->transformer->transformSingle(vector3, "");
    +     811             : 
    +     812           0 :     if (ret) {
    +     813           0 :       transformed_command.force.x = vector3.vector.x;
    +     814           0 :       transformed_command.force.y = vector3.vector.y;
    +     815           0 :       transformed_command.force.z = vector3.vector.z;
    +     816             :     } else {
    +     817           0 :       return;
    +     818             :     }
    +     819             :   }
    +     820             : 
    +     821             :   // check the feasibility of the z
    +     822             :   {
    +     823           0 :     double z_derivative = (transformed_command.z - old_command.z) / dt;
    +     824             : 
    +     825           0 :     if (z_derivative > constraints.vertical_ascending_speed) {
    +     826             : 
    +     827           0 :       transformed_command.z = old_command.z + constraints.vertical_ascending_speed * dt;
    +     828             : 
    +     829           0 :     } else if (z_derivative < -constraints.vertical_ascending_speed) {
    +     830             : 
    +     831           0 :       transformed_command.z = old_command.z - constraints.vertical_descending_speed * dt;
    +     832             :     }
    +     833             : 
    +     834             :     // saturate the desired z using the safety area
    +     835           0 :     if (common_handlers_->safety_area.use_safety_area) {
    +     836             : 
    +     837           0 :       if (transformed_command.z > common_handlers_->safety_area.getMaxZ("")) {
    +     838             : 
    +     839           0 :         transformed_command.z = common_handlers_->safety_area.getMaxZ("");
    +     840             : 
    +     841           0 :       } else if (transformed_command.z < common_handlers_->safety_area.getMinZ("")) {
    +     842             : 
    +     843           0 :         transformed_command.z = common_handlers_->safety_area.getMinZ("");
    +     844             :       }
    +     845             :     }
    +     846             :   }
    +     847             : 
    +     848             :   // if not active, nullify the desired speeds and accelerations
    +     849             :   // this will produce a rumpum (using the constraints) after the activation
    +     850           0 :   if (!is_active_) {
    +     851             : 
    +     852           0 :     auto uav_state = mrs_lib::get_mutexed(mutex_uav_state_, uav_state_);
    +     853             : 
    +     854           0 :     transformed_command.velocity.x = 0;
    +     855           0 :     transformed_command.velocity.y = 0;
    +     856           0 :     transformed_command.velocity.z = 0;
    +     857             : 
    +     858           0 :     transformed_command.acceleration.x = 0;
    +     859           0 :     transformed_command.acceleration.y = 0;
    +     860           0 :     transformed_command.acceleration.z = 0;
    +     861             : 
    +     862             :     try {
    +     863           0 :       transformed_command.heading = mrs_lib::AttitudeConverter(uav_state.pose.orientation).getHeading();
    +     864             :     }
    +     865           0 :     catch (...) {
    +     866           0 :       return;
    +     867             :     }
    +     868             : 
    +     869           0 :     transformed_command.z = uav_state_.pose.position.z;
    +     870             :   }
    +     871             : 
    +     872             :   {
    +     873           0 :     std::scoped_lock lock(mutex_command_);
    +     874             : 
    +     875           0 :     command_ = transformed_command;
    +     876             :   }
    +     877             : 
    +     878           0 :   if (!is_active_) {
    +     879           0 :     ROS_INFO_ONCE("[SpeedTracker]: getting command");
    +     880             :   } else {
    +     881           0 :     ROS_INFO_THROTTLE(5.0, "[SpeedTracker]: getting command");
    +     882             :   }
    +     883             : 
    +     884             :   // --------------------------------------------------------------
    +     885             :   // |                     publish rviz markers                   |
    +     886             :   // --------------------------------------------------------------
    +     887             : 
    +     888           0 :   visualization_msgs::MarkerArray msg_out;
    +     889             : 
    +     890           0 :   double id = 0;
    +     891             : 
    +     892           0 :   geometry_msgs::Point point;
    +     893             : 
    +     894             :   /* desired speed //{ */
    +     895             : 
    +     896           0 :   if (transformed_command.use_velocity) {
    +     897             : 
    +     898           0 :     std::scoped_lock lock(mutex_uav_state_);
    +     899             : 
    +     900           0 :     visualization_msgs::Marker marker;
    +     901             : 
    +     902           0 :     marker.header.frame_id = uav_state_.header.frame_id;
    +     903           0 :     marker.header.stamp    = ros::Time::now();
    +     904           0 :     marker.ns              = "speed_tracker";
    +     905           0 :     marker.id              = id++;
    +     906           0 :     marker.type            = visualization_msgs::Marker::ARROW;
    +     907           0 :     marker.action          = visualization_msgs::Marker::ADD;
    +     908             : 
    +     909             :     /* position //{ */
    +     910             : 
    +     911           0 :     marker.pose.position.x = 0.0;
    +     912           0 :     marker.pose.position.y = 0.0;
    +     913           0 :     marker.pose.position.z = 0.0;
    +     914             : 
    +     915             :     //}
    +     916             : 
    +     917             :     /* orientation //{ */
    +     918             : 
    +     919           0 :     marker.pose.orientation = mrs_lib::AttitudeConverter(0, 0, 0);
    +     920             : 
    +     921             :     //}
    +     922             : 
    +     923             :     /* origin //{ */
    +     924           0 :     point.x = uav_state_.pose.position.x;
    +     925           0 :     point.y = uav_state_.pose.position.y;
    +     926           0 :     point.z = uav_state_.pose.position.z;
    +     927             : 
    +     928           0 :     marker.points.push_back(point);
    +     929             : 
    +     930             :     //}
    +     931             : 
    +     932             :     /* tip //{ */
    +     933             : 
    +     934           0 :     point.x = uav_state_.pose.position.x + transformed_command.velocity.x;
    +     935           0 :     point.y = uav_state_.pose.position.y + transformed_command.velocity.y;
    +     936           0 :     point.z = uav_state_.pose.position.z + transformed_command.velocity.z;
    +     937             : 
    +     938           0 :     marker.points.push_back(point);
    +     939             : 
    +     940             :     //}
    +     941             : 
    +     942           0 :     marker.scale.x = 0.05;
    +     943           0 :     marker.scale.y = 0.05;
    +     944           0 :     marker.scale.z = 0.05;
    +     945             : 
    +     946           0 :     marker.color.a = 0.5;
    +     947           0 :     marker.color.r = 0.0;
    +     948           0 :     marker.color.g = 1.0;
    +     949           0 :     marker.color.b = 0.0;
    +     950             : 
    +     951           0 :     marker.mesh_resource = "package://pr2_description/meshes/base_v0/base.dae";
    +     952             : 
    +     953           0 :     msg_out.markers.push_back(marker);
    +     954             :   }
    +     955             : 
    +     956             :   //}
    +     957             : 
    +     958             :   /* desired acceleration //{ */
    +     959           0 :   if (transformed_command.use_acceleration) {
    +     960             : 
    +     961           0 :     std::scoped_lock lock(mutex_uav_state_);
    +     962             : 
    +     963           0 :     visualization_msgs::Marker marker;
    +     964             : 
    +     965           0 :     marker.header.frame_id = uav_state_.header.frame_id;
    +     966           0 :     marker.header.stamp    = ros::Time::now();
    +     967           0 :     marker.ns              = "speed_tracker";
    +     968           0 :     marker.id              = id++;
    +     969           0 :     marker.type            = visualization_msgs::Marker::ARROW;
    +     970           0 :     marker.action          = visualization_msgs::Marker::ADD;
    +     971             : 
    +     972             :     /* position //{ */
    +     973             : 
    +     974           0 :     marker.pose.position.x = 0.0;
    +     975           0 :     marker.pose.position.y = 0.0;
    +     976           0 :     marker.pose.position.z = 0.0;
    +     977             : 
    +     978             :     //}
    +     979             : 
    +     980             :     /* orientation //{ */
    +     981             : 
    +     982           0 :     marker.pose.orientation = mrs_lib::AttitudeConverter(0, 0, 0);
    +     983             : 
    +     984             :     //}
    +     985             : 
    +     986             :     /* origin //{ */
    +     987           0 :     point.x = uav_state_.pose.position.x;
    +     988           0 :     point.y = uav_state_.pose.position.y;
    +     989           0 :     point.z = uav_state_.pose.position.z;
    +     990             : 
    +     991           0 :     marker.points.push_back(point);
    +     992             : 
    +     993             :     //}
    +     994             : 
    +     995             :     /* tip //{ */
    +     996             : 
    +     997           0 :     point.x = uav_state_.pose.position.x + transformed_command.acceleration.x;
    +     998           0 :     point.y = uav_state_.pose.position.y + transformed_command.acceleration.y;
    +     999           0 :     point.z = uav_state_.pose.position.z + transformed_command.acceleration.z;
    +    1000             : 
    +    1001           0 :     marker.points.push_back(point);
    +    1002             : 
    +    1003             :     //}
    +    1004             : 
    +    1005           0 :     marker.scale.x = 0.05;
    +    1006           0 :     marker.scale.y = 0.05;
    +    1007           0 :     marker.scale.z = 0.05;
    +    1008             : 
    +    1009           0 :     marker.color.a = 0.5;
    +    1010           0 :     marker.color.r = 1.0;
    +    1011           0 :     marker.color.g = 0.0;
    +    1012           0 :     marker.color.b = 0.0;
    +    1013             : 
    +    1014           0 :     marker.mesh_resource = "package://pr2_description/meshes/base_v0/base.dae";
    +    1015             : 
    +    1016           0 :     msg_out.markers.push_back(marker);
    +    1017             :   }
    +    1018             : 
    +    1019             :   //}
    +    1020             : 
    +    1021             :   /* desired force //{ */
    +    1022           0 :   if (transformed_command.use_force) {
    +    1023             : 
    +    1024           0 :     std::scoped_lock lock(mutex_uav_state_);
    +    1025             : 
    +    1026           0 :     visualization_msgs::Marker marker;
    +    1027             : 
    +    1028           0 :     marker.header.frame_id = uav_state_.header.frame_id;
    +    1029           0 :     marker.header.stamp    = ros::Time::now();
    +    1030           0 :     marker.ns              = "speed_tracker";
    +    1031           0 :     marker.id              = id++;
    +    1032           0 :     marker.type            = visualization_msgs::Marker::ARROW;
    +    1033           0 :     marker.action          = visualization_msgs::Marker::ADD;
    +    1034             : 
    +    1035             :     /* position //{ */
    +    1036             : 
    +    1037           0 :     marker.pose.position.x = 0.0;
    +    1038           0 :     marker.pose.position.y = 0.0;
    +    1039           0 :     marker.pose.position.z = 0.0;
    +    1040             : 
    +    1041             :     //}
    +    1042             : 
    +    1043             :     /* orientation //{ */
    +    1044             : 
    +    1045           0 :     marker.pose.orientation = mrs_lib::AttitudeConverter(0, 0, 0);
    +    1046             : 
    +    1047             :     //}
    +    1048             : 
    +    1049             :     /* origin //{ */
    +    1050           0 :     point.x = uav_state_.pose.position.x;
    +    1051           0 :     point.y = uav_state_.pose.position.y;
    +    1052           0 :     point.z = uav_state_.pose.position.z;
    +    1053             : 
    +    1054           0 :     marker.points.push_back(point);
    +    1055             : 
    +    1056             :     //}
    +    1057             : 
    +    1058             :     /* tip //{ */
    +    1059             : 
    +    1060           0 :     point.x = uav_state_.pose.position.x + transformed_command.force.x;
    +    1061           0 :     point.y = uav_state_.pose.position.y + transformed_command.force.y;
    +    1062           0 :     point.z = uav_state_.pose.position.z + transformed_command.force.z;
    +    1063             : 
    +    1064           0 :     marker.points.push_back(point);
    +    1065             : 
    +    1066             :     //}
    +    1067             : 
    +    1068           0 :     marker.scale.x = 0.05;
    +    1069           0 :     marker.scale.y = 0.05;
    +    1070           0 :     marker.scale.z = 0.05;
    +    1071             : 
    +    1072           0 :     marker.color.a = 0.5;
    +    1073           0 :     marker.color.r = 0.0;
    +    1074           0 :     marker.color.g = 0.0;
    +    1075           0 :     marker.color.b = 1.0;
    +    1076             : 
    +    1077           0 :     marker.mesh_resource = "package://pr2_description/meshes/base_v0/base.dae";
    +    1078             : 
    +    1079           0 :     msg_out.markers.push_back(marker);
    +    1080             :   }
    +    1081             : 
    +    1082             :   //}
    +    1083             : 
    +    1084           0 :   ph_rviz_marker_.publish(msg_out);
    +    1085             : }
    +    1086             : 
    +    1087             : //}
    +    1088             : 
    +    1089             : }  // namespace speed_tracker
    +    1090             : 
    +    1091             : }  // namespace mrs_uav_trackers
    +    1092             : 
    +    1093             : #include <pluginlib/class_list_macros.h>
    +    1094          91 : PLUGINLIB_EXPORT_CLASS(mrs_uav_trackers::speed_tracker::SpeedTracker, mrs_uav_managers::Tracker)
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trackers/src/speed_tracker/speed_tracker.cpp.gcov.overview.html b/mrs_uav_trackers/src/speed_tracker/speed_tracker.cpp.gcov.overview.html new file mode 100644 index 0000000000..b1299a71fe --- /dev/null +++ b/mrs_uav_trackers/src/speed_tracker/speed_tracker.cpp.gcov.overview.html @@ -0,0 +1,294 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trackers/src/speed_tracker/speed_tracker.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_trackers/src/speed_tracker/speed_tracker.cpp.gcov.png b/mrs_uav_trackers/src/speed_tracker/speed_tracker.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..76f0064d0030a9ff28cfd278c8a71f07be11d779 GIT binary patch literal 3011 zcmV;!3q16RP)Wz0000OP)t-s|NsB0 zs;a7|?_FK${{R500003000620&P%hU00009a7bBm000ie000ie0hKEb8vp$C1x zQk)MaXFbBZj8<|jnq#C^6?(El&+TBr1`4}g=H|HZhSBSLfMvYz{@c~`W z)*~$oDipmayS10Z-b)7L8Zid5CH^ep+YNr8+C+kj9tQb ziW6m%1i1IW0^Zby^>kyd3q=&kHh0-5VX;h%TmTnQoP(8*k4ML?3bWAMmPI=)!qbX)ID-^TPWO2aSbp}$$m$_e!v+C00)xN*)-${GKpYVUC zue5zrjo&q-@%0G56)gci0`P$VnaxqWC!&}1WE5YVVI)rSNUKFoaY92K9N5v%qM5=p z4BQm}nH1R#PMWUp4C9Y{&;UJVuAaW%Ynhx*bS4Q!oV9xnT-PUT+x~ZZn%5uOR@W@> z_1|W#w`px5Jn(mzu-XJbfvs)Caj%bpmIn$bQVmeQi+H3Q`=E4L@5v|3Gv0$34w&`$ zDGH>JrEHO+;^FsiH0C>D>_1-f7dhiZiWUfcl>k00kWH}-{LbgtlnLpWp==o2ITM~+ zUwf%rT=w$l7Z|e=kF{i_Gn#qHPgAUTR|GP$Eem9~A=_8ZwX`UL;QeamSvGV0op^zH zkKyry)o3oExCJ&F6rY=MUDsxteCFCeVQeP`0mj}-L;$MKTtMoo;8E%gPP&(sI(0*n zx+LV0+qK{6b|IM@ltAGo9|#+;g;)6g)>iYh>nQw?uR)R5u^p}^vlay`v}~}?$zqRJ zBTC8xnQ9d1aa^z;S)IWry`IWPefk`b0kG$5cGm+GvxA9Vq&fzHm1!Y^1&tqgK8 zMN6{^WX2SM``mi>lxT{~b=ntmmCKiUwTppvq)76fkV?7w&@=onf*@t16azS-g0$>s z8etAO``wq>?b5vvv2K=^Sy6wyGnSu1OikyINgD>`@aFNssQ#Ie2bd5`z3 zPJn#Y&hyib^|e`Z zaZQ52j{?cr###mpWVtZeJTV^F5QemHRTy0E@xVhE3_99zD|&)F8ZZDG!r)`y3nRBo z?79J@#=h^G(eL^L0bosrYXzw9;c3^f`}g`|C=J!OT`p9{(JPxx>E2c{4JIzvm%4g- zxUD-VT0+jxs$B;^!-s;P>kXk$059b|Y7Ugw{Cq(zf2Y69-3A`DfZ7QSe%H3N1}b)F z#iFCY)+pPFDBd5AU{tiNW%-I$-gRmf|2c8j`w92C?Gl0pggN+oB&xrMSAj6V12!f$#rEZ@Wb zupSjc#Yc}iiu~wNC!YTIdQ>`wfUPyKBq`>PkIF|Ll1o)5&jFOn8u_9k9(kaEgOcGw z(?vf$C(c`0a{vZi5(J6DGF{sywoViPA*<)qyLuAtmgZofoda z#!=^Ix^@(|mixYdyl~GSh5Vr)*jV(xM}e}zU{;x}dF{BwavWA@oacll1Xi@Se2t|L zMj=Z-0?Vie`z!#!vl@waibBeUnJtoM03#;=SZp%`oQ%geo z9`0@)o~5YG;+kbCrCsbB-B}8?kd&OpS*tPJ2W?p(Wp|xk5ve$?rZDEO%?d-li6LYZ zD&LKQESu5QP4}{yeB2M%IZH=Nd7-nn>#{`IL$R^QHMSfkpvYe2@+f9*;dX{FTZ6Di zMJV&^$#EBd-`sCY`?Ys;6A&VH51$FtbfazK+Hgq_&6O&7aD& z2XkLz+7zRQzi|&~fWlK^QBVT-6ZLTF60{yrz~ir}hvW6@A;3%3!(G~Z{=`dXJ)Cg3 z{*~raty)N2#rN-?tb8PNJ;x&8?_cf-C}#e+oc78S^>8$6Sy9uJCh|beMmN)YrtZRd zJ`y%**O|~|o#J>e)+w;Ud2)kWZ_Ie{M8H2cW;8?ij}*?ac&h3Yf#Po}oc}(lFX-XR zc_$xTI7f`KiMP%h#|5_N6g}P}DxA|1m)mu=fi**wMXtEyM?p~ znYPaSWPhmw$FHx=4*&%`{*v`|3{z$GS{?Yl_4Sxh7$2HcIi1Vxn%dFuZerZmd-RkQ z(Q{#m!nqXTBa`r5gS|;8()$mP&mlYxs?NB*qa|!6A$v&F{ke32bk|adJ+c0iR|G*R zk3%=(>pW_w3L`=a*mVrQh3knB=)Xv6o>NfpxdR@@KSPg9g%d~Y4*dsxpGXy+#Iq-d z0DE~PXbu4~d1T)ZSzBA0uJPmJ%Df@+&cb;mPNY|s2kbzKG63rfkvm*HOdj*AdzB}g zYD+DMJ^4WJ3dr-vuBV5>btb$XHb&|*U(uT$HW~L7y~U>ec{khj{2EmZ%Lph&16H3E z&!p(THbL!*_|R)wkg^WNK$ZgbP^_%lA<%%El@vv%xd24B_cLIF$K;u=&`Jf51_kyU ze*#MY6(^eth4Y@*tOVpsJ?g=Zdc!rjoth;*CVpGV`=w?$k4>cNhfSlcm4Qt4l&8Z; zAd}*-$G<2(%o5Whc29K(@DEugsSLA(Q3Nujh7=o*7=zY>cEg(}pS4ckIlor~1!}`EKWSLJ|_(=;3Ais@E z3tQ1*QXkGG_S{?L~`@DEw$lNNr`!UD)|1MY}3 z#|%@Jw>}|%aaV>q&l@x;YMf-hh2m^%D3JbQj`RyU{s9we4cz8Fmj(a;002ovPDHLk FV1i~!w{8Fc literal 0 HcmV?d00001 diff --git a/mrs_uav_trajectory_generation/src/index-detail-sort-f.html b/mrs_uav_trajectory_generation/src/index-detail-sort-f.html new file mode 100644 index 0000000000..315efd0566 --- /dev/null +++ b/mrs_uav_trajectory_generation/src/index-detail-sort-f.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trajectory_generation/src + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trajectory_generation/srcHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:744109567.9 %
    Date:2024-04-18 23:11:36Functions:2222100.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    mrs_trajectory_generation.cpp +
    67.9%67.9%
    +
    67.9 %744 / 1095100.0 %22 / 22
    <unnamed>67.9 %744 / 1095100.0 %22 / 22
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trajectory_generation/src/index-detail-sort-l.html b/mrs_uav_trajectory_generation/src/index-detail-sort-l.html new file mode 100644 index 0000000000..c39d536a07 --- /dev/null +++ b/mrs_uav_trajectory_generation/src/index-detail-sort-l.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trajectory_generation/src + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trajectory_generation/srcHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:744109567.9 %
    Date:2024-04-18 23:11:36Functions:2222100.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    mrs_trajectory_generation.cpp +
    67.9%67.9%
    +
    67.9 %744 / 1095100.0 %22 / 22
    <unnamed>67.9 %744 / 1095100.0 %22 / 22
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trajectory_generation/src/index-detail.html b/mrs_uav_trajectory_generation/src/index-detail.html new file mode 100644 index 0000000000..81e86f9cb2 --- /dev/null +++ b/mrs_uav_trajectory_generation/src/index-detail.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trajectory_generation/src + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trajectory_generation/srcHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:744109567.9 %
    Date:2024-04-18 23:11:36Functions:2222100.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( hide details ) Sort by line coverageFunctions Sort by function coverage
    mrs_trajectory_generation.cpp +
    67.9%67.9%
    +
    67.9 %744 / 1095100.0 %22 / 22
    <unnamed>67.9 %744 / 1095100.0 %22 / 22
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trajectory_generation/src/index-sort-f.html b/mrs_uav_trajectory_generation/src/index-sort-f.html new file mode 100644 index 0000000000..c9973f9cde --- /dev/null +++ b/mrs_uav_trajectory_generation/src/index-sort-f.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trajectory_generation/src + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trajectory_generation/srcHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:744109567.9 %
    Date:2024-04-18 23:11:36Functions:2222100.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    mrs_trajectory_generation.cpp +
    67.9%67.9%
    +
    67.9 %744 / 1095100.0 %22 / 22
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trajectory_generation/src/index-sort-l.html b/mrs_uav_trajectory_generation/src/index-sort-l.html new file mode 100644 index 0000000000..fdfd990cb7 --- /dev/null +++ b/mrs_uav_trajectory_generation/src/index-sort-l.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trajectory_generation/src + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trajectory_generation/srcHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:744109567.9 %
    Date:2024-04-18 23:11:36Functions:2222100.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    mrs_trajectory_generation.cpp +
    67.9%67.9%
    +
    67.9 %744 / 1095100.0 %22 / 22
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trajectory_generation/src/index.html b/mrs_uav_trajectory_generation/src/index.html new file mode 100644 index 0000000000..4393c7e535 --- /dev/null +++ b/mrs_uav_trajectory_generation/src/index.html @@ -0,0 +1,102 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trajectory_generation/src + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trajectory_generation/srcHitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:744109567.9 %
    Date:2024-04-18 23:11:36Functions:2222100.0 %
    Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    Filename Sort by nameLine Coverage ( show details ) Sort by line coverageFunctions Sort by function coverage
    mrs_trajectory_generation.cpp +
    67.9%67.9%
    +
    67.9 %744 / 1095100.0 %22 / 22
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trajectory_generation/src/mrs_trajectory_generation.cpp.func-sort-c.html b/mrs_uav_trajectory_generation/src/mrs_trajectory_generation.cpp.func-sort-c.html new file mode 100644 index 0000000000..06c3b3f6c6 --- /dev/null +++ b/mrs_uav_trajectory_generation/src/mrs_trajectory_generation.cpp.func-sort-c.html @@ -0,0 +1,168 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trajectory_generation/src/mrs_trajectory_generation.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trajectory_generation/src - mrs_trajectory_generation.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:744109567.9 %
    Date:2024-04-18 23:11:36Functions:2222100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    mrs_uav_trajectory_generation::MrsTrajectoryGeneration::callbackPath(boost::shared_ptr<mrs_msgs::Path_<std::allocator<void> > const>)1
    mrs_uav_trajectory_generation::MrsTrajectoryGeneration::callbackGetPathSrv(mrs_msgs::GetPathSrvRequest_<std::allocator<void> >&, mrs_msgs::GetPathSrvResponse_<std::allocator<void> >&)2
    mrs_uav_trajectory_generation::MrsTrajectoryGeneration::callbackPathSrv(mrs_msgs::PathSrvRequest_<std::allocator<void> >&, mrs_msgs::PathSrvResponse_<std::allocator<void> >&)3
    mrs_uav_trajectory_generation::MrsTrajectoryGeneration::trajectorySrv(mrs_msgs::TrajectoryReference_<std::allocator<void> > const&)4
    mrs_uav_trajectory_generation::MrsTrajectoryGeneration::transformPath(mrs_msgs::Path_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)6
    mrs_uav_trajectory_generation::MrsTrajectoryGeneration::findTrajectoryFallback(std::vector<Waypoint_t, std::allocator<Waypoint_t> > const&, double const&, bool const&)6
    mrs_uav_trajectory_generation::MrsTrajectoryGeneration::getTrajectoryReference(std::vector<eth_mav_msgs::EigenTrajectoryPoint, Eigen::aligned_allocator<eth_mav_msgs::EigenTrajectoryPoint> > const&, std::optional<mrs_msgs::TrackerCommand_<std::allocator<void> > > const&, double const&)6
    mrs_uav_trajectory_generation::MrsTrajectoryGeneration::preprocessPath(std::vector<Waypoint_t, std::allocator<Waypoint_t> > const&)11
    mrs_uav_trajectory_generation::MrsTrajectoryGeneration::prepareInitialCondition(ros::Time)11
    mrs_uav_trajectory_generation::MrsTrajectoryGeneration::optimize[abi:cxx11](std::vector<Waypoint_t, std::allocator<Waypoint_t> > const&, std_msgs::Header_<std::allocator<void> > const&, bool, bool)11
    mrs_uav_trajectory_generation::MrsTrajectoryGeneration::findTrajectory(std::vector<Waypoint_t, std::allocator<Waypoint_t> > const&, std::optional<mrs_msgs::TrackerCommand_<std::allocator<void> > > const&, double const&, bool const&)16
    mrs_uav_trajectory_generation::MrsTrajectoryGeneration::findTrajectoryAsync(std::vector<Waypoint_t, std::allocator<Waypoint_t> > const&, std::optional<mrs_msgs::TrackerCommand_<std::allocator<void> > > const&, double const&, bool const&)16
    mrs_uav_trajectory_generation::MrsTrajectoryGeneration::timeLeft()16
    mrs_uav_trajectory_generation::MrsTrajectoryGeneration::validateTrajectorySpatial(std::vector<eth_mav_msgs::EigenTrajectoryPoint, Eigen::aligned_allocator<eth_mav_msgs::EigenTrajectoryPoint> > const&, std::vector<Waypoint_t, std::allocator<Waypoint_t> > const&)17
    mrs_uav_trajectory_generation::MrsTrajectoryGeneration::checkNaN(Waypoint_t const&)24
    (anonymous namespace)::ProxyExec0::ProxyExec0()91
    mrs_uav_trajectory_generation::MrsTrajectoryGeneration::callbackDrs(mrs_uav_trajectory_generation::drsConfig&, unsigned int)91
    mrs_uav_trajectory_generation::MrsTrajectoryGeneration::onInit()91
    mrs_uav_trajectory_generation::MrsTrajectoryGeneration::interpolatePoint(Waypoint_t const&, Waypoint_t const&, double const&)898
    mrs_uav_trajectory_generation::MrsTrajectoryGeneration::distFromSegment(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, Eigen::Matrix<double, 3, 1, 0, 3, 1> const&)5142
    mrs_uav_trajectory_generation::MrsTrajectoryGeneration::overtime()9774
    mrs_uav_trajectory_generation::MrsTrajectoryGeneration::callbackUavState(boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const>)155103
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trajectory_generation/src/mrs_trajectory_generation.cpp.func.html b/mrs_uav_trajectory_generation/src/mrs_trajectory_generation.cpp.func.html new file mode 100644 index 0000000000..a0e7247b32 --- /dev/null +++ b/mrs_uav_trajectory_generation/src/mrs_trajectory_generation.cpp.func.html @@ -0,0 +1,168 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trajectory_generation/src/mrs_trajectory_generation.cpp - functions + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trajectory_generation/src - mrs_trajectory_generation.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:744109567.9 %
    Date:2024-04-18 23:11:36Functions:2222100.0 %
    Legend: Lines: + hit + not hit +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Function Name Sort by function nameHit count Sort by hit count
    (anonymous namespace)::ProxyExec0::ProxyExec0()91
    mrs_uav_trajectory_generation::MrsTrajectoryGeneration::callbackDrs(mrs_uav_trajectory_generation::drsConfig&, unsigned int)91
    mrs_uav_trajectory_generation::MrsTrajectoryGeneration::callbackPath(boost::shared_ptr<mrs_msgs::Path_<std::allocator<void> > const>)1
    mrs_uav_trajectory_generation::MrsTrajectoryGeneration::trajectorySrv(mrs_msgs::TrajectoryReference_<std::allocator<void> > const&)4
    mrs_uav_trajectory_generation::MrsTrajectoryGeneration::transformPath(mrs_msgs::Path_<std::allocator<void> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)6
    mrs_uav_trajectory_generation::MrsTrajectoryGeneration::findTrajectory(std::vector<Waypoint_t, std::allocator<Waypoint_t> > const&, std::optional<mrs_msgs::TrackerCommand_<std::allocator<void> > > const&, double const&, bool const&)16
    mrs_uav_trajectory_generation::MrsTrajectoryGeneration::preprocessPath(std::vector<Waypoint_t, std::allocator<Waypoint_t> > const&)11
    mrs_uav_trajectory_generation::MrsTrajectoryGeneration::callbackPathSrv(mrs_msgs::PathSrvRequest_<std::allocator<void> >&, mrs_msgs::PathSrvResponse_<std::allocator<void> >&)3
    mrs_uav_trajectory_generation::MrsTrajectoryGeneration::distFromSegment(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, Eigen::Matrix<double, 3, 1, 0, 3, 1> const&)5142
    mrs_uav_trajectory_generation::MrsTrajectoryGeneration::callbackUavState(boost::shared_ptr<mrs_msgs::UavState_<std::allocator<void> > const>)155103
    mrs_uav_trajectory_generation::MrsTrajectoryGeneration::interpolatePoint(Waypoint_t const&, Waypoint_t const&, double const&)898
    mrs_uav_trajectory_generation::MrsTrajectoryGeneration::callbackGetPathSrv(mrs_msgs::GetPathSrvRequest_<std::allocator<void> >&, mrs_msgs::GetPathSrvResponse_<std::allocator<void> >&)2
    mrs_uav_trajectory_generation::MrsTrajectoryGeneration::findTrajectoryAsync(std::vector<Waypoint_t, std::allocator<Waypoint_t> > const&, std::optional<mrs_msgs::TrackerCommand_<std::allocator<void> > > const&, double const&, bool const&)16
    mrs_uav_trajectory_generation::MrsTrajectoryGeneration::findTrajectoryFallback(std::vector<Waypoint_t, std::allocator<Waypoint_t> > const&, double const&, bool const&)6
    mrs_uav_trajectory_generation::MrsTrajectoryGeneration::getTrajectoryReference(std::vector<eth_mav_msgs::EigenTrajectoryPoint, Eigen::aligned_allocator<eth_mav_msgs::EigenTrajectoryPoint> > const&, std::optional<mrs_msgs::TrackerCommand_<std::allocator<void> > > const&, double const&)6
    mrs_uav_trajectory_generation::MrsTrajectoryGeneration::prepareInitialCondition(ros::Time)11
    mrs_uav_trajectory_generation::MrsTrajectoryGeneration::validateTrajectorySpatial(std::vector<eth_mav_msgs::EigenTrajectoryPoint, Eigen::aligned_allocator<eth_mav_msgs::EigenTrajectoryPoint> > const&, std::vector<Waypoint_t, std::allocator<Waypoint_t> > const&)17
    mrs_uav_trajectory_generation::MrsTrajectoryGeneration::onInit()91
    mrs_uav_trajectory_generation::MrsTrajectoryGeneration::checkNaN(Waypoint_t const&)24
    mrs_uav_trajectory_generation::MrsTrajectoryGeneration::optimize[abi:cxx11](std::vector<Waypoint_t, std::allocator<Waypoint_t> > const&, std_msgs::Header_<std::allocator<void> > const&, bool, bool)11
    mrs_uav_trajectory_generation::MrsTrajectoryGeneration::overtime()9774
    mrs_uav_trajectory_generation::MrsTrajectoryGeneration::timeLeft()16
    +
    +
    + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trajectory_generation/src/mrs_trajectory_generation.cpp.gcov.frameset.html b/mrs_uav_trajectory_generation/src/mrs_trajectory_generation.cpp.gcov.frameset.html new file mode 100644 index 0000000000..492e4b05ac --- /dev/null +++ b/mrs_uav_trajectory_generation/src/mrs_trajectory_generation.cpp.gcov.frameset.html @@ -0,0 +1,19 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trajectory_generation/src/mrs_trajectory_generation.cpp + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + diff --git a/mrs_uav_trajectory_generation/src/mrs_trajectory_generation.cpp.gcov.html b/mrs_uav_trajectory_generation/src/mrs_trajectory_generation.cpp.gcov.html new file mode 100644 index 0000000000..a5fa42bd1f --- /dev/null +++ b/mrs_uav_trajectory_generation/src/mrs_trajectory_generation.cpp.gcov.html @@ -0,0 +1,2458 @@ + + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trajectory_generation/src/mrs_trajectory_generation.cpp + + + + + + + + + + + + + + +
    LCOV - code coverage report
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current view:top level - mrs_uav_trajectory_generation/src - mrs_trajectory_generation.cpp (source / functions)HitTotalCoverage
    Test:MRS UAV System - Test coverage reportLines:744109567.9 %
    Date:2024-04-18 23:11:36Functions:2222100.0 %
    Legend: Lines: + hit + not hit +
    +
    + + + + + + + + +

    +
              Line data    Source code
    +
    +       1             : /* includes //{ */
    +       2             : 
    +       3             : #include <ros/ros.h>
    +       4             : #include <ros/package.h>
    +       5             : #include <nodelet/nodelet.h>
    +       6             : 
    +       7             : #include <mrs_msgs/TrajectoryReferenceSrv.h>
    +       8             : #include <mrs_msgs/TrajectoryReference.h>
    +       9             : 
    +      10             : #include <std_srvs/Trigger.h>
    +      11             : 
    +      12             : #include <geometry_msgs/Vector3Stamped.h>
    +      13             : 
    +      14             : #include <mrs_msgs/DynamicsConstraints.h>
    +      15             : #include <mrs_msgs/Path.h>
    +      16             : #include <mrs_msgs/PathSrv.h>
    +      17             : #include <mrs_msgs/GetPathSrv.h>
    +      18             : #include <mrs_msgs/TrackerCommand.h>
    +      19             : #include <mrs_msgs/MpcPredictionFullState.h>
    +      20             : #include <mrs_msgs/Reference.h>
    +      21             : #include <mrs_msgs/ControlManagerDiagnostics.h>
    +      22             : #include <mrs_msgs/UavState.h>
    +      23             : 
    +      24             : #include <eth_trajectory_generation/impl/polynomial_optimization_nonlinear_impl.h>
    +      25             : #include <eth_trajectory_generation/trajectory.h>
    +      26             : #include <eth_trajectory_generation/trajectory_sampling.h>
    +      27             : 
    +      28             : #include <mrs_lib/param_loader.h>
    +      29             : #include <mrs_lib/geometry/cyclic.h>
    +      30             : #include <mrs_lib/geometry/misc.h>
    +      31             : #include <mrs_lib/mutex.h>
    +      32             : #include <mrs_lib/batch_visualizer.h>
    +      33             : #include <mrs_lib/transformer.h>
    +      34             : #include <mrs_lib/utils.h>
    +      35             : #include <mrs_lib/scope_timer.h>
    +      36             : #include <mrs_lib/attitude_converter.h>
    +      37             : #include <mrs_lib/publisher_handler.h>
    +      38             : #include <mrs_lib/subscribe_handler.h>
    +      39             : 
    +      40             : #include <dynamic_reconfigure/server.h>
    +      41             : #include <mrs_uav_trajectory_generation/drsConfig.h>
    +      42             : 
    +      43             : #include <future>
    +      44             : 
    +      45             : //}
    +      46             : 
    +      47             : /* using //{ */
    +      48             : 
    +      49             : using vec2_t = mrs_lib::geometry::vec_t<2>;
    +      50             : using vec3_t = mrs_lib::geometry::vec_t<3>;
    +      51             : using mat3_t = Eigen::Matrix3Xd;
    +      52             : 
    +      53             : using radians  = mrs_lib::geometry::radians;
    +      54             : using sradians = mrs_lib::geometry::sradians;
    +      55             : 
    +      56             : //}
    +      57             : 
    +      58             : /* defines //{ */
    +      59             : 
    +      60             : #define FUTURIZATION_EXEC_TIME_FACTOR 0.5        // [0, 1]
    +      61             : #define FUTURIZATION_FIRST_WAYPOINT_FACTOR 0.50  // [0, 1]
    +      62             : #define OVERTIME_SAFETY_FACTOR 0.95              // [0, 1]
    +      63             : #define OVERTIME_SAFETY_OFFSET 0.01              // [s]
    +      64             : #define NLOPT_EXEC_TIME_FACTOR 0.95              // [0, 1]
    +      65             : 
    +      66             : typedef struct
    +      67             : {
    +      68             :   Eigen::Vector4d coords;
    +      69             :   bool            stop_at;
    +      70             : } Waypoint_t;
    +      71             : 
    +      72             : //}
    +      73             : 
    +      74             : namespace mrs_uav_trajectory_generation
    +      75             : {
    +      76             : 
    +      77             : /* class MrsTrajectoryGeneration //{ */
    +      78             : class MrsTrajectoryGeneration : public nodelet::Nodelet {
    +      79             : 
    +      80             : public:
    +      81             :   virtual void onInit();
    +      82             : 
    +      83             : private:
    +      84             :   ros::NodeHandle nh_;
    +      85             : 
    +      86             :   bool is_initialized_ = false;
    +      87             : 
    +      88             :   // | ----------------------- parameters ----------------------- |
    +      89             : 
    +      90             :   double _sampling_dt_;
    +      91             : 
    +      92             :   double _max_trajectory_len_factor_;
    +      93             :   double _min_trajectory_len_factor_;
    +      94             : 
    +      95             :   int _n_attempts_;
    +      96             : 
    +      97             :   double _min_waypoint_distance_;
    +      98             : 
    +      99             :   bool   _fallback_sampling_enabled_;
    +     100             :   double _fallback_sampling_speed_factor_;
    +     101             :   double _fallback_sampling_accel_factor_;
    +     102             :   double _fallback_sampling_stopping_time_;
    +     103             :   bool   _fallback_sampling_first_waypoint_additional_stop_;
    +     104             : 
    +     105             :   std::string _uav_name_;
    +     106             : 
    +     107             :   bool   _trajectory_max_segment_deviation_enabled_;
    +     108             :   double trajectory_max_segment_deviation_;
    +     109             :   int    _trajectory_max_segment_deviation_max_iterations_;
    +     110             : 
    +     111             :   bool   _path_straightener_enabled_;
    +     112             :   double _path_straightener_max_deviation_;
    +     113             :   double _path_straightener_max_hdg_deviation_;
    +     114             : 
    +     115             :   // | -------- variable parameters (come with the path) -------- |
    +     116             : 
    +     117             :   std::string frame_id_;
    +     118             :   bool        fly_now_                              = false;
    +     119             :   bool        use_heading_                          = false;
    +     120             :   bool        stop_at_waypoints_                    = false;
    +     121             :   bool        override_constraints_                 = false;
    +     122             :   bool        loop_                                 = false;
    +     123             :   double      override_max_velocity_horizontal_     = 0.0;
    +     124             :   double      override_max_velocity_vertical_       = 0.0;
    +     125             :   double      override_max_acceleration_horizontal_ = 0.0;
    +     126             :   double      override_max_acceleration_vertical_   = 0.0;
    +     127             :   double      override_max_jerk_horizontal_         = 0.0;
    +     128             :   double      override_max_jerk_vertical_           = 0.0;
    +     129             : 
    +     130             :   // | -------------- variable parameters (deduced) ------------- |
    +     131             : 
    +     132             :   double     max_execution_time_ = 0;
    +     133             :   std::mutex mutex_max_execution_time_;
    +     134             : 
    +     135             :   bool max_deviation_first_segment_;
    +     136             : 
    +     137             :   std::atomic<bool> dont_prepend_initial_condition_ = false;
    +     138             : 
    +     139             :   // | -------------------- the transformer  -------------------- |
    +     140             : 
    +     141             :   std::shared_ptr<mrs_lib::Transformer> transformer_;
    +     142             : 
    +     143             :   // | ------------------- scope timer logger ------------------- |
    +     144             : 
    +     145             :   bool                                       scope_timer_enabled_ = false;
    +     146             :   std::shared_ptr<mrs_lib::ScopeTimerLogger> scope_timer_logger_;
    +     147             : 
    +     148             :   // service client for input
    +     149             :   bool               callbackPathSrv(mrs_msgs::PathSrv::Request& req, mrs_msgs::PathSrv::Response& res);
    +     150             :   ros::ServiceServer service_server_path_;
    +     151             : 
    +     152             :   // service client for returning result to the user
    +     153             :   bool               callbackGetPathSrv(mrs_msgs::GetPathSrv::Request& req, mrs_msgs::GetPathSrv::Response& res);
    +     154             :   ros::ServiceServer service_server_get_path_;
    +     155             : 
    +     156             :   void                                      callbackPath(const mrs_msgs::Path::ConstPtr msg);
    +     157             :   mrs_lib::SubscribeHandler<mrs_msgs::Path> sh_path_;
    +     158             : 
    +     159             :   mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand>      sh_tracker_cmd_;
    +     160             :   mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints> sh_constraints_;
    +     161             : 
    +     162             :   void                                          callbackUavState(const mrs_msgs::UavState::ConstPtr msg);
    +     163             :   mrs_lib::SubscribeHandler<mrs_msgs::UavState> sh_uav_state_;
    +     164             : 
    +     165             :   mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics> sh_control_manager_diag_;
    +     166             : 
    +     167             :   // service client for publishing trajectory out
    +     168             :   ros::ServiceClient service_client_trajectory_reference_;
    +     169             : 
    +     170             :   // solve the whole problem
    +     171             :   std::tuple<bool, std::string, mrs_msgs::TrajectoryReference> optimize(const std::vector<Waypoint_t>& waypoints_in, const std_msgs::Header& waypoints_stamp,
    +     172             :                                                                         bool fallback_sampling, const bool relax_heading);
    +     173             : 
    +     174             :   std::tuple<std::optional<mrs_msgs::TrackerCommand>, bool, int> prepareInitialCondition(const ros::Time path_time);
    +     175             : 
    +     176             :   // batch vizualizer
    +     177             :   mrs_lib::BatchVisualizer bw_original_;
    +     178             :   mrs_lib::BatchVisualizer bw_final_;
    +     179             : 
    +     180             :   // transforming TrackerCommand
    +     181             :   std::optional<mrs_msgs::Path> transformPath(const mrs_msgs::Path& path, const std::string& target_frame);
    +     182             : 
    +     183             :   // | ------------------ trajectory validation ----------------- |
    +     184             : 
    +     185             :   /**
    +     186             :    * @brief validates samples of a trajectory agains a path of waypoints
    +     187             :    *
    +     188             :    * @param trajectory
    +     189             :    * @param segments
    +     190             :    *
    +     191             :    * @return <success, traj_fail_idx, path_fail_segment>
    +     192             :    */
    +     193             :   std::tuple<bool, int, std::vector<bool>, double> validateTrajectorySpatial(const eth_mav_msgs::EigenTrajectoryPoint::Vector& trajectory,
    +     194             :                                                                              const std::vector<Waypoint_t>&                    waypoints);
    +     195             : 
    +     196             :   std::optional<eth_mav_msgs::EigenTrajectoryPoint::Vector> findTrajectory(const std::vector<Waypoint_t>&                 waypoints,
    +     197             :                                                                            const std::optional<mrs_msgs::TrackerCommand>& initial_state,
    +     198             :                                                                            const double& sampling_dt, const bool& relax_heading);
    +     199             : 
    +     200             :   std::optional<eth_mav_msgs::EigenTrajectoryPoint::Vector> findTrajectoryFallback(const std::vector<Waypoint_t>& waypoints, const double& sampling_dt,
    +     201             :                                                                                    const bool& relax_heading);
    +     202             : 
    +     203             :   std::future<std::optional<eth_mav_msgs::EigenTrajectoryPoint::Vector>> future_trajectory_result_;
    +     204             :   std::atomic<bool>                                                      running_async_planning_ = false;
    +     205             : 
    +     206             :   std::optional<eth_mav_msgs::EigenTrajectoryPoint::Vector> findTrajectoryAsync(const std::vector<Waypoint_t>&                 waypoints,
    +     207             :                                                                                 const std::optional<mrs_msgs::TrackerCommand>& initial_state,
    +     208             :                                                                                 const double& sampling_dt, const bool& relax_heading);
    +     209             : 
    +     210             :   std::vector<Waypoint_t> preprocessPath(const std::vector<Waypoint_t>& waypoints_in);
    +     211             : 
    +     212             :   mrs_msgs::TrajectoryReference getTrajectoryReference(const eth_mav_msgs::EigenTrajectoryPoint::Vector& trajectory,
    +     213             :                                                        const std::optional<mrs_msgs::TrackerCommand>& initial_condition, const double& sampling_dt);
    +     214             : 
    +     215             :   Waypoint_t interpolatePoint(const Waypoint_t& a, const Waypoint_t& b, const double& coeff);
    +     216             : 
    +     217             :   bool checkNaN(const Waypoint_t& a);
    +     218             : 
    +     219             :   double distFromSegment(const vec3_t& point, const vec3_t& seg1, const vec3_t& seg2);
    +     220             : 
    +     221             :   bool trajectorySrv(const mrs_msgs::TrajectoryReference& msg);
    +     222             : 
    +     223             :   // | --------------- dynamic reconfigure server --------------- |
    +     224             : 
    +     225             :   boost::recursive_mutex                           mutex_drs_;
    +     226             :   typedef mrs_uav_trajectory_generation::drsConfig DrsParams_t;
    +     227             :   typedef dynamic_reconfigure::Server<DrsParams_t> Drs_t;
    +     228             :   boost::shared_ptr<Drs_t>                         drs_;
    +     229             :   void                                             callbackDrs(mrs_uav_trajectory_generation::drsConfig& params, uint32_t level);
    +     230             :   DrsParams_t                                      params_;
    +     231             :   std::mutex                                       mutex_params_;
    +     232             : 
    +     233             :   // | ------------ Republisher for the desired path ------------ |
    +     234             : 
    +     235             :   mrs_lib::PublisherHandler<mrs_msgs::Path> ph_original_path_;
    +     236             : 
    +     237             :   // | ------------- measuring the time of execution ------------ |
    +     238             : 
    +     239             :   ros::Time  start_time_total_;
    +     240             :   std::mutex mutex_start_time_total_;
    +     241             :   bool       overtime(void);
    +     242             :   double     timeLeft(void);
    +     243             : };
    +     244             : 
    +     245             : //}
    +     246             : 
    +     247             : /* onInit() //{ */
    +     248             : 
    +     249          91 : void MrsTrajectoryGeneration::onInit() {
    +     250             : 
    +     251             :   /* obtain node handle */
    +     252          91 :   nh_ = nodelet::Nodelet::getMTPrivateNodeHandle();
    +     253             : 
    +     254             :   /* waits for the ROS to publish clock */
    +     255          91 :   ros::Time::waitForValid();
    +     256             : 
    +     257             :   // | ----------------------- publishers ----------------------- |
    +     258             : 
    +     259          91 :   ph_original_path_ = mrs_lib::PublisherHandler<mrs_msgs::Path>(nh_, "original_path_out", 1);
    +     260             : 
    +     261             :   // | ----------------------- subscribers ---------------------- |
    +     262             : 
    +     263         182 :   mrs_lib::SubscribeHandlerOptions shopts;
    +     264          91 :   shopts.nh                 = nh_;
    +     265          91 :   shopts.node_name          = "TrajectoryGeneration";
    +     266          91 :   shopts.no_message_timeout = mrs_lib::no_timeout;
    +     267          91 :   shopts.threadsafe         = true;
    +     268          91 :   shopts.autostart          = true;
    +     269          91 :   shopts.queue_size         = 10;
    +     270          91 :   shopts.transport_hints    = ros::TransportHints().tcpNoDelay();
    +     271             : 
    +     272          91 :   sh_constraints_          = mrs_lib::SubscribeHandler<mrs_msgs::DynamicsConstraints>(shopts, "constraints_in");
    +     273          91 :   sh_tracker_cmd_          = mrs_lib::SubscribeHandler<mrs_msgs::TrackerCommand>(shopts, "tracker_cmd_in");
    +     274          91 :   sh_uav_state_            = mrs_lib::SubscribeHandler<mrs_msgs::UavState>(shopts, "uav_state_in", &MrsTrajectoryGeneration::callbackUavState, this);
    +     275          91 :   sh_control_manager_diag_ = mrs_lib::SubscribeHandler<mrs_msgs::ControlManagerDiagnostics>(shopts, "control_manager_diag_in");
    +     276             : 
    +     277          91 :   sh_path_ = mrs_lib::SubscribeHandler<mrs_msgs::Path>(shopts, "path_in", &MrsTrajectoryGeneration::callbackPath, this);
    +     278             : 
    +     279             :   // | --------------------- service servers -------------------- |
    +     280             : 
    +     281          91 :   service_server_path_ = nh_.advertiseService("path_in", &MrsTrajectoryGeneration::callbackPathSrv, this);
    +     282             : 
    +     283          91 :   service_server_get_path_ = nh_.advertiseService("get_path_in", &MrsTrajectoryGeneration::callbackGetPathSrv, this);
    +     284             : 
    +     285          91 :   service_client_trajectory_reference_ = nh_.serviceClient<mrs_msgs::TrajectoryReferenceSrv>("trajectory_reference_out");
    +     286             : 
    +     287             :   // | ----------------------- parameters ----------------------- |
    +     288             : 
    +     289         182 :   mrs_lib::ParamLoader param_loader(nh_, "MrsTrajectoryGeneration");
    +     290             : 
    +     291         182 :   std::string custom_config_path;
    +     292         182 :   std::string platform_config_path;
    +     293             : 
    +     294          91 :   param_loader.loadParam("custom_config", custom_config_path);
    +     295          91 :   param_loader.loadParam("platform_config", platform_config_path);
    +     296             : 
    +     297          91 :   if (custom_config_path != "") {
    +     298          91 :     param_loader.addYamlFile(custom_config_path);
    +     299             :   }
    +     300             : 
    +     301          91 :   if (platform_config_path != "") {
    +     302          91 :     param_loader.addYamlFile(platform_config_path);
    +     303             :   }
    +     304             : 
    +     305          91 :   param_loader.addYamlFileFromParam("private_config");
    +     306          91 :   param_loader.addYamlFileFromParam("public_config");
    +     307             : 
    +     308         182 :   const std::string yaml_prefix = "mrs_uav_trajectory_generation/";
    +     309             : 
    +     310          91 :   param_loader.loadParam("uav_name", _uav_name_);
    +     311             : 
    +     312          91 :   param_loader.loadParam(yaml_prefix + "sampling_dt", _sampling_dt_);
    +     313             : 
    +     314          91 :   param_loader.loadParam(yaml_prefix + "enforce_fallback_solver", params_.enforce_fallback_solver);
    +     315             : 
    +     316          91 :   param_loader.loadParam(yaml_prefix + "max_trajectory_len_factor", _max_trajectory_len_factor_);
    +     317          91 :   param_loader.loadParam(yaml_prefix + "min_trajectory_len_factor", _min_trajectory_len_factor_);
    +     318             : 
    +     319          91 :   param_loader.loadParam(yaml_prefix + "n_attempts", _n_attempts_);
    +     320          91 :   param_loader.loadParam(yaml_prefix + "fallback_sampling/enabled", _fallback_sampling_enabled_);
    +     321          91 :   param_loader.loadParam(yaml_prefix + "fallback_sampling/speed_factor", _fallback_sampling_speed_factor_);
    +     322          91 :   param_loader.loadParam(yaml_prefix + "fallback_sampling/accel_factor", _fallback_sampling_accel_factor_);
    +     323          91 :   param_loader.loadParam(yaml_prefix + "fallback_sampling/stopping_time", _fallback_sampling_stopping_time_);
    +     324          91 :   param_loader.loadParam(yaml_prefix + "fallback_sampling/first_waypoint_additional_stop", _fallback_sampling_first_waypoint_additional_stop_);
    +     325             : 
    +     326          91 :   param_loader.loadParam(yaml_prefix + "check_trajectory_deviation/enabled", _trajectory_max_segment_deviation_enabled_);
    +     327          91 :   param_loader.loadParam(yaml_prefix + "check_trajectory_deviation/max_deviation", params_.max_deviation);
    +     328          91 :   param_loader.loadParam(yaml_prefix + "check_trajectory_deviation/max_iterations", _trajectory_max_segment_deviation_max_iterations_);
    +     329             : 
    +     330          91 :   param_loader.loadParam(yaml_prefix + "path_straightener/enabled", _path_straightener_enabled_);
    +     331          91 :   param_loader.loadParam(yaml_prefix + "path_straightener/max_deviation", _path_straightener_max_deviation_);
    +     332          91 :   param_loader.loadParam(yaml_prefix + "path_straightener/max_hdg_deviation", _path_straightener_max_hdg_deviation_);
    +     333             : 
    +     334          91 :   param_loader.loadParam(yaml_prefix + "min_waypoint_distance", _min_waypoint_distance_);
    +     335             : 
    +     336             :   // | --------------------- tf transformer --------------------- |
    +     337             : 
    +     338          91 :   transformer_ = std::make_shared<mrs_lib::Transformer>(nh_, "TrajectoryGeneration");
    +     339          91 :   transformer_->setDefaultPrefix(_uav_name_);
    +     340          91 :   transformer_->retryLookupNewest(true);
    +     341             : 
    +     342             :   // | ------------------- scope timer logger ------------------- |
    +     343             : 
    +     344          91 :   param_loader.loadParam(yaml_prefix + "scope_timer/enabled", scope_timer_enabled_);
    +     345         273 :   const std::string scope_timer_log_filename = param_loader.loadParam2("scope_timer/log_filename", std::string(""));
    +     346          91 :   scope_timer_logger_                        = std::make_shared<mrs_lib::ScopeTimerLogger>(scope_timer_log_filename, scope_timer_enabled_);
    +     347             : 
    +     348             :   // | --------------------- service clients -------------------- |
    +     349             : 
    +     350          91 :   param_loader.loadParam(yaml_prefix + "time_penalty", params_.time_penalty);
    +     351          91 :   param_loader.loadParam(yaml_prefix + "soft_constraints_enabled", params_.soft_constraints_enabled);
    +     352          91 :   param_loader.loadParam(yaml_prefix + "soft_constraints_weight", params_.soft_constraints_weight);
    +     353          91 :   param_loader.loadParam(yaml_prefix + "time_allocation", params_.time_allocation);
    +     354          91 :   param_loader.loadParam(yaml_prefix + "equality_constraint_tolerance", params_.equality_constraint_tolerance);
    +     355          91 :   param_loader.loadParam(yaml_prefix + "inequality_constraint_tolerance", params_.inequality_constraint_tolerance);
    +     356          91 :   param_loader.loadParam(yaml_prefix + "max_iterations", params_.max_iterations);
    +     357          91 :   param_loader.loadParam(yaml_prefix + "derivative_to_optimize", params_.derivative_to_optimize);
    +     358             : 
    +     359          91 :   param_loader.loadParam(yaml_prefix + "max_time", params_.max_execution_time);
    +     360             : 
    +     361          91 :   max_execution_time_ = params_.max_execution_time;
    +     362             : 
    +     363          91 :   if (!param_loader.loadedSuccessfully()) {
    +     364           0 :     ROS_ERROR("[TrajectoryGeneration]: could not load all parameters!");
    +     365           0 :     ros::shutdown();
    +     366             :   }
    +     367             : 
    +     368             :   // | -------------------- batch visualizer -------------------- |
    +     369             : 
    +     370          91 :   bw_original_ = mrs_lib::BatchVisualizer(nh_, "markers/original", "");
    +     371             : 
    +     372          91 :   bw_original_.clearBuffers();
    +     373          91 :   bw_original_.clearVisuals();
    +     374             : 
    +     375          91 :   bw_final_ = mrs_lib::BatchVisualizer(nh_, "markers/final", "");
    +     376             : 
    +     377          91 :   bw_final_.clearBuffers();
    +     378          91 :   bw_final_.clearVisuals();
    +     379             : 
    +     380             :   // | --------------- dynamic reconfigure server --------------- |
    +     381             : 
    +     382          91 :   drs_.reset(new Drs_t(mutex_drs_, nh_));
    +     383          91 :   drs_->updateConfig(params_);
    +     384          91 :   Drs_t::CallbackType f = boost::bind(&MrsTrajectoryGeneration::callbackDrs, this, _1, _2);
    +     385          91 :   drs_->setCallback(f);
    +     386             : 
    +     387             :   // | --------------------- finish the init -------------------- |
    +     388             : 
    +     389          91 :   ROS_INFO_ONCE("[TrajectoryGeneration]: initialized");
    +     390             : 
    +     391          91 :   is_initialized_ = true;
    +     392          91 : }
    +     393             : 
    +     394             : //}
    +     395             : 
    +     396             : // | ---------------------- main routines --------------------- |
    +     397             : 
    +     398             : /*
    +     399             :  * 1. preprocessPath(): preprocessing the incoming path
    +     400             :  *    - throughs away too close waypoints
    +     401             :  *    - straightness path by neglecting waypoints close to segments
    +     402             :  * 2. optimize(): solves the whole problem including
    +     403             :  *    - subdivision for satisfying max deviation
    +     404             :  * 3. findTrajectory(): solves single instance by the ETH tool
    +     405             :  * 4. findTrajectoryFallback(): Baca's sampling for backup solution
    +     406             :  * 5. validateTrajectorySpatial(): checks for the spatial soundness of a trajectory vs. the original path
    +     407             :  */
    +     408             : 
    +     409             : /* preprocessPath() //{ */
    +     410             : 
    +     411          11 : std::vector<Waypoint_t> MrsTrajectoryGeneration::preprocessPath(const std::vector<Waypoint_t>& waypoints_in) {
    +     412             : 
    +     413          33 :   mrs_lib::ScopeTimer timer = mrs_lib::ScopeTimer("MrsTrajectoryGeneration::preprocessPath", scope_timer_logger_, scope_timer_enabled_);
    +     414             : 
    +     415          11 :   std::vector<Waypoint_t> waypoints;
    +     416             : 
    +     417          11 :   size_t last_added_idx = 0;  // in "waypoints_in"
    +     418             : 
    +     419          62 :   for (size_t i = 0; i < waypoints_in.size(); i++) {
    +     420             : 
    +     421          51 :     double x       = waypoints_in.at(i).coords[0];
    +     422          51 :     double y       = waypoints_in.at(i).coords[1];
    +     423          51 :     double z       = waypoints_in.at(i).coords[2];
    +     424          51 :     double heading = waypoints_in.at(i).coords[3];
    +     425             : 
    +     426          51 :     bw_original_.addPoint(vec3_t(x, y, z), 1.0, 0.0, 0.0, 1.0);
    +     427             : 
    +     428          51 :     if (_path_straightener_enabled_ && waypoints_in.size() >= 3 && i > 0 && i < (waypoints_in.size() - 1)) {
    +     429             : 
    +     430           0 :       vec3_t first(waypoints_in.at(last_added_idx).coords[0], waypoints_in.at(last_added_idx).coords[1], waypoints_in.at(last_added_idx).coords[2]);
    +     431           0 :       vec3_t last(waypoints_in.at(i + 1).coords[0], waypoints_in.at(i + 1).coords[1], waypoints_in.at(i + 1).coords[2]);
    +     432             : 
    +     433           0 :       double first_hdg = waypoints_in.at(last_added_idx).coords[3];
    +     434           0 :       double last_hdg  = waypoints_in.at(i + 1).coords[3];
    +     435             : 
    +     436           0 :       size_t next_point = last_added_idx + 1;
    +     437             : 
    +     438           0 :       bool segment_is_ok = true;
    +     439             : 
    +     440           0 :       for (size_t j = next_point; j < i + 1; j++) {
    +     441             : 
    +     442           0 :         vec3_t mid(waypoints_in.at(j).coords[0], waypoints_in.at(j).coords[1], waypoints_in.at(j).coords[2]);
    +     443           0 :         double mid_hdg = waypoints_in.at(j).coords[3];
    +     444             : 
    +     445           0 :         double dist_from_segment = distFromSegment(mid, first, last);
    +     446             : 
    +     447           0 :         if (dist_from_segment > _path_straightener_max_deviation_ || fabs(radians::diff(first_hdg, mid_hdg) > _path_straightener_max_hdg_deviation_) ||
    +     448           0 :             fabs(radians::diff(last_hdg, mid_hdg) > _path_straightener_max_hdg_deviation_)) {
    +     449           0 :           segment_is_ok = false;
    +     450           0 :           break;
    +     451             :         }
    +     452             :       }
    +     453             : 
    +     454           0 :       if (segment_is_ok) {
    +     455           0 :         continue;
    +     456             :       }
    +     457             :     }
    +     458             : 
    +     459          51 :     if (i > 0 && i < (waypoints_in.size() - 1)) {
    +     460             : 
    +     461          29 :       vec3_t first(waypoints_in.at(last_added_idx).coords[0], waypoints_in.at(last_added_idx).coords[1], waypoints_in.at(last_added_idx).coords[2]);
    +     462          29 :       vec3_t last(waypoints_in.at(i).coords[0], waypoints_in.at(i).coords[1], waypoints_in.at(i).coords[2]);
    +     463             : 
    +     464          29 :       if (mrs_lib::geometry::dist(first, last) < _min_waypoint_distance_) {
    +     465           0 :         ROS_INFO("[TrajectoryGeneration]: waypoint #%d too close (< %.3f m) to the previous one (#%d), throwing it away", int(i), _min_waypoint_distance_,
    +     466             :                  int(last_added_idx));
    +     467           0 :         continue;
    +     468             :       }
    +     469             :     }
    +     470             : 
    +     471          51 :     Waypoint_t wp;
    +     472          51 :     wp.coords  = Eigen::Vector4d(x, y, z, heading);
    +     473          51 :     wp.stop_at = waypoints_in.at(i).stop_at;
    +     474          51 :     waypoints.push_back(wp);
    +     475             : 
    +     476          51 :     last_added_idx = i;
    +     477             :   }
    +     478             : 
    +     479          22 :   return waypoints;
    +     480             : }
    +     481             : 
    +     482             : //}
    +     483             : 
    +     484             : /* prepareInitialCondition() //{ */
    +     485             : 
    +     486          11 : std::tuple<std::optional<mrs_msgs::TrackerCommand>, bool, int> MrsTrajectoryGeneration::prepareInitialCondition(const ros::Time path_time) {
    +     487             : 
    +     488          11 :   if (dont_prepend_initial_condition_) {
    +     489           0 :     return {{}, false, 0};
    +     490             :   }
    +     491             : 
    +     492          11 :   if (!sh_tracker_cmd_.hasMsg()) {
    +     493           8 :     return {{}, false, 0};
    +     494             :   }
    +     495             : 
    +     496          14 :   auto tracker_cmd = sh_tracker_cmd_.getMsg();
    +     497             : 
    +     498             :   // | ------------- prepare the initial conditions ------------- |
    +     499             : 
    +     500          14 :   mrs_msgs::TrackerCommand initial_condition;
    +     501             : 
    +     502           7 :   bool path_from_future = false;
    +     503             : 
    +     504             :   // positive = in the future
    +     505           7 :   double path_time_offset = 0;
    +     506             : 
    +     507           7 :   if (path_time != ros::Time(0)) {
    +     508           0 :     path_time_offset = (path_time - ros::Time::now()).toSec();
    +     509             :   }
    +     510             : 
    +     511           7 :   int path_sample_offset = 0;
    +     512             : 
    +     513             :   // if the desired path starts in the future, more than one MPC step ahead
    +     514           7 :   if (path_time_offset > 0.2) {
    +     515             : 
    +     516           0 :     ROS_INFO("[TrajectoryGeneration]: desired path is from the future by %.2f s", path_time_offset);
    +     517             : 
    +     518             :     // calculate the offset in samples in the predicted trajectory
    +     519             :     // 0.01 is subtracted for the first sample, which is smaller
    +     520             :     // +1 is added due to the first sample, which was subtarcted
    +     521           0 :     path_sample_offset = int(ceil((path_time_offset * FUTURIZATION_FIRST_WAYPOINT_FACTOR - 0.01) / 0.2)) + 1;
    +     522             : 
    +     523           0 :     if (path_sample_offset > (int(tracker_cmd->full_state_prediction.position.size()) - 1)) {
    +     524             : 
    +     525           0 :       ROS_ERROR("[TrajectoryGeneration]: can not extrapolate into the waypoints, using tracker_cmd instead");
    +     526           0 :       initial_condition = *tracker_cmd;
    +     527             : 
    +     528             :     } else {
    +     529             : 
    +     530             :       // copy the sample from the current prediction into TrackerCommand, so that we can easily transform it
    +     531           0 :       mrs_msgs::TrackerCommand full_state;
    +     532             : 
    +     533           0 :       full_state.header = tracker_cmd->full_state_prediction.header;
    +     534             : 
    +     535           0 :       full_state.position     = tracker_cmd->full_state_prediction.position[path_sample_offset];
    +     536           0 :       full_state.velocity     = tracker_cmd->full_state_prediction.velocity[path_sample_offset];
    +     537           0 :       full_state.acceleration = tracker_cmd->full_state_prediction.acceleration[path_sample_offset];
    +     538           0 :       full_state.jerk         = tracker_cmd->full_state_prediction.jerk[path_sample_offset];
    +     539             : 
    +     540           0 :       full_state.heading              = tracker_cmd->full_state_prediction.heading[path_sample_offset];
    +     541           0 :       full_state.heading_rate         = tracker_cmd->full_state_prediction.heading_rate[path_sample_offset];
    +     542           0 :       full_state.heading_acceleration = tracker_cmd->full_state_prediction.heading_acceleration[path_sample_offset];
    +     543           0 :       full_state.heading_jerk         = tracker_cmd->full_state_prediction.heading_jerk[path_sample_offset];
    +     544             : 
    +     545           0 :       ROS_INFO("[TrajectoryGeneration]: getting initial condition from the %d-th sample of the MPC prediction", path_sample_offset);
    +     546             : 
    +     547           0 :       initial_condition.header = full_state.header;
    +     548             : 
    +     549           0 :       initial_condition.position     = full_state.position;
    +     550           0 :       initial_condition.velocity     = full_state.velocity;
    +     551           0 :       initial_condition.acceleration = full_state.acceleration;
    +     552           0 :       initial_condition.jerk         = full_state.jerk;
    +     553             : 
    +     554           0 :       initial_condition.heading              = full_state.heading;
    +     555           0 :       initial_condition.heading_rate         = full_state.heading_rate;
    +     556           0 :       initial_condition.heading_acceleration = full_state.heading_acceleration;
    +     557           0 :       initial_condition.heading_jerk         = full_state.heading_jerk;
    +     558             : 
    +     559           0 :       path_from_future = true;
    +     560             :     }
    +     561             : 
    +     562             :   } else {
    +     563             : 
    +     564           7 :     ROS_INFO("[TrajectoryGeneration]: desired path is NOT from the future, using tracker_cmd as the initial condition");
    +     565             : 
    +     566           7 :     initial_condition = *tracker_cmd;
    +     567             :   }
    +     568             : 
    +     569           7 :   auto control_manager_diag = sh_control_manager_diag_.getMsg();
    +     570             : 
    +     571           7 :   if (path_time == ros::Time(0)) {
    +     572           7 :     if (!control_manager_diag->tracker_status.have_goal) {
    +     573           3 :       initial_condition.header.stamp = ros::Time(0);
    +     574             :     }
    +     575             :   }
    +     576             : 
    +     577           7 :   return {{initial_condition}, path_from_future, path_sample_offset};
    +     578             : }
    +     579             : 
    +     580             : //}
    +     581             : 
    +     582             : /* optimize() //{ */
    +     583             : 
    +     584          11 : std::tuple<bool, std::string, mrs_msgs::TrajectoryReference> MrsTrajectoryGeneration::optimize(const std::vector<Waypoint_t>& waypoints_in,
    +     585             :                                                                                                const std_msgs::Header&        waypoints_header,
    +     586             :                                                                                                const bool fallback_sampling, const bool relax_heading) {
    +     587             : 
    +     588          33 :   mrs_lib::ScopeTimer timer = mrs_lib::ScopeTimer("MrsTrajectoryGeneration::optimize", scope_timer_logger_, scope_timer_enabled_);
    +     589             : 
    +     590          11 :   ros::Time optimize_time_start = ros::Time::now();
    +     591             : 
    +     592             :   // | ---------------- reset the visual markers ---------------- |
    +     593             : 
    +     594          11 :   bw_original_.clearBuffers();
    +     595          11 :   bw_original_.clearVisuals();
    +     596          11 :   bw_final_.clearBuffers();
    +     597          11 :   bw_final_.clearVisuals();
    +     598             : 
    +     599          11 :   bw_original_.setParentFrame(transformer_->resolveFrame(frame_id_));
    +     600          11 :   bw_final_.setParentFrame(transformer_->resolveFrame(frame_id_));
    +     601             : 
    +     602          11 :   bw_original_.setPointsScale(0.4);
    +     603          11 :   bw_final_.setPointsScale(0.35);
    +     604             : 
    +     605             :   // empty path is invalid
    +     606          11 :   if (waypoints_in.size() == 0) {
    +     607           0 :     std::stringstream ss;
    +     608           0 :     ss << "the path is empty (before postprocessing)";
    +     609           0 :     ROS_ERROR_STREAM("[TrajectoryGeneration]: " << ss.str());
    +     610           0 :     return std::tuple(false, ss.str(), mrs_msgs::TrajectoryReference());
    +     611             :   }
    +     612             : 
    +     613          22 :   std::vector<Waypoint_t> waypoints_in_with_init = waypoints_in;
    +     614             : 
    +     615          11 :   double path_time_offset = (waypoints_header.stamp - ros::Time::now()).toSec();
    +     616             : 
    +     617          11 :   if (path_time_offset > 0.2 && waypoints_in_with_init.size() >= 2) {
    +     618           0 :     waypoints_in_with_init.erase(waypoints_in_with_init.begin());
    +     619             :   }
    +     620             : 
    +     621          22 :   auto [initial_condition, path_from_future, path_sample_offset] = prepareInitialCondition(waypoints_header.stamp);
    +     622             : 
    +     623             :   // prepend the initial condition
    +     624          11 :   if (initial_condition) {
    +     625             : 
    +     626           7 :     Waypoint_t initial_waypoint;
    +     627             :     initial_waypoint.coords =
    +     628           7 :         Eigen::Vector4d(initial_condition->position.x, initial_condition->position.y, initial_condition->position.z, initial_condition->heading);
    +     629           7 :     initial_waypoint.stop_at = false;
    +     630           7 :     waypoints_in_with_init.insert(waypoints_in_with_init.begin(), initial_waypoint);
    +     631             : 
    +     632             :   } else {
    +     633           4 :     if (!dont_prepend_initial_condition_) {
    +     634           4 :       fly_now_ = false;
    +     635             :     }
    +     636             :   }
    +     637             : 
    +     638          22 :   std::vector<Waypoint_t> waypoints = preprocessPath(waypoints_in_with_init);
    +     639             : 
    +     640          11 :   if (waypoints.size() <= 1) {
    +     641           0 :     std::stringstream ss;
    +     642           0 :     ss << "the path is empty (after postprocessing)";
    +     643           0 :     ROS_ERROR_STREAM("[TrajectoryGeneration]: " << ss.str());
    +     644           0 :     return std::tuple(false, ss.str(), mrs_msgs::TrajectoryReference());
    +     645             :   }
    +     646             : 
    +     647          11 :   bool              safe = false;
    +     648             :   int               traj_idx;
    +     649          22 :   std::vector<bool> segment_safeness;
    +     650          11 :   double            max_deviation = 0;
    +     651             : 
    +     652          22 :   eth_mav_msgs::EigenTrajectoryPoint::Vector trajectory;
    +     653             : 
    +     654          11 :   double sampling_dt = 0;
    +     655             : 
    +     656          11 :   if (path_from_future) {
    +     657           0 :     ROS_INFO("[TrajectoryGeneration]: changing dt = 0.2, cause the path is from the future");
    +     658           0 :     sampling_dt = 0.2;
    +     659             :   } else {
    +     660          11 :     sampling_dt = _sampling_dt_;
    +     661             :   }
    +     662             : 
    +     663          11 :   std::optional<eth_mav_msgs::EigenTrajectoryPoint::Vector> result;
    +     664             : 
    +     665          22 :   auto params = mrs_lib::get_mutexed(mutex_params_, params_);
    +     666             : 
    +     667          11 :   if (params.enforce_fallback_solver) {
    +     668           0 :     ROS_WARN("[TrajectoryGeneration]: fallback sampling enforced");
    +     669           0 :     result = findTrajectoryFallback(waypoints, sampling_dt, relax_heading);
    +     670          11 :   } else if (fallback_sampling) {
    +     671           0 :     ROS_WARN("[TrajectoryGeneration]: executing fallback sampling");
    +     672           0 :     result = findTrajectoryFallback(waypoints, sampling_dt, relax_heading);
    +     673          11 :   } else if (running_async_planning_) {
    +     674           5 :     ROS_WARN("[TrajectoryGeneration]: executing fallback sampling, the previous async task is still running");
    +     675           5 :     result = findTrajectoryFallback(waypoints, sampling_dt, relax_heading);
    +     676           6 :   } else if (overtime()) {
    +     677           1 :     ROS_WARN("[TrajectoryGeneration]: executing fallback sampling, we are running over time");
    +     678           1 :     result = findTrajectoryFallback(waypoints, sampling_dt, relax_heading);
    +     679             :   } else {
    +     680             : 
    +     681           5 :     result = findTrajectoryAsync(waypoints, initial_condition, sampling_dt, relax_heading);
    +     682             :   }
    +     683             : 
    +     684          11 :   if (result) {
    +     685          11 :     trajectory = result.value();
    +     686             :   } else {
    +     687           0 :     std::stringstream ss;
    +     688           0 :     ss << "failed to find trajectory";
    +     689           0 :     ROS_ERROR_STREAM("[TrajectoryGeneration]: " << ss.str());
    +     690           0 :     return std::tuple(false, ss.str(), mrs_msgs::TrajectoryReference());
    +     691             :   }
    +     692             : 
    +     693          17 :   for (int k = 0; k < _trajectory_max_segment_deviation_max_iterations_; k++) {
    +     694             : 
    +     695          17 :     ROS_DEBUG("[TrajectoryGeneration]: revalidation cycle #%d", k);
    +     696             : 
    +     697          17 :     std::tie(safe, traj_idx, segment_safeness, max_deviation) = validateTrajectorySpatial(trajectory, waypoints);
    +     698             : 
    +     699          17 :     if (_trajectory_max_segment_deviation_enabled_ && !safe) {
    +     700             : 
    +     701          11 :       ROS_DEBUG("[TrajectoryGeneration]: trajectory is not safe, max deviation %.3f m", max_deviation);
    +     702             : 
    +     703          11 :       std::vector<Waypoint_t>::iterator waypoint = waypoints.begin();
    +     704          11 :       std::vector<bool>::iterator       safeness = segment_safeness.begin();
    +     705             : 
    +     706         109 :       for (; waypoint < waypoints.end() - 1; waypoint++) {
    +     707             : 
    +     708          98 :         if (!(*safeness)) {
    +     709             : 
    +     710          49 :           if (waypoint > waypoints.begin() || max_deviation_first_segment_ || int(waypoints.size()) <= 2) {
    +     711          49 :             Waypoint_t midpoint2 = interpolatePoint(*waypoint, *(waypoint + 1), 0.5);
    +     712          49 :             waypoint             = waypoints.insert(waypoint + 1, midpoint2);
    +     713             :           }
    +     714             :         }
    +     715             : 
    +     716          98 :         safeness++;
    +     717             :       }
    +     718             : 
    +     719          11 :       if (params.enforce_fallback_solver) {
    +     720           0 :         ROS_WARN("[TrajectoryGeneration]: fallback sampling enforced");
    +     721           0 :         result = findTrajectoryFallback(waypoints, sampling_dt, relax_heading);
    +     722          11 :       } else if (fallback_sampling) {
    +     723           0 :         ROS_WARN("[TrajectoryGeneration]: executing fallback sampling");
    +     724           0 :         result = findTrajectoryFallback(waypoints, sampling_dt, relax_heading);
    +     725          11 :       } else if (running_async_planning_) {
    +     726           0 :         ROS_WARN("[TrajectoryGeneration]: executing fallback sampling, the previous async task is still running");
    +     727           0 :         result = findTrajectoryFallback(waypoints, sampling_dt, relax_heading);
    +     728          11 :       } else if (overtime()) {
    +     729           0 :         ROS_WARN("[TrajectoryGeneration]: executing fallback sampling, we are running over time");
    +     730           0 :         result = findTrajectoryFallback(waypoints, sampling_dt, relax_heading);
    +     731             :       } else {
    +     732          11 :         result = findTrajectoryAsync(waypoints, initial_condition, sampling_dt, relax_heading);
    +     733             :       }
    +     734             : 
    +     735          11 :       if (result) {
    +     736           6 :         trajectory = result.value();
    +     737             :       } else {
    +     738           5 :         std::stringstream ss;
    +     739           5 :         ss << "failed to find trajectory";
    +     740           5 :         ROS_WARN_STREAM("[TrajectoryGeneration]: " << ss.str());
    +     741           5 :         return std::tuple(false, ss.str(), mrs_msgs::TrajectoryReference());
    +     742           6 :       }
    +     743             : 
    +     744             :     } else {
    +     745           6 :       ROS_DEBUG("[TrajectoryGeneration]: trajectory is safe (%.2f)", max_deviation);
    +     746           6 :       safe = true;
    +     747           6 :       break;
    +     748             :     }
    +     749             :   }
    +     750             : 
    +     751           6 :   ROS_INFO("[TrajectoryGeneration]: final max trajectory-path deviation: %.2f m, total trajectory time: %.2fs ", max_deviation,
    +     752             :            trajectory.size() * sampling_dt);
    +     753             : 
    +     754             :   // prepare rviz markers
    +     755          34 :   for (int i = 0; i < int(waypoints.size()); i++) {
    +     756          28 :     bw_final_.addPoint(vec3_t(waypoints.at(i).coords[0], waypoints.at(i).coords[1], waypoints.at(i).coords[2]), 0.0, 1.0, 0.0, 1.0);
    +     757             :   }
    +     758             : 
    +     759          12 :   mrs_msgs::TrajectoryReference mrs_trajectory;
    +     760             : 
    +     761             :   // convert the optimized trajectory to mrs_msgs::TrajectoryReference
    +     762           6 :   mrs_trajectory = getTrajectoryReference(trajectory, initial_condition, sampling_dt);
    +     763             : 
    +     764             :   // insert part of the MPC prediction in the front of the generated trajectory to compensate for the future
    +     765           6 :   if (path_from_future) {
    +     766             : 
    +     767           0 :     auto current_prediction = sh_tracker_cmd_.getMsg()->full_state_prediction;
    +     768             : 
    +     769             :     // calculate the starting idx that we will use from the current_prediction
    +     770           0 :     double path_time_offset_2   = (ros::Time::now() - current_prediction.header.stamp).toSec();  // = how long did it take to optimize
    +     771           0 :     int    path_sample_offset_2 = int(floor((path_time_offset_2 - 0.01) / 0.2)) + 1;
    +     772             : 
    +     773             :     // if there is anything to insert
    +     774           0 :     if (path_sample_offset > path_sample_offset_2) {
    +     775             : 
    +     776           0 :       ROS_INFO("[TrajectoryGeneration]: inserting pre-trajectory from the prediction, idxs %d to %d", path_sample_offset_2, path_sample_offset);
    +     777             : 
    +     778           0 :       for (int i = path_sample_offset - 1; i >= 0; i--) {
    +     779             : 
    +     780           0 :         ROS_DEBUG("[TrajectoryGeneration]: inserting idx %d", i);
    +     781             : 
    +     782           0 :         mrs_msgs::ReferenceStamped reference;
    +     783             : 
    +     784           0 :         reference.header = current_prediction.header;
    +     785             : 
    +     786           0 :         reference.reference.heading  = current_prediction.heading[i];
    +     787           0 :         reference.reference.position = current_prediction.position[i];
    +     788             : 
    +     789           0 :         auto res = transformer_->transformSingle(reference, waypoints_header.frame_id);
    +     790             : 
    +     791           0 :         if (res) {
    +     792           0 :           reference = res.value();
    +     793             :         } else {
    +     794           0 :           std::stringstream ss;
    +     795           0 :           ss << "could not transform reference to the path frame";
    +     796           0 :           ROS_ERROR_STREAM("[TrajectoryGeneration]: " << ss.str());
    +     797           0 :           return std::tuple(false, ss.str(), mrs_msgs::TrajectoryReference());
    +     798             :         }
    +     799             : 
    +     800           0 :         mrs_trajectory.points.insert(mrs_trajectory.points.begin(), reference.reference);
    +     801             :       }
    +     802             :     }
    +     803             :   }
    +     804             : 
    +     805           6 :   bw_original_.publish();
    +     806           6 :   bw_final_.publish();
    +     807             : 
    +     808           6 :   std::stringstream ss;
    +     809           6 :   ss << "trajectory generated";
    +     810             : 
    +     811           6 :   ROS_DEBUG("[TrajectoryGeneration]: trajectory generated, took %.3f s", (ros::Time::now() - optimize_time_start).toSec());
    +     812             : 
    +     813           6 :   return std::tuple(true, ss.str(), mrs_trajectory);
    +     814             : }
    +     815             : 
    +     816             : //}
    +     817             : 
    +     818             : /* findTrajectory() //{ */
    +     819             : 
    +     820          16 : std::optional<eth_mav_msgs::EigenTrajectoryPoint::Vector> MrsTrajectoryGeneration::findTrajectory(const std::vector<Waypoint_t>&                 waypoints,
    +     821             :                                                                                                   const std::optional<mrs_msgs::TrackerCommand>& initial_state,
    +     822             :                                                                                                   const double& sampling_dt, const bool& relax_heading) {
    +     823             : 
    +     824          48 :   mrs_lib::ScopeTimer timer = mrs_lib::ScopeTimer("MrsTrajectoryGeneration::findTrajectory", scope_timer_logger_, scope_timer_enabled_);
    +     825             : 
    +     826          32 :   mrs_lib::AtomicScopeFlag unset_running(running_async_planning_);
    +     827             : 
    +     828          16 :   ROS_DEBUG("[TrajectoryGeneration]: findTrajectory() started");
    +     829             : 
    +     830          16 :   ros::Time find_trajectory_time_start = ros::Time::now();
    +     831             : 
    +     832          32 :   auto params      = mrs_lib::get_mutexed(mutex_params_, params_);
    +     833          32 :   auto constraints = sh_constraints_.getMsg();
    +     834             : 
    +     835          32 :   auto control_manager_diag = sh_control_manager_diag_.getMsg();
    +     836             : 
    +     837          16 :   if (initial_state && (initial_state->header.stamp - ros::Time::now()).toSec() < 0.2 && control_manager_diag->tracker_status.have_goal) {
    +     838           3 :     max_deviation_first_segment_ = false;
    +     839             :   } else {
    +     840          13 :     max_deviation_first_segment_ = true;
    +     841             :   }
    +     842             : 
    +     843             :   // optimizer
    +     844             : 
    +     845          16 :   eth_trajectory_generation::NonlinearOptimizationParameters parameters;
    +     846             : 
    +     847          16 :   parameters.f_rel                  = 0.05;
    +     848          16 :   parameters.x_rel                  = 0.1;
    +     849          16 :   parameters.time_penalty           = params.time_penalty;
    +     850          16 :   parameters.use_soft_constraints   = params.soft_constraints_enabled;
    +     851          16 :   parameters.soft_constraint_weight = params.soft_constraints_weight;
    +     852          16 :   parameters.time_alloc_method      = static_cast<eth_trajectory_generation::NonlinearOptimizationParameters::TimeAllocMethod>(params.time_allocation);
    +     853          16 :   if (params.time_allocation == 2) {
    +     854          16 :     parameters.algorithm = nlopt::LD_LBFGS;
    +     855             :   }
    +     856          16 :   parameters.initial_stepsize_rel            = 0.1;
    +     857          16 :   parameters.inequality_constraint_tolerance = params.inequality_constraint_tolerance;
    +     858          16 :   parameters.equality_constraint_tolerance   = params.equality_constraint_tolerance;
    +     859          16 :   parameters.max_iterations                  = params.max_iterations;
    +     860             : 
    +     861             :   // let's tell the solver tha it is more time then it thinks, to not stop prematurely
    +     862          16 :   parameters.max_time = 2 * (NLOPT_EXEC_TIME_FACTOR * timeLeft());
    +     863             : 
    +     864          32 :   eth_trajectory_generation::Vertex::Vector vertices;
    +     865          16 :   const int                                 dimension = 4;
    +     866             : 
    +     867          16 :   int derivative_to_optimize = eth_trajectory_generation::derivative_order::ACCELERATION;
    +     868             : 
    +     869          16 :   switch (params.derivative_to_optimize) {
    +     870          16 :     case 0: {
    +     871          16 :       derivative_to_optimize = eth_trajectory_generation::derivative_order::ACCELERATION;
    +     872          16 :       break;
    +     873             :     }
    +     874           0 :     case 1: {
    +     875           0 :       derivative_to_optimize = eth_trajectory_generation::derivative_order::JERK;
    +     876           0 :       break;
    +     877             :     }
    +     878           0 :     case 2: {
    +     879           0 :       derivative_to_optimize = eth_trajectory_generation::derivative_order::SNAP;
    +     880           0 :       break;
    +     881             :     }
    +     882             :   }
    +     883             : 
    +     884             :   // | --------------- add constraints to vertices -------------- |
    +     885             : 
    +     886             :   double last_heading;
    +     887             : 
    +     888          16 :   if (initial_state) {
    +     889          12 :     last_heading = initial_state->heading;
    +     890             :   } else {
    +     891           4 :     last_heading = waypoints.at(0).coords[3];
    +     892             :   }
    +     893             : 
    +     894         197 :   for (size_t i = 0; i < waypoints.size(); i++) {
    +     895         181 :     double x       = waypoints.at(i).coords[0];
    +     896         181 :     double y       = waypoints.at(i).coords[1];
    +     897         181 :     double z       = waypoints.at(i).coords[2];
    +     898         181 :     double heading = sradians::unwrap(waypoints.at(i).coords[3], last_heading);
    +     899         181 :     last_heading   = heading;
    +     900             : 
    +     901         362 :     eth_trajectory_generation::Vertex vertex(dimension);
    +     902             : 
    +     903         181 :     if (i == 0) {
    +     904             : 
    +     905          16 :       vertex.makeStartOrEnd(Eigen::Vector4d(x, y, z, heading), derivative_to_optimize);
    +     906             : 
    +     907          16 :       vertex.addConstraint(eth_trajectory_generation::derivative_order::POSITION, Eigen::Vector4d(x, y, z, heading));
    +     908             : 
    +     909          16 :       if (initial_state) {
    +     910             : 
    +     911          12 :         vertex.addConstraint(eth_trajectory_generation::derivative_order::VELOCITY,
    +     912          12 :                              Eigen::Vector4d(initial_state->velocity.x, initial_state->velocity.y, initial_state->velocity.z, initial_state->heading_rate));
    +     913             : 
    +     914          12 :         vertex.addConstraint(
    +     915             :             eth_trajectory_generation::derivative_order::ACCELERATION,
    +     916          12 :             Eigen::Vector4d(initial_state->acceleration.x, initial_state->acceleration.y, initial_state->acceleration.z, initial_state->heading_acceleration));
    +     917             : 
    +     918          12 :         vertex.addConstraint(eth_trajectory_generation::derivative_order::JERK,
    +     919          24 :                              Eigen::Vector4d(initial_state->jerk.x, initial_state->jerk.y, initial_state->jerk.z, initial_state->heading_jerk));
    +     920             :       }
    +     921             : 
    +     922         165 :     } else if (i == (waypoints.size() - 1)) {  // the last point
    +     923             : 
    +     924          16 :       vertex.makeStartOrEnd(Eigen::Vector4d(x, y, z, heading), derivative_to_optimize);
    +     925             : 
    +     926          16 :       vertex.addConstraint(eth_trajectory_generation::derivative_order::POSITION, Eigen::Vector4d(x, y, z, heading));
    +     927             : 
    +     928             :     } else {  // mid points
    +     929             : 
    +     930         149 :       vertex.addConstraint(eth_trajectory_generation::derivative_order::POSITION, Eigen::Vector4d(x, y, z, heading));
    +     931             : 
    +     932         149 :       if (waypoints.at(i).stop_at) {
    +     933           0 :         vertex.addConstraint(eth_trajectory_generation::derivative_order::VELOCITY, Eigen::Vector4d(0, 0, 0, 0));
    +     934           0 :         vertex.addConstraint(eth_trajectory_generation::derivative_order::ACCELERATION, Eigen::Vector4d(0, 0, 0, 0));
    +     935           0 :         vertex.addConstraint(eth_trajectory_generation::derivative_order::JERK, Eigen::Vector4d(0, 0, 0, 0));
    +     936             :       }
    +     937             :     }
    +     938             : 
    +     939         181 :     vertices.push_back(vertex);
    +     940             :   }
    +     941             : 
    +     942             :   // | ---------------- compute the segment times --------------- |
    +     943             : 
    +     944             :   double v_max_horizontal, a_max_horizontal, j_max_horizontal;
    +     945             :   double v_max_vertical, a_max_vertical, j_max_vertical;
    +     946             : 
    +     947             :   // use the small of the ascending/descending values
    +     948          16 :   double vertical_speed_lim        = std::min(constraints->vertical_ascending_speed, constraints->vertical_descending_speed);
    +     949          16 :   double vertical_acceleration_lim = std::min(constraints->vertical_ascending_acceleration, constraints->vertical_descending_acceleration);
    +     950             : 
    +     951          16 :   v_max_horizontal = constraints->horizontal_speed;
    +     952          16 :   a_max_horizontal = constraints->horizontal_acceleration;
    +     953             : 
    +     954          16 :   v_max_vertical = vertical_speed_lim;
    +     955          16 :   a_max_vertical = vertical_acceleration_lim;
    +     956             : 
    +     957          16 :   j_max_horizontal = constraints->horizontal_jerk;
    +     958          16 :   j_max_vertical   = std::min(constraints->vertical_ascending_jerk, constraints->vertical_descending_jerk);
    +     959             : 
    +     960          16 :   if (override_constraints_) {
    +     961             : 
    +     962           0 :     bool can_change = true;
    +     963             : 
    +     964             : 
    +     965           0 :     if (initial_state) {
    +     966           0 :       can_change = (hypot(initial_state->velocity.x, initial_state->velocity.y) < override_max_velocity_horizontal_) &&
    +     967           0 :                    (hypot(initial_state->acceleration.x, initial_state->acceleration.y) < override_max_acceleration_horizontal_) &&
    +     968           0 :                    (hypot(initial_state->jerk.x, initial_state->jerk.y) < override_max_jerk_horizontal_) &&
    +     969           0 :                    (fabs(initial_state->velocity.z) < override_max_velocity_vertical_) &&
    +     970           0 :                    (fabs(initial_state->acceleration.z) < override_max_acceleration_vertical_) && (fabs(initial_state->jerk.z) < override_max_jerk_vertical_);
    +     971             :     }
    +     972             : 
    +     973           0 :     if (can_change) {
    +     974             : 
    +     975           0 :       v_max_horizontal = override_max_velocity_horizontal_;
    +     976           0 :       a_max_horizontal = override_max_acceleration_horizontal_;
    +     977           0 :       j_max_horizontal = override_max_jerk_horizontal_;
    +     978             : 
    +     979           0 :       v_max_vertical = override_max_velocity_vertical_;
    +     980           0 :       a_max_vertical = override_max_acceleration_vertical_;
    +     981           0 :       j_max_vertical = override_max_jerk_vertical_;
    +     982             : 
    +     983           0 :       ROS_DEBUG("[TrajectoryGeneration]: overriding constraints by a user");
    +     984             : 
    +     985             :     } else {
    +     986             : 
    +     987           0 :       ROS_WARN("[TrajectoryGeneration]: overrifing constraints refused due to possible infeasibility");
    +     988             :     }
    +     989             :   }
    +     990             : 
    +     991             :   double v_max_heading, a_max_heading, j_max_heading;
    +     992             : 
    +     993          16 :   if (relax_heading) {
    +     994           0 :     v_max_heading = std::numeric_limits<float>::max();
    +     995           0 :     a_max_heading = std::numeric_limits<float>::max();
    +     996           0 :     j_max_heading = std::numeric_limits<float>::max();
    +     997             :   } else {
    +     998          16 :     v_max_heading = constraints->heading_speed;
    +     999          16 :     a_max_heading = constraints->heading_acceleration;
    +    1000          16 :     j_max_heading = constraints->heading_jerk;
    +    1001             :   }
    +    1002             : 
    +    1003          16 :   ROS_DEBUG("[TrajectoryGeneration]: using constraints:");
    +    1004          16 :   ROS_DEBUG("[TrajectoryGeneration]: horizontal: vel = %.2f, acc = %.2f, jerk = %.2f", v_max_horizontal, a_max_horizontal, j_max_horizontal);
    +    1005          16 :   ROS_DEBUG("[TrajectoryGeneration]: vertical: vel = %.2f, acc = %.2f, jerk = %.2f", v_max_vertical, a_max_vertical, j_max_vertical);
    +    1006          16 :   ROS_DEBUG("[TrajectoryGeneration]: heading: vel = %.2f, acc = %.2f, jerk = %.2f", v_max_heading, a_max_heading, j_max_heading);
    +    1007             : 
    +    1008          32 :   std::vector<double> segment_times, segment_times_baca;
    +    1009          32 :   segment_times      = estimateSegmentTimes(vertices, v_max_horizontal, v_max_vertical, a_max_horizontal, a_max_vertical, j_max_horizontal, j_max_vertical,
    +    1010          16 :                                        v_max_heading, a_max_heading);
    +    1011          32 :   segment_times_baca = estimateSegmentTimesBaca(vertices, v_max_horizontal, v_max_vertical, a_max_horizontal, a_max_vertical, j_max_horizontal, j_max_vertical,
    +    1012          16 :                                                 v_max_heading, a_max_heading);
    +    1013             : 
    +    1014          16 :   double initial_total_time      = 0;
    +    1015          16 :   double initial_total_time_baca = 0;
    +    1016         181 :   for (int i = 0; i < int(segment_times_baca.size()); i++) {
    +    1017         165 :     initial_total_time += segment_times[i];
    +    1018         165 :     initial_total_time_baca += segment_times_baca[i];
    +    1019             :   }
    +    1020             : 
    +    1021          16 :   ROS_DEBUG("[TrajectoryGeneration]: initial total time (Euclidean): %.2f", initial_total_time);
    +    1022          16 :   ROS_DEBUG("[TrajectoryGeneration]: initial total time (Baca): %.2f", initial_total_time_baca);
    +    1023             : 
    +    1024             :   // | --------- create an optimizer object and solve it -------- |
    +    1025             : 
    +    1026          16 :   const int                                                     N = 10;
    +    1027          32 :   eth_trajectory_generation::PolynomialOptimizationNonLinear<N> opt(dimension, parameters);
    +    1028          16 :   opt.setupFromVertices(vertices, segment_times, derivative_to_optimize);
    +    1029             : 
    +    1030          16 :   opt.addMaximumMagnitudeConstraint(0, eth_trajectory_generation::derivative_order::VELOCITY, v_max_horizontal);
    +    1031          16 :   opt.addMaximumMagnitudeConstraint(0, eth_trajectory_generation::derivative_order::ACCELERATION, a_max_horizontal);
    +    1032          16 :   opt.addMaximumMagnitudeConstraint(0, eth_trajectory_generation::derivative_order::JERK, j_max_horizontal);
    +    1033             : 
    +    1034          16 :   opt.addMaximumMagnitudeConstraint(1, eth_trajectory_generation::derivative_order::VELOCITY, v_max_horizontal);
    +    1035          16 :   opt.addMaximumMagnitudeConstraint(1, eth_trajectory_generation::derivative_order::ACCELERATION, a_max_horizontal);
    +    1036          16 :   opt.addMaximumMagnitudeConstraint(1, eth_trajectory_generation::derivative_order::JERK, j_max_horizontal);
    +    1037             : 
    +    1038          16 :   opt.addMaximumMagnitudeConstraint(2, eth_trajectory_generation::derivative_order::VELOCITY, v_max_vertical);
    +    1039          16 :   opt.addMaximumMagnitudeConstraint(2, eth_trajectory_generation::derivative_order::ACCELERATION, a_max_vertical);
    +    1040          16 :   opt.addMaximumMagnitudeConstraint(2, eth_trajectory_generation::derivative_order::JERK, j_max_vertical);
    +    1041             : 
    +    1042          16 :   opt.addMaximumMagnitudeConstraint(3, eth_trajectory_generation::derivative_order::VELOCITY, v_max_heading);
    +    1043          16 :   opt.addMaximumMagnitudeConstraint(3, eth_trajectory_generation::derivative_order::ACCELERATION, a_max_heading);
    +    1044          16 :   opt.addMaximumMagnitudeConstraint(3, eth_trajectory_generation::derivative_order::JERK, j_max_heading);
    +    1045             : 
    +    1046          16 :   opt.optimize();
    +    1047             : 
    +    1048          16 :   if (overtime()) {
    +    1049           5 :     return {};
    +    1050             :   }
    +    1051             : 
    +    1052          22 :   std::string result_str;
    +    1053             : 
    +    1054          11 :   switch (opt.getOptimizationInfo().stopping_reason) {
    +    1055           6 :     case nlopt::FAILURE: {
    +    1056           6 :       result_str = "generic failure";
    +    1057           6 :       break;
    +    1058             :     }
    +    1059           0 :     case nlopt::INVALID_ARGS: {
    +    1060           0 :       result_str = "invalid args";
    +    1061           0 :       break;
    +    1062             :     }
    +    1063           0 :     case nlopt::OUT_OF_MEMORY: {
    +    1064           0 :       result_str = "out of memory";
    +    1065           0 :       break;
    +    1066             :     }
    +    1067           0 :     case nlopt::ROUNDOFF_LIMITED: {
    +    1068           0 :       result_str = "roundoff limited";
    +    1069           0 :       break;
    +    1070             :     }
    +    1071           0 :     case nlopt::FORCED_STOP: {
    +    1072           0 :       result_str = "forced stop";
    +    1073           0 :       break;
    +    1074             :     }
    +    1075           0 :     case nlopt::STOPVAL_REACHED: {
    +    1076           0 :       result_str = "stopval reached";
    +    1077           0 :       break;
    +    1078             :     }
    +    1079           3 :     case nlopt::FTOL_REACHED: {
    +    1080           3 :       result_str = "ftol reached";
    +    1081           3 :       break;
    +    1082             :     }
    +    1083           0 :     case nlopt::XTOL_REACHED: {
    +    1084           0 :       result_str = "xtol reached";
    +    1085           0 :       break;
    +    1086             :     }
    +    1087           2 :     case nlopt::MAXEVAL_REACHED: {
    +    1088           2 :       result_str = "maxeval reached";
    +    1089           2 :       break;
    +    1090             :     }
    +    1091           0 :     case nlopt::MAXTIME_REACHED: {
    +    1092           0 :       result_str = "maxtime reached";
    +    1093           0 :       break;
    +    1094             :     }
    +    1095           0 :     default: {
    +    1096           0 :       result_str = "UNKNOWN FAILURE CODE";
    +    1097           0 :       break;
    +    1098             :     }
    +    1099             :   }
    +    1100             : 
    +    1101          11 :   if (opt.getOptimizationInfo().stopping_reason >= 1 && opt.getOptimizationInfo().stopping_reason != 6) {
    +    1102           5 :     ROS_DEBUG("[TrajectoryGeneration]: optimization finished successfully with code %d, '%s'", opt.getOptimizationInfo().stopping_reason, result_str.c_str());
    +    1103             : 
    +    1104           6 :   } else if (opt.getOptimizationInfo().stopping_reason == -1) {
    +    1105           6 :     ROS_DEBUG("[TrajectoryGeneration]: optimization finished with a generic error code %d, '%s'", opt.getOptimizationInfo().stopping_reason,
    +    1106             :               result_str.c_str());
    +    1107             : 
    +    1108             :   } else {
    +    1109           0 :     ROS_WARN("[TrajectoryGeneration]: optimization failed with code %d, '%s', took %.3f s", opt.getOptimizationInfo().stopping_reason, result_str.c_str(),
    +    1110             :              (ros::Time::now() - find_trajectory_time_start).toSec());
    +    1111           0 :     return {};
    +    1112             :   }
    +    1113             : 
    +    1114             :   // | ------------- obtain the polynomial segments ------------- |
    +    1115             : 
    +    1116          22 :   eth_trajectory_generation::Segment::Vector segments;
    +    1117          11 :   opt.getPolynomialOptimizationRef().getSegments(&segments);
    +    1118             : 
    +    1119          11 :   if (overtime()) {
    +    1120           0 :     return {};
    +    1121             :   }
    +    1122             : 
    +    1123             :   // | --------------- create the trajectory class -------------- |
    +    1124             : 
    +    1125          22 :   eth_trajectory_generation::Trajectory trajectory;
    +    1126          11 :   opt.getTrajectory(&trajectory);
    +    1127             : 
    +    1128          22 :   eth_mav_msgs::EigenTrajectoryPoint::Vector states;
    +    1129             : 
    +    1130          11 :   ROS_DEBUG("[TrajectoryGeneration]: starting eth sampling with dt = %.2f s ", sampling_dt);
    +    1131             : 
    +    1132          11 :   bool success = eth_trajectory_generation::sampleWholeTrajectory(trajectory, sampling_dt, &states);
    +    1133             : 
    +    1134          11 :   if (overtime()) {
    +    1135           0 :     return {};
    +    1136             :   }
    +    1137             : 
    +    1138             :   // validate the temporal sampling of the trajectory
    +    1139             : 
    +    1140             :   // only check this if the trajectory is > 1.0 sec, this check does not make much sense for the short ones
    +    1141          11 :   if ((states.size() * sampling_dt) > 1.0 && (states.size() * sampling_dt) > (_max_trajectory_len_factor_ * initial_total_time_baca)) {
    +    1142           0 :     ROS_ERROR("[TrajectoryGeneration]: the final trajectory sampling is too long = %.2f, initial 'baca' estimate = %.2f, allowed factor %.2f, aborting",
    +    1143             :               (states.size() * sampling_dt), initial_total_time_baca, _max_trajectory_len_factor_);
    +    1144             : 
    +    1145           0 :     std::stringstream ss;
    +    1146           0 :     ss << "trajectory sampling failed";
    +    1147           0 :     ROS_ERROR_STREAM("[TrajectoryGeneration]: " << ss.str());
    +    1148           0 :     return {};
    +    1149             : 
    +    1150          11 :   } else if ((states.size() * sampling_dt) > 1.0 && (states.size() * sampling_dt) < (_min_trajectory_len_factor_ * initial_total_time_baca)) {
    +    1151           0 :     ROS_ERROR("[TrajectoryGeneration]: the final trajectory sampling is too short = %.2f, initial 'baca' estimate = %.2f, allowed factor %.2f, aborting",
    +    1152             :               (states.size() * sampling_dt), initial_total_time_baca, _min_trajectory_len_factor_);
    +    1153             : 
    +    1154           0 :     std::stringstream ss;
    +    1155           0 :     ss << "trajectory sampling failed";
    +    1156           0 :     ROS_ERROR_STREAM("[TrajectoryGeneration]: " << ss.str());
    +    1157           0 :     return {};
    +    1158             : 
    +    1159             :   } else {
    +    1160          11 :     ROS_DEBUG("[TrajectoryGeneration]: estimated/final trajectory length ratio (final/estimated) %.2f",
    +    1161             :               (states.size() * sampling_dt) / initial_total_time_baca);
    +    1162             :   }
    +    1163             : 
    +    1164          11 :   if (success) {
    +    1165          11 :     ROS_DEBUG("[TrajectoryGeneration]: eth sampling finished, took %.3f s", (ros::Time::now() - find_trajectory_time_start).toSec());
    +    1166          11 :     return std::optional(states);
    +    1167             : 
    +    1168             :   } else {
    +    1169           0 :     ROS_ERROR("[TrajectoryGeneration]: eth could not sample the trajectory, took %.3f s", (ros::Time::now() - find_trajectory_time_start).toSec());
    +    1170           0 :     return {};
    +    1171             :   }
    +    1172             : }
    +    1173             : 
    +    1174             : //}
    +    1175             : 
    +    1176             : /* findTrajectoryFallback() //{ */
    +    1177             : 
    +    1178           6 : std::optional<eth_mav_msgs::EigenTrajectoryPoint::Vector> MrsTrajectoryGeneration::findTrajectoryFallback(const std::vector<Waypoint_t>& waypoints,
    +    1179             :                                                                                                           const double&                  sampling_dt,
    +    1180             :                                                                                                           const bool&                    relax_heading) {
    +    1181             : 
    +    1182          18 :   mrs_lib::ScopeTimer timer = mrs_lib::ScopeTimer("MrsTrajectoryGeneration::findTrajectoryFallback", scope_timer_logger_, scope_timer_enabled_);
    +    1183             : 
    +    1184           6 :   ros::Time time_start = ros::Time::now();
    +    1185             : 
    +    1186           6 :   ROS_WARN("[TrajectoryGeneration]: fallback sampling started");
    +    1187             : 
    +    1188          12 :   auto params      = mrs_lib::get_mutexed(mutex_params_, params_);
    +    1189          12 :   auto constraints = sh_constraints_.getMsg();
    +    1190             : 
    +    1191          12 :   eth_trajectory_generation::Vertex::Vector vertices;
    +    1192           6 :   const int                                 dimension = 4;
    +    1193             : 
    +    1194             :   // | --------------- add constraints to vertices -------------- |
    +    1195             : 
    +    1196           6 :   double last_heading = waypoints.at(0).coords[3];
    +    1197             : 
    +    1198          34 :   for (size_t i = 0; i < waypoints.size(); i++) {
    +    1199             : 
    +    1200          28 :     double x       = waypoints.at(i).coords[0];
    +    1201          28 :     double y       = waypoints.at(i).coords[1];
    +    1202          28 :     double z       = waypoints.at(i).coords[2];
    +    1203          28 :     double heading = sradians::unwrap(waypoints.at(i).coords[3], last_heading);
    +    1204          28 :     last_heading   = heading;
    +    1205             : 
    +    1206          56 :     eth_trajectory_generation::Vertex vertex(dimension);
    +    1207             : 
    +    1208          28 :     vertex.addConstraint(eth_trajectory_generation::derivative_order::POSITION, Eigen::Vector4d(x, y, z, heading));
    +    1209             : 
    +    1210          28 :     vertices.push_back(vertex);
    +    1211             :   }
    +    1212             : 
    +    1213             :   // | ---------------- compute the segment times --------------- |
    +    1214             : 
    +    1215             :   double v_max_horizontal, a_max_horizontal, j_max_horizontal;
    +    1216             :   double v_max_vertical, a_max_vertical, j_max_vertical;
    +    1217             : 
    +    1218             :   // use the small of the ascending/descending values
    +    1219           6 :   double vertical_speed_lim        = std::min(constraints->vertical_ascending_speed, constraints->vertical_descending_speed);
    +    1220           6 :   double vertical_acceleration_lim = std::min(constraints->vertical_ascending_acceleration, constraints->vertical_descending_acceleration);
    +    1221             : 
    +    1222           6 :   if (override_constraints_) {
    +    1223             : 
    +    1224           0 :     v_max_horizontal = override_max_velocity_horizontal_;
    +    1225           0 :     a_max_horizontal = override_max_acceleration_horizontal_;
    +    1226           0 :     j_max_horizontal = override_max_jerk_horizontal_;
    +    1227             : 
    +    1228           0 :     v_max_vertical = override_max_velocity_vertical_;
    +    1229           0 :     a_max_vertical = override_max_acceleration_vertical_;
    +    1230           0 :     j_max_vertical = override_max_jerk_vertical_;
    +    1231             : 
    +    1232           0 :     ROS_DEBUG("[TrajectoryGeneration]: overriding constraints by a user");
    +    1233             :   } else {
    +    1234             : 
    +    1235           6 :     v_max_horizontal = constraints->horizontal_speed;
    +    1236           6 :     a_max_horizontal = constraints->horizontal_acceleration;
    +    1237             : 
    +    1238           6 :     v_max_vertical = vertical_speed_lim;
    +    1239           6 :     a_max_vertical = vertical_acceleration_lim;
    +    1240             : 
    +    1241           6 :     j_max_horizontal = constraints->horizontal_jerk;
    +    1242           6 :     j_max_vertical   = std::min(constraints->vertical_ascending_jerk, constraints->vertical_descending_jerk);
    +    1243             :   }
    +    1244             : 
    +    1245             : 
    +    1246             :   double v_max_heading, a_max_heading, j_max_heading;
    +    1247             : 
    +    1248           6 :   if (relax_heading) {
    +    1249           0 :     v_max_heading = std::numeric_limits<float>::max();
    +    1250           0 :     a_max_heading = std::numeric_limits<float>::max();
    +    1251           0 :     j_max_heading = std::numeric_limits<float>::max();
    +    1252             :   } else {
    +    1253           6 :     v_max_heading = constraints->heading_speed;
    +    1254           6 :     a_max_heading = constraints->heading_acceleration;
    +    1255           6 :     j_max_heading = constraints->heading_jerk;
    +    1256             :   }
    +    1257             : 
    +    1258           6 :   v_max_horizontal *= _fallback_sampling_speed_factor_;
    +    1259           6 :   v_max_vertical *= _fallback_sampling_speed_factor_;
    +    1260             : 
    +    1261           6 :   a_max_horizontal *= _fallback_sampling_accel_factor_;
    +    1262           6 :   a_max_vertical *= _fallback_sampling_accel_factor_;
    +    1263             : 
    +    1264           6 :   ROS_DEBUG("[TrajectoryGeneration]: using constraints:");
    +    1265           6 :   ROS_DEBUG("[TrajectoryGeneration]: horizontal: vel = %.2f, acc = %.2f, jerk = %.2f", v_max_horizontal, a_max_horizontal, j_max_horizontal);
    +    1266           6 :   ROS_DEBUG("[TrajectoryGeneration]: vertical: vel = %.2f, acc = %.2f, jerk = %.2f", v_max_vertical, a_max_vertical, j_max_vertical);
    +    1267           6 :   ROS_DEBUG("[TrajectoryGeneration]: heading: vel = %.2f, acc = %.2f, jerk = %.2f", v_max_heading, a_max_heading, j_max_heading);
    +    1268             : 
    +    1269          12 :   std::vector<double> segment_times, segment_times_baca;
    +    1270          12 :   segment_times      = estimateSegmentTimes(vertices, v_max_horizontal, v_max_vertical, a_max_horizontal, a_max_vertical, j_max_horizontal, j_max_vertical,
    +    1271           6 :                                        v_max_heading, a_max_heading);
    +    1272          12 :   segment_times_baca = estimateSegmentTimesBaca(vertices, v_max_horizontal, v_max_vertical, a_max_horizontal, a_max_vertical, j_max_horizontal, j_max_vertical,
    +    1273           6 :                                                 v_max_heading, a_max_heading);
    +    1274             : 
    +    1275           6 :   double initial_total_time      = 0;
    +    1276           6 :   double initial_total_time_baca = 0;
    +    1277          28 :   for (int i = 0; i < int(segment_times_baca.size()); i++) {
    +    1278          22 :     initial_total_time += segment_times[i];
    +    1279          22 :     initial_total_time_baca += segment_times_baca[i];
    +    1280             : 
    +    1281          22 :     ROS_DEBUG("[TrajectoryGeneration]: segment time [%d] = %.2f", i, segment_times_baca[i]);
    +    1282             :   }
    +    1283             : 
    +    1284           6 :   ROS_WARN("[TrajectoryGeneration]: fallback: initial total time (Euclidean): %.2f", initial_total_time);
    +    1285           6 :   ROS_WARN("[TrajectoryGeneration]: fallback: initial total time (Baca): %.2f", initial_total_time_baca);
    +    1286             : 
    +    1287          12 :   eth_mav_msgs::EigenTrajectoryPoint::Vector states;
    +    1288             : 
    +    1289             :   // interpolate each segment
    +    1290          28 :   for (size_t i = 0; i < waypoints.size() - 1; i++) {
    +    1291             : 
    +    1292          44 :     Eigen::VectorXd start, end;
    +    1293             : 
    +    1294          22 :     const double segment_time = segment_times_baca[i];
    +    1295             : 
    +    1296             :     int    n_samples;
    +    1297             :     double interp_step;
    +    1298             : 
    +    1299          22 :     if (segment_time > 1e-1) {
    +    1300             : 
    +    1301          22 :       n_samples = ceil(segment_time / sampling_dt);
    +    1302             : 
    +    1303             :       // important
    +    1304          22 :       if (n_samples > 0) {
    +    1305          22 :         interp_step = 1.0 / double(n_samples);
    +    1306             :       } else {
    +    1307           0 :         interp_step = 0.5;
    +    1308             :       }
    +    1309             : 
    +    1310             :     } else {
    +    1311           0 :       n_samples   = 0;
    +    1312           0 :       interp_step = 0;
    +    1313             :     }
    +    1314             : 
    +    1315          22 :     ROS_DEBUG("[TrajectoryGeneration]: segment n_samples [%lu] = %d", i, n_samples);
    +    1316             : 
    +    1317             :     // for the last segment, hit the last waypoint completely
    +    1318             :     // otherwise, it is hit as the first sample of the following segment
    +    1319          22 :     if (n_samples > 0 && i == waypoints.size() - 2) {
    +    1320           6 :       n_samples++;
    +    1321             :     }
    +    1322             : 
    +    1323         871 :     for (int j = 0; j < n_samples; j++) {
    +    1324             : 
    +    1325         849 :       Waypoint_t point = interpolatePoint(waypoints[i], waypoints[i + 1], j * interp_step);
    +    1326             : 
    +    1327         849 :       eth_mav_msgs::EigenTrajectoryPoint eth_point;
    +    1328         849 :       eth_point.position_W[0] = point.coords[0];
    +    1329         849 :       eth_point.position_W[1] = point.coords[1];
    +    1330         849 :       eth_point.position_W[2] = point.coords[2];
    +    1331         849 :       eth_point.setFromYaw(point.coords[3]);
    +    1332             : 
    +    1333         849 :       states.push_back(eth_point);
    +    1334             : 
    +    1335         849 :       if (j == 0 && i > 0 && waypoints[i].stop_at) {
    +    1336             : 
    +    1337           0 :         int insert_samples = int(round(_fallback_sampling_stopping_time_ / sampling_dt));
    +    1338             : 
    +    1339           0 :         for (int k = 0; k < insert_samples; k++) {
    +    1340           0 :           states.push_back(eth_point);
    +    1341             :         }
    +    1342             :       }
    +    1343             :     }
    +    1344             :   }
    +    1345             : 
    +    1346           6 :   bool success = true;
    +    1347             : 
    +    1348           6 :   ROS_WARN("[TrajectoryGeneration]: fallback: sampling finished, took %.3f s", (ros::Time::now() - time_start).toSec());
    +    1349             : 
    +    1350             :   // | --------------- create the trajectory class -------------- |
    +    1351             : 
    +    1352           6 :   if (success) {
    +    1353           6 :     return std::optional(states);
    +    1354             :   } else {
    +    1355           0 :     ROS_ERROR("[TrajectoryGeneration]: fallback: sampling failed");
    +    1356           0 :     return {};
    +    1357             :   }
    +    1358             : }
    +    1359             : 
    +    1360             : //}
    +    1361             : 
    +    1362             : /* validateTrajectorySpatial() //{ */
    +    1363             : 
    +    1364          17 : std::tuple<bool, int, std::vector<bool>, double> MrsTrajectoryGeneration::validateTrajectorySpatial(
    +    1365             :     const eth_mav_msgs::EigenTrajectoryPoint::Vector& trajectory, const std::vector<Waypoint_t>& waypoints) {
    +    1366             : 
    +    1367          51 :   mrs_lib::ScopeTimer timer = mrs_lib::ScopeTimer("MrsTrajectoryGeneration::validateTrajectorySpatial", scope_timer_logger_, scope_timer_enabled_);
    +    1368             : 
    +    1369             :   // prepare the output
    +    1370             : 
    +    1371          17 :   std::vector<bool> segments;
    +    1372         137 :   for (size_t i = 0; i < waypoints.size() - 1; i++) {
    +    1373         120 :     segments.push_back(true);
    +    1374             :   }
    +    1375             : 
    +    1376          17 :   int waypoint_idx = 0;
    +    1377             : 
    +    1378          17 :   bool   is_safe       = true;
    +    1379          17 :   double max_deviation = 0;
    +    1380             : 
    +    1381        2588 :   for (size_t i = 0; i < trajectory.size() - 1; i++) {
    +    1382             : 
    +    1383             :     // the trajectory sample
    +    1384        2571 :     const vec3_t sample = vec3_t(trajectory[i].position_W[0], trajectory[i].position_W[1], trajectory[i].position_W[2]);
    +    1385             : 
    +    1386             :     // next sample
    +    1387        2571 :     const vec3_t next_sample = vec3_t(trajectory[i + 1].position_W[0], trajectory[i + 1].position_W[1], trajectory[i + 1].position_W[2]);
    +    1388             : 
    +    1389             :     // segment start
    +    1390        2571 :     const vec3_t segment_start = vec3_t(waypoints.at(waypoint_idx).coords[0], waypoints.at(waypoint_idx).coords[1], waypoints.at(waypoint_idx).coords[2]);
    +    1391             : 
    +    1392             :     // segment end
    +    1393             :     const vec3_t segment_end =
    +    1394        2571 :         vec3_t(waypoints.at(waypoint_idx + 1).coords[0], waypoints.at(waypoint_idx + 1).coords[1], waypoints.at(waypoint_idx + 1).coords[2]);
    +    1395             : 
    +    1396        2571 :     const double distance_from_segment = distFromSegment(sample, segment_start, segment_end);
    +    1397             : 
    +    1398        2571 :     const double segment_end_dist = distFromSegment(segment_end, sample, next_sample);
    +    1399             : 
    +    1400        2571 :     if (waypoint_idx > 0 || max_deviation_first_segment_ || int(waypoints.size()) <= 2) {
    +    1401             : 
    +    1402        2247 :       if (distance_from_segment > max_deviation) {
    +    1403         360 :         max_deviation = distance_from_segment;
    +    1404             :       }
    +    1405             : 
    +    1406        2247 :       if (distance_from_segment > trajectory_max_segment_deviation_) {
    +    1407         941 :         segments.at(waypoint_idx) = false;
    +    1408         941 :         is_safe                   = false;
    +    1409             :       }
    +    1410             :     }
    +    1411             : 
    +    1412        2571 :     if (segment_end_dist < 0.05 && waypoint_idx < (int(waypoints.size()) - 2)) {
    +    1413         103 :       waypoint_idx++;
    +    1414             :     }
    +    1415             :   }
    +    1416             : 
    +    1417          51 :   return std::tuple(is_safe, trajectory.size(), segments, max_deviation);
    +    1418             : }
    +    1419             : 
    +    1420             : //}
    +    1421             : 
    +    1422             : // | --------------------- minor routines --------------------- |
    +    1423             : 
    +    1424             : /* findTrajectoryAsync() //{ */
    +    1425             : 
    +    1426          16 : std::optional<eth_mav_msgs::EigenTrajectoryPoint::Vector> MrsTrajectoryGeneration::findTrajectoryAsync(
    +    1427             :     const std::vector<Waypoint_t>& waypoints, const std::optional<mrs_msgs::TrackerCommand>& initial_state, const double& sampling_dt,
    +    1428             :     const bool& relax_heading) {
    +    1429             : 
    +    1430          16 :   ROS_DEBUG("[TrajectoryGeneration]: starting the async planning task");
    +    1431             : 
    +    1432             :   future_trajectory_result_ =
    +    1433          16 :       std::async(std::launch::async, &MrsTrajectoryGeneration::findTrajectory, this, waypoints, initial_state, sampling_dt, relax_heading);
    +    1434             : 
    +    1435        9730 :   while (ros::ok() && future_trajectory_result_.wait_for(std::chrono::milliseconds(1)) != std::future_status::ready) {
    +    1436             : 
    +    1437        9719 :     if (overtime()) {
    +    1438           5 :       ROS_WARN("[TrajectoryGeneration]: async task planning timeout, breaking");
    +    1439           5 :       return {};
    +    1440             :     }
    +    1441             :   }
    +    1442             : 
    +    1443          11 :   ROS_DEBUG("[TrajectoryGeneration]: async planning task finished successfully");
    +    1444             : 
    +    1445          11 :   return future_trajectory_result_.get();
    +    1446             : }
    +    1447             : 
    +    1448             : //}
    +    1449             : 
    +    1450             : /* distFromSegment() //{ */
    +    1451             : 
    +    1452        5142 : double MrsTrajectoryGeneration::distFromSegment(const vec3_t& point, const vec3_t& seg1, const vec3_t& seg2) {
    +    1453             : 
    +    1454        5142 :   vec3_t segment_vector = seg2 - seg1;
    +    1455        5142 :   double segment_len    = segment_vector.norm();
    +    1456             : 
    +    1457        5142 :   vec3_t segment_vector_norm = segment_vector;
    +    1458        5142 :   segment_vector_norm.normalize();
    +    1459             : 
    +    1460        5142 :   double point_coordinate = segment_vector_norm.dot(point - seg1);
    +    1461             : 
    +    1462        5142 :   if (point_coordinate < 0) {
    +    1463          20 :     return (point - seg1).norm();
    +    1464        5122 :   } else if (point_coordinate > segment_len) {
    +    1465        2539 :     return (point - seg2).norm();
    +    1466             :   } else {
    +    1467             : 
    +    1468        2583 :     mat3_t segment_projector = segment_vector_norm * segment_vector_norm.transpose();
    +    1469        2583 :     vec3_t projection        = seg1 + segment_projector * (point - seg1);
    +    1470             : 
    +    1471        2583 :     return (point - projection).norm();
    +    1472             :   }
    +    1473             : }
    +    1474             : 
    +    1475             : //}
    +    1476             : 
    +    1477             : /* getTrajectoryReference() //{ */
    +    1478             : 
    +    1479           6 : mrs_msgs::TrajectoryReference MrsTrajectoryGeneration::getTrajectoryReference(const eth_mav_msgs::EigenTrajectoryPoint::Vector& trajectory,
    +    1480             :                                                                               const std::optional<mrs_msgs::TrackerCommand>&    initial_condition,
    +    1481             :                                                                               const double&                                     sampling_dt) {
    +    1482             : 
    +    1483           6 :   mrs_msgs::TrajectoryReference msg;
    +    1484             : 
    +    1485           6 :   if (initial_condition) {
    +    1486           4 :     msg.header.stamp = initial_condition->header.stamp;
    +    1487             :   } else {
    +    1488           2 :     msg.header.stamp = ros::Time::now();
    +    1489             :   }
    +    1490             : 
    +    1491           6 :   msg.header.frame_id = frame_id_;
    +    1492           6 :   msg.fly_now         = fly_now_;
    +    1493           6 :   msg.loop            = loop_;
    +    1494           6 :   msg.use_heading     = use_heading_;
    +    1495           6 :   msg.dt              = sampling_dt;
    +    1496             : 
    +    1497         855 :   for (size_t it = 0; it < trajectory.size(); it++) {
    +    1498             : 
    +    1499         849 :     mrs_msgs::Reference point;
    +    1500         849 :     point.heading    = 0;
    +    1501         849 :     point.position.x = trajectory[it].position_W[0];
    +    1502         849 :     point.position.y = trajectory[it].position_W[1];
    +    1503         849 :     point.position.z = trajectory[it].position_W[2];
    +    1504         849 :     point.heading    = trajectory[it].getYaw();
    +    1505             : 
    +    1506         849 :     msg.points.push_back(point);
    +    1507             :   }
    +    1508             : 
    +    1509           6 :   return msg;
    +    1510             : }
    +    1511             : 
    +    1512             : //}
    +    1513             : 
    +    1514             : /* interpolatePoint() //{ */
    +    1515             : 
    +    1516         898 : Waypoint_t MrsTrajectoryGeneration::interpolatePoint(const Waypoint_t& a, const Waypoint_t& b, const double& coeff) {
    +    1517             : 
    +    1518         898 :   Waypoint_t      out;
    +    1519         898 :   Eigen::Vector4d diff = b.coords - a.coords;
    +    1520             : 
    +    1521         898 :   out.coords[0] = a.coords[0] + coeff * diff[0];
    +    1522         898 :   out.coords[1] = a.coords[1] + coeff * diff[1];
    +    1523         898 :   out.coords[2] = a.coords[2] + coeff * diff[2];
    +    1524         898 :   out.coords[3] = radians::interp(a.coords[3], b.coords[3], coeff);
    +    1525             : 
    +    1526         898 :   out.stop_at = false;
    +    1527             : 
    +    1528        1796 :   return out;
    +    1529             : }
    +    1530             : 
    +    1531             : //}
    +    1532             : 
    +    1533             : /* checkNaN() //{ */
    +    1534             : 
    +    1535          24 : bool MrsTrajectoryGeneration::checkNaN(const Waypoint_t& a) {
    +    1536             : 
    +    1537          24 :   if (!std::isfinite(a.coords[0])) {
    +    1538           0 :     ROS_ERROR("NaN detected in variable \"a.coords[0]\"!!!");
    +    1539           0 :     return false;
    +    1540             :   }
    +    1541             : 
    +    1542          24 :   if (!std::isfinite(a.coords[1])) {
    +    1543           0 :     ROS_ERROR("NaN detected in variable \"a.coords[1]\"!!!");
    +    1544           0 :     return false;
    +    1545             :   }
    +    1546             : 
    +    1547          24 :   if (!std::isfinite(a.coords[2])) {
    +    1548           0 :     ROS_ERROR("NaN detected in variable \"a.coords[2]\"!!!");
    +    1549           0 :     return false;
    +    1550             :   }
    +    1551             : 
    +    1552          24 :   if (!std::isfinite(a.coords[3])) {
    +    1553           0 :     ROS_ERROR("NaN detected in variable \"a.coords[3]\"!!!");
    +    1554           0 :     return false;
    +    1555             :   }
    +    1556             : 
    +    1557          24 :   return true;
    +    1558             : }
    +    1559             : 
    +    1560             : //}
    +    1561             : 
    +    1562             : /* trajectorySrv() //{ */
    +    1563             : 
    +    1564           4 : bool MrsTrajectoryGeneration::trajectorySrv(const mrs_msgs::TrajectoryReference& msg) {
    +    1565             : 
    +    1566           8 :   mrs_msgs::TrajectoryReferenceSrv srv;
    +    1567           4 :   srv.request.trajectory = msg;
    +    1568             : 
    +    1569           4 :   bool res = service_client_trajectory_reference_.call(srv);
    +    1570             : 
    +    1571           4 :   if (res) {
    +    1572             : 
    +    1573           4 :     if (!srv.response.success) {
    +    1574           0 :       ROS_WARN("[TrajectoryGeneration]: service call for trajectory_reference returned: '%s'", srv.response.message.c_str());
    +    1575             :     }
    +    1576             : 
    +    1577           4 :     return srv.response.success;
    +    1578             : 
    +    1579             :   } else {
    +    1580             : 
    +    1581           0 :     ROS_ERROR("[TrajectoryGeneration]: service call for trajectory_reference failed!");
    +    1582             : 
    +    1583           0 :     return false;
    +    1584             :   }
    +    1585             : }
    +    1586             : 
    +    1587             : //}
    +    1588             : 
    +    1589             : /* transformTrackerCmd() //{ */
    +    1590             : 
    +    1591           6 : std::optional<mrs_msgs::Path> MrsTrajectoryGeneration::transformPath(const mrs_msgs::Path& path_in, const std::string& target_frame) {
    +    1592             : 
    +    1593             :   // if we transform to the current control frame, which is in fact the same frame as the tracker_cmd is in
    +    1594           6 :   if (target_frame == path_in.header.frame_id) {
    +    1595           6 :     return path_in;
    +    1596             :   }
    +    1597             : 
    +    1598             :   // find the transformation
    +    1599           0 :   auto tf = transformer_->getTransform(path_in.header.frame_id, target_frame, path_in.header.stamp);
    +    1600             : 
    +    1601           0 :   if (!tf) {
    +    1602           0 :     ROS_ERROR("[TrajectoryGeneration]: could not find transform from '%s' to '%s' in time %f", path_in.header.frame_id.c_str(), target_frame.c_str(),
    +    1603             :               path_in.header.stamp.toSec());
    +    1604           0 :     return {};
    +    1605             :   }
    +    1606             : 
    +    1607           0 :   mrs_msgs::Path path_out = path_in;
    +    1608             : 
    +    1609           0 :   path_out.header.stamp    = tf.value().header.stamp;
    +    1610           0 :   path_out.header.frame_id = transformer_->frame_to(tf.value());
    +    1611             : 
    +    1612           0 :   for (size_t i = 0; i < path_in.points.size(); i++) {
    +    1613             : 
    +    1614           0 :     mrs_msgs::ReferenceStamped waypoint;
    +    1615             : 
    +    1616           0 :     waypoint.header    = path_in.header;
    +    1617           0 :     waypoint.reference = path_in.points[i];
    +    1618             : 
    +    1619           0 :     if (auto ret = transformer_->transform(waypoint, tf.value())) {
    +    1620             : 
    +    1621           0 :       path_out.points[i] = ret.value().reference;
    +    1622             : 
    +    1623             :     } else {
    +    1624           0 :       return {};
    +    1625             :     }
    +    1626             :   }
    +    1627             : 
    +    1628           0 :   return path_out;
    +    1629             : }
    +    1630             : 
    +    1631             : //}
    +    1632             : 
    +    1633             : /* overtime() //{ */
    +    1634             : 
    +    1635        9774 : bool MrsTrajectoryGeneration::overtime(void) {
    +    1636             : 
    +    1637        9774 :   auto start_time_total   = mrs_lib::get_mutexed(mutex_start_time_total_, start_time_total_);
    +    1638        9774 :   auto max_execution_time = mrs_lib::get_mutexed(mutex_max_execution_time_, max_execution_time_);
    +    1639             : 
    +    1640        9774 :   double overtime = (ros::Time::now() - start_time_total).toSec();
    +    1641             : 
    +    1642        9774 :   if (overtime > (OVERTIME_SAFETY_FACTOR * max_execution_time - OVERTIME_SAFETY_OFFSET)) {
    +    1643          11 :     return true;
    +    1644             :   }
    +    1645             : 
    +    1646        9763 :   return false;
    +    1647             : }
    +    1648             : 
    +    1649             : //}
    +    1650             : 
    +    1651             : /* timeLeft() //{ */
    +    1652             : 
    +    1653          16 : double MrsTrajectoryGeneration::timeLeft(void) {
    +    1654             : 
    +    1655          16 :   auto start_time_total   = mrs_lib::get_mutexed(mutex_start_time_total_, start_time_total_);
    +    1656          16 :   auto max_execution_time = mrs_lib::get_mutexed(mutex_max_execution_time_, max_execution_time_);
    +    1657             : 
    +    1658          16 :   double current_execution_time = (ros::Time::now() - start_time_total).toSec();
    +    1659             : 
    +    1660          16 :   if (current_execution_time >= max_execution_time) {
    +    1661           0 :     return 0;
    +    1662             :   } else {
    +    1663          16 :     return max_execution_time - current_execution_time;
    +    1664             :   }
    +    1665             : }
    +    1666             : 
    +    1667             : //}
    +    1668             : 
    +    1669             : // | ------------------------ callbacks ----------------------- |
    +    1670             : 
    +    1671             : /* callbackPath() //{ */
    +    1672             : 
    +    1673           1 : void MrsTrajectoryGeneration::callbackPath(const mrs_msgs::Path::ConstPtr msg) {
    +    1674             : 
    +    1675           1 :   if (!is_initialized_) {
    +    1676           0 :     return;
    +    1677             :   }
    +    1678             : 
    +    1679             :   /* preconditions //{ */
    +    1680             : 
    +    1681           1 :   if (!sh_constraints_.hasMsg()) {
    +    1682           0 :     std::stringstream ss;
    +    1683           0 :     ss << "missing constraints";
    +    1684           0 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[TrajectoryGeneration]: " << ss.str());
    +    1685           0 :     return;
    +    1686             :   }
    +    1687             : 
    +    1688           1 :   if (!sh_control_manager_diag_.hasMsg()) {
    +    1689           0 :     std::stringstream ss;
    +    1690           0 :     ss << "missing control manager diagnostics";
    +    1691           0 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[TrajectoryGeneration]: " << ss.str());
    +    1692           0 :     return;
    +    1693             :   }
    +    1694             : 
    +    1695           1 :   if (!sh_uav_state_.hasMsg()) {
    +    1696           0 :     std::stringstream ss;
    +    1697           0 :     ss << "missing UAV state";
    +    1698           0 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[TrajectoryGeneration]: " << ss.str());
    +    1699           0 :     return;
    +    1700             :   }
    +    1701             : 
    +    1702             :   //}
    +    1703             : 
    +    1704             :   {
    +    1705           2 :     std::scoped_lock lock(mutex_start_time_total_);
    +    1706             : 
    +    1707           1 :     start_time_total_ = ros::Time::now();
    +    1708             :   }
    +    1709             : 
    +    1710           1 :   double path_time_offset = 0;
    +    1711             : 
    +    1712           1 :   if (msg->header.stamp != ros::Time(0)) {
    +    1713           0 :     path_time_offset = (msg->header.stamp - ros::Time::now()).toSec();
    +    1714             :   }
    +    1715             : 
    +    1716           1 :   if (path_time_offset > 1e-3) {
    +    1717             : 
    +    1718           0 :     std::scoped_lock lock(mutex_max_execution_time_);
    +    1719             : 
    +    1720           0 :     max_execution_time_ = std::min(FUTURIZATION_EXEC_TIME_FACTOR * path_time_offset, params_.max_execution_time);
    +    1721             : 
    +    1722           0 :     ROS_INFO("[TrajectoryGeneration]: setting the max execution time to %.3f s = %.1f * %.3f", max_execution_time_, FUTURIZATION_EXEC_TIME_FACTOR,
    +    1723             :              path_time_offset);
    +    1724             :   } else {
    +    1725             : 
    +    1726           1 :     std::scoped_lock lock(mutex_max_execution_time_, mutex_params_);
    +    1727             : 
    +    1728           1 :     max_execution_time_ = params_.max_execution_time;
    +    1729             :   }
    +    1730             : 
    +    1731           1 :   ROS_INFO("[TrajectoryGeneration]: got path from message");
    +    1732             : 
    +    1733           1 :   ph_original_path_.publish(msg);
    +    1734             : 
    +    1735           1 :   if (msg->points.empty()) {
    +    1736           0 :     std::stringstream ss;
    +    1737           0 :     ss << "received an empty message";
    +    1738           0 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[TrajectoryGeneration]: " << ss.str());
    +    1739           0 :     return;
    +    1740             :   }
    +    1741             : 
    +    1742           2 :   auto transformed_path = transformPath(*msg, "");
    +    1743             : 
    +    1744           1 :   if (!transformed_path) {
    +    1745           0 :     std::stringstream ss;
    +    1746           0 :     ss << "could not transform the path to the current control frame";
    +    1747           0 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[TrajectoryGeneration]: " << ss.str());
    +    1748           0 :     return;
    +    1749             :   }
    +    1750             : 
    +    1751           1 :   fly_now_                              = transformed_path->fly_now;
    +    1752           1 :   use_heading_                          = transformed_path->use_heading;
    +    1753           1 :   frame_id_                             = transformed_path->header.frame_id;
    +    1754           1 :   override_constraints_                 = transformed_path->override_constraints;
    +    1755           1 :   loop_                                 = transformed_path->loop;
    +    1756           1 :   override_max_velocity_horizontal_     = transformed_path->override_max_velocity_horizontal;
    +    1757           1 :   override_max_velocity_vertical_       = transformed_path->override_max_velocity_vertical;
    +    1758           1 :   override_max_acceleration_horizontal_ = transformed_path->override_max_acceleration_horizontal;
    +    1759           1 :   override_max_acceleration_vertical_   = transformed_path->override_max_acceleration_vertical;
    +    1760           1 :   override_max_jerk_horizontal_         = transformed_path->override_max_jerk_horizontal;
    +    1761           1 :   override_max_jerk_vertical_           = transformed_path->override_max_jerk_horizontal;
    +    1762           1 :   stop_at_waypoints_                    = transformed_path->stop_at_waypoints;
    +    1763             : 
    +    1764           1 :   auto params = mrs_lib::get_mutexed(mutex_params_, params_);
    +    1765             : 
    +    1766           1 :   if (transformed_path->max_execution_time > 0) {
    +    1767             : 
    +    1768           0 :     std::scoped_lock lock(mutex_max_execution_time_);
    +    1769             : 
    +    1770           0 :     max_execution_time_ = transformed_path->max_execution_time;
    +    1771             : 
    +    1772             :   } else {
    +    1773             : 
    +    1774           1 :     std::scoped_lock lock(mutex_max_execution_time_);
    +    1775             : 
    +    1776           1 :     max_execution_time_ = params.max_execution_time;
    +    1777             :   }
    +    1778             : 
    +    1779           1 :   if (transformed_path->max_deviation_from_path > 0) {
    +    1780           0 :     trajectory_max_segment_deviation_ = transformed_path->max_deviation_from_path;
    +    1781             :   } else {
    +    1782           1 :     trajectory_max_segment_deviation_ = params.max_deviation;
    +    1783             :   }
    +    1784             : 
    +    1785           1 :   dont_prepend_initial_condition_ = transformed_path->dont_prepend_current_state;
    +    1786             : 
    +    1787           1 :   std::vector<Waypoint_t> waypoints;
    +    1788             : 
    +    1789           5 :   for (size_t i = 0; i < transformed_path->points.size(); i++) {
    +    1790             : 
    +    1791           4 :     double x       = transformed_path->points[i].position.x;
    +    1792           4 :     double y       = transformed_path->points[i].position.y;
    +    1793           4 :     double z       = transformed_path->points[i].position.z;
    +    1794           4 :     double heading = transformed_path->points[i].heading;
    +    1795             : 
    +    1796           4 :     Waypoint_t wp;
    +    1797           4 :     wp.coords  = Eigen::Vector4d(x, y, z, heading);
    +    1798           4 :     wp.stop_at = stop_at_waypoints_;
    +    1799             : 
    +    1800           4 :     if (!checkNaN(wp)) {
    +    1801           0 :       ROS_ERROR("[TrajectoryGeneration]: NaN detected in waypoint #%d", int(i));
    +    1802           0 :       return;
    +    1803             :     }
    +    1804             : 
    +    1805           4 :     waypoints.push_back(wp);
    +    1806             :   }
    +    1807             : 
    +    1808           1 :   if (loop_) {
    +    1809           0 :     waypoints.push_back(waypoints[0]);
    +    1810             :   }
    +    1811             : 
    +    1812           1 :   bool                          success = false;
    +    1813           2 :   std::string                   message;
    +    1814           2 :   mrs_msgs::TrajectoryReference trajectory;
    +    1815             : 
    +    1816           2 :   for (int i = 0; i < _n_attempts_; i++) {
    +    1817             : 
    +    1818             :     // the last iteration and the fallback sampling is enabled
    +    1819           2 :     bool fallback_sampling = (_n_attempts_ > 1) && (i == (_n_attempts_ - 1)) && _fallback_sampling_enabled_;
    +    1820             : 
    +    1821           2 :     std::tie(success, message, trajectory) = optimize(waypoints, transformed_path->header, fallback_sampling, transformed_path->relax_heading);
    +    1822             : 
    +    1823           2 :     if (success) {
    +    1824           1 :       break;
    +    1825             :     } else {
    +    1826           1 :       if (i < _n_attempts_) {
    +    1827           1 :         ROS_WARN("[TrajectoryGeneration]: failed to calculate a feasible trajectory, trying again with different initial conditions!");
    +    1828             :       } else {
    +    1829           0 :         ROS_WARN("[TrajectoryGeneration]: failed to calculate a feasible trajectory");
    +    1830             :       }
    +    1831             :     }
    +    1832             :   }
    +    1833             : 
    +    1834           1 :   double total_time = (ros::Time::now() - start_time_total_).toSec();
    +    1835             : 
    +    1836           1 :   auto max_execution_time = mrs_lib::get_mutexed(mutex_max_execution_time_, max_execution_time_);
    +    1837             : 
    +    1838           1 :   if (total_time > max_execution_time) {
    +    1839           0 :     ROS_ERROR("[TrajectoryGeneration]: trajectory ready, took %.3f s in total (exceeding maxtime %.3f s by %.3f s)", total_time, max_execution_time,
    +    1840             :               total_time - max_execution_time);
    +    1841             :   } else {
    +    1842           1 :     ROS_INFO("[TrajectoryGeneration]: trajectory ready, took %.3f s in total (out of %.3f)", total_time, max_execution_time);
    +    1843             :   }
    +    1844             : 
    +    1845           1 :   trajectory.input_id = transformed_path->input_id;
    +    1846             : 
    +    1847           1 :   if (success) {
    +    1848             : 
    +    1849           1 :     bool published = trajectorySrv(trajectory);
    +    1850             : 
    +    1851           1 :     if (published) {
    +    1852             : 
    +    1853           1 :       ROS_INFO("[TrajectoryGeneration]: trajectory successfully published");
    +    1854             : 
    +    1855             :     } else {
    +    1856             : 
    +    1857           0 :       ROS_ERROR("[TrajectoryGeneration]: could not publish the trajectory");
    +    1858             :     }
    +    1859             : 
    +    1860             :   } else {
    +    1861             : 
    +    1862           0 :     ROS_ERROR("[TrajectoryGeneration]: failed to calculate a feasible trajectory, no publishing a result");
    +    1863             :   }
    +    1864             : }
    +    1865             : 
    +    1866             : //}
    +    1867             : 
    +    1868             : /* callbackPathSrv() //{ */
    +    1869             : 
    +    1870           3 : bool MrsTrajectoryGeneration::callbackPathSrv(mrs_msgs::PathSrv::Request& req, mrs_msgs::PathSrv::Response& res) {
    +    1871             : 
    +    1872           3 :   if (!is_initialized_) {
    +    1873           0 :     return false;
    +    1874             :   }
    +    1875             : 
    +    1876             :   /* preconditions //{ */
    +    1877             : 
    +    1878           3 :   if (!sh_constraints_.hasMsg()) {
    +    1879           0 :     std::stringstream ss;
    +    1880           0 :     ss << "missing constraints";
    +    1881           0 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[TrajectoryGeneration]: " << ss.str());
    +    1882             : 
    +    1883           0 :     res.message = ss.str();
    +    1884           0 :     res.success = false;
    +    1885           0 :     return true;
    +    1886             :   }
    +    1887             : 
    +    1888           3 :   if (!sh_control_manager_diag_.hasMsg()) {
    +    1889           0 :     std::stringstream ss;
    +    1890           0 :     ss << "missing control manager diagnostics";
    +    1891           0 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[TrajectoryGeneration]: " << ss.str());
    +    1892             : 
    +    1893           0 :     res.message = ss.str();
    +    1894           0 :     res.success = false;
    +    1895           0 :     return true;
    +    1896             :   }
    +    1897             : 
    +    1898           3 :   if (!sh_uav_state_.hasMsg()) {
    +    1899           0 :     std::stringstream ss;
    +    1900           0 :     ss << "missing UAV state";
    +    1901           0 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[TrajectoryGeneration]: " << ss.str());
    +    1902             : 
    +    1903           0 :     res.message = ss.str();
    +    1904           0 :     res.success = false;
    +    1905           0 :     return true;
    +    1906             :   }
    +    1907             : 
    +    1908             :   //}
    +    1909             : 
    +    1910             :   {
    +    1911           6 :     std::scoped_lock lock(mutex_start_time_total_);
    +    1912             : 
    +    1913           3 :     start_time_total_ = ros::Time::now();
    +    1914             :   }
    +    1915             : 
    +    1916           3 :   double path_time_offset = 0;
    +    1917             : 
    +    1918           3 :   if (req.path.header.stamp != ros::Time(0)) {
    +    1919           0 :     path_time_offset = (req.path.header.stamp - ros::Time::now()).toSec();
    +    1920             :   }
    +    1921             : 
    +    1922           3 :   if (path_time_offset > 1e-3) {
    +    1923             : 
    +    1924           0 :     std::scoped_lock lock(mutex_max_execution_time_);
    +    1925             : 
    +    1926           0 :     max_execution_time_ = std::min(FUTURIZATION_EXEC_TIME_FACTOR * path_time_offset, params_.max_execution_time);
    +    1927             : 
    +    1928           0 :     ROS_INFO("[TrajectoryGeneration]: setting the max execution time to %.3f s = %.1f * %.3f", max_execution_time_, FUTURIZATION_EXEC_TIME_FACTOR,
    +    1929             :              path_time_offset);
    +    1930             :   } else {
    +    1931             : 
    +    1932           3 :     std::scoped_lock lock(mutex_max_execution_time_, mutex_params_);
    +    1933             : 
    +    1934           3 :     max_execution_time_ = params_.max_execution_time;
    +    1935             :   }
    +    1936             : 
    +    1937           3 :   ROS_INFO("[TrajectoryGeneration]: got path from service");
    +    1938             : 
    +    1939           3 :   ph_original_path_.publish(req.path);
    +    1940             : 
    +    1941           3 :   if (req.path.points.empty()) {
    +    1942           0 :     std::stringstream ss;
    +    1943           0 :     ss << "received an empty message";
    +    1944           0 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[TrajectoryGeneration]: " << ss.str());
    +    1945             : 
    +    1946           0 :     res.message = ss.str();
    +    1947           0 :     res.success = false;
    +    1948           0 :     return true;
    +    1949             :   }
    +    1950             : 
    +    1951           9 :   auto transformed_path = transformPath(req.path, "");
    +    1952             : 
    +    1953           3 :   if (!transformed_path) {
    +    1954           0 :     std::stringstream ss;
    +    1955           0 :     ss << "could not transform the path to the current control frame";
    +    1956           0 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[TrajectoryGeneration]: " << ss.str());
    +    1957             : 
    +    1958           0 :     res.message = ss.str();
    +    1959           0 :     res.success = false;
    +    1960           0 :     return true;
    +    1961             :   }
    +    1962             : 
    +    1963           3 :   fly_now_                              = transformed_path->fly_now;
    +    1964           3 :   use_heading_                          = transformed_path->use_heading;
    +    1965           3 :   frame_id_                             = transformed_path->header.frame_id;
    +    1966           3 :   override_constraints_                 = transformed_path->override_constraints;
    +    1967           3 :   loop_                                 = transformed_path->loop;
    +    1968           3 :   override_max_velocity_horizontal_     = transformed_path->override_max_velocity_horizontal;
    +    1969           3 :   override_max_velocity_vertical_       = transformed_path->override_max_velocity_vertical;
    +    1970           3 :   override_max_acceleration_horizontal_ = transformed_path->override_max_acceleration_horizontal;
    +    1971           3 :   override_max_acceleration_vertical_   = transformed_path->override_max_acceleration_vertical;
    +    1972           3 :   override_max_jerk_horizontal_         = transformed_path->override_max_jerk_horizontal;
    +    1973           3 :   override_max_jerk_vertical_           = transformed_path->override_max_jerk_horizontal;
    +    1974           3 :   stop_at_waypoints_                    = transformed_path->stop_at_waypoints;
    +    1975             : 
    +    1976           6 :   auto params = mrs_lib::get_mutexed(mutex_params_, params_);
    +    1977             : 
    +    1978           3 :   if (transformed_path->max_execution_time > 0) {
    +    1979             : 
    +    1980           0 :     std::scoped_lock lock(mutex_max_execution_time_);
    +    1981             : 
    +    1982           0 :     max_execution_time_ = transformed_path->max_execution_time;
    +    1983             : 
    +    1984             :   } else {
    +    1985             : 
    +    1986           3 :     std::scoped_lock lock(mutex_max_execution_time_);
    +    1987             : 
    +    1988           3 :     max_execution_time_ = params.max_execution_time;
    +    1989             :   }
    +    1990             : 
    +    1991           3 :   if (transformed_path->max_deviation_from_path > 0) {
    +    1992           0 :     trajectory_max_segment_deviation_ = transformed_path->max_deviation_from_path;
    +    1993             :   } else {
    +    1994           3 :     trajectory_max_segment_deviation_ = params.max_deviation;
    +    1995             :   }
    +    1996             : 
    +    1997           3 :   dont_prepend_initial_condition_ = transformed_path->dont_prepend_current_state;
    +    1998             : 
    +    1999           6 :   std::vector<Waypoint_t> waypoints;
    +    2000             : 
    +    2001          15 :   for (size_t i = 0; i < req.path.points.size(); i++) {
    +    2002             : 
    +    2003          12 :     double x       = transformed_path->points[i].position.x;
    +    2004          12 :     double y       = transformed_path->points[i].position.y;
    +    2005          12 :     double z       = transformed_path->points[i].position.z;
    +    2006          12 :     double heading = transformed_path->points[i].heading;
    +    2007             : 
    +    2008          12 :     Waypoint_t wp;
    +    2009          12 :     wp.coords  = Eigen::Vector4d(x, y, z, heading);
    +    2010          12 :     wp.stop_at = stop_at_waypoints_;
    +    2011             : 
    +    2012          12 :     if (!checkNaN(wp)) {
    +    2013           0 :       ROS_ERROR("[TrajectoryGeneration]: NaN detected in waypoint #%d", int(i));
    +    2014           0 :       res.success = false;
    +    2015           0 :       res.message = "invalid path";
    +    2016           0 :       return true;
    +    2017             :     }
    +    2018             : 
    +    2019          12 :     waypoints.push_back(wp);
    +    2020             :   }
    +    2021             : 
    +    2022           3 :   if (loop_) {
    +    2023           0 :     waypoints.push_back(waypoints[0]);
    +    2024             :   }
    +    2025             : 
    +    2026           3 :   bool                          success = false;
    +    2027           6 :   std::string                   message;
    +    2028           3 :   mrs_msgs::TrajectoryReference trajectory;
    +    2029             : 
    +    2030           5 :   for (int i = 0; i < _n_attempts_; i++) {
    +    2031             : 
    +    2032             :     // the last iteration and the fallback sampling is enabled
    +    2033           5 :     bool fallback_sampling = (_n_attempts_ > 1) && (i == (_n_attempts_ - 1)) && _fallback_sampling_enabled_;
    +    2034             : 
    +    2035           5 :     std::tie(success, message, trajectory) = optimize(waypoints, transformed_path->header, fallback_sampling, transformed_path->relax_heading);
    +    2036             : 
    +    2037           5 :     if (success) {
    +    2038           3 :       break;
    +    2039             :     } else {
    +    2040           2 :       if (i < _n_attempts_) {
    +    2041           2 :         ROS_WARN("[TrajectoryGeneration]: failed to calculate a feasible trajectory, trying again with different initial conditions!");
    +    2042             :       } else {
    +    2043           0 :         ROS_WARN("[TrajectoryGeneration]: failed to calculate a feasible trajectory");
    +    2044             :       }
    +    2045             :     }
    +    2046             :   }
    +    2047             : 
    +    2048           3 :   double total_time = (ros::Time::now() - start_time_total_).toSec();
    +    2049             : 
    +    2050           3 :   auto max_execution_time = mrs_lib::get_mutexed(mutex_max_execution_time_, max_execution_time_);
    +    2051             : 
    +    2052           3 :   if (total_time > max_execution_time) {
    +    2053           1 :     ROS_ERROR("[TrajectoryGeneration]: trajectory ready, took %.3f s in total (exceeding maxtime %.3f s by %.3f s)", total_time, max_execution_time,
    +    2054             :               total_time - max_execution_time);
    +    2055             :   } else {
    +    2056           2 :     ROS_INFO("[TrajectoryGeneration]: trajectory ready, took %.3f s in total (out of %.3f)", total_time, max_execution_time);
    +    2057             :   }
    +    2058             : 
    +    2059           3 :   trajectory.input_id = transformed_path->input_id;
    +    2060             : 
    +    2061           3 :   if (success) {
    +    2062             : 
    +    2063           3 :     bool published = trajectorySrv(trajectory);
    +    2064             : 
    +    2065           3 :     if (published) {
    +    2066             : 
    +    2067           3 :       res.success = success;
    +    2068           3 :       res.message = message;
    +    2069             : 
    +    2070             :     } else {
    +    2071             : 
    +    2072           0 :       std::stringstream ss;
    +    2073           0 :       ss << "could not publish the trajectory";
    +    2074             : 
    +    2075           0 :       res.success = false;
    +    2076           0 :       res.message = ss.str();
    +    2077             : 
    +    2078           0 :       ROS_ERROR_STREAM("[TrajectoryGeneration]: " << ss.str());
    +    2079             :     }
    +    2080             : 
    +    2081             :   } else {
    +    2082             : 
    +    2083           0 :     ROS_ERROR("[TrajectoryGeneration]: failed to calculate a feasible trajectory, not publishing a result");
    +    2084             : 
    +    2085           0 :     res.success = success;
    +    2086           0 :     res.message = message;
    +    2087             :   }
    +    2088             : 
    +    2089           3 :   return true;
    +    2090             : }
    +    2091             : 
    +    2092             : //}
    +    2093             : 
    +    2094             : /* callbackGetPathSrv() //{ */
    +    2095             : 
    +    2096           2 : bool MrsTrajectoryGeneration::callbackGetPathSrv(mrs_msgs::GetPathSrv::Request& req, mrs_msgs::GetPathSrv::Response& res) {
    +    2097             : 
    +    2098           2 :   if (!is_initialized_) {
    +    2099           0 :     return false;
    +    2100             :   }
    +    2101             : 
    +    2102             :   /* preconditions //{ */
    +    2103             : 
    +    2104           2 :   if (!sh_constraints_.hasMsg()) {
    +    2105           0 :     std::stringstream ss;
    +    2106           0 :     ss << "missing constraints";
    +    2107           0 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[TrajectoryGeneration]: " << ss.str());
    +    2108             : 
    +    2109           0 :     res.message = ss.str();
    +    2110           0 :     res.success = false;
    +    2111           0 :     return true;
    +    2112             :   }
    +    2113             : 
    +    2114           2 :   if (!sh_control_manager_diag_.hasMsg()) {
    +    2115           0 :     std::stringstream ss;
    +    2116           0 :     ss << "missing control manager diagnostics";
    +    2117           0 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[TrajectoryGeneration]: " << ss.str());
    +    2118             : 
    +    2119           0 :     res.message = ss.str();
    +    2120           0 :     res.success = false;
    +    2121           0 :     return true;
    +    2122             :   }
    +    2123             : 
    +    2124           2 :   if (!sh_uav_state_.hasMsg()) {
    +    2125           0 :     std::stringstream ss;
    +    2126           0 :     ss << "missing UAV state";
    +    2127           0 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[TrajectoryGeneration]: " << ss.str());
    +    2128             : 
    +    2129           0 :     res.message = ss.str();
    +    2130           0 :     res.success = false;
    +    2131           0 :     return true;
    +    2132             :   }
    +    2133             : 
    +    2134             :   //}
    +    2135             : 
    +    2136             :   {
    +    2137           4 :     std::scoped_lock lock(mutex_start_time_total_);
    +    2138             : 
    +    2139           2 :     start_time_total_ = ros::Time::now();
    +    2140             :   }
    +    2141             : 
    +    2142           2 :   double path_time_offset = 0;
    +    2143             : 
    +    2144           2 :   if (req.path.header.stamp != ros::Time(0)) {
    +    2145           0 :     path_time_offset = (req.path.header.stamp - ros::Time::now()).toSec();
    +    2146             :   }
    +    2147             : 
    +    2148           2 :   if (path_time_offset > 1e-3) {
    +    2149             : 
    +    2150           0 :     std::scoped_lock lock(mutex_max_execution_time_);
    +    2151             : 
    +    2152           0 :     max_execution_time_ = FUTURIZATION_EXEC_TIME_FACTOR * path_time_offset;
    +    2153             : 
    +    2154           0 :     ROS_INFO("[TrajectoryGeneration]: setting the max execution time to %.3f s = %.1f * %.3f", max_execution_time_, FUTURIZATION_EXEC_TIME_FACTOR,
    +    2155             :              path_time_offset);
    +    2156             :   } else {
    +    2157             : 
    +    2158           2 :     std::scoped_lock lock(mutex_max_execution_time_, mutex_params_);
    +    2159             : 
    +    2160           2 :     max_execution_time_ = params_.max_execution_time;
    +    2161             :   }
    +    2162             : 
    +    2163           2 :   ROS_INFO("[TrajectoryGeneration]: got path from service");
    +    2164             : 
    +    2165           2 :   ph_original_path_.publish(req.path);
    +    2166             : 
    +    2167           2 :   if (req.path.points.empty()) {
    +    2168           0 :     std::stringstream ss;
    +    2169           0 :     ss << "received an empty message";
    +    2170           0 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[TrajectoryGeneration]: " << ss.str());
    +    2171             : 
    +    2172           0 :     res.message = ss.str();
    +    2173           0 :     res.success = false;
    +    2174           0 :     return true;
    +    2175             :   }
    +    2176             : 
    +    2177           6 :   auto transformed_path = transformPath(req.path, "");
    +    2178             : 
    +    2179           2 :   if (!transformed_path) {
    +    2180           0 :     std::stringstream ss;
    +    2181           0 :     ss << "could not transform the path to the current control frame";
    +    2182           0 :     ROS_ERROR_STREAM_THROTTLE(1.0, "[TrajectoryGeneration]: " << ss.str());
    +    2183             : 
    +    2184           0 :     res.message = ss.str();
    +    2185           0 :     res.success = false;
    +    2186           0 :     return true;
    +    2187             :   }
    +    2188             : 
    +    2189           2 :   fly_now_                              = transformed_path->fly_now;
    +    2190           2 :   use_heading_                          = transformed_path->use_heading;
    +    2191           2 :   frame_id_                             = transformed_path->header.frame_id;
    +    2192           2 :   override_constraints_                 = transformed_path->override_constraints;
    +    2193           2 :   loop_                                 = transformed_path->loop;
    +    2194           2 :   override_max_velocity_horizontal_     = transformed_path->override_max_velocity_horizontal;
    +    2195           2 :   override_max_velocity_vertical_       = transformed_path->override_max_velocity_vertical;
    +    2196           2 :   override_max_acceleration_horizontal_ = transformed_path->override_max_acceleration_horizontal;
    +    2197           2 :   override_max_acceleration_vertical_   = transformed_path->override_max_acceleration_vertical;
    +    2198           2 :   override_max_jerk_horizontal_         = transformed_path->override_max_jerk_horizontal;
    +    2199           2 :   override_max_jerk_vertical_           = transformed_path->override_max_jerk_horizontal;
    +    2200           2 :   stop_at_waypoints_                    = transformed_path->stop_at_waypoints;
    +    2201             : 
    +    2202           4 :   auto params = mrs_lib::get_mutexed(mutex_params_, params_);
    +    2203             : 
    +    2204           2 :   if (transformed_path->max_execution_time > 0) {
    +    2205             : 
    +    2206           0 :     std::scoped_lock lock(mutex_max_execution_time_);
    +    2207             : 
    +    2208           0 :     max_execution_time_ = transformed_path->max_execution_time;
    +    2209             : 
    +    2210             :   } else {
    +    2211             : 
    +    2212           2 :     std::scoped_lock lock(mutex_max_execution_time_);
    +    2213             : 
    +    2214           2 :     max_execution_time_ = params.max_execution_time;
    +    2215             :   }
    +    2216             : 
    +    2217           2 :   if (transformed_path->max_deviation_from_path > 0) {
    +    2218           0 :     trajectory_max_segment_deviation_ = transformed_path->max_deviation_from_path;
    +    2219             :   } else {
    +    2220           2 :     trajectory_max_segment_deviation_ = params.max_deviation;
    +    2221             :   }
    +    2222             : 
    +    2223           2 :   dont_prepend_initial_condition_ = transformed_path->dont_prepend_current_state;
    +    2224             : 
    +    2225           4 :   std::vector<Waypoint_t> waypoints;
    +    2226             : 
    +    2227          10 :   for (size_t i = 0; i < transformed_path->points.size(); i++) {
    +    2228             : 
    +    2229           8 :     double x       = transformed_path->points[i].position.x;
    +    2230           8 :     double y       = transformed_path->points[i].position.y;
    +    2231           8 :     double z       = transformed_path->points[i].position.z;
    +    2232           8 :     double heading = transformed_path->points[i].heading;
    +    2233             : 
    +    2234           8 :     Waypoint_t wp;
    +    2235           8 :     wp.coords  = Eigen::Vector4d(x, y, z, heading);
    +    2236           8 :     wp.stop_at = stop_at_waypoints_;
    +    2237             : 
    +    2238           8 :     if (!checkNaN(wp)) {
    +    2239           0 :       ROS_ERROR("[TrajectoryGeneration]: NaN detected in waypoint #%d", int(i));
    +    2240           0 :       res.success = false;
    +    2241           0 :       res.message = "invalid path";
    +    2242           0 :       return true;
    +    2243             :     }
    +    2244             : 
    +    2245           8 :     waypoints.push_back(wp);
    +    2246             :   }
    +    2247             : 
    +    2248           2 :   if (loop_) {
    +    2249           0 :     waypoints.push_back(waypoints[0]);
    +    2250             :   }
    +    2251             : 
    +    2252           2 :   bool                          success = false;
    +    2253           4 :   std::string                   message;
    +    2254           2 :   mrs_msgs::TrajectoryReference trajectory;
    +    2255             : 
    +    2256           4 :   for (int i = 0; i < _n_attempts_; i++) {
    +    2257             : 
    +    2258             :     // the last iteration and the fallback sampling is enabled
    +    2259           4 :     bool fallback_sampling = (_n_attempts_ > 1) && (i == (_n_attempts_ - 1)) && _fallback_sampling_enabled_;
    +    2260             : 
    +    2261           4 :     std::tie(success, message, trajectory) = optimize(waypoints, transformed_path->header, fallback_sampling, transformed_path->relax_heading);
    +    2262             : 
    +    2263           4 :     if (success) {
    +    2264           2 :       break;
    +    2265             :     } else {
    +    2266           2 :       if (i < _n_attempts_) {
    +    2267           2 :         ROS_WARN("[TrajectoryGeneration]: failed to calculate a feasible trajectory, trying again with different initial conditions!");
    +    2268             :       } else {
    +    2269           0 :         ROS_WARN("[TrajectoryGeneration]: failed to calculate a feasible trajectory");
    +    2270             :       }
    +    2271             :     }
    +    2272             :   }
    +    2273             : 
    +    2274           2 :   double total_time = (ros::Time::now() - start_time_total_).toSec();
    +    2275             : 
    +    2276           2 :   auto max_execution_time = mrs_lib::get_mutexed(mutex_max_execution_time_, max_execution_time_);
    +    2277             : 
    +    2278           2 :   if (total_time > max_execution_time) {
    +    2279           0 :     ROS_ERROR("[TrajectoryGeneration]: trajectory ready, took %.3f s in total (exceeding maxtime %.3f s by %.3f s)", total_time, max_execution_time,
    +    2280             :               total_time - max_execution_time);
    +    2281             :   } else {
    +    2282           2 :     ROS_INFO("[TrajectoryGeneration]: trajectory ready, took %.3f s in total (out of %.3f)", total_time, max_execution_time);
    +    2283             :   }
    +    2284             : 
    +    2285           2 :   if (success) {
    +    2286             : 
    +    2287           6 :     std::optional<geometry_msgs::TransformStamped> tf_traj_state = transformer_->getTransform("", req.path.header.frame_id, ros::Time::now());
    +    2288             : 
    +    2289           4 :     std::stringstream ss;
    +    2290             : 
    +    2291           2 :     if (!tf_traj_state) {
    +    2292           0 :       ss << "could not create TF transformer for the trajectory to the requested frame";
    +    2293           0 :       ROS_WARN_STREAM_THROTTLE(1.0, "[TrajectoryGeneration]: " << ss.str());
    +    2294           0 :       res.success = false;
    +    2295           0 :       res.message = ss.str();
    +    2296             :     }
    +    2297             : 
    +    2298           2 :     trajectory.header.frame_id = transformer_->frame_to(*tf_traj_state);
    +    2299             : 
    +    2300         271 :     for (unsigned long i = 0; i < trajectory.points.size(); i++) {
    +    2301             : 
    +    2302         538 :       mrs_msgs::ReferenceStamped trajectory_point;
    +    2303         269 :       trajectory_point.header    = trajectory.header;
    +    2304         269 :       trajectory_point.reference = trajectory.points[i];
    +    2305             : 
    +    2306         538 :       auto ret = transformer_->transform(trajectory_point, *tf_traj_state);
    +    2307             : 
    +    2308         269 :       if (!ret) {
    +    2309             : 
    +    2310           0 :         ss << "trajectory cannnot be transformed to the requested frame";
    +    2311           0 :         ROS_WARN_STREAM_THROTTLE(1.0, "[TrajectoryGeneration]: " << ss.str());
    +    2312           0 :         res.success = false;
    +    2313           0 :         res.message = ss.str();
    +    2314             : 
    +    2315             :       } else {
    +    2316             : 
    +    2317             :         // transform the points in the trajectory to the current frame
    +    2318         269 :         trajectory.points[i] = ret.value().reference;
    +    2319             :       }
    +    2320             :     }
    +    2321             : 
    +    2322           2 :     res.trajectory = trajectory;
    +    2323           2 :     res.success    = success;
    +    2324           2 :     res.message    = message;
    +    2325             : 
    +    2326             :   } else {
    +    2327             : 
    +    2328           0 :     ROS_ERROR("[TrajectoryGeneration]: failed to calculate a feasible trajectory");
    +    2329             : 
    +    2330           0 :     res.success = success;
    +    2331           0 :     res.message = message;
    +    2332             :   }
    +    2333             : 
    +    2334           2 :   return true;
    +    2335             : }
    +    2336             : 
    +    2337             : //}
    +    2338             : 
    +    2339             : /* callbackUavState() //{ */
    +    2340             : 
    +    2341      155103 : void MrsTrajectoryGeneration::callbackUavState(const mrs_msgs::UavState::ConstPtr msg) {
    +    2342             : 
    +    2343      155103 :   if (!is_initialized_) {
    +    2344           0 :     return;
    +    2345             :   }
    +    2346             : 
    +    2347      155103 :   ROS_INFO_ONCE("[TrajectoryGeneration]: getting uav state");
    +    2348             : 
    +    2349      155103 :   transformer_->setDefaultFrame(msg->header.frame_id);
    +    2350             : }
    +    2351             : 
    +    2352             : //}
    +    2353             : 
    +    2354             : /* //{ callbackDrs() */
    +    2355             : 
    +    2356          91 : void MrsTrajectoryGeneration::callbackDrs(mrs_uav_trajectory_generation::drsConfig& params, [[maybe_unused]] uint32_t level) {
    +    2357             : 
    +    2358          91 :   mrs_lib::set_mutexed(mutex_params_, params, params_);
    +    2359             : 
    +    2360             :   {
    +    2361          91 :     std::scoped_lock lock(mutex_max_execution_time_);
    +    2362             : 
    +    2363          91 :     max_execution_time_ = params.max_execution_time;
    +    2364             :   }
    +    2365             : 
    +    2366          91 :   ROS_INFO("[TrajectoryGeneration]: DRS updated");
    +    2367          91 : }
    +    2368             : 
    +    2369             : //}
    +    2370             : 
    +    2371             : }  // namespace mrs_uav_trajectory_generation
    +    2372             : 
    +    2373             : #include <pluginlib/class_list_macros.h>
    +    2374          91 : PLUGINLIB_EXPORT_CLASS(mrs_uav_trajectory_generation::MrsTrajectoryGeneration, nodelet::Nodelet);
    +
    +
    +
    + + + + +
    Generated by: LCOV version 1.14
    +
    + + + diff --git a/mrs_uav_trajectory_generation/src/mrs_trajectory_generation.cpp.gcov.overview.html b/mrs_uav_trajectory_generation/src/mrs_trajectory_generation.cpp.gcov.overview.html new file mode 100644 index 0000000000..a67dfe05d8 --- /dev/null +++ b/mrs_uav_trajectory_generation/src/mrs_trajectory_generation.cpp.gcov.overview.html @@ -0,0 +1,614 @@ + + + + + + LCOV - MRS UAV System - Test coverage report - mrs_uav_trajectory_generation/src/mrs_trajectory_generation.cpp + + + + + + + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + overview + + +
    + Top

    + Overview +
    + + diff --git a/mrs_uav_trajectory_generation/src/mrs_trajectory_generation.cpp.gcov.png b/mrs_uav_trajectory_generation/src/mrs_trajectory_generation.cpp.gcov.png new file mode 100644 index 0000000000000000000000000000000000000000..73cac87ec43067f267f79af3ff7695f14dc51d64 GIT binary patch literal 7277 zcmV-z9FpUSP)9`~RB zZll@{K8N(tLJ5EkPz>0_YUB|&CE$G^>0`Lw!(#;_0n}rxaF>%d@M!3aW~^lVoghx@3C21|73ZsQbk;@!VhtWdXz@xw<1E|JW<5ba(@OY4e zh;f7o4H(CviWsMz$7vwmeX;(*+1A}|z)?Kjr{>)DfEp&%q)!>bv19lM-9|ljY)`ox zRsuR!?k&J6O2GtJ<59+F?R6VaFX$w_md-@7E%m-1*1v-CcztBlhXou?Iao8S6~e5b z9NwLMNk89cZ^YPyNw*OS(xYuKJu~Z;4v~eO5+|%-%Jmv zCw(8=m4e3sh=0_pQ#_I;9|9CMhBw~Z6H&K&{fMeMXmCUx8PdvL-{oHS+Pwo~Ep6FV zdshRG(-em$+7oAi!)noIQsP**03&$z7rCnefEj2Fko;8x5F{u87Gfv?9|U87!m-O|cMG%YP(eQI_?(`yoa{70f#jCN-my$=Ub=R1bG z&g_!V+bAGIhVJ=V`P)(@feq4beEFhhw$Dxco~%fEePUX1w$CP zC(Y1a)Bad6QZBSm}uVz*~5fTJ*iT1nz}wAU)N{ z6oAJ!XH?QU9?5b*q-5a-tusU+<98kFjP{>QaYb`+uE0nL+1_!WW73jN7+VUG0Gk*s zq&?5rnPYfS$6Gq1BF~y8CS~|8%Uqr>mD8v zOH=-JAI3+qAn6h)CM_UG8XumA-xI#+u3ifx#)+ajzI+f4lYPx)7+%HWRORe;4I5=*U@fcUwcs)H2l1by;%St}Ta1PyWATjd{|zRWMpe4?Yk}JPJ~ZBX^8Pve@?Xh*@Ig zNXB&$Weyl4pr93$G!~JFaS0eR^^!?90Ru(>j`B!5L%XCO!YBThb1`*OGXr{7G#Fj0 z0-8D_V{(77m@rZepC0)Z?vREToZ_GDLnz5{K8CR}KL3O@Lt>*m#?IJ!4U?)d3(@Qo z=e3PAZJY&S0Wsv70QICnYV(ijk$cV3E<1mFN+@zb!&sw{tuQI_Sb6{_@F=#7vA9h)(0?#F^$|V!!T03<1j{)2EgN_qm+j87;ujTT(p3m$6+HA zxHOP{KaZA?G01Tl$73=a-40R=LL6V%1vd`96%1)<*jYecJYBsWa=c$38L;TNvFC;{ z7Y`N*2iQ5*W1Zo=Be?g9$u$?f<^f?%p9O2mqjG3wG!I=3S z-9eXU89`z_zT4N=civw6|F7@u=Re=Rei{P&s8IU+B1ZU7zWHesp?+o!18g&DIsH)kKA9j z@|dDraA~l8)HTx|X-v}{5%zzC^jJ!D3YVLvkX-0MS&Z=(6dWGK zMa}P_c9AXQ`W%XuxMvMDWoSzvmIwqf`*Z(fS zwe(X;Kuc$E`;pV`A*}wl1p(?Y<~wv83w7i0^M}D1{&Jq?t8hzw+tQ~JaN9B%|HVz` zk2)VWVSKR+Yz5#3fbmm?(M&pa;|F2sN*gi0fVCQ+9^>X1+=6)bPd___tprqKWCuI@ z;)Mb8kr_l9q22uVTMx#BW!t{9wuQe87|R~#|Kx_?+}~A6e^meopk{xzuStWKO)Q;P zQ;y$hvQ+_9d(H8Eab~YrWtc-1iy=j;VbO5#iU%zAe>T$0F)9sfF5Wa3;eyR;@5_Y^ zHuvk5<_wyuA3fGyB5gT3N#Pin_h`y6j>pKIwQ_(W03Jf^SjPdL8(Y#-PWNU;90f-8 zzEIsxO8P=ukK>yRVdi`P9ZmQ{K|nr@EUbin-K);R;jz7(N0z}SIKxY8CZ40XGc#d1 z9<`)NGUo)_>+bumG=U|l&H)~ufX8hgWk5r(UEh3%D_z73+`ch9PWl-Wm*R=A1PBY< zi#p@kDt5|LfHk~kolOGAnaua3Y4@0s88X??Ed0@NF@MECns*eo;3GKq+F2aEdmU}= z6uS~HrXChkk>pPmNZj3OqkAz4FgFl-p6sZ^im>Hl=0NlSyfTTO! zoe5YFd6~xyF#KcI>@gN~GhsA$rWRk@0d>BD!8#5%xMkMo;(zU_qN|G%JD;p4)*MeC zc(>wAhaFRAJogj)M<$d4P8|izB_4Md1xB5GPACeP1)7)yn~-q&IXm`|_q3=uay7$Q zcEiP^ZYLcBq747^@yHD^I8a3=z3I!NNezw8m;v9L5>v^FCuG`y$4NJDUo|>zzBX8F z*_g4$2fed=`2soi)p)bpoNa#3^a^KAnSTO+Oxwai&z1qgQPcN#al{p~>`sU(pix1e z^VO#7)SgFn!BT%(uh6ET!WDzplP-otGt1|5J?E-g6)Xd#^s+&iSD*2HV zhcJFXDO%rLWc>yI#slA;KFHD3Ac^z_Xb+N>d(B5@{BN`WZU18lr=;xNLvl-$kZ$-C zEz(P@2VfzsQ3}0=bEKD&h10H8SIrKQW8zW<)QZQtx`q=sq^S%b)Bd&9b(fFJDa}<4 z4Y(!YlyNkZ#<>6O_L1B<$u|qY_<=OrgwrKNU_doSq1!$sI9QZ*K7?^0Dvz$GQ>Z7n z(a@}&S;9<=NMo!vkGiTcK4HKbfNG2Z<&6F3d^iI}7!dB3=ALVa0R5-zVq?G^J$r@e za}#Xr1|)T*mGq_K(6%b*yoy>{Bk?Ly&TwmKcb(CA6*B3}t2jW~+-o2Who2p!tNX$> z=`ALQs7QZ(={)hMk4I3ovII&O#J;o5zH4MeCUeIQyf&IZCC4k+V8EAYBBD zwaj7wG(Zke9q{4$lGZ}-bVKg-J}L?x#bL_;|B1j*oCFJa>Ol%|LBbJQK`RWjArGy7 z(8qgwWr|ugT1e{woV~xMwRk9xTGA*o9FHy8lGl*T&5R}Ly^-`CE@q}IyF2AaA9PWZ zM)#F!Nlm82G?X$Ju1eoy?NnTimF{OY$SW!n{C@rxrPX9y?mxRZBX1=CHTXIe|bmG&EG27f8<1xz*9e~jz%3YvM04#l_ zF48YPDHW-^{a#$lJA>x_CqQn}0?Fz&VMY#upwnF0R{8F`(j_QXTT06!;} z>!bn3AUUPC0sPq-P0`ag73P0;ng=)0Tm+nVL&R)qZw^7rKnh5=Bq1yEmN`2-%vZ&OI!LU_W|@pQRfpR}10;;Ei zgh|{sb0i6%l{7-A24vN8K(8f0@f|j_d}v9N5J?44i!mLYyTj+|4oTPa3a+f`2-`g= znG2ge-N_5z zL#I-#Lw*L}#pA`J#N)s)cf5Skz98b*S71EJ>^1V-p4NFSoOyyvBKY|LVM!webydlx^g{V;}!bee{$ScS#E#1v~x`2`oZ^fhFDO z1P7^HsKF^nA1#FgiVMqt8NaF1B)xUQ+$d+w8#_&6d$ek%b+7*kfoBr$P9tOF$a?Q5l<<_tdK|_O z+w&h6|9XYV_Eht(Kw^JR&C=0&x_CMr3B}*SVTToVhbFZ?J`OCgn7@u$kn`cLp{X-aIdtjk8oBdbB6sPf$D!z=FX((v9S60Bj^*pJ5-> z?Qx|wR;I$=OlvHUD+n#PuTY2Uy07qiq*J?+IpM>V%vpBji^b_q zPm*&mD0m0ASe?zR^;#{SCzXrvdaEg9r>oZVjJ;WEuSx~dkvBAeETF1F1>DJPJo#g} zldEpZ@O5BuuTEPhjr!689DR#Tw7CAac@8$$G`Xg5b{L{|6C7L8X_QJO-{X1al+`Vc zJO(Wz$t`nUu>x+Lw|LYS@ixejF0V`gF!HD)9Xm5KTTPftrh{&=YI+qACTs)act8oP zM~)R_9T;b)ipxUWp1B0nVch2|RB`4DE4^Ok8os`=^Op98%odQVk1J!;mc1QaeD;hY zwK2%u9BZXg{dRNq~U|e`}_r z>RNKI%eKVd{kB=%#vjn4_Z3F@;dGi-rh-5P=bT3bDfD^=1U@T(+RmI%zzbQs6zQbTCL->fKCvdzrTv6IZiYb_=FCosb^qv2qt6ZIgoHYLx=}%(ZcN z7OMxl$l0zTggB4v-v)teF)HsNa3K;nc|do%0$}^v`EOf_Vq`)`AYJlk{ctuC_ZhZl ztetR{qLP^rGuS%?zATlP3Ie2$5tM)(q*vs>@qna>7<)+PE(&%;y7JA6(00b-O7tnwONNi_xPHg}aiOLYE)5)y_ozcn z2G%nJu+*OD)r~dYq%;mc1(hxmfwYs0!^i`km?p6-BHd@QxQ>1`#O4A0XJK1LFgi?C zGj&5X5EfZD9Wf~vh60fC)(RN^7bI_d0SkhXXD&^J+-KX>9;c)9^~(3Sj&! z|8dmAdtM(_zJ=)J(vkl3+=pBP7&8c?1sYIOdPxWB;p5u@GYKxxFKcI{AQ%R;VEkiK zVc7eVw|y#b^B~RvkV)^AlT~yF(47i*ewt2E!#O`bwg0Y`u(BVgs@v6>t21xujGJ@q z$@Mu#YGAlWFjD0j2N+sa8^rCtA>a48K znUh>^uZI`NmokQ4sqRDg%6M&XsFC`#c+VM!O+viK6hglF=TaZ(K5+cyZwQB1RVP%8 zh#tEXlMFPxS(^8Zi`oyk)m(w|?`{@aj*USy09p-q#ZfeX?Bsg6*%fWjh9*}AD`EVd z;#kB<*?9f}k4n<0zuOnd$IUN66A6}yyFH}cBCr=e!uX2R-R|4cVv*Ahj7T^w($E=Z z{7t02q6&`^ZIDN*#>g>wXl5P5by~067*7iLw!>T>w1FI};W`!nC=D-=X6SoE zcE~NwkA}Rh*F3Xss?@*>C_h+KcIGqoGxPwPX5$@6#~U|mq@W8q9W&;ep@FUeIyF>a)ffP)fnX(00hv!&TOfkyHX$j!FA?I%p;8Bk&3&@)JwC#U-4GD4}W7X z=%WN)2$zfF#HmmLj5l(aiBj&z>Ev2uK)L)DrCv)>QxsGXSbFx}DEcsLA~Xz?H35fJfInXPUPq1K@(M z0nA(?a>584iWv1gMr75LB`&oncrz)9Z}XE&>86}sd9K#$lZ=$A%3vWzK|E(TafFvu zNbSZKZ6cs>87P}3#bil<%2t+?6)rHDOSRl%IG((BhLdT?+o`D%$n54K6f&8+o_0WY zsPTQo@TYycwiGQ~)K+2CT@mv&G}5RvUgszb=o$~QmLv*S8bdi}_#jEx(5C3Jr84Jl z)`^R?CzEuz2uRoA=dd%)QdfnMVHSlrI=)ySe(4my(@ni)7@7W;)0Q}?d^l(E*UsN@ zW08&=lA}@JnlgG?j8Q8_zSuC!s?di~9>er`wHf=-dnv~Br03!wtNIjo=3NQUA;bjF zY=8gNbmegsFQf|tM3YZDjQ^c$G5^=Yc%>Xs_3-NO5WqIZSNqlY|7{+Cve$okWd6|< z1ZA)P)W}@f4^@onc53!RHUB|){I1M@xUwIv><9F-Ss(v$_QNW~ow|7Y+{PmJ6=R*Vd zr*b~p{tN}Igt5~-_U0Y&D~lvFK|EI$Nx*q!kzkBh7Kyh*-&Yn%6!`CDk%*6ot|2nz zo+^UpqH?TdQp1%+QU_FH{GconzAA1fppNvZ=_b`Mmjgs$u9%5ZCRFLx|J*lI16G*q zE0{#LaxX&Sk0sgY#e?KM2JotxTEz(UKn7Lt&}0nlrs>KUs<$g+sEzTT$V(9w^U4@% zkiIg88l?Zu$XppiRgCI(Wej~_#t{76V*oIs?<->n0I!UpD`SWSyfTI=;<+-0WI&sx z$VTDH7!m>3D`V)&7*b=rGKLzq=gJuRtc;;R;i?kj{_&MDBpK2xW2kBNu8g5_8hAiu zyE2BF7_W>WZ->6GjG-v-tL_X;viD>Rosr+eHZVM{_1T`roA>~;=l z;8A)CHYuPLaB*oniyUPXKGWT`qxYCv7PlINNlt{m(2PbSZe zdi_dHo}=HNl|1*0HTRkR&MTe1ht6GNqktcxW-+;N5N>6T=8<>peJFHYGxKY)xXRA_ zvEY6oMm9FBS6n6B^Nb9wsd!;<|M39E7+J!N1yrf`kH-85$tP=DOUOgW00000NkvXX Hu0mjfAdBJ$ literal 0 HcmV?d00001 diff --git a/ruby.png b/ruby.png new file mode 100644 index 0000000000000000000000000000000000000000..991b6d4ec9e78be165e3ef757eed1aada287364d GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^j3CU&3?x-=hn)ga>?NMQuI!iC1^FceV#7`HfI^%F z9+AZi4BSE>%y{W;-5;PJOS+@4BLl<6e(pbstUx|nfKQ0)e^Y%R^MdiLxj>4`)5S5Q b;#P73kj=!v_*DHKNFRfztDnm{r-UW|iOwIS literal 0 HcmV?d00001 diff --git a/snow.png b/snow.png new file mode 100644 index 0000000000000000000000000000000000000000..2cdae107fceec6e7f02ac7acb4a34a82a540caa5 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^j3CU&3?x-=hn)ga>?NMQuI!iC1^MM!lvI6;R0X`wF|Ns97GD8ntt^-nBo-U3d c6}OTTfNUlP#;5A{K>8RwUHx3vIVCg!071?oo&W#< literal 0 HcmV?d00001 diff --git a/updown.png b/updown.png new file mode 100644 index 0000000000000000000000000000000000000000..aa56a238b3e6c435265250f9266cd1b8caba0f20 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^AT}Qd8;}%R+`Ae`*?77*hG?8mPH5^{)z4*}Q$iB}huR`+ literal 0 HcmV?d00001